mirror of
https://github.com/GTNewHorizons/NotEnoughItems.git
synced 2026-11-15 17:54:50 +00:00
Compare commits
271
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ab3350eb8 | ||
|
|
f3aa12483d | ||
|
|
d86c472790 | ||
|
|
4124151208 | ||
|
|
68ad800620 | ||
|
|
2c7207485d | ||
|
|
e8094794c3 | ||
|
|
ad86d8f9c5 | ||
|
|
30c87e9160 | ||
|
|
5eeb001534 | ||
|
|
962754ee10 | ||
|
|
0e34840c21 | ||
|
|
a12fadb10d | ||
|
|
9218e233aa | ||
|
|
23e16abae6 | ||
|
|
b3cb4db9ca | ||
|
|
45fea43a4b | ||
|
|
088d9c08a8 | ||
|
|
98547c2bcf | ||
|
|
02fa633043 | ||
|
|
9df6ab0232 | ||
|
|
89cc203875 | ||
|
|
4b247d08a5 | ||
|
|
8ecc8f20d5 | ||
|
|
74b9f8339a | ||
|
|
e20756a196 | ||
|
|
6d0f83c499 | ||
|
|
8e219c06be | ||
|
|
3fc576b6fc | ||
|
|
249cb2b308 | ||
|
|
e8d8c1994b | ||
|
|
195b47944f | ||
|
|
3224fdef7d | ||
|
|
46a159d788 | ||
|
|
bd20e00a6e | ||
|
|
bf06b09d5a | ||
|
|
1b1dd3567a | ||
|
|
f106b5e766 | ||
|
|
f1dea5460a | ||
|
|
9b73b94d16 | ||
|
|
e133afc774 | ||
|
|
75ff631f16 | ||
|
|
6f5d45c4ea | ||
|
|
fb51475bb9 | ||
|
|
99ec3a4204 | ||
|
|
8c4d609e4c | ||
|
|
336c7dc621 | ||
|
|
2130a47f6f | ||
|
|
73b492b0e3 | ||
|
|
efa69f31b6 | ||
|
|
95b437e5c9 | ||
|
|
afe3c54c29 | ||
|
|
2cab09e91b | ||
|
|
4b4ab434c0 | ||
|
|
9d108b21f9 | ||
|
|
2302dac5c0 | ||
|
|
7c2fb2df5f | ||
|
|
14aa3728ca | ||
|
|
66fc2270dd | ||
|
|
138d25dbfd | ||
|
|
d9191750a7 | ||
|
|
6d9ec0c0da | ||
|
|
617ac0600d | ||
|
|
7d7e3b61a6 | ||
|
|
748695158f | ||
|
|
a2c037e0c0 | ||
|
|
e93d23e444 | ||
|
|
748cfe3754 | ||
|
|
b64d104d7e | ||
|
|
46d90b6923 | ||
|
|
e61120099a | ||
|
|
bcb6eb214f | ||
|
|
9221434b2e | ||
|
|
02937061d4 | ||
|
|
0e6425295b | ||
|
|
fb9d517f78 | ||
|
|
529f4374d6 | ||
|
|
0bf369a996 | ||
|
|
1897dba35a | ||
|
|
5bbf275980 | ||
|
|
f7a900e910 | ||
|
|
a7683b885d | ||
|
|
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 | ||
|
|
2e786d1807 | ||
|
|
61d6525756 | ||
|
|
8790c7f541 | ||
|
|
461ac036df | ||
|
|
d575de33fe | ||
|
|
c3e35f8643 | ||
|
|
f94395f453 | ||
|
|
63d6d20c96 | ||
|
|
427793b41d | ||
|
|
f6c59d7a18 | ||
|
|
0e3507de0a | ||
|
|
5bfbf250cc | ||
|
|
c0be69f85f | ||
|
|
934eb26249 | ||
|
|
69ab51bd22 | ||
|
|
b679b65beb | ||
|
|
9a21acd283 | ||
|
|
429f2f36a9 | ||
|
|
509078da35 | ||
|
|
a6b306263d | ||
|
|
2162b43aa7 | ||
|
|
7c334d32c2 | ||
|
|
8a8f2fd87a | ||
|
|
2ae5607a60 | ||
|
|
0f1333b308 | ||
|
|
d645732eb3 | ||
|
|
371337cf77 | ||
|
|
4fb83ddea6 | ||
|
|
a14d70ee8f | ||
|
|
6279149b21 | ||
|
|
2a667e1942 | ||
|
|
c9bf943fb9 | ||
|
|
14a2dec34e | ||
|
|
368a134f92 | ||
|
|
68becd6fd6 | ||
|
|
fe83411c57 | ||
|
|
40ff91a908 | ||
|
|
ca9c2a4052 | ||
|
|
34b9998ba3 | ||
|
|
ebbfd349f2 | ||
|
|
127f422e39 | ||
|
|
3f3ce46301 | ||
|
|
6fb48eaac4 | ||
|
|
fda24ff453 | ||
|
|
42445c61e7 | ||
|
|
3bb7b6722a | ||
|
|
03ede1773c | ||
|
|
f534b6ed0d | ||
|
|
7cfa4ae4ca | ||
|
|
8c858b5842 | ||
|
|
6734326ec9 | ||
|
|
4dc5832d34 | ||
|
|
abfcdbb3f2 | ||
|
|
2fae9f0968 | ||
|
|
2fe5ad7275 | ||
|
|
e67e134726 | ||
|
|
5b35ce5575 | ||
|
|
a2d469b411 | ||
|
|
5ddfdeafcc | ||
|
|
2062a79a2a | ||
|
|
23173070c9 | ||
|
|
4c37971a2b | ||
|
|
458947628c | ||
|
|
6e23c51868 | ||
|
|
c2acfb7d8a | ||
|
|
edcd410ee1 | ||
|
|
8e366e1982 | ||
|
|
f9c627fdda | ||
|
|
ee04d3786f | ||
|
|
e294cbfd54 | ||
|
|
ce5928ce7e | ||
|
|
0311599a34 | ||
|
|
3bb594ba11 | ||
|
|
4b2f944617 | ||
|
|
8db8fa1b72 | ||
|
|
10c2326184 | ||
|
|
4375a91220 | ||
|
|
bb7a9c51f7 | ||
|
|
1d66a2a015 | ||
|
|
bb40acc7a3 | ||
|
|
abd1b38870 |
No files matched your search
@@ -0,0 +1,2 @@
|
||||
# Ignore spotlessApply reformat
|
||||
f106b5e7665df6341ae8539f74dc391a7efc98b1
|
||||
@@ -0,0 +1,44 @@
|
||||
* text eol=lf
|
||||
|
||||
*.[jJ][aA][rR] binary
|
||||
|
||||
*.[pP][nN][gG] binary
|
||||
*.[jJ][pP][gG] binary
|
||||
*.[jJ][pP][eE][gG] binary
|
||||
*.[gG][iI][fF] binary
|
||||
*.[tT][iI][fF] binary
|
||||
*.[tT][iI][fF][fF] binary
|
||||
*.[iI][cC][oO] binary
|
||||
*.[sS][vV][gG] text
|
||||
*.[eE][pP][sS] binary
|
||||
*.[xX][cC][fF] binary
|
||||
|
||||
*.[kK][aA][rR] binary
|
||||
*.[mM]4[aA] binary
|
||||
*.[mM][iI][dD] binary
|
||||
*.[mM][iI][dD][iI] binary
|
||||
*.[mM][pP]3 binary
|
||||
*.[oO][gG][gG] binary
|
||||
*.[rR][aA] binary
|
||||
|
||||
*.7[zZ] binary
|
||||
*.[gG][zZ] binary
|
||||
*.[tT][aA][rR] binary
|
||||
*.[tT][gG][zZ] binary
|
||||
*.[zZ][iI][pP] binary
|
||||
|
||||
*.[tT][cC][nN] binary
|
||||
*.[sS][oO] binary
|
||||
*.[dD][lL][lL] binary
|
||||
*.[dD][yY][lL][iI][bB] binary
|
||||
*.[pP][sS][dD] binary
|
||||
*.[tT][tT][fF] binary
|
||||
*.[oO][tT][fF] binary
|
||||
|
||||
*.[pP][aA][tT][cC][hH] -text
|
||||
|
||||
*.[bB][aA][tT] text eol=crlf
|
||||
*.[cC][mM][dD] text eol=crlf
|
||||
*.[pP][sS]1 text eol=crlf
|
||||
|
||||
*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
name: Build and test
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ master, main ]
|
||||
push:
|
||||
branches: [ master, main ]
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
|
||||
secrets: inherit
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
name: Release tagged build
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: [ '*' ]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
release-tags:
|
||||
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
|
||||
secrets: inherit
|
||||
+28
-5
@@ -1,7 +1,30 @@
|
||||
build/build/*
|
||||
build/run/*
|
||||
build/.gradle/*
|
||||
*.ipr
|
||||
.gradle
|
||||
.settings
|
||||
/.idea/
|
||||
/run/
|
||||
/build/
|
||||
/eclipse/
|
||||
.classpath
|
||||
.project
|
||||
/bin/
|
||||
/config/
|
||||
/crash-reports/
|
||||
/logs/
|
||||
options.txt
|
||||
/saves/
|
||||
usernamecache.json
|
||||
banned-ips.json
|
||||
banned-players.json
|
||||
eula.txt
|
||||
ops.json
|
||||
server.properties
|
||||
servers.dat
|
||||
usercache.json
|
||||
whitelist.json
|
||||
/out/
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/**
|
||||
src/main/resources/mixins.*.json
|
||||
*.bat
|
||||
.DS_Store
|
||||
@@ -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.
|
||||
@@ -0,0 +1,45 @@
|
||||
# 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
|
||||
|
||||
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:
|
||||
|
||||
* Speed
|
||||
- Uses a parallel stream to search the item list over multiple cores, resulting in 2-6x faster searches on average
|
||||
- Loads the recipe handlers in parallel
|
||||
* A textbox for search with most of the features you'd expect - moving forward, backwards, selection, etc
|
||||
* Bookmarks! Are you in the process of crafting? Bookmark it using either 'A' or configure your own key.
|
||||
* Toggle bookmark pane. Default shortcut key `B`. Item Subsets menu is only available if bookmarks are not visible.
|
||||
* Utility/Cheat buttons line up and wrap based on GUI size
|
||||
* ItemList is no longer regenerated from the ItemRegistry on every inventory load
|
||||
* JEI (Or Creative) Style tabs [Optional] Note: Requires explicit support to be added for an ItemStack to render, otherwise falls back to the first two letters of the handler name.
|
||||
* Tabs/Handlers are loaded from a CSV config in the JAR (or optionally from the config folder). NBT IMCEvents `registerHandlerInfo` and `removeHandlerInfo` are available for mod authors to add handler information, using the same fields as the CSV file
|
||||
* `@[Mod]->[item]` searching. ex: `@Mod.gregtech->iron ingot`
|
||||
* Cycle between Recipe, Utility, and Cheat mode by ctrl clicking on the Wrench Icon
|
||||
* GT5u Tools/Items and GT6 tools should now properly work with the Overlay Recipe Transfer
|
||||
|
||||
## Other items of note:
|
||||
|
||||
* Remove TMI style
|
||||
* Removed inventory Load/Save state
|
||||
|
||||
## Development
|
||||
Before launching, you need to add
|
||||
```
|
||||
-Dfml.coreMods.load=codechicken.nei.asm.NEICorePlugin
|
||||
```
|
||||
as a command line argument to the VM.
|
||||
|
||||
## 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"
|
||||
}
|
||||
+1512
File diff suppressed because it is too large.
Load diff
@@ -1,130 +0,0 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
name = "forge"
|
||||
url = "http://files.minecraftforge.net/maven"
|
||||
}
|
||||
maven {
|
||||
name = "sonatype"
|
||||
url = "https://oss.sonatype.org/content/repositories/snapshots/"
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
|
||||
}
|
||||
}
|
||||
|
||||
//add dependency repositories
|
||||
repositories {
|
||||
maven {
|
||||
name = "chickenbones"
|
||||
url = "http://chickenbones.net/maven"
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'forge'
|
||||
|
||||
group = "codechicken" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||
archivesBaseName = "NotEnoughItems"
|
||||
|
||||
// Define properties file
|
||||
ext.configFile = file "build.properties"
|
||||
|
||||
configFile.withReader {
|
||||
// Load config. It shall from now be referenced as simply config or project.config
|
||||
def prop = new Properties()
|
||||
prop.load(it)
|
||||
project.ext.config = new ConfigSlurper().parse prop
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile "codechicken:CodeChickenLib:${config.mc_version}-${config.ccl_version}:dev"
|
||||
compile "codechicken:CodeChickenCore:${config.mc_version}-${config.ccc_version}:dev"
|
||||
}
|
||||
|
||||
version = "${project.config.mod_version}"
|
||||
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
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.parentFile
|
||||
sourceSets {
|
||||
main {
|
||||
java {
|
||||
srcDir new File(root, "src")
|
||||
}
|
||||
resources {
|
||||
srcDir new File(root, "resources")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
processResources {
|
||||
//redo task if any of these properties change
|
||||
inputs.property "version", project.version
|
||||
inputs.property "mc_version", config.mc_version
|
||||
|
||||
// Replace properties in info files
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
include '*.info'
|
||||
expand 'version':project.version,'mc_version':config.mc_version
|
||||
}
|
||||
|
||||
// Move access transformer to META-INF
|
||||
rename '(.+_at.cfg)', 'META-INF/$1'
|
||||
}
|
||||
|
||||
version = "${project.minecraft.version}-${project.version}"
|
||||
def commonManifest = {
|
||||
attributes 'FMLCorePlugin': 'codechicken.nei.asm.NEICorePlugin'
|
||||
attributes 'FMLAT': 'nei_at.cfg'
|
||||
}
|
||||
|
||||
jar {
|
||||
classifier = 'universal'
|
||||
manifest commonManifest
|
||||
}
|
||||
|
||||
task sourceJar(type: Jar) {
|
||||
from sourceSets.main.java
|
||||
from new File(root, "dev")
|
||||
classifier = 'src'
|
||||
}
|
||||
|
||||
task devJar(type: Jar) {
|
||||
from sourceSets.main.output
|
||||
classifier = 'dev'
|
||||
manifest commonManifest
|
||||
}
|
||||
|
||||
// Tell the artifact system about our extra jars
|
||||
artifacts {
|
||||
archives sourceJar, devJar
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main { output.resourcesDir = output.classesDir }
|
||||
}
|
||||
|
||||
// Configure an upload task.
|
||||
uploadArchives {
|
||||
dependsOn 'reobf'
|
||||
if (project.hasProperty("local_maven")) {
|
||||
repositories {
|
||||
logger.info('Publishing to local maven repo')
|
||||
|
||||
mavenDeployer {
|
||||
repository(url: "file://${local_maven}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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.0.0-beta-2-GTNH
|
||||
BIN
Binary file not shown.
Vendored
-172
@@ -1,172 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
@@ -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'
|
||||
@@ -0,0 +1,7 @@
|
||||
// Add your dependencies here
|
||||
|
||||
dependencies {
|
||||
api('com.github.GTNewHorizons:CodeChickenLib:1.1.8:dev')
|
||||
api('com.github.GTNewHorizons:CodeChickenCore:1.1.11:dev')
|
||||
shadowImplementation('org.apache.commons:commons-csv:1.10.0')
|
||||
}
|
||||
@@ -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,98 @@
|
||||
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
|
||||
# Generate a class with String fields for the mod id, name, version and group name named with the fields below
|
||||
generateGradleTokenClass = codechicken.nei.Tags
|
||||
gradleTokenModId = MODID
|
||||
gradleTokenModName = MODNAME
|
||||
gradleTokenVersion = VERSION
|
||||
gradleTokenGroupName = GROUPNAME
|
||||
# [DEPRECATED]
|
||||
# Multiple source files can be defined here by providing a comma-seperated list: Class1.java,Class2.java,Class3.java
|
||||
# public static final String VERSION = "GRADLETOKEN_VERSION";
|
||||
# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's
|
||||
# version in @Mod([...], version = VERSION, [...])
|
||||
# Leave these properties empty to skip individual token replacements
|
||||
replaceGradleTokenInFile =
|
||||
|
||||
# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can
|
||||
# leave this property empty.
|
||||
# Example value: apiPackage = api + modGroup = com.myname.mymodid -> com.myname.mymodid.api
|
||||
apiPackage =
|
||||
|
||||
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
|
||||
# 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
|
||||
|
||||
# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens.
|
||||
|
||||
# The project's numeric ID on CurseForge. You can find this in the About Project box.
|
||||
# Leave this empty if you don't want to publish on CurseForge.
|
||||
curseForgeProjectId = 358228
|
||||
|
||||
# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
|
||||
# Syntax: type1:name1;type2:name2;...
|
||||
# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
|
||||
# and the name is the CurseForge project id of the other mod.
|
||||
curseForgeRelations = requiredDependency:codechickencore-unofficial;requiredDependency:codechickenlib-unofficial
|
||||
|
||||
|
||||
# Publishing to modrinth requires you to set the MODRINTH_TOKEN environment variable to your current modrinth API token.
|
||||
|
||||
# The project's ID on Modrinth. Can be either the slug or the ID.
|
||||
# Leave this empty if you don't want to publish on Modrinth.
|
||||
|
||||
modrinthProjectId = notenoughitems-unofficial
|
||||
|
||||
# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth.
|
||||
# Syntax: scope1-type1:name1;scope2-type2:name2;...
|
||||
# Where scope can be one of [required, optional, incompatible, embedded],
|
||||
# type can be one of [project, version],
|
||||
# and the name is the Modrinth project or version slug/id of the other mod.
|
||||
|
||||
modrinthRelations = required-project:codechickenlib-unofficial;required-project:codechickencore-unofficial
|
||||
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+2
-1
@@ -1,5 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip
|
||||
@@ -0,0 +1,244 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
Vendored
+92
-84
@@ -1,84 +1,92 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@@ -0,0 +1,2 @@
|
||||
before_install:
|
||||
- ./gradlew setupCIWorkspace
|
||||
@@ -0,0 +1,4 @@
|
||||
// Add any additional repositiroes for your dependencies here
|
||||
|
||||
repositories {
|
||||
}
|
||||
@@ -1,183 +0,0 @@
|
||||
nei.load=载入
|
||||
nei.save=保存
|
||||
|
||||
nei.enchant=附魔
|
||||
nei.enchant.level=等级
|
||||
nei.enchant.locked=锁定
|
||||
nei.enchant.unlocked=解锁
|
||||
|
||||
nei.inventory.options=选项
|
||||
nei.inventory.prev=上一页
|
||||
nei.inventory.next=下一页
|
||||
nei.inventory.item_subsets=物品分类
|
||||
nei.inventory.delete.inv=删除当前物品栏所有的物品
|
||||
nei.inventory.delete.one=删除 %s
|
||||
nei.inventory.delete.all=清空物品栏
|
||||
nei.inventory.delete.enable=激活删除设置
|
||||
nei.inventory.delete.1=开启删除模式
|
||||
nei.inventory.delete.0=关闭删除模式
|
||||
nei.inventory.rain.enable=激活天气设置
|
||||
nei.inventory.rain.1=开启雨雪
|
||||
nei.inventory.rain.0=关闭雨雪
|
||||
nei.inventory.magnet.enable=激活磁力设置
|
||||
nei.inventory.magnet.1=开启磁力模式
|
||||
nei.inventory.magnet.0=关闭磁力模式
|
||||
nei.inventory.dawn.enable=激活破晓时间设置
|
||||
nei.inventory.dawn.set=设置时间为破晓
|
||||
nei.inventory.noon.enable=激活正午时间设置
|
||||
nei.inventory.noon.set=设置时间为正午
|
||||
nei.inventory.dusk.enable=激活黄昏时间设置
|
||||
nei.inventory.dusk.set=设置时间为黄昏
|
||||
nei.inventory.midnight.enable=激活午夜时间设置
|
||||
nei.inventory.midnight.set=设置时间为午夜
|
||||
nei.inventory.heal=治愈玩家并回满饱食度
|
||||
nei.inventory.gamemode.0=设置为生存模式
|
||||
nei.inventory.gamemode.1=设置为创造模式
|
||||
nei.inventory.gamemode.2=设置为创造模式+
|
||||
nei.inventory.gamemode.3=设置为冒险模式
|
||||
|
||||
nei.chat.gamemode.0=生存模式开启
|
||||
nei.chat.gamemode.1=创造模式开启
|
||||
nei.chat.gamemode.2=创造模式+开启
|
||||
nei.hat.gamemode.3=冒险模式开启
|
||||
nei.chat.rain.on=开启雨雪
|
||||
nei.chat.rain.off=关闭雨雪
|
||||
nei.chat.time=白天 %d. %d:00
|
||||
nei.chat.give.noitem=没有此物品
|
||||
|
||||
nei.options=NEI选项
|
||||
nei.options.back=后退
|
||||
nei.options.world=世界
|
||||
nei.options.global=全局
|
||||
nei.options.global.tip.0=选项适用于所有世界
|
||||
nei.options.global.tip.1=点击选项左侧W按钮可覆写该世界设置
|
||||
nei.options.wbutton.tip.0=使用全局设置
|
||||
nei.options.wbutton.tip.1=覆写全局设置
|
||||
|
||||
nei.options.keys=按键绑定
|
||||
nei.options.keys.gui=物品栏
|
||||
nei.options.keys.gui.recipe=查看合成
|
||||
nei.options.keys.gui.usage=查看用途
|
||||
nei.options.keys.gui.enchant=附魔
|
||||
nei.options.keys.gui.potion=药水
|
||||
nei.options.keys.gui.back=上一个合成表
|
||||
nei.options.keys.gui.prev=上一页
|
||||
nei.options.keys.gui.next=下一页
|
||||
nei.options.keys.gui.hide=隐藏/显示NEI界面
|
||||
ei.options.keys.gui.search=跳转到搜索框
|
||||
nei.options.keys.world=世界
|
||||
nei.options.keys.world.chunkoverlay=区块(chunks)边界显示
|
||||
nei.options.keys.world.moboverlay=刷怪区域显示
|
||||
nei.options.keys.world.highlight_tips=显示选中方块名称
|
||||
nei.options.keys.world.dawn=破晓
|
||||
nei.options.keys.world.noon=正午
|
||||
nei.options.keys.world.dusk=黄昏
|
||||
nei.options.keys.world.midnight=午夜
|
||||
nei.options.keys.world.rain=降雨
|
||||
nei.options.keys.world.heal=治疗
|
||||
nei.options.keys.world.creative=游戏模式
|
||||
nei.options.keys.world.creative.tip=循环游戏模式
|
||||
|
||||
nei.options.inventory=物品栏
|
||||
nei.options.inventory.widgetsenabled.true=激活NEI
|
||||
nei.options.inventory.widgetsenabled.false=禁用NEI
|
||||
nei.options.inventory.cheatmode.0=合成模式
|
||||
nei.options.inventory.cheatmode.1=实用模式
|
||||
nei.options.inventory.cheatmode.2=作弊模式
|
||||
|
||||
nei.options.inventory.profileRecipes=合成查阅性能分析
|
||||
nei.options.inventory.profileRecipes.true=开启
|
||||
nei.options.inventory.profileRecipes.false=关闭
|
||||
nei.options.inventory.itemsort=物品面板排序方式
|
||||
nei.options.inventory.itemIDs=物品ID
|
||||
nei.options.inventory.itemIDs.0=隐藏
|
||||
nei.options.inventory.itemIDs.1=自动
|
||||
nei.options.inventory.itemIDs.2=显示
|
||||
nei.options.inventory.searchmode=搜索模式
|
||||
nei.options.inventory.searchmode.0=简单
|
||||
nei.options.inventory.searchmode.1=扩展
|
||||
nei.options.inventory.searchmode.2=正则表达式
|
||||
nei.options.inventory.utilities=按钮
|
||||
nei.options.inventory.utilities.tip=选择实用模式的功能
|
||||
nei.options.inventory.utilities.time=时间
|
||||
nei.options.inventory.utilities.rain=降雨
|
||||
nei.options.inventory.utilities.heal=治疗
|
||||
nei.options.inventory.utilities.delete=删除
|
||||
nei.options.inventory.utilities.magnet=磁铁
|
||||
nei.options.inventory.utilities.gamemode=游戏模式
|
||||
nei.options.inventory.utilities.enchant=附魔
|
||||
nei.options.inventory.utilities.potion=酿造
|
||||
nei.options.inventory.utilities.item=保存物品
|
||||
nei.options.inventory.gamemodes=游戏模式
|
||||
nei.options.inventory.gamemodes.tip=选择游戏模式循环调整时的选项
|
||||
nei.options.inventory.gamemodes.creative=创造模式
|
||||
nei.options.inventory.gamemodes.creative+=创造模式+
|
||||
nei.options.inventory.gamemodes.adventure=冒险模式
|
||||
|
||||
nei.options.command=指令
|
||||
nei.options.command.creative=游戏模式
|
||||
nei.options.command.creative.tip={0}=1为创造模式,0为生存模式,{1}=玩家
|
||||
nei.options.command.item=物品
|
||||
nei.options.command.item.tip={0}=玩家,{1}=物品ID,{2}=数量,{3}=物品耐久度
|
||||
nei.options.command.time=时间
|
||||
nei.options.command.time.tip={0}=世界时间
|
||||
nei.options.command.rain=雨雪
|
||||
nei.options.command.rain.tip={0}=1为开启雨雪,0为关闭雨雪
|
||||
nei.options.command.heal=治疗
|
||||
nei.options.command.heal.tip={0}=玩家
|
||||
|
||||
nei.options.world.highlight_tips=高亮显示
|
||||
nei.options.world.highlight_tips.hide=隐藏
|
||||
nei.options.world.highlight_tips.show=显示
|
||||
|
||||
nei.options.tools=工具
|
||||
nei.options.tools.dump=数据存储
|
||||
nei.options.tools.dump.dump=存储
|
||||
nei.options.tools.dump.dumped=%s ID已保存到.minecraft/%s
|
||||
nei.options.tools.dump.mode.0=已使用的
|
||||
nei.options.tools.dump.mode.1=未使用的
|
||||
nei.options.tools.dump.mode.2=全部
|
||||
nei.options.tools.dump.item=物品
|
||||
nei.options.tools.dump.items=物品
|
||||
nei.options.tools.dump.block=方块
|
||||
nei.options.tools.dump.blocks=方块
|
||||
nei.options.tools.dump.potion=药水
|
||||
nei.options.tools.dump.potions=药水
|
||||
nei.options.tools.dump.enchantment=附魔
|
||||
nei.options.tools.dump.enchantments=附魔
|
||||
nei.options.tools.dump.biome=生物群系
|
||||
nei.options.tools.dump.biomes=生物群系
|
||||
nei.options.tools.dump.itempanel=物品面板
|
||||
nei.options.tools.dump.itempanel.dumped=物品面板内容已保存到.minecraft/e%s
|
||||
nei.options.tools.dump.itempanel.mode.0=CSV
|
||||
nei.options.tools.dump.itempanel.mode.1=NBT
|
||||
nei.options.tools.dump.itempanel.mode.2=Json
|
||||
|
||||
|
||||
|
||||
|
||||
nei.recipe.page=页数 %s/%s
|
||||
nei.recipe.shaped=有序合成
|
||||
nei.recipe.shapeless=无序合成
|
||||
nei.recipe.furnace=烧制
|
||||
nei.recipe.fuel=燃料
|
||||
nei.recipe.fuel.required=需要%s个
|
||||
nei.recipe.fuel.processed=可烧制%s个
|
||||
nei.recipe.fuel.produced=可制作%s个
|
||||
nei.recipe.firework=烟花
|
||||
nei.recipe.firework.tooltip0=添加多种染料可增加烟火之星的颜色
|
||||
nei.recipe.firework.tooltip1=合成好的烟火之星和染料合成,可以添加色彩淡入效果
|
||||
nei.recipe.firework.tooltip2=多个烟火之星可被用于合成单个烟花火箭
|
||||
nei.recipe.brewing=酿造
|
||||
nei.recipe.profiler.crafting=合成查询性能分析
|
||||
nei.recipe.profiler.usage=用途查询性能分析
|
||||
|
||||
nei.itemsort.minecraft=Minecraft
|
||||
nei.itemsort.minecraft.tip=从原版物品开始排序
|
||||
nei.itemsort.mod=Mod
|
||||
nei.itemsort.mod.tip=将每一个mod分为一组,按照mod名称排序
|
||||
nei.itemsort.id=按物品ID排序
|
||||
nei.itemsort.default=默认
|
||||
nei.itemsort.default.tip=保留每个物品的自然顺序
|
||||
nei.itemsort.damage=按照物品耐久(metadata)排序
|
||||
nei.itemsort.name=按显示名称排序
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 25 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"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
maven {
|
||||
// RetroFuturaGradle
|
||||
name "GTNH Maven"
|
||||
url "http://jenkins.usrv.eu:8081/nexus/content/groups/public/"
|
||||
allowInsecureProtocol = true
|
||||
mavenContent {
|
||||
includeGroup("com.gtnewhorizons.retrofuturagradle")
|
||||
}
|
||||
}
|
||||
gradlePluginPortal()
|
||||
mavenCentral()
|
||||
mavenLocal()
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'com.diffplug.blowdryerSetup' version '1.6.0'
|
||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0' // Provides java toolchains
|
||||
}
|
||||
|
||||
blowdryerSetup {
|
||||
repoSubfolder 'gtnhShared'
|
||||
github('GTNewHorizons/ExampleMod1.7.10', 'tag', '0.2.0')
|
||||
//devLocal '.' // Use this when testing config updates locally
|
||||
}
|
||||
@@ -1,169 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
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.JsonToNBT;
|
||||
import net.minecraft.nbt.NBTException;
|
||||
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(itemStackToNBT(item, new NBTTagCompound()).toString());
|
||||
}
|
||||
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();
|
||||
for (String itemStr: itemStrings) {
|
||||
try {
|
||||
NBTTagCompound itemStackNBT = (NBTTagCompound)JsonToNBT.func_150315_a(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 (NBTException e) {
|
||||
NEIClientConfig.logger.error("Failed to load bookmarked ItemStack from json string:\n{}", itemStr, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 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);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
public int getHightAdjustment() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getWidth(GuiContainer gui) {
|
||||
return LayoutManager.getLeftSize(gui) - x;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public abstract class ButtonCycled extends Button
|
||||
{
|
||||
@Override
|
||||
public Image getRenderIcon()
|
||||
{
|
||||
return icons[index];
|
||||
}
|
||||
|
||||
public int index;
|
||||
public Image[] icons;
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.core.ClientUtils;
|
||||
import codechicken.core.GuiModListScroll;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import cpw.mods.fml.client.CustomModLoadingErrorDisplayException;
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
||||
import cpw.mods.fml.common.gameevent.TickEvent;
|
||||
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.GuiErrorScreen;
|
||||
import net.minecraft.client.gui.GuiMainMenu;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.gui.GuiSelectWorld;
|
||||
import net.minecraft.client.multiplayer.WorldClient;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public class ClientHandler
|
||||
{
|
||||
private static ClientHandler instance;
|
||||
|
||||
private ArrayList<EntityItem> SMPmagneticItems = new ArrayList<>();
|
||||
private World lastworld;
|
||||
private GuiScreen lastGui;
|
||||
|
||||
public void addSMPMagneticItem(int i, World world) {
|
||||
WorldClient cworld = (WorldClient) world;
|
||||
Entity e = cworld.getEntityByID(i);
|
||||
if (!(e instanceof EntityItem)) {
|
||||
return;
|
||||
}
|
||||
SMPmagneticItems.add((EntityItem) e);
|
||||
}
|
||||
|
||||
private void updateMagnetMode(World world, EntityPlayerSP player) {
|
||||
if (!NEIClientConfig.getMagnetMode()) return;
|
||||
|
||||
float distancexz = 16;
|
||||
float distancey = 8;
|
||||
double maxspeedxz = 0.5;
|
||||
double maxspeedy = 0.5;
|
||||
double speedxz = 0.05;
|
||||
double speedy = 0.07;
|
||||
|
||||
List<EntityItem> items;
|
||||
if (world.isRemote) {
|
||||
items = SMPmagneticItems;
|
||||
} else {
|
||||
items = world.getEntitiesWithinAABB(EntityItem.class, player.boundingBox.expand(distancexz, distancey, distancexz));
|
||||
}
|
||||
for (Iterator<EntityItem> iterator = items.iterator(); iterator.hasNext(); ) {
|
||||
EntityItem item = iterator.next();
|
||||
|
||||
if (item.delayBeforeCanPickup > 0) continue;
|
||||
if (item.isDead && world.isRemote) iterator.remove();
|
||||
|
||||
if (!NEIClientUtils.canItemFitInInventory(player, item.getEntityItem())) continue;
|
||||
|
||||
double dx = player.posX - item.posX;
|
||||
double dy = player.posY + player.getEyeHeight() - item.posY;
|
||||
double dz = player.posZ - item.posZ;
|
||||
double absxz = Math.sqrt(dx * dx + dz * dz);
|
||||
double absy = Math.abs(dy);
|
||||
if (absxz > distancexz) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (absxz > 1) {
|
||||
dx /= absxz;
|
||||
dz /= absxz;
|
||||
}
|
||||
|
||||
if (absy > 1) {
|
||||
dy /= absy;
|
||||
}
|
||||
|
||||
double vx = item.motionX + speedxz * dx;
|
||||
double vy = item.motionY + speedy * dy;
|
||||
double vz = item.motionZ + speedxz * dz;
|
||||
|
||||
double absvxz = Math.sqrt(vx * vx + vz * vz);
|
||||
double absvy = Math.abs(vy);
|
||||
|
||||
double rationspeedxz = absvxz / maxspeedxz;
|
||||
if (rationspeedxz > 1) {
|
||||
vx /= rationspeedxz;
|
||||
vz /= rationspeedxz;
|
||||
}
|
||||
|
||||
double rationspeedy = absvy / maxspeedy;
|
||||
if (rationspeedy > 1) {
|
||||
vy /= rationspeedy;
|
||||
}
|
||||
|
||||
if (absvxz < 0.2 && absxz < 0.2 && world.isRemote) {
|
||||
item.setDead();
|
||||
}
|
||||
|
||||
item.setVelocity(vx, vy, vz);
|
||||
}
|
||||
}
|
||||
|
||||
public static void preInit() {
|
||||
ItemInfo.preInit();
|
||||
}
|
||||
|
||||
public static void load() {
|
||||
instance = new ClientHandler();
|
||||
|
||||
GuiModListScroll.register("NotEnoughItems");
|
||||
PacketCustom.assignHandler(NEICPH.channel, new NEICPH());
|
||||
FMLCommonHandler.instance().bus().register(instance);
|
||||
MinecraftForge.EVENT_BUS.register(instance);
|
||||
|
||||
API.registerHighlightHandler(new DefaultHighlightHandler(), ItemInfo.Layout.HEADER);
|
||||
HUDRenderer.load();
|
||||
WorldOverlayRenderer.load();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void tickEvent(TickEvent.ClientTickEvent event) {
|
||||
if(event.phase == Phase.END)
|
||||
return;
|
||||
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
if(mc.theWorld != null) {
|
||||
loadWorld(mc.theWorld, false);
|
||||
|
||||
if (!NEIClientConfig.isEnabled())
|
||||
return;
|
||||
|
||||
KeyManager.tickKeyStates();
|
||||
|
||||
NEIController.updateUnlimitedItems(mc.thePlayer.inventory);
|
||||
if (mc.currentScreen == null)
|
||||
NEIController.processCreativeCycling(mc.thePlayer.inventory);
|
||||
|
||||
updateMagnetMode(mc.theWorld, mc.thePlayer);
|
||||
}
|
||||
|
||||
GuiScreen gui = mc.currentScreen;
|
||||
if (gui != lastGui) {
|
||||
if (gui instanceof GuiMainMenu)
|
||||
lastworld = null;
|
||||
else if (gui instanceof GuiSelectWorld)
|
||||
NEIClientConfig.reloadSaves();
|
||||
}
|
||||
lastGui = gui;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void tickEvent(TickEvent.RenderTickEvent event) {
|
||||
if(event.phase == Phase.END && NEIClientConfig.isEnabled())
|
||||
HUDRenderer.renderOverlay();
|
||||
}
|
||||
|
||||
|
||||
@SubscribeEvent
|
||||
public void renderLastEvent(RenderWorldLastEvent event) {
|
||||
if (NEIClientConfig.isEnabled())
|
||||
WorldOverlayRenderer.render(event.partialTicks);
|
||||
}
|
||||
|
||||
|
||||
public void loadWorld(World world, boolean fromServer) {
|
||||
if (world != lastworld) {
|
||||
SMPmagneticItems.clear();
|
||||
WorldOverlayRenderer.reset();
|
||||
|
||||
if (!fromServer) {
|
||||
NEIClientConfig.setHasSMPCounterPart(false);
|
||||
NEIClientConfig.setInternalEnabled(false);
|
||||
|
||||
if (!Minecraft.getMinecraft().isSingleplayer())//wait for server to initiate in singleplayer
|
||||
NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~'));
|
||||
}
|
||||
|
||||
lastworld = world;
|
||||
}
|
||||
}
|
||||
|
||||
public static ClientHandler instance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static RuntimeException throwCME(final String message) {
|
||||
final GuiScreen errorGui = new GuiErrorScreen(null, null)
|
||||
{
|
||||
@Override
|
||||
public void handleMouseInput() {}
|
||||
|
||||
@Override
|
||||
public void handleKeyboardInput() {}
|
||||
|
||||
@Override
|
||||
public void drawScreen(int par1, int par2, float par3) {
|
||||
drawDefaultBackground();
|
||||
String[] s_msg = message.split("\n");
|
||||
for (int i = 0; i < s_msg.length; ++i)
|
||||
drawCenteredString(fontRendererObj, s_msg[i], width / 2, height / 3 + 12 * i, 0xFFFFFFFF);
|
||||
}
|
||||
};
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
CustomModLoadingErrorDisplayException e = new CustomModLoadingErrorDisplayException()
|
||||
{
|
||||
@Override
|
||||
public void initGui(GuiErrorScreen errorScreen, FontRenderer fontRenderer) {
|
||||
Minecraft.getMinecraft().displayGuiScreen(errorGui);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawScreen(GuiErrorScreen errorScreen, FontRenderer fontRenderer, int mouseRelX, int mouseRelY, float tickTime) {}
|
||||
};
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
public class GuiNEIButton extends GuiButton
|
||||
{
|
||||
protected static final ResourceLocation guiTex = new ResourceLocation("textures/gui/widgets.png");
|
||||
|
||||
public GuiNEIButton(int i, int j, int k, int l, int i1, String s)
|
||||
{
|
||||
super(i, j, k, l, i1, s);
|
||||
}
|
||||
|
||||
public void drawButton(Minecraft minecraft, int i, int j)
|
||||
{
|
||||
if(!visible)
|
||||
return;
|
||||
|
||||
FontRenderer fontrenderer = minecraft.fontRenderer;
|
||||
minecraft.renderEngine.bindTexture(guiTex);
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
boolean flag = i >= xPosition && j >= yPosition && i < xPosition + width && j < yPosition + height;
|
||||
int k = getHoverState(flag);
|
||||
drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height / 2);//top left
|
||||
drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height / 2);//top right
|
||||
drawTexturedModalRect(xPosition, yPosition + height / 2, 0, 46 + k * 20 + 20 - height / 2, width / 2, height / 2);//bottom left
|
||||
drawTexturedModalRect(xPosition + width / 2, yPosition + height / 2, 200 - width / 2, 46 + k * 20 + 20 - height / 2, width / 2, height / 2);//bottom right
|
||||
mouseDragged(minecraft, i, j);
|
||||
|
||||
if(!enabled)
|
||||
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffa0a0a0);
|
||||
else if(flag)
|
||||
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffffa0);
|
||||
else
|
||||
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xe0e0e0);
|
||||
}
|
||||
}
|
||||
@@ -1,475 +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 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 = (gui.xSize + gui.width) / 2 + 3;
|
||||
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,44 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public class ItemQuantityField extends TextField
|
||||
{
|
||||
public ItemQuantityField(String ident) {
|
||||
super(ident);
|
||||
centered = true;
|
||||
}
|
||||
|
||||
// Find a way to work this this back in
|
||||
public boolean isValid(String string) {
|
||||
if (string.equals(""))
|
||||
return true;
|
||||
|
||||
try {
|
||||
return Integer.parseInt(string) >= 0;
|
||||
} catch (NumberFormatException nfe) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return intValue(text());
|
||||
}
|
||||
|
||||
public int intValue(String s) {
|
||||
try {
|
||||
return Integer.parseInt(s);
|
||||
} catch (NumberFormatException nfe) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loseFocus() {
|
||||
setText(Integer.toString(NEIClientConfig.getItemQuantity()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChange(String oldText) {
|
||||
if (intValue(oldText) != intValue())//hacky recursion stopper
|
||||
NEIClientUtils.setItemQuantity(intValue());
|
||||
}
|
||||
}
|
||||
@@ -1,432 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.core.CCUpdateChecker;
|
||||
import codechicken.core.ClassDiscoverer;
|
||||
import codechicken.core.ClientUtils;
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.lib.config.ConfigFile;
|
||||
import codechicken.lib.config.ConfigTag;
|
||||
import codechicken.lib.config.ConfigTagParent;
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.IConfigureNEI;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.api.NEIInfo;
|
||||
import codechicken.nei.config.ConfigSet;
|
||||
import codechicken.nei.config.GuiHighlightTips;
|
||||
import codechicken.nei.config.GuiNEIOptionList;
|
||||
import codechicken.nei.config.GuiOptionList;
|
||||
import codechicken.nei.config.OptionCycled;
|
||||
import codechicken.nei.config.OptionGamemodes;
|
||||
import codechicken.nei.config.OptionList;
|
||||
import codechicken.nei.config.OptionOpenGui;
|
||||
import codechicken.nei.config.OptionTextField;
|
||||
import codechicken.nei.config.OptionToggleButton;
|
||||
import codechicken.nei.config.OptionUtilities;
|
||||
import codechicken.nei.recipe.RecipeInfo;
|
||||
import codechicken.obfuscator.ObfuscationRun;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.storage.SaveFormatComparator;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
public class NEIClientConfig
|
||||
{
|
||||
private static boolean configLoaded;
|
||||
private static boolean enabledOverride;
|
||||
|
||||
public static Logger logger = LogManager.getLogger("NotEnoughItems");
|
||||
public static File configDir = new File(CommonUtils.getMinecraftDir(), "config/NEI/");
|
||||
public static ConfigSet global = new ConfigSet(
|
||||
new File("saves/NEI/client.dat"),
|
||||
new ConfigFile(new File(configDir, "client.cfg")));
|
||||
public static ConfigSet world;
|
||||
public static final File bookmarkFile = new File(configDir, "bookmarks.ini");
|
||||
|
||||
public static ItemStack[] creativeInv;
|
||||
|
||||
public static boolean hasSMPCounterpart;
|
||||
public static HashSet<String> permissableActions = new HashSet<>();
|
||||
public static HashSet<String> disabledActions = new HashSet<>();
|
||||
public static HashSet<String> enabledActions = new HashSet<>();
|
||||
|
||||
public static ItemStackSet bannedBlocks = new ItemStackSet();
|
||||
|
||||
static {
|
||||
if (global.config.getTag("checkUpdates").getBooleanValue(true))
|
||||
CCUpdateChecker.updateCheck("NotEnoughItems");
|
||||
linkOptionList();
|
||||
setDefaults();
|
||||
}
|
||||
|
||||
private static void setDefaults() {
|
||||
ConfigTagParent tag = global.config;
|
||||
tag.setComment("Main configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
|
||||
|
||||
tag.getTag("command").useBraces().setComment("Change these options if you have a different mod installed on the server that handles the commands differently, Eg. Bukkit Essentials");
|
||||
tag.setNewLineMode(1);
|
||||
|
||||
tag.getTag("inventory.widgetsenabled").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.widgetsenabled"));
|
||||
|
||||
tag.getTag("inventory.hidden").getBooleanValue(false);
|
||||
tag.getTag("inventory.cheatmode").getIntValue(2);
|
||||
tag.getTag("inventory.lockmode").setComment("For those who can't help themselves.\nSet this to a mode and you will be unable to change it ingame").getIntValue(-1);
|
||||
API.addOption(new OptionCycled("inventory.cheatmode", 3)
|
||||
{
|
||||
@Override
|
||||
public boolean optionValid(int index) {
|
||||
return getLockedMode() == -1 || getLockedMode() == index && NEIInfo.isValidMode(index);
|
||||
}
|
||||
});
|
||||
checkCheatMode();
|
||||
|
||||
tag.getTag("inventory.utilities").setDefaultValue("delete, magnet");
|
||||
API.addOption(new OptionUtilities("inventory.utilities"));
|
||||
|
||||
tag.getTag("inventory.gamemodes").setDefaultValue("creative, creative+, adventure");
|
||||
API.addOption(new OptionGamemodes("inventory.gamemodes"));
|
||||
|
||||
|
||||
ItemSorter.initConfig(tag);
|
||||
|
||||
tag.getTag("inventory.itemIDs").getIntValue(1);
|
||||
API.addOption(new OptionCycled("inventory.itemIDs", 3, true));
|
||||
|
||||
tag.getTag("inventory.searchmode").getIntValue(1);
|
||||
API.addOption(new OptionCycled("inventory.searchmode", 3, true));
|
||||
|
||||
tag.getTag("world.highlight_tips").getBooleanValue(false);
|
||||
tag.getTag("world.highlight_tips.x").getIntValue(5000);
|
||||
tag.getTag("world.highlight_tips.y").getIntValue(100);
|
||||
API.addOption(new OptionOpenGui("world.highlight_tips", GuiHighlightTips.class));
|
||||
|
||||
tag.getTag("inventory.profileRecipes").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.profileRecipes", true));
|
||||
|
||||
tag.getTag("command.creative").setDefaultValue("/gamemode {0} {1}");
|
||||
API.addOption(new OptionTextField("command.creative"));
|
||||
tag.getTag("command.item").setDefaultValue("/give {0} {1} {2} {3} {4}");
|
||||
API.addOption(new OptionTextField("command.item"));
|
||||
tag.getTag("command.time").setDefaultValue("/time set {0}");
|
||||
API.addOption(new OptionTextField("command.time"));
|
||||
tag.getTag("command.rain").setDefaultValue("/toggledownfall");
|
||||
API.addOption(new OptionTextField("command.rain"));
|
||||
tag.getTag("command.heal").setDefaultValue("");
|
||||
API.addOption(new OptionTextField("command.heal"));
|
||||
|
||||
setDefaultKeyBindings();
|
||||
}
|
||||
|
||||
private static void linkOptionList() {
|
||||
OptionList.setOptionList(new OptionList("nei.options")
|
||||
{
|
||||
@Override
|
||||
public ConfigSet globalConfigSet() {
|
||||
return global;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfigSet worldConfigSet() {
|
||||
return world;
|
||||
}
|
||||
|
||||
@Override
|
||||
public OptionList configBase() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) {
|
||||
return new GuiNEIOptionList(parent, list, world);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void setDefaultKeyBindings() {
|
||||
API.addKeyBind("gui.recipe", Keyboard.KEY_R);
|
||||
API.addKeyBind("gui.usage", Keyboard.KEY_U);
|
||||
API.addKeyBind("gui.back", Keyboard.KEY_BACK);
|
||||
API.addKeyBind("gui.enchant", Keyboard.KEY_X);
|
||||
API.addKeyBind("gui.potion", Keyboard.KEY_P);
|
||||
API.addKeyBind("gui.prev", Keyboard.KEY_PRIOR);
|
||||
API.addKeyBind("gui.next", Keyboard.KEY_NEXT);
|
||||
API.addKeyBind("gui.prev_machine", Keyboard.KEY_UP);
|
||||
API.addKeyBind("gui.next_machine", Keyboard.KEY_DOWN);
|
||||
API.addKeyBind("gui.prev_recipe", Keyboard.KEY_LEFT);
|
||||
API.addKeyBind("gui.next_recipe", Keyboard.KEY_RIGHT);
|
||||
API.addKeyBind("gui.hide", Keyboard.KEY_O);
|
||||
API.addKeyBind("gui.search", Keyboard.KEY_F);
|
||||
API.addKeyBind("gui.bookmark", Keyboard.KEY_A);
|
||||
API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9);
|
||||
API.addKeyBind("world.moboverlay", Keyboard.KEY_F7);
|
||||
API.addKeyBind("world.highlight_tips", Keyboard.KEY_NUMPAD0);
|
||||
API.addKeyBind("world.dawn", 0);
|
||||
API.addKeyBind("world.noon", 0);
|
||||
API.addKeyBind("world.dusk", 0);
|
||||
API.addKeyBind("world.midnight", 0);
|
||||
API.addKeyBind("world.rain", 0);
|
||||
API.addKeyBind("world.heal", 0);
|
||||
API.addKeyBind("world.creative", 0);
|
||||
}
|
||||
|
||||
public static OptionList getOptionList() {
|
||||
return OptionList.getOptionList("nei.options");
|
||||
}
|
||||
|
||||
public static void loadWorld(String saveName) {
|
||||
setInternalEnabled(true);
|
||||
logger.debug("Loading "+(Minecraft.getMinecraft().isSingleplayer() ? "Local" : "Remote")+" World");
|
||||
bootNEI(ClientUtils.getWorld());
|
||||
|
||||
File saveDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + saveName);
|
||||
boolean newWorld = !saveDir.exists();
|
||||
if (newWorld)
|
||||
saveDir.mkdirs();
|
||||
|
||||
world = new ConfigSet(new File(saveDir, "NEI.dat"), new ConfigFile(new File(saveDir, "NEI.cfg")));
|
||||
onWorldLoad(newWorld);
|
||||
}
|
||||
|
||||
private static void onWorldLoad(boolean newWorld) {
|
||||
world.config.setComment("World based configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
|
||||
|
||||
setWorldDefaults();
|
||||
creativeInv = new ItemStack[54];
|
||||
LayoutManager.searchField.setText(getSearchExpression());
|
||||
LayoutManager.quantity.setText(Integer.toString(getItemQuantity()));
|
||||
SubsetWidget.loadHidden();
|
||||
|
||||
if (newWorld && Minecraft.getMinecraft().isSingleplayer())
|
||||
world.config.getTag("inventory.cheatmode").setIntValue(NEIClientUtils.mc().playerController.isInCreativeMode() ? 2 : 0);
|
||||
|
||||
NEIInfo.load(ClientUtils.getWorld());
|
||||
}
|
||||
|
||||
private static void setWorldDefaults() {
|
||||
NBTTagCompound nbt = world.nbt;
|
||||
if (!nbt.hasKey("search")) nbt.setString("search", "");
|
||||
if (!nbt.hasKey("quantity")) nbt.setInteger("quantity", 0);
|
||||
if (!nbt.hasKey("validateenchantments")) nbt.setBoolean("validateenchantments", false);
|
||||
|
||||
world.saveNBT();
|
||||
}
|
||||
|
||||
public static int getKeyBinding(String string) {
|
||||
return getSetting("keys." + string).getIntValue();
|
||||
}
|
||||
|
||||
public static void setDefaultKeyBinding(String string, int key) {
|
||||
getSetting("keys." + string).getIntValue(key);
|
||||
}
|
||||
|
||||
public static void bootNEI(World world) {
|
||||
if (configLoaded)
|
||||
return;
|
||||
|
||||
ItemInfo.load(world);
|
||||
GuiInfo.load();
|
||||
RecipeInfo.load();
|
||||
LayoutManager.load();
|
||||
ItemPanels.bookmarkPanel.loadBookmarks();
|
||||
NEIController.load();
|
||||
|
||||
configLoaded = true;
|
||||
|
||||
ClassDiscoverer classDiscoverer = new ClassDiscoverer(test -> test.startsWith("NEI") && test.endsWith("Config.class"), IConfigureNEI.class);
|
||||
|
||||
classDiscoverer.findClasses();
|
||||
|
||||
for (Class<?> clazz : classDiscoverer.classes) {
|
||||
try {
|
||||
IConfigureNEI config = (IConfigureNEI) clazz.newInstance();
|
||||
config.loadConfig();
|
||||
NEIModContainer.plugins.add(config);
|
||||
logger.debug("Loaded " + clazz.getName());
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to Load " + clazz.getName(), e);
|
||||
}
|
||||
}
|
||||
|
||||
ItemSorter.loadConfig();
|
||||
}
|
||||
|
||||
public static boolean isWorldSpecific(String setting) {
|
||||
if(world == null) return false;
|
||||
ConfigTag tag = world.config.getTag(setting, false);
|
||||
return tag != null && tag.value != null;
|
||||
}
|
||||
|
||||
public static ConfigTag getSetting(String s) {
|
||||
return isWorldSpecific(s) ? world.config.getTag(s) : global.config.getTag(s);
|
||||
}
|
||||
|
||||
public static boolean getBooleanSetting(String s) {
|
||||
return getSetting(s).getBooleanValue();
|
||||
}
|
||||
|
||||
public static boolean isHidden() {
|
||||
return !enabledOverride || getBooleanSetting("inventory.hidden");
|
||||
}
|
||||
|
||||
public static boolean isEnabled() {
|
||||
return enabledOverride && getBooleanSetting("inventory.widgetsenabled");
|
||||
}
|
||||
|
||||
public static void setEnabled(boolean flag) {
|
||||
getSetting("inventory.widgetsenabled").setBooleanValue(flag);
|
||||
}
|
||||
|
||||
public static int getItemQuantity() {
|
||||
return world.nbt.getInteger("quantity");
|
||||
}
|
||||
|
||||
public static int getCheatMode() {
|
||||
return getIntSetting("inventory.cheatmode");
|
||||
}
|
||||
|
||||
private static void checkCheatMode() {
|
||||
if (getLockedMode() != -1)
|
||||
setIntSetting("inventory.cheatmode", getLockedMode());
|
||||
}
|
||||
|
||||
public static int getLockedMode() {
|
||||
return getIntSetting("inventory.lockmode");
|
||||
}
|
||||
|
||||
public static int getLayoutStyle() {
|
||||
return getIntSetting("inventory.layoutstyle");
|
||||
}
|
||||
|
||||
public static String getStringSetting(String s) {
|
||||
return getSetting(s).getValue();
|
||||
}
|
||||
|
||||
public static boolean showIDs() {
|
||||
int i = getIntSetting("inventory.itemIDs");
|
||||
return i == 2 || (i == 1 && isEnabled() && !isHidden());
|
||||
}
|
||||
|
||||
public static void toggleBooleanSetting(String setting) {
|
||||
ConfigTag tag = getSetting(setting);
|
||||
tag.setBooleanValue(!tag.getBooleanValue());
|
||||
}
|
||||
|
||||
public static void cycleSetting(String setting, int max) {
|
||||
ConfigTag tag = getSetting(setting);
|
||||
tag.setIntValue((tag.getIntValue() + 1) % max);
|
||||
}
|
||||
|
||||
public static int getIntSetting(String setting) {
|
||||
return getSetting(setting).getIntValue();
|
||||
}
|
||||
|
||||
public static void setIntSetting(String setting, int val) {
|
||||
getSetting(setting).setIntValue(val);
|
||||
}
|
||||
|
||||
public static String getSearchExpression() {
|
||||
return world.nbt.getString("search");
|
||||
}
|
||||
|
||||
public static void setSearchExpression(String expression) {
|
||||
world.nbt.setString("search", expression);
|
||||
world.saveNBT();
|
||||
}
|
||||
|
||||
public static boolean getMagnetMode() {
|
||||
return enabledActions.contains("magnet");
|
||||
}
|
||||
|
||||
public static boolean invCreativeMode() {
|
||||
return enabledActions.contains("creative+") && canPerformAction("creative+");
|
||||
}
|
||||
|
||||
public static boolean areDamageVariantsShown() {
|
||||
return hasSMPCounterPart() || getSetting("command.item").getValue().contains("{3}");
|
||||
}
|
||||
|
||||
public static boolean hasSMPCounterPart() {
|
||||
return hasSMPCounterpart;
|
||||
}
|
||||
|
||||
public static void setHasSMPCounterPart(boolean flag) {
|
||||
hasSMPCounterpart = flag;
|
||||
permissableActions.clear();
|
||||
bannedBlocks.clear();
|
||||
disabledActions.clear();
|
||||
enabledActions.clear();
|
||||
}
|
||||
|
||||
public static boolean canCheatItem(ItemStack stack) {
|
||||
return canPerformAction("item") && !bannedBlocks.contains(stack);
|
||||
}
|
||||
|
||||
public static boolean canPerformAction(String name) {
|
||||
if (!isEnabled())
|
||||
return false;
|
||||
|
||||
if (!modePermitsAction(name))
|
||||
return false;
|
||||
|
||||
String base = NEIActions.base(name);
|
||||
if (hasSMPCounterpart)
|
||||
return permissableActions.contains(base);
|
||||
|
||||
if (NEIActions.smpRequired(name))
|
||||
return false;
|
||||
|
||||
String cmd = getStringSetting("command." + base);
|
||||
return cmd != null && cmd.startsWith("/");
|
||||
}
|
||||
|
||||
private static boolean modePermitsAction(String name) {
|
||||
if (getCheatMode() == 0) return false;
|
||||
if (getCheatMode() == 2) return true;
|
||||
|
||||
String[] actions = getStringArrSetting("inventory.utilities");
|
||||
for (String action : actions)
|
||||
if (action.equalsIgnoreCase(name))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String[] getStringArrSetting(String s) {
|
||||
return getStringSetting(s).replace(" ", "").split(",");
|
||||
}
|
||||
|
||||
public static void setInternalEnabled(boolean b) {
|
||||
enabledOverride = b;
|
||||
}
|
||||
|
||||
public static void reloadSaves() {
|
||||
File saveDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/local");
|
||||
if (!saveDir.exists())
|
||||
return;
|
||||
|
||||
List<SaveFormatComparator> saves;
|
||||
try {
|
||||
saves = Minecraft.getMinecraft().getSaveLoader().getSaveList();
|
||||
} catch (Exception e) {
|
||||
logger.error("Error loading saves", e);
|
||||
return;
|
||||
}
|
||||
HashSet<String> saveFileNames = new HashSet<>();
|
||||
for (SaveFormatComparator save : saves)
|
||||
saveFileNames.add(save.getFileName());
|
||||
|
||||
for (File file : saveDir.listFiles())
|
||||
if (file.isDirectory() && !saveFileNames.contains(file.getName()))
|
||||
ObfuscationRun.deleteDir(file, true);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public class NEICompatibility
|
||||
{
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Simply an {@link ItemStack} with position.
|
||||
* Mainly used in the recipe handlers.
|
||||
*/
|
||||
public class PositionedStack
|
||||
{
|
||||
public int relx;
|
||||
public int rely;
|
||||
public ItemStack[] items;
|
||||
//compatibility dummy
|
||||
public ItemStack item;
|
||||
|
||||
private boolean permutated = false;
|
||||
|
||||
public PositionedStack(Object object, int x, int y, boolean genPerms)
|
||||
{
|
||||
items = NEIServerUtils.extractRecipeItems(object);
|
||||
relx = x;
|
||||
rely = y;
|
||||
|
||||
if(genPerms)
|
||||
generatePermutations();
|
||||
else
|
||||
setPermutationToRender(0);
|
||||
}
|
||||
|
||||
public PositionedStack(Object object, int x, int y)
|
||||
{
|
||||
this(object, x, y, true);
|
||||
}
|
||||
|
||||
public void generatePermutations()
|
||||
{
|
||||
if(permutated)
|
||||
return;
|
||||
|
||||
ArrayList<ItemStack> stacks = new ArrayList<>();
|
||||
for(ItemStack item : items)
|
||||
{
|
||||
if(item == null || item.getItem() == null)
|
||||
continue;
|
||||
|
||||
if(item.getItemDamage() == Short.MAX_VALUE)
|
||||
{
|
||||
List<ItemStack> permutations = ItemList.itemMap.get(item.getItem());
|
||||
if(!permutations.isEmpty())
|
||||
{
|
||||
for(ItemStack stack : permutations)
|
||||
stacks.add(stack.copy());
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemStack base = new ItemStack(item.getItem(), item.stackSize);
|
||||
base.stackTagCompound = item.stackTagCompound;
|
||||
stacks.add(base);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
stacks.add(item.copy());
|
||||
}
|
||||
items = stacks.toArray(new ItemStack[0]);
|
||||
|
||||
if(items.length == 0)
|
||||
items = new ItemStack[]{new ItemStack(Blocks.fire)};
|
||||
|
||||
permutated = true;
|
||||
setPermutationToRender(0);
|
||||
}
|
||||
|
||||
public void setMaxSize(int i)
|
||||
{
|
||||
for(ItemStack item : items)
|
||||
if(item.stackSize > i)
|
||||
item.stackSize = i;
|
||||
}
|
||||
|
||||
public PositionedStack copy()
|
||||
{
|
||||
return new PositionedStack(items, relx, rely);
|
||||
}
|
||||
|
||||
public void setPermutationToRender(int index)
|
||||
{
|
||||
item = items[index].copy();
|
||||
if(item.getItem() == null)
|
||||
item = new ItemStack(Blocks.fire);
|
||||
else if(item.getItemDamage() == OreDictionary.WILDCARD_VALUE && item.getItem() != null && item.getItem().isRepairable())
|
||||
item.setItemDamage(0);
|
||||
}
|
||||
|
||||
public boolean contains(ItemStack ingredient)
|
||||
{
|
||||
for(ItemStack item : items)
|
||||
if(NEIServerUtils.areStacksSameTypeCrafting(item, ingredient))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean contains(Item ingred)
|
||||
{
|
||||
for(ItemStack item : items)
|
||||
if(item.getItem() == ingred)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,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,9 +0,0 @@
|
||||
package codechicken.nei.api;
|
||||
|
||||
import codechicken.nei.recipe.IRecipeHandler;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
|
||||
public interface IOverlayHandler
|
||||
{
|
||||
public void overlayRecipe(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex, boolean shift);
|
||||
}
|
||||
@@ -1,272 +0,0 @@
|
||||
package codechicken.nei.asm;
|
||||
|
||||
import codechicken.lib.asm.ASMBlock;
|
||||
import codechicken.lib.asm.ASMHelper;
|
||||
import codechicken.lib.asm.ASMInit;
|
||||
import codechicken.lib.asm.ASMReader;
|
||||
import codechicken.lib.asm.ClassHeirachyManager;
|
||||
import codechicken.lib.asm.InsnListSection;
|
||||
import codechicken.lib.asm.ModularASMTransformer;
|
||||
import codechicken.lib.asm.ModularASMTransformer.FieldWriter;
|
||||
import codechicken.lib.asm.ModularASMTransformer.MethodInjector;
|
||||
import codechicken.lib.asm.ModularASMTransformer.MethodReplacer;
|
||||
import codechicken.lib.asm.ModularASMTransformer.MethodTransformer;
|
||||
import codechicken.lib.asm.ModularASMTransformer.MethodWriter;
|
||||
import codechicken.lib.asm.ObfMapping;
|
||||
import cpw.mods.fml.relauncher.FMLLaunchHandler;
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
import org.objectweb.asm.Type;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.FieldInsnNode;
|
||||
import org.objectweb.asm.tree.InsnList;
|
||||
import org.objectweb.asm.tree.InsnNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
import org.objectweb.asm.tree.VarInsnNode;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static codechicken.lib.asm.InsnComparator.findN;
|
||||
import static codechicken.lib.asm.InsnComparator.findOnce;
|
||||
import static codechicken.lib.asm.InsnComparator.getControlFlowLabels;
|
||||
import static codechicken.lib.asm.InsnComparator.matches;
|
||||
import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES;
|
||||
import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS;
|
||||
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
|
||||
import static org.objectweb.asm.Opcodes.ACC_STATIC;
|
||||
import static org.objectweb.asm.Opcodes.ALOAD;
|
||||
import static org.objectweb.asm.Opcodes.ILOAD;
|
||||
import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
|
||||
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
|
||||
import static org.objectweb.asm.Opcodes.IRETURN;
|
||||
|
||||
public class NEITransformer implements IClassTransformer
|
||||
{
|
||||
static {
|
||||
ASMInit.init();
|
||||
}
|
||||
|
||||
private final ModularASMTransformer transformer = new ModularASMTransformer();
|
||||
private final Map<String, ASMBlock> asmblocks = ASMReader.loadResource("/assets/nei/asm/blocks.asm");
|
||||
|
||||
public NEITransformer() {
|
||||
if(FMLLaunchHandler.side().isClient()) {
|
||||
//Generates method to set the placed position of a mob spawner for the item callback. More portable than copying vanilla placement code
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC,
|
||||
new ObfMapping("net/minecraft/block/BlockMobSpawner", "func_149689_a", "(Lnet/minecraft/world/World;IIILnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/item/ItemStack;)V"),
|
||||
asmblocks.get("spawnerPlaced")));
|
||||
|
||||
//Make MobSpawnerBaseLogic use getSpawnerWorld when creating new entities
|
||||
transformer.add(new MethodReplacer(new ObfMapping("net/minecraft/tileentity/MobSpawnerBaseLogic", "func_98281_h", "()Lnet/minecraft/entity/Entity;"),
|
||||
asmblocks.get("d_spawnerWorld"), asmblocks.get("spawnerWorld")));
|
||||
}
|
||||
|
||||
//Removes trailing seperators from NBTTagList/Compound.toString because OCD
|
||||
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/nbt/NBTTagCompound", "toString", "()Ljava/lang/String;"),
|
||||
asmblocks.get("n_commaFix"), asmblocks.get("commaFix"), true));
|
||||
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/nbt/NBTTagList", "toString", "()Ljava/lang/String;"),
|
||||
asmblocks.get("n_commaFix"), asmblocks.get("commaFix"), true));
|
||||
|
||||
//fix workbench container losing items on shift click output without room for the full stack
|
||||
transformer.add(new MethodTransformer(new ObfMapping("net/minecraft/inventory/ContainerWorkbench", "func_82846_b", "(Lnet/minecraft/entity/player/EntityPlayer;I)Lnet/minecraft/item/ItemStack;"))
|
||||
{
|
||||
@Override
|
||||
public void transform(MethodNode mv) {
|
||||
ASMHelper.logger.debug("NEI: Applying workbench fix");
|
||||
InsnListSection key = findN(mv.instructions, asmblocks.get("n_workbenchFix").list).get(0);
|
||||
key.insertBefore(asmblocks.get("workbenchFix").rawListCopy());
|
||||
}
|
||||
});
|
||||
|
||||
//put glint alpha into the buffer correctly for exporting
|
||||
transformer.add(new MethodReplacer(new ObfMapping("net/minecraft/client/renderer/entity/RenderItem", "func_77018_a", "(IIIII)V"),
|
||||
asmblocks.get("d_glintAlphaFix"), asmblocks.get("glintAlphaFix")));
|
||||
|
||||
|
||||
String GuiContainer = "net/minecraft/client/gui/inventory/GuiContainer";
|
||||
//add manager field
|
||||
transformer.add(new FieldWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "manager", "Lcodechicken/nei/guihook/GuiContainerManager;")));
|
||||
|
||||
//Fill out getManager in GuiContainerManager
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC | ACC_STATIC,
|
||||
new ObfMapping("codechicken/nei/guihook/GuiContainerManager", "getManager", "(Lnet/minecraft/client/gui/inventory/GuiContainer;)Lcodechicken/nei/guihook/GuiContainerManager;"),
|
||||
asmblocks.get("m_getManager")));
|
||||
|
||||
|
||||
//Generate load method
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146280_a", "(Lnet/minecraft/client/Minecraft;II)V"), asmblocks.get("m_setWorldAndResolution")));
|
||||
|
||||
//Generate handleKeyboardInput method
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146282_l", "()V"), asmblocks.get("m_handleKeyboardInput")));
|
||||
|
||||
//Generate handleKeyboardInput method
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146282_l", "()V"), asmblocks.get("m_handleKeyboardInput")));
|
||||
|
||||
//Generate handleKeyboardInput method
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146282_l", "()V"), asmblocks.get("m_handleKeyboardInput")));
|
||||
|
||||
//Generate handleMouseInput method
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "func_146274_d", "()V"), asmblocks.get("m_handleMouseInput")));
|
||||
|
||||
addProtectedForwarder(
|
||||
new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"),
|
||||
new ObfMapping("codechicken/nei/guihook/GuiContainerManager", "callKeyTyped", "(Lnet/minecraft/client/gui/inventory/GuiContainer;CI)V"));
|
||||
|
||||
addProtectedForwarder(
|
||||
new ObfMapping(GuiContainer, "func_146984_a", "(Lnet/minecraft/inventory/Slot;III)V"),
|
||||
new ObfMapping("codechicken/nei/guihook/DefaultSlotClickHandler", "callHandleMouseClick", "(Lnet/minecraft/client/gui/inventory/GuiContainer;Lnet/minecraft/inventory/Slot;III)V"));
|
||||
|
||||
//Inject preDraw at the start of drawScreen
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("preDraw"), true));
|
||||
|
||||
//Inject objectUnderMouse check before drawing slot highlights
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("n_objectUnderMouse"), asmblocks.get("objectUnderMouse"), false));
|
||||
|
||||
//Inject renderObjects after drawGuiContainerForegroundLayer
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("n_renderObjects"), asmblocks.get("renderObjects"), false));
|
||||
|
||||
//Replace default renderToolTip with delegate
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_73863_a", "(IIF)V"), asmblocks.get("d_renderToolTip"), asmblocks.get("renderTooltips")));
|
||||
|
||||
//Replace zLevel = 200 with zLevel = 500 in drawItemStack
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146982_a", "(Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V"),
|
||||
asmblocks.get("d_zLevel"), asmblocks.get("zLevel")));
|
||||
|
||||
//Replace default renderItem with delegate and slot overlay/underlay
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146977_a", "(Lnet/minecraft/inventory/Slot;)V"), asmblocks.get("d_drawSlot"), asmblocks.get("drawSlot")));
|
||||
|
||||
//Inject mouseClicked hook at the start of mouseClicked
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73864_a", "(III)V"), asmblocks.get("mouseClicked"), true));
|
||||
|
||||
//Replace general handleMouseClicked call with delegate
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_73864_a", "(III)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//mouseClicked
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146273_a", "(IIIJ)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//mouseClickMove
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146286_b", "(III)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//mouseMovedOrUp
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//keyTyped
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146983_a", "(I)Z"), asmblocks.get("d_handleMouseClick"), asmblocks.get("handleMouseClick")));//checkHotbarKeys
|
||||
|
||||
//Write delegate for handleMouseClicked
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "managerHandleMouseClick", "(Lnet/minecraft/inventory/Slot;III)V"), asmblocks.get("m_managerHandleMouseClick")));
|
||||
|
||||
//Inject mouseDragged hook after super call in mouseDragged
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_146273_a", "(IIIJ)V"), asmblocks.get("n_mouseDragged"), asmblocks.get("mouseDragged"), false));
|
||||
|
||||
//Inject overrideMouseUp at the start of mouseMovedOrUp
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_146286_b", "(III)V"), asmblocks.get("overrideMouseUp"), true));
|
||||
|
||||
//Inject mouseUp at the end of main elseif chain in mouseMovedOrUp
|
||||
transformer.add(new MethodTransformer(new ObfMapping(GuiContainer, "func_146286_b", "(III)V"))
|
||||
{
|
||||
@Override
|
||||
public void transform(MethodNode mv) {
|
||||
ASMHelper.logger.debug("NEI: Injecting mouseUp call");
|
||||
ASMBlock gotoBlock = asmblocks.get("n_mouseUpGoto");
|
||||
ASMBlock needleBlock = asmblocks.get("n_mouseUp");
|
||||
ASMBlock injectionBlock = asmblocks.get("mouseUp");
|
||||
|
||||
gotoBlock.mergeLabels(injectionBlock);
|
||||
findOnce(mv.instructions, gotoBlock.list).replace(gotoBlock.list.list);
|
||||
|
||||
InsnListSection needle = findOnce(mv.instructions, needleBlock.list);
|
||||
injectionBlock.mergeLabels(needleBlock.applyLabels(needle));
|
||||
needle.insertBefore(injectionBlock.list.list);
|
||||
}
|
||||
});
|
||||
|
||||
//Replace general handleSlotClick call with delegate
|
||||
transformer.add(new MethodReplacer(new ObfMapping(GuiContainer, "func_146984_a", "(Lnet/minecraft/inventory/Slot;III)V"),
|
||||
asmblocks.get("d_handleSlotClick"), asmblocks.get("handleSlotClick")));
|
||||
|
||||
//Inject lastKeyTyped at the start of keyTyped
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73869_a", "(CI)V"), asmblocks.get("lastKeyTyped"), true));
|
||||
|
||||
//Inject updateScreen hook after super call
|
||||
transformer.add(new MethodInjector(new ObfMapping(GuiContainer, "func_73876_c", "()V"), asmblocks.get("n_updateScreen"), asmblocks.get("updateScreen"), false));
|
||||
|
||||
//Cancel tab click calls when tabs are obscured
|
||||
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/client/gui/inventory/GuiContainerCreative", "func_147049_a", "(Lnet/minecraft/creativetab/CreativeTabs;II)Z"),
|
||||
asmblocks.get("handleTabClick"), true));
|
||||
|
||||
//Cancel tab tooltip rendering when tabs are obscured
|
||||
transformer.add(new MethodInjector(new ObfMapping("net/minecraft/client/gui/inventory/GuiContainerCreative", "func_147052_b", "(Lnet/minecraft/creativetab/CreativeTabs;II)Z"),
|
||||
asmblocks.get("renderTabTooltip"), true));
|
||||
|
||||
String[] buttons = new String[]{"CancelButton", "ConfirmButton", "PowerButton"};
|
||||
String[] this_fields = new String[]{"field_146146_o", "field_146147_o", "field_146150_o"};
|
||||
for(int i = 0; i < 3; i++) {
|
||||
ObfMapping m = new ObfMapping("net/minecraft/client/gui/inventory/GuiBeacon$"+buttons[i], "func_146111_b", "(II)V");
|
||||
InsnListSection l = asmblocks.get("beaconButtonObscured").list.copy();
|
||||
FieldInsnNode this_ref = ((FieldInsnNode)l.get(1));
|
||||
this_ref.owner = m.toClassloading().s_owner;
|
||||
if(ObfMapping.obfuscated) //missing srg mappings for inner outer reference fields
|
||||
this_ref.name = ObfMapping.obfMapper.mapFieldName(null, this_fields[i], null);
|
||||
transformer.add(new MethodInjector(m, l.list, true));
|
||||
}
|
||||
}
|
||||
|
||||
private void addProtectedForwarder(ObfMapping called, ObfMapping caller) {
|
||||
|
||||
InsnList forward1 = new InsnList();
|
||||
InsnList forward2 = new InsnList();
|
||||
|
||||
ObfMapping publicCall = new ObfMapping(called.s_owner, "public_"+called.s_name, called.s_desc);
|
||||
Type[] args = Type.getArgumentTypes(caller.s_desc);
|
||||
for(int i = 0; i < args.length; i++) {
|
||||
forward1.add(new VarInsnNode(args[i].getOpcode(ILOAD), i));
|
||||
forward2.add(new VarInsnNode(args[i].getOpcode(ILOAD), i));
|
||||
}
|
||||
|
||||
forward1.add(publicCall.toInsn(INVOKEVIRTUAL));
|
||||
forward2.add(called.toClassloading().toInsn(INVOKEVIRTUAL));
|
||||
forward1.add(new InsnNode(Type.getReturnType(called.s_desc).getOpcode(IRETURN)));
|
||||
forward2.add(new InsnNode(Type.getReturnType(called.s_desc).getOpcode(IRETURN)));
|
||||
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC|ACC_STATIC, caller, forward1));
|
||||
transformer.add(new MethodWriter(ACC_PUBLIC, publicCall, forward2));
|
||||
}
|
||||
|
||||
private final ObfMapping c_GuiContainer = new ObfMapping("net/minecraft/client/gui/inventory/GuiContainer").toClassloading();
|
||||
/**
|
||||
* Adds super.updateScreen() to non implementing GuiContainer subclasses
|
||||
*/
|
||||
public byte[] transformSubclasses(String name, byte[] bytes) {
|
||||
if (ClassHeirachyManager.classExtends(name, c_GuiContainer.javaClass())) {
|
||||
ClassNode cnode = ASMHelper.createClassNode(bytes);
|
||||
|
||||
ObfMapping methodmap = new ObfMapping(cnode.superName, "func_73876_c", "()V").toClassloading();
|
||||
|
||||
InsnListSection supercall = new InsnListSection();
|
||||
supercall.add(new VarInsnNode(ALOAD, 0));
|
||||
supercall.add(methodmap.toInsn(INVOKESPECIAL));
|
||||
|
||||
boolean changed = false;
|
||||
for (MethodNode mv : cnode.methods) {
|
||||
if (methodmap.matches(mv)) {
|
||||
if (matches(new InsnListSection(mv.instructions), supercall, getControlFlowLabels(mv.instructions)) == null) {
|
||||
mv.instructions.insert(supercall.list);
|
||||
ASMHelper.logger.debug("Inserted super call into " + methodmap);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (changed)
|
||||
bytes = ASMHelper.createBytes(cnode, COMPUTE_MAXS | COMPUTE_FRAMES);
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] transform(String name, String tname, byte[] bytes) {
|
||||
if (bytes == null) return null;
|
||||
try {
|
||||
if (FMLLaunchHandler.side().isClient())
|
||||
bytes = transformSubclasses(name, bytes);
|
||||
|
||||
bytes = transformer.transform(name, bytes);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
package codechicken.nei.config;
|
||||
|
||||
import codechicken.nei.Image;
|
||||
import codechicken.nei.LayoutManager;
|
||||
|
||||
public class OptionGamemodes extends OptionStringSet
|
||||
{
|
||||
public OptionGamemodes(String name)
|
||||
{
|
||||
super(name);
|
||||
|
||||
options.add("creative");
|
||||
options.add("creative+");
|
||||
options.add("adventure");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcons()
|
||||
{
|
||||
int x = buttonX();
|
||||
LayoutManager.drawIcon(x+4, 4, new Image(132, 12, 12, 12));
|
||||
x+=24;
|
||||
LayoutManager.drawIcon(x+4, 4, new Image(156, 12, 12, 12));
|
||||
x+=24;
|
||||
LayoutManager.drawIcon(x+4, 4, new Image(168, 12, 12, 12));
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
package codechicken.nei.config;
|
||||
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
public class OptionKeyBind extends OptionButton
|
||||
{
|
||||
private boolean hasFocus = false;
|
||||
|
||||
public OptionKeyBind(String name) {
|
||||
super("keys." + name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMouseClicked(int mousex, int mousey, int button) {
|
||||
hasFocus = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyTyped(char c, int keycode) {
|
||||
if (hasFocus) {
|
||||
setValue(keycode);
|
||||
hasFocus = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onClick(int button) {
|
||||
if (button == 0) {
|
||||
hasFocus = true;
|
||||
return true;
|
||||
}
|
||||
if (button == 1 && getValue() != 0) {
|
||||
setValue(0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean conflicted() {
|
||||
if (getValue() == 0)
|
||||
return false;
|
||||
|
||||
for (Option o : slot.options)
|
||||
if (o instanceof OptionKeyBind && o != this && ((OptionKeyBind) o).getValue() == getValue())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setValue(int keycode) {
|
||||
getTag().setIntValue(keycode);
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return renderTag().getIntValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefix() {
|
||||
return translateN(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getButtonText() {
|
||||
if (hasFocus)
|
||||
return EnumChatFormatting.WHITE + "> " + EnumChatFormatting.YELLOW + "??? " + EnumChatFormatting.WHITE + "<";
|
||||
|
||||
if (conflicted())
|
||||
return EnumChatFormatting.RED + Keyboard.getKeyName(getValue());
|
||||
|
||||
return Keyboard.getKeyName(getValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTextColour(int mousex, int mousey) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import codechicken.nei.PositionedStack;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.FurnaceRecipes;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import static codechicken.nei.NEIClientUtils.translate;
|
||||
|
||||
public class FuelRecipeHandler extends FurnaceRecipeHandler
|
||||
{
|
||||
public class CachedFuelRecipe extends CachedRecipe
|
||||
{
|
||||
public final FuelPair fuel;
|
||||
|
||||
public CachedFuelRecipe(FuelPair fuel) {
|
||||
this.fuel = fuel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedStack getIngredient() {
|
||||
return mfurnace.get(cycleticks / 48 % mfurnace.size()).ingred;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedStack getResult() {
|
||||
return mfurnace.get(cycleticks / 48 % mfurnace.size()).result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PositionedStack getOtherStack() {
|
||||
return fuel.stack;
|
||||
}
|
||||
}
|
||||
|
||||
private final ArrayList<SmeltingPair> mfurnace = new ArrayList<>();
|
||||
|
||||
public FuelRecipeHandler() {
|
||||
super();
|
||||
loadAllSmelting();
|
||||
}
|
||||
|
||||
public String getRecipeName() {
|
||||
return NEIClientUtils.translate("recipe.fuel");
|
||||
}
|
||||
|
||||
private void loadAllSmelting() {
|
||||
Map<ItemStack, ItemStack> recipes = (Map<ItemStack, ItemStack>) FurnaceRecipes.smelting().getSmeltingList();
|
||||
|
||||
for (Entry<ItemStack, ItemStack> recipe : recipes.entrySet())
|
||||
mfurnace.add(new SmeltingPair(recipe.getKey(), recipe.getValue()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadCraftingRecipes(String outputId, Object... results) {
|
||||
if (outputId.equals("fuel") && getClass() == FuelRecipeHandler.class)
|
||||
for (FuelPair fuel : afuels)
|
||||
arecipes.add(new CachedFuelRecipe(fuel));
|
||||
}
|
||||
|
||||
public void loadUsageRecipes(ItemStack ingredient) {
|
||||
for (FuelPair fuel : afuels)
|
||||
if (fuel.stack.contains(ingredient))
|
||||
arecipes.add(new CachedFuelRecipe(fuel));
|
||||
}
|
||||
|
||||
public String getOverlayIdentifier() {
|
||||
return "fuel";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe) {
|
||||
CachedFuelRecipe crecipe = (CachedFuelRecipe) arecipes.get(recipe);
|
||||
FuelPair fuel = crecipe.fuel;
|
||||
float burnTime = fuel.burnTime / 200F;
|
||||
|
||||
if (gui.isMouseOver(fuel.stack, recipe) && burnTime < 1) {
|
||||
burnTime = 1F / burnTime;
|
||||
String s_time = Float.toString(burnTime);
|
||||
if (burnTime == Math.round(burnTime))
|
||||
s_time = Integer.toString((int) burnTime);
|
||||
|
||||
currenttip.add(translate("recipe.fuel.required", s_time));
|
||||
} else if ((gui.isMouseOver(crecipe.getResult(), recipe) || gui.isMouseOver(crecipe.getIngredient(), recipe)) && burnTime > 1) {
|
||||
String s_time = Float.toString(burnTime);
|
||||
if (burnTime == Math.round(burnTime))
|
||||
s_time = Integer.toString((int) burnTime);
|
||||
|
||||
currenttip.add(translate("recipe.fuel." + (gui.isMouseOver(crecipe.getResult(), recipe) ? "produced" : "processed"), s_time));
|
||||
}
|
||||
|
||||
return currenttip;
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class GuiCraftingRecipe extends GuiRecipe
|
||||
{
|
||||
public static boolean openRecipeGui(String outputId, Object... results) {
|
||||
Minecraft mc = NEIClientUtils.mc();
|
||||
GuiContainer prevscreen = mc.currentScreen instanceof GuiContainer ? (GuiContainer) mc.currentScreen : null;
|
||||
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
ArrayList<ICraftingHandler> handlers = new ArrayList<>();
|
||||
for (ICraftingHandler craftinghandler : craftinghandlers) {
|
||||
profiler.start(craftinghandler.getRecipeName());
|
||||
ICraftingHandler handler = craftinghandler.getRecipeHandler(outputId, results);
|
||||
if (handler.numRecipes() > 0)
|
||||
handlers.add(handler);
|
||||
}
|
||||
profiler.end();
|
||||
if (handlers.isEmpty())
|
||||
return false;
|
||||
|
||||
mc.displayGuiScreen(new GuiCraftingRecipe(prevscreen, handlers));
|
||||
return true;
|
||||
}
|
||||
|
||||
private GuiCraftingRecipe(GuiContainer 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,316 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.lib.gui.GuiDraw;
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import codechicken.nei.GuiNEIButton;
|
||||
import codechicken.nei.LayoutManager;
|
||||
import codechicken.nei.NEIClientConfig;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import codechicken.nei.PositionedStack;
|
||||
import codechicken.nei.api.IGuiContainerOverlay;
|
||||
import codechicken.nei.api.IOverlayHandler;
|
||||
import codechicken.nei.api.IRecipeOverlayRenderer;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.guihook.IContainerTooltipHandler;
|
||||
import codechicken.nei.guihook.IGuiClientSide;
|
||||
import codechicken.nei.guihook.IGuiHandleMouseWheel;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class GuiRecipe extends GuiContainer implements IGuiContainerOverlay, IGuiClientSide, IGuiHandleMouseWheel, IContainerTooltipHandler
|
||||
{
|
||||
public ArrayList<? extends IRecipeHandler> currenthandlers = new ArrayList<>();
|
||||
|
||||
public int page;
|
||||
public int recipetype;
|
||||
public ContainerRecipe slotcontainer;
|
||||
public GuiContainer firstGui;
|
||||
public GuiContainer prevGui;
|
||||
public GuiButton nextpage;
|
||||
public GuiButton prevpage;
|
||||
public GuiButton overlay1;
|
||||
public GuiButton overlay2;
|
||||
|
||||
protected GuiRecipe(GuiContainer prevgui) {
|
||||
super(new ContainerRecipe());
|
||||
slotcontainer = (ContainerRecipe) inventorySlots;
|
||||
|
||||
this.prevGui = prevgui;
|
||||
this.firstGui = prevgui;
|
||||
if (prevgui instanceof IGuiContainerOverlay)
|
||||
this.firstGui = ((IGuiContainerOverlay) prevgui).getFirstScreen();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initGui() {
|
||||
super.initGui();
|
||||
|
||||
currenthandlers = getCurrentRecipeHandlers();
|
||||
GuiButton nexttype = new GuiNEIButton(0, width / 2 - 70, (height - ySize) / 2 + 3, 13, 12, "<");
|
||||
GuiButton prevtype = new GuiNEIButton(1, width / 2 + 57, (height - ySize) / 2 + 3, 13, 12, ">");
|
||||
nextpage = new GuiNEIButton(2, width / 2 - 70, (height + ySize) / 2 - 18, 13, 12, "<");
|
||||
prevpage = new GuiNEIButton(3, width / 2 + 57, (height + ySize) / 2 - 18, 13, 12, ">");
|
||||
overlay1 = new GuiNEIButton(4, width / 2 + 65, (height - ySize) / 2 + 63, 13, 12, "?");
|
||||
overlay2 = new GuiNEIButton(5, width / 2 + 65, (height - ySize) / 2 + 128, 13, 12, "?");
|
||||
buttonList.add(nexttype);
|
||||
buttonList.add(prevtype);
|
||||
buttonList.add(nextpage);
|
||||
buttonList.add(prevpage);
|
||||
buttonList.add(overlay1);
|
||||
buttonList.add(overlay2);
|
||||
|
||||
if (currenthandlers.size() == 1) {
|
||||
nexttype.visible = false;
|
||||
prevtype.visible = false;
|
||||
}
|
||||
refreshPage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyTyped(char c, int i) {
|
||||
if (i == Keyboard.KEY_ESCAPE) //esc
|
||||
{
|
||||
mc.displayGuiScreen(firstGui);
|
||||
return;
|
||||
}
|
||||
if (GuiContainerManager.getManager(this).lastKeyTyped(i, c))
|
||||
return;
|
||||
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
for (int recipe = page * recipehandler.recipiesPerPage(); recipe < recipehandler.numRecipes() && recipe < (page + 1) * recipehandler.recipiesPerPage(); recipe++)
|
||||
if (recipehandler.keyTyped(this, c, i, recipe))
|
||||
return;
|
||||
|
||||
if (i == mc.gameSettings.keyBindInventory.getKeyCode())
|
||||
mc.displayGuiScreen(firstGui);
|
||||
else if (i == NEIClientConfig.getKeyBinding("gui.back"))
|
||||
mc.displayGuiScreen(prevGui);
|
||||
else if (i == NEIClientConfig.getKeyBinding("gui.prev_machine"))
|
||||
prevType();
|
||||
else if (i == NEIClientConfig.getKeyBinding("gui.next_machine"))
|
||||
nextType();
|
||||
else if (i == NEIClientConfig.getKeyBinding("gui.prev_recipe"))
|
||||
prevPage();
|
||||
else if (i == NEIClientConfig.getKeyBinding("gui.next_recipe"))
|
||||
nextPage();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseClicked(int par1, int par2, int par3) {
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
for (int recipe = page * recipehandler.recipiesPerPage(); recipe < recipehandler.numRecipes() && recipe < (page + 1) * recipehandler.recipiesPerPage(); recipe++)
|
||||
if (recipehandler.mouseClicked(this, par3, recipe))
|
||||
return;
|
||||
|
||||
super.mouseClicked(par1, par2, par3);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void actionPerformed(GuiButton guibutton) {
|
||||
super.actionPerformed(guibutton);
|
||||
switch (guibutton.id) {
|
||||
case 0:
|
||||
prevType();
|
||||
break;
|
||||
case 1:
|
||||
nextType();
|
||||
break;
|
||||
case 2:
|
||||
prevPage();
|
||||
break;
|
||||
case 3:
|
||||
nextPage();
|
||||
break;
|
||||
case 4:
|
||||
overlayRecipe(page * currenthandlers.get(recipetype).recipiesPerPage());
|
||||
break;
|
||||
case 5:
|
||||
overlayRecipe(page * currenthandlers.get(recipetype).recipiesPerPage() + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateScreen() {
|
||||
super.updateScreen();
|
||||
currenthandlers.get(recipetype).onUpdate();
|
||||
refreshPage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleTooltip(GuiContainer gui, int mousex, int mousey, List<String> currenttip) {
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
for (int i = page * recipehandler.recipiesPerPage(); i < recipehandler.numRecipes() && i < (page + 1) * recipehandler.recipiesPerPage(); i++)
|
||||
currenttip = recipehandler.handleTooltip(this, currenttip, i);
|
||||
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleItemTooltip(GuiContainer gui, ItemStack stack, int mousex, int mousey, List<String> currenttip) {
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
for (int i = page * recipehandler.recipiesPerPage(); i < recipehandler.numRecipes() && i < (page + 1) * recipehandler.recipiesPerPage(); i++)
|
||||
currenttip = recipehandler.handleItemTooltip(this, stack, currenttip, i);
|
||||
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> handleItemDisplayName(GuiContainer gui, ItemStack itemstack, List<String> currenttip) {
|
||||
return currenttip;
|
||||
}
|
||||
|
||||
private void nextPage() {
|
||||
page++;
|
||||
if (page > (currenthandlers.get(recipetype).numRecipes() - 1) / currenthandlers.get(recipetype).recipiesPerPage())
|
||||
page = 0;
|
||||
}
|
||||
|
||||
private void prevPage() {
|
||||
page--;
|
||||
if (page < 0)
|
||||
page = (currenthandlers.get(recipetype).numRecipes() - 1) / currenthandlers.get(recipetype).recipiesPerPage();
|
||||
}
|
||||
|
||||
private void nextType() {
|
||||
recipetype++;
|
||||
if (recipetype >= currenthandlers.size())
|
||||
recipetype = 0;
|
||||
page = 0;
|
||||
}
|
||||
|
||||
private void prevType() {
|
||||
recipetype--;
|
||||
if (recipetype < 0)
|
||||
recipetype = currenthandlers.size() - 1;
|
||||
page = 0;
|
||||
}
|
||||
|
||||
private void overlayRecipe(int recipe) {
|
||||
IRecipeOverlayRenderer renderer = currenthandlers.get(recipetype).getOverlayRenderer(firstGui, recipe);
|
||||
IOverlayHandler handler = currenthandlers.get(recipetype).getOverlayHandler(firstGui, recipe);
|
||||
boolean shift = NEIClientUtils.shiftKey();
|
||||
|
||||
if (handler != null && (renderer == null || shift)) {
|
||||
mc.displayGuiScreen(firstGui);
|
||||
handler.overlayRecipe(firstGui, currenthandlers.get(recipetype), recipe, shift);
|
||||
} else if (renderer != null) {
|
||||
mc.displayGuiScreen(firstGui);
|
||||
LayoutManager.overlayRenderer = renderer;
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshPage() {
|
||||
refreshSlots();
|
||||
|
||||
IRecipeHandler handler = currenthandlers.get(recipetype);
|
||||
boolean multiplepages = handler.numRecipes() > handler.recipiesPerPage();
|
||||
nextpage.visible = multiplepages;
|
||||
prevpage.visible = multiplepages;
|
||||
|
||||
if(firstGui != null) {
|
||||
overlay1.yPosition = (height - ySize) / 2 + (handler.recipiesPerPage() == 2 ? 63 : 128);
|
||||
overlay1.visible = handler.hasOverlay(firstGui, firstGui.inventorySlots, page * handler.recipiesPerPage());
|
||||
overlay2.visible = handler.recipiesPerPage() == 2 && page * handler.recipiesPerPage() + 1 < handler.numRecipes() &&
|
||||
handler.hasOverlay(firstGui, firstGui.inventorySlots, page * handler.recipiesPerPage() + 1);
|
||||
} else {
|
||||
overlay1.visible = overlay2.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshSlots() {
|
||||
slotcontainer.inventorySlots.clear();
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
for (int i = page * recipehandler.recipiesPerPage(); i < recipehandler.numRecipes() && i < (page + 1) * recipehandler.recipiesPerPage(); i++) {
|
||||
Point p = getRecipePosition(i);
|
||||
|
||||
List<PositionedStack> stacks = recipehandler.getIngredientStacks(i);
|
||||
for (PositionedStack stack : stacks)
|
||||
slotcontainer.addSlot(stack, p.x, p.y);
|
||||
|
||||
stacks = recipehandler.getOtherStacks(i);
|
||||
for (PositionedStack stack : stacks)
|
||||
slotcontainer.addSlot(stack, p.x, p.y);
|
||||
|
||||
PositionedStack result = recipehandler.getResultStack(i);
|
||||
if (result != null)
|
||||
slotcontainer.addSlot(result, p.x, p.y);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerForegroundLayer(int par1, int par2) {
|
||||
GuiContainerManager.enable2DRender();
|
||||
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
String s = recipehandler.getRecipeName();
|
||||
fontRendererObj.drawString(s, (xSize - fontRendererObj.getStringWidth(s)) / 2, 5, 0x404040);
|
||||
s = NEIClientUtils.translate("recipe.page", page + 1, (currenthandlers.get(recipetype).numRecipes() - 1) / recipehandler.recipiesPerPage() + 1);
|
||||
fontRendererObj.drawString(s, (xSize - fontRendererObj.getStringWidth(s)) / 2, ySize - 16, 0x404040);
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslatef(5, 16, 0);
|
||||
for (int i = page * recipehandler.recipiesPerPage(); i < recipehandler.numRecipes() && i < (page + 1) * recipehandler.recipiesPerPage(); i++) {
|
||||
recipehandler.drawForeground(i);
|
||||
GL11.glTranslatef(0, 65, 0);
|
||||
}
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerBackgroundLayer(float f, int mx, int my) {
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
CCRenderState.changeTexture("nei:textures/gui/recipebg.png");
|
||||
int j = (width - xSize) / 2;
|
||||
int k = (height - ySize) / 2;
|
||||
drawTexturedModalRect(j, k, 0, 0, xSize, ySize);
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslatef(j + 5, k + 16, 0);
|
||||
IRecipeHandler recipehandler = currenthandlers.get(recipetype);
|
||||
for (int i = page * recipehandler.recipiesPerPage(); i < recipehandler.numRecipes() && i < (page + 1) * recipehandler.recipiesPerPage(); i++) {
|
||||
recipehandler.drawBackground(i);
|
||||
GL11.glTranslatef(0, 65, 0);
|
||||
}
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuiContainer getFirstScreen() {
|
||||
return firstGui;
|
||||
}
|
||||
|
||||
public boolean isMouseOver(PositionedStack stack, int recipe) {
|
||||
Slot stackSlot = slotcontainer.getSlotWithStack(stack, getRecipePosition(recipe).x, getRecipePosition(recipe).y);
|
||||
Point mousepos = GuiDraw.getMousePosition();
|
||||
Slot mouseoverSlot = getSlotAtPosition(mousepos.x, mousepos.y);
|
||||
|
||||
return stackSlot == mouseoverSlot;
|
||||
}
|
||||
|
||||
public Point getRecipePosition(int recipe) {
|
||||
return new Point(5, 16 + (recipe % currenthandlers.get(recipetype).recipiesPerPage()) * 65);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseScrolled(int i) {
|
||||
if (new Rectangle(guiLeft, guiTop, xSize, ySize).contains(GuiDraw.getMousePosition())) {
|
||||
if (i > 0)
|
||||
prevPage();
|
||||
else
|
||||
nextPage();
|
||||
}
|
||||
}
|
||||
|
||||
public abstract ArrayList<? extends IRecipeHandler> getCurrentRecipeHandlers();
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.core.TaskProfiler;
|
||||
import codechicken.nei.NEIClientUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
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;
|
||||
|
||||
TaskProfiler profiler = ProfilerRecipeHandler.getProfiler();
|
||||
ArrayList<IUsageHandler> handlers = new ArrayList<>();
|
||||
for (IUsageHandler usagehandler : usagehandlers) {
|
||||
profiler.start(usagehandler.getRecipeName());
|
||||
IUsageHandler handler = usagehandler.getUsageHandler(inputId, ingredients);
|
||||
if (handler.numRecipes() > 0)
|
||||
handlers.add(handler);
|
||||
}
|
||||
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,121 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
import codechicken.nei.PositionedStack;
|
||||
import codechicken.nei.api.IOverlayHandler;
|
||||
import codechicken.nei.api.IRecipeOverlayRenderer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Do not implement this. Implement one of it's subinterfaces, either {@link ICraftingHandler} or {@link IUsageHandler}
|
||||
*/
|
||||
public interface IRecipeHandler
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @return The name of this inventory.
|
||||
* To be displayed at the top of the viewing container.
|
||||
*/
|
||||
public String getRecipeName();
|
||||
/**
|
||||
*
|
||||
* @return The number of recipes that this handler contains.
|
||||
*/
|
||||
public int numRecipes();
|
||||
/**
|
||||
* Draw the background of this recipe handler (basically the slot layout image).
|
||||
* @param gui A GuiManager for drawing functions.
|
||||
* @param recipe The recipe index to draw at this position.
|
||||
*/
|
||||
public void drawBackground(int recipe);
|
||||
/**
|
||||
* Draw the foreground of this recipe handler (for things like progress bars).
|
||||
* @param gui A GuiManager for drawing functions.
|
||||
* @param recipe The recipe index to draw at this position.
|
||||
*/
|
||||
public void drawForeground(int recipe);
|
||||
/**
|
||||
*
|
||||
* @param recipe The recipe index to get items for.
|
||||
* @return A list of the ingredient {@link PositionedStack}s in this recipe relative to the top left corner of your recipe drawing space.
|
||||
*/
|
||||
public List<PositionedStack> getIngredientStacks(int recipe);
|
||||
/**
|
||||
*
|
||||
* @param recipe The recipe index to get items for.
|
||||
* @return A list of the other {@link PositionedStack}s in this recipe relative to the top left corner of your recipe drawing space. For example fuel in furnaces.
|
||||
*/
|
||||
public List<PositionedStack> getOtherStacks(int recipetype);
|
||||
/**
|
||||
*
|
||||
* @param recipe The recipe index to get the result for.
|
||||
* @return The recipe result {@link PositionedStack} relative to the top left corner of your recipe drawing space.
|
||||
*/
|
||||
public PositionedStack getResultStack(int recipe);
|
||||
/**
|
||||
* A tick function called for updating progress bars and cycling damage items.
|
||||
*/
|
||||
public void onUpdate();
|
||||
/**
|
||||
*
|
||||
* @param recipe The recipe index to check for.
|
||||
* @param gui The GUI to overlay.
|
||||
* @param container The container of the GUI.
|
||||
* @return true if this recipe can render an overlay for the specified type of inventory GUI.
|
||||
*/
|
||||
public boolean hasOverlay(GuiContainer gui, Container container, int recipe);
|
||||
/**
|
||||
*
|
||||
* @param recipe The recipe index to get the overlay renderer for.
|
||||
* @return An instance of {@link IRecipeOverlayRenderer} to be used for rendering the overlay of this specific recipe.
|
||||
*/
|
||||
public IRecipeOverlayRenderer getOverlayRenderer(GuiContainer gui, int recipe);
|
||||
/**
|
||||
*
|
||||
* @param recipe The recipe index to get the overlay renderer for.
|
||||
* @return An instance of {@link IOverlayHandler} to be used for rendering the overlay of this specific recipe.
|
||||
*/
|
||||
public IOverlayHandler getOverlayHandler(GuiContainer gui, int recipe);
|
||||
/**
|
||||
*
|
||||
* @return The number of recipes that can fit on a page in the viewer (1 or 2)
|
||||
*/
|
||||
public int recipiesPerPage();
|
||||
/**
|
||||
*
|
||||
* @param gui An instance of the currentscreen
|
||||
* @param currenttip The current tooltip, will contain item name and info
|
||||
* @param recipe The recipe index being handled
|
||||
* @return The modified tooltip. DO NOT return null
|
||||
*/
|
||||
public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe);
|
||||
/**
|
||||
*
|
||||
* @param gui An instance of the currentscreen
|
||||
* @param The itemstack currently under the mouse
|
||||
* @param The current tooltip, will contain item name and info
|
||||
* @param recipe The recipe index being handled
|
||||
* @return The modified tooltip. DO NOT return null
|
||||
*/
|
||||
public List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param gui An instance of the currentscreen
|
||||
* @param keyChar The character representing the keyPress
|
||||
* @param keyCode The KeyCode as defined in {@link Keyboard}
|
||||
* @return true to terminate further processing of this event.
|
||||
*/
|
||||
public boolean keyTyped(GuiRecipe gui, char keyChar, int keyCode, int recipe);
|
||||
/**
|
||||
*
|
||||
* @param gui An instance of the currentscreen
|
||||
* @param button The button index being pressed, {0 = Left Click, 1 = Right Click, 2 = Middle Click}
|
||||
* @return true to terminate further processing of this event.
|
||||
*/
|
||||
public boolean mouseClicked(GuiRecipe gui, int button, int recipe);
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package codechicken.nei.recipe;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* Implement this to show custom recipes in the usage viewer.
|
||||
* See the default vanilla ones for more info.
|
||||
*
|
||||
*/
|
||||
public interface IUsageHandler extends IRecipeHandler
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @param inputId A String identifier representing the type of ingredients used. Eg. {"item", "fuel"}
|
||||
* @param ingredients Objects representing the ingredients that matching recipes must contain.
|
||||
* @return An instance of {@link IUsageHandler} configured with a list of recipes that contain matching input
|
||||
*/
|
||||
public IUsageHandler getUsageHandler(String inputId, Object... ingredients);
|
||||
}
|
||||
@@ -1,86 +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 || !(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)
|
||||
{
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,11 +1,11 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.getStringWidth;
|
||||
|
||||
public abstract class Button extends Widget
|
||||
{
|
||||
import java.util.List;
|
||||
|
||||
public abstract class Button extends Widget {
|
||||
|
||||
public Button(String s) {
|
||||
label = s;
|
||||
}
|
||||
@@ -25,9 +25,7 @@ public abstract class Button extends Widget
|
||||
|
||||
@Override
|
||||
public boolean handleClick(int mx, int my, int button) {
|
||||
if (button == 1 || button == 0)
|
||||
if (onButtonPress(button == 1))
|
||||
NEIClientUtils.playClickSound();
|
||||
if (button == 1 || button == 0) if (onButtonPress(button == 1)) NEIClientUtils.playClickSound();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -39,12 +37,13 @@ public abstract class Button extends Widget
|
||||
|
||||
@Override
|
||||
public List<String> handleTooltip(int mx, int my, List<String> tooltip) {
|
||||
if (!contains(mx, my))
|
||||
return tooltip;
|
||||
if (!contains(mx, my)) return tooltip;
|
||||
|
||||
final String tip = getButtonTip();
|
||||
if (tip != null) tooltip.add(tip);
|
||||
|
||||
addTooltips(tooltip);
|
||||
|
||||
String tip = getButtonTip();
|
||||
if (tip != null)
|
||||
tooltip.add(tip);
|
||||
return tooltip;
|
||||
}
|
||||
|
||||
@@ -52,6 +51,8 @@ public abstract class Button extends Widget
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addTooltips(List<String> tooltip) {}
|
||||
|
||||
public String getRenderLabel() {
|
||||
return label;
|
||||
}
|
||||
@@ -60,10 +61,7 @@ public abstract class Button extends Widget
|
||||
public Image icon;
|
||||
|
||||
/**
|
||||
* 0x4 = state flag, as opposed to 1 click
|
||||
* 0 = normal
|
||||
* 1 = on
|
||||
* 2 = disabled
|
||||
* 0x4 = state flag, as opposed to 1 click 0 = normal 1 = on 2 = disabled
|
||||
*/
|
||||
public int state;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public abstract class ButtonCycled extends Button {
|
||||
|
||||
public ButtonCycled() {}
|
||||
|
||||
public ButtonCycled(int num) {
|
||||
icons = new Image[num];
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getRenderIcon() {
|
||||
return icons[index];
|
||||
}
|
||||
|
||||
public void init() {}
|
||||
|
||||
public int index;
|
||||
public Image[] icons;
|
||||
}
|
||||
@@ -0,0 +1,367 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.GuiErrorScreen;
|
||||
import net.minecraft.client.gui.GuiMainMenu;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.gui.GuiSelectWorld;
|
||||
import net.minecraft.client.multiplayer.WorldClient;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
import org.apache.commons.csv.CSVFormat;
|
||||
import org.apache.commons.csv.CSVParser;
|
||||
import org.apache.commons.csv.CSVRecord;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import codechicken.core.ClientUtils;
|
||||
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 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;
|
||||
|
||||
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<>();
|
||||
private World lastworld;
|
||||
private GuiScreen lastGui;
|
||||
|
||||
public void addSMPMagneticItem(int i, World world) {
|
||||
WorldClient cworld = (WorldClient) world;
|
||||
Entity e = cworld.getEntityByID(i);
|
||||
if (!(e instanceof EntityItem)) {
|
||||
return;
|
||||
}
|
||||
SMPmagneticItems.add((EntityItem) e);
|
||||
}
|
||||
|
||||
private void updateMagnetMode(World world, EntityPlayerSP player) {
|
||||
if (!NEIClientConfig.getMagnetMode()) return;
|
||||
|
||||
float distancexz = 16;
|
||||
float distancey = 8;
|
||||
double maxspeedxz = 0.5;
|
||||
double maxspeedy = 0.5;
|
||||
double speedxz = 0.05;
|
||||
double speedy = 0.07;
|
||||
|
||||
List<EntityItem> items;
|
||||
if (world.isRemote) {
|
||||
items = SMPmagneticItems;
|
||||
} else {
|
||||
items = world.getEntitiesWithinAABB(
|
||||
EntityItem.class,
|
||||
player.boundingBox.expand(distancexz, distancey, distancexz));
|
||||
}
|
||||
for (Iterator<EntityItem> iterator = items.iterator(); iterator.hasNext();) {
|
||||
EntityItem item = iterator.next();
|
||||
|
||||
if (item.delayBeforeCanPickup > 0) continue;
|
||||
if (item.isDead && world.isRemote) iterator.remove();
|
||||
|
||||
if (!NEIClientUtils.canItemFitInInventory(player, item.getEntityItem())) continue;
|
||||
|
||||
double dx = player.posX - item.posX;
|
||||
double dy = player.posY + player.getEyeHeight() - item.posY;
|
||||
double dz = player.posZ - item.posZ;
|
||||
double absxz = Math.sqrt(dx * dx + dz * dz);
|
||||
double absy = Math.abs(dy);
|
||||
if (absxz > distancexz) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (absxz > 1) {
|
||||
dx /= absxz;
|
||||
dz /= absxz;
|
||||
}
|
||||
|
||||
if (absy > 1) {
|
||||
dy /= absy;
|
||||
}
|
||||
|
||||
double vx = item.motionX + speedxz * dx;
|
||||
double vy = item.motionY + speedy * dy;
|
||||
double vz = item.motionZ + speedxz * dz;
|
||||
|
||||
double absvxz = Math.sqrt(vx * vx + vz * vz);
|
||||
double absvy = Math.abs(vy);
|
||||
|
||||
double rationspeedxz = absvxz / maxspeedxz;
|
||||
if (rationspeedxz > 1) {
|
||||
vx /= rationspeedxz;
|
||||
vz /= rationspeedxz;
|
||||
}
|
||||
|
||||
double rationspeedy = absvy / maxspeedy;
|
||||
if (rationspeedy > 1) {
|
||||
vy /= rationspeedy;
|
||||
}
|
||||
|
||||
if (absvxz < 0.2 && absxz < 0.2 && world.isRemote) {
|
||||
item.setDead();
|
||||
}
|
||||
|
||||
item.setVelocity(vx, vy, vz);
|
||||
}
|
||||
}
|
||||
|
||||
public static void preInit() {
|
||||
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() {
|
||||
instance = new ClientHandler();
|
||||
|
||||
GuiModListScroll.register("NotEnoughItems");
|
||||
PacketCustom.assignHandler(NEICPH.channel, new NEICPH());
|
||||
FMLCommonHandler.instance().bus().register(instance);
|
||||
MinecraftForge.EVENT_BUS.register(instance);
|
||||
|
||||
API.registerHighlightHandler(new DefaultHighlightHandler(), ItemInfo.Layout.HEADER);
|
||||
HUDRenderer.load();
|
||||
WorldOverlayRenderer.load();
|
||||
}
|
||||
|
||||
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) return;
|
||||
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
if (mc.theWorld != null) {
|
||||
loadWorld(mc.theWorld, false);
|
||||
|
||||
if (!NEIClientConfig.isEnabled()) return;
|
||||
|
||||
/*
|
||||
* NEI plugins are loaded in a separate thread. Make sure loading them has finished otherwise a CME might
|
||||
* occur in KeyManager if a plugin calls API.addKeyBind() during initialization.
|
||||
*/
|
||||
if (NEIClientConfig.isLoaded()) KeyManager.tickKeyStates();
|
||||
|
||||
NEIController.updateUnlimitedItems(mc.thePlayer.inventory);
|
||||
if (mc.currentScreen == null) NEIController.processCreativeCycling(mc.thePlayer.inventory);
|
||||
|
||||
updateMagnetMode(mc.theWorld, mc.thePlayer);
|
||||
}
|
||||
|
||||
GuiScreen gui = mc.currentScreen;
|
||||
if (gui != lastGui) {
|
||||
if (gui instanceof GuiMainMenu) lastworld = null;
|
||||
else if (gui instanceof GuiSelectWorld) NEIClientConfig.reloadSaves();
|
||||
else if (gui == null) {
|
||||
/* prevent WorldClient reference being held in the Gui */
|
||||
NEIController.manager = null;
|
||||
}
|
||||
}
|
||||
lastGui = gui;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void tickEvent(TickEvent.RenderTickEvent event) {
|
||||
if (event.phase == Phase.END && NEIClientConfig.isEnabled()) HUDRenderer.renderOverlay();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void renderLastEvent(RenderWorldLastEvent event) {
|
||||
if (NEIClientConfig.isEnabled()) WorldOverlayRenderer.render(event.partialTicks);
|
||||
}
|
||||
|
||||
public void loadWorld(World world, boolean fromServer) {
|
||||
if (world != lastworld) {
|
||||
SMPmagneticItems.clear();
|
||||
WorldOverlayRenderer.reset();
|
||||
|
||||
if (!fromServer) {
|
||||
NEIClientConfig.setHasSMPCounterPart(false);
|
||||
NEIClientConfig.setInternalEnabled(false);
|
||||
|
||||
if (!Minecraft.getMinecraft().isSingleplayer()) // wait for server to initiate in singleplayer
|
||||
NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~'));
|
||||
|
||||
ItemMobSpawner.clearEntityReferences(world);
|
||||
}
|
||||
|
||||
lastworld = world;
|
||||
}
|
||||
}
|
||||
|
||||
public static ClientHandler instance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static RuntimeException throwCME(final String message) {
|
||||
final GuiScreen errorGui = new GuiErrorScreen(null, null) {
|
||||
|
||||
@Override
|
||||
public void handleMouseInput() {}
|
||||
|
||||
@Override
|
||||
public void handleKeyboardInput() {}
|
||||
|
||||
@Override
|
||||
public void drawScreen(int par1, int par2, float par3) {
|
||||
drawDefaultBackground();
|
||||
String[] s_msg = message.split("\n");
|
||||
for (int i = 0; i < s_msg.length; ++i)
|
||||
drawCenteredString(fontRendererObj, s_msg[i], width / 2, height / 3 + 12 * i, 0xFFFFFFFF);
|
||||
}
|
||||
};
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
CustomModLoadingErrorDisplayException e = new CustomModLoadingErrorDisplayException() {
|
||||
|
||||
@Override
|
||||
public void initGui(GuiErrorScreen errorScreen, FontRenderer fontRenderer) {
|
||||
Minecraft.getMinecraft().displayGuiScreen(errorGui);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawScreen(GuiErrorScreen errorScreen, FontRenderer fontRenderer, int mouseRelX, int mouseRelY,
|
||||
float tickTime) {}
|
||||
};
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
+26
-25
@@ -1,7 +1,5 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
@@ -11,10 +9,13 @@ import net.minecraft.item.ItemArmor;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class ContainerCreativeInv extends Container
|
||||
{
|
||||
private class SlotArmor extends Slot
|
||||
{
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class ContainerCreativeInv extends Container {
|
||||
|
||||
private class SlotArmor extends Slot {
|
||||
|
||||
final int armorType;
|
||||
|
||||
public SlotArmor(IInventory inv, int x, int y, int slot, int armor) {
|
||||
@@ -39,15 +40,16 @@ public class ContainerCreativeInv extends Container
|
||||
}
|
||||
}
|
||||
|
||||
private class SlotBlockArmor extends SlotArmor
|
||||
{
|
||||
private class SlotBlockArmor extends SlotArmor {
|
||||
|
||||
public SlotBlockArmor(IInventory inv, int x, int y, int slot, int armor) {
|
||||
super(inv, x, y, slot, armor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemValid(ItemStack stack) {
|
||||
return super.isItemValid(stack) || stack != null;// && Block.getBlockFromItem(stack.getItem()) != Blocks.air;
|
||||
return super.isItemValid(stack) || stack != null; // && Block.getBlockFromItem(stack.getItem()) !=
|
||||
// Blocks.air;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,20 +58,22 @@ public class ContainerCreativeInv extends Container
|
||||
public ContainerCreativeInv(EntityPlayer player, ExtendedCreativeInv extraInv) {
|
||||
this.player = player;
|
||||
InventoryPlayer invPlayer = player.inventory;
|
||||
for (int row = 0; row < 6; row++)
|
||||
for (int col = 0; col < 9; col++)
|
||||
addSlotToContainer(new Slot(extraInv, col + row * 9, 8 + col * 18, 5 + row * 18));
|
||||
for (int row = 0; row < 6; row++) for (int col = 0; col < 9; col++)
|
||||
addSlotToContainer(new Slot(extraInv, col + row * 9, 8 + col * 18, 5 + row * 18));
|
||||
|
||||
for (int row = 0; row < 3; ++row)
|
||||
for (int col = 0; col < 9; ++col)
|
||||
addSlotToContainer(new Slot(invPlayer, col + row * 9 + 9, 8 + col * 18, 118 + row * 18));
|
||||
for (int row = 0; row < 3; ++row) for (int col = 0; col < 9; ++col)
|
||||
addSlotToContainer(new Slot(invPlayer, col + row * 9 + 9, 8 + col * 18, 118 + row * 18));
|
||||
|
||||
for (int col = 0; col < 9; ++col)
|
||||
addSlotToContainer(new Slot(invPlayer, col, 8 + col * 18, 176));
|
||||
for (int col = 0; col < 9; ++col) addSlotToContainer(new Slot(invPlayer, col, 8 + col * 18, 176));
|
||||
|
||||
addSlotToContainer(new SlotBlockArmor(invPlayer, invPlayer.getSizeInventory() - 1, -15, 23, 0));
|
||||
for (int armorType = 1; armorType < 4; armorType++)
|
||||
addSlotToContainer(new SlotArmor(invPlayer, invPlayer.getSizeInventory() - 1 - armorType, -15, 23 + armorType * 18, armorType));
|
||||
for (int armorType = 1; armorType < 4; armorType++) addSlotToContainer(
|
||||
new SlotArmor(
|
||||
invPlayer,
|
||||
invPlayer.getSizeInventory() - 1 - armorType,
|
||||
-15,
|
||||
23 + armorType * 18,
|
||||
armorType));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -91,16 +95,13 @@ public class ContainerCreativeInv extends Container
|
||||
}
|
||||
|
||||
if (slotIndex < 54) {
|
||||
if (!this.mergeItemStack(stack, 54, 90, true))
|
||||
return null;
|
||||
if (!this.mergeItemStack(stack, 54, 90, true)) return null;
|
||||
} else if (!this.mergeItemStack(stack, 0, 54, false)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (stack.stackSize == 0)
|
||||
slot.putStack(null);
|
||||
else
|
||||
slot.onSlotChanged();
|
||||
if (stack.stackSize == 0) slot.putStack(null);
|
||||
else slot.onSlotChanged();
|
||||
}
|
||||
|
||||
return transferredStack;
|
||||
+66
-34
@@ -1,6 +1,7 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@@ -12,17 +13,18 @@ import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
|
||||
/**
|
||||
* This is crap code, don't ever do this.
|
||||
*/
|
||||
public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
{
|
||||
public static class EnchantmentHash
|
||||
{
|
||||
public class ContainerEnchantmentModifier extends ContainerEnchantment {
|
||||
|
||||
public static class EnchantmentHash {
|
||||
|
||||
public EnchantmentHash(Enchantment e, int i, int l) {
|
||||
enchantment = e;
|
||||
state = i;
|
||||
@@ -104,10 +106,11 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
int barempty = height - getScrollBarHeight();
|
||||
int sbary = rely + (int) (barempty * percentscrolled + 0.5);
|
||||
|
||||
if (button == 0 &&
|
||||
getScrollBarHeight() < height && //the scroll bar can move (not full length)
|
||||
mousex >= relx + cwidth && mousex < relx + cwidth + getScrollBarWidth() &&
|
||||
mousey >= rely && mousey < rely + height)//in the scroll pane
|
||||
if (button == 0 && getScrollBarHeight() < height && // the scroll bar can move (not full length)
|
||||
mousex >= relx + cwidth
|
||||
&& mousex < relx + cwidth + getScrollBarWidth()
|
||||
&& mousey >= rely
|
||||
&& mousey < rely + height) // in the scroll pane
|
||||
{
|
||||
if (mousey < sbary) {
|
||||
percentscrolled = (mousey - rely) / (float) barempty;
|
||||
@@ -126,7 +129,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
}
|
||||
|
||||
public void mouseUp(int mousex, int mousey, int button) {
|
||||
if (scrollclicky >= 0 && button == 0)//we were scrolling and we released mouse
|
||||
if (scrollclicky >= 0 && button == 0) // we were scrolling and we released mouse
|
||||
{
|
||||
scrollclicky = -1;
|
||||
}
|
||||
@@ -135,8 +138,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
public boolean clickButton(int mousex, int mousey, int button) {
|
||||
mousex -= parentscreen.guiLeft;
|
||||
mousey -= parentscreen.guiTop;
|
||||
if (mousex >= relx && mousex < relx + cwidth &&
|
||||
mousey >= rely && mousey <= rely + height)//in the box
|
||||
if (mousex >= relx && mousex < relx + cwidth && mousey >= rely && mousey <= rely + height) // in the box
|
||||
{
|
||||
int slot = getClickedSlot(mousey);
|
||||
if (slot >= getNumSlots()) return false;
|
||||
@@ -176,10 +178,8 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
int ID = nbttaglist.getCompoundTagAt(i).getShort("id");
|
||||
if (ID == e) {
|
||||
nbttaglist.removeTag(i);
|
||||
if (nbttaglist.tagCount() == 0)
|
||||
stack.getTagCompound().removeTag("ench");
|
||||
if (stack.getTagCompound().hasNoTags())
|
||||
stack.setTagCompound(null);
|
||||
if (nbttaglist.tagCount() == 0) stack.getTagCompound().removeTag("ench");
|
||||
if (stack.getTagCompound().hasNoTags()) stack.setTagCompound(null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -191,8 +191,7 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
}
|
||||
|
||||
public void onCraftMatrixChanged(IInventory iinventory) {
|
||||
if (parentscreen != null)
|
||||
updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments());
|
||||
if (parentscreen != null) updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments());
|
||||
}
|
||||
|
||||
public void updateEnchantmentOptions(boolean validate) {
|
||||
@@ -221,9 +220,10 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
if (NEIServerUtils.stackHasEnchantment(toolstack, e.effectId)) {
|
||||
state = 2;
|
||||
level = NEIServerUtils.getEnchantmentLevel(toolstack, e.effectId);
|
||||
} else if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e) && validate) {
|
||||
state = 1;
|
||||
}
|
||||
} else
|
||||
if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e) && validate) {
|
||||
state = 1;
|
||||
}
|
||||
slotEnchantment.add(new EnchantmentHash(e, state, level));
|
||||
}
|
||||
if (numoptions != slotEnchantment.size()) {
|
||||
@@ -257,10 +257,28 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
|
||||
GL11.glColor3f(1, 1, 1);
|
||||
if (hasScrollBar()) {
|
||||
gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth - 30, slotheight);
|
||||
gui.drawTexturedModalRect(relx + cwidth - 30, rely + slot * slotheight, cwidth - 23, gui.ySize + slotheight * shade, 30, slotheight);
|
||||
gui.drawTexturedModalRect(
|
||||
relx,
|
||||
rely + slot * slotheight,
|
||||
0,
|
||||
gui.ySize + slotheight * shade,
|
||||
cwidth - 30,
|
||||
slotheight);
|
||||
gui.drawTexturedModalRect(
|
||||
relx + cwidth - 30,
|
||||
rely + slot * slotheight,
|
||||
cwidth - 23,
|
||||
gui.ySize + slotheight * shade,
|
||||
30,
|
||||
slotheight);
|
||||
} else {
|
||||
gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth + 7, slotheight);
|
||||
gui.drawTexturedModalRect(
|
||||
relx,
|
||||
rely + slot * slotheight,
|
||||
0,
|
||||
gui.ySize + slotheight * shade,
|
||||
cwidth + 7,
|
||||
slotheight);
|
||||
}
|
||||
|
||||
gui.getFontRenderer().drawString(text, relx + 4, rely + slot * slotheight + 5, textColourFromState(shade));
|
||||
@@ -277,18 +295,32 @@ public class ContainerEnchantmentModifier extends ContainerEnchantment
|
||||
int sbary = rely + (int) ((height - getScrollBarHeight()) * percentscrolled + 0.5);
|
||||
int sbarx = relx + cwidth;
|
||||
|
||||
Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020);//background
|
||||
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B);//corners
|
||||
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFFF0F0F0);//topleft up
|
||||
Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFF555555);//bottom right down
|
||||
Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 2, sbary + getScrollBarHeight() - 2, 0xFFC6C6C6);//scrollbar
|
||||
Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020); // background
|
||||
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B); // corners
|
||||
Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFFF0F0F0); // topleft
|
||||
// up
|
||||
Gui.drawRect(
|
||||
sbarx + 1,
|
||||
sbary + 1,
|
||||
sbarx + getScrollBarWidth() - 1,
|
||||
sbary + getScrollBarHeight() - 1,
|
||||
0xFF555555); // bottom right down
|
||||
Gui.drawRect(
|
||||
sbarx + 1,
|
||||
sbary + 1,
|
||||
sbarx + getScrollBarWidth() - 2,
|
||||
sbary + getScrollBarHeight() - 2,
|
||||
0xFFC6C6C6); // scrollbar
|
||||
}
|
||||
|
||||
private int textColourFromState(int shade) {
|
||||
switch(shade) {
|
||||
case 0: return 0x685e4a;
|
||||
case 1: return 0x407f10;
|
||||
default: return 0xffff80;
|
||||
switch (shade) {
|
||||
case 0:
|
||||
return 0x685e4a;
|
||||
case 1:
|
||||
return 0x407f10;
|
||||
default:
|
||||
return 0xffff80;
|
||||
}
|
||||
}
|
||||
|
||||
+26
-31
@@ -1,10 +1,5 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.inventory.ContainerExtended;
|
||||
import codechicken.lib.inventory.InventoryNBT;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.inventory.SlotHandleClicks;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
@@ -16,10 +11,16 @@ import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
|
||||
public class ContainerPotionCreator extends ContainerExtended
|
||||
{
|
||||
public class SlotPotion extends Slot
|
||||
{
|
||||
import codechicken.lib.inventory.ContainerExtended;
|
||||
import codechicken.lib.inventory.InventoryNBT;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.inventory.SlotHandleClicks;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
|
||||
public class ContainerPotionCreator extends ContainerExtended {
|
||||
|
||||
public class SlotPotion extends Slot {
|
||||
|
||||
public SlotPotion(IInventory inv, int slotIndex, int x, int y) {
|
||||
super(inv, slotIndex, x, y);
|
||||
}
|
||||
@@ -34,16 +35,15 @@ public class ContainerPotionCreator extends ContainerExtended
|
||||
super.onSlotChanged();
|
||||
if (getHasStack()) {
|
||||
ItemStack stack = getStack();
|
||||
if (!stack.hasTagCompound())
|
||||
stack.setTagCompound(new NBTTagCompound());
|
||||
if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
|
||||
if (!stack.getTagCompound().hasKey("CustomPotionEffects"))
|
||||
stack.getTagCompound().setTag("CustomPotionEffects", new NBTTagList());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class SlotPotionStore extends SlotHandleClicks
|
||||
{
|
||||
public class SlotPotionStore extends SlotHandleClicks {
|
||||
|
||||
public SlotPotionStore(IInventory inv, int slotIndex, int x, int y) {
|
||||
super(inv, slotIndex, x, y);
|
||||
}
|
||||
@@ -60,8 +60,7 @@ public class ContainerPotionCreator extends ContainerExtended
|
||||
putStack(InventoryUtils.copyStack(held, 1));
|
||||
player.inventory.setItemStack(null);
|
||||
}
|
||||
} else if (getHasStack())
|
||||
player.inventory.setItemStack(getStack());
|
||||
} else if (getHasStack()) player.inventory.setItemStack(getStack());
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -72,8 +71,8 @@ public class ContainerPotionCreator extends ContainerExtended
|
||||
}
|
||||
}
|
||||
|
||||
public static class InventoryPotionStore extends InventoryNBT
|
||||
{
|
||||
public static class InventoryPotionStore extends InventoryNBT {
|
||||
|
||||
public InventoryPotionStore() {
|
||||
super(9, NEIClientConfig.global.nbt.getCompoundTag("potionStore"));
|
||||
}
|
||||
@@ -96,15 +95,13 @@ public class ContainerPotionCreator extends ContainerExtended
|
||||
this.potionStoreInv = potionStoreInv;
|
||||
|
||||
addSlotToContainer(new SlotPotion(potionInv, 0, 25, 102));
|
||||
for (int i = 0; i < 9; i++)
|
||||
addSlotToContainer(new SlotPotionStore(potionStoreInv, i, 8 + i * 18, 14));
|
||||
for (int i = 0; i < 9; i++) addSlotToContainer(new SlotPotionStore(potionStoreInv, i, 8 + i * 18, 14));
|
||||
bindPlayerInventory(inventoryPlayer, 8, 125);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doMergeStackAreas(int slotIndex, ItemStack stack) {
|
||||
if (slotIndex < 10)
|
||||
return mergeItemStack(stack, 10, 46, true);
|
||||
if (slotIndex < 10) return mergeItemStack(stack, 10, 46, true);
|
||||
return mergeItemStack(stack, 0, 1, false);
|
||||
}
|
||||
|
||||
@@ -117,30 +114,28 @@ public class ContainerPotionCreator extends ContainerExtended
|
||||
public void onContainerClosed(EntityPlayer player) {
|
||||
super.onContainerClosed(player);
|
||||
|
||||
if (!player.worldObj.isRemote)
|
||||
InventoryUtils.dropOnClose(player, potionInv);
|
||||
if (!player.worldObj.isRemote) InventoryUtils.dropOnClose(player, potionInv);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void handleServerPacket(PacketCustom packet) {
|
||||
ItemStack potion = potionInv.getStackInSlot(0);
|
||||
if (potion == null)
|
||||
return;
|
||||
if (potion == null) return;
|
||||
|
||||
boolean add = packet.getType() == 3;
|
||||
int effectID = packet.readUByte();
|
||||
|
||||
NBTTagList effects = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
|
||||
NBTTagList newEffects = new NBTTagList();
|
||||
for(int i = 0; i < effects.tagCount(); i++) {
|
||||
for (int i = 0; i < effects.tagCount(); i++) {
|
||||
NBTTagCompound tag = effects.getCompoundTagAt(i);
|
||||
PotionEffect e = PotionEffect.readCustomPotionEffectFromNBT(tag);
|
||||
if(e.getPotionID() != effectID)
|
||||
newEffects.appendTag(tag);
|
||||
if (e.getPotionID() != effectID) newEffects.appendTag(tag);
|
||||
}
|
||||
if(add)
|
||||
newEffects.appendTag(new PotionEffect(effectID, packet.readInt(), packet.readUByte()).writeCustomPotionEffectToNBT(new NBTTagCompound()));
|
||||
if (add) newEffects.appendTag(
|
||||
new PotionEffect(effectID, packet.readInt(), packet.readUByte())
|
||||
.writeCustomPotionEffectToNBT(new NBTTagCompound()));
|
||||
potion.getTagCompound().setTag("CustomPotionEffects", newEffects);
|
||||
}
|
||||
|
||||
@@ -157,4 +152,4 @@ public class ContainerPotionCreator extends ContainerExtended
|
||||
packet.writeByte(effectID);
|
||||
packet.sendToServer();
|
||||
}
|
||||
}
|
||||
}
|
||||
+12
-13
@@ -1,35 +1,34 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.IHighlightHandler;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.List;
|
||||
import codechicken.nei.api.IHighlightHandler;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
|
||||
public class DefaultHighlightHandler implements IHighlightHandler {
|
||||
|
||||
public class DefaultHighlightHandler implements IHighlightHandler
|
||||
{
|
||||
@Override
|
||||
public List<String> handleTextData(ItemStack stack, World world, EntityPlayer player, MovingObjectPosition mop, List<String> currenttip, ItemInfo.Layout layout) {
|
||||
public List<String> handleTextData(ItemStack stack, World world, EntityPlayer player, MovingObjectPosition mop,
|
||||
List<String> currenttip, ItemInfo.Layout layout) {
|
||||
String name = null;
|
||||
try {
|
||||
String s = GuiContainerManager.itemDisplayNameShort(stack);
|
||||
if (s != null && !s.endsWith("Unnamed"))
|
||||
name = s;
|
||||
if (s != null && !s.endsWith("Unnamed")) name = s;
|
||||
|
||||
if (name != null)
|
||||
currenttip.add(name);
|
||||
if (name != null) currenttip.add(name);
|
||||
} catch (Exception ignored) {}
|
||||
|
||||
if (name != null && stack.getItem() == Items.redstone) {
|
||||
int md = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ);
|
||||
String s = "" + md;
|
||||
if (s.length() < 2)
|
||||
s = " " + s;
|
||||
if (s.length() < 2) s = " " + s;
|
||||
currenttip.set(currenttip.size() - 1, name + " " + s);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import codechicken.nei.api.ItemFilter;
|
||||
|
||||
public class DoubleFilteredFilter implements ItemFilter {
|
||||
|
||||
private ItemFilter filter;
|
||||
private ItemList.PatternItemFilter patternFilter;
|
||||
|
||||
public DoubleFilteredFilter(ItemFilter filter, String itemFilter) {
|
||||
this.filter = filter;
|
||||
this.patternFilter = new ItemList.PatternItemFilter(SearchField.getPattern(itemFilter));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(ItemStack item) {
|
||||
if (filter.matches(item)) {
|
||||
return patternFilter.matches(item);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+10
-16
@@ -1,12 +1,13 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class ExtendedCreativeInv implements IInventory
|
||||
{
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
|
||||
public class ExtendedCreativeInv implements IInventory {
|
||||
|
||||
final PlayerSave playerSave;
|
||||
final Side side;
|
||||
|
||||
@@ -22,8 +23,7 @@ public class ExtendedCreativeInv implements IInventory
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int slot) {
|
||||
if (side.isClient())
|
||||
return NEIClientConfig.creativeInv[slot];
|
||||
if (side.isClient()) return NEIClientConfig.creativeInv[slot];
|
||||
return playerSave.creativeInv[slot];
|
||||
}
|
||||
|
||||
@@ -58,10 +58,8 @@ public class ExtendedCreativeInv implements IInventory
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents(int slot, ItemStack stack) {
|
||||
if (side.isClient())
|
||||
NEIClientConfig.creativeInv[slot] = stack;
|
||||
else
|
||||
playerSave.creativeInv[slot] = stack;
|
||||
if (side.isClient()) NEIClientConfig.creativeInv[slot] = stack;
|
||||
else playerSave.creativeInv[slot] = stack;
|
||||
|
||||
markDirty();
|
||||
}
|
||||
@@ -78,8 +76,7 @@ public class ExtendedCreativeInv implements IInventory
|
||||
|
||||
@Override
|
||||
public void markDirty() {
|
||||
if (side.isServer())
|
||||
playerSave.setCreativeDirty();
|
||||
if (side.isServer()) playerSave.setCreativeDirty();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -88,12 +85,10 @@ public class ExtendedCreativeInv implements IInventory
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openInventory() {
|
||||
}
|
||||
public void openInventory() {}
|
||||
|
||||
@Override
|
||||
public void closeInventory() {
|
||||
}
|
||||
public void closeInventory() {}
|
||||
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int slot, ItemStack stack) {
|
||||
@@ -104,5 +99,4 @@ public class ExtendedCreativeInv implements IInventory
|
||||
public boolean hasCustomInventoryName() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
+58
-76
@@ -1,27 +1,28 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import static codechicken.nei.NEIServerUtils.areStacksIdentical;
|
||||
import static codechicken.nei.NEIServerUtils.areStacksSameType;
|
||||
import static codechicken.nei.NEIServerUtils.copyStack;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import static codechicken.nei.NEIServerUtils.areStacksIdentical;
|
||||
import static codechicken.nei.NEIServerUtils.areStacksSameType;
|
||||
import static codechicken.nei.NEIServerUtils.copyStack;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
|
||||
public class FastTransferManager {
|
||||
|
||||
public class FastTransferManager
|
||||
{
|
||||
/**
|
||||
* Based on the general assumption that we want to fill top to bottom, left to right
|
||||
*/
|
||||
public static class SlotPositionComparator implements Comparator<Integer>
|
||||
{
|
||||
public static class SlotPositionComparator implements Comparator<Integer> {
|
||||
|
||||
final Container container;
|
||||
|
||||
public SlotPositionComparator(Container c) {
|
||||
@@ -47,8 +48,7 @@ public class FastTransferManager
|
||||
stack.stackSize = 1;
|
||||
|
||||
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++) {
|
||||
if (slotZoneMap.containsKey(slotNo) || !container.getSlot(slotNo).isItemValid(stack))
|
||||
continue;
|
||||
if (slotZoneMap.containsKey(slotNo) || !container.getSlot(slotNo).isItemValid(stack)) continue;
|
||||
|
||||
HashSet<Integer> connectedSlots = new HashSet<>();
|
||||
findConnectedSlots(container, slotNo, connectedSlots);
|
||||
@@ -69,11 +69,11 @@ public class FastTransferManager
|
||||
final int threshold = 18;
|
||||
|
||||
for (int i = 0; i < container.inventorySlots.size(); i++) {
|
||||
if (connectedSlots.contains(i))
|
||||
continue;
|
||||
if (connectedSlots.contains(i)) continue;
|
||||
|
||||
Slot slot1 = container.getSlot(i);
|
||||
if (Math.abs(slot.xDisplayPosition - slot1.xDisplayPosition) <= threshold && Math.abs(slot.yDisplayPosition - slot1.yDisplayPosition) <= threshold) {
|
||||
if (Math.abs(slot.xDisplayPosition - slot1.xDisplayPosition) <= threshold
|
||||
&& Math.abs(slot.yDisplayPosition - slot1.yDisplayPosition) <= threshold) {
|
||||
findConnectedSlots(container, i, connectedSlots);
|
||||
}
|
||||
}
|
||||
@@ -82,8 +82,7 @@ public class FastTransferManager
|
||||
public static int findSlotWithItem(Container container, ItemStack teststack) {
|
||||
for (int slotNo = 0; slotNo < container.inventorySlots.size(); slotNo++) {
|
||||
ItemStack stack = container.getSlot(slotNo).getStack();
|
||||
if (areStacksSameType(stack, teststack))
|
||||
return slotNo;
|
||||
if (areStacksSameType(stack, teststack)) return slotNo;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -99,20 +98,16 @@ public class FastTransferManager
|
||||
Integer fromZone = slotZoneMap.get(fromSlot);
|
||||
Integer toZone = slotZoneMap.get(toSlot);
|
||||
|
||||
if (fromZone == null || toZone == null || fromZone.equals(toZone))
|
||||
return;
|
||||
if (fromZone == null || toZone == null || fromZone.equals(toZone)) return;
|
||||
|
||||
if (NEIClientUtils.getHeldItem() != null && !areStacksSameType(heldStack, NEIClientUtils.getHeldItem()))
|
||||
return;
|
||||
if (NEIClientUtils.getHeldItem() != null && !areStacksSameType(heldStack, NEIClientUtils.getHeldItem())) return;
|
||||
|
||||
if (!fillZoneWithHeldItem(window, toZone))
|
||||
return;
|
||||
if (!fillZoneWithHeldItem(window, toZone)) return;
|
||||
|
||||
for (int transferFrom : slotZones.get(fromZone)) {
|
||||
ItemStack transferStack = window.inventorySlots.getSlot(transferFrom).getStack();
|
||||
|
||||
if (!areStacksSameType(heldStack, transferStack))
|
||||
continue;
|
||||
if (!areStacksSameType(heldStack, transferStack)) continue;
|
||||
|
||||
clickSlot(window, transferFrom);
|
||||
if (!fillZoneWithHeldItem(window, toZone)) {
|
||||
@@ -130,8 +125,7 @@ public class FastTransferManager
|
||||
|
||||
Slot slot = container.getSlot(fromSlot);
|
||||
ItemStack stack = slot.getStack();
|
||||
if (stack == null)
|
||||
return -1;
|
||||
if (stack == null) return -1;
|
||||
|
||||
stack.stackSize = 1;
|
||||
slot.putStack(stack.copy());
|
||||
@@ -141,19 +135,19 @@ public class FastTransferManager
|
||||
LinkedList<ItemStack> compareAfter = saveContainer(container);
|
||||
|
||||
try {
|
||||
//if(compareAfter.get(fromSlot) != null)//transfer failed
|
||||
//return -1;
|
||||
// if(compareAfter.get(fromSlot) != null)//transfer failed
|
||||
// return -1;
|
||||
|
||||
for (int i = 0; i < compareBefore.size(); i++) {
|
||||
if (i == fromSlot)
|
||||
continue;
|
||||
if (i == fromSlot) continue;
|
||||
|
||||
ItemStack before = compareBefore.get(i);
|
||||
ItemStack after = compareAfter.get(i);
|
||||
|
||||
if (!areStacksIdentical(before, after) && after != null)
|
||||
if (before == null ? areStacksSameType(stack, after) ://transfered into this empty slot
|
||||
areStacksSameType(stack, after) && after.stackSize - before.stackSize > 0)//it added to this stack
|
||||
if (before == null ? areStacksSameType(stack, after) : // transfered into this empty slot
|
||||
areStacksSameType(stack, after) && after.stackSize - before.stackSize > 0) // it added to
|
||||
// this stack
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -181,45 +175,42 @@ public class FastTransferManager
|
||||
|
||||
public void transferItem(GuiContainer window, int fromSlot) {
|
||||
int toSlot = findShiftClickDestinationSlot(window.inventorySlots, fromSlot);
|
||||
if (toSlot == -1)
|
||||
return;
|
||||
if (toSlot == -1) return;
|
||||
|
||||
Slot from = window.inventorySlots.getSlot(fromSlot);
|
||||
|
||||
if (from.isItemValid(from.getStack()))
|
||||
moveOneItem(window, fromSlot, toSlot);
|
||||
else//slots that you can't put stuff in
|
||||
if (from.isItemValid(from.getStack())) moveOneItem(window, fromSlot, toSlot);
|
||||
else // slots that you can't put stuff in
|
||||
moveOutputSet(window, fromSlot, toSlot);
|
||||
}
|
||||
|
||||
public void moveOutputSet(GuiContainer window, int fromSlot, int toSlot) {
|
||||
if (NEIClientUtils.getHeldItem() != null)
|
||||
return;
|
||||
if (NEIClientUtils.getHeldItem() != null) return;
|
||||
|
||||
clickSlot(window, fromSlot);//pickup fromSlot
|
||||
if (NEIClientUtils.getHeldItem() == null)//maybe this container does auto transfers. No need to pick up the final item
|
||||
clickSlot(window, fromSlot); // pickup fromSlot
|
||||
if (NEIClientUtils.getHeldItem() == null) // maybe this container does auto transfers. No need to pick up the
|
||||
// final item
|
||||
return;
|
||||
clickSlot(window, toSlot);//place one in toSlot
|
||||
clickSlot(window, toSlot); // place one in toSlot
|
||||
}
|
||||
|
||||
public void moveOneItem(GuiContainer window, int fromSlot, int toSlot) {
|
||||
clickSlot(window, fromSlot);//pickup fromSlot
|
||||
clickSlot(window, toSlot, 1);//place one in toSlot
|
||||
clickSlot(window, fromSlot);//place down in fromSlot
|
||||
clickSlot(window, fromSlot); // pickup fromSlot
|
||||
clickSlot(window, toSlot, 1); // place one in toSlot
|
||||
clickSlot(window, fromSlot); // place down in fromSlot
|
||||
}
|
||||
|
||||
public void retrieveItem(GuiContainer window, int toSlot) {
|
||||
Slot slot = window.inventorySlots.getSlot(toSlot);
|
||||
ItemStack slotStack = slot.getStack();
|
||||
if (slotStack == null ||
|
||||
slotStack.stackSize == slot.getSlotStackLimit() ||
|
||||
slotStack.stackSize == slotStack.getMaxStackSize())
|
||||
if (slotStack == null || slotStack.stackSize == slot.getSlotStackLimit()
|
||||
|| slotStack.stackSize == slotStack.getMaxStackSize())
|
||||
return;
|
||||
|
||||
generateSlotMap(window.inventorySlots, slotStack);
|
||||
|
||||
Integer destZone = slotZoneMap.get(toSlot);
|
||||
if (destZone == null)//slots that don't accept
|
||||
if (destZone == null) // slots that don't accept
|
||||
return;
|
||||
|
||||
int firstZoneSlot = findShiftClickDestinationSlot(window.inventorySlots, toSlot);
|
||||
@@ -228,17 +219,14 @@ public class FastTransferManager
|
||||
Integer integer = slotZoneMap.get(firstZoneSlot);
|
||||
if (integer != null) {
|
||||
firstZone = integer;
|
||||
if (retrieveItemFromZone(window, firstZone, toSlot))
|
||||
return;
|
||||
if (retrieveItemFromZone(window, firstZone, toSlot)) return;
|
||||
}
|
||||
}
|
||||
|
||||
for (int zone = 0; zone < slotZones.size(); zone++) {
|
||||
if (zone == destZone || zone == firstZone)
|
||||
continue;
|
||||
if (zone == destZone || zone == firstZone) continue;
|
||||
|
||||
if (retrieveItemFromZone(window, zone, toSlot))
|
||||
return;
|
||||
if (retrieveItemFromZone(window, zone, toSlot)) return;
|
||||
}
|
||||
|
||||
retrieveItemFromZone(window, destZone, toSlot);
|
||||
@@ -247,14 +235,14 @@ public class FastTransferManager
|
||||
private boolean retrieveItemFromZone(GuiContainer window, int zone, int toSlot) {
|
||||
ItemStack stack = window.inventorySlots.getSlot(toSlot).getStack();
|
||||
for (int i : slotZones.get(zone)) {
|
||||
if (i == toSlot)
|
||||
continue;
|
||||
if (i == toSlot) continue;
|
||||
|
||||
Slot slot = window.inventorySlots.getSlot(i);
|
||||
ItemStack stack1 = slot.getStack();
|
||||
|
||||
if (areStacksSameType(stack, stack1) &&
|
||||
stack1.stackSize != slot.getSlotStackLimit() && //get from full stacks on second pass
|
||||
if (areStacksSameType(stack, stack1) && stack1.stackSize != slot.getSlotStackLimit() && // get from full
|
||||
// stacks on second
|
||||
// pass
|
||||
stack1.stackSize != stack1.getMaxStackSize()) {
|
||||
moveOneItem(window, i, toSlot);
|
||||
return true;
|
||||
@@ -262,8 +250,7 @@ public class FastTransferManager
|
||||
}
|
||||
|
||||
for (int i : slotZones.get(zone)) {
|
||||
if (i == toSlot)
|
||||
continue;
|
||||
if (i == toSlot) continue;
|
||||
|
||||
Slot slot = window.inventorySlots.getSlot(i);
|
||||
ItemStack stack1 = slot.getStack();
|
||||
@@ -292,28 +279,24 @@ public class FastTransferManager
|
||||
for (int transferTo : slotZones.get(zoneIndex)) {
|
||||
ItemStack held = NEIClientUtils.getHeldItem();
|
||||
|
||||
if (held == null)
|
||||
break;
|
||||
if (held == null) break;
|
||||
|
||||
ItemStack inToSlot = window.inventorySlots.getSlot(transferTo).getStack();
|
||||
|
||||
if (!areStacksSameType(inToSlot, held))
|
||||
continue;
|
||||
if (!areStacksSameType(inToSlot, held)) continue;
|
||||
|
||||
clickSlot(window, transferTo);
|
||||
}
|
||||
|
||||
for (int transferTo : slotZones.get(zoneIndex))//repeat on empty slots
|
||||
for (int transferTo : slotZones.get(zoneIndex)) // repeat on empty slots
|
||||
{
|
||||
ItemStack held = NEIClientUtils.getHeldItem();
|
||||
|
||||
if (held == null)
|
||||
break;
|
||||
if (held == null) break;
|
||||
|
||||
ItemStack inToSlot = window.inventorySlots.getSlot(transferTo).getStack();
|
||||
|
||||
if (inToSlot != null)
|
||||
continue;
|
||||
if (inToSlot != null) continue;
|
||||
|
||||
clickSlot(window, transferTo);
|
||||
}
|
||||
@@ -323,14 +306,13 @@ public class FastTransferManager
|
||||
|
||||
public void throwAll(GuiContainer window, int pickedUpFromSlot) {
|
||||
ItemStack held = NEIClientUtils.getHeldItem();
|
||||
if (held == null)
|
||||
return;
|
||||
if (held == null) return;
|
||||
|
||||
clickSlot(window, -999);
|
||||
|
||||
generateSlotMap(window.inventorySlots, held);
|
||||
Integer zone = slotZoneMap.get(pickedUpFromSlot);
|
||||
if(zone == null) //something went wrong and we can't work out where the item was picked up from
|
||||
if (zone == null) // something went wrong and we can't work out where the item was picked up from
|
||||
return;
|
||||
|
||||
for (int slotIndex : slotZones.get(zone)) {
|
||||
+6
-4
@@ -1,17 +1,19 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import static codechicken.nei.NEIClientUtils.translate;
|
||||
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import static codechicken.nei.NEIClientUtils.translate;
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
|
||||
public class GuiEnchantmentModifier extends GuiContainer {
|
||||
|
||||
public class GuiEnchantmentModifier extends GuiContainer
|
||||
{
|
||||
final ContainerEnchantmentModifier container;
|
||||
|
||||
public GuiEnchantmentModifier(InventoryPlayer inventoryplayer, World world, int i, int j, int k) {
|
||||
+26
-11
@@ -1,18 +1,22 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import codechicken.nei.api.INEIGuiHandler;
|
||||
import codechicken.nei.api.TaggedInventoryArea;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandler
|
||||
{
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.api.INEIGuiHandler;
|
||||
import codechicken.nei.api.TaggedInventoryArea;
|
||||
|
||||
public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandler {
|
||||
|
||||
public GuiExtendedCreativeInv(Container par1Container) {
|
||||
super(par1Container);
|
||||
ySize = 198;
|
||||
@@ -51,6 +55,17 @@ public class GuiExtendedCreativeInv extends GuiContainer implements INEIGuiHandl
|
||||
|
||||
@Override
|
||||
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) {
|
||||
return false;
|
||||
return (new Rectangle4i(guiLeft - 15, guiTop + 18, 18, 18 * 4 + 4)).intersects(new Rectangle4i(x, y, w, h));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleMouseClick(Slot p_146984_1_, int p_146984_2_, int p_146984_3_, int p_146984_4_) {
|
||||
|
||||
// Hack for armor slots, because they are outside the container
|
||||
if (p_146984_1_ != null && p_146984_4_ == 4 && p_146984_1_.xDisplayPosition < 0) {
|
||||
p_146984_4_ = 0;
|
||||
}
|
||||
|
||||
super.handleMouseClick(p_146984_1_, p_146984_2_, p_146984_3_, p_146984_4_);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
public class GuiNEIButton extends GuiButton {
|
||||
|
||||
protected static final ResourceLocation guiTex = new ResourceLocation("textures/gui/widgets.png");
|
||||
|
||||
public GuiNEIButton(int i, int j, int k, int l, int i1, String s) {
|
||||
super(i, j, k, l, i1, s);
|
||||
}
|
||||
|
||||
public void drawButton(Minecraft minecraft, int i, int j) {
|
||||
if (!visible) return;
|
||||
|
||||
FontRenderer fontrenderer = minecraft.fontRenderer;
|
||||
minecraft.renderEngine.bindTexture(guiTex);
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
boolean flag = i >= xPosition && j >= yPosition && i < xPosition + width && j < yPosition + height;
|
||||
int k = getHoverState(flag);
|
||||
drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height / 2); // top left
|
||||
drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height / 2); // top
|
||||
// right
|
||||
drawTexturedModalRect(
|
||||
xPosition,
|
||||
yPosition + height / 2,
|
||||
0,
|
||||
46 + k * 20 + 20 - height / 2,
|
||||
width / 2,
|
||||
height / 2); // bottom left
|
||||
drawTexturedModalRect(
|
||||
xPosition + width / 2,
|
||||
yPosition + height / 2,
|
||||
200 - width / 2,
|
||||
46 + k * 20 + 20 - height / 2,
|
||||
width / 2,
|
||||
height / 2); // bottom right
|
||||
mouseDragged(minecraft, i, j);
|
||||
|
||||
if (!enabled) drawCenteredString(
|
||||
fontrenderer,
|
||||
displayString,
|
||||
xPosition + width / 2,
|
||||
yPosition + (height - 8) / 2,
|
||||
0xffa0a0a0);
|
||||
else if (flag) drawCenteredString(
|
||||
fontrenderer,
|
||||
displayString,
|
||||
xPosition + width / 2,
|
||||
yPosition + (height - 8) / 2,
|
||||
0xffffa0);
|
||||
else drawCenteredString(
|
||||
fontrenderer,
|
||||
displayString,
|
||||
xPosition + width / 2,
|
||||
yPosition + (height - 8) / 2,
|
||||
0xe0e0e0);
|
||||
}
|
||||
}
|
||||
+42
-49
@@ -1,37 +1,37 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import static codechicken.nei.NEIClientUtils.translate;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.potion.Potion;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.core.gui.GuiCCButton;
|
||||
import codechicken.core.gui.GuiCCTextField;
|
||||
import codechicken.core.gui.GuiScrollSlot;
|
||||
import codechicken.core.inventory.GuiContainerWidget;
|
||||
import codechicken.lib.render.CCRenderState;
|
||||
import codechicken.lib.render.FontUtils;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.potion.Potion;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.util.StatCollector;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.util.ArrayList;
|
||||
public class GuiPotionCreator extends GuiContainerWidget {
|
||||
|
||||
import static codechicken.nei.NEIClientUtils.translate;
|
||||
public class GuiSlotPotionEffects extends GuiScrollSlot {
|
||||
|
||||
public class GuiPotionCreator extends GuiContainerWidget
|
||||
{
|
||||
public class GuiSlotPotionEffects extends GuiScrollSlot
|
||||
{
|
||||
public int selectedslot = -1;
|
||||
public boolean enabled = true;
|
||||
private final ArrayList<Potion> validPotions = new ArrayList<>();
|
||||
|
||||
public GuiSlotPotionEffects(int x, int y) {
|
||||
super(x, y, 108, 76);
|
||||
for (Potion p : Potion.potionTypes)
|
||||
if (p != null)
|
||||
validPotions.add(p);
|
||||
for (Potion p : Potion.potionTypes) if (p != null) validPotions.add(p);
|
||||
setSmoothScroll(false);
|
||||
setMargins(0, 0, 0, 0);
|
||||
}
|
||||
@@ -48,8 +48,7 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawOverlay(float frame) {
|
||||
}
|
||||
public void drawOverlay(float frame) {}
|
||||
|
||||
@Override
|
||||
public int scrollbarGuideAlignment() {
|
||||
@@ -69,13 +68,18 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
Potion potion = validPotions.get(slot);
|
||||
PotionEffect effect = getEffect(potion.id);
|
||||
boolean blank = effect == null;
|
||||
if (effect == null)
|
||||
effect = new PotionEffect(potion.id, 1200, 0);
|
||||
if (effect == null) effect = new PotionEffect(potion.id, 1200, 0);
|
||||
int shade = selectedslot == slot ? 2 : blank ? 1 : 0;
|
||||
|
||||
CCRenderState.changeTexture("textures/gui/container/enchanting_table.png");
|
||||
drawTexturedModalRect(x, y, 0, 166 + getSlotHeight(slot) * shade, width - 30, getSlotHeight(slot));
|
||||
drawTexturedModalRect(x + width - 30, y, width - 23, 166 + getSlotHeight(slot) * shade, 30, getSlotHeight(slot));
|
||||
drawTexturedModalRect(
|
||||
x + width - 30,
|
||||
y,
|
||||
width - 23,
|
||||
166 + getSlotHeight(slot) * shade,
|
||||
30,
|
||||
getSlotHeight(slot));
|
||||
|
||||
if (potion.hasStatusIcon()) {
|
||||
CCRenderState.changeTexture("textures/gui/container/inventory.png");
|
||||
@@ -104,8 +108,7 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
NBTTagList potionTagList = potion.getTagCompound().getTagList("CustomPotionEffects", 10);
|
||||
for (int i = 0; i < potionTagList.tagCount(); i++) {
|
||||
PotionEffect effect = PotionEffect.readCustomPotionEffectFromNBT(potionTagList.getCompoundTagAt(i));
|
||||
if (effect.getPotionID() == id)
|
||||
return effect;
|
||||
if (effect.getPotionID() == id) return effect;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -118,8 +121,7 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
|
||||
@Override
|
||||
protected void slotClicked(int slot, int button, int mx, int my, int count) {
|
||||
if (!enabled)
|
||||
return;
|
||||
if (!enabled) return;
|
||||
|
||||
if (button == 0) {
|
||||
select(slot);
|
||||
@@ -145,19 +147,16 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
}
|
||||
|
||||
public void setEnabled(boolean b) {
|
||||
if (b == enabled)
|
||||
return;
|
||||
if (b == enabled) return;
|
||||
enabled = b;
|
||||
if (!enabled)
|
||||
deselect();
|
||||
if (!enabled) deselect();
|
||||
}
|
||||
|
||||
private void select(int slot) {
|
||||
selectedslot = slot;
|
||||
durationField.setEnabled(true);
|
||||
PotionEffect effect = getEffect(validPotions.get(slot).id);
|
||||
if (effect == null)
|
||||
effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
|
||||
if (effect == null) effect = new PotionEffect(validPotions.get(slot).id, 1200, 0);
|
||||
durationField.setDurationTicks(effect.getDuration());
|
||||
amplifier = effect.getAmplifier();
|
||||
validateInputButtons();
|
||||
@@ -175,8 +174,8 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
}
|
||||
}
|
||||
|
||||
public class GuiDurationField extends GuiCCTextField
|
||||
{
|
||||
public class GuiDurationField extends GuiCCTextField {
|
||||
|
||||
private String baseValue;
|
||||
|
||||
public GuiDurationField(int x, int y, int width, int height) {
|
||||
@@ -190,27 +189,22 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
i /= 20;
|
||||
String minutes = Integer.toString(i / 60);
|
||||
String seconds = Integer.toString(i % 60);
|
||||
if (seconds.length() == 1)
|
||||
seconds = '0' + seconds;
|
||||
if (seconds.length() == 1) seconds = '0' + seconds;
|
||||
setText(minutes + seconds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean b) {
|
||||
super.setEnabled(b);
|
||||
if (!isEnabled())
|
||||
setText("100");
|
||||
if (!isEnabled()) setText("100");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFocusChanged() {
|
||||
if (isFocused())
|
||||
baseValue = getText();
|
||||
if (isFocused()) baseValue = getText();
|
||||
else {
|
||||
if (!validateValue())
|
||||
setText(baseValue);
|
||||
else
|
||||
applyEffect();
|
||||
if (!validateValue()) setText(baseValue);
|
||||
else applyEffect();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -231,7 +225,8 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
@Override
|
||||
public void drawText() {
|
||||
String s = getText();
|
||||
String seconds = s.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
|
||||
String seconds = s
|
||||
.substring(Math.max(0, s.length() - 2), Math.max(0, s.length() - 2) + Math.min(s.length(), 2));
|
||||
String minutes = s.length() < 3 ? "" : s.substring(0, s.length() - 2);
|
||||
int ty = y + height / 2 - 4;
|
||||
int tcolour = getTextColour();
|
||||
@@ -316,10 +311,8 @@ public class GuiPotionCreator extends GuiContainerWidget
|
||||
|
||||
@Override
|
||||
public void actionPerformed(String ident, Object... params) {
|
||||
if (ident.equals("ampDown"))
|
||||
amplifier--;
|
||||
else if (ident.equals("ampUp"))
|
||||
amplifier++;
|
||||
if (ident.equals("ampDown")) amplifier--;
|
||||
else if (ident.equals("ampUp")) amplifier++;
|
||||
applyEffect();
|
||||
validateInputButtons();
|
||||
}
|
||||
+35
-43
@@ -1,29 +1,31 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.config.ConfigTag;
|
||||
import codechicken.nei.KeyManager.IKeyStateTracker;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
|
||||
import net.minecraft.world.World;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL12;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Point;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.displaySize;
|
||||
import static codechicken.lib.gui.GuiDraw.drawString;
|
||||
import static codechicken.lib.gui.GuiDraw.drawTooltipBox;
|
||||
import static codechicken.lib.gui.GuiDraw.getStringWidth;
|
||||
|
||||
public class HUDRenderer implements IKeyStateTracker
|
||||
{
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Point;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.GL12;
|
||||
|
||||
import codechicken.lib.config.ConfigTag;
|
||||
import codechicken.nei.KeyManager.IKeyStateTracker;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.recipe.StackInfo;
|
||||
|
||||
public class HUDRenderer implements IKeyStateTracker {
|
||||
|
||||
@Override
|
||||
public void tickKeyStates() {
|
||||
if (KeyManager.keyStates.get("world.highlight_tips").down) {
|
||||
@@ -34,37 +36,28 @@ public class HUDRenderer implements IKeyStateTracker
|
||||
|
||||
public static void renderOverlay() {
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
if (mc.currentScreen == null &&
|
||||
mc.theWorld != null &&
|
||||
!mc.gameSettings.keyBindPlayerList.getIsKeyPressed() &&
|
||||
NEIClientConfig.getBooleanSetting("world.highlight_tips") &&
|
||||
mc.objectMouseOver != null &&
|
||||
mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
|
||||
if (mc.currentScreen == null && mc.theWorld != null
|
||||
&& !mc.gameSettings.keyBindPlayerList.getIsKeyPressed()
|
||||
&& NEIClientConfig.getBooleanSetting("world.highlight_tips")
|
||||
&& mc.objectMouseOver != null
|
||||
&& mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) {
|
||||
World world = mc.theWorld;
|
||||
ArrayList<ItemStack> items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver);
|
||||
if (items.isEmpty())
|
||||
return;
|
||||
ItemStack[] items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver)
|
||||
.toArray(new ItemStack[0]);
|
||||
|
||||
int minDamage = Integer.MAX_VALUE;
|
||||
ItemStack stack = null;
|
||||
for(ItemStack astack : items) {
|
||||
if(astack.getItem() != null && astack.getItemDamage() < minDamage) {
|
||||
stack = astack;
|
||||
minDamage = stack.getItemDamage();
|
||||
}
|
||||
}
|
||||
if (items.length == 0) return;
|
||||
|
||||
ItemStack stack = StackInfo.getItemStackWithMinimumDamage(items);
|
||||
|
||||
renderOverlay(stack, ItemInfo.getText(stack, world, mc.thePlayer, mc.objectMouseOver), getPositioning());
|
||||
}
|
||||
}
|
||||
|
||||
public static void renderOverlay(ItemStack stack, List<String> textData, Point pos) {
|
||||
if((stack == null || stack.getItem() == null) && textData.isEmpty())
|
||||
return;
|
||||
if ((stack == null || stack.getItem() == null) && textData.isEmpty()) return;
|
||||
|
||||
int w = 0;
|
||||
for (String s : textData)
|
||||
w = Math.max(w, getStringWidth(s) + 29);
|
||||
for (String s : textData) w = Math.max(w, getStringWidth(s) + 29);
|
||||
int h = Math.max(24, 10 + 10 * textData.size());
|
||||
|
||||
Dimension size = displaySize();
|
||||
@@ -85,8 +78,7 @@ public class HUDRenderer implements IKeyStateTracker
|
||||
RenderHelper.enableGUIStandardItemLighting();
|
||||
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
|
||||
|
||||
if (stack != null && stack.getItem() != null)
|
||||
GuiContainerManager.drawItem(x + 5, y + h / 2 - 8, stack);
|
||||
if (stack != null && stack.getItem() != null) GuiContainerManager.drawItem(x + 5, y + h / 2 - 8, stack);
|
||||
}
|
||||
|
||||
private static Point getPositioning() {
|
||||
@@ -98,4 +90,4 @@ public class HUDRenderer implements IKeyStateTracker
|
||||
public static void load() {
|
||||
KeyManager.trackers.add(new HUDRenderer());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public class Image
|
||||
{
|
||||
public class Image {
|
||||
|
||||
public int x;
|
||||
public int y;
|
||||
public int width;
|
||||
public int height;
|
||||
|
||||
public Image(int x, int y, int w, int h)
|
||||
{
|
||||
public Image(int x, int y, int w, int h) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
width = w;
|
||||
+16
-24
@@ -1,55 +1,47 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class InfiniteStackSizeHandler implements IInfiniteItemHandler
|
||||
{
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
|
||||
public class InfiniteStackSizeHandler implements IInfiniteItemHandler {
|
||||
|
||||
@Override
|
||||
public void onPickup(ItemStack heldItem)
|
||||
{
|
||||
public void onPickup(ItemStack heldItem) {
|
||||
heldItem.stackSize = 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlaceInfinite(ItemStack heldItem)
|
||||
{
|
||||
public void onPlaceInfinite(ItemStack heldItem) {
|
||||
heldItem.stackSize = 111;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canHandleItem(ItemStack stack)
|
||||
{
|
||||
public boolean canHandleItem(ItemStack stack) {
|
||||
return !stack.isItemStackDamageable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemInfinite(ItemStack stack)
|
||||
{
|
||||
public boolean isItemInfinite(ItemStack stack) {
|
||||
return stack.stackSize == -1 || stack.stackSize > 100;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replenishInfiniteStack(InventoryPlayer inv, int slotNo)
|
||||
{
|
||||
public void replenishInfiniteStack(InventoryPlayer inv, int slotNo) {
|
||||
ItemStack stack = inv.getStackInSlot(slotNo);
|
||||
stack.stackSize = 111;
|
||||
|
||||
for(int i = 0; i < inv.getSizeInventory(); i++)
|
||||
{
|
||||
if(i == slotNo)
|
||||
continue;
|
||||
|
||||
if(NEIServerUtils.areStacksSameType(stack, inv.getStackInSlot(i)))
|
||||
inv.setInventorySlotContents(i, null);
|
||||
|
||||
for (int i = 0; i < inv.getSizeInventory(); i++) {
|
||||
if (i == slotNo) continue;
|
||||
|
||||
if (NEIServerUtils.areStacksSameType(stack, inv.getStackInSlot(i))) inv.setInventorySlotContents(i, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getInfiniteItem(ItemStack typeStack)
|
||||
{
|
||||
public ItemStack getInfiniteItem(ItemStack typeStack) {
|
||||
return InventoryUtils.copyStack(typeStack, -1);
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -1,11 +1,12 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class InfiniteToolHandler implements IInfiniteItemHandler
|
||||
{
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
|
||||
public class InfiniteToolHandler implements IInfiniteItemHandler {
|
||||
|
||||
@Override
|
||||
public void onPickup(ItemStack heldItem) {
|
||||
heldItem.setItemDamage(0);
|
||||
+6
-8
@@ -4,15 +4,13 @@ import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.InventoryCrafting;
|
||||
|
||||
public class InventoryCraftingDummy extends InventoryCrafting
|
||||
{
|
||||
public InventoryCraftingDummy()
|
||||
{
|
||||
super(new Container()
|
||||
{
|
||||
public class InventoryCraftingDummy extends InventoryCrafting {
|
||||
|
||||
public InventoryCraftingDummy() {
|
||||
super(new Container() {
|
||||
|
||||
@Override
|
||||
public boolean canInteractWith(EntityPlayer entityplayer)
|
||||
{
|
||||
public boolean canInteractWith(EntityPlayer entityplayer) {
|
||||
return true;
|
||||
}
|
||||
}, 3, 3);
|
||||
@@ -1,16 +1,5 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.ThreadOperationTimer.TimeoutException;
|
||||
import codechicken.nei.api.ItemFilter;
|
||||
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.ListMultimap;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
@@ -18,13 +7,27 @@ import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.ListMultimap;
|
||||
|
||||
import codechicken.nei.ThreadOperationTimer.TimeoutException;
|
||||
import codechicken.nei.api.ItemFilter;
|
||||
import codechicken.nei.api.ItemFilter.ItemFilterProvider;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
|
||||
public class ItemList {
|
||||
|
||||
public class ItemList
|
||||
{
|
||||
/**
|
||||
* Fields are replaced atomically and contents never modified.
|
||||
*/
|
||||
public static volatile List<ItemStack> items = new ArrayList<>();
|
||||
public static volatile List<ItemStack> items = new ArrayList<>();
|
||||
/**
|
||||
* Fields are replaced atomically and contents never modified.
|
||||
*/
|
||||
@@ -33,29 +36,34 @@ public class ItemList
|
||||
* Updates to this should be synchronised on this
|
||||
*/
|
||||
public static final List<ItemFilterProvider> itemFilterers = new LinkedList<>();
|
||||
|
||||
public static final List<ItemsLoadedCallback> loadCallbacks = new LinkedList<>();
|
||||
|
||||
private static final HashSet<Item> erroredItems = new HashSet<>();
|
||||
private static final HashSet<String> stackTraces = new HashSet<>();
|
||||
/**
|
||||
* Unlike {@link LayoutManager#itemsLoaded}, this indicates whether item loading is actually finished or not.
|
||||
*/
|
||||
public static boolean loadFinished;
|
||||
|
||||
public static class EverythingItemFilter implements ItemFilter {
|
||||
|
||||
public static class EverythingItemFilter implements ItemFilter
|
||||
{
|
||||
@Override
|
||||
public boolean matches(ItemStack item) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class NothingItemFilter implements ItemFilter
|
||||
{
|
||||
public static class NothingItemFilter implements ItemFilter {
|
||||
|
||||
@Override
|
||||
public boolean matches(ItemStack item) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static class PatternItemFilter implements ItemFilter
|
||||
{
|
||||
public static class PatternItemFilter implements ItemFilter {
|
||||
|
||||
public Pattern pattern;
|
||||
|
||||
public PatternItemFilter(Pattern pattern) {
|
||||
@@ -68,8 +76,8 @@ public class ItemList
|
||||
}
|
||||
}
|
||||
|
||||
public static class AllMultiItemFilter implements ItemFilter
|
||||
{
|
||||
public static class AllMultiItemFilter implements ItemFilter {
|
||||
|
||||
public List<ItemFilter> filters;
|
||||
|
||||
public AllMultiItemFilter(List<ItemFilter> filters) {
|
||||
@@ -82,19 +90,18 @@ public class ItemList
|
||||
|
||||
@Override
|
||||
public boolean matches(ItemStack item) {
|
||||
for(ItemFilter filter : filters)
|
||||
try {
|
||||
if (!filter.matches(item)) return false;
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
|
||||
}
|
||||
for (ItemFilter filter : filters) try {
|
||||
if (!filter.matches(item)) return false;
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.error("Exception filtering " + item + " with " + filter, e);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class AnyMultiItemFilter implements ItemFilter
|
||||
{
|
||||
public static class AnyMultiItemFilter implements ItemFilter {
|
||||
|
||||
public List<ItemFilter> filters;
|
||||
|
||||
public AnyMultiItemFilter(List<ItemFilter> filters) {
|
||||
@@ -107,29 +114,27 @@ public class ItemList
|
||||
|
||||
@Override
|
||||
public boolean matches(ItemStack item) {
|
||||
for(ItemFilter filter : filters)
|
||||
try {
|
||||
if (filter.matches(item)) return true;
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
|
||||
}
|
||||
for (ItemFilter filter : filters) try {
|
||||
if (filter.matches(item)) return true;
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.error("Exception filtering " + item + " with " + filter, e);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static interface ItemsLoadedCallback
|
||||
{
|
||||
public static interface ItemsLoadedCallback {
|
||||
|
||||
public void itemsLoaded();
|
||||
}
|
||||
|
||||
public static boolean itemMatchesAll(ItemStack item, List<ItemFilter> filters) {
|
||||
for(ItemFilter filter : filters) {
|
||||
for (ItemFilter filter : filters) {
|
||||
try {
|
||||
if (!filter.matches(item))
|
||||
return false;
|
||||
if (!filter.matches(item)) return false;
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.error("Exception filtering "+item+" with "+filter, e);
|
||||
NEIClientConfig.logger.error("Exception filtering " + item + " with " + filter, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,7 +142,7 @@ public class ItemList
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getItemListFilter().matches(item)
|
||||
* @deprecated use getItemListFilter().matches(item)
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean itemMatches(ItemStack item) {
|
||||
@@ -151,50 +156,51 @@ public class ItemList
|
||||
public static List<ItemFilter> getItemFilters() {
|
||||
LinkedList<ItemFilter> filters = new LinkedList<>();
|
||||
synchronized (itemFilterers) {
|
||||
for(ItemFilterProvider p : itemFilterers)
|
||||
filters.add(p.getFilter());
|
||||
for (ItemFilterProvider p : itemFilterers) filters.add(p.getFilter());
|
||||
}
|
||||
return filters;
|
||||
}
|
||||
|
||||
public static final RestartableTask loadItems = new RestartableTask("NEI Item Loading")
|
||||
{
|
||||
public static final RestartableTask loadItems = new RestartableTask("NEI Item Loading") {
|
||||
|
||||
private void damageSearch(Item item, List<ItemStack> permutations) {
|
||||
HashSet<String> damageIconSet = new HashSet<>();
|
||||
for (int damage = 0; damage < 16; damage++)
|
||||
try {
|
||||
ItemStack itemstack = new ItemStack(item, 1, damage);
|
||||
IIcon icon = item.getIconIndex(itemstack);
|
||||
String name = GuiContainerManager.concatenatedDisplayName(itemstack, false);
|
||||
String s = name + "@" + (icon == null ? 0 : icon.hashCode());
|
||||
if (!damageIconSet.contains(s)) {
|
||||
damageIconSet.add(s);
|
||||
permutations.add(itemstack);
|
||||
}
|
||||
}
|
||||
catch(TimeoutException t) {
|
||||
throw t;
|
||||
}
|
||||
catch(Throwable t) {
|
||||
NEIServerUtils.logOnce(t, stackTraces, "Ommiting "+item+":"+damage+" "+item.getClass().getSimpleName(), item.toString());
|
||||
for (int damage = 0; damage < 16; damage++) try {
|
||||
ItemStack itemstack = new ItemStack(item, 1, damage);
|
||||
IIcon icon = item.getIconIndex(itemstack);
|
||||
String name = GuiContainerManager.concatenatedDisplayName(itemstack, false);
|
||||
String s = name + "@" + (icon == null ? 0 : icon.hashCode());
|
||||
if (!damageIconSet.contains(s)) {
|
||||
damageIconSet.add(s);
|
||||
permutations.add(itemstack);
|
||||
}
|
||||
} catch (TimeoutException t) {
|
||||
throw t;
|
||||
} catch (Throwable t) {
|
||||
NEIServerUtils.logOnce(
|
||||
t,
|
||||
stackTraces,
|
||||
"Ommiting " + item + ":" + damage + " " + item.getClass().getSimpleName(),
|
||||
item.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void execute() {
|
||||
// System.out.println("Executing NEI Item Loading");
|
||||
ThreadOperationTimer timer = getTimer(500);
|
||||
ThreadOperationTimer timer = getTimer(NEIClientConfig.getItemLoadingTimeout());
|
||||
loadFinished = false;
|
||||
|
||||
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;
|
||||
|
||||
if (item == null || erroredItems.contains(item))
|
||||
continue;
|
||||
if (item == null || erroredItems.contains(item)) continue;
|
||||
|
||||
try {
|
||||
timer.reset(item);
|
||||
@@ -202,11 +208,9 @@ public class ItemList
|
||||
permutations.clear();
|
||||
permutations.addAll(ItemInfo.itemOverrides.get(item));
|
||||
|
||||
if (permutations.isEmpty())
|
||||
item.getSubItems(item, null, permutations);
|
||||
if (permutations.isEmpty()) item.getSubItems(item, null, permutations);
|
||||
|
||||
if (permutations.isEmpty())
|
||||
damageSearch(item, permutations);
|
||||
if (permutations.isEmpty()) damageSearch(item, permutations);
|
||||
|
||||
permutations.addAll(ItemInfo.itemVariants.get(item));
|
||||
|
||||
@@ -220,19 +224,19 @@ public class ItemList
|
||||
}
|
||||
}
|
||||
|
||||
if(interrupted()) return;
|
||||
if (interrupted()) return;
|
||||
ItemList.items = items;
|
||||
ItemList.itemMap = itemMap;
|
||||
for(ItemsLoadedCallback callback : loadCallbacks)
|
||||
callback.itemsLoaded();
|
||||
for (ItemsLoadedCallback callback : loadCallbacks) callback.itemsLoaded();
|
||||
|
||||
updateFilter.restart();
|
||||
|
||||
loadFinished = true;
|
||||
}
|
||||
};
|
||||
|
||||
public static ForkJoinPool getPool(int poolSize) {
|
||||
if(poolSize < 1)
|
||||
poolSize = 1;
|
||||
if (poolSize < 1) poolSize = 1;
|
||||
|
||||
return new ForkJoinPool(poolSize);
|
||||
}
|
||||
@@ -240,32 +244,28 @@ public class ItemList
|
||||
public static final int numProcessors = Runtime.getRuntime().availableProcessors();
|
||||
public static ForkJoinPool forkJoinPool = getPool(numProcessors * 2 / 3);
|
||||
|
||||
public static final RestartableTask updateFilter = new RestartableTask("NEI Item Filtering")
|
||||
{
|
||||
public static final RestartableTask updateFilter = new RestartableTask("NEI Item Filtering") {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
// System.out.println("Executing NEI Item Filtering");
|
||||
ArrayList<ItemStack> filtered = new ArrayList<>();
|
||||
ArrayList<ItemStack> filtered;
|
||||
ItemFilter filter = getItemListFilter();
|
||||
|
||||
try {
|
||||
ItemList.forkJoinPool.submit(() -> items.parallelStream().forEach(item -> {
|
||||
if (interrupted()) return;
|
||||
|
||||
if(filter.matches(item)) {
|
||||
synchronized (filtered){
|
||||
filtered.add(item);
|
||||
}
|
||||
}
|
||||
})).get();
|
||||
filtered = ItemList.forkJoinPool.submit(
|
||||
() -> items.parallelStream().filter(PresetsWidget::matches).filter(filter::matches)
|
||||
.collect(Collectors.toCollection(ArrayList::new)))
|
||||
.get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
filtered = new ArrayList<>();
|
||||
e.printStackTrace();
|
||||
stop();
|
||||
}
|
||||
|
||||
if(interrupted()) return;
|
||||
if (interrupted()) return;
|
||||
ItemSorter.sort(filtered);
|
||||
if(interrupted()) return;
|
||||
if (interrupted()) return;
|
||||
ItemPanel.updateItemList(filtered);
|
||||
}
|
||||
};
|
||||
+29
-29
@@ -1,5 +1,9 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityList;
|
||||
@@ -16,12 +20,8 @@ import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.MinecraftForgeClient;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
public class ItemMobSpawner extends ItemBlock {
|
||||
|
||||
public class ItemMobSpawner extends ItemBlock
|
||||
{
|
||||
private static Map<Integer, EntityLiving> entityHashMap;
|
||||
private static Map<Integer, String> IDtoNameMap;
|
||||
public static int idPig;
|
||||
@@ -41,6 +41,7 @@ public class ItemMobSpawner extends ItemBlock
|
||||
* These are ASM translated from BlockMobSpawner
|
||||
*/
|
||||
public static int placedX;
|
||||
|
||||
public static int placedY;
|
||||
public static int placedZ;
|
||||
|
||||
@@ -49,9 +50,11 @@ public class ItemMobSpawner extends ItemBlock
|
||||
return Blocks.mob_spawner.getBlockTextureFromSide(0);
|
||||
}
|
||||
|
||||
public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int par7, float par8, float par9, float par10) {
|
||||
public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int par7,
|
||||
float par8, float par9, float par10) {
|
||||
if (super.onItemUse(itemstack, entityplayer, world, x, y, z, par7, par8, par9, par10) && world.isRemote) {
|
||||
TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) world.getTileEntity(placedX, placedY, placedZ);
|
||||
TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) world
|
||||
.getTileEntity(placedX, placedY, placedZ);
|
||||
if (tileentitymobspawner != null) {
|
||||
setDefaultTag(itemstack);
|
||||
String mobtype = IDtoNameMap.get(itemstack.getItemDamage());
|
||||
@@ -83,12 +86,11 @@ public class ItemMobSpawner extends ItemBlock
|
||||
loadSpawners(world);
|
||||
Class<?> clazz = (Class<?>) EntityList.IDtoClassMapping.get(ID);
|
||||
try {
|
||||
e = (EntityLiving) clazz.getConstructor(new Class[]{World.class}).newInstance(world);
|
||||
e = (EntityLiving) clazz.getConstructor(new Class[] { World.class }).newInstance(world);
|
||||
} catch (Throwable t) {
|
||||
if(clazz == null)
|
||||
NEIClientConfig.logger.error("Null class for entity ("+ID+", "+IDtoNameMap.get(ID));
|
||||
else
|
||||
NEIClientConfig.logger.error("Error creating instance of entity: " + clazz.getName(), t);
|
||||
if (clazz == null)
|
||||
NEIClientConfig.logger.error("Null class for entity (" + ID + ", " + IDtoNameMap.get(ID));
|
||||
else NEIClientConfig.logger.error("Error creating instance of entity: " + clazz.getName(), t);
|
||||
e = getEntity(idPig);
|
||||
}
|
||||
entityHashMap.put(ID, e);
|
||||
@@ -96,9 +98,12 @@ public class ItemMobSpawner extends ItemBlock
|
||||
return e;
|
||||
}
|
||||
|
||||
public static void clearEntityReferences(World newWorld) {
|
||||
entityHashMap.values().removeIf(e -> e.worldObj != newWorld);
|
||||
}
|
||||
|
||||
private void setDefaultTag(ItemStack itemstack) {
|
||||
if (!IDtoNameMap.containsKey(itemstack.getItemDamage()))
|
||||
itemstack.setItemDamage(idPig);
|
||||
if (!IDtoNameMap.containsKey(itemstack.getItemDamage())) itemstack.setItemDamage(idPig);
|
||||
}
|
||||
|
||||
public static void loadSpawners(World world) {
|
||||
@@ -107,35 +112,30 @@ public class ItemMobSpawner extends ItemBlock
|
||||
HashMap<Class<Entity>, String> classToStringMapping = (HashMap<Class<Entity>, String>) EntityList.classToStringMapping;
|
||||
HashMap<Class<Entity>, Integer> classToIDMapping = (HashMap<Class<Entity>, Integer>) EntityList.classToIDMapping;
|
||||
for (Class<Entity> eclass : classToStringMapping.keySet()) {
|
||||
if (!EntityLiving.class.isAssignableFrom(eclass))
|
||||
continue;
|
||||
if (!EntityLiving.class.isAssignableFrom(eclass)) continue;
|
||||
try {
|
||||
EntityLiving entityliving = (EntityLiving) eclass.getConstructor(new Class[]{World.class}).newInstance(world);
|
||||
EntityLiving entityliving = (EntityLiving) eclass.getConstructor(new Class[] { World.class })
|
||||
.newInstance(world);
|
||||
entityliving.isChild();
|
||||
|
||||
int id = classToIDMapping.get(eclass);
|
||||
String name = classToStringMapping.get(eclass);
|
||||
|
||||
if (name.equals("EnderDragon"))
|
||||
continue;
|
||||
if (name.equals("EnderDragon")) continue;
|
||||
|
||||
IDtoNameMap.put(id, name);
|
||||
|
||||
if (name.equals("Pig"))
|
||||
idPig = id;
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
if (name.equals("Pig")) idPig = id;
|
||||
} catch (Throwable ignored) {}
|
||||
}
|
||||
|
||||
IDtoNameMap.entrySet().removeIf(e -> getEntity(e.getKey()).getClass() == EntityPig.class && !e.getValue().equals("Pig"));
|
||||
IDtoNameMap.entrySet()
|
||||
.removeIf(e -> getEntity(e.getKey()).getClass() == EntityPig.class && !e.getValue().equals("Pig"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getSubItems(Item item, CreativeTabs tab, List list) {
|
||||
if(!NEIClientConfig.hasSMPCounterPart())
|
||||
list.add(new ItemStack(item));
|
||||
else
|
||||
for(int i : IDtoNameMap.keySet())
|
||||
list.add(new ItemStack(item, 1, i));
|
||||
if (!NEIClientConfig.hasSMPCounterPart()) list.add(new ItemStack(item));
|
||||
else for (int i : IDtoNameMap.keySet()) list.add(new ItemStack(item, 1, i));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.drawRect;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
|
||||
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;
|
||||
onGridChanged();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessageOnEmpty() {
|
||||
return ItemList.loadFinished ? null : NEIClientUtils.translate("itempanel.loading");
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
if (!NEIClientConfig.showItemQuantityWidget() && NEIClientConfig.isSearchWidgetCentered()) return 0;
|
||||
|
||||
final int BUTTON_SIZE = 20;
|
||||
more.w = less.w = BUTTON_SIZE;
|
||||
quantity.h = BUTTON_SIZE;
|
||||
|
||||
if (NEIClientConfig.isSearchWidgetCentered()) {
|
||||
more.h = less.h = BUTTON_SIZE;
|
||||
more.x = x + w - BUTTON_SIZE;
|
||||
more.y = less.y = quantity.y = y + h - BUTTON_SIZE;
|
||||
less.x = x;
|
||||
quantity.x = x + BUTTON_SIZE + 2;
|
||||
quantity.w = more.x - quantity.x - 2;
|
||||
} else {
|
||||
quantity.x = (int) (x + (w * 0.7)) + 3;
|
||||
quantity.y = y + h - BUTTON_SIZE;
|
||||
quantity.w = (int) ((w * 0.3) - BUTTON_SIZE - 1);
|
||||
|
||||
more.h = less.h = BUTTON_SIZE / 2;
|
||||
more.y = y + h - (more.h * 2);
|
||||
|
||||
less.x = more.x = quantity.x + quantity.w;
|
||||
less.y = more.y + more.h;
|
||||
}
|
||||
|
||||
return BUTTON_SIZE + 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible() {
|
||||
super.setVisible();
|
||||
|
||||
if (grid.getPerPage() > 0 && NEIClientConfig.showItemQuantityWidget()) {
|
||||
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.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0;
|
||||
|
||||
if (amount == 0) {
|
||||
amount = stack.getMaxStackSize();
|
||||
}
|
||||
|
||||
return NEIServerUtils.copyStack(stack, amount);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public class ItemPanels {
|
||||
|
||||
public static final ItemPanel itemPanel = new ItemPanel();
|
||||
public static final BookmarkPanel bookmarkPanel = new BookmarkPanel();
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import static codechicken.nei.NEIClientUtils.translate;
|
||||
|
||||
public class ItemQuantityField extends TextField {
|
||||
|
||||
public ItemQuantityField(String ident) {
|
||||
super(ident);
|
||||
centered = true;
|
||||
field.setDisabledTextColour(0xFF303030);
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return intValue(text());
|
||||
}
|
||||
|
||||
public int intValue(String s) {
|
||||
try {
|
||||
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()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChange(String oldText) {
|
||||
NEIClientUtils.setItemQuantity(intValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(int mousex, int mousey) {
|
||||
|
||||
if (!focused() && intValue() == 0) {
|
||||
field.setText(translate("itempanel.quantity.default"));
|
||||
field.setEnabled(false);
|
||||
super.draw(mousex, mousey);
|
||||
field.setEnabled(true);
|
||||
field.setText("0");
|
||||
} else {
|
||||
super.draw(mousex, mousey);
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
-38
@@ -1,24 +1,25 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import codechicken.lib.config.ConfigTagParent;
|
||||
import codechicken.nei.ItemList.ItemsLoadedCallback;
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.config.GuiItemSorter;
|
||||
import codechicken.nei.config.OptionOpenGui;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback {
|
||||
|
||||
public static class SortEntry {
|
||||
|
||||
public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
{
|
||||
public static class SortEntry
|
||||
{
|
||||
public final String name;
|
||||
public final Comparator<ItemStack> comparator;
|
||||
|
||||
@@ -32,7 +33,7 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
}
|
||||
|
||||
public String getTooltip() {
|
||||
String tipname = name+".tip";
|
||||
String tipname = name + ".tip";
|
||||
String tip = StatCollector.translateToLocal(tipname);
|
||||
return !tip.equals(tipname) ? tip : null;
|
||||
}
|
||||
@@ -42,12 +43,13 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
public static ArrayList<SortEntry> list = new ArrayList<>();
|
||||
public static final ItemSorter instance = new ItemSorter();
|
||||
|
||||
//optimisations
|
||||
// optimisations
|
||||
public HashMap<ItemStack, Integer> ordering = null;
|
||||
|
||||
public static void sort(ArrayList<ItemStack> items) {
|
||||
try {
|
||||
// items = (ArrayList<ItemStack>) items.parallelStream().sorted(instance).collect(Collectors.toList());
|
||||
// items = (ArrayList<ItemStack>)
|
||||
// items.parallelStream().sorted(instance).collect(Collectors.toList());
|
||||
items.sort(instance);
|
||||
} catch (Exception e) {
|
||||
NEIClientConfig.logger.error("Exception sorting item list", e);
|
||||
@@ -56,9 +58,9 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
|
||||
@Override
|
||||
public int compare(ItemStack o1, ItemStack o2) {
|
||||
for(SortEntry e : list) {
|
||||
for (SortEntry e : list) {
|
||||
int c = e.comparator.compare(o1, o2);
|
||||
if(c != 0) return c;
|
||||
if (c != 0) return c;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -67,15 +69,12 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
public void itemsLoaded() {
|
||||
HashMap<ItemStack, Integer> newMap = new HashMap<>();
|
||||
int i = 0;
|
||||
for(ItemStack stack : ItemList.items)
|
||||
newMap.put(stack, i++);
|
||||
for (ItemStack stack : ItemList.items) newMap.put(stack, i++);
|
||||
ordering = newMap;
|
||||
}
|
||||
|
||||
public static SortEntry find(String name) {
|
||||
for(SortEntry e : entries)
|
||||
if(e.name.equals(name))
|
||||
return e;
|
||||
for (SortEntry e : entries) if (e.name.equals(name)) return e;
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -89,11 +88,11 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
entries.add(e);
|
||||
ArrayList<SortEntry> nlist = new ArrayList<>(list);
|
||||
nlist.add(e);
|
||||
list = nlist;//concurrency
|
||||
list = nlist; // concurrency
|
||||
}
|
||||
|
||||
public static void initConfig(ConfigTagParent tag) {
|
||||
//minecraft, mod, id, default, meta, name
|
||||
// minecraft, mod, id, default, meta, name
|
||||
API.addSortOption("nei.itemsort.minecraft", (o1, o2) -> {
|
||||
boolean m1 = "minecraft".equals(ItemInfo.itemOwners.get(o1.getItem()));
|
||||
boolean m2 = "minecraft".equals(ItemInfo.itemOwners.get(o2.getItem()));
|
||||
@@ -102,8 +101,8 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
API.addSortOption("nei.itemsort.mod", (o1, o2) -> {
|
||||
String mod1 = ItemInfo.itemOwners.get(o1.getItem());
|
||||
String mod2 = ItemInfo.itemOwners.get(o2.getItem());
|
||||
if(mod1 == null) return mod2 == null ? 0 : 1;
|
||||
if(mod2 == null) return -1;
|
||||
if (mod1 == null) return mod2 == null ? 0 : 1;
|
||||
if (mod2 == null) return -1;
|
||||
return mod1.compareTo(mod2);
|
||||
});
|
||||
API.addSortOption("nei.itemsort.id", (o1, o2) -> {
|
||||
@@ -114,8 +113,8 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
API.addSortOption("nei.itemsort.default", (o1, o2) -> {
|
||||
Integer order1 = instance.ordering.get(o1);
|
||||
Integer order2 = instance.ordering.get(o2);
|
||||
if(order1 == null) return order2 == null ? 0 : 1;
|
||||
if(order2 == null) return -1;
|
||||
if (order1 == null) return order2 == null ? 0 : 1;
|
||||
if (order2 == null) return -1;
|
||||
return compareInt(order1, order2);
|
||||
});
|
||||
API.addSortOption("nei.itemsort.damage", (o1, o2) -> {
|
||||
@@ -130,6 +129,7 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
});
|
||||
tag.getTag("inventory.itemsort").setDefaultValue(getSaveString(list));
|
||||
API.addOption(new OptionOpenGui("inventory.itemsort", GuiItemSorter.class) {
|
||||
|
||||
@Override
|
||||
public void useGlobals() {
|
||||
super.useGlobals();
|
||||
@@ -141,27 +141,22 @@ public class ItemSorter implements Comparator<ItemStack>, ItemsLoadedCallback
|
||||
|
||||
public static String getSaveString(List<SortEntry> list) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(SortEntry e : list) {
|
||||
if(sb.length() > 0)
|
||||
sb.append(',');
|
||||
for (SortEntry e : list) {
|
||||
if (sb.length() > 0) sb.append(',');
|
||||
sb.append(e.name);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static ArrayList<SortEntry> fromSaveString(String s) {
|
||||
if(s == null)
|
||||
return new ArrayList<>(entries);
|
||||
if (s == null) return new ArrayList<>(entries);
|
||||
|
||||
ArrayList<SortEntry> list = new ArrayList<>();
|
||||
for(String s2 : s.split(",")) {
|
||||
for (String s2 : s.split(",")) {
|
||||
SortEntry e = find(s2.trim());
|
||||
if(e != null)
|
||||
list.add(e);
|
||||
if (e != null) list.add(e);
|
||||
}
|
||||
for(SortEntry e : entries)
|
||||
if(!list.contains(e))
|
||||
list.add(e);
|
||||
for (SortEntry e : entries) if (!list.contains(e)) list.add(e);
|
||||
|
||||
return list;
|
||||
}
|
||||
+50
-71
@@ -1,26 +1,27 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import static codechicken.lib.inventory.InventoryUtils.actualDamage;
|
||||
import static codechicken.lib.inventory.InventoryUtils.newItemStack;
|
||||
import static net.minecraftforge.oredict.OreDictionary.WILDCARD_VALUE;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static codechicken.lib.inventory.InventoryUtils.actualDamage;
|
||||
import static codechicken.lib.inventory.InventoryUtils.newItemStack;
|
||||
import static net.minecraftforge.oredict.OreDictionary.WILDCARD_VALUE;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
|
||||
/**
|
||||
* A maplike class for ItemStack keys with wildcard damage/NBT. Optimised for lookup
|
||||
*/
|
||||
public class ItemStackMap<T>
|
||||
{
|
||||
public static class StackMetaKey
|
||||
{
|
||||
public class ItemStackMap<T> {
|
||||
|
||||
public static class StackMetaKey {
|
||||
|
||||
public final int damage;
|
||||
public final NBTTagCompound tag;
|
||||
|
||||
@@ -38,15 +39,14 @@ public class ItemStackMap<T>
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof StackMetaKey))
|
||||
return false;
|
||||
if (!(o instanceof StackMetaKey)) return false;
|
||||
StackMetaKey t = (StackMetaKey) o;
|
||||
return damage == t.damage && Objects.equal(tag, t.tag);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Entry<T>
|
||||
{
|
||||
public static class Entry<T> {
|
||||
|
||||
public final ItemStack key;
|
||||
public final T value;
|
||||
|
||||
@@ -56,8 +56,8 @@ public class ItemStackMap<T>
|
||||
}
|
||||
}
|
||||
|
||||
public class DetailMap
|
||||
{
|
||||
public class DetailMap {
|
||||
|
||||
private boolean hasWildcard;
|
||||
private T wildcard;
|
||||
private HashMap<Integer, T> damageMap;
|
||||
@@ -66,8 +66,7 @@ public class ItemStackMap<T>
|
||||
private int size;
|
||||
|
||||
public T get(ItemStack key) {
|
||||
if (wildcard != null)
|
||||
return wildcard;
|
||||
if (wildcard != null) return wildcard;
|
||||
|
||||
if (damageMap != null) {
|
||||
final T ret = damageMap.get(actualDamage(key));
|
||||
@@ -77,8 +76,7 @@ public class ItemStackMap<T>
|
||||
final T ret = tagMap.get(key.stackTagCompound);
|
||||
if (ret != null) return ret;
|
||||
}
|
||||
if (metaMap != null)
|
||||
return metaMap.get(new StackMetaKey(key));
|
||||
if (metaMap != null) return metaMap.get(new StackMetaKey(key));
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -129,63 +127,50 @@ public class ItemStackMap<T>
|
||||
}
|
||||
|
||||
private void updateSize() {
|
||||
int newSize = (hasWildcard ? 1 : 0) +
|
||||
(metaMap != null ? metaMap.size() : 0) +
|
||||
(tagMap != null ? tagMap.size() : 0) +
|
||||
(damageMap != null ? damageMap.size() : 0);
|
||||
int newSize = (hasWildcard ? 1 : 0) + (metaMap != null ? metaMap.size() : 0)
|
||||
+ (tagMap != null ? tagMap.size() : 0)
|
||||
+ (damageMap != null ? damageMap.size() : 0);
|
||||
|
||||
if(newSize != size) {
|
||||
ItemStackMap.this.size += newSize-size;
|
||||
if (newSize != size) {
|
||||
ItemStackMap.this.size += newSize - size;
|
||||
size = newSize;
|
||||
}
|
||||
}
|
||||
|
||||
public void addKeys(Item item, List<ItemStack> list) {
|
||||
if (wildcard != null)
|
||||
list.add(wildcard(item));
|
||||
if (wildcard != null) list.add(wildcard(item));
|
||||
if (damageMap != null)
|
||||
for (int damage : damageMap.keySet())
|
||||
list.add(newItemStack(item, 1, damage, WILDCARD_TAG));
|
||||
for (int damage : damageMap.keySet()) list.add(newItemStack(item, 1, damage, WILDCARD_TAG));
|
||||
if (tagMap != null)
|
||||
for (NBTTagCompound tag : tagMap.keySet())
|
||||
list.add(newItemStack(item, 1, WILDCARD_VALUE, tag));
|
||||
for (NBTTagCompound tag : tagMap.keySet()) list.add(newItemStack(item, 1, WILDCARD_VALUE, tag));
|
||||
if (metaMap != null)
|
||||
for (StackMetaKey key : metaMap.keySet())
|
||||
list.add(newItemStack(item, 1, key.damage, key.tag));
|
||||
for (StackMetaKey key : metaMap.keySet()) list.add(newItemStack(item, 1, key.damage, key.tag));
|
||||
}
|
||||
|
||||
public void addValues(List<T> list) {
|
||||
if (wildcard != null)
|
||||
list.add(wildcard);
|
||||
if (damageMap != null)
|
||||
list.addAll(damageMap.values());
|
||||
if (tagMap != null)
|
||||
list.addAll(tagMap.values());
|
||||
if (metaMap != null)
|
||||
list.addAll(metaMap.values());
|
||||
if (wildcard != null) list.add(wildcard);
|
||||
if (damageMap != null) list.addAll(damageMap.values());
|
||||
if (tagMap != null) list.addAll(tagMap.values());
|
||||
if (metaMap != null) list.addAll(metaMap.values());
|
||||
}
|
||||
|
||||
public void addEntries(Item item, List<Entry<T>> list) {
|
||||
if (wildcard != null)
|
||||
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG), wildcard));
|
||||
if (damageMap != null)
|
||||
for (Map.Entry<Integer, T> entry : damageMap.entrySet())
|
||||
list.add(new Entry<>(newItemStack(item, 1, entry.getKey(), WILDCARD_TAG), entry.getValue()));
|
||||
if (tagMap != null)
|
||||
for (Map.Entry<NBTTagCompound, T> entry : tagMap.entrySet())
|
||||
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, entry.getKey()), entry.getValue()));
|
||||
if (metaMap != null)
|
||||
for (Map.Entry<StackMetaKey, T> entry : metaMap.entrySet())
|
||||
list.add(new Entry<>(newItemStack(item, 1, entry.getKey().damage, entry.getKey().tag), entry.getValue()));
|
||||
if (wildcard != null) list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG), wildcard));
|
||||
if (damageMap != null) for (Map.Entry<Integer, T> entry : damageMap.entrySet())
|
||||
list.add(new Entry<>(newItemStack(item, 1, entry.getKey(), WILDCARD_TAG), entry.getValue()));
|
||||
if (tagMap != null) for (Map.Entry<NBTTagCompound, T> entry : tagMap.entrySet())
|
||||
list.add(new Entry<>(newItemStack(item, 1, WILDCARD_VALUE, entry.getKey()), entry.getValue()));
|
||||
if (metaMap != null) for (Map.Entry<StackMetaKey, T> entry : metaMap.entrySet()) list.add(
|
||||
new Entry<>(newItemStack(item, 1, entry.getKey().damage, entry.getKey().tag), entry.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
public static int getKeyType(int damage, NBTTagCompound tag) {
|
||||
int i = 0;
|
||||
if (isWildcard(damage)) i = 1;
|
||||
if (isWildcard(tag)) i |= 2;
|
||||
return i;
|
||||
}
|
||||
int i = 0;
|
||||
if (isWildcard(damage)) i = 1;
|
||||
if (isWildcard(tag)) i |= 2;
|
||||
return i;
|
||||
}
|
||||
|
||||
public static ItemStack wildcard(Item item) {
|
||||
return newItemStack(item, 1, WILDCARD_VALUE, WILDCARD_TAG);
|
||||
@@ -219,12 +204,10 @@ public class ItemStackMap<T>
|
||||
}
|
||||
|
||||
public void put(ItemStack key, T value) {
|
||||
if (key == null || key.getItem() == null)
|
||||
return;
|
||||
if (key == null || key.getItem() == null) return;
|
||||
|
||||
DetailMap map = itemMap.get(key.getItem());
|
||||
if (map == null)
|
||||
itemMap.put(key.getItem(), map = new DetailMap());
|
||||
if (map == null) itemMap.put(key.getItem(), map = new DetailMap());
|
||||
map.put(key, value);
|
||||
}
|
||||
|
||||
@@ -233,8 +216,7 @@ public class ItemStackMap<T>
|
||||
}
|
||||
|
||||
public T remove(ItemStack key) {
|
||||
if (key == null || key.getItem() == null)
|
||||
return null;
|
||||
if (key == null || key.getItem() == null) return null;
|
||||
|
||||
DetailMap map = itemMap.get(key.getItem());
|
||||
return map == null ? null : map.remove(key);
|
||||
@@ -242,22 +224,19 @@ public class ItemStackMap<T>
|
||||
|
||||
public List<ItemStack> keys() {
|
||||
LinkedList<ItemStack> list = new LinkedList<>();
|
||||
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet())
|
||||
entry.getValue().addKeys(entry.getKey(), list);
|
||||
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet()) entry.getValue().addKeys(entry.getKey(), list);
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<T> values() {
|
||||
LinkedList<T> list = new LinkedList<>();
|
||||
for (DetailMap map : itemMap.values())
|
||||
map.addValues(list);
|
||||
for (DetailMap map : itemMap.values()) map.addValues(list);
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<Entry<T>> entries() {
|
||||
LinkedList<Entry<T>> list = new LinkedList<>();
|
||||
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet())
|
||||
entry.getValue().addEntries(entry.getKey(), list);
|
||||
for (Map.Entry<Item, DetailMap> entry : itemMap.entrySet()) entry.getValue().addEntries(entry.getKey(), list);
|
||||
return list;
|
||||
}
|
||||
|
||||
+7
-9
@@ -1,27 +1,25 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.ItemFilter;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter
|
||||
{
|
||||
import codechicken.nei.api.ItemFilter;
|
||||
|
||||
public class ItemStackSet extends ItemStackMap<ItemStack> implements ItemFilter {
|
||||
|
||||
public ItemStackSet with(ItemStack... items) {
|
||||
for(ItemStack item : items)
|
||||
add(item);
|
||||
for (ItemStack item : items) add(item);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemStackSet with(Item... items) {
|
||||
for(Item item : items)
|
||||
add(ItemStackMap.wildcard(item));
|
||||
for (Item item : items) add(ItemStackMap.wildcard(item));
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemStackSet with(Block... blocks) {
|
||||
for(Block block : blocks)
|
||||
add(ItemStackMap.wildcard(Item.getItemFromBlock(block)));
|
||||
for (Block block : blocks) add(ItemStackMap.wildcard(Item.getItemFromBlock(block)));
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,382 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.drawRect;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.renderer.OpenGlHelper;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.shader.Framebuffer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.ItemPanel.ItemPanelSlot;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.recipe.StackInfo;
|
||||
|
||||
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 rows;
|
||||
protected int columns;
|
||||
|
||||
protected boolean[] invalidSlotMap;
|
||||
|
||||
protected Label messageLabel = new Label(getMessageOnEmpty(), true);
|
||||
|
||||
@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, getItem(idx), useNBT)) {
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public void setPage(int page) {
|
||||
this.page = Math.max(0, Math.min(page, getNumPages() - 1));
|
||||
onGridChanged();
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
return page + 1;
|
||||
}
|
||||
|
||||
public int getPerPage() {
|
||||
return perPage;
|
||||
}
|
||||
|
||||
public int getNumPages() {
|
||||
if (perPage > 0) {
|
||||
return (int) Math.ceil((float) realItems.size() / (float) perPage);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
public int getColumns() {
|
||||
return columns;
|
||||
}
|
||||
|
||||
public void setGridSize(int mleft, int mtop, int w, int h) {
|
||||
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;
|
||||
|
||||
messageLabel.x = marginLeft + width / 2;
|
||||
messageLabel.y = marginTop + height / 2;
|
||||
}
|
||||
|
||||
public void shiftPage(int shift) {
|
||||
if (perPage == 0) {
|
||||
page = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
final int numPages = getNumPages();
|
||||
final int oldPage = page;
|
||||
page += shift;
|
||||
|
||||
if (page >= numPages) {
|
||||
page = page - numPages;
|
||||
}
|
||||
|
||||
if (page < 0) {
|
||||
page = numPages + page;
|
||||
}
|
||||
|
||||
page = Math.max(0, Math.min(page, numPages - 1));
|
||||
|
||||
if (page != oldPage) {
|
||||
onGridChanged();
|
||||
}
|
||||
}
|
||||
|
||||
protected void onGridChanged() {
|
||||
refreshBuffer = true;
|
||||
}
|
||||
|
||||
public void refresh(GuiContainer gui) {
|
||||
updateGuiOverlapSlots(gui);
|
||||
shiftPage(0);
|
||||
}
|
||||
|
||||
protected void updateGuiOverlapSlots(GuiContainer gui) {
|
||||
final boolean[] oldSlotMap = invalidSlotMap;
|
||||
final int oldRows = rows;
|
||||
final int oldColumns = columns;
|
||||
|
||||
invalidSlotMap = new boolean[rows * columns];
|
||||
perPage = columns * rows;
|
||||
|
||||
if (NEIClientConfig.optimizeGuiOverlapComputation()) {
|
||||
checkGuiOverlap(gui, 0, columns - 2, 1);
|
||||
checkGuiOverlap(gui, columns - 1, 1, -1);
|
||||
} else {
|
||||
checkGuiOverlap(gui, 0, columns, 1);
|
||||
}
|
||||
|
||||
if (oldRows != rows || oldColumns != columns || !Arrays.equals(oldSlotMap, invalidSlotMap)) {
|
||||
onGridChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void checkGuiOverlap(GuiContainer gui, int start, int end, int dir) {
|
||||
boolean validColumn = false;
|
||||
|
||||
for (int c = start; c != end && (!NEIClientConfig.optimizeGuiOverlapComputation() || !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 getItemRect(int idx) {
|
||||
final List<Integer> mask = getMask();
|
||||
|
||||
for (int i = 0; i < mask.size(); i++) {
|
||||
if (mask.get(i) != null && idx == mask.get(i)) {
|
||||
return getSlotRect(i);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
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 index) {
|
||||
return invalidSlotMap[index];
|
||||
}
|
||||
|
||||
protected List<Integer> getMask() {
|
||||
List<Integer> mask = new ArrayList<>();
|
||||
|
||||
int idx = page * perPage;
|
||||
for (int i = 0; i < rows * columns && idx < size(); i++) {
|
||||
mask.add(isInvalidSlot(i) ? null : idx++);
|
||||
}
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
private void drawSlotOutlines(int mousex, int mousey) {
|
||||
ItemPanelSlot focused = getSlotMouseOver(mousex, mousey);
|
||||
final List<Integer> mask = getMask();
|
||||
|
||||
for (int i = 0; i < mask.size(); i++) {
|
||||
if (mask.get(i) != null) {
|
||||
drawSlotOutline(focused, mask.get(i), getSlotRect(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void drawSlotOutline(@Nullable ItemPanelSlot focused, int slotIdx, Rectangle4i rect) {
|
||||
if (focused != null && focused.slotIndex == slotIdx) {
|
||||
drawRect(rect.x, rect.y, rect.w, rect.h, 0xee555555); // highlight
|
||||
}
|
||||
}
|
||||
|
||||
private void blitExistingBuffer() {
|
||||
Minecraft minecraft = Minecraft.getMinecraft();
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
OpenGlHelper.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
getFrameBuffer().bindFramebufferTexture();
|
||||
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
||||
ScaledResolution res = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight);
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
tessellator.startDrawingQuads();
|
||||
tessellator.addVertexWithUV(0, res.getScaledHeight_double(), 0.0, 0, 0);
|
||||
tessellator.addVertexWithUV(res.getScaledWidth_double(), res.getScaledHeight_double(), 0.0, 1, 0);
|
||||
tessellator.addVertexWithUV(res.getScaledWidth_double(), 0, 0.0, 1, 1);
|
||||
tessellator.addVertexWithUV(0, 0, 0, 0, 1);
|
||||
tessellator.draw();
|
||||
OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
|
||||
}
|
||||
|
||||
private Framebuffer getFrameBuffer() {
|
||||
|
||||
if (framebuffer == null) {
|
||||
framebuffer = new Framebuffer(1, 1, true);
|
||||
framebuffer.setFramebufferColor(0.0F, 0.0F, 0.0F, 0.0F);
|
||||
}
|
||||
|
||||
return framebuffer;
|
||||
}
|
||||
|
||||
private void drawItems() {
|
||||
GuiContainerManager.enableMatrixStackLogging();
|
||||
|
||||
final List<Integer> mask = getMask();
|
||||
for (int i = 0; i < mask.size(); i++) {
|
||||
if (mask.get(i) != null) {
|
||||
drawItem(getSlotRect(i), mask.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
GuiContainerManager.disableMatrixStackLogging();
|
||||
}
|
||||
|
||||
public void draw(int mousex, int mousey) {
|
||||
if (getPerPage() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (NEIClientConfig.shouldCacheItemRendering()) {
|
||||
|
||||
if (refreshBuffer) {
|
||||
Minecraft minecraft = Minecraft.getMinecraft();
|
||||
Framebuffer framebuffer = getFrameBuffer();
|
||||
framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight);
|
||||
framebuffer.framebufferClear();
|
||||
framebuffer.bindFramebuffer(false);
|
||||
|
||||
/* Set up some rendering state needed for items to work correctly */
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
GL11.glDepthMask(true);
|
||||
OpenGlHelper.glBlendFunc(
|
||||
GL11.GL_SRC_ALPHA,
|
||||
GL11.GL_ONE_MINUS_SRC_ALPHA,
|
||||
GL11.GL_SRC_ALPHA,
|
||||
GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
drawItems();
|
||||
|
||||
Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false);
|
||||
refreshBuffer = false;
|
||||
}
|
||||
|
||||
drawSlotOutlines(mousex, mousey);
|
||||
blitExistingBuffer();
|
||||
} else {
|
||||
drawSlotOutlines(mousex, mousey);
|
||||
drawItems();
|
||||
}
|
||||
}
|
||||
|
||||
public void setVisible() {
|
||||
if (getItems().isEmpty() && getMessageOnEmpty() != null) {
|
||||
LayoutManager.addWidget(messageLabel);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (overRow >= rows || overColumn >= columns) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final List<Integer> mask = getMask();
|
||||
|
||||
if (mask.size() > slt && mask.get(slt) != null) {
|
||||
final int idx = mask.get(slt);
|
||||
|
||||
return new ItemPanelSlot(idx, getItem(idx));
|
||||
}
|
||||
|
||||
return 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 || !isInvalidSlot(slt);
|
||||
}
|
||||
|
||||
public String getMessageOnEmpty() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+19
-26
@@ -1,7 +1,5 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map.Entry;
|
||||
@@ -9,44 +7,39 @@ import java.util.Map.Entry;
|
||||
/**
|
||||
* Good old down/held/up keystate tracker
|
||||
*/
|
||||
public class KeyManager
|
||||
{
|
||||
public static interface IKeyStateTracker
|
||||
{
|
||||
public class KeyManager {
|
||||
|
||||
public static interface IKeyStateTracker {
|
||||
|
||||
public void tickKeyStates();
|
||||
}
|
||||
|
||||
public static class KeyState
|
||||
{
|
||||
|
||||
public static class KeyState {
|
||||
|
||||
public boolean down;
|
||||
public boolean held;
|
||||
public boolean up;
|
||||
}
|
||||
|
||||
|
||||
public static HashMap<String, KeyState> keyStates = new HashMap<>();
|
||||
public static LinkedList<IKeyStateTracker> trackers = new LinkedList<>();
|
||||
|
||||
public static void tickKeyStates()
|
||||
{
|
||||
for(Entry<String, KeyState> entry : keyStates.entrySet())
|
||||
{
|
||||
int keyCode = NEIClientConfig.getKeyBinding(entry.getKey());
|
||||
boolean down = keyCode != 0 && Keyboard.isKeyDown(keyCode);
|
||||
KeyState state = entry.getValue();
|
||||
if(down)
|
||||
{
|
||||
|
||||
public static void tickKeyStates() {
|
||||
for (Entry<String, KeyState> entry : keyStates.entrySet()) {
|
||||
final boolean down = NEIClientConfig.isKeyHashDown(entry.getKey());
|
||||
final KeyState state = entry.getValue();
|
||||
|
||||
if (down) {
|
||||
state.down = !state.held;
|
||||
state.up = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
state.up = state.held;
|
||||
state.down = false;
|
||||
}
|
||||
|
||||
state.held = down;
|
||||
}
|
||||
|
||||
for(IKeyStateTracker tracker : trackers)
|
||||
tracker.tickKeyStates();
|
||||
|
||||
for (IKeyStateTracker tracker : trackers) tracker.tickKeyStates();
|
||||
}
|
||||
}
|
||||
@@ -3,30 +3,25 @@ package codechicken.nei;
|
||||
import static codechicken.lib.gui.GuiDraw.drawString;
|
||||
import static codechicken.lib.gui.GuiDraw.drawStringC;
|
||||
|
||||
public class Label extends Widget
|
||||
{
|
||||
public class Label extends Widget {
|
||||
|
||||
final boolean centered;
|
||||
final int colour;
|
||||
public String text;
|
||||
|
||||
public Label(String s, boolean center, int color)
|
||||
{
|
||||
|
||||
public Label(String s, boolean center, int color) {
|
||||
text = s;
|
||||
centered = center;
|
||||
colour = color;
|
||||
}
|
||||
|
||||
public Label(String s, boolean center)
|
||||
{
|
||||
|
||||
public Label(String s, boolean center) {
|
||||
this(s, center, 0xFFFFFFFF);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void draw(int mousex, int mousey)
|
||||
{
|
||||
if(centered)
|
||||
drawStringC(text, x, y, colour);
|
||||
else
|
||||
drawString(text, x, y, colour);
|
||||
public void draw(int mousex, int mousey) {
|
||||
if (centered) drawStringC(text, x, y, colour);
|
||||
else drawString(text, x, y, colour);
|
||||
}
|
||||
}
|
||||
+341
-305
File diff suppressed because it is too large.
Load diff
+67
-73
@@ -1,21 +1,17 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.LayoutStyle;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.drawStringC;
|
||||
import static codechicken.nei.LayoutManager.bookmarkPanel;
|
||||
import static codechicken.nei.LayoutManager.bookmarksButton;
|
||||
import static codechicken.nei.LayoutManager.delete;
|
||||
import static codechicken.nei.LayoutManager.dropDown;
|
||||
import static codechicken.nei.LayoutManager.gamemode;
|
||||
import static codechicken.nei.LayoutManager.heal;
|
||||
import static codechicken.nei.LayoutManager.itemPanel;
|
||||
import static codechicken.nei.LayoutManager.less;
|
||||
import static codechicken.nei.LayoutManager.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.presetsPanel;
|
||||
import static codechicken.nei.LayoutManager.rain;
|
||||
import static codechicken.nei.LayoutManager.searchField;
|
||||
import static codechicken.nei.LayoutManager.timeButtons;
|
||||
@@ -24,8 +20,15 @@ import static codechicken.nei.NEIClientConfig.disabledActions;
|
||||
import static codechicken.nei.NEIClientConfig.getMagnetMode;
|
||||
import static codechicken.nei.NEIClientConfig.isEnabled;
|
||||
|
||||
public class LayoutStyleMinecraft extends LayoutStyle
|
||||
{
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import codechicken.nei.api.LayoutStyle;
|
||||
import codechicken.nei.drawable.DrawableBuilder;
|
||||
|
||||
public class LayoutStyleMinecraft extends LayoutStyle {
|
||||
|
||||
public int buttonCount;
|
||||
public int leftSize;
|
||||
public int numButtons;
|
||||
@@ -48,6 +51,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
|
||||
@@ -59,92 +64,86 @@ public class LayoutStyleMinecraft extends LayoutStyle
|
||||
public void layout(GuiContainer gui, VisiblityData visiblity) {
|
||||
reset();
|
||||
|
||||
//leftSize = ((gui.width - gui.xSize) / 2) - 3;
|
||||
leftSize = ItemPanels.bookmarkPanel.getWidth(gui);
|
||||
numButtons = leftSize / 18;
|
||||
numButtons = Math.max(leftSize / 18, 1);
|
||||
|
||||
delete.state = 0x4;
|
||||
if (NEIController.getDeleteMode())
|
||||
delete.state |= 1;
|
||||
else if (!visiblity.enableDeleteMode)
|
||||
delete.state |= 2;
|
||||
if (NEIController.getDeleteMode()) delete.state |= 1;
|
||||
else if (!visiblity.enableDeleteMode) delete.state |= 2;
|
||||
|
||||
rain.state = 0x4;
|
||||
if (disabledActions.contains("rain"))
|
||||
rain.state |= 2;
|
||||
else if (NEIClientUtils.isRaining())
|
||||
rain.state |= 1;
|
||||
if (disabledActions.contains("rain")) rain.state |= 2;
|
||||
else if (NEIClientUtils.isRaining()) rain.state |= 1;
|
||||
|
||||
gamemode.state = 0x4;
|
||||
if (NEIClientUtils.getGamemode() != 0) {
|
||||
gamemode.state |= 0x1;
|
||||
gamemode.index = NEIClientUtils.getGamemode() - 1;
|
||||
} else {
|
||||
if (NEIClientUtils.isValidGamemode("creative"))
|
||||
gamemode.index = 0;
|
||||
else if (NEIClientUtils.isValidGamemode("creative+"))
|
||||
gamemode.index = 1;
|
||||
else if (NEIClientUtils.isValidGamemode("adventure"))
|
||||
gamemode.index = 2;
|
||||
if (NEIClientUtils.isValidGamemode("creative")) gamemode.index = 0;
|
||||
else if (NEIClientUtils.isValidGamemode("creative+")) gamemode.index = 1;
|
||||
else if (NEIClientUtils.isValidGamemode("adventure")) gamemode.index = 2;
|
||||
}
|
||||
bookmarksButton.index = NEIClientConfig.isBookmarkPanelHidden() ? 0 : 1;
|
||||
options.index = NEIClientConfig.getCheatMode();
|
||||
|
||||
magnet.state = 0x4 | (getMagnetMode() ? 1 : 0);
|
||||
|
||||
if (canPerformAction("delete"))
|
||||
layoutButton(delete);
|
||||
if (canPerformAction("rain"))
|
||||
layoutButton(rain);
|
||||
if (NEIClientUtils.isValidGamemode("creative") ||
|
||||
NEIClientUtils.isValidGamemode("creative+") ||
|
||||
NEIClientUtils.isValidGamemode("adventure"))
|
||||
if (canPerformAction("delete")) layoutButton(delete);
|
||||
if (canPerformAction("rain")) layoutButton(rain);
|
||||
if (NEIClientUtils.isValidGamemode("creative") || NEIClientUtils.isValidGamemode("creative+")
|
||||
|| NEIClientUtils.isValidGamemode("adventure"))
|
||||
layoutButton(gamemode);
|
||||
if (canPerformAction("magnet"))
|
||||
layoutButton(magnet);
|
||||
if (canPerformAction("magnet")) layoutButton(magnet);
|
||||
if (canPerformAction("time")) {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
timeButtons[i].state = disabledActions.contains(NEIActions.timeZones[i]) ? 2 : 0;
|
||||
layoutButton(timeButtons[i]);
|
||||
}
|
||||
}
|
||||
if (canPerformAction("heal"))
|
||||
layoutButton(heal);
|
||||
if (canPerformAction("heal")) layoutButton(heal);
|
||||
|
||||
itemPanel.resize(gui);
|
||||
bookmarkPanel.resize(gui);
|
||||
|
||||
more.w = more.h = less.w = less.h = 16;
|
||||
less.x = itemPanel.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 = 80;
|
||||
options.w = 22;
|
||||
options.h = 22;
|
||||
|
||||
searchField.y = gui.height - searchField.h - 2;
|
||||
bookmarksButton.x = 24 + (isEnabled() ? 0 : 6);
|
||||
bookmarksButton.y = isEnabled() ? gui.height - 22 : gui.height - 28;
|
||||
bookmarksButton.w = 22;
|
||||
bookmarksButton.h = 22;
|
||||
|
||||
dropDown.h = 18;
|
||||
dropDown.w = 150;
|
||||
dropDown.y = 0;
|
||||
dropDown.x = (gui.width - gui.xSize) / 2 + gui.xSize - dropDown.w;
|
||||
|
||||
presetsPanel.h = 16;
|
||||
presetsPanel.w = 150;
|
||||
presetsPanel.y = 2;
|
||||
presetsPanel.x = (gui.width - gui.xSize) / 2 + gui.xSize - presetsPanel.w;
|
||||
|
||||
dropDown.x = itemPanel.x - 150;
|
||||
dropDown.h = 20;
|
||||
dropDown.w = Math.min(itemPanel.prev.x - dropDown.x - 3, 100);
|
||||
searchField.h = 20;
|
||||
searchField.w = 150;
|
||||
searchField.x = (gui.width - searchField.w) / 2;
|
||||
if (NEIClientConfig.isSearchWidgetCentered()) {
|
||||
searchField.w = 150;
|
||||
searchField.x = (gui.width - searchField.w) / 2;
|
||||
} else {
|
||||
searchField.w = (int) (itemPanel.w * (NEIClientConfig.showItemQuantityWidget() ? 0.7 : 1));
|
||||
searchField.x = itemPanel.x;
|
||||
}
|
||||
searchField.y = gui.height - searchField.h - 2;
|
||||
|
||||
if (!visiblity.showItemSection) {
|
||||
searchField.setFocus(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void layoutButton(Button button) {
|
||||
button.x = 6 + (buttonCount % numButtons) * 20;
|
||||
button.y = 3 + (buttonCount / numButtons) * 18;
|
||||
button.x = 2 + (buttonCount % numButtons) * 19;
|
||||
button.y = 2 + (buttonCount / numButtons) * 18;
|
||||
|
||||
button.h = 17;
|
||||
button.w = button.contentWidth() + 6;
|
||||
@@ -158,38 +157,33 @@ public class LayoutStyleMinecraft extends LayoutStyle
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
|
||||
int tex;
|
||||
if ((b.state & 0x3) == 2)
|
||||
tex = 0;
|
||||
else if ((b.state & 0x4) == 0 && b.contains(mousex, mousey) ||//not a state button and mouseover
|
||||
(b.state & 0x3) == 1)//state active
|
||||
if ((b.state & 0x3) == 2) tex = 0;
|
||||
else if ((b.state & 0x4) == 0 && b.contains(mousex, mousey) || // not a state button and mouseover
|
||||
(b.state & 0x3) == 1) // state active
|
||||
tex = 2;
|
||||
else
|
||||
tex = 1;
|
||||
else tex = 1;
|
||||
LayoutManager.drawButtonBackground(b.x, b.y, b.w, b.h, true, tex);
|
||||
|
||||
Image icon = b.getRenderIcon();
|
||||
if (icon == null) {
|
||||
int colour = tex == 2 ? 0xffffa0 :
|
||||
tex == 0 ? 0x601010 : 0xe0e0e0;
|
||||
int colour = tex == 2 ? 0xffffa0 : tex == 0 ? 0x601010 : 0xe0e0e0;
|
||||
|
||||
drawStringC(b.getRenderLabel(), b.x + b.w / 2, b.y + (b.h - 8) / 2, colour);
|
||||
} else {
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
|
||||
int iconx = b.x + (b.w - icon.width) / 2;
|
||||
int icony = b.y + (b.h - icon.height) / 2;
|
||||
LayoutManager.drawIcon(iconx, icony, icon);
|
||||
final int iconX = b.x + (b.w - icon.width) / 2;
|
||||
final int iconY = b.y + (b.h - icon.height) / 2;
|
||||
|
||||
LayoutManager.drawIcon(iconX, iconY, icon);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawSubsetTag(String text, int x, int y, int w, int h, int state, boolean mouseover) {
|
||||
if(state == 1)
|
||||
GL11.glColor4f(0.65F, 0.65F, 0.65F, 1.0F);
|
||||
else
|
||||
GL11.glColor4f(1, 1, 1, 1);
|
||||
if (state == 1) GL11.glColor4f(0.65F, 0.65F, 0.65F, 1.0F);
|
||||
else GL11.glColor4f(1, 1, 1, 1);
|
||||
LayoutManager.drawButtonBackground(x, y, w, h, false, state == 0 ? 0 : 1);
|
||||
if(text != null)
|
||||
drawStringC(text, x, y, w, h, state == 2 ? 0xFFE0E0E0 : 0xFFA0A0A0);
|
||||
if (text != null) drawStringC(text, x, y, w, h, state == 2 ? 0xFFE0E0E0 : 0xFFA0A0A0);
|
||||
}
|
||||
}
|
||||
+20
-31
@@ -5,47 +5,40 @@ import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class NEIActions
|
||||
{
|
||||
public class NEIActions {
|
||||
|
||||
public static final int protocol = 0;
|
||||
|
||||
|
||||
public static HashMap<String, NEIActions> nameActionMap = new HashMap<>();
|
||||
public static HashSet<String> canDisable = new HashSet<>();
|
||||
|
||||
public static void addAction(String name, String base, boolean smpreq)
|
||||
{
|
||||
public static void addAction(String name, String base, boolean smpreq) {
|
||||
NEIActions action = new NEIActions(name, base, smpreq);
|
||||
nameActionMap.put(name, action);
|
||||
}
|
||||
|
||||
private static void addAction(String name, String base)
|
||||
{
|
||||
|
||||
private static void addAction(String name, String base) {
|
||||
addAction(name, base, false);
|
||||
}
|
||||
|
||||
public static void addAction(String name)
|
||||
{
|
||||
public static void addAction(String name) {
|
||||
addAction(name, name);
|
||||
}
|
||||
|
||||
private static void addAction(String name, boolean smpreq)
|
||||
{
|
||||
private static void addAction(String name, boolean smpreq) {
|
||||
addAction(name, name, smpreq);
|
||||
}
|
||||
|
||||
public static String base(String name)
|
||||
{
|
||||
|
||||
public static String base(String name) {
|
||||
NEIActions action = nameActionMap.get(name);
|
||||
return action == null ? name : action.base;
|
||||
}
|
||||
|
||||
public static boolean smpRequired(String name)
|
||||
{
|
||||
public static boolean smpRequired(String name) {
|
||||
return nameActionMap.get(name).smpreq;
|
||||
}
|
||||
|
||||
public static void init()
|
||||
{
|
||||
|
||||
public static void init() {
|
||||
addAction("time");
|
||||
addAction("dawn", "time");
|
||||
addAction("noon", "time");
|
||||
@@ -68,27 +61,23 @@ public class NEIActions
|
||||
canDisable.add("midnight");
|
||||
canDisable.add("rain");
|
||||
}
|
||||
|
||||
public static final String[] timeZones = new String[]{"dawn", "noon", "dusk", "midnight"};
|
||||
public static final String[] gameModes = new String[]{"survival", "creative", "creative+", "adventure"};
|
||||
|
||||
public static final String[] timeZones = new String[] { "dawn", "noon", "dusk", "midnight" };
|
||||
public static final String[] gameModes = new String[] { "survival", "creative", "creative+", "adventure" };
|
||||
|
||||
public String name;
|
||||
public String base;
|
||||
public boolean smpreq;
|
||||
|
||||
public NEIActions(String name, String base, boolean smpreq)
|
||||
{
|
||||
|
||||
public NEIActions(String name, String base, boolean smpreq) {
|
||||
this.name = name;
|
||||
this.base = base;
|
||||
this.smpreq = smpreq;
|
||||
}
|
||||
|
||||
public static List<String> baseActions()
|
||||
{
|
||||
public static List<String> baseActions() {
|
||||
List<String> list = new LinkedList<>();
|
||||
for(NEIActions a : nameActionMap.values())
|
||||
if(a.base.equals(a.name))
|
||||
list.add(a.name);
|
||||
for (NEIActions a : nameActionMap.values()) if (a.base.equals(a.name)) list.add(a.name);
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,5 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.core.ClientUtils;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.lib.packet.PacketCustom.IClientPacketHandler;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.inventory.GuiInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -12,8 +7,14 @@ import net.minecraft.network.play.INetHandlerPlayClient;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class NEICPH implements IClientPacketHandler
|
||||
{
|
||||
import codechicken.core.ClientUtils;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.lib.packet.PacketCustom.IClientPacketHandler;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
|
||||
public class NEICPH implements IClientPacketHandler {
|
||||
|
||||
public static final String channel = "NEI";
|
||||
|
||||
@Override
|
||||
@@ -38,13 +39,16 @@ public class NEICPH implements IClientPacketHandler
|
||||
handleGamemode(mc, packet.readUByte());
|
||||
break;
|
||||
case 21:
|
||||
ClientUtils.openSMPGui(packet.readUByte(), new GuiEnchantmentModifier(mc.thePlayer.inventory, mc.theWorld, 0, 0, 0));
|
||||
ClientUtils.openSMPGui(
|
||||
packet.readUByte(),
|
||||
new GuiEnchantmentModifier(mc.thePlayer.inventory, mc.theWorld, 0, 0, 0));
|
||||
break;
|
||||
case 23:
|
||||
if (packet.readBoolean())
|
||||
ClientUtils.openSMPGui(packet.readUByte(), new GuiExtendedCreativeInv(new ContainerCreativeInv(mc.thePlayer, new ExtendedCreativeInv(null, Side.CLIENT))));
|
||||
else
|
||||
mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
|
||||
if (packet.readBoolean()) ClientUtils.openSMPGui(
|
||||
packet.readUByte(),
|
||||
new GuiExtendedCreativeInv(
|
||||
new ContainerCreativeInv(mc.thePlayer, new ExtendedCreativeInv(null, Side.CLIENT))));
|
||||
else mc.displayGuiScreen(new GuiInventory(mc.thePlayer));
|
||||
break;
|
||||
case 24:
|
||||
ClientUtils.openSMPGui(packet.readUByte(), new GuiPotionCreator(mc.thePlayer.inventory));
|
||||
@@ -58,40 +62,32 @@ public class NEICPH implements IClientPacketHandler
|
||||
|
||||
private void handleActionEnabled(PacketCustom packet) {
|
||||
String name = packet.readString();
|
||||
if (packet.readBoolean())
|
||||
NEIClientConfig.enabledActions.add(name);
|
||||
else
|
||||
NEIClientConfig.enabledActions.remove(name);
|
||||
if (packet.readBoolean()) NEIClientConfig.enabledActions.add(name);
|
||||
else NEIClientConfig.enabledActions.remove(name);
|
||||
}
|
||||
|
||||
private void handleActionDisabled(PacketCustom packet) {
|
||||
String name = packet.readString();
|
||||
if (packet.readBoolean())
|
||||
NEIClientConfig.disabledActions.add(name);
|
||||
else
|
||||
NEIClientConfig.disabledActions.remove(name);
|
||||
if (packet.readBoolean()) NEIClientConfig.disabledActions.add(name);
|
||||
else NEIClientConfig.disabledActions.remove(name);
|
||||
}
|
||||
|
||||
private void handleLoginState(PacketCustom packet) {
|
||||
NEIClientConfig.permissableActions.clear();
|
||||
int num = packet.readUByte();
|
||||
for (int i = 0; i < num; i++)
|
||||
NEIClientConfig.permissableActions.add(packet.readString());
|
||||
for (int i = 0; i < num; i++) NEIClientConfig.permissableActions.add(packet.readString());
|
||||
|
||||
NEIClientConfig.disabledActions.clear();
|
||||
num = packet.readUByte();
|
||||
for (int i = 0; i < num; i++)
|
||||
NEIClientConfig.disabledActions.add(packet.readString());
|
||||
for (int i = 0; i < num; i++) NEIClientConfig.disabledActions.add(packet.readString());
|
||||
|
||||
NEIClientConfig.enabledActions.clear();
|
||||
num = packet.readUByte();
|
||||
for (int i = 0; i < num; i++)
|
||||
NEIClientConfig.enabledActions.add(packet.readString());
|
||||
for (int i = 0; i < num; i++) NEIClientConfig.enabledActions.add(packet.readString());
|
||||
|
||||
NEIClientConfig.bannedBlocks.clear();
|
||||
num = packet.readInt();
|
||||
for(int i = 0; i < num; i++)
|
||||
NEIClientConfig.bannedBlocks.add(packet.readItemStack());
|
||||
for (int i = 0; i < num; i++) NEIClientConfig.bannedBlocks.add(packet.readItemStack());
|
||||
|
||||
if (NEIClientUtils.getGuiContainer() != null)
|
||||
LayoutManager.instance().refresh(NEIClientUtils.getGuiContainer());
|
||||
@@ -115,8 +111,7 @@ public class NEICPH implements IClientPacketHandler
|
||||
}
|
||||
|
||||
private static String getSaveName(String worldName) {
|
||||
if (Minecraft.getMinecraft().isSingleplayer())
|
||||
return "local/" + ClientUtils.getWorldSaveName();
|
||||
if (Minecraft.getMinecraft().isSingleplayer()) return "local/" + ClientUtils.getWorldSaveName();
|
||||
|
||||
return "remote/" + ClientUtils.getServerIP().replace(':', '~') + "/" + worldName;
|
||||
}
|
||||
@@ -148,6 +143,12 @@ public class NEICPH implements IClientPacketHandler
|
||||
packet.sendToServer();
|
||||
}
|
||||
|
||||
public static void sendRequestContainer() {
|
||||
PacketCustom packet = new PacketCustom(channel, 16);
|
||||
packet.writeInt(Minecraft.getMinecraft().thePlayer.openContainer.getInventory().size());
|
||||
packet.sendToServer();
|
||||
}
|
||||
|
||||
public static void sendSetSlot(int slot, ItemStack stack, boolean container) {
|
||||
PacketCustom packet = new PacketCustom(channel, 5);
|
||||
packet.writeBoolean(container);
|
||||
@@ -203,9 +204,7 @@ public class NEICPH implements IClientPacketHandler
|
||||
}
|
||||
|
||||
public static void sendGamemode(int mode) {
|
||||
new PacketCustom(channel, 13)
|
||||
.writeByte(mode)
|
||||
.sendToServer();
|
||||
new PacketCustom(channel, 13).writeByte(mode).sendToServer();
|
||||
}
|
||||
|
||||
public static void sendCreativeInv(boolean open) {
|
||||
@@ -229,10 +228,11 @@ public class NEICPH implements IClientPacketHandler
|
||||
|
||||
public static void sendOpenPotionWindow() {
|
||||
ItemStack[] potionStore = new ItemStack[9];
|
||||
InventoryUtils.readItemStacksFromTag(potionStore, NEIClientConfig.global.nbt.getCompoundTag("potionStore").getTagList("items", 10));
|
||||
InventoryUtils.readItemStacksFromTag(
|
||||
potionStore,
|
||||
NEIClientConfig.global.nbt.getCompoundTag("potionStore").getTagList("items", 10));
|
||||
PacketCustom packet = new PacketCustom(channel, 24);
|
||||
for (ItemStack stack : potionStore)
|
||||
packet.writeItemStack(stack);
|
||||
for (ItemStack stack : potionStore) packet.writeItemStack(stack);
|
||||
packet.sendToServer();
|
||||
}
|
||||
|
||||
+10
-7
@@ -1,17 +1,18 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
import codechicken.nei.api.TaggedInventoryArea;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.gui.inventory.GuiChest;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.ContainerChest;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
import codechicken.nei.api.TaggedInventoryArea;
|
||||
|
||||
public class NEIChestGuiHandler extends INEIGuiAdapter {
|
||||
|
||||
public class NEIChestGuiHandler extends INEIGuiAdapter
|
||||
{
|
||||
public int chestSize(GuiContainer gui) {
|
||||
return ((ContainerChest) gui.inventorySlots).getLowerChestInventory().getSizeInventory();
|
||||
}
|
||||
@@ -23,6 +24,8 @@ public class NEIChestGuiHandler extends INEIGuiAdapter
|
||||
|
||||
@Override
|
||||
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) {
|
||||
return gui instanceof GuiChest ? Collections.singletonList(new TaggedInventoryArea("Chest", 0, chestSize(gui), gui.inventorySlots)) : null;
|
||||
return gui instanceof GuiChest
|
||||
? Collections.singletonList(new TaggedInventoryArea("Chest", 0, chestSize(gui), gui.inventorySlots))
|
||||
: null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,775 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.renderer.OpenGlHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
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 com.google.common.base.Objects;
|
||||
|
||||
import codechicken.core.CCUpdateChecker;
|
||||
import codechicken.core.ClassDiscoverer;
|
||||
import codechicken.core.ClientUtils;
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.lib.config.ConfigFile;
|
||||
import codechicken.lib.config.ConfigTag;
|
||||
import codechicken.lib.config.ConfigTagParent;
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.IConfigureNEI;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.api.NEIInfo;
|
||||
import codechicken.nei.config.ConfigSet;
|
||||
import codechicken.nei.config.GuiHighlightTips;
|
||||
import codechicken.nei.config.GuiNEIOptionList;
|
||||
import codechicken.nei.config.GuiOptionList;
|
||||
import codechicken.nei.config.GuiPanelSettings;
|
||||
import codechicken.nei.config.OptionCycled;
|
||||
import codechicken.nei.config.OptionGamemodes;
|
||||
import codechicken.nei.config.OptionList;
|
||||
import codechicken.nei.config.OptionOpenGui;
|
||||
import codechicken.nei.config.OptionTextField;
|
||||
import codechicken.nei.config.OptionToggleButton;
|
||||
import codechicken.nei.config.OptionToggleButtonBoubs;
|
||||
import codechicken.nei.config.OptionUtilities;
|
||||
import codechicken.nei.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;
|
||||
|
||||
public class NEIClientConfig {
|
||||
|
||||
private static boolean mainNEIConfigLoaded;
|
||||
private static boolean pluginNEIConfigLoaded;
|
||||
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/");
|
||||
public static ConfigSet global = new ConfigSet(
|
||||
new File("saves/NEI/client.dat"),
|
||||
new ConfigFile(new File(configDir, "client.cfg")));
|
||||
public static ConfigSet world;
|
||||
public static final File handlerFile = new File(configDir, "handlers.csv");
|
||||
public static final File catalystFile = new File(configDir, "catalysts.csv");
|
||||
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());
|
||||
|
||||
public static int getHandlerOrder(IRecipeHandler handler) {
|
||||
if (handlerOrdering.get(handler.getOverlayIdentifier()) != null) {
|
||||
return handlerOrdering.get(handler.getOverlayIdentifier());
|
||||
}
|
||||
if (handlerOrdering.get(handler.getHandlerId()) != null) {
|
||||
return handlerOrdering.get(handler.getHandlerId());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Comparator that compares handlers using the handlerOrdering map.
|
||||
public static final Comparator<IRecipeHandler> HANDLER_COMPARATOR = Comparator
|
||||
.comparingInt(NEIClientConfig::getHandlerOrder);
|
||||
|
||||
public static ItemStack[] creativeInv;
|
||||
|
||||
public static boolean hasSMPCounterpart;
|
||||
public static HashSet<String> permissableActions = new HashSet<>();
|
||||
public static HashSet<String> disabledActions = new HashSet<>();
|
||||
public static HashSet<String> enabledActions = new HashSet<>();
|
||||
|
||||
public static ItemStackSet bannedBlocks = new ItemStackSet();
|
||||
|
||||
static {
|
||||
if (global.config.getTag("checkUpdates").getBooleanValue(true)) CCUpdateChecker.updateCheck("NotEnoughItems");
|
||||
linkOptionList();
|
||||
setDefaults();
|
||||
}
|
||||
|
||||
private static void setDefaults() {
|
||||
ConfigTagParent tag = global.config;
|
||||
tag.setComment(
|
||||
"Main configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
|
||||
|
||||
tag.getTag("command").useBraces().setComment(
|
||||
"Change these options if you have a different mod installed on the server that handles the commands differently, Eg. Bukkit Essentials");
|
||||
tag.setNewLineMode(1);
|
||||
|
||||
tag.getTag("inventory.widgetsenabled").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.widgetsenabled"));
|
||||
|
||||
tag.getTag("inventory.hidden").getBooleanValue(false);
|
||||
tag.getTag("inventory.cheatmode").getIntValue(2);
|
||||
tag.getTag("inventory.lockmode").setComment(
|
||||
"For those who can't help themselves.\nSet this to a mode and you will be unable to change it ingame")
|
||||
.getIntValue(-1);
|
||||
API.addOption(new OptionCycled("inventory.cheatmode", 3) {
|
||||
|
||||
@Override
|
||||
public boolean optionValid(int index) {
|
||||
return getLockedMode() == -1 || getLockedMode() == index && NEIInfo.isValidMode(index);
|
||||
}
|
||||
});
|
||||
checkCheatMode();
|
||||
|
||||
tag.getTag("inventory.utilities").setDefaultValue("delete, magnet");
|
||||
API.addOption(new OptionUtilities("inventory.utilities"));
|
||||
|
||||
tag.getTag("inventory.gamemodes").setDefaultValue("creative, creative+, adventure");
|
||||
API.addOption(new OptionGamemodes("inventory.gamemodes"));
|
||||
|
||||
ItemSorter.initConfig(tag);
|
||||
|
||||
tag.getTag("inventory.itemIDs").getIntValue(1);
|
||||
API.addOption(new OptionCycled("inventory.itemIDs", 3, true));
|
||||
|
||||
tag.getTag("inventory.searchmode").getIntValue(1);
|
||||
API.addOption(new OptionCycled("inventory.searchmode", 3, true));
|
||||
|
||||
tag.getTag("world.highlight_tips").getBooleanValue(false);
|
||||
tag.getTag("world.highlight_tips.x").getIntValue(5000);
|
||||
tag.getTag("world.highlight_tips.y").getIntValue(100);
|
||||
API.addOption(new OptionOpenGui("world.highlight_tips", GuiHighlightTips.class));
|
||||
|
||||
tag.getTag("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));
|
||||
|
||||
tag.getTag("inventory.disableMouseScrollTransfer").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.disableMouseScrollTransfer", true));
|
||||
|
||||
tag.getTag("inventory.invertMouseScrollTransfer").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.invertMouseScrollTransfer", true) {
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return isMouseScrollTransferEnabled();
|
||||
}
|
||||
});
|
||||
|
||||
tag.getTag("inventory.cacheItemRendering").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.cacheItemRendering", true));
|
||||
|
||||
tag.getTag("itemLoadingTimeout").getIntValue(500);
|
||||
|
||||
tag.getTag("command.creative").setDefaultValue("/gamemode {0} {1}");
|
||||
API.addOption(new OptionTextField("command.creative"));
|
||||
tag.getTag("command.item").setDefaultValue("/give {0} {1} {2} {3} {4}");
|
||||
API.addOption(new OptionTextField("command.item"));
|
||||
tag.getTag("command.time").setDefaultValue("/time set {0}");
|
||||
API.addOption(new OptionTextField("command.time"));
|
||||
tag.getTag("command.rain").setDefaultValue("/toggledownfall");
|
||||
API.addOption(new OptionTextField("command.rain"));
|
||||
tag.getTag("command.heal").setDefaultValue("");
|
||||
API.addOption(new OptionTextField("command.heal"));
|
||||
|
||||
tag.getTag("inventory.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.useNBTInBookmarks").setComment("Use NBT in Bookmarks").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.useNBTInBookmarks", true));
|
||||
tag.getTag("inventory.bookmarksAnimationEnabled").setComment("REI Style Animation in Bookmarks")
|
||||
.getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.bookmarksAnimationEnabled", true));
|
||||
tag.getTag("inventory.showRecipeMarker").setComment("Show Recipe Marker").getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.showRecipeMarker", true));
|
||||
|
||||
tag.getTag("inventory.showItemQuantityWidget").setComment("Show Item Quantity Widget").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.showItemQuantityWidget", true));
|
||||
|
||||
tag.getTag("inventory.centerSearchWidget").setComment("Center Search Widget").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.centerSearchWidget", 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("inventory.optimize_gui_overlap_computation").setComment("Optimize computation for GUI overlap")
|
||||
.getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("inventory.optimize_gui_overlap_computation", true));
|
||||
|
||||
tag.getTag("inventory.jei_style_cycled_ingredients").setComment("JEI styled cycled ingredients")
|
||||
.getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.jei_style_cycled_ingredients", true));
|
||||
|
||||
tag.getTag("inventory.shift_overlay_recipe")
|
||||
.setComment("Require holding shift to move items when overlaying recipe").getBooleanValue(true);
|
||||
API.addOption(new OptionToggleButton("inventory.shift_overlay_recipe", true));
|
||||
|
||||
tag.getTag("tools.handler_load_from_config").setComment("ADVANCED: Load handlers from config")
|
||||
.getBooleanValue(false);
|
||||
API.addOption(new OptionToggleButton("tools.handler_load_from_config", true) {
|
||||
|
||||
@Override
|
||||
public boolean onClick(int button) {
|
||||
super.onClick(button);
|
||||
GuiRecipeTab.loadHandlerInfo();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
private static void linkOptionList() {
|
||||
OptionList.setOptionList(new OptionList("nei.options") {
|
||||
|
||||
@Override
|
||||
public ConfigSet globalConfigSet() {
|
||||
return global;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfigSet worldConfigSet() {
|
||||
return world;
|
||||
}
|
||||
|
||||
@Override
|
||||
public OptionList configBase() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) {
|
||||
return new GuiNEIOptionList(parent, list, world);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void setDefaultKeyBindings() {
|
||||
API.addHashBind("gui.recipe", Keyboard.KEY_R);
|
||||
API.addHashBind("gui.usage", Keyboard.KEY_U);
|
||||
API.addKeyBind("gui.back", Keyboard.KEY_BACK);
|
||||
API.addHashBind("gui.enchant", Keyboard.KEY_X);
|
||||
API.addHashBind("gui.potion", Keyboard.KEY_P);
|
||||
API.addKeyBind("gui.prev", Keyboard.KEY_PRIOR);
|
||||
API.addKeyBind("gui.next", Keyboard.KEY_NEXT);
|
||||
API.addKeyBind("gui.prev_machine", Keyboard.KEY_UP);
|
||||
API.addKeyBind("gui.next_machine", Keyboard.KEY_DOWN);
|
||||
API.addKeyBind("gui.prev_recipe", Keyboard.KEY_LEFT);
|
||||
API.addKeyBind("gui.next_recipe", Keyboard.KEY_RIGHT);
|
||||
API.addHashBind("gui.hide", Keyboard.KEY_O);
|
||||
API.addHashBind("gui.search", Keyboard.KEY_F);
|
||||
API.addHashBind("gui.bookmark", Keyboard.KEY_A);
|
||||
API.addHashBind("gui.bookmark_recipe", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH);
|
||||
API.addHashBind("gui.bookmark_count", Keyboard.KEY_A + NEIClientUtils.CTRL_HASH);
|
||||
API.addHashBind(
|
||||
"gui.bookmark_recipe_count",
|
||||
Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH + NEIClientUtils.CTRL_HASH);
|
||||
API.addHashBind("gui.overlay", Keyboard.KEY_S);
|
||||
API.addHashBind("gui.overlay_use", Keyboard.KEY_S + NEIClientUtils.SHIFT_HASH);
|
||||
API.addHashBind("gui.overlay_hide", Keyboard.KEY_S + NEIClientUtils.CTRL_HASH);
|
||||
API.addHashBind("gui.hide_bookmarks", Keyboard.KEY_B);
|
||||
API.addKeyBind("gui.getprevioussearch", Keyboard.KEY_UP);
|
||||
API.addKeyBind("gui.getnextsearch", Keyboard.KEY_DOWN);
|
||||
API.addHashBind("gui.next_tooltip", Keyboard.KEY_Z);
|
||||
|
||||
API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9);
|
||||
API.addKeyBind("world.moboverlay", Keyboard.KEY_F7);
|
||||
API.addKeyBind("world.highlight_tips", Keyboard.KEY_NUMPAD0);
|
||||
API.addKeyBind("world.dawn", 0);
|
||||
API.addKeyBind("world.noon", 0);
|
||||
API.addKeyBind("world.dusk", 0);
|
||||
API.addKeyBind("world.midnight", 0);
|
||||
API.addKeyBind("world.rain", 0);
|
||||
API.addKeyBind("world.heal", 0);
|
||||
API.addKeyBind("world.creative", 0);
|
||||
}
|
||||
|
||||
public static OptionList getOptionList() {
|
||||
return OptionList.getOptionList("nei.options");
|
||||
}
|
||||
|
||||
public static void loadWorld(String worldPath) {
|
||||
NEIClientConfig.worldPath = worldPath;
|
||||
|
||||
setInternalEnabled(true);
|
||||
logger.debug("Loading " + (Minecraft.getMinecraft().isSingleplayer() ? "Local" : "Remote") + " World");
|
||||
bootNEI(ClientUtils.getWorld());
|
||||
|
||||
final File specificDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/" + worldPath);
|
||||
final boolean newWorld = !specificDir.exists();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
private static void onWorldLoad(boolean newWorld) {
|
||||
world.config.setComment(
|
||||
"World based configuration of NEI.\nMost of these options can be changed ingame.\nDeleting any element will restore it to it's default value");
|
||||
|
||||
setWorldDefaults();
|
||||
creativeInv = new ItemStack[54];
|
||||
LayoutManager.searchField.setText(getSearchExpression());
|
||||
ItemPanels.itemPanel.quantity.setText(Integer.toString(getItemQuantity()));
|
||||
SubsetWidget.loadHidden();
|
||||
|
||||
if (newWorld && Minecraft.getMinecraft().isSingleplayer()) world.config.getTag("inventory.cheatmode")
|
||||
.setIntValue(NEIClientUtils.mc().playerController.isInCreativeMode() ? 2 : 0);
|
||||
|
||||
NEIInfo.load(ClientUtils.getWorld());
|
||||
}
|
||||
|
||||
private static void setWorldDefaults() {
|
||||
NBTTagCompound nbt = world.nbt;
|
||||
if (!nbt.hasKey("search")) nbt.setString("search", "");
|
||||
if (!nbt.hasKey("quantity")) nbt.setInteger("quantity", 0);
|
||||
if (!nbt.hasKey("validateenchantments")) nbt.setBoolean("validateenchantments", false);
|
||||
|
||||
world.saveNBT();
|
||||
}
|
||||
|
||||
public static int getKeyBinding(String string) {
|
||||
return getSetting("keys." + string).getIntValue(Keyboard.KEY_NONE);
|
||||
}
|
||||
|
||||
public static void setDefaultKeyBinding(String string, int key) {
|
||||
getSetting("keys." + string).getIntValue(key);
|
||||
}
|
||||
|
||||
public static boolean isKeyHashDown(String string) {
|
||||
final int hash = getKeyBinding(string);
|
||||
return hash != Keyboard.CHAR_NONE && hash == NEIClientUtils.getKeyHash();
|
||||
}
|
||||
|
||||
public static String getKeyName(int keyBind, boolean useHash) {
|
||||
return getKeyName(keyBind, useHash, false);
|
||||
}
|
||||
|
||||
public static String getKeyName(int keyBind, boolean useHash, boolean showOnlyHash) {
|
||||
String keyText = "";
|
||||
|
||||
if (useHash) {
|
||||
final String DELIMITER = " + ";
|
||||
if ((keyBind & NEIClientUtils.CTRL_HASH) != 0) {
|
||||
keyText += NEIClientUtils.translate(Minecraft.isRunningOnMac ? "key.ctrl.mac" : "key.ctrl") + DELIMITER;
|
||||
}
|
||||
if ((keyBind & NEIClientUtils.SHIFT_HASH) != 0) {
|
||||
keyText += "SHIFT" + DELIMITER;
|
||||
}
|
||||
if ((keyBind & NEIClientUtils.ALT_HASH) != 0) {
|
||||
keyText += "ALT" + DELIMITER;
|
||||
}
|
||||
}
|
||||
|
||||
if (!showOnlyHash) {
|
||||
keyText += Keyboard.getKeyName(unHashKey(keyBind));
|
||||
}
|
||||
return keyText;
|
||||
}
|
||||
|
||||
public static int unHashKey(int keyBind) {
|
||||
return keyBind & ~(NEIClientUtils.CTRL_HASH | NEIClientUtils.SHIFT_HASH | NEIClientUtils.ALT_HASH);
|
||||
}
|
||||
|
||||
public static void bootNEI(World world) {
|
||||
if (mainNEIConfigLoaded) return;
|
||||
|
||||
// main NEI config loading
|
||||
ItemInfo.load(world);
|
||||
GuiInfo.load();
|
||||
RecipeInfo.load();
|
||||
LayoutManager.load();
|
||||
NEIController.load();
|
||||
RecipeCatalysts.loadCatalystInfo();
|
||||
|
||||
mainNEIConfigLoaded = true;
|
||||
|
||||
new Thread("NEI Plugin Loader") {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
logger.debug("Started NEI plugin loading");
|
||||
ClassDiscoverer classDiscoverer = new ClassDiscoverer(
|
||||
test -> test.startsWith("NEI") && test.endsWith("Config.class"),
|
||||
IConfigureNEI.class);
|
||||
|
||||
classDiscoverer.findClasses();
|
||||
|
||||
for (Class<?> clazz : classDiscoverer.classes) {
|
||||
try {
|
||||
IConfigureNEI config = (IConfigureNEI) clazz.newInstance();
|
||||
config.loadConfig();
|
||||
NEIModContainer.plugins.add(config);
|
||||
logger.debug("Loaded " + clazz.getName());
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to Load " + clazz.getName(), e);
|
||||
}
|
||||
}
|
||||
|
||||
// Set pluginNEIConfigLoaded here before posting the NEIConfigsLoadedEvent. This used to be the other
|
||||
// way around, but apparently if your modpack includes 800 mods the event poster might not return in
|
||||
// time and cause issues when loading a world for a second time as configLoaded is still false. This may
|
||||
// cause issues in case one of the event handler calls the (non-thread-safe) NEI API. I don't expect any
|
||||
// handler to do this, but who knows what modders have come up with...
|
||||
pluginNEIConfigLoaded = true;
|
||||
logger.debug("NEI plugin loading finished");
|
||||
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);
|
||||
return tag != null && tag.value != null;
|
||||
}
|
||||
|
||||
public static ConfigTag getSetting(String s) {
|
||||
return isWorldSpecific(s) ? world.config.getTag(s) : global.config.getTag(s);
|
||||
}
|
||||
|
||||
public static boolean getBooleanSetting(String s) {
|
||||
return getSetting(s).getBooleanValue();
|
||||
}
|
||||
|
||||
public static boolean isHidden() {
|
||||
return !enabledOverride || getBooleanSetting("inventory.hidden");
|
||||
}
|
||||
|
||||
public static boolean isBookmarkPanelHidden() {
|
||||
return !getBooleanSetting("inventory.bookmarksEnabled");
|
||||
}
|
||||
|
||||
public static boolean useNBTInBookmarks() {
|
||||
return getBooleanSetting("inventory.useNBTInBookmarks");
|
||||
}
|
||||
|
||||
public static boolean areBookmarksAnimated() {
|
||||
return getBooleanSetting("inventory.bookmarksAnimationEnabled");
|
||||
}
|
||||
|
||||
public static boolean showRecipeMarker() {
|
||||
return getBooleanSetting("inventory.showRecipeMarker");
|
||||
}
|
||||
|
||||
public static boolean showItemQuantityWidget() {
|
||||
return getBooleanSetting("inventory.showItemQuantityWidget");
|
||||
}
|
||||
|
||||
public static boolean isSearchWidgetCentered() {
|
||||
return getBooleanSetting("inventory.centerSearchWidget");
|
||||
}
|
||||
|
||||
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 optimizeGuiOverlapComputation() {
|
||||
return getBooleanSetting("inventory.optimize_gui_overlap_computation");
|
||||
}
|
||||
|
||||
public static boolean useJEIStyledCycledIngredients() {
|
||||
return getBooleanSetting("inventory.jei_style_cycled_ingredients");
|
||||
}
|
||||
|
||||
public static boolean requireShiftForOverlayRecipe() {
|
||||
return getBooleanSetting("inventory.shift_overlay_recipe");
|
||||
}
|
||||
|
||||
public static boolean isEnabled() {
|
||||
return enabledOverride && getBooleanSetting("inventory.widgetsenabled");
|
||||
}
|
||||
|
||||
public static boolean isLoaded() {
|
||||
return mainNEIConfigLoaded && pluginNEIConfigLoaded;
|
||||
}
|
||||
|
||||
public static boolean loadHandlersFromJar() {
|
||||
return !getBooleanSetting("tools.handler_load_from_config");
|
||||
}
|
||||
|
||||
public static boolean loadCatalystsFromJar() {
|
||||
return !getBooleanSetting("tools.catalyst_load_from_config");
|
||||
}
|
||||
|
||||
public static void setEnabled(boolean flag) {
|
||||
getSetting("inventory.widgetsenabled").setBooleanValue(flag);
|
||||
}
|
||||
|
||||
public static int getItemQuantity() {
|
||||
return world.nbt.getInteger("quantity");
|
||||
}
|
||||
|
||||
public static int getCheatMode() {
|
||||
return getIntSetting("inventory.cheatmode");
|
||||
}
|
||||
|
||||
private static void checkCheatMode() {
|
||||
if (getLockedMode() != -1) setIntSetting("inventory.cheatmode", getLockedMode());
|
||||
}
|
||||
|
||||
public static int getLockedMode() {
|
||||
return getIntSetting("inventory.lockmode");
|
||||
}
|
||||
|
||||
public static int getLayoutStyle() {
|
||||
return getIntSetting("inventory.layoutstyle");
|
||||
}
|
||||
|
||||
public static String getStringSetting(String s) {
|
||||
return getSetting(s).getValue();
|
||||
}
|
||||
|
||||
public static boolean showIDs() {
|
||||
int i = getIntSetting("inventory.itemIDs");
|
||||
return i == 2 || (i == 1 && isEnabled() && !isHidden());
|
||||
}
|
||||
|
||||
public static int getItemLoadingTimeout() {
|
||||
return getIntSetting("itemLoadingTimeout");
|
||||
}
|
||||
|
||||
public static void toggleBooleanSetting(String setting) {
|
||||
ConfigTag tag = getSetting(setting);
|
||||
tag.setBooleanValue(!tag.getBooleanValue());
|
||||
}
|
||||
|
||||
public static void cycleSetting(String setting, int max) {
|
||||
ConfigTag tag = getSetting(setting);
|
||||
tag.setIntValue((tag.getIntValue() + 1) % max);
|
||||
}
|
||||
|
||||
public static int getIntSetting(String setting) {
|
||||
return getSetting(setting).getIntValue();
|
||||
}
|
||||
|
||||
public static void setIntSetting(String setting, int val) {
|
||||
getSetting(setting).setIntValue(val);
|
||||
}
|
||||
|
||||
public static String getSearchExpression() {
|
||||
return world.nbt.getString("search");
|
||||
}
|
||||
|
||||
public static void setSearchExpression(String expression) {
|
||||
world.nbt.setString("search", expression);
|
||||
world.saveNBT();
|
||||
}
|
||||
|
||||
public static boolean isMouseScrollTransferEnabled() {
|
||||
return !getBooleanSetting("inventory.disableMouseScrollTransfer");
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
public static boolean invCreativeMode() {
|
||||
return enabledActions.contains("creative+") && canPerformAction("creative+");
|
||||
}
|
||||
|
||||
public static boolean areDamageVariantsShown() {
|
||||
return hasSMPCounterPart() || getSetting("command.item").getValue().contains("{3}");
|
||||
}
|
||||
|
||||
public static boolean hasSMPCounterPart() {
|
||||
return hasSMPCounterpart;
|
||||
}
|
||||
|
||||
public static void setHasSMPCounterPart(boolean flag) {
|
||||
hasSMPCounterpart = flag;
|
||||
permissableActions.clear();
|
||||
bannedBlocks.clear();
|
||||
disabledActions.clear();
|
||||
enabledActions.clear();
|
||||
}
|
||||
|
||||
public static boolean canCheatItem(ItemStack stack) {
|
||||
return canPerformAction("item") && !bannedBlocks.contains(stack);
|
||||
}
|
||||
|
||||
public static boolean canPerformAction(String name) {
|
||||
if (!isEnabled()) return false;
|
||||
|
||||
if (!modePermitsAction(name)) return false;
|
||||
|
||||
String base = NEIActions.base(name);
|
||||
if (hasSMPCounterpart) return permissableActions.contains(base);
|
||||
|
||||
if (NEIActions.smpRequired(name)) return false;
|
||||
|
||||
String cmd = getStringSetting("command." + base);
|
||||
return cmd != null && cmd.startsWith("/");
|
||||
}
|
||||
|
||||
private static boolean modePermitsAction(String name) {
|
||||
if (getCheatMode() == 0) return false;
|
||||
if (getCheatMode() == 2) return true;
|
||||
|
||||
String[] actions = getStringArrSetting("inventory.utilities");
|
||||
for (String action : actions) if (action.equalsIgnoreCase(name)) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static String[] getStringArrSetting(String s) {
|
||||
return getStringSetting(s).replace(" ", "").split(",");
|
||||
}
|
||||
|
||||
public static void setInternalEnabled(boolean b) {
|
||||
enabledOverride = b;
|
||||
}
|
||||
|
||||
public static void reloadSaves() {
|
||||
File saveDir = new File(CommonUtils.getMinecraftDir(), "saves/NEI/local");
|
||||
if (!saveDir.exists()) return;
|
||||
|
||||
List<SaveFormatComparator> saves;
|
||||
try {
|
||||
saves = Minecraft.getMinecraft().getSaveLoader().getSaveList();
|
||||
} catch (Exception e) {
|
||||
logger.error("Error loading saves", e);
|
||||
return;
|
||||
}
|
||||
HashSet<String> saveFileNames = new HashSet<>();
|
||||
for (SaveFormatComparator save : saves) saveFileNames.add(save.getFileName());
|
||||
|
||||
for (File file : saveDir.listFiles())
|
||||
if (file.isDirectory() && !saveFileNames.contains(file.getName())) ObfuscationRun.deleteDir(file, true);
|
||||
}
|
||||
}
|
||||
+226
-114
@@ -1,46 +1,68 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.inventory.InventoryRange;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.util.LangProxy;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
import codechicken.nei.api.INEIGuiHandler;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
import com.google.common.collect.Iterables;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import static codechicken.nei.NEIClientConfig.canCheatItem;
|
||||
import static codechicken.nei.NEIClientConfig.canPerformAction;
|
||||
import static codechicken.nei.NEIClientConfig.getItemQuantity;
|
||||
import static codechicken.nei.NEIClientConfig.getStringArrSetting;
|
||||
import static codechicken.nei.NEIClientConfig.getStringSetting;
|
||||
import static codechicken.nei.NEIClientConfig.hasSMPCounterPart;
|
||||
import static codechicken.nei.NEIClientConfig.invCreativeMode;
|
||||
import static codechicken.nei.NEIClientConfig.world;
|
||||
|
||||
public class NEIClientUtils extends NEIServerUtils
|
||||
{
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.math.BigInteger;
|
||||
import java.math.RoundingMode;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.DecimalFormatSymbols;
|
||||
import java.text.MessageFormat;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import codechicken.lib.inventory.InventoryRange;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.util.LangProxy;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
import codechicken.nei.api.ItemInfo;
|
||||
|
||||
public class NEIClientUtils extends NEIServerUtils {
|
||||
|
||||
public static LangProxy lang = new LangProxy("nei");
|
||||
|
||||
/** Formats a number with group separator and at most 2 fraction digits. */
|
||||
private static final Map<Locale, DecimalFormat> decimalFormatters = new HashMap<>();
|
||||
|
||||
public static final int ALT_HASH = 1 << 27;
|
||||
public static final int SHIFT_HASH = 1 << 26;
|
||||
public static final int CTRL_HASH = 1 << 25;
|
||||
|
||||
public static Minecraft mc() {
|
||||
return Minecraft.getMinecraft();
|
||||
}
|
||||
@@ -50,8 +72,33 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
}
|
||||
|
||||
public static void printChatMessage(IChatComponent msg) {
|
||||
if (mc().ingameGUI != null)
|
||||
mc().ingameGUI.getChatGUI().printChatMessage(msg);
|
||||
if (mc().ingameGUI != null) mc().ingameGUI.getChatGUI().printChatMessage(msg);
|
||||
}
|
||||
|
||||
private static DecimalFormat getDecimalFormat() {
|
||||
return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> {
|
||||
DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway
|
||||
numberFormat.setGroupingUsed(true);
|
||||
numberFormat.setMaximumFractionDigits(2);
|
||||
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
|
||||
DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols();
|
||||
decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity.
|
||||
numberFormat.setDecimalFormatSymbols(decimalFormatSymbols);
|
||||
|
||||
return numberFormat;
|
||||
});
|
||||
}
|
||||
|
||||
public static String formatNumbers(BigInteger aNumber) {
|
||||
return getDecimalFormat().format(aNumber);
|
||||
}
|
||||
|
||||
public static String formatNumbers(long aNumber) {
|
||||
return getDecimalFormat().format(aNumber);
|
||||
}
|
||||
|
||||
public static String formatNumbers(double aNumber) {
|
||||
return getDecimalFormat().format(aNumber);
|
||||
}
|
||||
|
||||
public static void deleteHeldItem() {
|
||||
@@ -59,7 +106,8 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
}
|
||||
|
||||
public static void dropHeldItem() {
|
||||
mc().playerController.windowClick(((GuiContainer) mc().currentScreen).inventorySlots.windowId, -999, 0, 0, mc().thePlayer);
|
||||
mc().playerController
|
||||
.windowClick(((GuiContainer) mc().currentScreen).inventorySlots.windowId, -999, 0, 0, mc().thePlayer);
|
||||
}
|
||||
|
||||
public static void deleteSlotStack(int slotNumber) {
|
||||
@@ -67,12 +115,11 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
}
|
||||
|
||||
public static void decreaseSlotStack(int slotNumber) {
|
||||
ItemStack stack = slotNumber == -999 ? getHeldItem() : mc().thePlayer.openContainer.getSlot(slotNumber).getStack();
|
||||
if (stack == null)
|
||||
return;
|
||||
ItemStack stack = slotNumber == -999 ? getHeldItem()
|
||||
: mc().thePlayer.openContainer.getSlot(slotNumber).getStack();
|
||||
if (stack == null) return;
|
||||
|
||||
if (stack.stackSize == 1)
|
||||
deleteSlotStack(slotNumber);
|
||||
if (stack.stackSize == 1) deleteSlotStack(slotNumber);
|
||||
else {
|
||||
stack = stack.copy();
|
||||
stack.stackSize--;
|
||||
@@ -88,8 +135,7 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
Container c = getGuiContainer().inventorySlots;
|
||||
for (int i = 0; i < c.inventorySlots.size(); i++) {
|
||||
Slot slot = c.getSlot(i);
|
||||
if (slot == null)
|
||||
continue;
|
||||
if (slot == null) continue;
|
||||
|
||||
ItemStack stack = slot.getStack();
|
||||
if (stack != null && stack.getItem() == type.getItem() && stack.getItemDamage() == type.getItemDamage()) {
|
||||
@@ -106,21 +152,18 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
public static void setSlotContents(int slot, ItemStack item, boolean containerInv) {
|
||||
NEICPH.sendSetSlot(slot, item, containerInv);
|
||||
|
||||
if (slot == -999)
|
||||
mc().thePlayer.inventory.setItemStack(item);
|
||||
if (slot == -999) mc().thePlayer.inventory.setItemStack(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mode -1 = normal cheats, 0 = no infinites, 1 = replenish stack
|
||||
* @param mode -1 = normal cheats, 0 = no infinites, 1 = replenish stack
|
||||
*/
|
||||
public static void cheatItem(ItemStack stack, int button, int mode) {
|
||||
if (!canCheatItem(stack))
|
||||
return;
|
||||
if (!canCheatItem(stack)) return;
|
||||
|
||||
if (mode == -1 && button == 0 && shiftKey() && NEIClientConfig.hasSMPCounterPart()) {
|
||||
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
|
||||
if (!handler.canHandleItem(stack))
|
||||
continue;
|
||||
if (!handler.canHandleItem(stack)) continue;
|
||||
|
||||
ItemStack inf = handler.getInfiniteItem(stack);
|
||||
if (inf != null) {
|
||||
@@ -135,10 +178,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -155,18 +195,24 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
ItemStack stack = copyStack(base, i);
|
||||
if (hasSMPCounterPart()) {
|
||||
ItemStack typestack = copyStack(stack, 1);
|
||||
if (!infinite && !canItemFitInInventory(mc().thePlayer, stack) && (mc().currentScreen instanceof GuiContainer)) {
|
||||
if (!infinite && !canItemFitInInventory(mc().thePlayer, stack)
|
||||
&& (mc().currentScreen instanceof GuiContainer)) {
|
||||
GuiContainer gui = getGuiContainer();
|
||||
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;
|
||||
for(int slotNo : Iterables.concat(handlerSlots)) {
|
||||
for (int slotNo : Iterables.concat(handlerSlots)) {
|
||||
Slot slot = gui.inventorySlots.getSlot(slotNo);
|
||||
if(!slot.isItemValid(typestack) || !InventoryUtils.canStack(slot.getStack(), typestack))
|
||||
continue;
|
||||
if (!slot.isItemValid(typestack) || !InventoryUtils.canStack(slot.getStack(), typestack)) continue;
|
||||
|
||||
int qty = Math.min(stack.stackSize - given, increment);
|
||||
int current = slot.getHasStack() ? slot.getStack().stackSize : 0;
|
||||
@@ -176,17 +222,15 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
slot.putStack(newStack);
|
||||
setSlotContents(slotNo, newStack, true);
|
||||
given += qty;
|
||||
if(given >= stack.stackSize)
|
||||
break;
|
||||
if (given >= stack.stackSize) break;
|
||||
}
|
||||
if(given > 0)
|
||||
NEICPH.sendGiveItem(copyStack(typestack, given), false, false);
|
||||
} else
|
||||
NEICPH.sendGiveItem(stack, infinite, true);
|
||||
if (given > 0) NEICPH.sendGiveItem(copyStack(typestack, given), false, false);
|
||||
} else NEICPH.sendGiveItem(stack, infinite, true);
|
||||
} else {
|
||||
for (int given = 0; given < stack.stackSize; ) {
|
||||
for (int given = 0; given < stack.stackSize;) {
|
||||
int qty = Math.min(stack.stackSize - given, stack.getMaxStackSize());
|
||||
sendCommand(getStringSetting("command.item"),
|
||||
sendCommand(
|
||||
getStringSetting("command.item"),
|
||||
mc().thePlayer.getCommandSenderName(),
|
||||
Item.getIdFromItem(stack.getItem()),
|
||||
qty,
|
||||
@@ -207,24 +251,22 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
}
|
||||
|
||||
public static boolean controlKey() {
|
||||
if (Minecraft.isRunningOnMac) {
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LMETA) || Keyboard.isKeyDown(Keyboard.KEY_RMETA);
|
||||
}
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
|
||||
}
|
||||
|
||||
public static int getGamemode() {
|
||||
if (invCreativeMode())
|
||||
return 2;
|
||||
else if (mc().playerController.isInCreativeMode())
|
||||
return 1;
|
||||
else if (mc().playerController.currentGameType.isAdventure())
|
||||
return 3;
|
||||
else
|
||||
return 0;
|
||||
if (invCreativeMode()) return 2;
|
||||
else if (mc().playerController.isInCreativeMode()) return 1;
|
||||
else if (mc().playerController.currentGameType.isAdventure()) return 3;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
public static boolean isValidGamemode(String s) {
|
||||
return s.equals("survival") ||
|
||||
canPerformAction(s) &&
|
||||
Arrays.asList(getStringArrSetting("inventory.gamemodes")).contains(s);
|
||||
return s.equals("survival")
|
||||
|| canPerformAction(s) && Arrays.asList(getStringArrSetting("inventory.gamemodes")).contains(s);
|
||||
}
|
||||
|
||||
public static int getNextGamemode() {
|
||||
@@ -232,8 +274,7 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
int nmode = mode;
|
||||
while (true) {
|
||||
nmode = (nmode + 1) % NEIActions.gameModes.length;
|
||||
if (nmode == mode || isValidGamemode(NEIActions.gameModes[nmode]))
|
||||
break;
|
||||
if (nmode == mode || isValidGamemode(NEIActions.gameModes[nmode])) break;
|
||||
}
|
||||
return nmode;
|
||||
}
|
||||
@@ -241,13 +282,13 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
public static void cycleGamemode() {
|
||||
int mode = getGamemode();
|
||||
int nmode = getNextGamemode();
|
||||
if (mode == nmode)
|
||||
return;
|
||||
if (mode == nmode) return;
|
||||
|
||||
if (hasSMPCounterPart())
|
||||
NEICPH.sendGamemode(nmode);
|
||||
else
|
||||
sendCommand(getStringSetting("command.creative"), getGameType(nmode), mc().thePlayer.getCommandSenderName());
|
||||
if (hasSMPCounterPart()) NEICPH.sendGamemode(nmode);
|
||||
else sendCommand(
|
||||
getStringSetting("command.creative"),
|
||||
getGameType(nmode),
|
||||
mc().thePlayer.getCommandSenderName());
|
||||
}
|
||||
|
||||
public static long getTime() {
|
||||
@@ -262,22 +303,18 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
long day = (getTime() / 24000L) * 24000L;
|
||||
long newTime = day + 24000L + hour * 1000;
|
||||
|
||||
if (hasSMPCounterPart())
|
||||
NEICPH.sendSetTime(hour);
|
||||
else
|
||||
sendCommand(getStringSetting("command.time"), newTime);
|
||||
if (hasSMPCounterPart()) NEICPH.sendSetTime(hour);
|
||||
else sendCommand(getStringSetting("command.time"), newTime);
|
||||
}
|
||||
|
||||
public static void sendCommand(String command, Object... args) {
|
||||
if (command.length() == 0)
|
||||
return;
|
||||
if (command.length() == 0) return;
|
||||
|
||||
NumberFormat numberformat = NumberFormat.getIntegerInstance();
|
||||
numberformat.setGroupingUsed(false);
|
||||
MessageFormat messageformat = new MessageFormat(command);
|
||||
for (int i = 0; i < args.length; i++)
|
||||
if (args[i] instanceof Integer || args[i] instanceof Long)
|
||||
messageformat.setFormatByArgumentIndex(i, numberformat);
|
||||
for (int i = 0; i < args.length; i++) if (args[i] instanceof Integer || args[i] instanceof Long)
|
||||
messageformat.setFormatByArgumentIndex(i, numberformat);
|
||||
|
||||
mc().thePlayer.sendChatMessage(messageformat.format(args));
|
||||
}
|
||||
@@ -287,22 +324,17 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
}
|
||||
|
||||
public static void toggleRaining() {
|
||||
if (hasSMPCounterPart())
|
||||
NEICPH.sendToggleRain();
|
||||
else
|
||||
sendCommand(getStringSetting("command.rain"), isRaining() ? 0 : 1);
|
||||
if (hasSMPCounterPart()) NEICPH.sendToggleRain();
|
||||
else sendCommand(getStringSetting("command.rain"), isRaining() ? 0 : 1);
|
||||
}
|
||||
|
||||
public static void healPlayer() {
|
||||
if (hasSMPCounterPart())
|
||||
NEICPH.sendHeal();
|
||||
else
|
||||
sendCommand(getStringSetting("command.heal"), mc().thePlayer.getCommandSenderName());
|
||||
if (hasSMPCounterPart()) NEICPH.sendHeal();
|
||||
else sendCommand(getStringSetting("command.heal"), mc().thePlayer.getCommandSenderName());
|
||||
}
|
||||
|
||||
public static void toggleMagnetMode() {
|
||||
if (hasSMPCounterPart())
|
||||
NEICPH.sendToggleMagnetMode();
|
||||
if (hasSMPCounterPart()) NEICPH.sendToggleMagnetMode();
|
||||
}
|
||||
|
||||
public static ArrayList<int[]> concatIntegersToRanges(List<Integer> damages) {
|
||||
@@ -318,24 +350,40 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
continue;
|
||||
}
|
||||
if (next + 1 != i) {
|
||||
ranges.add(new int[]{start, next});
|
||||
ranges.add(new int[] { start, next });
|
||||
start = next = i;
|
||||
continue;
|
||||
}
|
||||
next = i;
|
||||
}
|
||||
ranges.add(new int[]{start, next});
|
||||
ranges.add(new int[] { start, next });
|
||||
return ranges;
|
||||
}
|
||||
|
||||
public static ArrayList<int[]> addIntegersToRanges(List<int[]> ranges, List<Integer> damages) {
|
||||
for (int[] range : ranges)
|
||||
for (int integer = range[0]; integer <= range[1]; integer++)
|
||||
damages.add(integer);
|
||||
for (int[] range : ranges) for (int integer = range[0]; integer <= range[1]; integer++) damages.add(integer);
|
||||
|
||||
return concatIntegersToRanges(damages);
|
||||
}
|
||||
|
||||
public static String cropText(FontRenderer fontRenderer, String text, int containerWidth) {
|
||||
|
||||
int textWidth = fontRenderer.getStringWidth(text);
|
||||
|
||||
if (textWidth > containerWidth) {
|
||||
textWidth += fontRenderer.getStringWidth("...");
|
||||
|
||||
while (textWidth > containerWidth) {
|
||||
textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1));
|
||||
text = text.substring(0, text.length() - 1);
|
||||
}
|
||||
|
||||
return text + "...";
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
public static boolean safeKeyDown(int keyCode) {
|
||||
try {
|
||||
return Keyboard.isKeyDown(keyCode);
|
||||
@@ -347,12 +395,10 @@ 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() {
|
||||
if (mc().currentScreen instanceof GuiContainer)
|
||||
return (GuiContainer) mc().currentScreen;
|
||||
if (mc().currentScreen instanceof GuiContainer) return (GuiContainer) mc().currentScreen;
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -361,7 +407,73 @@ public class NEIClientUtils extends NEIServerUtils
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU);
|
||||
}
|
||||
|
||||
public static int getMetaHash() {
|
||||
if (Keyboard.getEventKeyState()) {
|
||||
int hash = 0;
|
||||
|
||||
if (altKey()) {
|
||||
hash = hash | ALT_HASH;
|
||||
}
|
||||
|
||||
if (shiftKey()) {
|
||||
hash = hash | SHIFT_HASH;
|
||||
}
|
||||
|
||||
if (controlKey()) {
|
||||
hash = hash | CTRL_HASH;
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int getKeyHash() {
|
||||
|
||||
if (Keyboard.getEventKeyState()) {
|
||||
final int keycode = Keyboard.getEventKey();
|
||||
|
||||
if (keycode != Keyboard.KEY_LSHIFT && keycode != Keyboard.KEY_RSHIFT
|
||||
&& keycode != Keyboard.KEY_LCONTROL
|
||||
&& keycode != Keyboard.KEY_RCONTROL
|
||||
&& keycode != Keyboard.KEY_LMENU
|
||||
&& keycode != Keyboard.KEY_RMENU) {
|
||||
return getMetaHash() + keycode;
|
||||
}
|
||||
}
|
||||
|
||||
return Keyboard.CHAR_NONE;
|
||||
}
|
||||
|
||||
public static void playClickSound() {
|
||||
mc().getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
|
||||
mc().getSoundHandler()
|
||||
.playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F));
|
||||
}
|
||||
|
||||
public static void reportErrorBuffered(Throwable e, Set<String> buffer, String cause) {
|
||||
StringWriter sw = new StringWriter();
|
||||
e.printStackTrace(new PrintWriter(sw));
|
||||
String stackTrace = cause + sw;
|
||||
if (buffer.contains(stackTrace)) return;
|
||||
|
||||
System.err.println("Error while rendering: " + cause);
|
||||
e.printStackTrace();
|
||||
buffer.add(stackTrace);
|
||||
|
||||
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
|
||||
if (player != null) {
|
||||
IChatComponent chat = new ChatComponentTranslation("nei.chat.render.error");
|
||||
chat.getChatStyle().setColor(EnumChatFormatting.RED);
|
||||
player.addChatComponentMessage(chat);
|
||||
}
|
||||
}
|
||||
|
||||
public static void reportErrorBuffered(Throwable e, Set<String> buffer, ItemStack cause) {
|
||||
if (cause != null) {
|
||||
reportErrorBuffered(e, buffer, cause.toString());
|
||||
} else {
|
||||
reportErrorBuffered(e, buffer, "null");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package codechicken.nei;
|
||||
|
||||
public class NEICompatibility {
|
||||
}
|
||||
+67
-77
@@ -1,5 +1,17 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.getMousePosition;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainerCreative;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.inventory.SlotCrafting;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import codechicken.nei.api.API;
|
||||
import codechicken.nei.api.GuiInfo;
|
||||
import codechicken.nei.api.IInfiniteItemHandler;
|
||||
@@ -8,20 +20,10 @@ import codechicken.nei.api.ItemInfo;
|
||||
import codechicken.nei.guihook.GuiContainerManager;
|
||||
import codechicken.nei.guihook.IContainerInputHandler;
|
||||
import codechicken.nei.guihook.IContainerSlotClickHandler;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainerCreative;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.inventory.SlotCrafting;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import codechicken.nei.recipe.GuiRecipe;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.util.LinkedList;
|
||||
public class NEIController implements IContainerSlotClickHandler, IContainerInputHandler {
|
||||
|
||||
import static codechicken.lib.gui.GuiDraw.getMousePosition;
|
||||
|
||||
public class NEIController implements IContainerSlotClickHandler, IContainerInputHandler
|
||||
{
|
||||
private static final NEIController instance = new NEIController();
|
||||
|
||||
public static GuiContainerManager manager;
|
||||
@@ -44,12 +46,10 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
deleteMode = false;
|
||||
GuiInfo.clearGuiHandlers();
|
||||
fastTransferManager = null;
|
||||
if (!NEIClientConfig.isEnabled())
|
||||
return;
|
||||
if (!NEIClientConfig.isEnabled()) return;
|
||||
|
||||
fastTransferManager = new FastTransferManager();
|
||||
if (gui instanceof INEIGuiHandler)
|
||||
API.registerNEIGuiHandler((INEIGuiHandler) gui);
|
||||
if (gui instanceof INEIGuiHandler) API.registerNEIGuiHandler((INEIGuiHandler) gui);
|
||||
}
|
||||
|
||||
public static boolean isSpreading(GuiContainer gui) {
|
||||
@@ -57,8 +57,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
}
|
||||
|
||||
public static void updateUnlimitedItems(InventoryPlayer inventory) {
|
||||
if (!NEIClientConfig.canPerformAction("item") || !NEIClientConfig.hasSMPCounterPart())
|
||||
return;
|
||||
if (!NEIClientConfig.canPerformAction("item") || !NEIClientConfig.hasSMPCounterPart()) return;
|
||||
|
||||
LinkedList<ItemStack> beforeStacks = new LinkedList<>();
|
||||
for (int i = 0; i < inventory.getSizeInventory(); i++)
|
||||
@@ -66,8 +65,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
|
||||
for (int i = 0; i < inventory.getSizeInventory(); i++) {
|
||||
ItemStack stack = inventory.getStackInSlot(i);
|
||||
if (stack == null)
|
||||
continue;
|
||||
if (stack == null) continue;
|
||||
|
||||
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers)
|
||||
if (handler.canHandleItem(stack) && handler.isItemInfinite(stack))
|
||||
@@ -78,8 +76,8 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
ItemStack newstack = inventory.getStackInSlot(i);
|
||||
|
||||
if (!NEIServerUtils.areStacksIdentical(beforeStacks.get(i), newstack)) {
|
||||
inventory.setInventorySlotContents(i, beforeStacks.get(i));//restore in case of SMP fail
|
||||
NEIClientUtils.setSlotContents(i, newstack, false);//sends via SMP handler ;)
|
||||
inventory.setInventorySlotContents(i, beforeStacks.get(i)); // restore in case of SMP fail
|
||||
NEIClientUtils.setSlotContents(i, newstack, false); // sends via SMP handler ;)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -87,14 +85,15 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
public static void processCreativeCycling(InventoryPlayer inventory) {
|
||||
if (NEIClientConfig.invCreativeMode() && NEIClientUtils.controlKey()) {
|
||||
if (selectedItem != inventory.currentItem) {
|
||||
if (inventory.currentItem == selectedItem + 1 || (inventory.currentItem == 0 && selectedItem == 8))//foward
|
||||
if (inventory.currentItem == selectedItem + 1 || (inventory.currentItem == 0 && selectedItem == 8)) // foward
|
||||
{
|
||||
NEICPH.sendCreativeScroll(1);
|
||||
inventory.currentItem = selectedItem;
|
||||
} else if (inventory.currentItem == selectedItem - 1 || (inventory.currentItem == 8 && selectedItem == 0)) {
|
||||
NEICPH.sendCreativeScroll(-1);
|
||||
inventory.currentItem = selectedItem;
|
||||
}
|
||||
} else if (inventory.currentItem == selectedItem - 1
|
||||
|| (inventory.currentItem == 8 && selectedItem == 0)) {
|
||||
NEICPH.sendCreativeScroll(-1);
|
||||
inventory.currentItem = selectedItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,50 +102,47 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
|
||||
@Override
|
||||
public void beforeSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier) {
|
||||
if (!NEIClientConfig.isEnabled())
|
||||
return;
|
||||
if (!NEIClientConfig.isEnabled()) return;
|
||||
|
||||
firstheld = NEIClientUtils.getHeldItem();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier, boolean eventconsumed) {
|
||||
if (eventconsumed ||
|
||||
!NEIClientConfig.isEnabled() ||
|
||||
isSpreading(gui))
|
||||
return eventconsumed;
|
||||
public boolean handleSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier,
|
||||
boolean eventconsumed) {
|
||||
if (eventconsumed || !NEIClientConfig.isEnabled() || isSpreading(gui)) return eventconsumed;
|
||||
|
||||
if (deleteMode && slotIndex >= 0 && slot != null) {
|
||||
if (NEIClientUtils.shiftKey() && button == 0) {
|
||||
ItemStack itemstack1 = slot.getStack();
|
||||
if (itemstack1 != null)
|
||||
NEIClientUtils.deleteItemsOfType(itemstack1);
|
||||
if (itemstack1 != null) NEIClientUtils.deleteItemsOfType(itemstack1);
|
||||
|
||||
} else if (button == 1)
|
||||
NEIClientUtils.decreaseSlotStack(slot.slotNumber);
|
||||
else
|
||||
NEIClientUtils.deleteSlotStack(slot.slotNumber);
|
||||
} else if (button == 1) NEIClientUtils.decreaseSlotStack(slot.slotNumber);
|
||||
else NEIClientUtils.deleteSlotStack(slot.slotNumber);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (button == 1 && slot instanceof SlotCrafting)//right click
|
||||
if (button == 1 && slot instanceof SlotCrafting) // right click
|
||||
{
|
||||
for (int i1 = 0; i1 < 64; i1++)//click this slot 64 times
|
||||
for (int i1 = 0; i1 < 64; i1++) // click this slot 64 times
|
||||
manager.handleSlotClick(slot.slotNumber, button, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (NEIClientUtils.controlKey()
|
||||
&& slot != null && slot.getStack() != null
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(GuiInfo.hasCustomSlots(gui))
|
||||
return false;
|
||||
if (GuiInfo.hasCustomSlots(gui)) return false;
|
||||
|
||||
if (slotIndex >= 0 && NEIClientUtils.shiftKey() && NEIClientUtils.getHeldItem() != null && !slot.getHasStack()) {
|
||||
if (slotIndex >= 0 && NEIClientUtils.shiftKey()
|
||||
&& NEIClientUtils.getHeldItem() != null
|
||||
&& !slot.getHasStack()) {
|
||||
ItemStack held = NEIClientUtils.getHeldItem();
|
||||
manager.handleSlotClick(slot.slotNumber, button, 0);
|
||||
if (slot.isItemValid(held) && !ItemInfo.fastTransferExemptions.contains(slot.getClass()))
|
||||
@@ -165,16 +161,15 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
|
||||
@Override
|
||||
public void afterSlotClick(GuiContainer gui, int slotIndex, int button, Slot slot, int modifier) {
|
||||
if (!NEIClientConfig.isEnabled())
|
||||
return;
|
||||
if (!NEIClientConfig.isEnabled()) return;
|
||||
|
||||
ItemStack nowHeld = NEIClientUtils.getHeldItem();
|
||||
|
||||
if (firstheld != nowHeld)
|
||||
pickedUpFromSlot = slotIndex;
|
||||
if (firstheld != nowHeld) pickedUpFromSlot = slotIndex;
|
||||
|
||||
if (NEIClientConfig.canPerformAction("item") && NEIClientConfig.hasSMPCounterPart()) {
|
||||
if (heldStackInfinite != null && slot != null && slot.inventory == NEIClientUtils.mc().thePlayer.inventory) {
|
||||
if (heldStackInfinite != null && slot != null
|
||||
&& slot.inventory == NEIClientUtils.mc().thePlayer.inventory) {
|
||||
ItemStack stack = slot.getStack();
|
||||
if (stack != null) {
|
||||
heldStackInfinite.onPlaceInfinite(stack);
|
||||
@@ -182,8 +177,7 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
NEIClientUtils.setSlotContents(slotIndex, stack, true);
|
||||
}
|
||||
|
||||
if (firstheld != nowHeld)
|
||||
heldStackInfinite = null;
|
||||
if (firstheld != nowHeld) heldStackInfinite = null;
|
||||
|
||||
if (firstheld != nowHeld && nowHeld != null) {
|
||||
for (IInfiniteItemHandler handler : ItemInfo.infiniteHandlers) {
|
||||
@@ -200,14 +194,10 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
|
||||
@Override
|
||||
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
|
||||
if (!NEIClientConfig.isEnabled() ||
|
||||
GuiInfo.hasCustomSlots(gui) ||
|
||||
isSpreading(gui))
|
||||
return false;
|
||||
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui) || isSpreading(gui)) return false;
|
||||
|
||||
Slot slot = GuiContainerManager.getSlotMouseOver(gui);
|
||||
if (slot == null)
|
||||
return false;
|
||||
if (slot == null) return false;
|
||||
|
||||
int slotIndex = slot.slotNumber;
|
||||
|
||||
@@ -224,16 +214,22 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
|
||||
@Override
|
||||
public boolean mouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
|
||||
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui))
|
||||
if (!NEIClientConfig.isEnabled() || GuiInfo.hasCustomSlots(gui)
|
||||
|| !NEIClientConfig.isMouseScrollTransferEnabled())
|
||||
return false;
|
||||
|
||||
// slot in GuiRecipe does not contain actual stack
|
||||
// and scroll should be handled by GuiRecipe, not here
|
||||
if (gui instanceof GuiRecipe) return false;
|
||||
|
||||
Point mousePos = getMousePosition();
|
||||
Slot mouseover = manager.window.getSlotAtPosition(mousePos.x, mousePos.y);
|
||||
if (mouseover != null && mouseover.getHasStack()) {
|
||||
if (scrolled > 0)
|
||||
fastTransferManager.transferItem(manager.window, mouseover.slotNumber);
|
||||
else
|
||||
fastTransferManager.retrieveItem(manager.window, mouseover.slotNumber);
|
||||
if (NEIClientConfig.shouldInvertMouseScrollTransfer()) {
|
||||
scrolled = -scrolled;
|
||||
}
|
||||
if (scrolled > 0) fastTransferManager.transferItem(manager.window, mouseover.slotNumber);
|
||||
else fastTransferManager.retrieveItem(manager.window, mouseover.slotNumber);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -250,32 +246,26 @@ public class NEIController implements IContainerSlotClickHandler, IContainerInpu
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {
|
||||
}
|
||||
public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
|
||||
|
||||
@Override
|
||||
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {
|
||||
}
|
||||
public void onMouseClicked(GuiContainer gui, int mousex, int mousey, int button) {}
|
||||
|
||||
@Override
|
||||
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {
|
||||
}
|
||||
public void onMouseDragged(GuiContainer gui, int mousex, int mousey, int button, long heldTime) {}
|
||||
|
||||
@Override
|
||||
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {
|
||||
}
|
||||
public void onMouseScrolled(GuiContainer gui, int mousex, int mousey, int scrolled) {}
|
||||
|
||||
@Override
|
||||
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {
|
||||
}
|
||||
public void onMouseUp(GuiContainer gui, int mousex, int mousey, int button) {}
|
||||
|
||||
public static boolean canUseDeleteMode() {
|
||||
return !(NEIClientUtils.getGuiContainer() instanceof GuiContainerCreative);
|
||||
}
|
||||
|
||||
public static void toggleDeleteMode() {
|
||||
if(canUseDeleteMode())
|
||||
deleteMode = !deleteMode;
|
||||
if (canUseDeleteMode()) deleteMode = !deleteMode;
|
||||
}
|
||||
|
||||
public static boolean getDeleteMode() {
|
||||
+8
-10
@@ -1,22 +1,20 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.gui.inventory.GuiContainerCreative;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
|
||||
public class NEICreativeGuiHandler extends INEIGuiAdapter
|
||||
{
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
|
||||
public class NEICreativeGuiHandler extends INEIGuiAdapter {
|
||||
|
||||
@Override
|
||||
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility)
|
||||
{
|
||||
if(!(gui instanceof GuiContainerCreative))
|
||||
return currentVisibility;
|
||||
|
||||
if(((GuiContainerCreative)gui).func_147056_g() != CreativeTabs.tabInventory.getTabIndex())
|
||||
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) {
|
||||
if (!(gui instanceof GuiContainerCreative)) return currentVisibility;
|
||||
|
||||
if (((GuiContainerCreative) gui).func_147056_g() != CreativeTabs.tabInventory.getTabIndex())
|
||||
currentVisibility.showItemSection = currentVisibility.enableDeleteMode = false;
|
||||
|
||||
return currentVisibility;
|
||||
}
|
||||
|
||||
}
|
||||
+10
-10
@@ -1,21 +1,21 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.lib.inventory.ContainerExtended;
|
||||
import codechicken.lib.inventory.SlotDummy;
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class NEIDummySlotHandler extends INEIGuiAdapter
|
||||
{
|
||||
import codechicken.lib.inventory.ContainerExtended;
|
||||
import codechicken.lib.inventory.SlotDummy;
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
|
||||
public class NEIDummySlotHandler extends INEIGuiAdapter {
|
||||
|
||||
@Override
|
||||
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button)
|
||||
{
|
||||
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) {
|
||||
Slot slot = gui.getSlotAtPosition(mousex, mousey);
|
||||
if(slot instanceof SlotDummy && slot.isItemValid(draggedStack) && gui.inventorySlots instanceof ContainerExtended)
|
||||
{
|
||||
((SlotDummy)slot).slotClick(draggedStack, button, NEIClientUtils.shiftKey());
|
||||
if (slot instanceof SlotDummy && slot.isItemValid(draggedStack)
|
||||
&& gui.inventorySlots instanceof ContainerExtended) {
|
||||
((SlotDummy) slot).slotClick(draggedStack, button, NEIClientUtils.shiftKey());
|
||||
NEICPH.sendDummySlotSet(slot.slotNumber, slot.getStack());
|
||||
return true;
|
||||
}
|
||||
+52
-20
@@ -1,43 +1,63 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
|
||||
import com.google.common.eventbus.EventBus;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.core.launch.CodeChickenCorePlugin;
|
||||
import codechicken.nei.api.IConfigureNEI;
|
||||
import codechicken.nei.asm.NEICorePlugin;
|
||||
import com.google.common.eventbus.EventBus;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import codechicken.nei.config.IMCHandler;
|
||||
import codechicken.nei.recipe.GuiRecipeTab;
|
||||
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.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.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
public class NEIModContainer extends DummyModContainer {
|
||||
|
||||
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 = "NotEnoughItems";
|
||||
modMetadata.modId = "NotEnoughItems";
|
||||
modMetadata.version = Tags.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<>();
|
||||
deps.add(VersionParser.parseVersionReference("CodeChickenCore@["+CodeChickenCorePlugin.version+",)"));
|
||||
deps.add(VersionParser.parseVersionReference("CodeChickenCore@[" + CodeChickenCorePlugin.version + ",)"));
|
||||
return deps;
|
||||
}
|
||||
|
||||
@@ -47,8 +67,9 @@ public class NEIModContainer extends DummyModContainer
|
||||
}
|
||||
|
||||
private String description;
|
||||
|
||||
private void loadMetadata() {
|
||||
description = super.getMetadata().description.replace("Supporters:", EnumChatFormatting.AQUA+"Supporters:");
|
||||
description = super.getMetadata().description.replace("Supporters:", EnumChatFormatting.AQUA + "Supporters:");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -59,8 +80,7 @@ public class NEIModContainer extends DummyModContainer
|
||||
} else {
|
||||
s_plugins.append(EnumChatFormatting.GREEN).append("Installed plugins: ");
|
||||
for (int i = 0; i < plugins.size(); i++) {
|
||||
if (i > 0)
|
||||
s_plugins.append(", ");
|
||||
if (i > 0) s_plugins.append(", ");
|
||||
IConfigureNEI plugin = plugins.get(i);
|
||||
s_plugins.append(plugin.getName()).append(" ").append(plugin.getVersion());
|
||||
}
|
||||
@@ -80,18 +100,30 @@ public class NEIModContainer extends DummyModContainer
|
||||
|
||||
@Subscribe
|
||||
public void preInit(FMLPreInitializationEvent event) {
|
||||
if (CommonUtils.isClient())
|
||||
ClientHandler.preInit();
|
||||
gregTech5Loaded = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi_post");
|
||||
if (CommonUtils.isClient()) ClientHandler.preInit();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void init(FMLInitializationEvent event) {
|
||||
if (CommonUtils.isClient())
|
||||
ClientHandler.load();
|
||||
if (CommonUtils.isClient()) ClientHandler.load();
|
||||
|
||||
ServerHandler.load();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void postInit(FMLPostInitializationEvent event) {
|
||||
if (CommonUtils.isClient()) {
|
||||
GuiRecipeTab.loadHandlerInfo();
|
||||
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,53 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||
import net.minecraft.client.renderer.InventoryEffectRenderer;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
|
||||
import codechicken.lib.vec.Rectangle4i;
|
||||
import codechicken.nei.api.INEIGuiAdapter;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,8 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.core.ServerUtils;
|
||||
import codechicken.lib.inventory.SlotDummy;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.lib.packet.PacketCustom.IServerPacketHandler;
|
||||
import codechicken.lib.vec.BlockCoord;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.inventory.InventoryBasic;
|
||||
@@ -17,15 +13,19 @@ import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityMobSpawner;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.Set;
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.core.ServerUtils;
|
||||
import codechicken.lib.inventory.SlotDummy;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import codechicken.lib.packet.PacketCustom.IServerPacketHandler;
|
||||
import codechicken.lib.vec.BlockCoord;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
|
||||
public class NEISPH implements IServerPacketHandler {
|
||||
|
||||
public class NEISPH implements IServerPacketHandler
|
||||
{
|
||||
@Override
|
||||
public void handlePacket(PacketCustom packet, EntityPlayerMP sender, INetHandlerPlayServer netHandler) {
|
||||
if (!NEIServerConfig.authenticatePacket(sender, packet))
|
||||
return;
|
||||
if (!NEIServerConfig.authenticatePacket(sender, packet)) return;
|
||||
|
||||
switch (packet.getType()) {
|
||||
case 1:
|
||||
@@ -67,6 +67,9 @@ public class NEISPH implements IServerPacketHandler
|
||||
case 15:
|
||||
handleMobSpawnerID(sender.worldObj, packet.readCoord(), packet.readString());
|
||||
break;
|
||||
case 16:
|
||||
handleRequestContainer(sender, packet.readInt());
|
||||
break;
|
||||
case 21:
|
||||
openEnchantmentGui(sender);
|
||||
break;
|
||||
@@ -90,8 +93,7 @@ public class NEISPH implements IServerPacketHandler
|
||||
ItemStack stack = packet.readItemStack(true);
|
||||
|
||||
Slot slot = sender.openContainer.getSlot(slotNumber);
|
||||
if (slot instanceof SlotDummy)
|
||||
slot.putStack(stack);
|
||||
if (slot instanceof SlotDummy) slot.putStack(stack);
|
||||
}
|
||||
|
||||
private void handleMobSpawnerID(World world, BlockCoord coord, String mobtype) {
|
||||
@@ -103,6 +105,11 @@ public class NEISPH implements IServerPacketHandler
|
||||
}
|
||||
}
|
||||
|
||||
private void handleRequestContainer(EntityPlayerMP sender, int containerSize) {
|
||||
if (sender.openContainer.getInventory().size() != containerSize) return;
|
||||
sender.sendContainerToPlayer(sender.openContainer);
|
||||
}
|
||||
|
||||
private void handlePropertyChange(EntityPlayerMP sender, PacketCustom packet) {
|
||||
String name = packet.readString();
|
||||
if (NEIServerConfig.canPlayerPerformAction(sender.getCommandSenderName(), name))
|
||||
@@ -111,12 +118,19 @@ public class NEISPH implements IServerPacketHandler
|
||||
|
||||
public static void processCreativeInv(EntityPlayerMP sender, boolean open) {
|
||||
if (open) {
|
||||
ServerUtils.openSMPContainer(sender, new ContainerCreativeInv(sender, new ExtendedCreativeInv(NEIServerConfig.forPlayer(sender.getCommandSenderName()), Side.SERVER)), (player, windowId) -> {
|
||||
PacketCustom packet = new PacketCustom(channel, 23);
|
||||
packet.writeBoolean(true);
|
||||
packet.writeByte(windowId);
|
||||
packet.sendToPlayer(player);
|
||||
});
|
||||
ServerUtils.openSMPContainer(
|
||||
sender,
|
||||
new ContainerCreativeInv(
|
||||
sender,
|
||||
new ExtendedCreativeInv(
|
||||
NEIServerConfig.forPlayer(sender.getCommandSenderName()),
|
||||
Side.SERVER)),
|
||||
(player, windowId) -> {
|
||||
PacketCustom packet = new PacketCustom(channel, 23);
|
||||
packet.writeBoolean(true);
|
||||
packet.writeByte(windowId);
|
||||
packet.sendToPlayer(player);
|
||||
});
|
||||
} else {
|
||||
sender.closeContainer();
|
||||
PacketCustom packet = new PacketCustom(channel, 23);
|
||||
@@ -135,7 +149,8 @@ public class NEISPH implements IServerPacketHandler
|
||||
ItemStack item = packet.readItemStack();
|
||||
|
||||
ItemStack old = NEIServerUtils.getSlotContents(player, slot, container);
|
||||
boolean deleting = item == null || old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
|
||||
boolean deleting = item == null
|
||||
|| old != null && NEIServerUtils.areStacksSameType(item, old) && item.stackSize < old.stackSize;
|
||||
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), deleting ? "delete" : "item"))
|
||||
NEIServerUtils.setSlotContents(player, slot, item, container);
|
||||
}
|
||||
@@ -150,17 +165,19 @@ public class NEISPH implements IServerPacketHandler
|
||||
}
|
||||
|
||||
private void openEnchantmentGui(EntityPlayerMP player) {
|
||||
ServerUtils.openSMPContainer(player, new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0), (player1, windowId) -> {
|
||||
PacketCustom packet = new PacketCustom(channel, 21);
|
||||
packet.writeByte(windowId);
|
||||
packet.sendToPlayer(player1);
|
||||
});
|
||||
ServerUtils.openSMPContainer(
|
||||
player,
|
||||
new ContainerEnchantmentModifier(player.inventory, player.worldObj, 0, 0, 0),
|
||||
(player1, windowId) -> {
|
||||
PacketCustom packet = new PacketCustom(channel, 21);
|
||||
packet.writeByte(windowId);
|
||||
packet.sendToPlayer(player1);
|
||||
});
|
||||
}
|
||||
|
||||
private void openPotionGui(EntityPlayerMP player, PacketCustom packet) {
|
||||
InventoryBasic b = new InventoryBasic("potionStore", true, 9);
|
||||
for (int i = 0; i < b.getSizeInventory(); i++)
|
||||
b.setInventorySlotContents(i, packet.readItemStack());
|
||||
for (int i = 0; i < b.getSizeInventory(); i++) b.setInventorySlotContents(i, packet.readItemStack());
|
||||
ServerUtils.openSMPContainer(player, new ContainerPotionCreator(player.inventory, b), (player1, windowId) -> {
|
||||
PacketCustom packet1 = new PacketCustom(channel, 24);
|
||||
packet1.writeByte(windowId);
|
||||
@@ -169,17 +186,11 @@ public class NEISPH implements IServerPacketHandler
|
||||
}
|
||||
|
||||
public static void sendActionDisabled(int dim, String name, boolean disable) {
|
||||
new PacketCustom(channel, 11)
|
||||
.writeString(name)
|
||||
.writeBoolean(disable)
|
||||
.sendToDimension(dim);
|
||||
new PacketCustom(channel, 11).writeString(name).writeBoolean(disable).sendToDimension(dim);
|
||||
}
|
||||
|
||||
public static void sendActionEnabled(EntityPlayerMP player, String name, boolean enable) {
|
||||
new PacketCustom(channel, 12)
|
||||
.writeString(name)
|
||||
.writeBoolean(enable)
|
||||
.sendToPlayer(player);
|
||||
new PacketCustom(channel, 12).writeString(name).writeBoolean(enable).sendToPlayer(player);
|
||||
}
|
||||
|
||||
private void sendLoginState(EntityPlayerMP player) {
|
||||
@@ -190,12 +201,9 @@ public class NEISPH implements IServerPacketHandler
|
||||
PlayerSave playerSave = NEIServerConfig.forPlayer(player.getCommandSenderName());
|
||||
|
||||
for (String name : NEIActions.nameActionMap.keySet()) {
|
||||
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name))
|
||||
actions.add(name);
|
||||
if (NEIServerConfig.isActionDisabled(player.dimension, name))
|
||||
disabled.add(name);
|
||||
if (playerSave.isActionEnabled(name))
|
||||
enabled.add(name);
|
||||
if (NEIServerConfig.canPlayerPerformAction(player.getCommandSenderName(), name)) actions.add(name);
|
||||
if (NEIServerConfig.isActionDisabled(player.dimension, name)) disabled.add(name);
|
||||
if (playerSave.isActionEnabled(name)) enabled.add(name);
|
||||
}
|
||||
for (ItemStackMap.Entry<Set<String>> entry : NEIServerConfig.bannedItems.entries())
|
||||
if (!NEIServerConfig.isPlayerInList(player.getCommandSenderName(), entry.value, true))
|
||||
@@ -204,20 +212,16 @@ public class NEISPH implements IServerPacketHandler
|
||||
PacketCustom packet = new PacketCustom(channel, 10);
|
||||
|
||||
packet.writeByte(actions.size());
|
||||
for (String s : actions)
|
||||
packet.writeString(s);
|
||||
for (String s : actions) packet.writeString(s);
|
||||
|
||||
packet.writeByte(disabled.size());
|
||||
for (String s : disabled)
|
||||
packet.writeString(s);
|
||||
for (String s : disabled) packet.writeString(s);
|
||||
|
||||
packet.writeByte(enabled.size());
|
||||
for (String s : enabled)
|
||||
packet.writeString(s);
|
||||
for (String s : enabled) packet.writeString(s);
|
||||
|
||||
packet.writeInt(bannedItems.size());
|
||||
for (ItemStack stack : bannedItems)
|
||||
packet.writeItemStack(stack);
|
||||
for (ItemStack stack : bannedItems) packet.writeItemStack(stack);
|
||||
|
||||
packet.sendToPlayer(player);
|
||||
}
|
||||
+52
-50
@@ -1,23 +1,5 @@
|
||||
package codechicken.nei;
|
||||
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.core.ServerUtils;
|
||||
import codechicken.lib.config.ConfigFile;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.JsonToNBT;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.DimensionManager;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.PrintWriter;
|
||||
@@ -30,8 +12,29 @@ import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class NEIServerConfig
|
||||
{
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.JsonToNBT;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.DimensionManager;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import codechicken.core.CommonUtils;
|
||||
import codechicken.core.ServerUtils;
|
||||
import codechicken.lib.config.ConfigFile;
|
||||
import codechicken.lib.inventory.InventoryUtils;
|
||||
import codechicken.lib.packet.PacketCustom;
|
||||
|
||||
public class NEIServerConfig {
|
||||
|
||||
private static MinecraftServer server;
|
||||
|
||||
public static Logger logger = LogManager.getLogger("NotEnoughItems");
|
||||
@@ -62,7 +65,7 @@ public class NEIServerConfig
|
||||
try {
|
||||
File file = new File(getSaveDir(world), "world.dat");
|
||||
NBTTagCompound tag = NEIServerUtils.readNBT(file);
|
||||
if(tag == null) tag = new NBTTagCompound();
|
||||
if (tag == null) tag = new NBTTagCompound();
|
||||
dimTags.put(CommonUtils.getDimension(world), tag);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
@@ -75,7 +78,8 @@ public class NEIServerConfig
|
||||
|
||||
serverConfig.setNewLineMode(1);
|
||||
serverConfig.getTag("permissions").useBraces();
|
||||
serverConfig.getTag("permissions").setComment("List of players who can use these features.\nEg. time=CodeChicken, Friend1");
|
||||
serverConfig.getTag("permissions")
|
||||
.setComment("List of players who can use these features.\nEg. time=CodeChicken, Friend1");
|
||||
|
||||
setDefaultFeature("time");
|
||||
setDefaultFeature("rain");
|
||||
@@ -93,13 +97,11 @@ public class NEIServerConfig
|
||||
}
|
||||
|
||||
private static void setDefaultFeature(String featurename, String... names) {
|
||||
if (names.length == 0)
|
||||
names = new String[]{"OP"};
|
||||
if (names.length == 0) names = new String[] { "OP" };
|
||||
|
||||
StringBuilder list = new StringBuilder();
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
if (i >= 1)
|
||||
list.append(", ");
|
||||
if (i >= 1) list.append(", ");
|
||||
list.append(names[i]);
|
||||
}
|
||||
serverConfig.getTag("permissions." + featurename).setDefaultValue(list.toString());
|
||||
@@ -107,7 +109,11 @@ public class NEIServerConfig
|
||||
|
||||
private static void saveWorld(int dim) {
|
||||
try {
|
||||
File file = new File(getSaveDir(DimensionManager.getWorld(dim)), "world.dat");
|
||||
final File saveDir = getSaveDir(DimensionManager.getWorld(dim));
|
||||
if (!saveDir.isDirectory()) {
|
||||
FileUtils.forceMkdir(saveDir);
|
||||
}
|
||||
File file = new File(saveDir, "world.dat");
|
||||
NEIServerUtils.writeNBT(dimTags.get(dim), file);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
@@ -119,14 +125,12 @@ public class NEIServerConfig
|
||||
}
|
||||
|
||||
public static boolean isPlayerInList(String playername, Set<String> list, boolean allowCards) {
|
||||
if (playername.equals("CONSOLE"))
|
||||
return list.contains(playername);
|
||||
if (playername.equals("CONSOLE")) return list.contains(playername);
|
||||
|
||||
playername = playername.toLowerCase();
|
||||
|
||||
if (allowCards) {
|
||||
if (list.contains("ALL"))
|
||||
return true;
|
||||
if (list.contains("ALL")) return true;
|
||||
if ((ServerUtils.isPlayerOP(playername) || ServerUtils.isPlayerOwner(playername)) && list.contains("OP"))
|
||||
return true;
|
||||
}
|
||||
@@ -173,8 +177,7 @@ public class NEIServerConfig
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int i = 0;
|
||||
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
|
||||
if (i != 0)
|
||||
sb.append(", ");
|
||||
if (i != 0) sb.append(", ");
|
||||
|
||||
sb.append(iterator.next());
|
||||
}
|
||||
@@ -185,7 +188,7 @@ public class NEIServerConfig
|
||||
private static void loadBannedItems() {
|
||||
bannedItems.clear();
|
||||
File file = new File(saveDir, "banneditems.cfg");
|
||||
if(!file.exists()) {
|
||||
if (!file.exists()) {
|
||||
bannedItems.put(new ItemStack(Blocks.command_block), new HashSet<>(Collections.singletonList("NONE")));
|
||||
saveBannedItems();
|
||||
return;
|
||||
@@ -193,22 +196,20 @@ public class NEIServerConfig
|
||||
try {
|
||||
FileReader r = new FileReader(file);
|
||||
int line = 0;
|
||||
for(String s : IOUtils.readLines(r)) {
|
||||
if(s.charAt(0) == '#' || s.trim().length() == 0)
|
||||
continue;
|
||||
for (String s : IOUtils.readLines(r)) {
|
||||
if (s.charAt(0) == '#' || s.trim().length() == 0) continue;
|
||||
int delim = s.lastIndexOf('=');
|
||||
if(delim < 0) {
|
||||
logger.error("line "+line+": Missing =");
|
||||
if (delim < 0) {
|
||||
logger.error("line " + line + ": Missing =");
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
NBTTagCompound key = (NBTTagCompound) JsonToNBT.func_150315_a(s.substring(0, delim));
|
||||
Set<String> values = new HashSet<>();
|
||||
for(String s2 : s.substring(delim+1).split(","))
|
||||
values.add(s2.trim());
|
||||
for (String s2 : s.substring(delim + 1).split(",")) values.add(s2.trim());
|
||||
bannedItems.put(InventoryUtils.loadPersistant(key), values);
|
||||
} catch (Exception e) {
|
||||
logger.error("line "+line+": "+e.getMessage());
|
||||
logger.error("line " + line + ": " + e.getMessage());
|
||||
}
|
||||
}
|
||||
r.close();
|
||||
@@ -220,22 +221,22 @@ public class NEIServerConfig
|
||||
public static void saveBannedItems() {
|
||||
File file = new File(saveDir, "banneditems.cfg");
|
||||
try {
|
||||
if(!file.exists())
|
||||
file.createNewFile();
|
||||
if (!file.exists()) file.createNewFile();
|
||||
|
||||
PrintWriter p = new PrintWriter(file);
|
||||
p.println("#Saved in this format for external editing. The format isn't that hard to figure out. If you think you're up to it, modify it here!");
|
||||
p.println(
|
||||
"#Saved in this format for external editing. The format isn't that hard to figure out. If you think you're up to it, modify it here!");
|
||||
|
||||
for (ItemStackMap.Entry<Set<String>> entry : bannedItems.entries()) {
|
||||
NBTTagCompound key = InventoryUtils.savePersistant(entry.key, new NBTTagCompound());
|
||||
key.removeTag("Count");
|
||||
if(key.getByte("Damage") == 0) key.removeTag("Damage");
|
||||
if (key.getByte("Damage") == 0) key.removeTag("Damage");
|
||||
|
||||
p.print(key.toString());
|
||||
p.print("=[");
|
||||
int i = 0;
|
||||
for (String s : entry.value) {
|
||||
if(i++ != 0) p.print(", ");
|
||||
if (i++ != 0) p.print(", ");
|
||||
p.print(s);
|
||||
}
|
||||
p.println("]");
|
||||
@@ -252,14 +253,15 @@ public class NEIServerConfig
|
||||
|
||||
public static void loadPlayer(EntityPlayer player) {
|
||||
logger.debug("Loading Player: " + player.getGameProfile().getName());
|
||||
playerSaves.put(player.getCommandSenderName(), new PlayerSave(player.getCommandSenderName(), new File(saveDir, "players")));
|
||||
playerSaves.put(
|
||||
player.getCommandSenderName(),
|
||||
new PlayerSave(player.getCommandSenderName(), new File(saveDir, "players")));
|
||||
}
|
||||
|
||||
public static void unloadPlayer(EntityPlayer player) {
|
||||
logger.debug("Unloading Player: " + player.getCommandSenderName());
|
||||
PlayerSave playerSave = playerSaves.remove(player.getCommandSenderName());
|
||||
if (playerSave != null)
|
||||
playerSave.save();
|
||||
if (playerSave != null) playerSave.save();
|
||||
}
|
||||
|
||||
public static boolean authenticatePacket(EntityPlayerMP sender, PacketCustom packet) {
|
||||
Loaded 100 of 256 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user