Initial commit (Forge 1291).
This commit is contained in:
		
							
								
								
									
										12
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
* text eol=lf
 | 
			
		||||
*.bat text eol=crlf
 | 
			
		||||
*.patch text eol=lf
 | 
			
		||||
*.cfg text eol=lf
 | 
			
		||||
*.py text eol=lf
 | 
			
		||||
*.png binary
 | 
			
		||||
*.exe binary
 | 
			
		||||
*.dll binary
 | 
			
		||||
*.zip binary
 | 
			
		||||
*.pyd binary
 | 
			
		||||
*.jar binary
 | 
			
		||||
*.lzma binary
 | 
			
		||||
							
								
								
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
!.gitignore
 | 
			
		||||
 | 
			
		||||
# eclipse
 | 
			
		||||
/eclipse
 | 
			
		||||
 | 
			
		||||
# gradle
 | 
			
		||||
build
 | 
			
		||||
.gradle
 | 
			
		||||
 | 
			
		||||
*.DS_Store
 | 
			
		||||
							
								
								
									
										7
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
[submodule "bukkit"]
 | 
			
		||||
	path = bukkit
 | 
			
		||||
	url = https://github.com/gamerforEA/Bukkit.git
 | 
			
		||||
[submodule "forge"]
 | 
			
		||||
	path = forge
 | 
			
		||||
	url = https://github.com/gamerforEA/MinecraftForge.git
 | 
			
		||||
	branch = 1.7.10
 | 
			
		||||
							
								
								
									
										165
									
								
								LGPL.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								LGPL.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,165 @@
 | 
			
		||||
                   GNU LESSER GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 3, 29 June 2007
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 2007 Free Software Foundation, Inc. <http://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.
 | 
			
		||||
							
								
								
									
										674
									
								
								LICENCE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										674
									
								
								LICENCE.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,674 @@
 | 
			
		||||
                    GNU GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 3, 29 June 2007
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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
 | 
			
		||||
<http://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
 | 
			
		||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
 | 
			
		||||
							
								
								
									
										92
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
			
		||||
Cauldron
 | 
			
		||||
===========
 | 
			
		||||
Note: 1.7.2 repository has been moved to [branch v172](https://github.com/MinecraftPortCentral/Cauldron/tree/v172)
 | 
			
		||||
 | 
			
		||||
A Forge/Bukkit/Spigot Minecraft Server
 | 
			
		||||
 | 
			
		||||
Compilation
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
We use Gradle to handle our dependencies.
 | 
			
		||||
 | 
			
		||||
1. Checkout project.
 | 
			
		||||
2. Init submodules : git submodule update --init --recursive -- depth 1
 | 
			
		||||
3. Setup workspace : gradlew setupCauldron
 | 
			
		||||
4. Build binaries  : gradlew buildPackages
 | 
			
		||||
Note: all binaries will be in distributions folder
 | 
			
		||||
 | 
			
		||||
Supporting Cauldron
 | 
			
		||||
--------
 | 
			
		||||
Click here to [Donate to bloodmc](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YNCKCALNQKFAS)
 | 
			
		||||
Click here to [Become a Patreon] (http://www.patreon.com/bloodmc)
 | 
			
		||||
 | 
			
		||||
Top Patron Supporters
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
* isiliden
 | 
			
		||||
* eonic
 | 
			
		||||
* trab
 | 
			
		||||
* jamescowens
 | 
			
		||||
* SFTMedia
 | 
			
		||||
* Shmeeb
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Profiling
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
We use YourKit as our Java Profiler.
 | 
			
		||||
 | 
			
		||||
YourKit is kindly supporting open source projects with its full-featured Java Profiler.
 | 
			
		||||
YourKit, LLC is the creator of innovative and intelligent tools for profiling
 | 
			
		||||
Java and .NET applications. Take a look at YourKit's leading software products:
 | 
			
		||||
* [YourKit Java Profiler](http://www.yourkit.com/java/profiler/index.jsp)
 | 
			
		||||
* [YourKit .NET Profiler](http://www.yourkit.com/.net/profiler/index.jsp)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Coding and Pull Request Conventions
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
* We generally follow the Sun/Oracle coding standards.
 | 
			
		||||
* No tabs; use 4 spaces instead.
 | 
			
		||||
* No trailing whitespaces.
 | 
			
		||||
* No CRLF line endings, LF only; will be converted automatically by git
 | 
			
		||||
* No 80 column limit or 'weird' midstatement newlines.
 | 
			
		||||
* The number of commits in a pull request should be kept to a minimum (squish them into one most of the time - use common sense!).
 | 
			
		||||
* No merges should be included in pull requests unless the pull request's purpose is a merge.
 | 
			
		||||
* Pull requests should be tested (does it compile? AND does it work?) before submission.
 | 
			
		||||
* Any major additions should have documentation ready and provided if applicable (this is usually the case).
 | 
			
		||||
* Most pull requests should be accompanied by a corresponding GitHub ticket so we can associate commits with GitHub issues (this is primarily for changelog generation on ci.md-5.net).
 | 
			
		||||
* Try to follow test driven development where applicable.
 | 
			
		||||
 | 
			
		||||
If you make changes to or add upstream classes (net.minecraft, net.minecraftforge, cpw.mods.fml, org.bukkit, org.spigotmc) it is mandatory to:
 | 
			
		||||
 | 
			
		||||
* Make a separate commit adding the new net.minecraft classes (commit message: "Added x for diff visibility" or so).
 | 
			
		||||
* Then make further commits with your changes.
 | 
			
		||||
* Mark your changes with:
 | 
			
		||||
    * 1 line; add a trailing: `// Cauldron [- Optional reason]`
 | 
			
		||||
    * 2+ lines; add
 | 
			
		||||
        * Before: `// Cauldron start [- Optional comment]`
 | 
			
		||||
        * After: `// Cauldron end`
 | 
			
		||||
* Keep the diffs to a minimum (*somewhat* important)
 | 
			
		||||
 | 
			
		||||
Tips to get your pull request accepted
 | 
			
		||||
-----------
 | 
			
		||||
Making sure you follow the above conventions is important, but just the beginning. Follow these tips to better the chances of your pull request being accepted and pulled.
 | 
			
		||||
 | 
			
		||||
* Make sure you follow all of our conventions to the letter.
 | 
			
		||||
* Make sure your code compiles under Java 6.
 | 
			
		||||
* Provide proper JavaDocs where appropriate.
 | 
			
		||||
* Provide proper accompanying documentation where appropriate.
 | 
			
		||||
* Test your code.
 | 
			
		||||
* Make sure to follow coding best practices.
 | 
			
		||||
* Provide a test plugin/mod binary and source for us to test your code with.
 | 
			
		||||
* Your pull request should link to accompanying pull requests.
 | 
			
		||||
* The description of your pull request should provide detailed information on the pull along with justification of the changes where applicable.
 | 
			
		||||
 | 
			
		||||
Credits
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
* [MCP](http://mcp.ocean-labs.de) - permission to use data to make Cauldron.
 | 
			
		||||
* [Forge](http://www.minecraftforge.net) - mod support.
 | 
			
		||||
* [CraftBukkit](http://bukkit.org) - plugin support.
 | 
			
		||||
* [Spigot](http://www.spigotmc.org) - performance optimizations.
 | 
			
		||||
							
								
								
									
										73
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								build.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
buildscript {
 | 
			
		||||
    repositories {
 | 
			
		||||
        mavenCentral()
 | 
			
		||||
        mavenLocal()
 | 
			
		||||
        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'
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
apply plugin: 'maven'
 | 
			
		||||
apply plugin: 'cauldron'
 | 
			
		||||
 | 
			
		||||
minecraft {
 | 
			
		||||
    version = '1.7.10'
 | 
			
		||||
    mcpVersion = '9.05'
 | 
			
		||||
    mainClass = 'cpw.mods.fml.relauncher.ServerLaunchWrapper'
 | 
			
		||||
    tweakClass = 'cpw.mods.fml.common.launcher.FMLTweaker'
 | 
			
		||||
    installerVersion = "1.4"
 | 
			
		||||
    subprojects {
 | 
			
		||||
        repositories {
 | 
			
		||||
            mavenLocal()
 | 
			
		||||
            maven {
 | 
			
		||||
                name = "sonatype"
 | 
			
		||||
                url = "https://oss.sonatype.org/content/repositories/snapshots/"
 | 
			
		||||
            }
 | 
			
		||||
            flatDir {
 | 
			
		||||
                name "fileRepo"
 | 
			
		||||
                dirs "repo"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    srgExtra "PK: org/bukkit/craftbukkit org/bukkit/craftbukkit/v1_7_R4"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
group = 'net.minecraftforge'
 | 
			
		||||
ext.mcVersion = "1.7.10"
 | 
			
		||||
ext.cauldronVersion = "1"
 | 
			
		||||
ext.forgeVersion = "1291"
 | 
			
		||||
ext.bukkitVersion = "01"
 | 
			
		||||
version = "${mcVersion}-${cauldronVersion}.${forgeVersion}.${bukkitVersion}.0"
 | 
			
		||||
 | 
			
		||||
jenkins {
 | 
			
		||||
    job = 'Cauldron'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
launch4j {
 | 
			
		||||
    jreMinVersion = '1.6.0'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tasks.packageUniversal {
 | 
			
		||||
    classifier = 'server'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tasks.packageUniversal.manifest { 
 | 
			
		||||
    attributes([
 | 
			
		||||
    'Implementation-Vendor': 'Cauldron',
 | 
			
		||||
    'Implementation-Title': 'Cauldron',
 | 
			
		||||
    'Implementation-Version': 'git-Cauldron-Reloaded-'+project.version,
 | 
			
		||||
    'Forge-Version': '10.13.2.1291',
 | 
			
		||||
    'Specification-Vendor': 'Bukkit Team',
 | 
			
		||||
    'Specification-Title': 'Bukkit',
 | 
			
		||||
    'Specification-Version': '1.7.10-R0.1-SNAPSHOT'
 | 
			
		||||
    ])
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								eclipse-workspace-dev.zip
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								eclipse-workspace-dev.zip
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										164
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,164 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
##############################################################################
 | 
			
		||||
##
 | 
			
		||||
##  Gradle start up script for UN*X
 | 
			
		||||
##
 | 
			
		||||
##############################################################################
 | 
			
		||||
 | 
			
		||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
			
		||||
DEFAULT_JVM_OPTS=""
 | 
			
		||||
 | 
			
		||||
APP_NAME="Gradle"
 | 
			
		||||
APP_BASE_NAME=`basename "$0"`
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
case "`uname`" in
 | 
			
		||||
  CYGWIN* )
 | 
			
		||||
    cygwin=true
 | 
			
		||||
    ;;
 | 
			
		||||
  Darwin* )
 | 
			
		||||
    darwin=true
 | 
			
		||||
    ;;
 | 
			
		||||
  MINGW* )
 | 
			
		||||
    msys=true
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# For Cygwin, ensure paths are in UNIX format before anything is touched.
 | 
			
		||||
if $cygwin ; then
 | 
			
		||||
    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# 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\"`/" >&-
 | 
			
		||||
APP_HOME="`pwd -P`"
 | 
			
		||||
cd "$SAVED" >&-
 | 
			
		||||
 | 
			
		||||
CLASSPATH=$APP_HOME/forge/fml/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" ] ; 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"`
 | 
			
		||||
 | 
			
		||||
    # 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
 | 
			
		||||
 | 
			
		||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
 | 
			
		||||
function splitJvmOpts() {
 | 
			
		||||
    JVM_OPTS=("$@")
 | 
			
		||||
}
 | 
			
		||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
 | 
			
		||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
 | 
			
		||||
 | 
			
		||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
 | 
			
		||||
							
								
								
									
										90
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
@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
 | 
			
		||||
 | 
			
		||||
@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=
 | 
			
		||||
 | 
			
		||||
set DIRNAME=%~dp0
 | 
			
		||||
if "%DIRNAME%" == "" set DIRNAME=.
 | 
			
		||||
set APP_BASE_NAME=%~n0
 | 
			
		||||
set APP_HOME=%DIRNAME%
 | 
			
		||||
 | 
			
		||||
@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 Windowz variants
 | 
			
		||||
 | 
			
		||||
if not "%OS%" == "Windows_NT" goto win9xME_args
 | 
			
		||||
if "%@eval[2+2]" == "4" goto 4NT_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=%*
 | 
			
		||||
goto execute
 | 
			
		||||
 | 
			
		||||
:4NT_args
 | 
			
		||||
@rem Get arguments from the 4NT Shell from JP Software
 | 
			
		||||
set CMD_LINE_ARGS=%$
 | 
			
		||||
 | 
			
		||||
:execute
 | 
			
		||||
@rem Setup the command line
 | 
			
		||||
 | 
			
		||||
set CLASSPATH=%APP_HOME%\forge\fml\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
 | 
			
		||||
							
								
								
									
										298
									
								
								jsons/1.7.10-dev.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								jsons/1.7.10-dev.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,298 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "@minecraft_version@-@project@@version@",
 | 
			
		||||
  "time": "@timestamp@",
 | 
			
		||||
  "releaseTime": "1960-01-01T00:00:00-0700",
 | 
			
		||||
  "type": "release",
 | 
			
		||||
  "minecraftArguments": "--version FML_DEV --tweakClass cpw.mods.fml.common.launcher.FMLTweaker",
 | 
			
		||||
  "minimumLauncherVersion": 13,
 | 
			
		||||
  "assets": "1.7.10",
 | 
			
		||||
  "libraries": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.minecraft:launchwrapper:1.11"
 | 
			
		||||
    },
 | 
			
		||||
	{
 | 
			
		||||
      "name": "com.google.code.findbugs:jsr305:1.3.9",
 | 
			
		||||
      "children": ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.ow2.asm:asm-debug-all:5.0.3",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.typesafe.akka:akka-actor_2.11:2.3.3",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.typesafe:config:1.2.1",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-actors-migration_2.11:1.1.0",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-compiler:2.11.1",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-library:2.11.1",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-parser-combinators_2.11:1.0.1",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-reflect:2.11.1",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-swing_2.11:1.0.1",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-xml_2.11:1.0.2",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.jopt-simple:jopt-simple:4.5",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "lzma:lzma:0.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.mojang:realms:1.3.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.commons:commons-compress:1.8.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.httpcomponents:httpclient:4.3.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-logging:commons-logging:1.1.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.httpcomponents:httpcore:4.3.2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "java3d:vecmath:1.3.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.trove4j:trove4j:3.0.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.ibm.icu:icu4j-core-mojang:51.2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:codecjorbis:20101023"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:codecwav:20101023"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:libraryjavasound:20101123"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:librarylwjglopenal:20100824"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:soundsystem:20120107"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "io.netty:netty-all:4.0.10.Final"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.google.guava:guava:16.0"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.commons:commons-lang3:3.2.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-io:commons-io:2.4"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-codec:commons-codec:1.9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jinput:jinput:2.0.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jutils:jutils:1.0.0"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.google.code.gson:gson:2.2.4"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.mojang:authlib:1.5.16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.logging.log4j:log4j-api:2.0-beta9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.logging.log4j:log4j-core:2.0-beta9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.jopt-simple:jopt-simple:4.5",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.yaml:snakeyaml:1.9",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-lang:commons-lang:2.6",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.avaje:ebean:2.7.3",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "jline:jline:2.6",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.md-5:SpecialSource:1.7-SNAPSHOT",
 | 
			
		||||
      "url" : "https://raw.github.com/MinecraftPortCentral/mcpc-mvn-repo/master/snapshots",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sourceforge.argo:argo:2.25",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.fusesource.jansi:jansi:1.8",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.googlecode.json-simple:json-simple:1.1",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.xerial:sqlite-jdbc:3.7.2",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "mysql:mysql-connector-java:5.1.14",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "javax.persistence:persistence-api:1.0.2",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl:2.9.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jinput:jinput-platform:2.0.5",
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch:5.16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch-platform:5.16",
 | 
			
		||||
      "rules": [
 | 
			
		||||
        {
 | 
			
		||||
          "action": "allow"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "action": "disallow",
 | 
			
		||||
          "os": {
 | 
			
		||||
            "name": "linux"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows-${arch}",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch-external-platform:4.5",
 | 
			
		||||
      "rules": [
 | 
			
		||||
        {
 | 
			
		||||
          "action": "allow",
 | 
			
		||||
          "os": {
 | 
			
		||||
            "name": "windows"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "windows": "natives-windows-${arch}"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "mainClass": "net.minecraft.launchwrapper.Launch"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										327
									
								
								jsons/1.7.10-rel.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								jsons/1.7.10-rel.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,327 @@
 | 
			
		||||
{
 | 
			
		||||
"install": {
 | 
			
		||||
  "profileName": "@project@",
 | 
			
		||||
  "target":"@minecraft_version@-@project@@version@",
 | 
			
		||||
  "path":"@artifact@",
 | 
			
		||||
  "version":"@project@ @version@",
 | 
			
		||||
  "filePath":"@universal_jar@",
 | 
			
		||||
  "welcome":"Welcome to the simple @project@ installer.",
 | 
			
		||||
  "minecraft":"@minecraft_version@",
 | 
			
		||||
  "logo":"/big_logo.png",
 | 
			
		||||
  "hideClient":true
 | 
			
		||||
},
 | 
			
		||||
"versionInfo": {
 | 
			
		||||
  "id": "@minecraft_version@-@project@@version@",
 | 
			
		||||
  "time": "@timestamp@",
 | 
			
		||||
  "releaseTime": "1960-01-01T00:00:00-0700",
 | 
			
		||||
  "type": "release",
 | 
			
		||||
  "minecraftArguments": "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} --assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} --accessToken ${auth_access_token} --userProperties ${user_properties} --userType ${user_type} --tweakClass cpw.mods.fml.common.launcher.FMLTweaker",
 | 
			
		||||
  "minimumLauncherVersion": 13,
 | 
			
		||||
  "assets": "1.7.10",
 | 
			
		||||
  "libraries": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": "@artifact@",
 | 
			
		||||
      "url": "http://files.minecraftforge.net/maven/"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.minecraft:launchwrapper:1.11",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.ow2.asm:asm-all:5.0.3",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.typesafe.akka:akka-actor_2.11:2.3.3",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "ed62e9fc709ca0f2ff1a3220daa8b70a2870078e", "25a86ccfdb6f6dfe08971f4825d0a01be83a6f2e" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.typesafe:config:1.2.1",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "f771f71fdae3df231bcd54d5ca2d57f0bf93f467", "7d7bc36df0989d72f2d5d057309675777acc528b" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-actors-migration_2.11:1.1.0",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "dfa8bc42b181d5b9f1a5dd147f8ae308b893eb6f", "8c9aaeeb68487ca519411a14068e1b4d69739207" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-compiler:2.11.1",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "56ea2e6c025e0821f28d73ca271218b8dd04926a", "1444992390544ba3780867a13ff696a89d7d1639" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "87213338cd5a153a7712cb574c0ddd2edfee0386", "0b4c1bf8d48993f138d6e10c0c144e50acfff581" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "1f7371605d4ba42aa26d3443440c0083c587b4e9", "1ea655dda4504ae0a367327e2340cd3beaee6c73" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-library:2.11.1",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "0e11da23da3eabab9f4777b9220e60d44c1aab6a", "1e4df76e835201c6eabd43adca89ab11f225f134" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-parser-combinators_2.11:1.0.1",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "f05d7345bf5a58924f2837c6c1f4d73a938e1ff0", "a1cbbcbde1dcc614f4253ed1aa0b320bc78d8f1d" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-reflect:2.11.1",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "6580347e61cc7f8e802941e7fde40fa83b8badeb", "91ce0f0be20f4a536321724b4b3bbc6530ddcd88" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-swing_2.11:1.0.1",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "b1cdd92bd47b1e1837139c1c53020e86bb9112ae", "d77152691dcf5bbdb00529af37aa7d3d887b3e63" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-xml_2.11:1.0.2",
 | 
			
		||||
      "url" : "http://files.minecraftforge.net/maven/",
 | 
			
		||||
      "checksums" : [ "7a80ec00aec122fba7cd4e0d4cdd87ff7e4cb6d0", "62736b01689d56b6d09a0164b7ef9da2b0b9633d" ],
 | 
			
		||||
      "serverreq":true,
 | 
			
		||||
      "clientreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.jopt-simple:jopt-simple:4.5",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "lzma:lzma:0.0.1",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.mojang:realms:1.3.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.commons:commons-compress:1.8.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.httpcomponents:httpclient:4.3.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-logging:commons-logging:1.1.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.httpcomponents:httpcore:4.3.2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "java3d:vecmath:1.3.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.trove4j:trove4j:3.0.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.ibm.icu:icu4j-core-mojang:51.2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:codecjorbis:20101023"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:codecwav:20101023"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:libraryjavasound:20101123"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:librarylwjglopenal:20100824"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:soundsystem:20120107"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "io.netty:netty-all:4.0.10.Final"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.google.guava:guava:16.0"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.commons:commons-lang3:3.2.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-io:commons-io:2.4"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-codec:commons-codec:1.9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jinput:jinput:2.0.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jutils:jutils:1.0.0"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.google.code.gson:gson:2.2.4"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.mojang:authlib:1.5.16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.logging.log4j:log4j-api:2.0-beta9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.logging.log4j:log4j-core:2.0-beta9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.yaml:snakeyaml:1.9",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-lang:commons-lang:2.6",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.avaje:ebean:2.7.3",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "jline:jline:2.6",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.md-5:SpecialSource:1.7-SNAPSHOT",
 | 
			
		||||
      "url" : "https://raw.github.com/MinecraftPortCentral/mcpc-mvn-repo/master/snapshots",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.fusesource.jansi:jansi:1.8",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sourceforge.argo:argo:2.25",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.googlecode.json-simple:json-simple:1.1",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.xerial:sqlite-jdbc:3.7.2",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "mysql:mysql-connector-java:5.1.14",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "javax.persistence:persistence-api:1.0.2",
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2",
 | 
			
		||||
      "serverreq":true
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl:2.9.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jinput:jinput-platform:2.0.5",
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch:5.16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch-platform:5.16",
 | 
			
		||||
      "rules": [
 | 
			
		||||
        {
 | 
			
		||||
          "action": "allow"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "action": "disallow",
 | 
			
		||||
          "os": {
 | 
			
		||||
            "name": "linux"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows-${arch}",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch-external-platform:4.5",
 | 
			
		||||
      "rules": [
 | 
			
		||||
        {
 | 
			
		||||
          "action": "allow",
 | 
			
		||||
          "os": {
 | 
			
		||||
            "name": "windows"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "windows": "natives-windows-${arch}"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "mainClass": "net.minecraft.launchwrapper.Launch"
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										191
									
								
								jsons/1.7.10.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								jsons/1.7.10.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,191 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "@minecraft_version@-@project@@version@",
 | 
			
		||||
  "time": "@timestamp@",
 | 
			
		||||
  "releaseTime": "1960-01-01T00:00:00-0700",
 | 
			
		||||
  "type": "release",
 | 
			
		||||
  "minecraftArguments": "--version FML_DEV --tweakClass cpw.mods.fml.common.launcher.FMLTweaker",
 | 
			
		||||
  "minimumLauncherVersion": 13,
 | 
			
		||||
  "assets": "1.7.10",
 | 
			
		||||
  "libraries": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.minecraft:launchwrapper:1.11"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.ow2.asm:asm-debug-all:5.0.3",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-library:2.10.2",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.scala-lang:scala-compiler:2.10.2",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.jopt-simple:jopt-simple:4.5",
 | 
			
		||||
      "children" : ["sources"],
 | 
			
		||||
      "url" : "http://repo.maven.apache.org/maven2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "lzma:lzma:0.0.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.mojang:realms:1.3.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.commons:commons-compress:1.8.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.httpcomponents:httpclient:4.3.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-logging:commons-logging:1.1.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.httpcomponents:httpcore:4.3.2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "java3d:vecmath:1.3.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.trove4j:trove4j:3.0.3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.ibm.icu:icu4j-core-mojang:51.2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.sf.jopt-simple:jopt-simple:4.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:codecjorbis:20101023"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:codecwav:20101023"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:libraryjavasound:20101123"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:librarylwjglopenal:20100824"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.paulscode:soundsystem:20120107"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "io.netty:netty-all:4.0.10.Final"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.google.guava:guava:16.0"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.commons:commons-lang3:3.2.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-io:commons-io:2.4"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "commons-codec:commons-codec:1.9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jinput:jinput:2.0.5"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jutils:jutils:1.0.0"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.google.code.gson:gson:2.2.4"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "com.mojang:authlib:1.5.16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.logging.log4j:log4j-api:2.0-beta9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.apache.logging.log4j:log4j-core:2.0-beta9"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl:2.9.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.1",
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "net.java.jinput:jinput-platform:2.0.5",
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch:5.16"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch-platform:5.16",
 | 
			
		||||
      "rules": [
 | 
			
		||||
        {
 | 
			
		||||
          "action": "allow"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "action": "disallow",
 | 
			
		||||
          "os": {
 | 
			
		||||
            "name": "linux"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "linux": "natives-linux",
 | 
			
		||||
        "windows": "natives-windows-${arch}",
 | 
			
		||||
        "osx": "natives-osx"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "tv.twitch:twitch-external-platform:4.5",
 | 
			
		||||
      "rules": [
 | 
			
		||||
        {
 | 
			
		||||
          "action": "allow",
 | 
			
		||||
          "os": {
 | 
			
		||||
            "name": "windows"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "natives": {
 | 
			
		||||
        "windows": "natives-windows-${arch}"
 | 
			
		||||
      },
 | 
			
		||||
      "extract": {
 | 
			
		||||
        "exclude": [
 | 
			
		||||
          "META-INF/"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "mainClass": "net.minecraft.launchwrapper.Launch"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								patches/cpw/mods/fml/common/FMLCommonHandler.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								patches/cpw/mods/fml/common/FMLCommonHandler.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/FMLCommonHandler.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/FMLCommonHandler.java
 | 
			
		||||
@@ -37,6 +37,10 @@
 | 
			
		||||
 
 | 
			
		||||
 import org.apache.logging.log4j.Level;
 | 
			
		||||
 import org.apache.logging.log4j.Logger;
 | 
			
		||||
+import org.bukkit.Bukkit;
 | 
			
		||||
+import org.bukkit.craftbukkit.CraftWorld;
 | 
			
		||||
+import org.bukkit.entity.Player;
 | 
			
		||||
+import org.bukkit.event.player.PlayerChangedWorldEvent;
 | 
			
		||||
 
 | 
			
		||||
 import com.google.common.base.Joiner;
 | 
			
		||||
 import com.google.common.base.Strings;
 | 
			
		||||
@@ -385,10 +389,11 @@
 | 
			
		||||
         {
 | 
			
		||||
             return;
 | 
			
		||||
         }
 | 
			
		||||
-        if (handlerSet.contains(handler))
 | 
			
		||||
+        if (handlerSet.contains(handler) || worldInfo.getDimension() != 0) // Cauldron - Only check FML data in main world
 | 
			
		||||
         {
 | 
			
		||||
             return;
 | 
			
		||||
         }
 | 
			
		||||
+        // Cauldron - logic below should only be run for overworld as Forge/Vanilla only use 1 SaveHandler
 | 
			
		||||
         handlerSet.add(handler);
 | 
			
		||||
         handlerToCheck = new WeakReference<SaveHandler>(handler); // for confirmBackupLevelDatUse
 | 
			
		||||
         Map<String,NBTBase> additionalProperties = Maps.newHashMap();
 | 
			
		||||
@@ -496,7 +501,12 @@
 | 
			
		||||
 
 | 
			
		||||
     public String getModName()
 | 
			
		||||
     {
 | 
			
		||||
-        List<String> modNames = Lists.newArrayListWithExpectedSize(3);
 | 
			
		||||
+        // Cauldron start    
 | 
			
		||||
+        List<String> modNames = Lists.newArrayListWithExpectedSize(6);
 | 
			
		||||
+        modNames.add("cauldron");
 | 
			
		||||
+        modNames.add("craftbukkit");
 | 
			
		||||
+        modNames.add("mcpc");
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
         modNames.add("fml");
 | 
			
		||||
         if (!noForge)
 | 
			
		||||
         {
 | 
			
		||||
@@ -540,8 +550,17 @@
 | 
			
		||||
         bus().post(new InputEvent.KeyInputEvent());
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start - wrapper to notify plugins for mods that bypass ServerConfigurationManager
 | 
			
		||||
     public void firePlayerChangedDimensionEvent(EntityPlayer player, int fromDim, int toDim)
 | 
			
		||||
     {
 | 
			
		||||
+        this.firePlayerChangedDimensionEvent(player, fromDim, toDim, player.worldObj.getWorld());
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public void firePlayerChangedDimensionEvent(EntityPlayer player, int fromDim, int toDim, CraftWorld fromWorld)
 | 
			
		||||
+    {
 | 
			
		||||
+        PlayerChangedWorldEvent event = new PlayerChangedWorldEvent((Player) player.getBukkitEntity(), fromWorld);
 | 
			
		||||
+        Bukkit.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
         bus().post(new PlayerEvent.PlayerChangedDimensionEvent(player, fromDim, toDim));
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								patches/cpw/mods/fml/common/asm/FMLSanityChecker.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								patches/cpw/mods/fml/common/asm/FMLSanityChecker.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/asm/FMLSanityChecker.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/asm/FMLSanityChecker.java
 | 
			
		||||
@@ -164,10 +164,12 @@
 | 
			
		||||
                 FMLRelaunchLog.severe("Technical information: ClientBrandRetriever was at %s, there were %d certificates for it", codeSource.getLocation(), certCount);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
-        if (!goodFML)
 | 
			
		||||
+        // Cauldron start - disable message
 | 
			
		||||
+        /*if (!goodFML)
 | 
			
		||||
         {
 | 
			
		||||
             FMLRelaunchLog.severe("FML appears to be missing any signature data. This is not a good thing");
 | 
			
		||||
-        }
 | 
			
		||||
+        }*/
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
         return null;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,19 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/asm/transformers/SideTransformer.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/asm/transformers/SideTransformer.java
 | 
			
		||||
@@ -32,6 +32,7 @@
 | 
			
		||||
 {
 | 
			
		||||
     private static String SIDE = FMLLaunchHandler.side().name();
 | 
			
		||||
     private static final boolean DEBUG = false;
 | 
			
		||||
+    public static boolean allowInvalidSide = false; // Cauldron
 | 
			
		||||
     @Override
 | 
			
		||||
     public byte[] transform(String name, String transformedName, byte[] bytes)
 | 
			
		||||
     {
 | 
			
		||||
@@ -41,7 +42,7 @@
 | 
			
		||||
         ClassReader classReader = new ClassReader(bytes);
 | 
			
		||||
         classReader.accept(classNode, 0);
 | 
			
		||||
 
 | 
			
		||||
-        if (remove((List<AnnotationNode>)classNode.visibleAnnotations, SIDE))
 | 
			
		||||
+        if (remove((List<AnnotationNode>)classNode.visibleAnnotations, SIDE) && !allowInvalidSide) // Cauldron
 | 
			
		||||
         {
 | 
			
		||||
             if (DEBUG)
 | 
			
		||||
             {
 | 
			
		||||
@@ -0,0 +1,23 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/event/FMLServerStartingEvent.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/event/FMLServerStartingEvent.java
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
 import net.minecraft.command.ICommand;
 | 
			
		||||
 import net.minecraft.server.MinecraftServer;
 | 
			
		||||
 import cpw.mods.fml.common.LoaderState.ModState;
 | 
			
		||||
+import org.bukkit.command.Command; // Cauldron
 | 
			
		||||
 
 | 
			
		||||
 public class FMLServerStartingEvent extends FMLStateEvent
 | 
			
		||||
 {
 | 
			
		||||
@@ -43,4 +44,12 @@
 | 
			
		||||
         CommandHandler ch = (CommandHandler) getServer().getCommandManager();
 | 
			
		||||
         ch.registerCommand(command);
 | 
			
		||||
     }
 | 
			
		||||
+
 | 
			
		||||
+    // Cauldron start - used for mods to register a Bukkit command
 | 
			
		||||
+    public void registerServerCommand(String fallbackPrefix, Command command)
 | 
			
		||||
+    {
 | 
			
		||||
+        org.bukkit.command.SimpleCommandMap commandMap = getServer().server.getCommandMap();
 | 
			
		||||
+        commandMap.register(fallbackPrefix, command);
 | 
			
		||||
+    }
 | 
			
		||||
+    // Cauldron end 
 | 
			
		||||
 }
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/network/handshake/ChannelRegistrationHandler.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/network/handshake/ChannelRegistrationHandler.java
 | 
			
		||||
@@ -2,6 +2,8 @@
 | 
			
		||||
 
 | 
			
		||||
 import io.netty.channel.ChannelHandlerContext;
 | 
			
		||||
 import io.netty.channel.SimpleChannelInboundHandler;
 | 
			
		||||
+
 | 
			
		||||
+import java.io.UnsupportedEncodingException;
 | 
			
		||||
 import java.util.Set;
 | 
			
		||||
 import net.minecraft.network.NetworkManager;
 | 
			
		||||
 import org.apache.logging.log4j.Level;
 | 
			
		||||
@@ -24,6 +26,23 @@
 | 
			
		||||
             msg.payload().readBytes(data);
 | 
			
		||||
             String channels = new String(data,Charsets.UTF_8);
 | 
			
		||||
             String[] split = channels.split("\0");
 | 
			
		||||
+            // Cauldron start - register bukkit channels for players
 | 
			
		||||
+            NetworkDispatcher dispatcher = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER).get();
 | 
			
		||||
+            if (msg.channel().equals("REGISTER"))
 | 
			
		||||
+            {
 | 
			
		||||
+                for (String channel : split)
 | 
			
		||||
+                {
 | 
			
		||||
+                    dispatcher.player.getBukkitEntity().addChannel(channel);
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+            else
 | 
			
		||||
+            {
 | 
			
		||||
+                for (String channel : split)
 | 
			
		||||
+                {
 | 
			
		||||
+                    dispatcher.player.getBukkitEntity().removeChannel(channel);
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
             Set<String> channelSet = ImmutableSet.copyOf(split);
 | 
			
		||||
             FMLCommonHandler.instance().fireNetRegistrationEvent(manager, channelSet, msg.channel(), side);
 | 
			
		||||
         }
 | 
			
		||||
@@ -0,0 +1,45 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/network/handshake/NetworkDispatcher.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/network/handshake/NetworkDispatcher.java
 | 
			
		||||
@@ -72,7 +72,7 @@
 | 
			
		||||
     public static final AttributeKey<Boolean> IS_LOCAL = new AttributeKey<Boolean>("fml:isLocal");
 | 
			
		||||
     public final NetworkManager manager;
 | 
			
		||||
     private final ServerConfigurationManager scm;
 | 
			
		||||
-    private EntityPlayerMP player;
 | 
			
		||||
+    public EntityPlayerMP player; // Cauldron
 | 
			
		||||
     private ConnectionState state;
 | 
			
		||||
     private ConnectionType connectionType;
 | 
			
		||||
     private final Side side;
 | 
			
		||||
@@ -202,7 +202,7 @@
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
-            FMLLog.info("Unexpected packet during modded negotiation - assuming vanilla or keepalives : %s", msg.getClass().getName());
 | 
			
		||||
+            //FMLLog.info("Unexpected packet during modded negotiation - assuming vanilla or keepalives : %s", msg.getClass().getName()); // Cauldron - unneeded spam
 | 
			
		||||
         }
 | 
			
		||||
         return false;
 | 
			
		||||
     }
 | 
			
		||||
@@ -287,6 +287,7 @@
 | 
			
		||||
             state = ConnectionState.HANDSHAKING;
 | 
			
		||||
         }
 | 
			
		||||
         String channelName = msg.func_149559_c();
 | 
			
		||||
+        player.getBukkitEntity().addChannel(channelName); // Cauldron - register channel for bukkit player
 | 
			
		||||
         if ("FML|HS".equals(channelName) || "REGISTER".equals(channelName) || "UNREGISTER".equals(channelName))
 | 
			
		||||
         {
 | 
			
		||||
             FMLProxyPacket proxy = new FMLProxyPacket(msg);
 | 
			
		||||
@@ -308,6 +309,7 @@
 | 
			
		||||
         else if (NetworkRegistry.INSTANCE.hasChannel(channelName, Side.SERVER))
 | 
			
		||||
         {
 | 
			
		||||
             FMLProxyPacket proxy = new FMLProxyPacket(msg);
 | 
			
		||||
+            serverHandler.getCraftServer().getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), msg.func_149559_c(), msg.func_149558_e()); // pass msg to bukkit
 | 
			
		||||
             proxy.setDispatcher(this);
 | 
			
		||||
             context.fireChannelRead(proxy);
 | 
			
		||||
             return true;
 | 
			
		||||
@@ -465,7 +467,7 @@
 | 
			
		||||
         // Stop the epic channel closed spam at close
 | 
			
		||||
         if (!(cause instanceof ClosedChannelException))
 | 
			
		||||
         {
 | 
			
		||||
-            FMLLog.log(Level.ERROR, cause, "NetworkDispatcher exception");
 | 
			
		||||
+            //FMLLog.log(Level.ERROR, cause, "NetworkDispatcher exception"); // Cauldron - disable unneeded spam
 | 
			
		||||
         }
 | 
			
		||||
         super.exceptionCaught(ctx, cause);
 | 
			
		||||
     }
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/network/internal/FMLNetworkHandler.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/network/internal/FMLNetworkHandler.java
 | 
			
		||||
@@ -47,6 +47,16 @@
 | 
			
		||||
 import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
 | 
			
		||||
 import cpw.mods.fml.relauncher.Side;
 | 
			
		||||
 import cpw.mods.fml.relauncher.SideOnly;
 | 
			
		||||
+//Cauldron start
 | 
			
		||||
+import net.minecraft.inventory.IInventory;
 | 
			
		||||
+import net.minecraft.server.MinecraftServer;
 | 
			
		||||
+import net.minecraft.tileentity.TileEntity;
 | 
			
		||||
+import org.bukkit.craftbukkit.entity.CraftPlayer;
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+import org.bukkit.craftbukkit.inventory.CraftInventory;
 | 
			
		||||
+import org.bukkit.craftbukkit.inventory.CraftInventoryView;
 | 
			
		||||
+import org.bukkit.event.inventory.InventoryType;
 | 
			
		||||
+// Cauldron end
 | 
			
		||||
 
 | 
			
		||||
 public class FMLNetworkHandler
 | 
			
		||||
 {
 | 
			
		||||
@@ -75,6 +85,31 @@
 | 
			
		||||
             Container remoteGuiContainer = NetworkRegistry.INSTANCE.getRemoteGuiContainer(mc, entityPlayerMP, modGuiId, world, x, y, z);
 | 
			
		||||
             if (remoteGuiContainer != null)
 | 
			
		||||
             {
 | 
			
		||||
+                // Cauldron start - create bukkitView for passed container then fire open event.
 | 
			
		||||
+                if (entityPlayer != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    if (remoteGuiContainer.getBukkitView() == null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        TileEntity te = entityPlayer.worldObj.getTileEntity(x, y, z);
 | 
			
		||||
+                        if (te != null && te instanceof IInventory)
 | 
			
		||||
+                        {
 | 
			
		||||
+                            IInventory teInv = (IInventory)te;
 | 
			
		||||
+                            CraftInventory inventory = new CraftInventory(teInv);
 | 
			
		||||
+                            remoteGuiContainer.bukkitView = new CraftInventoryView(entityPlayer.getBukkitEntity(), inventory, remoteGuiContainer);
 | 
			
		||||
+                        }
 | 
			
		||||
+                        else
 | 
			
		||||
+                        {
 | 
			
		||||
+                            remoteGuiContainer.bukkitView = new CraftInventoryView(entityPlayer.getBukkitEntity(), MinecraftServer.getServer().server.createInventory(entityPlayer.getBukkitEntity(), InventoryType.CHEST), remoteGuiContainer);
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        remoteGuiContainer = CraftEventFactory.callInventoryOpenEvent((EntityPlayerMP)entityPlayer, remoteGuiContainer, false);
 | 
			
		||||
+                        if (remoteGuiContainer == null)
 | 
			
		||||
+                        {
 | 
			
		||||
+                            return;
 | 
			
		||||
+                        }
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+                // Cauldron end
 | 
			
		||||
                 entityPlayerMP.getNextWindowId();
 | 
			
		||||
                 entityPlayerMP.closeContainer();
 | 
			
		||||
                 int windowId = entityPlayerMP.currentWindowId;
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/network/internal/HandshakeCompletionHandler.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/network/internal/HandshakeCompletionHandler.java
 | 
			
		||||
@@ -13,9 +13,15 @@
 | 
			
		||||
     @Override
 | 
			
		||||
     protected void channelRead0(ChannelHandlerContext ctx, CompleteHandshake msg) throws Exception
 | 
			
		||||
     {
 | 
			
		||||
+        // Cauldron start - attempt to fix race condition with attr being null
 | 
			
		||||
+        Object attr = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER);
 | 
			
		||||
+        if (attr != null)
 | 
			
		||||
+        {
 | 
			
		||||
         NetworkDispatcher dispatcher = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER).getAndRemove();
 | 
			
		||||
         dispatcher.completeHandshake(msg.target);
 | 
			
		||||
     }
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
+    }
 | 
			
		||||
 
 | 
			
		||||
     @Override
 | 
			
		||||
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
 | 
			
		||||
@@ -0,0 +1,79 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/registry/EntityRegistry.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/registry/EntityRegistry.java
 | 
			
		||||
@@ -41,6 +41,12 @@
 | 
			
		||||
 import cpw.mods.fml.common.ModContainer;
 | 
			
		||||
 import cpw.mods.fml.common.network.internal.FMLMessage.EntitySpawnMessage;
 | 
			
		||||
 
 | 
			
		||||
+// Cauldron start
 | 
			
		||||
+import net.minecraftforge.common.util.EnumHelper;
 | 
			
		||||
+import org.bukkit.craftbukkit.entity.CraftEntity;
 | 
			
		||||
+import org.bukkit.entity.EntityType;
 | 
			
		||||
+// Cauldron end
 | 
			
		||||
+
 | 
			
		||||
 public class EntityRegistry
 | 
			
		||||
 {
 | 
			
		||||
     public class EntityRegistration
 | 
			
		||||
@@ -118,6 +124,8 @@
 | 
			
		||||
     private ListMultimap<ModContainer, EntityRegistration> entityRegistrations = ArrayListMultimap.create();
 | 
			
		||||
     private Map<String,ModContainer> entityNames = Maps.newHashMap();
 | 
			
		||||
     private BiMap<Class<? extends Entity>, EntityRegistration> entityClassRegistrations = HashBiMap.create();
 | 
			
		||||
+    public static Map<Class <? extends Entity>, String> entityTypeMap = Maps.newHashMap(); // Cauldron - used by CraftCustomEntity
 | 
			
		||||
+    public static Map<String, Class <? extends Entity>> entityClassMap = Maps.newHashMap(); // Cauldron - used by CraftWorld
 | 
			
		||||
     public static EntityRegistry instance()
 | 
			
		||||
     {
 | 
			
		||||
         return INSTANCE;
 | 
			
		||||
@@ -147,6 +155,7 @@
 | 
			
		||||
     public static void registerModEntity(Class<? extends Entity> entityClass, String entityName, int id, Object mod, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates)
 | 
			
		||||
     {
 | 
			
		||||
         instance().doModEntityRegistration(entityClass, entityName, id, mod, trackingRange, updateFrequency, sendsVelocityUpdates);
 | 
			
		||||
+        registerBukkitType(entityClass, entityName); // Cauldron - register EntityType for Bukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     @SuppressWarnings("unchecked")
 | 
			
		||||
@@ -197,6 +206,7 @@
 | 
			
		||||
         }
 | 
			
		||||
         id = instance().validateAndClaimId(id);
 | 
			
		||||
         EntityList.addMapping(entityClass, entityName, id);
 | 
			
		||||
+        registerBukkitType(entityClass, entityName); // Cauldron - register EntityType for Bukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     private int validateAndClaimId(int id)
 | 
			
		||||
@@ -249,8 +259,38 @@
 | 
			
		||||
         }
 | 
			
		||||
         instance().validateAndClaimId(id);
 | 
			
		||||
         EntityList.addMapping(entityClass, entityName, id, backgroundEggColour, foregroundEggColour);
 | 
			
		||||
+        registerBukkitType(entityClass, entityName); // Cauldron - register EntityType for Bukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start
 | 
			
		||||
+    private static void registerBukkitType(Class <? extends Entity > entityClass, String entityName)
 | 
			
		||||
+    {
 | 
			
		||||
+        ModContainer activeModContainer = Loader.instance().activeModContainer();
 | 
			
		||||
+        String modId = "unknown";
 | 
			
		||||
+        // fixup bad entity names from mods
 | 
			
		||||
+        if (entityName.contains("."))
 | 
			
		||||
+        {
 | 
			
		||||
+            if ((entityName.indexOf(".") + 1) < entityName.length())
 | 
			
		||||
+                entityName = entityName.substring(entityName.indexOf(".") + 1, entityName.length());
 | 
			
		||||
+        }
 | 
			
		||||
+        entityName.replace("entity", "");
 | 
			
		||||
+        if (entityName.startsWith("ent"))
 | 
			
		||||
+            entityName.replace("ent", "");
 | 
			
		||||
+        entityName = entityName.replaceAll("[^A-Za-z0-9]", ""); // remove all non-digits/alphanumeric
 | 
			
		||||
+        if (activeModContainer != null)
 | 
			
		||||
+            modId = activeModContainer.getModId();
 | 
			
		||||
+        entityName = modId + "-" + entityName;
 | 
			
		||||
+        entityTypeMap.put(entityClass, entityName);
 | 
			
		||||
+        entityClassMap.put(entityName, entityClass);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    // used by CraftCustomEntity
 | 
			
		||||
+    public static String getCustomEntityTypeName(Class <? extends Entity > entityClass)
 | 
			
		||||
+    {
 | 
			
		||||
+        return entityTypeMap.get(entityClass);
 | 
			
		||||
+    }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
+
 | 
			
		||||
     public static void addSpawn(Class <? extends EntityLiving > entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeGenBase... biomes)
 | 
			
		||||
     {
 | 
			
		||||
         for (BiomeGenBase biome : biomes)
 | 
			
		||||
							
								
								
									
										69
									
								
								patches/cpw/mods/fml/common/registry/GameData.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								patches/cpw/mods/fml/common/registry/GameData.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/registry/GameData.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/registry/GameData.java
 | 
			
		||||
@@ -14,7 +14,9 @@
 | 
			
		||||
 
 | 
			
		||||
 import java.io.File;
 | 
			
		||||
 import java.io.IOException;
 | 
			
		||||
+import java.util.ArrayList;
 | 
			
		||||
 import java.util.BitSet;
 | 
			
		||||
+import java.util.Collections;
 | 
			
		||||
 import java.util.HashMap;
 | 
			
		||||
 import java.util.HashSet;
 | 
			
		||||
 import java.util.Iterator;
 | 
			
		||||
@@ -1024,4 +1026,56 @@
 | 
			
		||||
             throw new RuntimeException("WHAT?");
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
+
 | 
			
		||||
+    // Cauldron start
 | 
			
		||||
+    public static void injectItemBukkitMaterials()
 | 
			
		||||
+    {
 | 
			
		||||
+        FMLControlledNamespacedRegistry<Item> itemRegistry = getItemRegistry();
 | 
			
		||||
+        List<Integer> ids = new ArrayList<Integer>();
 | 
			
		||||
+
 | 
			
		||||
+        for (Item thing : itemRegistry.typeSafeIterable())
 | 
			
		||||
+        {
 | 
			
		||||
+            ids.add(itemRegistry.getId(thing));
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // sort by id
 | 
			
		||||
+        Collections.sort(ids);
 | 
			
		||||
+
 | 
			
		||||
+        for (int id : ids)
 | 
			
		||||
+        {
 | 
			
		||||
+            Item item = itemRegistry.getRaw(id);
 | 
			
		||||
+            // inject item materials into Bukkit for FML
 | 
			
		||||
+            org.bukkit.Material material = org.bukkit.Material.addMaterial(id, itemRegistry.getNameForObject(item), false);
 | 
			
		||||
+            if (material != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                FMLLog.info("Injected new Forge item material %s with ID %d.", material.name(), material.getId());
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public static void injectBlockBukkitMaterials()
 | 
			
		||||
+    {
 | 
			
		||||
+        FMLControlledNamespacedRegistry<Block> blockRegistry = getBlockRegistry();
 | 
			
		||||
+        List<Integer> ids = new ArrayList<Integer>();
 | 
			
		||||
+
 | 
			
		||||
+        for (Block block : blockRegistry.typeSafeIterable())
 | 
			
		||||
+        {
 | 
			
		||||
+            ids.add(blockRegistry.getId(block));
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // sort by id
 | 
			
		||||
+        Collections.sort(ids);
 | 
			
		||||
+
 | 
			
		||||
+        for (int id : ids)
 | 
			
		||||
+        {
 | 
			
		||||
+            Block block = blockRegistry.getRaw(id);
 | 
			
		||||
+            // inject block materials into Bukkit for FML
 | 
			
		||||
+            org.bukkit.Material material = org.bukkit.Material.addMaterial(id, blockRegistry.getNameForObject(block), true);
 | 
			
		||||
+            if (material != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                FMLLog.info("Injected new Forge block material %s with ID %d.", material.name(), material.getId());
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
 }
 | 
			
		||||
							
								
								
									
										71
									
								
								patches/cpw/mods/fml/common/registry/GameRegistry.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								patches/cpw/mods/fml/common/registry/GameRegistry.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/common/registry/GameRegistry.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/common/registry/GameRegistry.java
 | 
			
		||||
@@ -53,6 +53,7 @@
 | 
			
		||||
 import cpw.mods.fml.common.LoaderException;
 | 
			
		||||
 import cpw.mods.fml.common.LoaderState;
 | 
			
		||||
 import cpw.mods.fml.common.ObfuscationReflectionHelper;
 | 
			
		||||
+import java.util.HashMap; // Cauldron
 | 
			
		||||
 
 | 
			
		||||
 public class GameRegistry
 | 
			
		||||
 {
 | 
			
		||||
@@ -60,6 +61,10 @@
 | 
			
		||||
     private static Map<IWorldGenerator, Integer> worldGeneratorIndex = Maps.newHashMap();
 | 
			
		||||
     private static List<IFuelHandler> fuelHandlers = Lists.newArrayList();
 | 
			
		||||
     private static List<IWorldGenerator> sortedGeneratorList;
 | 
			
		||||
+    // Cauldron start
 | 
			
		||||
+    private static Map<String, Boolean> configWorldGenCache = new HashMap<String, Boolean>();
 | 
			
		||||
+    private static Map<String, String> worldGenMap = new HashMap<String, String>();
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
 
 | 
			
		||||
     /**
 | 
			
		||||
      * Register a world generator - something that inserts new block types into the world
 | 
			
		||||
@@ -70,12 +75,18 @@
 | 
			
		||||
      */
 | 
			
		||||
     public static void registerWorldGenerator(IWorldGenerator generator, int modGenerationWeight)
 | 
			
		||||
     {
 | 
			
		||||
+        // Cauldron start - mod id's are not available during generateWorld so we must capture them here
 | 
			
		||||
+        String modId = Loader.instance().activeModContainer().getModId();
 | 
			
		||||
+        modId = modId.replaceAll("[^A-Za-z0-9]", ""); // remove all non-digits/alphanumeric
 | 
			
		||||
+        modId.replace(" ", "_");
 | 
			
		||||
         worldGenerators.add(generator);
 | 
			
		||||
         worldGeneratorIndex.put(generator, modGenerationWeight);
 | 
			
		||||
         if (sortedGeneratorList != null)
 | 
			
		||||
         {
 | 
			
		||||
             sortedGeneratorList = null;
 | 
			
		||||
         }
 | 
			
		||||
+        worldGenMap.put(generator.getClass().getName(), modId);
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     /**
 | 
			
		||||
@@ -100,11 +111,27 @@
 | 
			
		||||
         long zSeed = fmlRandom.nextLong() >> 2 + 1L;
 | 
			
		||||
         long chunkSeed = (xSeed * chunkX + zSeed * chunkZ) ^ worldSeed;
 | 
			
		||||
 
 | 
			
		||||
-        for (IWorldGenerator generator : sortedGeneratorList)
 | 
			
		||||
+        boolean before = ((net.minecraft.world.WorldServer) world).theChunkProviderServer.loadChunkOnProvideRequest; // Cauldron store value
 | 
			
		||||
+        ((net.minecraft.world.WorldServer) world).theChunkProviderServer.loadChunkOnProvideRequest = true; // Cauldron load chunks on provide requests
 | 
			
		||||
+        for (IWorldGenerator generator : worldGenerators)
 | 
			
		||||
         {
 | 
			
		||||
-            fmlRandom.setSeed(chunkSeed);
 | 
			
		||||
-            generator.generate(fmlRandom, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
 | 
			
		||||
+            // Cauldron start
 | 
			
		||||
+            if (!configWorldGenCache.containsKey(generator.getClass().getName()))
 | 
			
		||||
+            {
 | 
			
		||||
+                String modId = worldGenMap.get(generator.getClass().getName());
 | 
			
		||||
+                String generatorName = "";
 | 
			
		||||
+                generatorName = modId + "-" + generator.getClass().getSimpleName();
 | 
			
		||||
+                boolean generatorEnabled = world.cauldronConfig.getBoolean("worldgen-" + generatorName, true);
 | 
			
		||||
+                configWorldGenCache.put(generator.getClass().getName(), generatorEnabled);
 | 
			
		||||
+            }
 | 
			
		||||
+            if (configWorldGenCache.get(generator.getClass().getName()))
 | 
			
		||||
+            {
 | 
			
		||||
+                fmlRandom.setSeed(chunkSeed);
 | 
			
		||||
+                generator.generate(fmlRandom, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
 | 
			
		||||
+            }
 | 
			
		||||
         }
 | 
			
		||||
+        ((net.minecraft.world.WorldServer)world).theChunkProviderServer.loadChunkOnProvideRequest = before; // reset
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     private static void computeSortedGeneratorList()
 | 
			
		||||
							
								
								
									
										47
									
								
								patches/cpw/mods/fml/relauncher/CoreModManager.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								patches/cpw/mods/fml/relauncher/CoreModManager.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
--- ../src-base/minecraft/cpw/mods/fml/relauncher/CoreModManager.java
 | 
			
		||||
+++ ../src-work/minecraft/cpw/mods/fml/relauncher/CoreModManager.java
 | 
			
		||||
@@ -153,6 +153,9 @@
 | 
			
		||||
 
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron - group output of @MCVersion warnings
 | 
			
		||||
+    private static List<String> noVersionAnnotationCoreMods = new ArrayList<String>();
 | 
			
		||||
+
 | 
			
		||||
     public static void handleLaunch(File mcDir, LaunchClassLoader classLoader, FMLTweaker tweaker)
 | 
			
		||||
     {
 | 
			
		||||
         CoreModManager.mcDir = mcDir;
 | 
			
		||||
@@ -212,7 +215,19 @@
 | 
			
		||||
             loadCoreMod(classLoader, coreModClassName, null);
 | 
			
		||||
         }
 | 
			
		||||
         discoverCoreMods(mcDir, classLoader);
 | 
			
		||||
-
 | 
			
		||||
+        // Cauldron start - group output of @MCVersion warnings
 | 
			
		||||
+        if (!noVersionAnnotationCoreMods.isEmpty())
 | 
			
		||||
+        {
 | 
			
		||||
+            FMLRelaunchLog
 | 
			
		||||
+                    .warning("The following coremods do not have a @MCVersion annotation. They may cause problems if this is not the correct version of Minecraft for them.");
 | 
			
		||||
+            StringBuilder sb = new StringBuilder("Missing @MCVersion: ");
 | 
			
		||||
+            for (String className : noVersionAnnotationCoreMods)
 | 
			
		||||
+            {
 | 
			
		||||
+                sb.append(className).append("  ");
 | 
			
		||||
+            }
 | 
			
		||||
+            FMLRelaunchLog.warning(sb.toString());
 | 
			
		||||
+        }
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     private static void discoverCoreMods(File mcDir, LaunchClassLoader classLoader)
 | 
			
		||||
@@ -424,8 +439,11 @@
 | 
			
		||||
             MCVersion requiredMCVersion = coreModClazz.getAnnotation(IFMLLoadingPlugin.MCVersion.class);
 | 
			
		||||
             if (!Arrays.asList(rootPlugins).contains(coreModClass) && (requiredMCVersion == null || Strings.isNullOrEmpty(requiredMCVersion.value())))
 | 
			
		||||
             {
 | 
			
		||||
-                FMLRelaunchLog.log(Level.WARN, "The coremod %s does not have a MCVersion annotation, it may cause issues with this version of Minecraft",
 | 
			
		||||
-                        coreModClass);
 | 
			
		||||
+                // Cauldron start - group output of @MCVersion warnings
 | 
			
		||||
+                // FMLRelaunchLog.log(Level.WARN, "The coremod %s does not have a MCVersion annotation, it may cause issues with this version of Minecraft",
 | 
			
		||||
+                //        coreModClass);
 | 
			
		||||
+                noVersionAnnotationCoreMods.add(coreModClass);
 | 
			
		||||
+                // Cauldron end
 | 
			
		||||
             }
 | 
			
		||||
             else if (requiredMCVersion != null && !FMLInjectionData.mccversion.equals(requiredMCVersion.value()))
 | 
			
		||||
             {
 | 
			
		||||
							
								
								
									
										52
									
								
								patches/net/minecraft/block/Block.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								patches/net/minecraft/block/Block.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/Block.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/Block.java
 | 
			
		||||
@@ -122,6 +122,7 @@
 | 
			
		||||
     private String unlocalizedName;
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
     protected IIcon blockIcon;
 | 
			
		||||
+    public boolean isForgeBlock; // Cauldron
 | 
			
		||||
     private static final String __OBFID = "CL_00000199";
 | 
			
		||||
 
 | 
			
		||||
     public final cpw.mods.fml.common.registry.RegistryDelegate<Block> delegate = 
 | 
			
		||||
@@ -650,7 +651,7 @@
 | 
			
		||||
 
 | 
			
		||||
     public void dropBlockAsItemWithChance(World p_149690_1_, int p_149690_2_, int p_149690_3_, int p_149690_4_, int p_149690_5_, float p_149690_6_, int p_149690_7_)
 | 
			
		||||
     {
 | 
			
		||||
-        if (!p_149690_1_.isRemote && !p_149690_1_.restoringBlockSnapshots) // do not drop items while restoring blockstates, prevents item dupe
 | 
			
		||||
+        if (!p_149690_1_.isRemote && (!p_149690_1_.restoringBlockSnapshots || !p_149690_1_.restoringBlockStates)) // do not drop items while restoring blockstates, prevents item dupe
 | 
			
		||||
         {
 | 
			
		||||
             ArrayList<ItemStack> items = getDrops(p_149690_1_, p_149690_2_, p_149690_3_, p_149690_4_, p_149690_5_, p_149690_7_);
 | 
			
		||||
             p_149690_6_ = ForgeEventFactory.fireBlockHarvesting(items, p_149690_1_, this, p_149690_2_, p_149690_3_, p_149690_4_, p_149690_5_, p_149690_7_, p_149690_6_, false, harvesters.get());
 | 
			
		||||
@@ -667,7 +668,7 @@
 | 
			
		||||
 
 | 
			
		||||
     protected void dropBlockAsItem(World p_149642_1_, int p_149642_2_, int p_149642_3_, int p_149642_4_, ItemStack p_149642_5_)
 | 
			
		||||
     {
 | 
			
		||||
-        if (!p_149642_1_.isRemote && p_149642_1_.getGameRules().getGameRuleBooleanValue("doTileDrops") && !p_149642_1_.restoringBlockSnapshots) // do not drop items while restoring blockstates, prevents item dupe
 | 
			
		||||
+        if (!p_149642_1_.isRemote && p_149642_1_.getGameRules().getGameRuleBooleanValue("doTileDrops") && (!p_149642_1_.restoringBlockSnapshots || !p_149642_1_.restoringBlockStates)) // do not drop items while restoring blockstates, prevents item dupe
 | 
			
		||||
         {
 | 
			
		||||
             if (captureDrops.get())
 | 
			
		||||
             {
 | 
			
		||||
@@ -1131,6 +1132,23 @@
 | 
			
		||||
         return this;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Spigot start
 | 
			
		||||
+    public static float range(float min, float value, float max)
 | 
			
		||||
+    {
 | 
			
		||||
+        if (value < min)
 | 
			
		||||
+        {
 | 
			
		||||
+            return min;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if (value > max)
 | 
			
		||||
+        {
 | 
			
		||||
+            return max;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        return value;
 | 
			
		||||
+    }
 | 
			
		||||
+    // Spigot end
 | 
			
		||||
+
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
     protected String getTextureName()
 | 
			
		||||
     {
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockBasePressurePlate.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockBasePressurePlate.java
 | 
			
		||||
@@ -11,6 +11,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public abstract class BlockBasePressurePlate extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private String field_150067_a;
 | 
			
		||||
@@ -122,7 +124,20 @@
 | 
			
		||||
         int i1 = this.func_150065_e(p_150062_1_, p_150062_2_, p_150062_3_, p_150062_4_);
 | 
			
		||||
         boolean flag = p_150062_5_ > 0;
 | 
			
		||||
         boolean flag1 = i1 > 0;
 | 
			
		||||
+        // CraftBukkit start - Interact Pressure Plate
 | 
			
		||||
+        org.bukkit.World bworld = p_150062_1_.getWorld();
 | 
			
		||||
+        org.bukkit.plugin.PluginManager manager = p_150062_1_.getServer().getPluginManager();
 | 
			
		||||
 
 | 
			
		||||
+        if (flag != flag1)
 | 
			
		||||
+        {
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bworld.getBlockAt(p_150062_2_, p_150062_3_, p_150062_4_), p_150062_5_, i1);
 | 
			
		||||
+            manager.callEvent(eventRedstone);
 | 
			
		||||
+            flag1 = eventRedstone.getNewCurrent() > 0;
 | 
			
		||||
+            i1 = eventRedstone.getNewCurrent();
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (p_150062_5_ != i1)
 | 
			
		||||
         {
 | 
			
		||||
             p_150062_1_.setBlockMetadataWithNotify(p_150062_2_, p_150062_3_, p_150062_4_, this.func_150066_d(i1), 2);
 | 
			
		||||
							
								
								
									
										89
									
								
								patches/net/minecraft/block/BlockButton.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								patches/net/minecraft/block/BlockButton.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockButton.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockButton.java
 | 
			
		||||
@@ -16,6 +16,10 @@
 | 
			
		||||
 
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 import static net.minecraftforge.common.util.ForgeDirection.*;
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent;
 | 
			
		||||
+import org.bukkit.event.entity.EntityInteractEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
 
 | 
			
		||||
 public abstract class BlockButton extends Block
 | 
			
		||||
 {
 | 
			
		||||
@@ -209,6 +213,19 @@
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            org.bukkit.block.Block block = p_149727_1_.getWorld().getBlockAt(p_149727_2_, p_149727_3_, p_149727_4_);
 | 
			
		||||
+            int old = (k1 != 8) ? 15 : 0;
 | 
			
		||||
+            int current = (k1 == 8) ? 15 : 0;
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current);
 | 
			
		||||
+            p_149727_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+
 | 
			
		||||
+            if ((eventRedstone.getNewCurrent() > 0) != (k1 == 8))
 | 
			
		||||
+            {
 | 
			
		||||
+                return true;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149727_1_.setBlockMetadataWithNotify(p_149727_2_, p_149727_3_, p_149727_4_, j1 + k1, 3);
 | 
			
		||||
             p_149727_1_.markBlockRangeForRenderUpdate(p_149727_2_, p_149727_3_, p_149727_4_, p_149727_2_, p_149727_3_, p_149727_4_);
 | 
			
		||||
             p_149727_1_.playSoundEffect((double)p_149727_2_ + 0.5D, (double)p_149727_3_ + 0.5D, (double)p_149727_4_ + 0.5D, "random.click", 0.3F, 0.6F);
 | 
			
		||||
@@ -262,6 +279,18 @@
 | 
			
		||||
 
 | 
			
		||||
             if ((l & 8) != 0)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.block.Block block = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0);
 | 
			
		||||
+                p_149674_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+
 | 
			
		||||
+                if (eventRedstone.getNewCurrent() > 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                 if (this.field_150047_a)
 | 
			
		||||
                 {
 | 
			
		||||
                     this.func_150046_n(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
@@ -309,6 +338,36 @@
 | 
			
		||||
         List list = p_150046_1_.getEntitiesWithinAABB(EntityArrow.class, AxisAlignedBB.getBoundingBox((double)p_150046_2_ + this.minX, (double)p_150046_3_ + this.minY, (double)p_150046_4_ + this.minZ, (double)p_150046_2_ + this.maxX, (double)p_150046_3_ + this.maxY, (double)p_150046_4_ + this.maxZ));
 | 
			
		||||
         boolean flag1 = !list.isEmpty();
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start - Call interact event when arrows turn on wooden buttons
 | 
			
		||||
+        if (flag != flag1 && flag1)
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.block.Block block = p_150046_1_.getWorld().getBlockAt(p_150046_2_, p_150046_3_, p_150046_4_);
 | 
			
		||||
+            boolean allowed = false;
 | 
			
		||||
+
 | 
			
		||||
+            // If all of the events are cancelled block the button press, else allow
 | 
			
		||||
+            for (Object object : list)
 | 
			
		||||
+            {
 | 
			
		||||
+                if (object != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
 | 
			
		||||
+                    p_150046_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                    if (!event.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        allowed = true;
 | 
			
		||||
+                        break;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            if (!allowed)
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (flag1 && !flag)
 | 
			
		||||
         {
 | 
			
		||||
             p_150046_1_.setBlockMetadataWithNotify(p_150046_2_, p_150046_3_, p_150046_4_, i1 | 8, 3);
 | 
			
		||||
							
								
								
									
										31
									
								
								patches/net/minecraft/block/BlockCactus.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								patches/net/minecraft/block/BlockCactus.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockCactus.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockCactus.java
 | 
			
		||||
@@ -17,6 +17,8 @@
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 import net.minecraftforge.common.IPlantable;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockCactus extends Block implements IPlantable
 | 
			
		||||
 {
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
@@ -47,9 +49,9 @@
 | 
			
		||||
             {
 | 
			
		||||
                 int i1 = p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
 
 | 
			
		||||
-                if (i1 == 15)
 | 
			
		||||
+                if (i1 >= (byte) range(3, (p_149674_1_.growthOdds / p_149674_1_.getSpigotConfig().cactusModifier * 15) + 0.5F, 15))   // Spigot // Cauldron
 | 
			
		||||
                 {
 | 
			
		||||
-                    p_149674_1_.setBlock(p_149674_2_, p_149674_3_ + 1, p_149674_4_, this);
 | 
			
		||||
+                    CraftEventFactory.handleBlockGrowEvent(p_149674_1_, p_149674_2_, p_149674_3_ + 1, p_149674_4_, this, 0); // CraftBukkit
 | 
			
		||||
                     p_149674_1_.setBlockMetadataWithNotify(p_149674_2_, p_149674_3_, p_149674_4_, 0, 4);
 | 
			
		||||
                     this.onNeighborBlockChange(p_149674_1_, p_149674_2_, p_149674_3_ + 1, p_149674_4_, this);
 | 
			
		||||
                 }
 | 
			
		||||
@@ -135,6 +137,7 @@
 | 
			
		||||
 
 | 
			
		||||
     public void onEntityCollidedWithBlock(World p_149670_1_, int p_149670_2_, int p_149670_3_, int p_149670_4_, Entity p_149670_5_)
 | 
			
		||||
     {
 | 
			
		||||
+        // Cauldron - moved CraftBukkit hook to func_145775_I() - doBlockCollisions
 | 
			
		||||
         p_149670_5_.attackEntityFrom(DamageSource.cactus, 1.0F);
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								patches/net/minecraft/block/BlockCake.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								patches/net/minecraft/block/BlockCake.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockCake.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockCake.java
 | 
			
		||||
@@ -12,6 +12,10 @@
 | 
			
		||||
 import net.minecraft.util.IIcon;
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
+import net.minecraft.network.play.server.S06PacketUpdateHealth;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
 
 | 
			
		||||
 public class BlockCake extends Block
 | 
			
		||||
 {
 | 
			
		||||
@@ -104,7 +108,17 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (p_150036_5_.canEat(false))
 | 
			
		||||
         {
 | 
			
		||||
-            p_150036_5_.getFoodStats().addStats(2, 0.1F);
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            int oldFoodLevel = p_150036_5_.getFoodStats().foodLevel;
 | 
			
		||||
+            org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(p_150036_5_, 2 + oldFoodLevel);
 | 
			
		||||
+
 | 
			
		||||
+            if (!event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                p_150036_5_.getFoodStats().addStats(event.getFoodLevel() - oldFoodLevel, 0.1F);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            ((EntityPlayerMP) p_150036_5_).playerNetServerHandler.sendPacket(new S06PacketUpdateHealth(((EntityPlayerMP) p_150036_5_).getBukkitEntity().getScaledHealth(), p_150036_5_.getFoodStats().foodLevel, p_150036_5_.getFoodStats().foodSaturationLevel));
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             int l = p_150036_1_.getBlockMetadata(p_150036_2_, p_150036_3_, p_150036_4_) + 1;
 | 
			
		||||
 
 | 
			
		||||
             if (l >= 6)
 | 
			
		||||
							
								
								
									
										12
									
								
								patches/net/minecraft/block/BlockCocoa.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								patches/net/minecraft/block/BlockCocoa.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockCocoa.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockCocoa.java
 | 
			
		||||
@@ -51,7 +51,8 @@
 | 
			
		||||
             if (i1 < 2)
 | 
			
		||||
             {
 | 
			
		||||
                 ++i1;
 | 
			
		||||
-                p_149674_1_.setBlockMetadataWithNotify(p_149674_2_, p_149674_3_, p_149674_4_, i1 << 2 | getDirection(l), 2);
 | 
			
		||||
+                // CraftBukkit
 | 
			
		||||
+                org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, this, i1 << 2 | getDirection(l));
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										34
									
								
								patches/net/minecraft/block/BlockCommandBlock.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								patches/net/minecraft/block/BlockCommandBlock.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockCommandBlock.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockCommandBlock.java
 | 
			
		||||
@@ -10,6 +10,8 @@
 | 
			
		||||
 import net.minecraft.tileentity.TileEntityCommandBlock;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockCommandBlock extends BlockContainer
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000219";
 | 
			
		||||
@@ -31,13 +33,20 @@
 | 
			
		||||
             boolean flag = p_149695_1_.isBlockIndirectlyGettingPowered(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
             int l = p_149695_1_.getBlockMetadata(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
             boolean flag1 = (l & 1) != 0;
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            org.bukkit.block.Block bukkitBlock = p_149695_1_.getWorld().getBlockAt(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
+            int old = flag1 ? 15 : 0;
 | 
			
		||||
+            int current = flag ? 15 : 0;
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current);
 | 
			
		||||
+            p_149695_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
 
 | 
			
		||||
-            if (flag && !flag1)
 | 
			
		||||
+            if (eventRedstone.getNewCurrent() > 0 && !(eventRedstone.getOldCurrent() > 0))   // CraftBukkit
 | 
			
		||||
             {
 | 
			
		||||
                 p_149695_1_.setBlockMetadataWithNotify(p_149695_2_, p_149695_3_, p_149695_4_, l | 1, 4);
 | 
			
		||||
                 p_149695_1_.scheduleBlockUpdate(p_149695_2_, p_149695_3_, p_149695_4_, this, this.tickRate(p_149695_1_));
 | 
			
		||||
             }
 | 
			
		||||
-            else if (!flag && flag1)
 | 
			
		||||
+            else if (!(eventRedstone.getNewCurrent() > 0) && eventRedstone.getOldCurrent() > 0)     // CraftBukkit
 | 
			
		||||
             {
 | 
			
		||||
                 p_149695_1_.setBlockMetadataWithNotify(p_149695_2_, p_149695_3_, p_149695_4_, l & -2, 4);
 | 
			
		||||
             }
 | 
			
		||||
							
								
								
									
										15
									
								
								patches/net/minecraft/block/BlockCrops.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								patches/net/minecraft/block/BlockCrops.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockCrops.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockCrops.java
 | 
			
		||||
@@ -49,10 +49,9 @@
 | 
			
		||||
             {
 | 
			
		||||
                 float f = this.func_149864_n(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
 
 | 
			
		||||
-                if (p_149674_5_.nextInt((int)(25.0F / f) + 1) == 0)
 | 
			
		||||
+                if (p_149674_5_.nextInt((int)(p_149674_1_.growthOdds / p_149674_1_.getSpigotConfig().wheatModifier * (25.0F / f)) + 1) == 0)    // Spigot // Cauldron
 | 
			
		||||
                 {
 | 
			
		||||
-                    ++l;
 | 
			
		||||
-                    p_149674_1_.setBlockMetadataWithNotify(p_149674_2_, p_149674_3_, p_149674_4_, l, 2);
 | 
			
		||||
+                    org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, this, ++l); // CraftBukkit
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										10
									
								
								patches/net/minecraft/block/BlockDaylightDetector.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								patches/net/minecraft/block/BlockDaylightDetector.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockDaylightDetector.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockDaylightDetector.java
 | 
			
		||||
@@ -73,6 +73,7 @@
 | 
			
		||||
 
 | 
			
		||||
             if (l != i1)
 | 
			
		||||
             {
 | 
			
		||||
+                i1 = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(p_149957_1_, p_149957_2_, p_149957_3_, p_149957_4_, l, i1).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent
 | 
			
		||||
                 p_149957_1_.setBlockMetadataWithNotify(p_149957_2_, p_149957_3_, p_149957_4_, i1, 3);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										28
									
								
								patches/net/minecraft/block/BlockDispenser.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								patches/net/minecraft/block/BlockDispenser.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockDispenser.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockDispenser.java
 | 
			
		||||
@@ -30,6 +30,7 @@
 | 
			
		||||
 {
 | 
			
		||||
     public static final IRegistry dispenseBehaviorRegistry = new RegistryDefaulted(new BehaviorDefaultDispenseItem());
 | 
			
		||||
     protected Random field_149942_b = new Random();
 | 
			
		||||
+    public static boolean eventFired = false; // CraftBukkit
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
     protected IIcon field_149944_M;
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
@@ -124,7 +125,8 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
-    protected void func_149941_e(World p_149941_1_, int p_149941_2_, int p_149941_3_, int p_149941_4_)
 | 
			
		||||
+    // CraftBukkit - protected -> public
 | 
			
		||||
+    public void func_149941_e(World p_149941_1_, int p_149941_2_, int p_149941_3_, int p_149941_4_)
 | 
			
		||||
     {
 | 
			
		||||
         BlockSourceImpl blocksourceimpl = new BlockSourceImpl(p_149941_1_, p_149941_2_, p_149941_3_, p_149941_4_);
 | 
			
		||||
         TileEntityDispenser tileentitydispenser = (TileEntityDispenser)blocksourceimpl.getBlockTileEntity();
 | 
			
		||||
@@ -145,6 +147,7 @@
 | 
			
		||||
                 if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider)
 | 
			
		||||
                 {
 | 
			
		||||
                     ItemStack itemstack1 = ibehaviordispenseitem.dispense(blocksourceimpl, itemstack);
 | 
			
		||||
+                    eventFired = false; // CraftBukkit - reset event status
 | 
			
		||||
                     tileentitydispenser.setInventorySlotContents(l, itemstack1.stackSize == 0 ? null : itemstack1);
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
							
								
								
									
										48
									
								
								patches/net/minecraft/block/BlockDoor.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								patches/net/minecraft/block/BlockDoor.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockDoor.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockDoor.java
 | 
			
		||||
@@ -16,6 +16,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockDoor extends Block
 | 
			
		||||
 {
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
@@ -329,15 +331,32 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     this.dropBlockAsItem(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, l, 0);
 | 
			
		||||
                 }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
             }
 | 
			
		||||
-            else
 | 
			
		||||
+            else if (p_149695_5_.canProvidePower())
 | 
			
		||||
             {
 | 
			
		||||
-                boolean flag1 = p_149695_1_.isBlockIndirectlyGettingPowered(p_149695_2_, p_149695_3_, p_149695_4_) || p_149695_1_.isBlockIndirectlyGettingPowered(p_149695_2_, p_149695_3_ + 1, p_149695_4_);
 | 
			
		||||
+                org.bukkit.World bworld = p_149695_1_.getWorld();
 | 
			
		||||
+                org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
+                org.bukkit.block.Block blockTop = bworld.getBlockAt(p_149695_2_, p_149695_3_ + 1, p_149695_4_);
 | 
			
		||||
+                int power = bukkitBlock.getBlockPower();
 | 
			
		||||
+                int powerTop = blockTop.getBlockPower();
 | 
			
		||||
 
 | 
			
		||||
-                if ((flag1 || p_149695_5_.canProvidePower()) && p_149695_5_ != this)
 | 
			
		||||
+                if (powerTop > power)
 | 
			
		||||
                 {
 | 
			
		||||
-                    this.func_150014_a(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, flag1);
 | 
			
		||||
+                    power = powerTop;
 | 
			
		||||
                 }
 | 
			
		||||
+
 | 
			
		||||
+                int oldPower = (p_149695_1_.getBlockMetadata(p_149695_2_, p_149695_3_, p_149695_4_) & 4) > 0 ? 15 : 0;
 | 
			
		||||
+
 | 
			
		||||
+                if (oldPower == 0 ^ power == 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power);
 | 
			
		||||
+                    p_149695_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+                    this.func_150014_a(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, eventRedstone.getNewCurrent() > 0);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
							
								
								
									
										44
									
								
								patches/net/minecraft/block/BlockDragonEgg.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								patches/net/minecraft/block/BlockDragonEgg.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockDragonEgg.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockDragonEgg.java
 | 
			
		||||
@@ -10,6 +10,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockDragonEgg extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000232";
 | 
			
		||||
@@ -43,7 +45,8 @@
 | 
			
		||||
 
 | 
			
		||||
             if (!BlockFalling.fallInstantly && p_150018_1_.checkChunksExist(p_150018_2_ - b0, p_150018_3_ - b0, p_150018_4_ - b0, p_150018_2_ + b0, p_150018_3_ + b0, p_150018_4_ + b0))
 | 
			
		||||
             {
 | 
			
		||||
-                EntityFallingBlock entityfallingblock = new EntityFallingBlock(p_150018_1_, (double)((float)p_150018_2_ + 0.5F), (double)((float)p_150018_3_ + 0.5F), (double)((float)p_150018_4_ + 0.5F), this);
 | 
			
		||||
+                // CraftBukkit - added data
 | 
			
		||||
+                EntityFallingBlock entityfallingblock = new EntityFallingBlock(p_150018_1_, (double)((float) p_150018_2_ + 0.5F), (double)((float) p_150018_3_ + 0.5F), (double)((float) p_150018_4_ + 0.5F), this, p_150018_1_.getBlockMetadata(p_150018_2_, p_150018_3_, p_150018_4_));
 | 
			
		||||
                 p_150018_1_.spawnEntityInWorld(entityfallingblock);
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
@@ -86,6 +89,22 @@
 | 
			
		||||
 
 | 
			
		||||
                 if (p_150019_1_.getBlock(i1, j1, k1).blockMaterial == Material.air)
 | 
			
		||||
                 {
 | 
			
		||||
+                    // CraftBukkit start
 | 
			
		||||
+                    org.bukkit.block.Block from = p_150019_1_.getWorld().getBlockAt(p_150019_2_, p_150019_3_, p_150019_4_);
 | 
			
		||||
+                    org.bukkit.block.Block to = p_150019_1_.getWorld().getBlockAt(i1, j1, k1);
 | 
			
		||||
+                    BlockFromToEvent event = new BlockFromToEvent(from, to);
 | 
			
		||||
+                    org.bukkit.Bukkit.getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                    if (event.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    i1 = event.getToBlock().getX();
 | 
			
		||||
+                    j1 = event.getToBlock().getY();
 | 
			
		||||
+                    k1 = event.getToBlock().getZ();
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                     if (!p_150019_1_.isRemote)
 | 
			
		||||
                     {
 | 
			
		||||
                         p_150019_1_.setBlock(i1, j1, k1, this, p_150019_1_.getBlockMetadata(p_150019_2_, p_150019_3_, p_150019_4_), 2);
 | 
			
		||||
							
								
								
									
										59
									
								
								patches/net/minecraft/block/BlockDropper.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								patches/net/minecraft/block/BlockDropper.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockDropper.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockDropper.java
 | 
			
		||||
@@ -13,6 +13,11 @@
 | 
			
		||||
 import net.minecraft.tileentity.TileEntityHopper;
 | 
			
		||||
 import net.minecraft.util.Facing;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
 | 
			
		||||
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
 | 
			
		||||
+import net.minecraft.inventory.InventoryLargeChest;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
 
 | 
			
		||||
 public class BlockDropper extends BlockDispenser
 | 
			
		||||
 {
 | 
			
		||||
@@ -38,7 +43,7 @@
 | 
			
		||||
         return new TileEntityDropper();
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
-    protected void func_149941_e(World p_149941_1_, int p_149941_2_, int p_149941_3_, int p_149941_4_)
 | 
			
		||||
+    public void func_149941_e(World p_149941_1_, int p_149941_2_, int p_149941_3_, int p_149941_4_)   // CraftBukkit - protected -> public
 | 
			
		||||
     {
 | 
			
		||||
         BlockSourceImpl blocksourceimpl = new BlockSourceImpl(p_149941_1_, p_149941_2_, p_149941_3_, p_149941_4_);
 | 
			
		||||
         TileEntityDispenser tileentitydispenser = (TileEntityDispenser)blocksourceimpl.getBlockTileEntity();
 | 
			
		||||
@@ -60,10 +65,33 @@
 | 
			
		||||
 
 | 
			
		||||
                 if (iinventory != null)
 | 
			
		||||
                 {
 | 
			
		||||
-                    itemstack1 = TileEntityHopper.func_145889_a(iinventory, itemstack.copy().splitStack(1), Facing.oppositeSide[i1]);
 | 
			
		||||
+                    // CraftBukkit start - Fire event when pushing items into other inventories
 | 
			
		||||
+                    CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.copy().splitStack(1));
 | 
			
		||||
+                    org.bukkit.inventory.Inventory destinationInventory;
 | 
			
		||||
 
 | 
			
		||||
-                    if (itemstack1 == null)
 | 
			
		||||
+                    // Have to special case large chests as they work oddly
 | 
			
		||||
+                    if (iinventory instanceof InventoryLargeChest)
 | 
			
		||||
                     {
 | 
			
		||||
+                        destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        destinationInventory = iinventory.getOwner().getInventory();
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
 | 
			
		||||
+                    p_149941_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                    if (event.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    itemstack1 = TileEntityHopper.func_145889_a(iinventory, CraftItemStack.asNMSCopy(event.getItem()), Facing.oppositeSide[i1]);
 | 
			
		||||
+
 | 
			
		||||
+                    if (event.getItem().equals(oitemstack) && itemstack1 == null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                         itemstack1 = itemstack.copy();
 | 
			
		||||
 
 | 
			
		||||
                         if (--itemstack1.stackSize == 0)
 | 
			
		||||
							
								
								
									
										162
									
								
								patches/net/minecraft/block/BlockDynamicLiquid.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								patches/net/minecraft/block/BlockDynamicLiquid.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockDynamicLiquid.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockDynamicLiquid.java
 | 
			
		||||
@@ -5,6 +5,11 @@
 | 
			
		||||
 import net.minecraft.init.Blocks;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.block.BlockFace;
 | 
			
		||||
+import org.bukkit.event.block.BlockFromToEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockDynamicLiquid extends BlockLiquid
 | 
			
		||||
 {
 | 
			
		||||
     int field_149815_a;
 | 
			
		||||
@@ -37,6 +42,12 @@
 | 
			
		||||
         int i1 = this.tickRate(p_149674_1_);
 | 
			
		||||
         int j1;
 | 
			
		||||
 
 | 
			
		||||
+        // Cauldron - move CB edit to after variable initialization for coremod compatibility
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+        org.bukkit.Server server = p_149674_1_.getServer();
 | 
			
		||||
+        org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         if (l > 0)
 | 
			
		||||
         {
 | 
			
		||||
             byte b1 = -100;
 | 
			
		||||
@@ -66,17 +77,22 @@
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            if (this.field_149815_a >= 2 && this.blockMaterial == Material.water)
 | 
			
		||||
+            // Cauldron start - allow disabling infinite water sources
 | 
			
		||||
+            if(net.minecraft.server.MinecraftServer.getServer().cauldronConfig.infiniteWaterSource.getValue())
 | 
			
		||||
             {
 | 
			
		||||
-                if (p_149674_1_.getBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_).getMaterial().isSolid())
 | 
			
		||||
+                if (this.field_149815_a >= 2 && this.blockMaterial == Material.water)
 | 
			
		||||
                 {
 | 
			
		||||
-                    j1 = 0;
 | 
			
		||||
+                    if (p_149674_1_.getBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_).getMaterial().isSolid())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        j1 = 0;
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else if (p_149674_1_.getBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_).getMaterial() == this.blockMaterial && p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_ - 1, p_149674_4_) == 0)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        j1 = 0;
 | 
			
		||||
+                    }
 | 
			
		||||
                 }
 | 
			
		||||
-                else if (p_149674_1_.getBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_).getMaterial() == this.blockMaterial && p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_ - 1, p_149674_4_) == 0)
 | 
			
		||||
-                {
 | 
			
		||||
-                    j1 = 0;
 | 
			
		||||
-                }
 | 
			
		||||
             }
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
 
 | 
			
		||||
             if (this.blockMaterial == Material.lava && l < 8 && j1 < 8 && j1 > l && p_149674_5_.nextInt(4) != 0)
 | 
			
		||||
             {
 | 
			
		||||
@@ -89,6 +105,13 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     this.func_149811_n(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
                 }
 | 
			
		||||
+                // Cauldron start - allow lava decaying at a 'natural' rate - see https://mojang.atlassian.net/browse/MC-4631 Lava decay fails to schedule block update
 | 
			
		||||
+                else if (net.minecraft.server.MinecraftServer.getServer().cauldronConfig.flowingLavaDecay.getValue())
 | 
			
		||||
+                {
 | 
			
		||||
+                    // Ensure that even if the flow decay was skipped, it will retry at the material's natural flow period.
 | 
			
		||||
+                    p_149674_1_.scheduleBlockUpdate(p_149674_2_, p_149674_3_, p_149674_4_, this, this.tickRate(p_149674_1_));
 | 
			
		||||
+                }
 | 
			
		||||
+                // Cauldron end
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
             {
 | 
			
		||||
@@ -113,21 +136,34 @@
 | 
			
		||||
 
 | 
			
		||||
         if (this.func_149809_q(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_))
 | 
			
		||||
         {
 | 
			
		||||
-            if (this.blockMaterial == Material.lava && p_149674_1_.getBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_).getMaterial() == Material.water)
 | 
			
		||||
+            // CraftBukkit start - Send "down" to the server
 | 
			
		||||
+            BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN);
 | 
			
		||||
+
 | 
			
		||||
+            if (server != null)
 | 
			
		||||
             {
 | 
			
		||||
-                p_149674_1_.setBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_, Blocks.stone);
 | 
			
		||||
-                this.func_149799_m(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_);
 | 
			
		||||
-                return;
 | 
			
		||||
+                server.getPluginManager().callEvent(event);
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            if (l >= 8)
 | 
			
		||||
+            if (!event.isCancelled())
 | 
			
		||||
             {
 | 
			
		||||
-                this.func_149813_h(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_, l);
 | 
			
		||||
+                if (this.blockMaterial == Material.lava && p_149674_1_.getBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_).getMaterial() == Material.water)
 | 
			
		||||
+                {
 | 
			
		||||
+                    p_149674_1_.setBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_, Blocks.stone);
 | 
			
		||||
+                    this.func_149799_m(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_);
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (l >= 8)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.func_149813_h(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_, l);
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.func_149813_h(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_, l + 8);
 | 
			
		||||
+                }
 | 
			
		||||
             }
 | 
			
		||||
-            else
 | 
			
		||||
-            {
 | 
			
		||||
-                this.func_149813_h(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_, l + 8);
 | 
			
		||||
-            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
         else if (l >= 0 && (l == 0 || this.func_149807_p(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_)))
 | 
			
		||||
         {
 | 
			
		||||
@@ -144,25 +180,31 @@
 | 
			
		||||
                 return;
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            if (aboolean[0])
 | 
			
		||||
-            {
 | 
			
		||||
-                this.func_149813_h(p_149674_1_, p_149674_2_ - 1, p_149674_3_, p_149674_4_, j1);
 | 
			
		||||
-            }
 | 
			
		||||
+            // CraftBukkit start - All four cardinal directions. Do not change the order!
 | 
			
		||||
+            BlockFace[] faces = new BlockFace[] { BlockFace.WEST, BlockFace.EAST, BlockFace.NORTH, BlockFace.SOUTH };
 | 
			
		||||
+            int index = 0;
 | 
			
		||||
 
 | 
			
		||||
-            if (aboolean[1])
 | 
			
		||||
+            for (BlockFace currentFace : faces)
 | 
			
		||||
             {
 | 
			
		||||
-                this.func_149813_h(p_149674_1_, p_149674_2_ + 1, p_149674_3_, p_149674_4_, j1);
 | 
			
		||||
-            }
 | 
			
		||||
+                if (aboolean[index])
 | 
			
		||||
+                {
 | 
			
		||||
+                    BlockFromToEvent event = new BlockFromToEvent(source, currentFace);
 | 
			
		||||
 
 | 
			
		||||
-            if (aboolean[2])
 | 
			
		||||
-            {
 | 
			
		||||
-                this.func_149813_h(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_ - 1, j1);
 | 
			
		||||
-            }
 | 
			
		||||
+                    if (server != null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        server.getPluginManager().callEvent(event);
 | 
			
		||||
+                    }
 | 
			
		||||
 
 | 
			
		||||
-            if (aboolean[3])
 | 
			
		||||
-            {
 | 
			
		||||
-                this.func_149813_h(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_ + 1, j1);
 | 
			
		||||
+                    if (!event.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.func_149813_h(p_149674_1_, p_149674_2_ + currentFace.getModX(), p_149674_3_, p_149674_4_ + currentFace.getModZ(), j1);
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                index++;
 | 
			
		||||
             }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								patches/net/minecraft/block/BlockEndPortal.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								patches/net/minecraft/block/BlockEndPortal.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockEndPortal.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockEndPortal.java
 | 
			
		||||
@@ -15,6 +15,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockEndPortal extends BlockContainer
 | 
			
		||||
 {
 | 
			
		||||
     public static boolean field_149948_a;
 | 
			
		||||
@@ -64,6 +66,10 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (p_149670_5_.ridingEntity == null && p_149670_5_.riddenByEntity == null && !p_149670_1_.isRemote)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start - Entity in portal
 | 
			
		||||
+            EntityPortalEnterEvent event = new EntityPortalEnterEvent(p_149670_5_.getBukkitEntity(), new org.bukkit.Location(p_149670_1_.getWorld(), p_149670_2_, p_149670_3_, p_149670_4_));
 | 
			
		||||
+            p_149670_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149670_5_.travelToDimension(1);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										57
									
								
								patches/net/minecraft/block/BlockFarmland.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								patches/net/minecraft/block/BlockFarmland.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockFarmland.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockFarmland.java
 | 
			
		||||
@@ -15,6 +15,11 @@
 | 
			
		||||
 import net.minecraftforge.common.IPlantable;
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.event.entity.EntityInteractEvent;
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockFarmland extends Block
 | 
			
		||||
 {
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
@@ -64,6 +69,15 @@
 | 
			
		||||
             }
 | 
			
		||||
             else if (!this.func_149822_e(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_))
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.block.Block block = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+
 | 
			
		||||
+                if (CraftEventFactory.callBlockFadeEvent(block, Blocks.dirt).isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.dirt);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
@@ -82,6 +96,26 @@
 | 
			
		||||
                 return;
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
+            // CraftBukkit start - Interact soil
 | 
			
		||||
+            // Cauldron start - validate data before sending event
 | 
			
		||||
+            org.bukkit.event.Cancellable cancellable = null;
 | 
			
		||||
+
 | 
			
		||||
+            if (p_149746_5_ instanceof EntityPlayer)
 | 
			
		||||
+            {
 | 
			
		||||
+                cancellable = CraftEventFactory.callPlayerInteractEvent((EntityPlayer) p_149746_5_, org.bukkit.event.block.Action.PHYSICAL, p_149746_2_, p_149746_3_, p_149746_4_, -1, null);
 | 
			
		||||
+            }
 | 
			
		||||
+            else if (p_149746_1_ != null && p_149746_1_.getWorld() != null && p_149746_5_ != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                cancellable = new EntityInteractEvent(p_149746_5_.getBukkitEntity(), p_149746_1_.getWorld().getBlockAt(p_149746_2_, p_149746_3_, p_149746_4_));
 | 
			
		||||
+                p_149746_1_.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            if (cancellable != null && cancellable.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149746_1_.setBlock(p_149746_2_, p_149746_3_, p_149746_4_, Blocks.dirt);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										129
									
								
								patches/net/minecraft/block/BlockFire.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								patches/net/minecraft/block/BlockFire.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockFire.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockFire.java
 | 
			
		||||
@@ -17,6 +17,11 @@
 | 
			
		||||
 import net.minecraft.world.WorldProviderEnd;
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 import static net.minecraftforge.common.util.ForgeDirection.*;
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+import org.bukkit.event.block.BlockBurnEvent;
 | 
			
		||||
+import org.bukkit.event.block.BlockSpreadEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
 
 | 
			
		||||
 public class BlockFire extends Block
 | 
			
		||||
 {
 | 
			
		||||
@@ -105,12 +110,12 @@
 | 
			
		||||
 
 | 
			
		||||
             if (!this.canPlaceBlockAt(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_))
 | 
			
		||||
             {
 | 
			
		||||
-                p_149674_1_.setBlockToAir(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                fireExtinguished(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_); // CraftBukkit - invalid place location
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
             if (!flag && p_149674_1_.isRaining() && (p_149674_1_.canLightningStrikeAt(p_149674_2_, p_149674_3_, p_149674_4_) || p_149674_1_.canLightningStrikeAt(p_149674_2_ - 1, p_149674_3_, p_149674_4_) || p_149674_1_.canLightningStrikeAt(p_149674_2_ + 1, p_149674_3_, p_149674_4_) || p_149674_1_.canLightningStrikeAt(p_149674_2_, p_149674_3_, p_149674_4_ - 1) || p_149674_1_.canLightningStrikeAt(p_149674_2_, p_149674_3_, p_149674_4_ + 1)))
 | 
			
		||||
             {
 | 
			
		||||
-                p_149674_1_.setBlockToAir(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                fireExtinguished(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_); // CraftBukkit - extinguished by rain
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
             {
 | 
			
		||||
@@ -127,12 +132,12 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     if (!World.doesBlockHaveSolidTopSurface(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_) || l > 3)
 | 
			
		||||
                     {
 | 
			
		||||
-                        p_149674_1_.setBlockToAir(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                        fireExtinguished(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_); // CraftBukkit - burn out of inflammable block
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
                 else if (!flag && !this.canCatchFire(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_, UP) && l == 15 && p_149674_5_.nextInt(4) == 0)
 | 
			
		||||
                 {
 | 
			
		||||
-                    p_149674_1_.setBlockToAir(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                    fireExtinguished(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_); // CraftBukkit - burn out
 | 
			
		||||
                 }
 | 
			
		||||
                 else
 | 
			
		||||
                 {
 | 
			
		||||
@@ -186,7 +191,29 @@
 | 
			
		||||
                                                 k2 = 15;
 | 
			
		||||
                                             }
 | 
			
		||||
 
 | 
			
		||||
-                                            p_149674_1_.setBlock(i1, k1, j1, this, k2, 3);
 | 
			
		||||
+                                            // CraftBukkit start - Call to stop spread of fire
 | 
			
		||||
+                                            if (p_149674_1_.getBlock(i1, k1, j1) != Blocks.fire)
 | 
			
		||||
+                                            {
 | 
			
		||||
+                                                if (CraftEventFactory.callBlockIgniteEvent(p_149674_1_, i1, k1, j1, p_149674_2_, p_149674_3_, p_149674_4_).isCancelled())
 | 
			
		||||
+                                                {
 | 
			
		||||
+                                                    continue;
 | 
			
		||||
+                                                }
 | 
			
		||||
+
 | 
			
		||||
+                                                org.bukkit.Server server = p_149674_1_.getServer();
 | 
			
		||||
+                                                org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+                                                org.bukkit.block.BlockState blockState = bworld.getBlockAt(i1, k1, j1).getState();
 | 
			
		||||
+                                                blockState.setTypeId(Block.getIdFromBlock(this));
 | 
			
		||||
+                                                blockState.setData(new org.bukkit.material.MaterialData(Block.getIdFromBlock(this), (byte) k2));
 | 
			
		||||
+                                                BlockSpreadEvent spreadEvent = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_), blockState);
 | 
			
		||||
+                                                server.getPluginManager().callEvent(spreadEvent);
 | 
			
		||||
+
 | 
			
		||||
+                                                if (!spreadEvent.isCancelled())
 | 
			
		||||
+                                                {
 | 
			
		||||
+                                                    blockState.update(true);
 | 
			
		||||
+                                                }
 | 
			
		||||
+                                            }
 | 
			
		||||
+
 | 
			
		||||
+                                            // CraftBukkit end
 | 
			
		||||
                                         }
 | 
			
		||||
                                     }
 | 
			
		||||
                                 }
 | 
			
		||||
@@ -216,7 +243,18 @@
 | 
			
		||||
         if (p_149841_6_.nextInt(p_149841_5_) < j1)
 | 
			
		||||
         {
 | 
			
		||||
             boolean flag = p_149841_1_.getBlock(p_149841_2_, p_149841_3_, p_149841_4_) == Blocks.tnt;
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            org.bukkit.block.Block theBlock = p_149841_1_.getWorld().getBlockAt(p_149841_2_, p_149841_3_, p_149841_4_);
 | 
			
		||||
+            BlockBurnEvent event = new BlockBurnEvent(theBlock);
 | 
			
		||||
+            p_149841_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
 
 | 
			
		||||
+            if (event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
             if (p_149841_6_.nextInt(p_149841_7_ + 10) < 5 && !p_149841_1_.canLightningStrikeAt(p_149841_2_, p_149841_3_, p_149841_4_))
 | 
			
		||||
             {
 | 
			
		||||
                 int k1 = p_149841_7_ + p_149841_6_.nextInt(5) / 4;
 | 
			
		||||
@@ -297,7 +335,7 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (!World.doesBlockHaveSolidTopSurface(p_149695_1_, p_149695_2_, p_149695_3_ - 1, p_149695_4_) && !this.canNeighborBurn(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_))
 | 
			
		||||
         {
 | 
			
		||||
-            p_149695_1_.setBlockToAir(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
+            fireExtinguished(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_); // CraftBukkit - fuel block gone
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -307,7 +345,7 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (!World.doesBlockHaveSolidTopSurface(p_149726_1_, p_149726_2_, p_149726_3_ - 1, p_149726_4_) && !this.canNeighborBurn(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_))
 | 
			
		||||
             {
 | 
			
		||||
-                p_149726_1_.setBlockToAir(p_149726_2_, p_149726_3_, p_149726_4_);
 | 
			
		||||
+                fireExtinguished(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_); // CraftBukkit - fuel block broke
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
             {
 | 
			
		||||
@@ -398,6 +436,16 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    private void fireExtinguished(World world, int x, int y, int z)
 | 
			
		||||
+    {
 | 
			
		||||
+        if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(x, y, z), Blocks.air).isCancelled())
 | 
			
		||||
+        {
 | 
			
		||||
+            world.setBlockToAir(x, y, z);
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
     public void registerBlockIcons(IIconRegister p_149651_1_)
 | 
			
		||||
     {
 | 
			
		||||
							
								
								
									
										64
									
								
								patches/net/minecraft/block/BlockGrass.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								patches/net/minecraft/block/BlockGrass.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockGrass.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockGrass.java
 | 
			
		||||
@@ -15,6 +15,12 @@
 | 
			
		||||
 import org.apache.logging.log4j.LogManager;
 | 
			
		||||
 import org.apache.logging.log4j.Logger;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.block.BlockState;
 | 
			
		||||
+import org.bukkit.event.block.BlockSpreadEvent;
 | 
			
		||||
+import org.bukkit.event.block.BlockFadeEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockGrass extends Block implements IGrowable
 | 
			
		||||
 {
 | 
			
		||||
     private static final Logger logger = LogManager.getLogger();
 | 
			
		||||
@@ -45,11 +51,25 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) < 4 && p_149674_1_.getBlockLightOpacity(p_149674_2_, p_149674_3_ + 1, p_149674_4_) > 2)
 | 
			
		||||
             {
 | 
			
		||||
-                p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.dirt);
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+                BlockState blockState = bworld.getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_).getState();
 | 
			
		||||
+                blockState.setTypeId(Block.getIdFromBlock(Blocks.dirt));
 | 
			
		||||
+                BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState);
 | 
			
		||||
+                p_149674_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (!event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    blockState.update(true);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
             else if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) >= 9)
 | 
			
		||||
             {
 | 
			
		||||
-                for (int l = 0; l < 4; ++l)
 | 
			
		||||
+                int numGrowth = Math.min(4, Math.max(20, (int)(4 * 100F / p_149674_1_.growthOdds)));  // Spigot
 | 
			
		||||
+
 | 
			
		||||
+                for (int l = 0; l < numGrowth; ++l)   // Spigot
 | 
			
		||||
                 {
 | 
			
		||||
                     int i1 = p_149674_2_ + p_149674_5_.nextInt(3) - 1;
 | 
			
		||||
                     int j1 = p_149674_3_ + p_149674_5_.nextInt(5) - 3;
 | 
			
		||||
@@ -58,7 +78,19 @@
 | 
			
		||||
 
 | 
			
		||||
                     if (p_149674_1_.getBlock(i1, j1, k1) == Blocks.dirt && p_149674_1_.getBlockMetadata(i1, j1, k1) == 0 && p_149674_1_.getBlockLightValue(i1, j1 + 1, k1) >= 4 && p_149674_1_.getBlockLightOpacity(i1, j1 + 1, k1) <= 2)
 | 
			
		||||
                     {
 | 
			
		||||
-                        p_149674_1_.setBlock(i1, j1, k1, Blocks.grass);
 | 
			
		||||
+                        // CraftBukkit start
 | 
			
		||||
+                        org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+                        BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState();
 | 
			
		||||
+                        blockState.setTypeId(Block.getIdFromBlock(Blocks.grass));
 | 
			
		||||
+                        BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_), blockState);
 | 
			
		||||
+                        p_149674_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                        if (!event.isCancelled())
 | 
			
		||||
+                        {
 | 
			
		||||
+                            blockState.update(true);
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
							
								
								
									
										19
									
								
								patches/net/minecraft/block/BlockHopper.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								patches/net/minecraft/block/BlockHopper.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockHopper.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockHopper.java
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
 import net.minecraft.util.IIcon;
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
+import net.minecraft.inventory.IInventory; // CraftBukkit
 | 
			
		||||
 
 | 
			
		||||
 public class BlockHopper extends BlockContainer
 | 
			
		||||
 {
 | 
			
		||||
@@ -210,7 +211,7 @@
 | 
			
		||||
 
 | 
			
		||||
     public static int getDirectionFromMetadata(int p_149918_0_)
 | 
			
		||||
     {
 | 
			
		||||
-        return p_149918_0_ & 7;
 | 
			
		||||
+        return Math.min(p_149918_0_ & 7, 5); // CraftBukkit - Fix AIOOBE in callers
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public static boolean func_149917_c(int p_149917_0_)
 | 
			
		||||
							
								
								
									
										17
									
								
								patches/net/minecraft/block/BlockIce.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								patches/net/minecraft/block/BlockIce.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockIce.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockIce.java
 | 
			
		||||
@@ -86,6 +86,14 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (p_149674_1_.getSavedLightValue(EnumSkyBlock.Block, p_149674_2_, p_149674_3_, p_149674_4_) > 11 - this.getLightOpacity())
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_), Blocks.water).isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
             if (p_149674_1_.provider.isHellWorld)
 | 
			
		||||
             {
 | 
			
		||||
                 p_149674_1_.setBlockToAir(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
							
								
								
									
										26
									
								
								patches/net/minecraft/block/BlockJukebox.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								patches/net/minecraft/block/BlockJukebox.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockJukebox.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockJukebox.java
 | 
			
		||||
@@ -163,8 +163,23 @@
 | 
			
		||||
 
 | 
			
		||||
             public void func_145857_a(ItemStack p_145857_1_)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start - There can only be one
 | 
			
		||||
+                if (p_145857_1_ != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    p_145857_1_.stackSize = 1;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 this.field_145858_a = p_145857_1_;
 | 
			
		||||
                 this.markDirty();
 | 
			
		||||
             }
 | 
			
		||||
+
 | 
			
		||||
+            // Cauldron start
 | 
			
		||||
+            @Override
 | 
			
		||||
+            public boolean canUpdate()
 | 
			
		||||
+            {
 | 
			
		||||
+                return false;
 | 
			
		||||
+            }
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
         }
 | 
			
		||||
 }
 | 
			
		||||
							
								
								
									
										28
									
								
								patches/net/minecraft/block/BlockLeaves.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								patches/net/minecraft/block/BlockLeaves.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockLeaves.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockLeaves.java
 | 
			
		||||
@@ -18,6 +18,8 @@
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 import net.minecraftforge.common.IShearable;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public abstract class BlockLeaves extends BlockLeavesBase implements IShearable
 | 
			
		||||
 {
 | 
			
		||||
     int[] field_150128_a;
 | 
			
		||||
@@ -222,6 +224,16 @@
 | 
			
		||||
 
 | 
			
		||||
     private void removeLeaves(World p_150126_1_, int p_150126_2_, int p_150126_3_, int p_150126_4_)
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        LeavesDecayEvent event = new LeavesDecayEvent(p_150126_1_.getWorld().getBlockAt(p_150126_2_, p_150126_3_, p_150126_4_));
 | 
			
		||||
+        p_150126_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+        if (event.isCancelled())
 | 
			
		||||
+        {
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         this.dropBlockAsItem(p_150126_1_, p_150126_2_, p_150126_3_, p_150126_4_, p_150126_1_.getBlockMetadata(p_150126_2_, p_150126_3_, p_150126_4_), 0);
 | 
			
		||||
         p_150126_1_.setBlockToAir(p_150126_2_, p_150126_3_, p_150126_4_);
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										31
									
								
								patches/net/minecraft/block/BlockLever.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								patches/net/minecraft/block/BlockLever.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockLever.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockLever.java
 | 
			
		||||
@@ -13,6 +13,8 @@
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 import static net.minecraftforge.common.util.ForgeDirection.*;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockLever extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000264";
 | 
			
		||||
@@ -270,6 +272,19 @@
 | 
			
		||||
             int i1 = p_149727_1_.getBlockMetadata(p_149727_2_, p_149727_3_, p_149727_4_);
 | 
			
		||||
             int j1 = i1 & 7;
 | 
			
		||||
             int k1 = 8 - (i1 & 8);
 | 
			
		||||
+            // CraftBukkit start - Interact Lever
 | 
			
		||||
+            org.bukkit.block.Block block = p_149727_1_.getWorld().getBlockAt(p_149727_2_, p_149727_3_, p_149727_4_);
 | 
			
		||||
+            int old = (k1 != 8) ? 15 : 0;
 | 
			
		||||
+            int current = (k1 == 8) ? 15 : 0;
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current);
 | 
			
		||||
+            p_149727_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+
 | 
			
		||||
+            if ((eventRedstone.getNewCurrent() > 0) != (k1 == 8))
 | 
			
		||||
+            {
 | 
			
		||||
+                return true;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149727_1_.setBlockMetadataWithNotify(p_149727_2_, p_149727_3_, p_149727_4_, j1 + k1, 3);
 | 
			
		||||
             p_149727_1_.playSoundEffect((double)p_149727_2_ + 0.5D, (double)p_149727_3_ + 0.5D, (double)p_149727_4_ + 0.5D, "random.click", 0.3F, k1 > 0 ? 0.6F : 0.5F);
 | 
			
		||||
             p_149727_1_.notifyBlocksOfNeighborChange(p_149727_2_, p_149727_3_, p_149727_4_, this);
 | 
			
		||||
							
								
								
									
										60
									
								
								patches/net/minecraft/block/BlockMushroom.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								patches/net/minecraft/block/BlockMushroom.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockMushroom.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockMushroom.java
 | 
			
		||||
@@ -6,6 +6,12 @@
 | 
			
		||||
 import net.minecraft.world.gen.feature.WorldGenBigMushroom;
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.block.BlockState;
 | 
			
		||||
+import org.bukkit.event.block.BlockSpreadEvent;
 | 
			
		||||
+import org.bukkit.TreeType;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockMushroom extends BlockBush implements IGrowable
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000272";
 | 
			
		||||
@@ -19,7 +25,9 @@
 | 
			
		||||
 
 | 
			
		||||
     public void updateTick(World p_149674_1_, int p_149674_2_, int p_149674_3_, int p_149674_4_, Random p_149674_5_)
 | 
			
		||||
     {
 | 
			
		||||
-        if (p_149674_5_.nextInt(25) == 0)
 | 
			
		||||
+        final int sourceX = p_149674_2_, sourceY = p_149674_3_, sourceZ = p_149674_4_; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
+        if (p_149674_5_.nextInt(Math.max(1, (int) p_149674_1_.growthOdds / p_149674_1_.getSpigotConfig().mushroomModifier * 25)) == 0)   // Spigot // Cauldron
 | 
			
		||||
         {
 | 
			
		||||
             byte b0 = 4;
 | 
			
		||||
             int l = 5;
 | 
			
		||||
@@ -66,7 +74,19 @@
 | 
			
		||||
 
 | 
			
		||||
             if (p_149674_1_.isAirBlock(i1, j1, k1) && this.canBlockStay(p_149674_1_, i1, j1, k1))
 | 
			
		||||
             {
 | 
			
		||||
-                p_149674_1_.setBlock(i1, j1, k1, this, 0, 2);
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+                BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState();
 | 
			
		||||
+                blockState.setTypeId(Block.getIdFromBlock(this)); // nms: this.id, 0, 2
 | 
			
		||||
+                BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(sourceX, sourceY, sourceZ), blockState);
 | 
			
		||||
+                p_149674_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (!event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    blockState.update(true);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
@@ -102,10 +122,12 @@
 | 
			
		||||
 
 | 
			
		||||
         if (this == Blocks.brown_mushroom)
 | 
			
		||||
         {
 | 
			
		||||
+            BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit
 | 
			
		||||
             worldgenbigmushroom = new WorldGenBigMushroom(0);
 | 
			
		||||
         }
 | 
			
		||||
         else if (this == Blocks.red_mushroom)
 | 
			
		||||
         {
 | 
			
		||||
+            BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit
 | 
			
		||||
             worldgenbigmushroom = new WorldGenBigMushroom(1);
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								patches/net/minecraft/block/BlockMycelium.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								patches/net/minecraft/block/BlockMycelium.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockMycelium.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockMycelium.java
 | 
			
		||||
@@ -12,6 +12,12 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.block.BlockState;
 | 
			
		||||
+import org.bukkit.event.block.BlockFadeEvent;
 | 
			
		||||
+import org.bukkit.event.block.BlockSpreadEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockMycelium extends Block
 | 
			
		||||
 {
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
@@ -39,11 +45,25 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) < 4 && p_149674_1_.getBlockLightOpacity(p_149674_2_, p_149674_3_ + 1, p_149674_4_) > 2)
 | 
			
		||||
             {
 | 
			
		||||
-                p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.dirt);
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+                BlockState blockState = bworld.getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_).getState();
 | 
			
		||||
+                blockState.setTypeId(Block.getIdFromBlock(Blocks.dirt));
 | 
			
		||||
+                BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState);
 | 
			
		||||
+                p_149674_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (!event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    blockState.update(true);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
             else if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) >= 9)
 | 
			
		||||
             {
 | 
			
		||||
-                for (int l = 0; l < 4; ++l)
 | 
			
		||||
+                int numGrowth = Math.min(4, Math.max(20, (int)(4 * 100F / p_149674_1_.growthOdds)));  // Spigot
 | 
			
		||||
+
 | 
			
		||||
+                for (int l = 0; l < numGrowth; ++l)   // Spigot
 | 
			
		||||
                 {
 | 
			
		||||
                     int i1 = p_149674_2_ + p_149674_5_.nextInt(3) - 1;
 | 
			
		||||
                     int j1 = p_149674_3_ + p_149674_5_.nextInt(5) - 3;
 | 
			
		||||
@@ -52,7 +72,19 @@
 | 
			
		||||
 
 | 
			
		||||
                     if (p_149674_1_.getBlock(i1, j1, k1) == Blocks.dirt && p_149674_1_.getBlockMetadata(i1, j1, k1) == 0 && p_149674_1_.getBlockLightValue(i1, j1 + 1, k1) >= 4 && p_149674_1_.getBlockLightOpacity(i1, j1 + 1, k1) <= 2)
 | 
			
		||||
                     {
 | 
			
		||||
-                        p_149674_1_.setBlock(i1, j1, k1, this);
 | 
			
		||||
+                        // CraftBukkit start
 | 
			
		||||
+                        org.bukkit.World bworld = p_149674_1_.getWorld();
 | 
			
		||||
+                        BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState();
 | 
			
		||||
+                        blockState.setTypeId(Block.getIdFromBlock(this));
 | 
			
		||||
+                        BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_), blockState);
 | 
			
		||||
+                        p_149674_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                        if (!event.isCancelled())
 | 
			
		||||
+                        {
 | 
			
		||||
+                            blockState.update(true);
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
							
								
								
									
										11
									
								
								patches/net/minecraft/block/BlockNetherWart.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								patches/net/minecraft/block/BlockNetherWart.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockNetherWart.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockNetherWart.java
 | 
			
		||||
@@ -45,7 +45,7 @@
 | 
			
		||||
         if (l < 3 && p_149674_5_.nextInt(10) == 0)
 | 
			
		||||
         {
 | 
			
		||||
             ++l;
 | 
			
		||||
-            p_149674_1_.setBlockMetadataWithNotify(p_149674_2_, p_149674_3_, p_149674_4_, l, 2);
 | 
			
		||||
+            org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, this, l); // CraftBukkit
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         super.updateTick(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_5_);
 | 
			
		||||
							
								
								
									
										32
									
								
								patches/net/minecraft/block/BlockNetherrack.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								patches/net/minecraft/block/BlockNetherrack.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockNetherrack.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockNetherrack.java
 | 
			
		||||
@@ -4,6 +4,11 @@
 | 
			
		||||
 import net.minecraft.block.material.Material;
 | 
			
		||||
 import net.minecraft.creativetab.CreativeTabs;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent;
 | 
			
		||||
+import net.minecraft.world.World;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockNetherrack extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000275";
 | 
			
		||||
@@ -18,4 +23,17 @@
 | 
			
		||||
     {
 | 
			
		||||
         return MapColor.netherrackColor;
 | 
			
		||||
     }
 | 
			
		||||
+
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    public void doPhysics(World world, int i, int j, int k, int l)
 | 
			
		||||
+    {
 | 
			
		||||
+        if (Block.getBlockById(l) != null && Block.getBlockById(l).canProvidePower())
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k);
 | 
			
		||||
+            int power = block.getBlockPower();
 | 
			
		||||
+            BlockRedstoneEvent event = new BlockRedstoneEvent(block, power, power);
 | 
			
		||||
+            world.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
 }
 | 
			
		||||
							
								
								
									
										116
									
								
								patches/net/minecraft/block/BlockPistonBase.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								patches/net/minecraft/block/BlockPistonBase.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockPistonBase.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockPistonBase.java
 | 
			
		||||
@@ -21,6 +21,12 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.block.CraftBlock;
 | 
			
		||||
+import org.bukkit.event.block.BlockPistonRetractEvent;
 | 
			
		||||
+import org.bukkit.event.block.BlockPistonExtendEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockPistonBase extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private final boolean isSticky;
 | 
			
		||||
@@ -128,13 +134,37 @@
 | 
			
		||||
 
 | 
			
		||||
             if (flag && !isExtended(l))
 | 
			
		||||
             {
 | 
			
		||||
-                if (canExtend(p_150078_1_, p_150078_2_, p_150078_3_, p_150078_4_, i1))
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                int length = canExtend_IntCB(p_150078_1_, p_150078_2_, p_150078_3_, p_150078_4_, i1);
 | 
			
		||||
+
 | 
			
		||||
+                if (length >= 0)
 | 
			
		||||
                 {
 | 
			
		||||
+                    org.bukkit.block.Block block = p_150078_1_.getWorld().getBlockAt(p_150078_2_, p_150078_3_, p_150078_4_);
 | 
			
		||||
+                    BlockPistonExtendEvent event = new BlockPistonExtendEvent(block, length, CraftBlock.notchToBlockFace(i1));
 | 
			
		||||
+                    p_150078_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                    if (event.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     p_150078_1_.addBlockEvent(p_150078_2_, p_150078_3_, p_150078_4_, this, 0, i1);
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
             else if (!flag && isExtended(l))
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.block.Block block = p_150078_1_.getWorld().getBlockAt(p_150078_2_, p_150078_3_, p_150078_4_);
 | 
			
		||||
+                BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, CraftBlock.notchToBlockFace(i1));
 | 
			
		||||
+                p_150078_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_150078_1_.setBlockMetadataWithNotify(p_150078_2_, p_150078_3_, p_150078_4_, i1, 2);
 | 
			
		||||
                 p_150078_1_.addBlockEvent(p_150078_2_, p_150078_3_, p_150078_4_, this, 1, i1);
 | 
			
		||||
             }
 | 
			
		||||
@@ -297,6 +327,11 @@
 | 
			
		||||
 
 | 
			
		||||
     public static int getPistonOrientation(int p_150076_0_)
 | 
			
		||||
     {
 | 
			
		||||
+        if ((p_150076_0_ & 7) >= Facing.oppositeSide.length)
 | 
			
		||||
+        {
 | 
			
		||||
+            return 7;    // CraftBukkit - check for AIOOB on piston data
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
         return p_150076_0_ & 7;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -366,7 +401,13 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
-    private static boolean canExtend(World p_150077_0_, int p_150077_1_, int p_150077_2_, int p_150077_3_, int p_150077_4_)
 | 
			
		||||
+    // Cauldron start - vanilla compatibility
 | 
			
		||||
+    private static boolean canExtend(World world, int i, int j, int k, int l) {
 | 
			
		||||
+        return canExtend_IntCB(world, i, j, k, l) >= 0;
 | 
			
		||||
+    }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
+
 | 
			
		||||
+    private static int canExtend_IntCB(World p_150077_0_, int p_150077_1_, int p_150077_2_, int p_150077_3_, int p_150077_4_) // CraftBukkit int -> boolean
 | 
			
		||||
     {
 | 
			
		||||
         int i1 = p_150077_1_ + Facing.offsetsXForSide[p_150077_4_];
 | 
			
		||||
         int j1 = p_150077_2_ + Facing.offsetsYForSide[p_150077_4_];
 | 
			
		||||
@@ -379,7 +420,7 @@
 | 
			
		||||
             {
 | 
			
		||||
                 if (j1 <= 0 || j1 >= p_150077_0_.getHeight())
 | 
			
		||||
                 {
 | 
			
		||||
-                    return false;
 | 
			
		||||
+                    return -1; // CraftBukkit
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
                 Block block = p_150077_0_.getBlock(i1, j1, k1);
 | 
			
		||||
@@ -388,14 +429,14 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     if (!canPushBlock(block, p_150077_0_, i1, j1, k1, true))
 | 
			
		||||
                     {
 | 
			
		||||
-                        return false;
 | 
			
		||||
+                        return -1; // CraftBukkit
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
                     if (block.getMobilityFlag() != 1)
 | 
			
		||||
                     {
 | 
			
		||||
                         if (l1 == 12)
 | 
			
		||||
                         {
 | 
			
		||||
-                            return false;
 | 
			
		||||
+                            return -1; // CraftBukkit
 | 
			
		||||
                         }
 | 
			
		||||
 
 | 
			
		||||
                         i1 += Facing.offsetsXForSide[p_150077_4_];
 | 
			
		||||
@@ -407,7 +448,7 @@
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            return true;
 | 
			
		||||
+            return l1; // CraftBukkit
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								patches/net/minecraft/block/BlockPistonExtension.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								patches/net/minecraft/block/BlockPistonExtension.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockPistonExtension.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockPistonExtension.java
 | 
			
		||||
@@ -55,6 +55,12 @@
 | 
			
		||||
     public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_)
 | 
			
		||||
     {
 | 
			
		||||
         super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_);
 | 
			
		||||
+
 | 
			
		||||
+        if ((p_149749_6_ & 7) >= Facing.oppositeSide.length)
 | 
			
		||||
+        {
 | 
			
		||||
+            return;    // CraftBukkit - fix a piston AIOOBE issue
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
         int i1 = Facing.oppositeSide[getDirectionMeta(p_149749_6_)];
 | 
			
		||||
         p_149749_2_ += Facing.offsetsXForSide[i1];
 | 
			
		||||
         p_149749_3_ += Facing.offsetsYForSide[i1];
 | 
			
		||||
@@ -200,6 +206,12 @@
 | 
			
		||||
     public void onNeighborBlockChange(World p_149695_1_, int p_149695_2_, int p_149695_3_, int p_149695_4_, Block p_149695_5_)
 | 
			
		||||
     {
 | 
			
		||||
         int l = getDirectionMeta(p_149695_1_.getBlockMetadata(p_149695_2_, p_149695_3_, p_149695_4_));
 | 
			
		||||
+
 | 
			
		||||
+        if ((l & 7) >= Facing.oppositeSide.length)
 | 
			
		||||
+        {
 | 
			
		||||
+            return;    // CraftBukkit - fix a piston AIOOBE issue
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
         Block block1 = p_149695_1_.getBlock(p_149695_2_ - Facing.offsetsXForSide[l], p_149695_3_ - Facing.offsetsYForSide[l], p_149695_4_ - Facing.offsetsZForSide[l]);
 | 
			
		||||
 
 | 
			
		||||
         if (block1 != Blocks.piston && block1 != Blocks.sticky_piston)
 | 
			
		||||
							
								
								
									
										383
									
								
								patches/net/minecraft/block/BlockPortal.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										383
									
								
								patches/net/minecraft/block/BlockPortal.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,383 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockPortal.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockPortal.java
 | 
			
		||||
@@ -14,6 +14,11 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.event.entity.EntityPortalEnterEvent;
 | 
			
		||||
+import org.bukkit.event.world.PortalCreateEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockPortal extends BlockBreakable
 | 
			
		||||
 {
 | 
			
		||||
     public static final int[][] field_150001_a = new int[][] {new int[0], {3, 1}, {2, 0}};
 | 
			
		||||
@@ -29,7 +34,7 @@
 | 
			
		||||
     {
 | 
			
		||||
         super.updateTick(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_5_);
 | 
			
		||||
 
 | 
			
		||||
-        if (p_149674_1_.provider.isSurfaceWorld() && p_149674_1_.getGameRules().getGameRuleBooleanValue("doMobSpawning") && p_149674_5_.nextInt(2000) < p_149674_1_.difficultySetting.getDifficultyId())
 | 
			
		||||
+        if (p_149674_1_.getSpigotConfig().enableZombiePigmenPortalSpawns && p_149674_1_.provider.isSurfaceWorld() && p_149674_1_.getGameRules().getGameRuleBooleanValue("doMobSpawning") && p_149674_5_.nextInt(2000) < p_149674_1_.difficultySetting.getDifficultyId())   // Spigot // Cauldron
 | 
			
		||||
         {
 | 
			
		||||
             int l;
 | 
			
		||||
 
 | 
			
		||||
@@ -104,13 +109,15 @@
 | 
			
		||||
 
 | 
			
		||||
         if (size.func_150860_b() && size.field_150864_e == 0)
 | 
			
		||||
         {
 | 
			
		||||
-            size.func_150859_c();
 | 
			
		||||
-            return true;
 | 
			
		||||
+            // CraftBukkit start - return portalcreator
 | 
			
		||||
+            return size.CB_func_150859_c(); // Cauldron
 | 
			
		||||
+            //return true;
 | 
			
		||||
         }
 | 
			
		||||
         else if (size1.func_150860_b() && size1.field_150864_e == 0)
 | 
			
		||||
         {
 | 
			
		||||
-            size1.func_150859_c();
 | 
			
		||||
-            return true;
 | 
			
		||||
+            return size1.CB_func_150859_c(); // Cauldron
 | 
			
		||||
+            //return true;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
@@ -181,6 +188,10 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (p_149670_5_.ridingEntity == null && p_149670_5_.riddenByEntity == null)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start - Entity in portal
 | 
			
		||||
+            EntityPortalEnterEvent event = new EntityPortalEnterEvent(p_149670_5_.getBukkitEntity(), new org.bukkit.Location(p_149670_1_.getWorld(), p_149670_2_, p_149670_3_, p_149670_4_));
 | 
			
		||||
+            p_149670_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149670_5_.setInPortal();
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
@@ -239,175 +250,223 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public static class Size
 | 
			
		||||
+    {
 | 
			
		||||
+        private final World field_150867_a;
 | 
			
		||||
+        private final int field_150865_b;
 | 
			
		||||
+        private final int field_150866_c;
 | 
			
		||||
+        private final int field_150863_d;
 | 
			
		||||
+        private int field_150864_e = 0;
 | 
			
		||||
+        private ChunkCoordinates field_150861_f;
 | 
			
		||||
+        private int field_150862_g;
 | 
			
		||||
+        private int field_150868_h;
 | 
			
		||||
+        java.util.Collection<org.bukkit.block.Block> blocks; // CraftBukkit
 | 
			
		||||
+        private static final String __OBFID = "CL_00000285";
 | 
			
		||||
+
 | 
			
		||||
+        public Size(World p_i45415_1_, int p_i45415_2_, int p_i45415_3_, int p_i45415_4_, int p_i45415_5_)
 | 
			
		||||
         {
 | 
			
		||||
-            private final World field_150867_a;
 | 
			
		||||
-            private final int field_150865_b;
 | 
			
		||||
-            private final int field_150866_c;
 | 
			
		||||
-            private final int field_150863_d;
 | 
			
		||||
-            private int field_150864_e = 0;
 | 
			
		||||
-            private ChunkCoordinates field_150861_f;
 | 
			
		||||
-            private int field_150862_g;
 | 
			
		||||
-            private int field_150868_h;
 | 
			
		||||
-            private static final String __OBFID = "CL_00000285";
 | 
			
		||||
+            this.field_150867_a = p_i45415_1_;
 | 
			
		||||
+            this.field_150865_b = p_i45415_5_;
 | 
			
		||||
+            this.field_150863_d = BlockPortal.field_150001_a[p_i45415_5_][0];
 | 
			
		||||
+            this.field_150866_c = BlockPortal.field_150001_a[p_i45415_5_][1];
 | 
			
		||||
 
 | 
			
		||||
-            public Size(World p_i45415_1_, int p_i45415_2_, int p_i45415_3_, int p_i45415_4_, int p_i45415_5_)
 | 
			
		||||
+            for (int i1 = p_i45415_3_; p_i45415_3_ > i1 - 21 && p_i45415_3_ > 0 && this.func_150857_a(p_i45415_1_.getBlock(p_i45415_2_, p_i45415_3_ - 1, p_i45415_4_)); --p_i45415_3_)
 | 
			
		||||
             {
 | 
			
		||||
-                this.field_150867_a = p_i45415_1_;
 | 
			
		||||
-                this.field_150865_b = p_i45415_5_;
 | 
			
		||||
-                this.field_150863_d = BlockPortal.field_150001_a[p_i45415_5_][0];
 | 
			
		||||
-                this.field_150866_c = BlockPortal.field_150001_a[p_i45415_5_][1];
 | 
			
		||||
+                ;
 | 
			
		||||
+            }
 | 
			
		||||
 
 | 
			
		||||
-                for (int i1 = p_i45415_3_; p_i45415_3_ > i1 - 21 && p_i45415_3_ > 0 && this.func_150857_a(p_i45415_1_.getBlock(p_i45415_2_, p_i45415_3_ - 1, p_i45415_4_)); --p_i45415_3_)
 | 
			
		||||
+            int j1 = this.func_150853_a(p_i45415_2_, p_i45415_3_, p_i45415_4_, this.field_150863_d) - 1;
 | 
			
		||||
+
 | 
			
		||||
+            if (j1 >= 0)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.field_150861_f = new ChunkCoordinates(p_i45415_2_ + j1 * Direction.offsetX[this.field_150863_d], p_i45415_3_, p_i45415_4_ + j1 * Direction.offsetZ[this.field_150863_d]);
 | 
			
		||||
+                this.field_150868_h = this.func_150853_a(this.field_150861_f.posX, this.field_150861_f.posY, this.field_150861_f.posZ, this.field_150866_c);
 | 
			
		||||
+
 | 
			
		||||
+                if (this.field_150868_h < 2 || this.field_150868_h > 21)
 | 
			
		||||
                 {
 | 
			
		||||
-                    ;
 | 
			
		||||
+                    this.field_150861_f = null;
 | 
			
		||||
+                    this.field_150868_h = 0;
 | 
			
		||||
                 }
 | 
			
		||||
+            }
 | 
			
		||||
 
 | 
			
		||||
-                int j1 = this.func_150853_a(p_i45415_2_, p_i45415_3_, p_i45415_4_, this.field_150863_d) - 1;
 | 
			
		||||
+            if (this.field_150861_f != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.field_150862_g = this.func_150858_a();
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
 
 | 
			
		||||
-                if (j1 >= 0)
 | 
			
		||||
-                {
 | 
			
		||||
-                    this.field_150861_f = new ChunkCoordinates(p_i45415_2_ + j1 * Direction.offsetX[this.field_150863_d], p_i45415_3_, p_i45415_4_ + j1 * Direction.offsetZ[this.field_150863_d]);
 | 
			
		||||
-                    this.field_150868_h = this.func_150853_a(this.field_150861_f.posX, this.field_150861_f.posY, this.field_150861_f.posZ, this.field_150866_c);
 | 
			
		||||
+        protected int func_150853_a(int p_150853_1_, int p_150853_2_, int p_150853_3_, int p_150853_4_)
 | 
			
		||||
+        {
 | 
			
		||||
+            int j1 = Direction.offsetX[p_150853_4_];
 | 
			
		||||
+            int k1 = Direction.offsetZ[p_150853_4_];
 | 
			
		||||
+            int i1;
 | 
			
		||||
+            Block block;
 | 
			
		||||
 
 | 
			
		||||
-                    if (this.field_150868_h < 2 || this.field_150868_h > 21)
 | 
			
		||||
-                    {
 | 
			
		||||
-                        this.field_150861_f = null;
 | 
			
		||||
-                        this.field_150868_h = 0;
 | 
			
		||||
-                    }
 | 
			
		||||
+            for (i1 = 0; i1 < 22; ++i1)
 | 
			
		||||
+            {
 | 
			
		||||
+                block = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_, p_150853_3_ + k1 * i1);
 | 
			
		||||
+
 | 
			
		||||
+                if (!this.func_150857_a(block))
 | 
			
		||||
+                {
 | 
			
		||||
+                    break;
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
-                if (this.field_150861_f != null)
 | 
			
		||||
+                Block block1 = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_ - 1, p_150853_3_ + k1 * i1);
 | 
			
		||||
+
 | 
			
		||||
+                if (block1 != Blocks.obsidian)
 | 
			
		||||
                 {
 | 
			
		||||
-                    this.field_150862_g = this.func_150858_a();
 | 
			
		||||
+                    break;
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            protected int func_150853_a(int p_150853_1_, int p_150853_2_, int p_150853_3_, int p_150853_4_)
 | 
			
		||||
+            block = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_, p_150853_3_ + k1 * i1);
 | 
			
		||||
+            return block == Blocks.obsidian ? i1 : 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        protected int func_150858_a()
 | 
			
		||||
+        {
 | 
			
		||||
+            this.blocks = new java.util.HashSet<org.bukkit.block.Block>(); // CraftBukkit
 | 
			
		||||
+            org.bukkit.World bworld = this.field_150867_a.getWorld();
 | 
			
		||||
+            int i;
 | 
			
		||||
+            int j;
 | 
			
		||||
+            int k;
 | 
			
		||||
+            int l;
 | 
			
		||||
+            label56:
 | 
			
		||||
+
 | 
			
		||||
+            for (this.field_150862_g = 0; this.field_150862_g < 21; ++this.field_150862_g)
 | 
			
		||||
             {
 | 
			
		||||
-                int j1 = Direction.offsetX[p_150853_4_];
 | 
			
		||||
-                int k1 = Direction.offsetZ[p_150853_4_];
 | 
			
		||||
-                int i1;
 | 
			
		||||
-                Block block;
 | 
			
		||||
+                i = this.field_150861_f.posY + this.field_150862_g;
 | 
			
		||||
 
 | 
			
		||||
-                for (i1 = 0; i1 < 22; ++i1)
 | 
			
		||||
+                for (j = 0; j < this.field_150868_h; ++j)
 | 
			
		||||
                 {
 | 
			
		||||
-                    block = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_, p_150853_3_ + k1 * i1);
 | 
			
		||||
+                    k = this.field_150861_f.posX + j * Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
+                    l = this.field_150861_f.posZ + j * Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
+                    Block block = this.field_150867_a.getBlock(k, i, l);
 | 
			
		||||
 
 | 
			
		||||
                     if (!this.func_150857_a(block))
 | 
			
		||||
                     {
 | 
			
		||||
-                        break;
 | 
			
		||||
+                        break label56;
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
-                    Block block1 = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_ - 1, p_150853_3_ + k1 * i1);
 | 
			
		||||
-
 | 
			
		||||
-                    if (block1 != Blocks.obsidian)
 | 
			
		||||
+                    if (block == Blocks.portal)
 | 
			
		||||
                     {
 | 
			
		||||
-                        break;
 | 
			
		||||
+                        ++this.field_150864_e;
 | 
			
		||||
                     }
 | 
			
		||||
-                }
 | 
			
		||||
 
 | 
			
		||||
-                block = this.field_150867_a.getBlock(p_150853_1_ + j1 * i1, p_150853_2_, p_150853_3_ + k1 * i1);
 | 
			
		||||
-                return block == Blocks.obsidian ? i1 : 0;
 | 
			
		||||
-            }
 | 
			
		||||
-
 | 
			
		||||
-            protected int func_150858_a()
 | 
			
		||||
-            {
 | 
			
		||||
-                int i;
 | 
			
		||||
-                int j;
 | 
			
		||||
-                int k;
 | 
			
		||||
-                int l;
 | 
			
		||||
-                label56:
 | 
			
		||||
-
 | 
			
		||||
-                for (this.field_150862_g = 0; this.field_150862_g < 21; ++this.field_150862_g)
 | 
			
		||||
-                {
 | 
			
		||||
-                    i = this.field_150861_f.posY + this.field_150862_g;
 | 
			
		||||
-
 | 
			
		||||
-                    for (j = 0; j < this.field_150868_h; ++j)
 | 
			
		||||
+                    if (j == 0)
 | 
			
		||||
                     {
 | 
			
		||||
-                        k = this.field_150861_f.posX + j * Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
-                        l = this.field_150861_f.posZ + j * Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
-                        Block block = this.field_150867_a.getBlock(k, i, l);
 | 
			
		||||
+                        block = this.field_150867_a.getBlock(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][0]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][0]]);
 | 
			
		||||
 
 | 
			
		||||
-                        if (!this.func_150857_a(block))
 | 
			
		||||
+                        if (block != Blocks.obsidian)
 | 
			
		||||
                         {
 | 
			
		||||
                             break label56;
 | 
			
		||||
+                            // CraftBukkit start - add the block to our list
 | 
			
		||||
                         }
 | 
			
		||||
-
 | 
			
		||||
-                        if (block == Blocks.portal)
 | 
			
		||||
+                        else
 | 
			
		||||
                         {
 | 
			
		||||
-                            ++this.field_150864_e;
 | 
			
		||||
+                            blocks.add(bworld.getBlockAt(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][0]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][0]]));
 | 
			
		||||
+                            // CraftBukkit end
 | 
			
		||||
                         }
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else if (j == this.field_150868_h - 1)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        block = this.field_150867_a.getBlock(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]]);
 | 
			
		||||
 
 | 
			
		||||
-                        if (j == 0)
 | 
			
		||||
+                        if (block != Blocks.obsidian)
 | 
			
		||||
                         {
 | 
			
		||||
-                            block = this.field_150867_a.getBlock(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][0]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][0]]);
 | 
			
		||||
-
 | 
			
		||||
-                            if (block != Blocks.obsidian)
 | 
			
		||||
-                            {
 | 
			
		||||
-                                break label56;
 | 
			
		||||
-                            }
 | 
			
		||||
+                            break label56;
 | 
			
		||||
+                            // CraftBukkit start - add the block to our list
 | 
			
		||||
                         }
 | 
			
		||||
-                        else if (j == this.field_150868_h - 1)
 | 
			
		||||
+                        else
 | 
			
		||||
                         {
 | 
			
		||||
-                            block = this.field_150867_a.getBlock(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]]);
 | 
			
		||||
-
 | 
			
		||||
-                            if (block != Blocks.obsidian)
 | 
			
		||||
-                            {
 | 
			
		||||
-                                break label56;
 | 
			
		||||
-                            }
 | 
			
		||||
+                            blocks.add(bworld.getBlockAt(k + Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]], i, l + Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]]));
 | 
			
		||||
+                            // CraftBukkit end
 | 
			
		||||
                         }
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
+            }
 | 
			
		||||
 
 | 
			
		||||
-                for (i = 0; i < this.field_150868_h; ++i)
 | 
			
		||||
-                {
 | 
			
		||||
-                    j = this.field_150861_f.posX + i * Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
-                    k = this.field_150861_f.posY + this.field_150862_g;
 | 
			
		||||
-                    l = this.field_150861_f.posZ + i * Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
+            for (i = 0; i < this.field_150868_h; ++i)
 | 
			
		||||
+            {
 | 
			
		||||
+                j = this.field_150861_f.posX + i * Direction.offsetX[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
+                k = this.field_150861_f.posY + this.field_150862_g;
 | 
			
		||||
+                l = this.field_150861_f.posZ + i * Direction.offsetZ[BlockPortal.field_150001_a[this.field_150865_b][1]];
 | 
			
		||||
 
 | 
			
		||||
-                    if (this.field_150867_a.getBlock(j, k, l) != Blocks.obsidian)
 | 
			
		||||
-                    {
 | 
			
		||||
-                        this.field_150862_g = 0;
 | 
			
		||||
-                        break;
 | 
			
		||||
-                    }
 | 
			
		||||
-                }
 | 
			
		||||
-
 | 
			
		||||
-                if (this.field_150862_g <= 21 && this.field_150862_g >= 3)
 | 
			
		||||
+                if (this.field_150867_a.getBlock(j, k, l) != Blocks.obsidian)
 | 
			
		||||
                 {
 | 
			
		||||
-                    return this.field_150862_g;
 | 
			
		||||
-                }
 | 
			
		||||
-                else
 | 
			
		||||
-                {
 | 
			
		||||
-                    this.field_150861_f = null;
 | 
			
		||||
-                    this.field_150868_h = 0;
 | 
			
		||||
                     this.field_150862_g = 0;
 | 
			
		||||
-                    return 0;
 | 
			
		||||
+                    break;
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            protected boolean func_150857_a(Block p_150857_1_)
 | 
			
		||||
+            if (this.field_150862_g <= 21 && this.field_150862_g >= 3)
 | 
			
		||||
             {
 | 
			
		||||
-                return p_150857_1_.blockMaterial == Material.air || p_150857_1_ == Blocks.fire || p_150857_1_ == Blocks.portal;
 | 
			
		||||
+                return this.field_150862_g;
 | 
			
		||||
             }
 | 
			
		||||
+            else
 | 
			
		||||
+            {
 | 
			
		||||
+                this.field_150861_f = null;
 | 
			
		||||
+                this.field_150868_h = 0;
 | 
			
		||||
+                this.field_150862_g = 0;
 | 
			
		||||
+                return 0;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
 
 | 
			
		||||
-            public boolean func_150860_b()
 | 
			
		||||
+        protected boolean func_150857_a(Block p_150857_1_)
 | 
			
		||||
+        {
 | 
			
		||||
+            return p_150857_1_.blockMaterial == Material.air || p_150857_1_ == Blocks.fire || p_150857_1_ == Blocks.portal;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        public boolean func_150860_b()
 | 
			
		||||
+        {
 | 
			
		||||
+            return this.field_150861_f != null && this.field_150868_h >= 2 && this.field_150868_h <= 21 && this.field_150862_g >= 3 && this.field_150862_g <= 21;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // Cauldron start - vanilla compatibility
 | 
			
		||||
+        public void func_150859_c()
 | 
			
		||||
+        {
 | 
			
		||||
+            this.CB_func_150859_c();
 | 
			
		||||
+        }
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
+
 | 
			
		||||
+        public boolean CB_func_150859_c()
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.World bworld = this.field_150867_a.getWorld();
 | 
			
		||||
+
 | 
			
		||||
+            // Copy below for loop
 | 
			
		||||
+            for (int i = 0; i < this.field_150868_h; ++i)
 | 
			
		||||
             {
 | 
			
		||||
-                return this.field_150861_f != null && this.field_150868_h >= 2 && this.field_150868_h <= 21 && this.field_150862_g >= 3 && this.field_150862_g <= 21;
 | 
			
		||||
+                int j = this.field_150861_f.posX + Direction.offsetX[this.field_150866_c] * i;
 | 
			
		||||
+                int k = this.field_150861_f.posZ + Direction.offsetZ[this.field_150866_c] * i;
 | 
			
		||||
+
 | 
			
		||||
+                for (int l = 0; l < this.field_150862_g; ++l)
 | 
			
		||||
+                {
 | 
			
		||||
+                    int i1 = this.field_150861_f.posY + l;
 | 
			
		||||
+                    bworld.getBlockAt(j, i1, k);
 | 
			
		||||
+                }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            public void func_150859_c()
 | 
			
		||||
+            PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE);
 | 
			
		||||
+            this.field_150867_a.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+            if (event.isCancelled())
 | 
			
		||||
             {
 | 
			
		||||
+                return false;
 | 
			
		||||
+            }
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+    
 | 
			
		||||
                 for (int i = 0; i < this.field_150868_h; ++i)
 | 
			
		||||
                 {
 | 
			
		||||
                     int j = this.field_150861_f.posX + Direction.offsetX[this.field_150866_c] * i;
 | 
			
		||||
                     int k = this.field_150861_f.posZ + Direction.offsetZ[this.field_150866_c] * i;
 | 
			
		||||
-
 | 
			
		||||
+            
 | 
			
		||||
                     for (int l = 0; l < this.field_150862_g; ++l)
 | 
			
		||||
                     {
 | 
			
		||||
                         int i1 = this.field_150861_f.posY + l;
 | 
			
		||||
                         this.field_150867_a.setBlock(j, i1, k, Blocks.portal, this.field_150865_b, 2);
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
+
 | 
			
		||||
+                return true; // CraftBukkit
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 }
 | 
			
		||||
							
								
								
									
										47
									
								
								patches/net/minecraft/block/BlockPressurePlate.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								patches/net/minecraft/block/BlockPressurePlate.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockPressurePlate.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockPressurePlate.java
 | 
			
		||||
@@ -8,6 +8,8 @@
 | 
			
		||||
 import net.minecraft.entity.player.EntityPlayer;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockPressurePlate extends BlockBasePressurePlate
 | 
			
		||||
 {
 | 
			
		||||
     private BlockPressurePlate.Sensitivity field_150069_a;
 | 
			
		||||
@@ -54,8 +56,34 @@
 | 
			
		||||
 
 | 
			
		||||
             while (iterator.hasNext())
 | 
			
		||||
             {
 | 
			
		||||
-                Entity entity = (Entity)iterator.next();
 | 
			
		||||
+                Entity entity = (Entity) iterator.next();
 | 
			
		||||
 
 | 
			
		||||
+                // CraftBukkit start - Call interact event when turning on a pressure plate
 | 
			
		||||
+                if (this.func_150060_c(p_150065_1_.getBlockMetadata(p_150065_2_, p_150065_3_, p_150065_4_)) == 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    org.bukkit.World bworld = p_150065_1_.getWorld();
 | 
			
		||||
+                    org.bukkit.plugin.PluginManager manager = p_150065_1_.getServer().getPluginManager();
 | 
			
		||||
+                    org.bukkit.event.Cancellable cancellable;
 | 
			
		||||
+
 | 
			
		||||
+                    if (entity instanceof EntityPlayer)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityPlayer) entity, org.bukkit.event.block.Action.PHYSICAL, p_150065_2_, p_150065_3_, p_150065_4_, -1, null);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(p_150065_2_, p_150065_3_, p_150065_4_));
 | 
			
		||||
+                        manager.callEvent((EntityInteractEvent) cancellable);
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    // We only want to block turning the plate on if all events are cancelled
 | 
			
		||||
+                    if (cancellable.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        continue;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                 if (!entity.doesEntityNotTriggerPressurePlate())
 | 
			
		||||
                 {
 | 
			
		||||
                     return 15;
 | 
			
		||||
@@ -0,0 +1,63 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockPressurePlateWeighted.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockPressurePlateWeighted.java
 | 
			
		||||
@@ -5,6 +5,12 @@
 | 
			
		||||
 import net.minecraft.util.MathHelper;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import java.util.List;
 | 
			
		||||
+import net.minecraft.entity.player.EntityPlayer;
 | 
			
		||||
+import org.bukkit.event.entity.EntityInteractEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockPressurePlateWeighted extends BlockBasePressurePlate
 | 
			
		||||
 {
 | 
			
		||||
     private final int field_150068_a;
 | 
			
		||||
@@ -18,18 +24,43 @@
 | 
			
		||||
 
 | 
			
		||||
     protected int func_150065_e(World p_150065_1_, int p_150065_2_, int p_150065_3_, int p_150065_4_)
 | 
			
		||||
     {
 | 
			
		||||
-        int l = Math.min(p_150065_1_.getEntitiesWithinAABB(Entity.class, this.func_150061_a(p_150065_2_, p_150065_3_, p_150065_4_)).size(), this.field_150068_a);
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        int l = 0;
 | 
			
		||||
+        java.util.Iterator iterator = p_150065_1_.getEntitiesWithinAABB(Entity.class, this.func_150061_a(p_150065_2_, p_150065_3_, p_150065_4_)).iterator();
 | 
			
		||||
 
 | 
			
		||||
-        if (l <= 0)
 | 
			
		||||
+        while (iterator.hasNext())
 | 
			
		||||
         {
 | 
			
		||||
-            return 0;
 | 
			
		||||
+            Entity entity = (Entity) iterator.next();
 | 
			
		||||
+            org.bukkit.event.Cancellable cancellable;
 | 
			
		||||
+
 | 
			
		||||
+            if (entity instanceof EntityPlayer)
 | 
			
		||||
+            {
 | 
			
		||||
+                cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityPlayer) entity, org.bukkit.event.block.Action.PHYSICAL, p_150065_2_, p_150065_3_, p_150065_4_, -1, null);
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
+                cancellable = new EntityInteractEvent(entity.getBukkitEntity(), p_150065_1_.getWorld().getBlockAt(p_150065_2_, p_150065_3_, p_150065_4_));
 | 
			
		||||
+                p_150065_1_.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // We only want to block turning the plate on if all events are cancelled
 | 
			
		||||
+            if (!cancellable.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                l++;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        l = Math.min(l, this.field_150068_a);
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
+        if (l <= 0)
 | 
			
		||||
+        {
 | 
			
		||||
+            return 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
             float f = (float)Math.min(this.field_150068_a, l) / (float)this.field_150068_a;
 | 
			
		||||
             return MathHelper.ceiling_float_int(f * 15.0F);
 | 
			
		||||
         }
 | 
			
		||||
-    }
 | 
			
		||||
 
 | 
			
		||||
     protected int func_150060_c(int p_150060_1_)
 | 
			
		||||
     {
 | 
			
		||||
							
								
								
									
										126
									
								
								patches/net/minecraft/block/BlockPumpkin.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								patches/net/minecraft/block/BlockPumpkin.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockPumpkin.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockPumpkin.java
 | 
			
		||||
@@ -14,6 +14,12 @@
 | 
			
		||||
 import net.minecraft.util.MathHelper;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.util.BlockStateListPopulator;
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent;
 | 
			
		||||
+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockPumpkin extends BlockDirectional
 | 
			
		||||
 {
 | 
			
		||||
     private boolean field_149985_a;
 | 
			
		||||
@@ -45,15 +51,18 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (!p_149726_1_.isRemote)
 | 
			
		||||
             {
 | 
			
		||||
-                p_149726_1_.setBlock(p_149726_2_, p_149726_3_, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                p_149726_1_.setBlock(p_149726_2_, p_149726_3_ - 1, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                p_149726_1_.setBlock(p_149726_2_, p_149726_3_ - 2, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                // CraftBukkit start - Use BlockStateListPopulator
 | 
			
		||||
+                BlockStateListPopulator blockList = new BlockStateListPopulator(p_149726_1_.getWorld());
 | 
			
		||||
+                blockList.setTypeId(p_149726_2_, p_149726_3_, p_149726_4_, 0);
 | 
			
		||||
+                blockList.setTypeId(p_149726_2_, p_149726_3_ - 1, p_149726_4_, 0);
 | 
			
		||||
+                blockList.setTypeId(p_149726_2_, p_149726_3_ - 2, p_149726_4_, 0);
 | 
			
		||||
                 EntitySnowman entitysnowman = new EntitySnowman(p_149726_1_);
 | 
			
		||||
-                entitysnowman.setLocationAndAngles((double)p_149726_2_ + 0.5D, (double)p_149726_3_ - 1.95D, (double)p_149726_4_ + 0.5D, 0.0F, 0.0F);
 | 
			
		||||
-                p_149726_1_.spawnEntityInWorld(entitysnowman);
 | 
			
		||||
-                p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_, p_149726_4_, getBlockById(0));
 | 
			
		||||
-                p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_ - 1, p_149726_4_, getBlockById(0));
 | 
			
		||||
-                p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_ - 2, p_149726_4_, getBlockById(0));
 | 
			
		||||
+                entitysnowman.setLocationAndAngles((double) p_149726_2_ + 0.5D, (double) p_149726_3_ - 1.95D, (double) p_149726_4_ + 0.5D, 0.0F, 0.0F);
 | 
			
		||||
+
 | 
			
		||||
+                if (p_149726_1_.addEntity(entitysnowman, SpawnReason.BUILD_SNOWMAN))
 | 
			
		||||
+                {
 | 
			
		||||
+                    blockList.updateList();
 | 
			
		||||
+                }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
             for (int i1 = 0; i1 < 120; ++i1)
 | 
			
		||||
@@ -68,45 +77,38 @@
 | 
			
		||||
 
 | 
			
		||||
             if (flag || flag1)
 | 
			
		||||
             {
 | 
			
		||||
-                p_149726_1_.setBlock(p_149726_2_, p_149726_3_, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                p_149726_1_.setBlock(p_149726_2_, p_149726_3_ - 1, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                p_149726_1_.setBlock(p_149726_2_, p_149726_3_ - 2, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                // CraftBukkit start - Use BlockStateListPopulator
 | 
			
		||||
+                BlockStateListPopulator blockList = new BlockStateListPopulator(p_149726_1_.getWorld());
 | 
			
		||||
+                blockList.setTypeId(p_149726_2_, p_149726_3_, p_149726_4_, 0);
 | 
			
		||||
+                blockList.setTypeId(p_149726_2_, p_149726_3_ - 1, p_149726_4_, 0);
 | 
			
		||||
+                blockList.setTypeId(p_149726_2_, p_149726_3_ - 2, p_149726_4_, 0);
 | 
			
		||||
 
 | 
			
		||||
                 if (flag)
 | 
			
		||||
                 {
 | 
			
		||||
-                    p_149726_1_.setBlock(p_149726_2_ - 1, p_149726_3_ - 1, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149726_1_.setBlock(p_149726_2_ + 1, p_149726_3_ - 1, p_149726_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeId(p_149726_2_ - 1, p_149726_3_ - 1, p_149726_4_, 0);
 | 
			
		||||
+                    blockList.setTypeId(p_149726_2_ + 1, p_149726_3_ - 1, p_149726_4_, 0);
 | 
			
		||||
                 }
 | 
			
		||||
                 else
 | 
			
		||||
                 {
 | 
			
		||||
-                    p_149726_1_.setBlock(p_149726_2_, p_149726_3_ - 1, p_149726_4_ - 1, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149726_1_.setBlock(p_149726_2_, p_149726_3_ - 1, p_149726_4_ + 1, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeId(p_149726_2_, p_149726_3_ - 1, p_149726_4_ - 1, 0);
 | 
			
		||||
+                    blockList.setTypeId(p_149726_2_, p_149726_3_ - 1, p_149726_4_ + 1, 0);
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
                 EntityIronGolem entityirongolem = new EntityIronGolem(p_149726_1_);
 | 
			
		||||
                 entityirongolem.setPlayerCreated(true);
 | 
			
		||||
-                entityirongolem.setLocationAndAngles((double)p_149726_2_ + 0.5D, (double)p_149726_3_ - 1.95D, (double)p_149726_4_ + 0.5D, 0.0F, 0.0F);
 | 
			
		||||
-                p_149726_1_.spawnEntityInWorld(entityirongolem);
 | 
			
		||||
+                entityirongolem.setLocationAndAngles((double) p_149726_2_ + 0.5D, (double) p_149726_3_ - 1.95D, (double) p_149726_4_ + 0.5D, 0.0F, 0.0F);
 | 
			
		||||
 
 | 
			
		||||
-                for (int l = 0; l < 120; ++l)
 | 
			
		||||
+                if (p_149726_1_.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM))
 | 
			
		||||
                 {
 | 
			
		||||
-                    p_149726_1_.spawnParticle("snowballpoof", (double)p_149726_2_ + p_149726_1_.rand.nextDouble(), (double)(p_149726_3_ - 2) + p_149726_1_.rand.nextDouble() * 3.9D, (double)p_149726_4_ + p_149726_1_.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
 | 
			
		||||
-                }
 | 
			
		||||
+                    for (int i1 = 0; i1 < 120; ++i1)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        p_149726_1_.spawnParticle("snowballpoof", (double) p_149726_2_ + p_149726_1_.rand.nextDouble(), (double)(p_149726_3_ - 2) + p_149726_1_.rand.nextDouble() * 3.9D, (double) p_149726_4_ + p_149726_1_.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
 | 
			
		||||
+                    }
 | 
			
		||||
 
 | 
			
		||||
-                p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_, p_149726_4_, getBlockById(0));
 | 
			
		||||
-                p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_ - 1, p_149726_4_, getBlockById(0));
 | 
			
		||||
-                p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_ - 2, p_149726_4_, getBlockById(0));
 | 
			
		||||
-
 | 
			
		||||
-                if (flag)
 | 
			
		||||
-                {
 | 
			
		||||
-                    p_149726_1_.notifyBlockChange(p_149726_2_ - 1, p_149726_3_ - 1, p_149726_4_, getBlockById(0));
 | 
			
		||||
-                    p_149726_1_.notifyBlockChange(p_149726_2_ + 1, p_149726_3_ - 1, p_149726_4_, getBlockById(0));
 | 
			
		||||
+                    blockList.updateList();
 | 
			
		||||
                 }
 | 
			
		||||
-                else
 | 
			
		||||
-                {
 | 
			
		||||
-                    p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_ - 1, p_149726_4_ - 1, getBlockById(0));
 | 
			
		||||
-                    p_149726_1_.notifyBlockChange(p_149726_2_, p_149726_3_ - 1, p_149726_4_ + 1, getBlockById(0));
 | 
			
		||||
-                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
@@ -122,6 +124,19 @@
 | 
			
		||||
         p_149689_1_.setBlockMetadataWithNotify(p_149689_2_, p_149689_3_, p_149689_4_, l, 2);
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    public void onNeighborBlockChange(World world, int i, int j, int k, Block block)
 | 
			
		||||
+    {
 | 
			
		||||
+        if (block != null && block.canProvidePower())
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k);
 | 
			
		||||
+            int power = bukkitBlock.getBlockPower();
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power);
 | 
			
		||||
+            world.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
     public void registerBlockIcons(IIconRegister p_149651_1_)
 | 
			
		||||
     {
 | 
			
		||||
							
								
								
									
										29
									
								
								patches/net/minecraft/block/BlockRailDetector.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								patches/net/minecraft/block/BlockRailDetector.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockRailDetector.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockRailDetector.java
 | 
			
		||||
@@ -16,6 +16,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockRailDetector extends BlockRailBase
 | 
			
		||||
 {
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
@@ -86,6 +88,17 @@
 | 
			
		||||
             flag1 = true;
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        if (flag != flag1)
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.block.Block block = p_150054_1_.getWorld().getBlockAt(p_150054_2_, p_150054_3_, p_150054_4_);
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, flag ? 15 : 0, flag1 ? 15 : 0);
 | 
			
		||||
+            p_150054_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+            flag1 = eventRedstone.getNewCurrent() > 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (flag1 && !flag)
 | 
			
		||||
         {
 | 
			
		||||
             p_150054_1_.setBlockMetadataWithNotify(p_150054_2_, p_150054_3_, p_150054_4_, p_150054_5_ | 8, 3);
 | 
			
		||||
							
								
								
									
										43
									
								
								patches/net/minecraft/block/BlockRedstoneDiode.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								patches/net/minecraft/block/BlockRedstoneDiode.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockRedstoneDiode.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockRedstoneDiode.java
 | 
			
		||||
@@ -13,6 +13,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public abstract class BlockRedstoneDiode extends BlockDirectional
 | 
			
		||||
 {
 | 
			
		||||
     protected final boolean isRepeaterPowered;
 | 
			
		||||
@@ -44,16 +46,30 @@
 | 
			
		||||
     {
 | 
			
		||||
         int l = p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
 
 | 
			
		||||
-        if (!this.func_149910_g(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, l))
 | 
			
		||||
+        if (!this.func_149910_g((IBlockAccess) p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, l))   // CraftBukkit - Cast world to IBlockAccess to call the right method.
 | 
			
		||||
         {
 | 
			
		||||
             boolean flag = this.isGettingInput(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, l);
 | 
			
		||||
 
 | 
			
		||||
             if (this.isRepeaterPowered && !flag)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (CraftEventFactory.callRedstoneChange(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, 15, 0).getNewCurrent() != 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, this.getBlockUnpowered(), l, 2);
 | 
			
		||||
             }
 | 
			
		||||
             else if (!this.isRepeaterPowered)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (CraftEventFactory.callRedstoneChange(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, 0, 15).getNewCurrent() != 15)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, this.getBlockPowered(), l, 2);
 | 
			
		||||
 
 | 
			
		||||
                 if (!flag)
 | 
			
		||||
							
								
								
									
										53
									
								
								patches/net/minecraft/block/BlockRedstoneLight.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								patches/net/minecraft/block/BlockRedstoneLight.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockRedstoneLight.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockRedstoneLight.java
 | 
			
		||||
@@ -9,6 +9,8 @@
 | 
			
		||||
 import net.minecraft.item.ItemStack;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockRedstoneLight extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private final boolean field_150171_a;
 | 
			
		||||
@@ -35,6 +37,13 @@
 | 
			
		||||
             }
 | 
			
		||||
             else if (!this.field_150171_a && p_149726_1_.isBlockIndirectlyGettingPowered(p_149726_2_, p_149726_3_, p_149726_4_))
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (CraftEventFactory.callRedstoneChange(p_149726_1_, p_149726_2_, p_149726_3_, p_149726_4_, 0, 15).getNewCurrent() != 15)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_149726_1_.setBlock(p_149726_2_, p_149726_3_, p_149726_4_, Blocks.lit_redstone_lamp, 0, 2);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
@@ -50,6 +59,13 @@
 | 
			
		||||
             }
 | 
			
		||||
             else if (!this.field_150171_a && p_149695_1_.isBlockIndirectlyGettingPowered(p_149695_2_, p_149695_3_, p_149695_4_))
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (CraftEventFactory.callRedstoneChange(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, 0, 15).getNewCurrent() != 15)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_149695_1_.setBlock(p_149695_2_, p_149695_3_, p_149695_4_, Blocks.lit_redstone_lamp, 0, 2);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
@@ -59,6 +75,13 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (!p_149674_1_.isRemote && this.field_150171_a && !p_149674_1_.isBlockIndirectlyGettingPowered(p_149674_2_, p_149674_3_, p_149674_4_))
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (CraftEventFactory.callRedstoneChange(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, 15, 0).getNewCurrent() != 0)
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.redstone_lamp, 0, 2);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										44
									
								
								patches/net/minecraft/block/BlockRedstoneOre.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								patches/net/minecraft/block/BlockRedstoneOre.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockRedstoneOre.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockRedstoneOre.java
 | 
			
		||||
@@ -13,6 +13,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockRedstoneOre extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private boolean field_150187_a;
 | 
			
		||||
@@ -43,8 +45,30 @@
 | 
			
		||||
 
 | 
			
		||||
     public void onEntityWalking(World p_149724_1_, int p_149724_2_, int p_149724_3_, int p_149724_4_, Entity p_149724_5_)
 | 
			
		||||
     {
 | 
			
		||||
-        this.func_150185_e(p_149724_1_, p_149724_2_, p_149724_3_, p_149724_4_);
 | 
			
		||||
-        super.onEntityWalking(p_149724_1_, p_149724_2_, p_149724_3_, p_149724_4_, p_149724_5_);
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        if (p_149724_5_ instanceof EntityPlayer)
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityPlayer) p_149724_5_, org.bukkit.event.block.Action.PHYSICAL, p_149724_2_, p_149724_3_, p_149724_4_, -1, null);
 | 
			
		||||
+
 | 
			
		||||
+            if (!event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.func_150185_e(p_149724_1_, p_149724_2_, p_149724_3_, p_149724_4_);
 | 
			
		||||
+                super.onEntityWalking(p_149724_1_, p_149724_2_, p_149724_3_, p_149724_4_, p_149724_5_);
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+        else
 | 
			
		||||
+        {
 | 
			
		||||
+            EntityInteractEvent event = new EntityInteractEvent(p_149724_5_.getBukkitEntity(), p_149724_1_.getWorld().getBlockAt(p_149724_2_, p_149724_3_, p_149724_4_));
 | 
			
		||||
+            p_149724_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+            if (!event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.func_150185_e(p_149724_1_, p_149724_2_, p_149724_3_, p_149724_4_);
 | 
			
		||||
+                super.onEntityWalking(p_149724_1_, p_149724_2_, p_149724_3_, p_149724_4_, p_149724_5_);
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public boolean onBlockActivated(World p_149727_1_, int p_149727_2_, int p_149727_3_, int p_149727_4_, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
 | 
			
		||||
							
								
								
									
										62
									
								
								patches/net/minecraft/block/BlockRedstoneTorch.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								patches/net/minecraft/block/BlockRedstoneTorch.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockRedstoneTorch.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockRedstoneTorch.java
 | 
			
		||||
@@ -13,6 +13,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockRedstoneTorch extends BlockTorch
 | 
			
		||||
 {
 | 
			
		||||
     private boolean field_150113_a;
 | 
			
		||||
@@ -125,10 +127,30 @@
 | 
			
		||||
             list.remove(0);
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        org.bukkit.plugin.PluginManager manager = p_149674_1_.getServer().getPluginManager();
 | 
			
		||||
+        org.bukkit.block.Block block = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+        int oldCurrent = this.field_150113_a ? 15 : 0;
 | 
			
		||||
+        BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent);
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (this.field_150113_a)
 | 
			
		||||
         {
 | 
			
		||||
             if (flag)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (oldCurrent != 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    event.setNewCurrent(0);
 | 
			
		||||
+                    manager.callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                    if (event.getNewCurrent() != 0)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.unlit_redstone_torch, p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_), 3);
 | 
			
		||||
 
 | 
			
		||||
                 if (this.func_150111_a(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, true))
 | 
			
		||||
@@ -147,6 +169,19 @@
 | 
			
		||||
         }
 | 
			
		||||
         else if (!flag && !this.func_150111_a(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, false))
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (oldCurrent != 15)
 | 
			
		||||
+            {
 | 
			
		||||
+                event.setNewCurrent(15);
 | 
			
		||||
+                manager.callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (event.getNewCurrent() != 15)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.redstone_torch, p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_), 3);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										39
									
								
								patches/net/minecraft/block/BlockRedstoneWire.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								patches/net/minecraft/block/BlockRedstoneWire.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockRedstoneWire.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockRedstoneWire.java
 | 
			
		||||
@@ -18,6 +18,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockRedstoneWire extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private boolean field_150181_a = true;
 | 
			
		||||
@@ -159,8 +161,17 @@
 | 
			
		||||
             i3 = l1;
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
         if (k1 != i3)
 | 
			
		||||
         {
 | 
			
		||||
+            BlockRedstoneEvent event = new BlockRedstoneEvent(p_150175_1_.getWorld().getBlockAt(p_150175_2_, p_150175_3_, p_150175_4_), k1, i3);
 | 
			
		||||
+            p_150175_1_.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+            i3 = event.getNewCurrent();
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+        if (k1 != i3)
 | 
			
		||||
+        {
 | 
			
		||||
             p_150175_1_.setBlockMetadataWithNotify(p_150175_2_, p_150175_3_, p_150175_4_, i3, 2);
 | 
			
		||||
             this.field_150179_b.add(new ChunkPosition(p_150175_2_, p_150175_3_, p_150175_4_));
 | 
			
		||||
             this.field_150179_b.add(new ChunkPosition(p_150175_2_ - 1, p_150175_3_, p_150175_4_));
 | 
			
		||||
@@ -294,7 +305,8 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
-    private int func_150178_a(World p_150178_1_, int p_150178_2_, int p_150178_3_, int p_150178_4_, int p_150178_5_)
 | 
			
		||||
+    // CraftBukkit - private -> public
 | 
			
		||||
+    public int func_150178_a(World p_150178_1_, int p_150178_2_, int p_150178_3_, int p_150178_4_, int p_150178_5_)
 | 
			
		||||
     {
 | 
			
		||||
         if (p_150178_1_.getBlock(p_150178_2_, p_150178_3_, p_150178_4_) != this)
 | 
			
		||||
         {
 | 
			
		||||
							
								
								
									
										14
									
								
								patches/net/minecraft/block/BlockReed.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								patches/net/minecraft/block/BlockReed.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockReed.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockReed.java
 | 
			
		||||
@@ -44,9 +44,9 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     int i1 = p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
 
 | 
			
		||||
-                    if (i1 == 15)
 | 
			
		||||
+                    if (i1 >= (byte) range(3, (p_149674_1_.growthOdds / p_149674_1_.getSpigotConfig().caneModifier * 15) + 0.5F, 15))   // Spigot // Cauldron
 | 
			
		||||
                     {
 | 
			
		||||
-                        p_149674_1_.setBlock(p_149674_2_, p_149674_3_ + 1, p_149674_4_, this);
 | 
			
		||||
+                        org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(p_149674_1_, p_149674_2_, p_149674_3_ + 1, p_149674_4_, this, 0); // CraftBukkit
 | 
			
		||||
                         p_149674_1_.setBlockMetadataWithNotify(p_149674_2_, p_149674_3_, p_149674_4_, 0, 4);
 | 
			
		||||
                     }
 | 
			
		||||
                     else
 | 
			
		||||
							
								
								
									
										122
									
								
								patches/net/minecraft/block/BlockSapling.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								patches/net/minecraft/block/BlockSapling.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockSapling.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockSapling.java
 | 
			
		||||
@@ -22,10 +22,18 @@
 | 
			
		||||
 import net.minecraft.world.gen.feature.WorldGenTrees;
 | 
			
		||||
 import net.minecraft.world.gen.feature.WorldGenerator;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.Location;
 | 
			
		||||
+import org.bukkit.TreeType;
 | 
			
		||||
+import org.bukkit.block.BlockState;
 | 
			
		||||
+import org.bukkit.event.world.StructureGrowEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockSapling extends BlockBush implements IGrowable
 | 
			
		||||
 {
 | 
			
		||||
     public static final String[] field_149882_a = new String[] {"oak", "spruce", "birch", "jungle", "acacia", "roofed_oak"};
 | 
			
		||||
     private static final IIcon[] field_149881_b = new IIcon[field_149882_a.length];
 | 
			
		||||
+    public static TreeType treeType; // CraftBukkit
 | 
			
		||||
     private static final String __OBFID = "CL_00000305";
 | 
			
		||||
 
 | 
			
		||||
     protected BlockSapling()
 | 
			
		||||
@@ -41,9 +49,31 @@
 | 
			
		||||
         {
 | 
			
		||||
             super.updateTick(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_5_);
 | 
			
		||||
 
 | 
			
		||||
-            if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) >= 9 && p_149674_5_.nextInt(7) == 0)
 | 
			
		||||
+            if (p_149674_1_.getBlockLightValue(p_149674_2_, p_149674_3_ + 1, p_149674_4_) >= 9 && (p_149674_5_.nextInt(Math.max(2, (int)((p_149674_1_.growthOdds / p_149674_1_.getSpigotConfig().saplingModifier * 7) + 0.5F))) == 0))    // Spigot // Cauldron
 | 
			
		||||
             {
 | 
			
		||||
+                // Cauldron start
 | 
			
		||||
+                p_149674_1_.captureTreeGeneration = true;
 | 
			
		||||
                 this.func_149879_c(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_5_);
 | 
			
		||||
+                p_149674_1_.captureTreeGeneration = false;
 | 
			
		||||
+                if (p_149674_1_.capturedBlockStates.size() > 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    TreeType treeType = BlockSapling.treeType;
 | 
			
		||||
+                    BlockSapling.treeType = null;
 | 
			
		||||
+                    Location location = new Location(p_149674_1_.getWorld(), p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                    List<BlockState> blocks = (List<BlockState>) p_149674_1_.capturedBlockStates.clone();
 | 
			
		||||
+                    p_149674_1_.capturedBlockStates.clear();
 | 
			
		||||
+                    StructureGrowEvent event = null;
 | 
			
		||||
+                    if (treeType != null) {
 | 
			
		||||
+                        event = new StructureGrowEvent(location, treeType, false, null, blocks);
 | 
			
		||||
+                        org.bukkit.Bukkit.getPluginManager().callEvent(event);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    if (event == null || !event.isCancelled()) {
 | 
			
		||||
+                        for (BlockState blockstate : blocks) {
 | 
			
		||||
+                            blockstate.update(true);
 | 
			
		||||
+                        }
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+                //Cauldron end
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
@@ -73,7 +103,20 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (!net.minecraftforge.event.terraingen.TerrainGen.saplingGrowTree(p_149878_1_, p_149878_5_, p_149878_2_, p_149878_3_, p_149878_4_)) return;
 | 
			
		||||
         int l = p_149878_1_.getBlockMetadata(p_149878_2_, p_149878_3_, p_149878_4_) & 7;
 | 
			
		||||
-        Object object = p_149878_5_.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true);
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        Object object = null;
 | 
			
		||||
+        if (p_149878_5_.nextInt(10) == 0)
 | 
			
		||||
+        { 
 | 
			
		||||
+            treeType = TreeType.BIG_TREE; // CraftBukkit
 | 
			
		||||
+            object = new WorldGenBigTree(true);
 | 
			
		||||
+        }
 | 
			
		||||
+        else
 | 
			
		||||
+        {
 | 
			
		||||
+            treeType = TreeType.TREE; // CraftBukkit
 | 
			
		||||
+            object = new WorldGenTrees(true);
 | 
			
		||||
+        }
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         int i1 = 0;
 | 
			
		||||
         int j1 = 0;
 | 
			
		||||
         boolean flag = false;
 | 
			
		||||
@@ -84,6 +127,7 @@
 | 
			
		||||
             default:
 | 
			
		||||
                 break;
 | 
			
		||||
             case 1:
 | 
			
		||||
+                treeType = TreeType.REDWOOD; // CraftBukkit
 | 
			
		||||
                 label78:
 | 
			
		||||
 
 | 
			
		||||
                 for (i1 = 0; i1 >= -1; --i1)
 | 
			
		||||
@@ -108,6 +152,7 @@
 | 
			
		||||
 
 | 
			
		||||
                 break;
 | 
			
		||||
             case 2:
 | 
			
		||||
+                treeType = TreeType.BIRCH; // CraftBukkit
 | 
			
		||||
                 object = new WorldGenForest(true, false);
 | 
			
		||||
                 break;
 | 
			
		||||
             case 3:
 | 
			
		||||
@@ -119,6 +164,7 @@
 | 
			
		||||
                     {
 | 
			
		||||
                         if (this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1, 3) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1, 3) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1 + 1, 3) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1 + 1, 3))
 | 
			
		||||
                         {
 | 
			
		||||
+                            treeType = TreeType.JUNGLE; // CraftBukkit
 | 
			
		||||
                             object = new WorldGenMegaJungle(true, 10, 20, 3, 3);
 | 
			
		||||
                             flag = true;
 | 
			
		||||
                             break label93;
 | 
			
		||||
@@ -130,11 +176,13 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     j1 = 0;
 | 
			
		||||
                     i1 = 0;
 | 
			
		||||
+                    treeType = TreeType.SMALL_JUNGLE; // CraftBukkit
 | 
			
		||||
                     object = new WorldGenTrees(true, 4 + p_149878_5_.nextInt(7), 3, 3, false);
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
                 break;
 | 
			
		||||
             case 4:
 | 
			
		||||
+                treeType = TreeType.ACACIA; // CraftBukkit
 | 
			
		||||
                 object = new WorldGenSavannaTree(true);
 | 
			
		||||
                 break;
 | 
			
		||||
             case 5:
 | 
			
		||||
@@ -147,6 +195,7 @@
 | 
			
		||||
                         if (this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1, 5) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1, 5) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1, p_149878_3_, p_149878_4_ + j1 + 1, 5) && this.func_149880_a(p_149878_1_, p_149878_2_ + i1 + 1, p_149878_3_, p_149878_4_ + j1 + 1, 5))
 | 
			
		||||
                         {
 | 
			
		||||
                             object = new WorldGenCanopyTree(true);
 | 
			
		||||
+                            treeType = TreeType.DARK_OAK; // CraftBukkit
 | 
			
		||||
                             flag = true;
 | 
			
		||||
                             break label108;
 | 
			
		||||
                         }
 | 
			
		||||
							
								
								
									
										29
									
								
								patches/net/minecraft/block/BlockSign.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								patches/net/minecraft/block/BlockSign.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockSign.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockSign.java
 | 
			
		||||
@@ -14,6 +14,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockSign extends BlockContainer
 | 
			
		||||
 {
 | 
			
		||||
     private Class field_149968_a;
 | 
			
		||||
@@ -163,6 +165,17 @@
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         super.onNeighborBlockChange(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, p_149695_5_);
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        if (p_149695_5_ != null && p_149695_5_.canProvidePower())
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.block.Block bukkitBlock = p_149695_1_.getWorld().getBlockAt(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
+            int power = bukkitBlock.getBlockPower();
 | 
			
		||||
+            BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power);
 | 
			
		||||
+            p_149695_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     @SideOnly(Side.CLIENT)
 | 
			
		||||
							
								
								
									
										156
									
								
								patches/net/minecraft/block/BlockSkull.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								patches/net/minecraft/block/BlockSkull.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,156 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockSkull.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockSkull.java
 | 
			
		||||
@@ -27,6 +27,11 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.util.BlockStateListPopulator;
 | 
			
		||||
+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BlockSkull extends BlockContainer
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000307";
 | 
			
		||||
@@ -172,16 +177,18 @@
 | 
			
		||||
             {
 | 
			
		||||
                 if (p_149965_1_.getBlock(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l) == Blocks.soul_sand && p_149965_1_.getBlock(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 1) == Blocks.soul_sand && p_149965_1_.getBlock(p_149965_2_, p_149965_3_ - 2, p_149965_4_ + l + 1) == Blocks.soul_sand && p_149965_1_.getBlock(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 2) == Blocks.soul_sand && this.func_149966_a(p_149965_1_, p_149965_2_, p_149965_3_, p_149965_4_ + l, 1) && this.func_149966_a(p_149965_1_, p_149965_2_, p_149965_3_, p_149965_4_ + l + 1, 1) && this.func_149966_a(p_149965_1_, p_149965_2_, p_149965_3_, p_149965_4_ + l + 2, 1))
 | 
			
		||||
                 {
 | 
			
		||||
+                    // CraftBukkit start - Use BlockStateListPopulator
 | 
			
		||||
+                    BlockStateListPopulator blockList = new BlockStateListPopulator(p_149965_1_.getWorld());
 | 
			
		||||
                     p_149965_1_.setBlockMetadataWithNotify(p_149965_2_, p_149965_3_, p_149965_4_ + l, 8, 2);
 | 
			
		||||
                     p_149965_1_.setBlockMetadataWithNotify(p_149965_2_, p_149965_3_, p_149965_4_ + l + 1, 8, 2);
 | 
			
		||||
                     p_149965_1_.setBlockMetadataWithNotify(p_149965_2_, p_149965_3_, p_149965_4_ + l + 2, 8, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_, p_149965_4_ + l, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_, p_149965_4_ + l + 1, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_, p_149965_4_ + l + 2, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 1, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 2, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_, p_149965_3_ - 2, p_149965_4_ + l + 1, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_, p_149965_4_ + l, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_, p_149965_4_ + l + 1, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_, p_149965_4_ + l + 2, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 1, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 2, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_, p_149965_3_ - 2, p_149965_4_ + l + 1, getBlockById(0), 0, 2);
 | 
			
		||||
 
 | 
			
		||||
                     if (!p_149965_1_.isRemote)
 | 
			
		||||
                     {
 | 
			
		||||
@@ -190,18 +197,21 @@
 | 
			
		||||
                         entitywither.renderYawOffset = 90.0F;
 | 
			
		||||
                         entitywither.func_82206_m();
 | 
			
		||||
 
 | 
			
		||||
-                        if (!p_149965_1_.isRemote)
 | 
			
		||||
+                        if (p_149965_1_.addEntity(entitywither, SpawnReason.BUILD_WITHER))
 | 
			
		||||
                         {
 | 
			
		||||
-                            iterator = p_149965_1_.getEntitiesWithinAABB(EntityPlayer.class, entitywither.boundingBox.expand(50.0D, 50.0D, 50.0D)).iterator();
 | 
			
		||||
-
 | 
			
		||||
-                            while (iterator.hasNext())
 | 
			
		||||
+                            if (!p_149965_1_.isRemote)
 | 
			
		||||
                             {
 | 
			
		||||
-                                entityplayer = (EntityPlayer)iterator.next();
 | 
			
		||||
-                                entityplayer.triggerAchievement(AchievementList.field_150963_I);
 | 
			
		||||
+                                iterator = p_149965_1_.getEntitiesWithinAABB(EntityPlayer.class, entitywither.boundingBox.expand(50.0D, 50.0D, 50.0D)).iterator();
 | 
			
		||||
+
 | 
			
		||||
+                                while (iterator.hasNext())
 | 
			
		||||
+                                {
 | 
			
		||||
+                                    entityplayer = (EntityPlayer) iterator.next();
 | 
			
		||||
+                                    entityplayer.triggerAchievement(AchievementList.field_150963_I);
 | 
			
		||||
+                                }
 | 
			
		||||
                             }
 | 
			
		||||
-                        }
 | 
			
		||||
 
 | 
			
		||||
-                        p_149965_1_.spawnEntityInWorld(entitywither);
 | 
			
		||||
+                            blockList.updateList();
 | 
			
		||||
+                        }
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
                     for (i1 = 0; i1 < 120; ++i1)
 | 
			
		||||
@@ -209,13 +219,7 @@
 | 
			
		||||
                         p_149965_1_.spawnParticle("snowballpoof", (double)p_149965_2_ + p_149965_1_.rand.nextDouble(), (double)(p_149965_3_ - 2) + p_149965_1_.rand.nextDouble() * 3.9D, (double)(p_149965_4_ + l + 1) + p_149965_1_.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_, p_149965_4_ + l, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_, p_149965_4_ + l + 1, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_, p_149965_4_ + l + 2, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 1, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_ - 1, p_149965_4_ + l + 2, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_, p_149965_3_ - 2, p_149965_4_ + l + 1, getBlockById(0));
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     return;
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
@@ -224,16 +228,18 @@
 | 
			
		||||
             {
 | 
			
		||||
                 if (p_149965_1_.getBlock(p_149965_2_ + l, p_149965_3_ - 1, p_149965_4_) == Blocks.soul_sand && p_149965_1_.getBlock(p_149965_2_ + l + 1, p_149965_3_ - 1, p_149965_4_) == Blocks.soul_sand && p_149965_1_.getBlock(p_149965_2_ + l + 1, p_149965_3_ - 2, p_149965_4_) == Blocks.soul_sand && p_149965_1_.getBlock(p_149965_2_ + l + 2, p_149965_3_ - 1, p_149965_4_) == Blocks.soul_sand && this.func_149966_a(p_149965_1_, p_149965_2_ + l, p_149965_3_, p_149965_4_, 1) && this.func_149966_a(p_149965_1_, p_149965_2_ + l + 1, p_149965_3_, p_149965_4_, 1) && this.func_149966_a(p_149965_1_, p_149965_2_ + l + 2, p_149965_3_, p_149965_4_, 1))
 | 
			
		||||
                 {
 | 
			
		||||
+                    // CraftBukkit start - Use BlockStateListPopulator
 | 
			
		||||
+                    BlockStateListPopulator blockList = new BlockStateListPopulator(p_149965_1_.getWorld());
 | 
			
		||||
                     p_149965_1_.setBlockMetadataWithNotify(p_149965_2_ + l, p_149965_3_, p_149965_4_, 8, 2);
 | 
			
		||||
                     p_149965_1_.setBlockMetadataWithNotify(p_149965_2_ + l + 1, p_149965_3_, p_149965_4_, 8, 2);
 | 
			
		||||
                     p_149965_1_.setBlockMetadataWithNotify(p_149965_2_ + l + 2, p_149965_3_, p_149965_4_, 8, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l, p_149965_3_, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l + 1, p_149965_3_, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l + 2, p_149965_3_, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l, p_149965_3_ - 1, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l + 1, p_149965_3_ - 1, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l + 2, p_149965_3_ - 1, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
-                    p_149965_1_.setBlock(p_149965_2_ + l + 1, p_149965_3_ - 2, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l, p_149965_3_, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l + 1, p_149965_3_, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l + 2, p_149965_3_, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l, p_149965_3_ - 1, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l + 1, p_149965_3_ - 1, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l + 2, p_149965_3_ - 1, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
+                    blockList.setTypeAndData(p_149965_2_ + l + 1, p_149965_3_ - 2, p_149965_4_, getBlockById(0), 0, 2);
 | 
			
		||||
 
 | 
			
		||||
                     if (!p_149965_1_.isRemote)
 | 
			
		||||
                     {
 | 
			
		||||
@@ -241,18 +247,21 @@
 | 
			
		||||
                         entitywither.setLocationAndAngles((double)(p_149965_2_ + l) + 1.5D, (double)p_149965_3_ - 1.45D, (double)p_149965_4_ + 0.5D, 0.0F, 0.0F);
 | 
			
		||||
                         entitywither.func_82206_m();
 | 
			
		||||
 
 | 
			
		||||
-                        if (!p_149965_1_.isRemote)
 | 
			
		||||
+                        if (p_149965_1_.addEntity(entitywither, SpawnReason.BUILD_WITHER))
 | 
			
		||||
                         {
 | 
			
		||||
-                            iterator = p_149965_1_.getEntitiesWithinAABB(EntityPlayer.class, entitywither.boundingBox.expand(50.0D, 50.0D, 50.0D)).iterator();
 | 
			
		||||
-
 | 
			
		||||
-                            while (iterator.hasNext())
 | 
			
		||||
+                            if (!p_149965_1_.isRemote)
 | 
			
		||||
                             {
 | 
			
		||||
-                                entityplayer = (EntityPlayer)iterator.next();
 | 
			
		||||
-                                entityplayer.triggerAchievement(AchievementList.field_150963_I);
 | 
			
		||||
+                                iterator = p_149965_1_.getEntitiesWithinAABB(EntityPlayer.class, entitywither.boundingBox.expand(50.0D, 50.0D, 50.0D)).iterator();
 | 
			
		||||
+
 | 
			
		||||
+                                while (iterator.hasNext())
 | 
			
		||||
+                                {
 | 
			
		||||
+                                    entityplayer = (EntityPlayer) iterator.next();
 | 
			
		||||
+                                    entityplayer.triggerAchievement(AchievementList.field_150963_I);
 | 
			
		||||
+                                }
 | 
			
		||||
                             }
 | 
			
		||||
-                        }
 | 
			
		||||
 
 | 
			
		||||
-                        p_149965_1_.spawnEntityInWorld(entitywither);
 | 
			
		||||
+                            blockList.updateList();
 | 
			
		||||
+                        }
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
                     for (i1 = 0; i1 < 120; ++i1)
 | 
			
		||||
@@ -260,13 +269,7 @@
 | 
			
		||||
                         p_149965_1_.spawnParticle("snowballpoof", (double)(p_149965_2_ + l + 1) + p_149965_1_.rand.nextDouble(), (double)(p_149965_3_ - 2) + p_149965_1_.rand.nextDouble() * 3.9D, (double)p_149965_4_ + p_149965_1_.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l, p_149965_3_, p_149965_4_, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l + 1, p_149965_3_, p_149965_4_, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l + 2, p_149965_3_, p_149965_4_, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l, p_149965_3_ - 1, p_149965_4_, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l + 1, p_149965_3_ - 1, p_149965_4_, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l + 2, p_149965_3_ - 1, p_149965_4_, getBlockById(0));
 | 
			
		||||
-                    p_149965_1_.notifyBlockChange(p_149965_2_ + l + 1, p_149965_3_ - 2, p_149965_4_, getBlockById(0));
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     return;
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
							
								
								
									
										17
									
								
								patches/net/minecraft/block/BlockSnow.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								patches/net/minecraft/block/BlockSnow.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockSnow.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockSnow.java
 | 
			
		||||
@@ -114,6 +114,14 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (p_149674_1_.getSavedLightValue(EnumSkyBlock.Block, p_149674_2_, p_149674_3_, p_149674_4_) > 11)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_), Blocks.air).isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+            this.dropBlockAsItem(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_), 0);
 | 
			
		||||
             p_149674_1_.setBlockToAir(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										57
									
								
								patches/net/minecraft/block/BlockStaticLiquid.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								patches/net/minecraft/block/BlockStaticLiquid.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockStaticLiquid.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockStaticLiquid.java
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
 import net.minecraft.init.Blocks;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;  // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockStaticLiquid extends BlockLiquid
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000315";
 | 
			
		||||
@@ -43,6 +45,11 @@
 | 
			
		||||
         {
 | 
			
		||||
             int l = p_149674_5_.nextInt(3);
 | 
			
		||||
             int i1;
 | 
			
		||||
+            // CraftBukkit start - Prevent lava putting something on fire, remember igniter block coords
 | 
			
		||||
+            int x = p_149674_2_;
 | 
			
		||||
+            int y = p_149674_3_;
 | 
			
		||||
+            int z = p_149674_4_;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
 
 | 
			
		||||
             for (i1 = 0; i1 < l; ++i1)
 | 
			
		||||
             {
 | 
			
		||||
@@ -55,6 +62,16 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     if (this.isFlammable(p_149674_1_, p_149674_2_ - 1, p_149674_3_, p_149674_4_) || this.isFlammable(p_149674_1_, p_149674_2_ + 1, p_149674_3_, p_149674_4_) || this.isFlammable(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_ - 1) || this.isFlammable(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_ + 1) || this.isFlammable(p_149674_1_, p_149674_2_, p_149674_3_ - 1, p_149674_4_) || this.isFlammable(p_149674_1_, p_149674_2_, p_149674_3_ + 1, p_149674_4_))
 | 
			
		||||
                     {
 | 
			
		||||
+                        // CraftBukkit start - Prevent lava putting something on fire
 | 
			
		||||
+                        if (p_149674_1_.getBlock(p_149674_2_, p_149674_3_, p_149674_4_) != Blocks.fire)
 | 
			
		||||
+                        {
 | 
			
		||||
+                            if (CraftEventFactory.callBlockIgniteEvent(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, x, y, z).isCancelled())
 | 
			
		||||
+                            {
 | 
			
		||||
+                                continue;
 | 
			
		||||
+                            }
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                         p_149674_1_.setBlock(p_149674_2_, p_149674_3_, p_149674_4_, Blocks.fire);
 | 
			
		||||
                         return;
 | 
			
		||||
                     }
 | 
			
		||||
@@ -77,6 +94,16 @@
 | 
			
		||||
 
 | 
			
		||||
                     if (p_149674_1_.isAirBlock(p_149674_2_, p_149674_3_ + 1, p_149674_4_) && this.isFlammable(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_))
 | 
			
		||||
                     {
 | 
			
		||||
+                        // CraftBukkit start - Prevent lava putting something on fire
 | 
			
		||||
+                        if (p_149674_1_.getBlock(p_149674_2_, p_149674_3_ + 1, p_149674_4_) != Blocks.fire)
 | 
			
		||||
+                        {
 | 
			
		||||
+                            if (CraftEventFactory.callBlockIgniteEvent(p_149674_1_, p_149674_2_, p_149674_3_ + 1, p_149674_4_, x, y, z).isCancelled())
 | 
			
		||||
+                            {
 | 
			
		||||
+                                continue;
 | 
			
		||||
+                            }
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                         p_149674_1_.setBlock(p_149674_2_, p_149674_3_ + 1, p_149674_4_, Blocks.fire);
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
							
								
								
									
										37
									
								
								patches/net/minecraft/block/BlockStem.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								patches/net/minecraft/block/BlockStem.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockStem.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockStem.java
 | 
			
		||||
@@ -17,6 +17,8 @@
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 import static net.minecraftforge.common.util.ForgeDirection.*;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockStem extends BlockBush implements IGrowable
 | 
			
		||||
 {
 | 
			
		||||
     private final Block field_149877_a;
 | 
			
		||||
@@ -46,14 +48,14 @@
 | 
			
		||||
         {
 | 
			
		||||
             float f = this.func_149875_n(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
 
 | 
			
		||||
-            if (p_149674_5_.nextInt((int)(25.0F / f) + 1) == 0)
 | 
			
		||||
+            if (p_149674_5_.nextInt((int)(p_149674_1_.growthOdds / (this == Blocks.pumpkin_stem ? p_149674_1_.getSpigotConfig().pumpkinModifier : p_149674_1_.spigotConfig.melonModifier) * (25.0F / f)) + 1) == 0)   // Spigot // Cauldron
 | 
			
		||||
             {
 | 
			
		||||
                 int l = p_149674_1_.getBlockMetadata(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
 
 | 
			
		||||
                 if (l < 7)
 | 
			
		||||
                 {
 | 
			
		||||
                     ++l;
 | 
			
		||||
-                    p_149674_1_.setBlockMetadataWithNotify(p_149674_2_, p_149674_3_, p_149674_4_, l, 2);
 | 
			
		||||
+                    CraftEventFactory.handleBlockGrowEvent(p_149674_1_, p_149674_2_, p_149674_3_, p_149674_4_, this, l); // CraftBukkit
 | 
			
		||||
                 }
 | 
			
		||||
                 else
 | 
			
		||||
                 {
 | 
			
		||||
@@ -105,7 +107,7 @@
 | 
			
		||||
 
 | 
			
		||||
                     if (p_149674_1_.isAirBlock(j1, p_149674_3_, k1) && (block.canSustainPlant(p_149674_1_, j1, p_149674_3_ - 1, k1, UP, this) || block == Blocks.dirt || block == Blocks.grass))
 | 
			
		||||
                     {
 | 
			
		||||
-                        p_149674_1_.setBlock(j1, p_149674_3_, k1, this.field_149877_a);
 | 
			
		||||
+                        CraftEventFactory.handleBlockGrowEvent(p_149674_1_, j1, p_149674_3_, k1, this.field_149877_a, 0); // CraftBukkit
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
							
								
								
									
										32
									
								
								patches/net/minecraft/block/BlockTrapDoor.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								patches/net/minecraft/block/BlockTrapDoor.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockTrapDoor.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockTrapDoor.java
 | 
			
		||||
@@ -13,6 +13,8 @@
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockTrapDoor extends Block
 | 
			
		||||
 {
 | 
			
		||||
     /** Set this to allow trapdoors to remain free-floating */
 | 
			
		||||
@@ -176,6 +178,20 @@
 | 
			
		||||
 
 | 
			
		||||
             if (flag || p_149695_5_.canProvidePower())
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                org.bukkit.World bworld = p_149695_1_.getWorld();
 | 
			
		||||
+                org.bukkit.block.Block bblock = bworld.getBlockAt(p_149695_2_, p_149695_3_, p_149695_4_);
 | 
			
		||||
+                int power = bblock.getBlockPower();
 | 
			
		||||
+                int oldPower = (p_149695_1_.getBlockMetadata(p_149695_2_, p_149695_3_, p_149695_4_) & 4) > 0 ? 15 : 0;
 | 
			
		||||
+
 | 
			
		||||
+                if (oldPower == 0 ^ power == 0 || p_149695_5_.canProvidePower())
 | 
			
		||||
+                {
 | 
			
		||||
+                    BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power);
 | 
			
		||||
+                    p_149695_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+                    flag = eventRedstone.getNewCurrent() > 0;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 this.func_150120_a(p_149695_1_, p_149695_2_, p_149695_3_, p_149695_4_, flag);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										63
									
								
								patches/net/minecraft/block/BlockTripWire.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								patches/net/minecraft/block/BlockTripWire.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockTripWire.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockTripWire.java
 | 
			
		||||
@@ -16,6 +16,8 @@
 | 
			
		||||
 import net.minecraft.world.IBlockAccess;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockTripWire extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000328";
 | 
			
		||||
@@ -208,6 +210,51 @@
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start - Call interact even when triggering connected tripwire
 | 
			
		||||
+        if (flag != flag1 && flag1 && (p_150140_1_.getBlockMetadata(p_150140_2_, p_150140_3_, p_150140_4_) & 4) == 4)
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.World bworld = p_150140_1_.getWorld();
 | 
			
		||||
+            org.bukkit.plugin.PluginManager manager = p_150140_1_.getServer().getPluginManager();
 | 
			
		||||
+            org.bukkit.block.Block block = bworld.getBlockAt(p_150140_2_, p_150140_3_, p_150140_4_);
 | 
			
		||||
+            boolean allowed = false;
 | 
			
		||||
+
 | 
			
		||||
+            // If all of the events are cancelled block the tripwire trigger, else allow
 | 
			
		||||
+            for (Object object : list)
 | 
			
		||||
+            {
 | 
			
		||||
+                if (object != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    org.bukkit.event.Cancellable cancellable;
 | 
			
		||||
+
 | 
			
		||||
+                    if (object instanceof EntityPlayer)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityPlayer) object, org.bukkit.event.block.Action.PHYSICAL, p_150140_2_, p_150140_3_, p_150140_4_, -1, null);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else if (object instanceof Entity)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
 | 
			
		||||
+                        manager.callEvent((EntityInteractEvent) cancellable);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        continue;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    if (!cancellable.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        allowed = true;
 | 
			
		||||
+                        break;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            if (!allowed)
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (flag1 && !flag)
 | 
			
		||||
         {
 | 
			
		||||
             l |= 1;
 | 
			
		||||
							
								
								
									
										29
									
								
								patches/net/minecraft/block/BlockTripWireHook.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								patches/net/minecraft/block/BlockTripWireHook.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockTripWireHook.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockTripWireHook.java
 | 
			
		||||
@@ -12,6 +12,8 @@
 | 
			
		||||
 import net.minecraftforge.common.util.ForgeDirection;
 | 
			
		||||
 import static net.minecraftforge.common.util.ForgeDirection.*;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockTripWireHook extends Block
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000329";
 | 
			
		||||
@@ -210,6 +212,17 @@
 | 
			
		||||
             this.func_150135_a(p_150136_1_, l2, p_150136_3_, i3, flag4, flag5, flag2, flag3);
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        org.bukkit.block.Block block = p_150136_1_.getWorld().getBlockAt(p_150136_2_, p_150136_3_, p_150136_4_);
 | 
			
		||||
+        BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0);
 | 
			
		||||
+        p_150136_1_.getServer().getPluginManager().callEvent(eventRedstone);
 | 
			
		||||
+
 | 
			
		||||
+        if (eventRedstone.getNewCurrent() > 0)
 | 
			
		||||
+        {
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         this.func_150135_a(p_150136_1_, p_150136_2_, p_150136_3_, p_150136_4_, flag4, flag5, flag2, flag3);
 | 
			
		||||
 
 | 
			
		||||
         if (!p_150136_5_)
 | 
			
		||||
							
								
								
									
										77
									
								
								patches/net/minecraft/block/BlockVine.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								patches/net/minecraft/block/BlockVine.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/block/BlockVine.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/block/BlockVine.java
 | 
			
		||||
@@ -21,6 +21,8 @@
 | 
			
		||||
 import net.minecraftforge.common.ForgeHooks;
 | 
			
		||||
 import net.minecraftforge.common.IShearable;
 | 
			
		||||
 
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class BlockVine extends Block implements IShearable
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000330";
 | 
			
		||||
@@ -268,7 +270,11 @@
 | 
			
		||||
 
 | 
			
		||||
                     if (j2 > 0)
 | 
			
		||||
                     {
 | 
			
		||||
-                        p_149674_1_.setBlock(p_149674_2_, p_149674_3_ + 1, p_149674_4_, this, j2, 2);
 | 
			
		||||
+                        // CraftBukkit start - Call BlockSpreadEvent
 | 
			
		||||
+                        org.bukkit.block.Block source = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                        org.bukkit.block.Block block = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_ + 1, p_149674_4_);
 | 
			
		||||
+                        CraftEventFactory.handleBlockSpreadEvent(block, source, this, l1);
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
@@ -290,27 +296,34 @@
 | 
			
		||||
                     {
 | 
			
		||||
                         l1 = k1 + 1 & 3;
 | 
			
		||||
                         i2 = k1 + 3 & 3;
 | 
			
		||||
+                        // CraftBukkit start - Call BlockSpreadEvent
 | 
			
		||||
+                        org.bukkit.block.Block source = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                        org.bukkit.block.Block bukkitBlock = p_149674_1_.getWorld().getBlockAt(p_149674_2_ + Direction.offsetX[k1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1]);
 | 
			
		||||
 
 | 
			
		||||
                         if ((i1 & 1 << l1) != 0 && this.func_150093_a(p_149674_1_.getBlock(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[l1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[l1])))
 | 
			
		||||
                         {
 | 
			
		||||
-                            p_149674_1_.setBlock(p_149674_2_ + Direction.offsetX[k1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1], this, 1 << l1, 2);
 | 
			
		||||
+                            CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << l1);
 | 
			
		||||
                         }
 | 
			
		||||
                         else if ((i1 & 1 << i2) != 0 && this.func_150093_a(p_149674_1_.getBlock(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[i2], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[i2])))
 | 
			
		||||
                         {
 | 
			
		||||
-                            p_149674_1_.setBlock(p_149674_2_ + Direction.offsetX[k1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1], this, 1 << i2, 2);
 | 
			
		||||
+                            CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << i2);
 | 
			
		||||
                         }
 | 
			
		||||
                         else if ((i1 & 1 << l1) != 0 && p_149674_1_.isAirBlock(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[l1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[l1]) && this.func_150093_a(p_149674_1_.getBlock(p_149674_2_ + Direction.offsetX[l1], p_149674_3_, p_149674_4_ + Direction.offsetZ[l1])))
 | 
			
		||||
                         {
 | 
			
		||||
-                            p_149674_1_.setBlock(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[l1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[l1], this, 1 << (k1 + 2 & 3), 2);
 | 
			
		||||
+                            bukkitBlock = p_149674_1_.getWorld().getBlockAt(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[l1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[l1]);
 | 
			
		||||
+                            CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << (k1 + 2 & 3));
 | 
			
		||||
                         }
 | 
			
		||||
                         else if ((i1 & 1 << i2) != 0 && p_149674_1_.isAirBlock(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[i2], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[i2]) && this.func_150093_a(p_149674_1_.getBlock(p_149674_2_ + Direction.offsetX[i2], p_149674_3_, p_149674_4_ + Direction.offsetZ[i2])))
 | 
			
		||||
                         {
 | 
			
		||||
-                            p_149674_1_.setBlock(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[i2], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[i2], this, 1 << (k1 + 2 & 3), 2);
 | 
			
		||||
+                            bukkitBlock = p_149674_1_.getWorld().getBlockAt(p_149674_2_ + Direction.offsetX[k1] + Direction.offsetX[i2], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1] + Direction.offsetZ[i2]);
 | 
			
		||||
+                            CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << (k1 + 2 & 3));
 | 
			
		||||
                         }
 | 
			
		||||
                         else if (this.func_150093_a(p_149674_1_.getBlock(p_149674_2_ + Direction.offsetX[k1], p_149674_3_ + 1, p_149674_4_ + Direction.offsetZ[k1])))
 | 
			
		||||
                         {
 | 
			
		||||
-                            p_149674_1_.setBlock(p_149674_2_ + Direction.offsetX[k1], p_149674_3_, p_149674_4_ + Direction.offsetZ[k1], this, 0, 2);
 | 
			
		||||
+                            CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 0);
 | 
			
		||||
                         }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                     }
 | 
			
		||||
                     else if (block.blockMaterial.isOpaque() && block.renderAsNormalBlock())
 | 
			
		||||
                     {
 | 
			
		||||
@@ -327,7 +340,11 @@
 | 
			
		||||
 
 | 
			
		||||
                         if (l1 > 0)
 | 
			
		||||
                         {
 | 
			
		||||
-                            p_149674_1_.setBlock(p_149674_2_, p_149674_3_ - 1, p_149674_4_, this, l1, 2);
 | 
			
		||||
+                            // CraftBukkit start - Call BlockSpreadEvent
 | 
			
		||||
+                            org.bukkit.block.Block source = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_, p_149674_4_);
 | 
			
		||||
+                            org.bukkit.block.Block bukkitBlock = p_149674_1_.getWorld().getBlockAt(p_149674_2_, p_149674_3_ - 1, p_149674_4_);
 | 
			
		||||
+                            CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, l1);
 | 
			
		||||
+                            // CraftBukkit end
 | 
			
		||||
                         }
 | 
			
		||||
                     }
 | 
			
		||||
                     else if (block == this)
 | 
			
		||||
							
								
								
									
										26
									
								
								patches/net/minecraft/client/Minecraft.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								patches/net/minecraft/client/Minecraft.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/client/Minecraft.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/client/Minecraft.java
 | 
			
		||||
@@ -148,6 +148,7 @@
 | 
			
		||||
 import net.minecraft.util.Timer;
 | 
			
		||||
 import net.minecraft.util.Util;
 | 
			
		||||
 import net.minecraft.world.EnumDifficulty;
 | 
			
		||||
+import net.minecraft.world.MinecraftException;
 | 
			
		||||
 import net.minecraft.world.WorldProviderEnd;
 | 
			
		||||
 import net.minecraft.world.WorldProviderHell;
 | 
			
		||||
 import net.minecraft.world.WorldSettings;
 | 
			
		||||
@@ -2644,7 +2645,14 @@
 | 
			
		||||
 
 | 
			
		||||
             if (integratedserver != null)
 | 
			
		||||
             {
 | 
			
		||||
-                integratedserver.stopServer();
 | 
			
		||||
+                try
 | 
			
		||||
+                {
 | 
			
		||||
+                    integratedserver.stopServer();
 | 
			
		||||
+                }
 | 
			
		||||
+                catch (MinecraftException e)
 | 
			
		||||
+                {
 | 
			
		||||
+                    e.printStackTrace();
 | 
			
		||||
+                }
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
							
								
								
									
										74
									
								
								patches/net/minecraft/command/CommandHandler.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								patches/net/minecraft/command/CommandHandler.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/command/CommandHandler.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/command/CommandHandler.java
 | 
			
		||||
@@ -16,6 +16,11 @@
 | 
			
		||||
 
 | 
			
		||||
 import net.minecraftforge.common.MinecraftForge;
 | 
			
		||||
 import net.minecraftforge.event.CommandEvent;
 | 
			
		||||
+// Cauldron start
 | 
			
		||||
+import org.bukkit.craftbukkit.command.CraftSimpleCommandMap;
 | 
			
		||||
+import org.bukkit.craftbukkit.command.ModCustomCommand;
 | 
			
		||||
+import cpw.mods.fml.common.FMLCommonHandler;
 | 
			
		||||
+// Cauldron end
 | 
			
		||||
 
 | 
			
		||||
 public class CommandHandler implements ICommandManager
 | 
			
		||||
 {
 | 
			
		||||
@@ -48,7 +53,7 @@
 | 
			
		||||
                 throw new CommandNotFoundException();
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            if (icommand.canCommandSenderUseCommand(p_71556_1_))
 | 
			
		||||
+            if (true || icommand.canCommandSenderUseCommand(p_71556_1_)) // Cauldron start - disable check for permissions since we handle it on Bukkit side
 | 
			
		||||
             {
 | 
			
		||||
                 CommandEvent event = new CommandEvent(icommand, p_71556_1_, astring);
 | 
			
		||||
                 if (MinecraftForge.EVENT_BUS.post(event))
 | 
			
		||||
@@ -134,11 +139,30 @@
 | 
			
		||||
 
 | 
			
		||||
     public ICommand registerCommand(ICommand p_71560_1_)
 | 
			
		||||
     {
 | 
			
		||||
-        List list = p_71560_1_.getCommandAliases();
 | 
			
		||||
-        this.commandMap.put(p_71560_1_.getCommandName(), p_71560_1_);
 | 
			
		||||
-        this.commandSet.add(p_71560_1_);
 | 
			
		||||
+    // Cauldron start - register commands with permission nodes, defaulting to class name
 | 
			
		||||
+        return registerCommand(p_71560_1_, p_71560_1_.getClass().getName());
 | 
			
		||||
+    }
 | 
			
		||||
 
 | 
			
		||||
+    public ICommand registerCommand(String permissionGroup, ICommand par1ICommand)
 | 
			
		||||
+    {
 | 
			
		||||
+        return registerCommand(par1ICommand, permissionGroup + "." + par1ICommand.getCommandName());
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public ICommand registerCommand(ICommand par1ICommand, String permissionNode)
 | 
			
		||||
+    {
 | 
			
		||||
+        List list = par1ICommand.getCommandAliases();
 | 
			
		||||
+        this.commandMap.put(par1ICommand.getCommandName(), par1ICommand);
 | 
			
		||||
+        this.commandSet.add(par1ICommand);
 | 
			
		||||
+        // register vanilla commands with Bukkit to support permissions.
 | 
			
		||||
+        CraftSimpleCommandMap commandMap = FMLCommonHandler.instance().getMinecraftServerInstance().server.getCraftCommandMap();
 | 
			
		||||
+        ModCustomCommand customCommand = new ModCustomCommand(par1ICommand.getCommandName());
 | 
			
		||||
+        customCommand.setPermission(permissionNode);
 | 
			
		||||
         if (list != null)
 | 
			
		||||
+            customCommand.setAliases(list);
 | 
			
		||||
+        commandMap.register(par1ICommand.getCommandName(), customCommand);
 | 
			
		||||
+        LogManager.getLogger().info("Registered command " + par1ICommand.getCommandName() + " with permission node " + permissionNode);
 | 
			
		||||
+
 | 
			
		||||
+        if (list != null)
 | 
			
		||||
         {
 | 
			
		||||
             Iterator iterator = list.iterator();
 | 
			
		||||
 
 | 
			
		||||
@@ -149,13 +173,14 @@
 | 
			
		||||
 
 | 
			
		||||
                 if (icommand1 == null || !icommand1.getCommandName().equals(s))
 | 
			
		||||
                 {
 | 
			
		||||
-                    this.commandMap.put(s, p_71560_1_);
 | 
			
		||||
+                    this.commandMap.put(s, par1ICommand);
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
-        return p_71560_1_;
 | 
			
		||||
+        return par1ICommand;
 | 
			
		||||
     }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
 
 | 
			
		||||
     private static String[] dropFirstString(String[] p_71559_0_)
 | 
			
		||||
     {
 | 
			
		||||
							
								
								
									
										24
									
								
								patches/net/minecraft/command/PlayerSelector.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								patches/net/minecraft/command/PlayerSelector.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/command/PlayerSelector.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/command/PlayerSelector.java
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
 import java.util.Map;
 | 
			
		||||
 import java.util.regex.Matcher;
 | 
			
		||||
 import java.util.regex.Pattern;
 | 
			
		||||
+import net.minecraft.command.server.CommandBlockLogic;
 | 
			
		||||
 import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
 import net.minecraft.server.MinecraftServer;
 | 
			
		||||
 import net.minecraft.util.ChunkCoordinates;
 | 
			
		||||
@@ -51,6 +52,13 @@
 | 
			
		||||
 
 | 
			
		||||
     public static EntityPlayerMP[] matchPlayers(ICommandSender p_82380_0_, String p_82380_1_)
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        if (!(p_82380_0_ instanceof CommandBlockLogic))
 | 
			
		||||
+        {
 | 
			
		||||
+            return null;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         Matcher matcher = tokenPattern.matcher(p_82380_1_);
 | 
			
		||||
 
 | 
			
		||||
         if (matcher.matches())
 | 
			
		||||
@@ -0,0 +1,76 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/command/ServerCommandManager.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/command/ServerCommandManager.java
 | 
			
		||||
@@ -39,8 +39,16 @@
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00000922";
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start - moved commands to it's own method to be executed further in server startup + changed to registerVanillaCommand
 | 
			
		||||
     public ServerCommandManager()
 | 
			
		||||
     {
 | 
			
		||||
+        CommandBase.setAdminCommander(this);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public void registerVanillaCommands()
 | 
			
		||||
+    {
 | 
			
		||||
+        // Cauldron - do not register vanilla commands replaced by Bukkit
 | 
			
		||||
+        /*    
 | 
			
		||||
         this.registerCommand(new CommandTime());
 | 
			
		||||
         this.registerCommand(new CommandGameMode());
 | 
			
		||||
         this.registerCommand(new CommandDifficulty());
 | 
			
		||||
@@ -56,7 +64,6 @@
 | 
			
		||||
         this.registerCommand(new CommandEmote());
 | 
			
		||||
         this.registerCommand(new CommandShowSeed());
 | 
			
		||||
         this.registerCommand(new CommandHelp());
 | 
			
		||||
-        this.registerCommand(new CommandDebug());
 | 
			
		||||
         this.registerCommand(new CommandMessage());
 | 
			
		||||
         this.registerCommand(new CommandBroadcast());
 | 
			
		||||
         this.registerCommand(new CommandSetSpawnpoint());
 | 
			
		||||
@@ -64,17 +71,23 @@
 | 
			
		||||
         this.registerCommand(new CommandGameRule());
 | 
			
		||||
         this.registerCommand(new CommandClearInventory());
 | 
			
		||||
         this.registerCommand(new CommandTestFor());
 | 
			
		||||
-        this.registerCommand(new CommandSpreadPlayers());
 | 
			
		||||
-        this.registerCommand(new CommandPlaySound());
 | 
			
		||||
-        this.registerCommand(new CommandScoreboard());
 | 
			
		||||
-        this.registerCommand(new CommandAchievement());
 | 
			
		||||
-        this.registerCommand(new CommandSummon());
 | 
			
		||||
-        this.registerCommand(new CommandSetBlock());
 | 
			
		||||
-        this.registerCommand(new CommandTestForBlock());
 | 
			
		||||
-        this.registerCommand(new CommandMessageRaw());
 | 
			
		||||
+        */
 | 
			
		||||
+        // Cauldron start - add permission nodes for rest of vanilla commands
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandDebug());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandSpreadPlayers());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandPlaySound());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandScoreboard());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandAchievement());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandSummon());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandSetBlock());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandTestForBlock());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandMessageRaw());
 | 
			
		||||
+        this.registerCommand("vanilla.command", new CommandNetstat());
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
 
 | 
			
		||||
         if (MinecraftServer.getServer().isDedicatedServer())
 | 
			
		||||
         {
 | 
			
		||||
+            /*
 | 
			
		||||
             this.registerCommand(new CommandOp());
 | 
			
		||||
             this.registerCommand(new CommandDeOp());
 | 
			
		||||
             this.registerCommand(new CommandStop());
 | 
			
		||||
@@ -90,7 +103,7 @@
 | 
			
		||||
             this.registerCommand(new CommandListPlayers());
 | 
			
		||||
             this.registerCommand(new CommandWhitelist());
 | 
			
		||||
             this.registerCommand(new CommandSetPlayerTimeout());
 | 
			
		||||
-            this.registerCommand(new CommandNetstat());
 | 
			
		||||
+            */
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
@@ -98,6 +111,7 @@
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         CommandBase.setAdminCommander(this);
 | 
			
		||||
+        // Cauldron end
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public void func_152372_a(ICommandSender p_152372_1_, ICommand p_152372_2_, int p_152372_3_, String p_152372_4_, Object ... p_152372_5_)
 | 
			
		||||
@@ -0,0 +1,212 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/command/server/CommandBlockLogic.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/command/server/CommandBlockLogic.java
 | 
			
		||||
@@ -9,18 +9,30 @@
 | 
			
		||||
 import net.minecraft.command.ICommandSender;
 | 
			
		||||
 import net.minecraft.nbt.NBTTagCompound;
 | 
			
		||||
 import net.minecraft.server.MinecraftServer;
 | 
			
		||||
+import net.minecraft.tileentity.TileEntityCommandBlockListener;
 | 
			
		||||
 import net.minecraft.util.ChatComponentText;
 | 
			
		||||
 import net.minecraft.util.IChatComponent;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import java.util.ArrayList;
 | 
			
		||||
+import org.apache.logging.log4j.Level;
 | 
			
		||||
+import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
 | 
			
		||||
+import com.google.common.base.Joiner;
 | 
			
		||||
+import net.minecraft.command.PlayerSelector;
 | 
			
		||||
+import net.minecraft.entity.EntityMinecartCommandBlockListener;
 | 
			
		||||
+import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public abstract class CommandBlockLogic implements ICommandSender
 | 
			
		||||
 {
 | 
			
		||||
     private static final SimpleDateFormat field_145766_a = new SimpleDateFormat("HH:mm:ss");
 | 
			
		||||
     private int field_145764_b;
 | 
			
		||||
     private boolean field_145765_c = true;
 | 
			
		||||
     private IChatComponent field_145762_d = null;
 | 
			
		||||
-    private String field_145763_e = "";
 | 
			
		||||
+    public String field_145763_e = ""; // CraftBukkit - private -> public
 | 
			
		||||
     private String field_145761_f = "@";
 | 
			
		||||
+    protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender;
 | 
			
		||||
     private static final String __OBFID = "CL_00000128";
 | 
			
		||||
 
 | 
			
		||||
     public int func_145760_g()
 | 
			
		||||
@@ -94,8 +106,143 @@
 | 
			
		||||
 
 | 
			
		||||
         if (minecraftserver != null && minecraftserver.isCommandBlockEnabled())
 | 
			
		||||
         {
 | 
			
		||||
-            ICommandManager icommandmanager = minecraftserver.getCommandManager();
 | 
			
		||||
-            this.field_145764_b = icommandmanager.executeCommand(this, this.field_145763_e);
 | 
			
		||||
+            // CraftBukkit start - Handle command block commands using Bukkit dispatcher
 | 
			
		||||
+            org.bukkit.command.SimpleCommandMap commandMap = minecraftserver.server.getCommandMap();
 | 
			
		||||
+            Joiner joiner = Joiner.on(" ");
 | 
			
		||||
+            String command = this.field_145763_e;
 | 
			
		||||
+
 | 
			
		||||
+            if (this.field_145763_e.startsWith("/"))
 | 
			
		||||
+            {
 | 
			
		||||
+                command = this.field_145763_e.substring(1);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            String[] args = command.split(" ");
 | 
			
		||||
+            ArrayList<String[]> commands = new ArrayList<String[]>();
 | 
			
		||||
+
 | 
			
		||||
+            // Block disallowed commands
 | 
			
		||||
+            if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("op") ||
 | 
			
		||||
+                    args[0].equalsIgnoreCase("deop") || args[0].equalsIgnoreCase("ban") || args[0].equalsIgnoreCase("ban-ip") ||
 | 
			
		||||
+                    args[0].equalsIgnoreCase("pardon") || args[0].equalsIgnoreCase("pardon-ip") || args[0].equalsIgnoreCase("reload"))
 | 
			
		||||
+            {
 | 
			
		||||
+                this.field_145764_b = 0;
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // If the world has no players don't run
 | 
			
		||||
+            if (this.getEntityWorld().playerEntities.isEmpty())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.field_145764_b = 0;
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // Handle vanilla commands;
 | 
			
		||||
+            if (minecraftserver.server.getCommandBlockOverride(args[0]))
 | 
			
		||||
+            {
 | 
			
		||||
+                org.bukkit.command.Command commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]);
 | 
			
		||||
+
 | 
			
		||||
+                if (commandBlockCommand instanceof VanillaCommandWrapper)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.field_145764_b = ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommandBlock(this, this.field_145763_e);
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // Make sure this is a valid command
 | 
			
		||||
+            if (commandMap.getCommand(args[0]) == null)
 | 
			
		||||
+            {
 | 
			
		||||
+                // Cauldron start - execute command using the vanilla command manager if it isn't in the bukkit command map
 | 
			
		||||
+                net.minecraft.command.ICommandManager icommandmanager = minecraftserver.getCommandManager();
 | 
			
		||||
+                icommandmanager.executeCommand(this, this.field_145763_e);
 | 
			
		||||
+                return;
 | 
			
		||||
+                // Cauldron end
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // testfor command requires special handling
 | 
			
		||||
+            if (args[0].equalsIgnoreCase("testfor"))
 | 
			
		||||
+            {
 | 
			
		||||
+                if (args.length < 2)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.field_145764_b = 0;
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                EntityPlayerMP[] players = PlayerSelector.matchPlayers(this, args[1]);
 | 
			
		||||
+
 | 
			
		||||
+                if (players != null && players.length > 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.field_145764_b = players.length;
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    EntityPlayerMP player = MinecraftServer.getServer().getConfigurationManager().func_152612_a(args[1]);
 | 
			
		||||
+
 | 
			
		||||
+                    if (player == null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.field_145764_b = 0;
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.field_145764_b = 1;
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            commands.add(args);
 | 
			
		||||
+            // Find positions of command block syntax, if any
 | 
			
		||||
+            ArrayList<String[]> newCommands = new ArrayList<String[]>();
 | 
			
		||||
+
 | 
			
		||||
+            for (int i = 0; i < args.length; i++)
 | 
			
		||||
+            {
 | 
			
		||||
+                if (PlayerSelector.hasArguments(args[i]))
 | 
			
		||||
+                {
 | 
			
		||||
+                    for (int j = 0; j < commands.size(); j++)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        newCommands.addAll(this.buildCommands(commands.get(j), i));
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    ArrayList<String[]> temp = commands;
 | 
			
		||||
+                    commands = newCommands;
 | 
			
		||||
+                    newCommands = temp;
 | 
			
		||||
+                    newCommands.clear();
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            int completed = 0;
 | 
			
		||||
+
 | 
			
		||||
+            // Now dispatch all of the commands we ended up with
 | 
			
		||||
+            for (int i = 0; i < commands.size(); i++)
 | 
			
		||||
+            {
 | 
			
		||||
+                try
 | 
			
		||||
+                {
 | 
			
		||||
+                    if (commandMap.dispatch(sender, joiner.join(java.util.Arrays.asList(commands.get(i)))))
 | 
			
		||||
+                    {
 | 
			
		||||
+                        completed++;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+                catch (Throwable exception)
 | 
			
		||||
+                {
 | 
			
		||||
+                    if (this instanceof TileEntityCommandBlockListener)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        TileEntityCommandBlockListener listener = (TileEntityCommandBlockListener) this;
 | 
			
		||||
+                        MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getPlayerCoordinates().posX, listener.getPlayerCoordinates().posY, listener.getPlayerCoordinates().posZ), exception);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else if (this instanceof EntityMinecartCommandBlockListener)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) this;
 | 
			
		||||
+                        MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getPlayerCoordinates().posX, listener.getPlayerCoordinates().posY, listener.getPlayerCoordinates().posZ), exception);
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), exception);
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            this.field_145764_b = completed;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
@@ -103,6 +250,31 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    private ArrayList<String[]> buildCommands(String[] args, int pos)
 | 
			
		||||
+    {
 | 
			
		||||
+        ArrayList<String[]> commands = new ArrayList<String[]>();
 | 
			
		||||
+        EntityPlayerMP[] players = PlayerSelector.matchPlayers(this, args[pos]);
 | 
			
		||||
+
 | 
			
		||||
+        if (players != null)
 | 
			
		||||
+        {
 | 
			
		||||
+            for (EntityPlayerMP player : players)
 | 
			
		||||
+            {
 | 
			
		||||
+                if (player.worldObj != this.getEntityWorld())
 | 
			
		||||
+                {
 | 
			
		||||
+                    continue;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                String[] command = args.clone();
 | 
			
		||||
+                command[pos] = player.getCommandSenderName();
 | 
			
		||||
+                commands.add(command);
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        return commands;
 | 
			
		||||
+    }
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
     public String getCommandSenderName()
 | 
			
		||||
     {
 | 
			
		||||
         return this.field_145761_f;
 | 
			
		||||
@@ -0,0 +1,101 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/dispenser/BehaviorDefaultDispenseItem.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/dispenser/BehaviorDefaultDispenseItem.java
 | 
			
		||||
@@ -6,6 +6,11 @@
 | 
			
		||||
 import net.minecraft.util.EnumFacing;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
 | 
			
		||||
+import org.bukkit.event.block.BlockDispenseEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class BehaviorDefaultDispenseItem implements IBehaviorDispenseItem
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00001195";
 | 
			
		||||
@@ -23,10 +28,17 @@
 | 
			
		||||
         EnumFacing enumfacing = BlockDispenser.func_149937_b(p_82487_1_.getBlockMetadata());
 | 
			
		||||
         IPosition iposition = BlockDispenser.func_149939_a(p_82487_1_);
 | 
			
		||||
         ItemStack itemstack1 = p_82487_2_.splitStack(1);
 | 
			
		||||
-        doDispense(p_82487_1_.getWorld(), itemstack1, 6, enumfacing, iposition);
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        if (!doDispense(p_82487_1_.getWorld(), itemstack1, 6, enumfacing, p_82487_1_))
 | 
			
		||||
+        {
 | 
			
		||||
+           p_82487_2_.stackSize++;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         return p_82487_2_;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start - vanilla compatibility
 | 
			
		||||
     public static void doDispense(World p_82486_0_, ItemStack p_82486_1_, int p_82486_2_, EnumFacing p_82486_3_, IPosition p_82486_4_)
 | 
			
		||||
     {
 | 
			
		||||
         double d0 = p_82486_4_.getX();
 | 
			
		||||
@@ -42,7 +54,67 @@
 | 
			
		||||
         entityitem.motionZ += p_82486_0_.rand.nextGaussian() * 0.007499999832361937D * (double)p_82486_2_;
 | 
			
		||||
         p_82486_0_.spawnEntityInWorld(entityitem);
 | 
			
		||||
     }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
 
 | 
			
		||||
+    // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument
 | 
			
		||||
+    public static boolean doDispense(World world, ItemStack itemstack, int i, EnumFacing enumfacing, IBlockSource iblocksource)
 | 
			
		||||
+    {
 | 
			
		||||
+        IPosition iposition = BlockDispenser.func_149939_a(iblocksource);
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+        double d0 = iposition.getX();
 | 
			
		||||
+        double d1 = iposition.getY();
 | 
			
		||||
+        double d2 = iposition.getZ();
 | 
			
		||||
+        EntityItem entityitem = new EntityItem(world, d0, d1 - 0.3D, d2, itemstack);
 | 
			
		||||
+        double d3 = world.rand.nextDouble() * 0.1D + 0.2D;
 | 
			
		||||
+        entityitem.motionX = (double) enumfacing.getFrontOffsetX() * d3;
 | 
			
		||||
+        entityitem.motionY = 0.20000000298023224D;
 | 
			
		||||
+        entityitem.motionZ = (double) enumfacing.getFrontOffsetZ() * d3;
 | 
			
		||||
+        entityitem.motionX += world.rand.nextGaussian() * 0.007499999832361937D * (double) i;
 | 
			
		||||
+        entityitem.motionY += world.rand.nextGaussian() * 0.007499999832361937D * (double) i;
 | 
			
		||||
+        entityitem.motionZ += world.rand.nextGaussian() * 0.007499999832361937D * (double) i;
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        org.bukkit.block.Block block = world.getWorld().getBlockAt(iblocksource.getXInt(), iblocksource.getYInt(), iblocksource.getZInt());
 | 
			
		||||
+        CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
 | 
			
		||||
+        BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motionX, entityitem.motionY, entityitem.motionZ));
 | 
			
		||||
+
 | 
			
		||||
+        if (!BlockDispenser.eventFired)
 | 
			
		||||
+        {
 | 
			
		||||
+            world.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if (event.isCancelled())
 | 
			
		||||
+        {
 | 
			
		||||
+            return false;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        entityitem.setEntityItemStack(CraftItemStack.asNMSCopy(event.getItem()));
 | 
			
		||||
+        entityitem.motionX = event.getVelocity().getX();
 | 
			
		||||
+        entityitem.motionY = event.getVelocity().getY();
 | 
			
		||||
+        entityitem.motionZ = event.getVelocity().getZ();
 | 
			
		||||
+
 | 
			
		||||
+        if (!event.getItem().equals(craftItem))
 | 
			
		||||
+        {
 | 
			
		||||
+            // Chain to handler for new item
 | 
			
		||||
+            ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
 | 
			
		||||
+            IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem());
 | 
			
		||||
+
 | 
			
		||||
+            if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem.getClass() != BehaviorDefaultDispenseItem.class)
 | 
			
		||||
+            {
 | 
			
		||||
+                ibehaviordispenseitem.dispense(iblocksource, eventStack);
 | 
			
		||||
+            }
 | 
			
		||||
+            else
 | 
			
		||||
+            {
 | 
			
		||||
+                world.spawnEntityInWorld(entityitem);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            return false;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        world.spawnEntityInWorld(entityitem);
 | 
			
		||||
+        return true;
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     protected void playDispenseSound(IBlockSource p_82485_1_)
 | 
			
		||||
     {
 | 
			
		||||
         p_82485_1_.getWorld().playAuxSFX(1000, p_82485_1_.getXInt(), p_82485_1_.getYInt(), p_82485_1_.getZInt(), 0);
 | 
			
		||||
@@ -0,0 +1,59 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/dispenser/BehaviorProjectileDispense.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/dispenser/BehaviorProjectileDispense.java
 | 
			
		||||
@@ -7,6 +7,12 @@
 | 
			
		||||
 import net.minecraft.util.EnumFacing;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.tileentity.TileEntityDispenser;
 | 
			
		||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
 | 
			
		||||
+import org.bukkit.event.block.BlockDispenseEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public abstract class BehaviorProjectileDispense extends BehaviorDefaultDispenseItem
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00001394";
 | 
			
		||||
@@ -17,9 +23,42 @@
 | 
			
		||||
         IPosition iposition = BlockDispenser.func_149939_a(p_82487_1_);
 | 
			
		||||
         EnumFacing enumfacing = BlockDispenser.func_149937_b(p_82487_1_.getBlockMetadata());
 | 
			
		||||
         IProjectile iprojectile = this.getProjectileEntity(world, iposition);
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        ItemStack itemstack1 = p_82487_2_.splitStack(1);
 | 
			
		||||
+        org.bukkit.block.Block block = world.getWorld().getBlockAt(p_82487_1_.getXInt(), p_82487_1_.getYInt(), p_82487_1_.getZInt());
 | 
			
		||||
+        CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
 | 
			
		||||
+        BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumfacing.getFrontOffsetX(), (double)((float) enumfacing.getFrontOffsetY() + 0.1F), (double) enumfacing.getFrontOffsetZ()));
 | 
			
		||||
+
 | 
			
		||||
+        if (!BlockDispenser.eventFired)
 | 
			
		||||
+        {
 | 
			
		||||
+            world.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if (event.isCancelled())
 | 
			
		||||
+        {
 | 
			
		||||
+            p_82487_2_.stackSize++;
 | 
			
		||||
+            return p_82487_2_;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if (!event.getItem().equals(craftItem))
 | 
			
		||||
+        {
 | 
			
		||||
+            p_82487_2_.stackSize++;
 | 
			
		||||
+            // Chain to handler for new item
 | 
			
		||||
+            ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
 | 
			
		||||
+            IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem());
 | 
			
		||||
+
 | 
			
		||||
+            if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this)
 | 
			
		||||
+            {
 | 
			
		||||
+                ibehaviordispenseitem.dispense(p_82487_1_, eventStack);
 | 
			
		||||
+                return p_82487_2_;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
         iprojectile.setThrowableHeading((double)enumfacing.getFrontOffsetX(), (double)((float)enumfacing.getFrontOffsetY() + 0.1F), (double)enumfacing.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a());
 | 
			
		||||
+        ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) p_82487_1_.getBlockTileEntity());
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         world.spawnEntityInWorld((Entity)iprojectile);
 | 
			
		||||
-        p_82487_2_.splitStack(1);
 | 
			
		||||
+        // p_82487_2_.splitStack(1); // CraftBukkit - Handled during event processing
 | 
			
		||||
         return p_82487_2_;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								patches/net/minecraft/enchantment/Enchantment.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								patches/net/minecraft/enchantment/Enchantment.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/enchantment/Enchantment.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/enchantment/Enchantment.java
 | 
			
		||||
@@ -56,6 +56,8 @@
 | 
			
		||||
         {
 | 
			
		||||
             enchantmentsList[p_i1926_1_] = this;
 | 
			
		||||
         }
 | 
			
		||||
+
 | 
			
		||||
+        org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment(this)); // CraftBukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public int getWeight()
 | 
			
		||||
							
								
								
									
										775
									
								
								patches/net/minecraft/entity/Entity.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										775
									
								
								patches/net/minecraft/entity/Entity.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,775 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/Entity.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/Entity.java
 | 
			
		||||
@@ -45,13 +45,51 @@
 | 
			
		||||
 import net.minecraft.world.Explosion;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 import net.minecraft.world.WorldServer;
 | 
			
		||||
+import net.minecraftforge.cauldron.CauldronHooks;
 | 
			
		||||
 import net.minecraftforge.common.IExtendedEntityProperties;
 | 
			
		||||
 import net.minecraftforge.common.MinecraftForge;
 | 
			
		||||
 import net.minecraftforge.event.entity.EntityEvent;
 | 
			
		||||
 import net.minecraftforge.fluids.IFluidBlock;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.passive.EntityTameable;
 | 
			
		||||
+import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
+import org.bukkit.Bukkit;
 | 
			
		||||
+import org.bukkit.Location;
 | 
			
		||||
+import org.bukkit.Server;
 | 
			
		||||
+import org.bukkit.TravelAgent;
 | 
			
		||||
+import org.bukkit.block.BlockFace;
 | 
			
		||||
+import org.bukkit.entity.Hanging;
 | 
			
		||||
+import org.bukkit.entity.LivingEntity;
 | 
			
		||||
+import org.bukkit.entity.Painting;
 | 
			
		||||
+import org.bukkit.entity.Vehicle;
 | 
			
		||||
+import org.spigotmc.CustomTimingsHandler; // Spigot
 | 
			
		||||
+import org.bukkit.event.entity.EntityCombustByEntityEvent;
 | 
			
		||||
+import org.bukkit.event.painting.PaintingBreakByEntityEvent;
 | 
			
		||||
+import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
 | 
			
		||||
+import org.bukkit.event.vehicle.VehicleEnterEvent;
 | 
			
		||||
+import org.bukkit.event.vehicle.VehicleExitEvent;
 | 
			
		||||
+import org.bukkit.craftbukkit.CraftWorld;
 | 
			
		||||
+import org.bukkit.craftbukkit.entity.CraftEntity;
 | 
			
		||||
+import org.bukkit.craftbukkit.entity.CraftPlayer;
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+import org.bukkit.event.entity.EntityCombustEvent;
 | 
			
		||||
+import org.bukkit.event.entity.EntityPortalEvent;
 | 
			
		||||
+import org.bukkit.event.hanging.HangingBreakByEntityEvent;
 | 
			
		||||
+import org.bukkit.plugin.PluginManager;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+import net.minecraft.world.Teleporter; // Cauldron
 | 
			
		||||
+
 | 
			
		||||
 public abstract class Entity
 | 
			
		||||
 {
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    private static final int CURRENT_LEVEL = 2;
 | 
			
		||||
+    static boolean isLevelAtLeast(NBTTagCompound tag, int level)
 | 
			
		||||
+    {
 | 
			
		||||
+        return tag.hasKey("Bukkit.updateLevel") && tag.getInteger("Bukkit.updateLevel") >= level;
 | 
			
		||||
+    }
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
     private static int nextEntityID;
 | 
			
		||||
     private int entityId;
 | 
			
		||||
     public double renderDistanceWeight;
 | 
			
		||||
@@ -100,12 +138,12 @@
 | 
			
		||||
     protected Random rand;
 | 
			
		||||
     public int ticksExisted;
 | 
			
		||||
     public int fireResistance;
 | 
			
		||||
-    private int fire;
 | 
			
		||||
-    protected boolean inWater;
 | 
			
		||||
+    public int fire; // CraftBukkit - private -> public
 | 
			
		||||
+    public boolean inWater; // Spigot - protected -> public
 | 
			
		||||
     public int hurtResistantTime;
 | 
			
		||||
     private boolean firstUpdate;
 | 
			
		||||
     protected boolean isImmuneToFire;
 | 
			
		||||
-    protected DataWatcher dataWatcher;
 | 
			
		||||
+    public DataWatcher dataWatcher; // CraftBukkit - protected -> public
 | 
			
		||||
     private double entityRiderPitchDelta;
 | 
			
		||||
     private double entityRiderYawDelta;
 | 
			
		||||
     public boolean addedToChunk;
 | 
			
		||||
@@ -126,8 +164,10 @@
 | 
			
		||||
     public int dimension;
 | 
			
		||||
     protected int teleportDirection;
 | 
			
		||||
     private boolean invulnerable;
 | 
			
		||||
-    protected UUID entityUniqueID;
 | 
			
		||||
+    public UUID entityUniqueID; // CraftBukkit - protected -> public
 | 
			
		||||
     public Entity.EnumEntitySize myEntitySize;
 | 
			
		||||
+    public boolean valid; // CraftBukkit
 | 
			
		||||
+    public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only
 | 
			
		||||
     private static final String __OBFID = "CL_00001533";
 | 
			
		||||
     /** Forge: Used to store custom data for each entity. */
 | 
			
		||||
     private NBTTagCompound customEntityData;
 | 
			
		||||
@@ -135,7 +175,16 @@
 | 
			
		||||
     public ArrayList<EntityItem> capturedDrops = new ArrayList<EntityItem>();
 | 
			
		||||
     private UUID persistentID;
 | 
			
		||||
 
 | 
			
		||||
+    // Spigot start
 | 
			
		||||
+    public CustomTimingsHandler tickTimer = org.bukkit.craftbukkit.SpigotTimings.getEntityTimings(this); // Spigot
 | 
			
		||||
+    public final byte activationType = org.spigotmc.ActivationRange.initializeEntityActivationType(this);
 | 
			
		||||
+    public final boolean defaultActivationState;
 | 
			
		||||
+    public long activatedTick = 0;
 | 
			
		||||
+    public boolean fromMobSpawner;
 | 
			
		||||
+    public void inactiveTick() { }
 | 
			
		||||
+    // Spigot end
 | 
			
		||||
     protected HashMap<String, IExtendedEntityProperties> extendedProperties;
 | 
			
		||||
+    public String spawnReason; // Cauldron - used to handle CraftBukkit's SpawnReason with CustomSpawners
 | 
			
		||||
 
 | 
			
		||||
     public int getEntityId()
 | 
			
		||||
     {
 | 
			
		||||
@@ -159,7 +208,7 @@
 | 
			
		||||
         this.rand = new Random();
 | 
			
		||||
         this.fireResistance = 1;
 | 
			
		||||
         this.firstUpdate = true;
 | 
			
		||||
-        this.entityUniqueID = UUID.randomUUID();
 | 
			
		||||
+        this.entityUniqueID = new UUID(rand.nextLong(), rand.nextLong()); // Spigot
 | 
			
		||||
         this.myEntitySize = Entity.EnumEntitySize.SIZE_2;
 | 
			
		||||
         this.worldObj = p_i1582_1_;
 | 
			
		||||
         this.setPosition(0.0D, 0.0D, 0.0D);
 | 
			
		||||
@@ -167,8 +216,15 @@
 | 
			
		||||
         if (p_i1582_1_ != null)
 | 
			
		||||
         {
 | 
			
		||||
             this.dimension = p_i1582_1_.provider.dimensionId;
 | 
			
		||||
+            // Spigot start
 | 
			
		||||
+            this.defaultActivationState = org.spigotmc.ActivationRange.initializeEntityActivationState(this, p_i1582_1_.getSpigotConfig()); // Cauldron
 | 
			
		||||
         }
 | 
			
		||||
+        else
 | 
			
		||||
+        {
 | 
			
		||||
+            this.defaultActivationState = false;
 | 
			
		||||
+        }
 | 
			
		||||
 
 | 
			
		||||
+        // Spigot end
 | 
			
		||||
         this.dataWatcher = new DataWatcher(this);
 | 
			
		||||
         this.dataWatcher.addObject(0, Byte.valueOf((byte)0));
 | 
			
		||||
         this.dataWatcher.addObject(1, Short.valueOf((short)300));
 | 
			
		||||
@@ -277,6 +333,41 @@
 | 
			
		||||
 
 | 
			
		||||
     protected void setRotation(float p_70101_1_, float p_70101_2_)
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0
 | 
			
		||||
+        if (Float.isNaN(p_70101_1_))
 | 
			
		||||
+        {
 | 
			
		||||
+            p_70101_1_ = 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if ((p_70101_1_ == Float.POSITIVE_INFINITY) || (p_70101_1_ == Float.NEGATIVE_INFINITY))
 | 
			
		||||
+        {
 | 
			
		||||
+            if (this instanceof EntityPlayerMP)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.worldObj.getServer().getLogger().warning(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid yaw");
 | 
			
		||||
+                ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope");
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            p_70101_1_ = 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // pitch was sometimes set to NaN, so we need to set it back to 0.
 | 
			
		||||
+        if (Float.isNaN(p_70101_2_))
 | 
			
		||||
+        {
 | 
			
		||||
+            p_70101_2_ = 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if ((p_70101_2_ == Float.POSITIVE_INFINITY) || (p_70101_2_ == Float.NEGATIVE_INFINITY))
 | 
			
		||||
+        {
 | 
			
		||||
+            if (this instanceof EntityPlayerMP)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.worldObj.getServer().getLogger().warning(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid pitch");
 | 
			
		||||
+                ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope");
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            p_70101_2_ = 0;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         this.rotationYaw = p_70101_1_ % 360.0F;
 | 
			
		||||
         this.rotationPitch = p_70101_2_ % 360.0F;
 | 
			
		||||
     }
 | 
			
		||||
@@ -343,7 +434,7 @@
 | 
			
		||||
 
 | 
			
		||||
             if (this.inPortal)
 | 
			
		||||
             {
 | 
			
		||||
-                if (minecraftserver.getAllowNether())
 | 
			
		||||
+                if (true || minecraftserver.getAllowNether())   // CraftBukkit
 | 
			
		||||
                 {
 | 
			
		||||
                     if (this.ridingEntity == null && this.portalCounter++ >= i)
 | 
			
		||||
                     {
 | 
			
		||||
@@ -457,7 +548,35 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (!this.isImmuneToFire)
 | 
			
		||||
         {
 | 
			
		||||
-            this.attackEntityFrom(DamageSource.lava, 4.0F);
 | 
			
		||||
+            // CraftBukkit start - Fallen in lava TODO: this event spams!
 | 
			
		||||
+            this.attackEntityFrom(DamageSource.lava, 4);
 | 
			
		||||
+
 | 
			
		||||
+            if (this instanceof EntityLivingBase)
 | 
			
		||||
+            {
 | 
			
		||||
+                if (this.fire <= 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    // not on fire yet
 | 
			
		||||
+                    // TODO: shouldn't be sending null for the block.
 | 
			
		||||
+                    org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k);
 | 
			
		||||
+                    org.bukkit.entity.Entity damagee = this.getBukkitEntity();
 | 
			
		||||
+                    EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15);
 | 
			
		||||
+                    this.worldObj.getServer().getPluginManager().callEvent(combustEvent);
 | 
			
		||||
+
 | 
			
		||||
+                    if (!combustEvent.isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.setFire(combustEvent.getDuration());
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    // This will be called every single tick the entity is in lava, so don't throw an event
 | 
			
		||||
+                    this.setFire(15);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls
 | 
			
		||||
             this.setFire(15);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
@@ -492,6 +611,30 @@
 | 
			
		||||
 
 | 
			
		||||
     public void moveEntity(double p_70091_1_, double p_70091_3_, double p_70091_5_)
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start - Don't do anything if we aren't moving
 | 
			
		||||
+        // We need to do this regardless of whether or not we are moving thanks to portals
 | 
			
		||||
+        try
 | 
			
		||||
+        {
 | 
			
		||||
+            this.func_145775_I();
 | 
			
		||||
+        }
 | 
			
		||||
+        catch (Throwable throwable)
 | 
			
		||||
+        {
 | 
			
		||||
+            CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Checking entity block collision");
 | 
			
		||||
+            CrashReportCategory crashreportcategory = crashreport.makeCategory("Entity being checked for collision");
 | 
			
		||||
+            this.addEntityCrashInfo(crashreportcategory);
 | 
			
		||||
+            throw new ReportedException(crashreport);
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // Check if we're moving
 | 
			
		||||
+        if (p_70091_1_ == 0 && p_70091_3_ == 0 && p_70091_5_ == 0 && this.ridingEntity == null && this.riddenByEntity == null)
 | 
			
		||||
+        {
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+        if (!CauldronHooks.checkEntitySpeed(this, p_70091_1_, p_70091_3_, p_70091_5_)) return; // Check for entities violating the speed limit
 | 
			
		||||
+        org.bukkit.craftbukkit.SpigotTimings.entityMoveTimer.startTiming(); // Spigot
 | 
			
		||||
+
 | 
			
		||||
         if (this.noClip)
 | 
			
		||||
         {
 | 
			
		||||
             this.boundingBox.offset(p_70091_1_, p_70091_3_, p_70091_5_);
 | 
			
		||||
@@ -756,6 +899,35 @@
 | 
			
		||||
             d10 = this.posY - d4;
 | 
			
		||||
             d11 = this.posZ - d5;
 | 
			
		||||
 
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if ((this.isCollidedHorizontally) && (this.getBukkitEntity() instanceof Vehicle))
 | 
			
		||||
+            {
 | 
			
		||||
+                Vehicle vehicle = (Vehicle) this.getBukkitEntity();
 | 
			
		||||
+                org.bukkit.block.Block block = this.worldObj.getWorld().getBlockAt(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - (double) this.yOffset), MathHelper.floor_double(this.posZ));
 | 
			
		||||
+
 | 
			
		||||
+                if (d6 > p_70091_1_)
 | 
			
		||||
+                {
 | 
			
		||||
+                    block = block.getRelative(BlockFace.EAST);
 | 
			
		||||
+                }
 | 
			
		||||
+                else if (d6 < p_70091_1_)
 | 
			
		||||
+                {
 | 
			
		||||
+                    block = block.getRelative(BlockFace.WEST);
 | 
			
		||||
+                }
 | 
			
		||||
+                else if (d8 > p_70091_5_)
 | 
			
		||||
+                {
 | 
			
		||||
+                    block = block.getRelative(BlockFace.SOUTH);
 | 
			
		||||
+                }
 | 
			
		||||
+                else if (d8 < p_70091_5_)
 | 
			
		||||
+                {
 | 
			
		||||
+                    block = block.getRelative(BlockFace.NORTH);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, block);
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
             if (this.canTriggerWalking() && !flag && this.ridingEntity == null)
 | 
			
		||||
             {
 | 
			
		||||
                 int j1 = MathHelper.floor_double(this.posX);
 | 
			
		||||
@@ -798,6 +970,8 @@
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
+            // CraftBukkit start - Move to the top of the method
 | 
			
		||||
+            /*
 | 
			
		||||
             try
 | 
			
		||||
             {
 | 
			
		||||
                 this.func_145775_I();
 | 
			
		||||
@@ -809,7 +983,8 @@
 | 
			
		||||
                 this.addEntityCrashInfo(crashreportcategory);
 | 
			
		||||
                 throw new ReportedException(crashreport);
 | 
			
		||||
             }
 | 
			
		||||
-
 | 
			
		||||
+            */
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             boolean flag2 = this.isWet();
 | 
			
		||||
 
 | 
			
		||||
             if (this.worldObj.func_147470_e(this.boundingBox.contract(0.001D, 0.001D, 0.001D)))
 | 
			
		||||
@@ -820,8 +995,20 @@
 | 
			
		||||
                 {
 | 
			
		||||
                     ++this.fire;
 | 
			
		||||
 
 | 
			
		||||
-                    if (this.fire == 0)
 | 
			
		||||
+                    // CraftBukkit start - Not on fire yet
 | 
			
		||||
+                    if (this.fire <= 0)   // Only throw events on the first combust, otherwise it spams
 | 
			
		||||
                     {
 | 
			
		||||
+                        EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8);
 | 
			
		||||
+                        this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                        if (!event.isCancelled())
 | 
			
		||||
+                        {
 | 
			
		||||
+                            this.setFire(event.getDuration());
 | 
			
		||||
+                        }
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                         this.setFire(8);
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
@@ -839,6 +1026,8 @@
 | 
			
		||||
 
 | 
			
		||||
             this.worldObj.theProfiler.endSection();
 | 
			
		||||
         }
 | 
			
		||||
+
 | 
			
		||||
+        org.bukkit.craftbukkit.SpigotTimings.entityMoveTimer.stopTiming(); // Spigot
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     protected String getSwimSound()
 | 
			
		||||
@@ -867,7 +1056,11 @@
 | 
			
		||||
 
 | 
			
		||||
                         try
 | 
			
		||||
                         {
 | 
			
		||||
+                            // Cauldron start - damage hook for custom blocks
 | 
			
		||||
+                            CraftEventFactory.blockDamage = this.worldObj.getWorld().getBlockAt(k1, l1, i2);
 | 
			
		||||
                             block.onEntityCollidedWithBlock(this.worldObj, k1, l1, i2, this);
 | 
			
		||||
+                            CraftEventFactory.blockDamage = null;
 | 
			
		||||
+                            // Cauldron end
 | 
			
		||||
                         }
 | 
			
		||||
                         catch (Throwable throwable)
 | 
			
		||||
                         {
 | 
			
		||||
@@ -928,6 +1121,7 @@
 | 
			
		||||
         return null;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start - vanilla compatibility
 | 
			
		||||
     protected void dealFireDamage(int p_70081_1_)
 | 
			
		||||
     {
 | 
			
		||||
         if (!this.isImmuneToFire)
 | 
			
		||||
@@ -935,7 +1129,16 @@
 | 
			
		||||
             this.attackEntityFrom(DamageSource.inFire, (float)p_70081_1_);
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
 
 | 
			
		||||
+    protected void dealFireDamage(float par1) // CraftBukkit signature change
 | 
			
		||||
+    {
 | 
			
		||||
+        if (!this.isImmuneToFire)
 | 
			
		||||
+        {
 | 
			
		||||
+            this.attackEntityFrom(DamageSource.inFire, (float)par1);
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     public final boolean isImmuneToFire()
 | 
			
		||||
     {
 | 
			
		||||
         return this.isImmuneToFire;
 | 
			
		||||
@@ -1184,6 +1387,8 @@
 | 
			
		||||
 
 | 
			
		||||
     public void onCollideWithPlayer(EntityPlayer p_70100_1_) {}
 | 
			
		||||
 
 | 
			
		||||
+    int numCollisions = 0; // Spigot
 | 
			
		||||
+
 | 
			
		||||
     public void applyEntityCollision(Entity p_70108_1_)
 | 
			
		||||
     {
 | 
			
		||||
         if (p_70108_1_.riddenByEntity != this && p_70108_1_.ridingEntity != this)
 | 
			
		||||
@@ -1310,6 +1515,20 @@
 | 
			
		||||
         {
 | 
			
		||||
             p_70109_1_.setTag("Pos", this.newDoubleNBTList(new double[] {this.posX, this.posY + (double)this.ySize, this.posZ}));
 | 
			
		||||
             p_70109_1_.setTag("Motion", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ}));
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero
 | 
			
		||||
+            // TODO: make sure this is the best way to address this.
 | 
			
		||||
+            if (Float.isNaN(this.rotationYaw))
 | 
			
		||||
+            {
 | 
			
		||||
+                this.rotationYaw = 0;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            if (Float.isNaN(this.rotationPitch))
 | 
			
		||||
+            {
 | 
			
		||||
+                this.rotationPitch = 0;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             p_70109_1_.setTag("Rotation", this.newFloatNBTList(new float[] {this.rotationYaw, this.rotationPitch}));
 | 
			
		||||
             p_70109_1_.setFloat("FallDistance", this.fallDistance);
 | 
			
		||||
             p_70109_1_.setShort("Fire", (short)this.fire);
 | 
			
		||||
@@ -1320,6 +1539,12 @@
 | 
			
		||||
             p_70109_1_.setInteger("PortalCooldown", this.timeUntilPortal);
 | 
			
		||||
             p_70109_1_.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits());
 | 
			
		||||
             p_70109_1_.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits());
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            p_70109_1_.setLong("WorldUUIDLeast", this.worldObj.getSaveHandler().getUUID().getLeastSignificantBits());
 | 
			
		||||
+            p_70109_1_.setLong("WorldUUIDMost", this.worldObj.getSaveHandler().getUUID().getMostSignificantBits());
 | 
			
		||||
+            p_70109_1_.setInteger("Bukkit.updateLevel", CURRENT_LEVEL);
 | 
			
		||||
+            p_70109_1_.setInteger("Spigot.ticksLived", this.ticksExisted);
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             if (customEntityData != null)
 | 
			
		||||
             {
 | 
			
		||||
                 p_70109_1_.setTag("ForgeData", customEntityData);
 | 
			
		||||
@@ -1370,7 +1595,7 @@
 | 
			
		||||
             this.motionX = nbttaglist1.func_150309_d(0);
 | 
			
		||||
             this.motionY = nbttaglist1.func_150309_d(1);
 | 
			
		||||
             this.motionZ = nbttaglist1.func_150309_d(2);
 | 
			
		||||
-
 | 
			
		||||
+            /* CraftBukkit start - Moved section down
 | 
			
		||||
             if (Math.abs(this.motionX) > 10.0D)
 | 
			
		||||
             {
 | 
			
		||||
                 this.motionX = 0.0D;
 | 
			
		||||
@@ -1385,7 +1610,7 @@
 | 
			
		||||
             {
 | 
			
		||||
                 this.motionZ = 0.0D;
 | 
			
		||||
             }
 | 
			
		||||
-
 | 
			
		||||
+            // CraftBukkit end */
 | 
			
		||||
             this.prevPosX = this.lastTickPosX = this.posX = nbttaglist.func_150309_d(0);
 | 
			
		||||
             this.prevPosY = this.lastTickPosY = this.posY = nbttaglist.func_150309_d(1);
 | 
			
		||||
             this.prevPosZ = this.lastTickPosZ = this.posZ = nbttaglist.func_150309_d(2);
 | 
			
		||||
@@ -1436,6 +1661,76 @@
 | 
			
		||||
             {
 | 
			
		||||
                 this.setPosition(this.posX, this.posY, this.posZ);
 | 
			
		||||
             }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (this instanceof EntityLivingBase)
 | 
			
		||||
+            {
 | 
			
		||||
+                EntityLivingBase entity = (EntityLivingBase) this;
 | 
			
		||||
+                this.ticksExisted = p_70020_1_.getInteger("Spigot.ticksLived");
 | 
			
		||||
+
 | 
			
		||||
+                // Reset the persistence for tamed animals
 | 
			
		||||
+                if (entity instanceof EntityTameable && !isLevelAtLeast(p_70020_1_, 2) && !p_70020_1_.getBoolean("PersistenceRequired"))
 | 
			
		||||
+                {
 | 
			
		||||
+                    EntityLiving entityliving = (EntityLiving) entity;
 | 
			
		||||
+                    entityliving.persistenceRequired = !entityliving.canDespawn();
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit start - Exempt Vehicles from notch's sanity check
 | 
			
		||||
+            if (!(this.getBukkitEntity() instanceof Vehicle))
 | 
			
		||||
+            {
 | 
			
		||||
+                if (Math.abs(this.motionX) > 10.0D)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.motionX = 0.0D;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (Math.abs(this.motionY) > 10.0D)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.motionY = 0.0D;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (Math.abs(this.motionZ) > 10.0D)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.motionZ = 0.0D;
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit start - Reset world
 | 
			
		||||
+            if (this instanceof EntityPlayerMP)
 | 
			
		||||
+            {
 | 
			
		||||
+                Server server = Bukkit.getServer();
 | 
			
		||||
+                org.bukkit.World bworld = null;
 | 
			
		||||
+                // TODO: Remove World related checks, replaced with WorldUID.
 | 
			
		||||
+                String worldName = p_70020_1_.getString("World");
 | 
			
		||||
+
 | 
			
		||||
+                if (p_70020_1_.hasKey("WorldUUIDMost") && p_70020_1_.hasKey("WorldUUIDLeast"))
 | 
			
		||||
+                {
 | 
			
		||||
+                    UUID uid = new UUID(p_70020_1_.getLong("WorldUUIDMost"), p_70020_1_.getLong("WorldUUIDLeast"));
 | 
			
		||||
+                    bworld = server.getWorld(uid);
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    bworld = server.getWorld(worldName);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (bworld == null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    EntityPlayerMP entityPlayer = (EntityPlayerMP) this;
 | 
			
		||||
+                    // Cauldron start - use CraftBukkit's fallback world code if no valid world is found.
 | 
			
		||||
+                    entityPlayer.setWorld(MinecraftServer.getServer().worldServerForDimension(entityPlayer.dimension));
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.setWorld(((CraftWorld) bworld).getHandle());
 | 
			
		||||
+                    // Cauldron end
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
         catch (Throwable throwable)
 | 
			
		||||
         {
 | 
			
		||||
@@ -1653,6 +1948,31 @@
 | 
			
		||||
 
 | 
			
		||||
     public void mountEntity(Entity p_70078_1_)
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        this.setPassengerOf(p_70078_1_);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    protected CraftEntity bukkitEntity;
 | 
			
		||||
+
 | 
			
		||||
+    public CraftEntity getBukkitEntity()
 | 
			
		||||
+    {
 | 
			
		||||
+        if (this.bukkitEntity == null)
 | 
			
		||||
+        {
 | 
			
		||||
+            this.bukkitEntity = CraftEntity.getEntity(this.worldObj.getServer(), this);
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        return this.bukkitEntity;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public void setPassengerOf(Entity p_70078_1_)
 | 
			
		||||
+    {
 | 
			
		||||
+        // mountEntity(null) doesn't really fly for overloaded methods,
 | 
			
		||||
+        // so this method is needed
 | 
			
		||||
+        Entity originalVehicle = this.ridingEntity;
 | 
			
		||||
+        Entity originalPassenger = this.ridingEntity == null ? null : this.ridingEntity.riddenByEntity;
 | 
			
		||||
+        PluginManager pluginManager = Bukkit.getPluginManager();
 | 
			
		||||
+        this.getBukkitEntity(); // make sure bukkitEntity is initialised
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         this.entityRiderPitchDelta = 0.0D;
 | 
			
		||||
         this.entityRiderYawDelta = 0.0D;
 | 
			
		||||
 
 | 
			
		||||
@@ -1660,6 +1980,20 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (this.ridingEntity != null)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if ((this.bukkitEntity instanceof LivingEntity) && (this.ridingEntity.getBukkitEntity() instanceof Vehicle))
 | 
			
		||||
+                {
 | 
			
		||||
+                    VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.ridingEntity.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
 | 
			
		||||
+                    pluginManager.callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                    if (event.isCancelled() || this.ridingEntity != originalVehicle)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+                pluginManager.callEvent(new org.spigotmc.event.entity.EntityDismountEvent(this.getBukkitEntity(), this.ridingEntity.getBukkitEntity()));     // Spigot
 | 
			
		||||
                 this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);
 | 
			
		||||
                 this.ridingEntity.riddenByEntity = null;
 | 
			
		||||
             }
 | 
			
		||||
@@ -1668,22 +2002,61 @@
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
-            if (this.ridingEntity != null)
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if ((this.bukkitEntity instanceof LivingEntity) && (p_70078_1_.getBukkitEntity() instanceof Vehicle) && p_70078_1_.worldObj.chunkExists((int) p_70078_1_.posX >> 4, (int) p_70078_1_.posZ >> 4))
 | 
			
		||||
             {
 | 
			
		||||
-                this.ridingEntity.riddenByEntity = null;
 | 
			
		||||
-            }
 | 
			
		||||
+                // It's possible to move from one vehicle to another.  We need to check if they're already in a vehicle, and fire an exit event if they are.
 | 
			
		||||
+                VehicleExitEvent exitEvent = null;
 | 
			
		||||
 
 | 
			
		||||
-            if (p_70078_1_ != null)
 | 
			
		||||
-            {
 | 
			
		||||
-                for (Entity entity1 = p_70078_1_.ridingEntity; entity1 != null; entity1 = entity1.ridingEntity)
 | 
			
		||||
+                if (this.ridingEntity != null && this.ridingEntity.getBukkitEntity() instanceof Vehicle)
 | 
			
		||||
                 {
 | 
			
		||||
-                    if (entity1 == this)
 | 
			
		||||
+                    exitEvent = new VehicleExitEvent((Vehicle) this.ridingEntity.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
 | 
			
		||||
+                    pluginManager.callEvent(exitEvent);
 | 
			
		||||
+
 | 
			
		||||
+                    if (exitEvent.isCancelled() || this.ridingEntity != originalVehicle || (this.ridingEntity != null && this.ridingEntity.riddenByEntity != originalPassenger))
 | 
			
		||||
                     {
 | 
			
		||||
                         return;
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
+
 | 
			
		||||
+                VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) p_70078_1_.getBukkitEntity(), this.bukkitEntity);
 | 
			
		||||
+                pluginManager.callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                // If a plugin messes with the vehicle or the vehicle's passenger
 | 
			
		||||
+                if (event.isCancelled() || this.ridingEntity != originalVehicle || (this.ridingEntity != null && this.ridingEntity.riddenByEntity != originalPassenger))
 | 
			
		||||
+                {
 | 
			
		||||
+                    // If we only cancelled the enterevent then we need to put the player in a decent position.
 | 
			
		||||
+                    if (exitEvent != null && this.ridingEntity == originalVehicle && this.ridingEntity != null && this.ridingEntity.riddenByEntity == originalPassenger)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double) this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);
 | 
			
		||||
+                        this.ridingEntity.riddenByEntity = null;
 | 
			
		||||
+                        this.ridingEntity = null;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+            // Spigot Start
 | 
			
		||||
+            if (p_70078_1_.worldObj.chunkExists((int) p_70078_1_.posX >> 4, (int) p_70078_1_.posZ >> 4))
 | 
			
		||||
+            {
 | 
			
		||||
+                org.spigotmc.event.entity.EntityMountEvent event = new org.spigotmc.event.entity.EntityMountEvent(this.getBukkitEntity(), p_70078_1_.getBukkitEntity());
 | 
			
		||||
+                pluginManager.callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // Spigot End
 | 
			
		||||
+
 | 
			
		||||
+            if (this.ridingEntity != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.ridingEntity.riddenByEntity = null;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
             this.ridingEntity = p_70078_1_;
 | 
			
		||||
             p_70078_1_.riddenByEntity = this;
 | 
			
		||||
         }
 | 
			
		||||
@@ -1860,12 +2233,59 @@
 | 
			
		||||
 
 | 
			
		||||
     public void onStruckByLightning(EntityLightningBolt p_70077_1_)
 | 
			
		||||
     {
 | 
			
		||||
-        this.dealFireDamage(5);
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity();
 | 
			
		||||
+        if (thisBukkitEntity == null) return; // Cauldron - skip mod entities with no wrapper (TODO: create a wrapper)
 | 
			
		||||
+        if (p_70077_1_ == null) return; // Cauldron - skip null entities, see #392
 | 
			
		||||
+        final org.bukkit.entity.Entity stormBukkitEntity = p_70077_1_.getBukkitEntity();
 | 
			
		||||
+        if (stormBukkitEntity == null) return; // Cauldron - skip mod entities with no wrapper (TODO: create a wrapper)
 | 
			
		||||
+        final PluginManager pluginManager = Bukkit.getPluginManager();
 | 
			
		||||
+
 | 
			
		||||
+        if (thisBukkitEntity instanceof Hanging)
 | 
			
		||||
+        {
 | 
			
		||||
+            HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity);
 | 
			
		||||
+            PaintingBreakByEntityEvent paintingEvent = null;
 | 
			
		||||
+
 | 
			
		||||
+            if (thisBukkitEntity instanceof Painting) {
 | 
			
		||||
+                paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            pluginManager.callEvent(hangingEvent);
 | 
			
		||||
+
 | 
			
		||||
+            if (paintingEvent != null) {
 | 
			
		||||
+                paintingEvent.setCancelled(hangingEvent.isCancelled());
 | 
			
		||||
+                pluginManager.callEvent(paintingEvent);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        if (this.isImmuneToFire) {
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+        CraftEventFactory.entityDamage = p_70077_1_;
 | 
			
		||||
+        if (!this.attackEntityFrom(DamageSource.inFire, 5.0F)) {
 | 
			
		||||
+            CraftEventFactory.entityDamage = null;
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         ++this.fire;
 | 
			
		||||
 
 | 
			
		||||
         if (this.fire == 0)
 | 
			
		||||
         {
 | 
			
		||||
-            this.setFire(8);
 | 
			
		||||
+            // CraftBukkit start - Call a combust event when lightning strikes
 | 
			
		||||
+            EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8);
 | 
			
		||||
+            pluginManager.callEvent(entityCombustEvent);
 | 
			
		||||
+
 | 
			
		||||
+            if (!entityCombustEvent.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.setFire(entityCombustEvent.getDuration());
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -2038,36 +2458,62 @@
 | 
			
		||||
         {
 | 
			
		||||
             this.worldObj.theProfiler.startSection("changeDimension");
 | 
			
		||||
             MinecraftServer minecraftserver = MinecraftServer.getServer();
 | 
			
		||||
-            int j = this.dimension;
 | 
			
		||||
-            WorldServer worldserver = minecraftserver.worldServerForDimension(j);
 | 
			
		||||
-            WorldServer worldserver1 = minecraftserver.worldServerForDimension(p_71027_1_);
 | 
			
		||||
-            this.dimension = p_71027_1_;
 | 
			
		||||
+            // CraftBukkit start - Move logic into new function "teleportToLocation"
 | 
			
		||||
+            // int j = this.dimension;
 | 
			
		||||
+            // Cauldron start - Allow Forge hotloading on teleport
 | 
			
		||||
+            WorldServer exitWorld = minecraftserver.worldServerForDimension(p_71027_1_);
 | 
			
		||||
 
 | 
			
		||||
-            if (j == 1 && p_71027_1_ == 1)
 | 
			
		||||
+            Location enter = this.getBukkitEntity().getLocation();
 | 
			
		||||
+            Location exit = exitWorld != null ? minecraftserver.getConfigurationManager().calculateTarget(enter, minecraftserver.worldServerForDimension(p_71027_1_)) : null;
 | 
			
		||||
+            boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END
 | 
			
		||||
+            // Cauldron start - check if teleporter is instance of TravelAgent before attempting to cast to it
 | 
			
		||||
+            Teleporter teleporter = exit != null ? ((CraftWorld) exit.getWorld()).getHandle().getDefaultTeleporter() : null;
 | 
			
		||||
+            TravelAgent agent = (teleporter != null && teleporter instanceof TravelAgent) ? (TravelAgent)teleporter : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT;  // return arbitrary TA to compensate for implementation dependent plugins
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
+            EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent);
 | 
			
		||||
+            event.useTravelAgent(useTravelAgent);
 | 
			
		||||
+            event.getEntity().getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+            if (event.isCancelled() || event.getTo() == null || !this.isEntityAlive())
 | 
			
		||||
             {
 | 
			
		||||
-                worldserver1 = minecraftserver.worldServerForDimension(0);
 | 
			
		||||
-                this.dimension = 0;
 | 
			
		||||
+                return;
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
+            exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo();
 | 
			
		||||
+            this.teleportTo(exit, true);
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public void teleportTo(Location exit, boolean portal)
 | 
			
		||||
+    {
 | 
			
		||||
+        if (true)
 | 
			
		||||
+        {
 | 
			
		||||
+            WorldServer worldserver = ((CraftWorld) this.getBukkitEntity().getLocation().getWorld()).getHandle();
 | 
			
		||||
+            WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle();
 | 
			
		||||
+            int i = worldserver1.dimension;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+            this.dimension = i;
 | 
			
		||||
             this.worldObj.removeEntity(this);
 | 
			
		||||
             this.isDead = false;
 | 
			
		||||
             this.worldObj.theProfiler.startSection("reposition");
 | 
			
		||||
-            minecraftserver.getConfigurationManager().transferEntityToWorld(this, j, worldserver, worldserver1);
 | 
			
		||||
+            // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create
 | 
			
		||||
+            // minecraftserver.getPlayerList().a(this, j, worldserver, worldserver1);
 | 
			
		||||
+            boolean before = worldserver1.theChunkProviderServer.loadChunkOnProvideRequest;  // Cauldron start - load chunks on provide request
 | 
			
		||||
+            worldserver1.theChunkProviderServer.loadChunkOnProvideRequest = true;
 | 
			
		||||
+            worldserver1.func_73046_m().getConfigurationManager().repositionEntity(this, exit, portal);
 | 
			
		||||
+            worldserver1.theChunkProviderServer.loadChunkOnProvideRequest = before; // Cauldron end
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.worldObj.theProfiler.endStartSection("reloading");
 | 
			
		||||
             Entity entity = EntityList.createEntityByName(EntityList.getEntityString(this), worldserver1);
 | 
			
		||||
 
 | 
			
		||||
             if (entity != null)
 | 
			
		||||
             {
 | 
			
		||||
                 entity.copyDataFrom(this, true);
 | 
			
		||||
-
 | 
			
		||||
-                if (j == 1 && p_71027_1_ == 1)
 | 
			
		||||
-                {
 | 
			
		||||
-                    ChunkCoordinates chunkcoordinates = worldserver1.getSpawnPoint();
 | 
			
		||||
-                    chunkcoordinates.posY = this.worldObj.getTopSolidOrLiquidBlock(chunkcoordinates.posX, chunkcoordinates.posZ);
 | 
			
		||||
-                    entity.setLocationAndAngles((double)chunkcoordinates.posX, (double)chunkcoordinates.posY, (double)chunkcoordinates.posZ, entity.rotationYaw, entity.rotationPitch);
 | 
			
		||||
-                }
 | 
			
		||||
-
 | 
			
		||||
                 worldserver1.spawnEntityInWorld(entity);
 | 
			
		||||
+                // CraftBukkit start - Forward the CraftEntity to the new entity
 | 
			
		||||
+                this.getBukkitEntity().setHandle(entity);
 | 
			
		||||
+                entity.bukkitEntity = this.getBukkitEntity();
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
             this.isDead = true;
 | 
			
		||||
@@ -2077,7 +2523,6 @@
 | 
			
		||||
             this.worldObj.theProfiler.endSection();
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
-
 | 
			
		||||
     public float func_145772_a(Explosion p_145772_1_, World p_145772_2_, int p_145772_3_, int p_145772_4_, int p_145772_5_, Block p_145772_6_)
 | 
			
		||||
     {
 | 
			
		||||
         return p_145772_6_.getExplosionResistance(this, p_145772_2_, p_145772_3_, p_145772_4_, p_145772_5_, posX, posY + getEyeHeight(), posZ);
 | 
			
		||||
							
								
								
									
										80
									
								
								patches/net/minecraft/entity/EntityAgeable.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								patches/net/minecraft/entity/EntityAgeable.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityAgeable.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityAgeable.java
 | 
			
		||||
@@ -10,6 +10,36 @@
 | 
			
		||||
 {
 | 
			
		||||
     private float field_98056_d = -1.0F;
 | 
			
		||||
     private float field_98057_e;
 | 
			
		||||
+    public boolean ageLocked = false; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
+    // Spigot start
 | 
			
		||||
+    @Override
 | 
			
		||||
+    public void inactiveTick()
 | 
			
		||||
+    {
 | 
			
		||||
+        super.inactiveTick();
 | 
			
		||||
+
 | 
			
		||||
+        if (this.worldObj.isRemote || this.ageLocked)
 | 
			
		||||
+        {
 | 
			
		||||
+            // CraftBukkit
 | 
			
		||||
+            this.setScaleForAge(this.isChild());
 | 
			
		||||
+        }
 | 
			
		||||
+        else
 | 
			
		||||
+        {
 | 
			
		||||
+            int i = this.getGrowingAge();
 | 
			
		||||
+
 | 
			
		||||
+            if (i < 0)
 | 
			
		||||
+            {
 | 
			
		||||
+                ++i;
 | 
			
		||||
+                this.setGrowingAge(i);
 | 
			
		||||
+            }
 | 
			
		||||
+            else if (i > 0)
 | 
			
		||||
+            {
 | 
			
		||||
+                --i;
 | 
			
		||||
+                this.setGrowingAge(i);
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    // Spigot end
 | 
			
		||||
     private static final String __OBFID = "CL_00001530";
 | 
			
		||||
 
 | 
			
		||||
     public EntityAgeable(World p_i1578_1_)
 | 
			
		||||
@@ -37,7 +67,7 @@
 | 
			
		||||
                     {
 | 
			
		||||
                         entityageable.setGrowingAge(-24000);
 | 
			
		||||
                         entityageable.setLocationAndAngles(this.posX, this.posY, this.posZ, 0.0F, 0.0F);
 | 
			
		||||
-                        this.worldObj.spawnEntityInWorld(entityageable);
 | 
			
		||||
+                        this.worldObj.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit
 | 
			
		||||
 
 | 
			
		||||
                         if (itemstack.hasDisplayName())
 | 
			
		||||
                         {
 | 
			
		||||
@@ -48,7 +78,7 @@
 | 
			
		||||
                         {
 | 
			
		||||
                             --itemstack.stackSize;
 | 
			
		||||
 
 | 
			
		||||
-                            if (itemstack.stackSize <= 0)
 | 
			
		||||
+                            if (itemstack.stackSize == 0)    // CraftBukkit - allow less than 0 stacks as "infinite"
 | 
			
		||||
                             {
 | 
			
		||||
                                 p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
 | 
			
		||||
                             }
 | 
			
		||||
@@ -99,19 +129,21 @@
 | 
			
		||||
     {
 | 
			
		||||
         super.writeEntityToNBT(p_70014_1_);
 | 
			
		||||
         p_70014_1_.setInteger("Age", this.getGrowingAge());
 | 
			
		||||
+        p_70014_1_.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public void readEntityFromNBT(NBTTagCompound p_70037_1_)
 | 
			
		||||
     {
 | 
			
		||||
         super.readEntityFromNBT(p_70037_1_);
 | 
			
		||||
         this.setGrowingAge(p_70037_1_.getInteger("Age"));
 | 
			
		||||
+        this.ageLocked = p_70037_1_.getBoolean("AgeLocked"); // CraftBukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public void onLivingUpdate()
 | 
			
		||||
     {
 | 
			
		||||
         super.onLivingUpdate();
 | 
			
		||||
 
 | 
			
		||||
-        if (this.worldObj.isRemote)
 | 
			
		||||
+        if (this.worldObj.isRemote || this.ageLocked)   // CraftBukkit
 | 
			
		||||
         {
 | 
			
		||||
             this.setScaleForAge(this.isChild());
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										105
									
								
								patches/net/minecraft/entity/EntityCreature.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								patches/net/minecraft/entity/EntityCreature.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,105 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityCreature.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityCreature.java
 | 
			
		||||
@@ -13,12 +13,18 @@
 | 
			
		||||
 import net.minecraft.util.Vec3;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.entity.CraftEntity;
 | 
			
		||||
+import org.bukkit.event.entity.EntityTargetEvent;
 | 
			
		||||
+import org.bukkit.event.entity.EntityUnleashEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public abstract class EntityCreature extends EntityLiving
 | 
			
		||||
 {
 | 
			
		||||
     public static final UUID field_110179_h = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A");
 | 
			
		||||
     public static final AttributeModifier field_110181_i = (new AttributeModifier(field_110179_h, "Fleeing speed bonus", 2.0D, 2)).setSaved(false);
 | 
			
		||||
-    private PathEntity pathToEntity;
 | 
			
		||||
-    protected Entity entityToAttack;
 | 
			
		||||
+    public PathEntity pathToEntity; // CraftBukkit - private -> public
 | 
			
		||||
+    public Entity entityToAttack; // CraftBukkit - protected -> public
 | 
			
		||||
     protected boolean hasAttacked;
 | 
			
		||||
     protected int fleeingTick;
 | 
			
		||||
     private ChunkCoordinates homePosition = new ChunkCoordinates(0, 0, 0);
 | 
			
		||||
@@ -52,8 +58,29 @@
 | 
			
		||||
 
 | 
			
		||||
         if (this.entityToAttack == null)
 | 
			
		||||
         {
 | 
			
		||||
-            this.entityToAttack = this.findPlayerToAttack();
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            Entity target = this.findPlayerToAttack();
 | 
			
		||||
 
 | 
			
		||||
+            if (target != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.CLOSEST_PLAYER);
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (!event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    if (event.getTarget() == null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.entityToAttack = null;
 | 
			
		||||
+                    }
 | 
			
		||||
+                    else
 | 
			
		||||
+                    {
 | 
			
		||||
+                        this.entityToAttack = ((CraftEntity) event.getTarget()).getHandle();
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
             if (this.entityToAttack != null)
 | 
			
		||||
             {
 | 
			
		||||
                 this.pathToEntity = this.worldObj.getPathEntityToEntity(this, this.entityToAttack, f4, true, false, false, true);
 | 
			
		||||
@@ -70,7 +97,23 @@
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
-            this.entityToAttack = null;
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.TARGET_DIED);
 | 
			
		||||
+            this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+            if (!event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                if (event.getTarget() == null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.entityToAttack = null;
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.entityToAttack = ((CraftEntity) event.getTarget()).getHandle();
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         if (this.entityToAttack instanceof EntityPlayerMP && ((EntityPlayerMP)this.entityToAttack).theItemInWorldManager.isCreative())
 | 
			
		||||
@@ -122,7 +165,8 @@
 | 
			
		||||
                 double d1 = vec3.xCoord - this.posX;
 | 
			
		||||
                 double d2 = vec3.zCoord - this.posZ;
 | 
			
		||||
                 double d3 = vec3.yCoord - (double)i;
 | 
			
		||||
-                float f1 = (float)(Math.atan2(d2, d1) * 180.0D / Math.PI) - 90.0F;
 | 
			
		||||
+                // CraftBukkit - Math -> TrigMath
 | 
			
		||||
+                float f1 = (float)(org.bukkit.craftbukkit.TrigMath.atan2(d2, d1) * 180.0D / Math.PI) - 90.0F;
 | 
			
		||||
                 float f2 = MathHelper.wrapAngleTo180_float(f1 - this.rotationYaw);
 | 
			
		||||
                 this.moveForward = (float)this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue();
 | 
			
		||||
 
 | 
			
		||||
@@ -303,6 +347,7 @@
 | 
			
		||||
             {
 | 
			
		||||
                 if (f > 10.0F)
 | 
			
		||||
                 {
 | 
			
		||||
+                    this.worldObj.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
 | 
			
		||||
                     this.clearLeashed(true, true);
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
@@ -335,6 +380,7 @@
 | 
			
		||||
 
 | 
			
		||||
             if (f > 10.0F)
 | 
			
		||||
             {
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
 | 
			
		||||
                 this.clearLeashed(true, true);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										119
									
								
								patches/net/minecraft/entity/EntityHanging.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								patches/net/minecraft/entity/EntityHanging.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityHanging.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityHanging.java
 | 
			
		||||
@@ -10,6 +10,14 @@
 | 
			
		||||
 import net.minecraft.util.MathHelper;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.item.EntityPainting;
 | 
			
		||||
+import org.bukkit.entity.Hanging;
 | 
			
		||||
+import org.bukkit.entity.Painting;
 | 
			
		||||
+import org.bukkit.event.hanging.HangingBreakEvent;
 | 
			
		||||
+import org.bukkit.event.painting.PaintingBreakEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public abstract class EntityHanging extends Entity
 | 
			
		||||
 {
 | 
			
		||||
     private int tickCounter1;
 | 
			
		||||
@@ -125,6 +133,38 @@
 | 
			
		||||
 
 | 
			
		||||
             if (!this.isDead && !this.onValidSurface())
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                Material material = this.worldObj.getBlock((int) this.posX, (int) this.posY, (int) this.posZ).getMaterial();
 | 
			
		||||
+                HangingBreakEvent.RemoveCause cause;
 | 
			
		||||
+
 | 
			
		||||
+                if (!material.equals(Material.air))
 | 
			
		||||
+                {
 | 
			
		||||
+                    // TODO: This feels insufficient to catch 100% of suffocation cases
 | 
			
		||||
+                    cause = HangingBreakEvent.RemoveCause.OBSTRUCTION;
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    cause = HangingBreakEvent.RemoveCause.PHYSICS;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause);
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+                PaintingBreakEvent paintingEvent = null;
 | 
			
		||||
+
 | 
			
		||||
+                if (this instanceof EntityPainting)
 | 
			
		||||
+                {
 | 
			
		||||
+                    // Fire old painting event until it can be removed
 | 
			
		||||
+                    paintingEvent = new PaintingBreakEvent((Painting) this.getBukkitEntity(), PaintingBreakEvent.RemoveCause.valueOf(cause.name()));
 | 
			
		||||
+                    paintingEvent.setCancelled(event.isCancelled());
 | 
			
		||||
+                    this.worldObj.getServer().getPluginManager().callEvent(paintingEvent);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (isDead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled()))
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 this.setDead();
 | 
			
		||||
                 this.onBroken((Entity)null);
 | 
			
		||||
             }
 | 
			
		||||
@@ -233,6 +273,39 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (!this.isDead && !this.worldObj.isRemote)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT);
 | 
			
		||||
+                PaintingBreakEvent paintingEvent = null;
 | 
			
		||||
+
 | 
			
		||||
+                if (p_70097_1_.getEntity() != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), p_70097_1_.getEntity() == null ? null : p_70097_1_.getEntity().getBukkitEntity());
 | 
			
		||||
+
 | 
			
		||||
+                    if (this instanceof EntityPainting)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        // Fire old painting event until it can be removed
 | 
			
		||||
+                        paintingEvent = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), p_70097_1_.getEntity() == null ? null : p_70097_1_.getEntity().getBukkitEntity());
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+                else if (p_70097_1_.isExplosion())
 | 
			
		||||
+                {
 | 
			
		||||
+                    event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.EXPLOSION);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (paintingEvent != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    paintingEvent.setCancelled(event.isCancelled());
 | 
			
		||||
+                    this.worldObj.getServer().getPluginManager().callEvent(paintingEvent);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (this.isDead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled()))
 | 
			
		||||
+                {
 | 
			
		||||
+                    return true;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 this.setDead();
 | 
			
		||||
                 this.setBeenAttacked();
 | 
			
		||||
                 this.onBroken(p_70097_1_.getEntity());
 | 
			
		||||
@@ -246,6 +319,22 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (!this.worldObj.isRemote && !this.isDead && p_70091_1_ * p_70091_1_ + p_70091_3_ * p_70091_3_ + p_70091_5_ * p_70091_5_ > 0.0D)
 | 
			
		||||
         {
 | 
			
		||||
+            if (this.isDead)
 | 
			
		||||
+            {
 | 
			
		||||
+                return;    // CraftBukkit
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            // TODO - Does this need its own cause? Seems to only be triggered by pistons
 | 
			
		||||
+            HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS);
 | 
			
		||||
+            this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+            if (this.isDead || event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.setDead();
 | 
			
		||||
             this.onBroken((Entity)null);
 | 
			
		||||
         }
 | 
			
		||||
							
								
								
									
										74
									
								
								patches/net/minecraft/entity/EntityLeashKnot.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								patches/net/minecraft/entity/EntityLeashKnot.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityLeashKnot.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityLeashKnot.java
 | 
			
		||||
@@ -11,6 +11,12 @@
 | 
			
		||||
 import net.minecraft.util.AxisAlignedBB;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+ // CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
+import net.minecraft.network.play.server.S1BPacketEntityAttach;
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class EntityLeashKnot extends EntityHanging
 | 
			
		||||
 {
 | 
			
		||||
     private static final String __OBFID = "CL_00001548";
 | 
			
		||||
@@ -84,6 +90,14 @@
 | 
			
		||||
 
 | 
			
		||||
                     if (entityliving.getLeashed() && entityliving.getLeashedToEntity() == p_130002_1_)
 | 
			
		||||
                     {
 | 
			
		||||
+                        // CraftBukkit start
 | 
			
		||||
+                        if (CraftEventFactory.callPlayerLeashEntityEvent(entityliving, this, p_130002_1_).isCancelled())
 | 
			
		||||
+                        {
 | 
			
		||||
+                            ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, entityliving, entityliving.getLeashedToEntity()));
 | 
			
		||||
+                            continue;
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                         entityliving.setLeashedToEntity(this, true);
 | 
			
		||||
                         flag = true;
 | 
			
		||||
                     }
 | 
			
		||||
@@ -93,9 +107,12 @@
 | 
			
		||||
 
 | 
			
		||||
         if (!this.worldObj.isRemote && !flag)
 | 
			
		||||
         {
 | 
			
		||||
-            this.setDead();
 | 
			
		||||
+            // CraftBukkit start - Move below
 | 
			
		||||
+            //this.setDead();
 | 
			
		||||
+            boolean die = true;
 | 
			
		||||
 
 | 
			
		||||
-            if (p_130002_1_.capabilities.isCreativeMode)
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
+            if (true || p_130002_1_.capabilities.isCreativeMode)   // CraftBukkit - Process for non-creative as well
 | 
			
		||||
             {
 | 
			
		||||
                 d0 = 7.0D;
 | 
			
		||||
                 list = this.worldObj.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(this.posX - d0, this.posY - d0, this.posZ - d0, this.posX + d0, this.posY + d0, this.posZ + d0));
 | 
			
		||||
@@ -110,11 +127,27 @@
 | 
			
		||||
 
 | 
			
		||||
                         if (entityliving.getLeashed() && entityliving.getLeashedToEntity() == this)
 | 
			
		||||
                         {
 | 
			
		||||
-                            entityliving.clearLeashed(true, false);
 | 
			
		||||
+                            // CraftBukkit start
 | 
			
		||||
+                            if (CraftEventFactory.callPlayerUnleashEntityEvent(entityliving, p_130002_1_).isCancelled())
 | 
			
		||||
+                            {
 | 
			
		||||
+                                die = false;
 | 
			
		||||
+                                continue;
 | 
			
		||||
+                            }
 | 
			
		||||
+
 | 
			
		||||
+                            entityliving.clearLeashed(true, !p_130002_1_.capabilities.isCreativeMode); // false -> survival mode boolean
 | 
			
		||||
+                            // CraftBukkit end
 | 
			
		||||
                         }
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (die)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.setDead();
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         return true;
 | 
			
		||||
							
								
								
									
										162
									
								
								patches/net/minecraft/entity/EntityLiving.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								patches/net/minecraft/entity/EntityLiving.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityLiving.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityLiving.java
 | 
			
		||||
@@ -38,6 +38,13 @@
 | 
			
		||||
 import cpw.mods.fml.common.eventhandler.Event.Result;
 | 
			
		||||
 import net.minecraftforge.event.ForgeEventFactory;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.player.EntityPlayerMP;
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+import org.bukkit.event.entity.EntityUnleashEvent;
 | 
			
		||||
+import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public abstract class EntityLiving extends EntityLivingBase
 | 
			
		||||
 {
 | 
			
		||||
     public int livingSoundTime;
 | 
			
		||||
@@ -52,9 +59,9 @@
 | 
			
		||||
     private EntityLivingBase attackTarget;
 | 
			
		||||
     private EntitySenses senses;
 | 
			
		||||
     private ItemStack[] equipment = new ItemStack[5];
 | 
			
		||||
-    protected float[] equipmentDropChances = new float[5];
 | 
			
		||||
-    private boolean canPickUpLoot;
 | 
			
		||||
-    private boolean persistenceRequired;
 | 
			
		||||
+    public float[] equipmentDropChances = new float[5]; // CraftBukkit - protected -> public
 | 
			
		||||
+    public boolean canPickUpLoot; // CraftBukkit - private -> public
 | 
			
		||||
+    public boolean persistenceRequired; // CraftBukkit - private -> public
 | 
			
		||||
     protected float defaultPitch;
 | 
			
		||||
     private Entity currentTarget;
 | 
			
		||||
     protected int numTicksToChaseTarget;
 | 
			
		||||
@@ -311,9 +318,23 @@
 | 
			
		||||
     public void readEntityFromNBT(NBTTagCompound p_70037_1_)
 | 
			
		||||
     {
 | 
			
		||||
         super.readEntityFromNBT(p_70037_1_);
 | 
			
		||||
-        this.setCanPickUpLoot(p_70037_1_.getBoolean("CanPickUpLoot"));
 | 
			
		||||
-        this.persistenceRequired = p_70037_1_.getBoolean("PersistenceRequired");
 | 
			
		||||
+        // CraftBukkit start - If looting or persistence is false only use it if it was set after we started using it
 | 
			
		||||
+        boolean data = p_70037_1_.getBoolean("CanPickUpLoot");
 | 
			
		||||
 
 | 
			
		||||
+        if (isLevelAtLeast(p_70037_1_, 1) || data)
 | 
			
		||||
+        {
 | 
			
		||||
+            this.canPickUpLoot = data;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        data = p_70037_1_.getBoolean("PersistenceRequired");
 | 
			
		||||
+
 | 
			
		||||
+        if (isLevelAtLeast(p_70037_1_, 1) || data)
 | 
			
		||||
+        {
 | 
			
		||||
+            this.persistenceRequired = data;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (p_70037_1_.hasKey("CustomName", 8) && p_70037_1_.getString("CustomName").length() > 0)
 | 
			
		||||
         {
 | 
			
		||||
             this.setCustomNameTag(p_70037_1_.getString("CustomName"));
 | 
			
		||||
@@ -521,15 +542,36 @@
 | 
			
		||||
                     this.entityAge = 0;
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
+            // Cauldron start - Force despawn of entity if a player isn't near
 | 
			
		||||
+            else if (this.worldObj.cauldronConfig.entityDespawnImmediate && this.canDespawn())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.despawn("No Player : Immediate");
 | 
			
		||||
+            }
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start
 | 
			
		||||
+    private void despawn(String reason) {
 | 
			
		||||
+        this.setDead();
 | 
			
		||||
+        net.minecraftforge.cauldron.CauldronHooks.logEntityDespawn(this, reason);
 | 
			
		||||
+    }
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
+
 | 
			
		||||
     protected void updateAITasks()
 | 
			
		||||
     {
 | 
			
		||||
         ++this.entityAge;
 | 
			
		||||
         this.worldObj.theProfiler.startSection("checkDespawn");
 | 
			
		||||
         this.despawnEntity();
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
+
 | 
			
		||||
+        // Spigot Start
 | 
			
		||||
+        if (this.fromMobSpawner)
 | 
			
		||||
+        {
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // Spigot End
 | 
			
		||||
         this.worldObj.theProfiler.startSection("sensing");
 | 
			
		||||
         this.senses.clearSensingCache();
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
@@ -1005,6 +1047,14 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (this.getLeashed() && this.getLeashedToEntity() == p_130002_1_)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (CraftEventFactory.callPlayerUnleashEntityEvent(this, p_130002_1_).isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this, this.getLeashedToEntity()));
 | 
			
		||||
+                return false;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.clearLeashed(true, !p_130002_1_.capabilities.isCreativeMode);
 | 
			
		||||
             return true;
 | 
			
		||||
         }
 | 
			
		||||
@@ -1016,6 +1066,14 @@
 | 
			
		||||
             {
 | 
			
		||||
                 if (!(this instanceof EntityTameable) || !((EntityTameable)this).isTamed())
 | 
			
		||||
                 {
 | 
			
		||||
+                    // CraftBukkit start
 | 
			
		||||
+                    if (CraftEventFactory.callPlayerLeashEntityEvent(this, p_130002_1_, p_130002_1_).isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this, this.getLeashedToEntity()));
 | 
			
		||||
+                        return false;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     this.setLeashedToEntity(p_130002_1_, true);
 | 
			
		||||
                     --itemstack.stackSize;
 | 
			
		||||
                     return true;
 | 
			
		||||
@@ -1023,6 +1081,14 @@
 | 
			
		||||
 
 | 
			
		||||
                 if (((EntityTameable)this).func_152114_e(p_130002_1_))
 | 
			
		||||
                 {
 | 
			
		||||
+                    // CraftBukkit start
 | 
			
		||||
+                    if (CraftEventFactory.callPlayerLeashEntityEvent(this, p_130002_1_, p_130002_1_).isCancelled())
 | 
			
		||||
+                    {
 | 
			
		||||
+                        ((EntityPlayerMP) p_130002_1_).playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this, this.getLeashedToEntity()));
 | 
			
		||||
+                        return false;
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     this.setLeashedToEntity(p_130002_1_, true);
 | 
			
		||||
                     --itemstack.stackSize;
 | 
			
		||||
                     return true;
 | 
			
		||||
@@ -1049,6 +1115,7 @@
 | 
			
		||||
         {
 | 
			
		||||
             if (this.leashedToEntity == null || this.leashedToEntity.isDead)
 | 
			
		||||
             {
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit
 | 
			
		||||
                 this.clearLeashed(true, true);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
@@ -1136,10 +1203,16 @@
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
             {
 | 
			
		||||
+                this.worldObj.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit
 | 
			
		||||
                 this.clearLeashed(false, true);
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         this.field_110170_bx = null;
 | 
			
		||||
     }
 | 
			
		||||
+
 | 
			
		||||
+    public boolean canDespawn_CB()
 | 
			
		||||
+    {
 | 
			
		||||
+        return this.canDespawn();
 | 
			
		||||
+    }
 | 
			
		||||
 }
 | 
			
		||||
							
								
								
									
										657
									
								
								patches/net/minecraft/entity/EntityLivingBase.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										657
									
								
								patches/net/minecraft/entity/EntityLivingBase.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,657 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityLivingBase.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityLivingBase.java
 | 
			
		||||
@@ -50,14 +50,28 @@
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 import net.minecraft.world.WorldServer;
 | 
			
		||||
 import net.minecraftforge.common.ForgeHooks;
 | 
			
		||||
+import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.nbt.NBTTagInt;
 | 
			
		||||
+import net.minecraft.network.play.server.S28PacketEffect;
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+import org.bukkit.event.entity.EntityDamageEvent;
 | 
			
		||||
+import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
 | 
			
		||||
+import org.bukkit.event.entity.EntityRegainHealthEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+import org.bukkit.craftbukkit.SpigotTimings; // Spigot
 | 
			
		||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack; // Cauldron
 | 
			
		||||
+
 | 
			
		||||
+import com.google.common.base.Function;
 | 
			
		||||
+
 | 
			
		||||
 public abstract class EntityLivingBase extends Entity
 | 
			
		||||
 {
 | 
			
		||||
     private static final UUID sprintingSpeedBoostModifierUUID = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D");
 | 
			
		||||
     private static final AttributeModifier sprintingSpeedBoostModifier = (new AttributeModifier(sprintingSpeedBoostModifierUUID, "Sprinting speed boost", 0.30000001192092896D, 2)).setSaved(false);
 | 
			
		||||
     private BaseAttributeMap attributeMap;
 | 
			
		||||
-    private final CombatTracker _combatTracker = new CombatTracker(this);
 | 
			
		||||
-    private final HashMap activePotionsMap = new HashMap();
 | 
			
		||||
+    public CombatTracker _combatTracker = new CombatTracker(this); // CraftBukkit - private -> public, remove final
 | 
			
		||||
+    public final HashMap activePotionsMap = new HashMap(); // CraftBukkit - protected -> public
 | 
			
		||||
     private final ItemStack[] previousEquipment = new ItemStack[5];
 | 
			
		||||
     public boolean isSwingInProgress;
 | 
			
		||||
     public int swingProgressInt;
 | 
			
		||||
@@ -83,7 +97,7 @@
 | 
			
		||||
     public float rotationYawHead;
 | 
			
		||||
     public float prevRotationYawHead;
 | 
			
		||||
     public float jumpMovementFactor = 0.02F;
 | 
			
		||||
-    protected EntityPlayer attackingPlayer;
 | 
			
		||||
+    public EntityPlayer attackingPlayer; // CraftBukkit - protected -> public
 | 
			
		||||
     protected int recentlyHit;
 | 
			
		||||
     protected boolean dead;
 | 
			
		||||
     protected int entityAge;
 | 
			
		||||
@@ -93,7 +107,7 @@
 | 
			
		||||
     protected float field_70763_ax;
 | 
			
		||||
     protected float field_70741_aB;
 | 
			
		||||
     protected int scoreValue;
 | 
			
		||||
-    protected float lastDamage;
 | 
			
		||||
+    public float lastDamage; // CraftBukkit - protected -> public
 | 
			
		||||
     protected boolean isJumping;
 | 
			
		||||
     public float moveStrafing;
 | 
			
		||||
     public float moveForward;
 | 
			
		||||
@@ -104,21 +118,26 @@
 | 
			
		||||
     protected double newPosZ;
 | 
			
		||||
     protected double newRotationYaw;
 | 
			
		||||
     protected double newRotationPitch;
 | 
			
		||||
-    private boolean potionsNeedUpdate = true;
 | 
			
		||||
-    private EntityLivingBase entityLivingToAttack;
 | 
			
		||||
+    public boolean potionsNeedUpdate = true; // CraftBukkit - private -> public
 | 
			
		||||
+    public EntityLivingBase entityLivingToAttack; // CraftBukkit - private -> public
 | 
			
		||||
     private int revengeTimer;
 | 
			
		||||
     private EntityLivingBase lastAttacker;
 | 
			
		||||
     private int lastAttackerTime;
 | 
			
		||||
     private float landMovementFactor;
 | 
			
		||||
     private int jumpTicks;
 | 
			
		||||
     private float field_110151_bq;
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    public int expToDrop;
 | 
			
		||||
+    public int maxAirTicks = 300;
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
     private static final String __OBFID = "CL_00001549";
 | 
			
		||||
 
 | 
			
		||||
     public EntityLivingBase(World p_i1594_1_)
 | 
			
		||||
     {
 | 
			
		||||
         super(p_i1594_1_);
 | 
			
		||||
         this.applyEntityAttributes();
 | 
			
		||||
-        this.setHealth(this.getMaxHealth());
 | 
			
		||||
+        // CraftBukkit - this.setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor
 | 
			
		||||
+        this.dataWatcher.updateObject(6, (float) this.getEntityAttribute(SharedMonsterAttributes.maxHealth).getAttributeValue());
 | 
			
		||||
         this.preventEntitySpawning = true;
 | 
			
		||||
         this.field_70770_ap = (float)(Math.random() + 1.0D) * 0.01F;
 | 
			
		||||
         this.setPosition(this.posX, this.posY, this.posZ);
 | 
			
		||||
@@ -173,7 +192,18 @@
 | 
			
		||||
             }
 | 
			
		||||
             else if (!this.worldObj.isRemote && this.fallDistance > 3.0F)
 | 
			
		||||
             {
 | 
			
		||||
-                this.worldObj.playAuxSFX(2006, i, j, k, MathHelper.ceiling_float_int(this.fallDistance - 3.0F));
 | 
			
		||||
+                // CraftBukkit start - supply player as argument in particles for visibility API to work
 | 
			
		||||
+                if (this instanceof EntityPlayerMP)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.worldObj.playAuxSFXAtEntity((EntityPlayer) this, 2006, i, j, k, MathHelper.ceiling_float_int(this.fallDistance - 3.0F));
 | 
			
		||||
+                    ((EntityPlayerMP) this).playerNetServerHandler.sendPacket(new S28PacketEffect(2006, i, j, k, MathHelper
 | 
			
		||||
+                            .ceiling_float_int(this.fallDistance - 3.0F), false));
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.worldObj.playAuxSFX(2006, i, j, k, MathHelper.ceiling_float_int(this.fallDistance - 3.0F));
 | 
			
		||||
+                }
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
             block.onFallenUpon(this.worldObj, i, j, k, this, this.fallDistance);
 | 
			
		||||
@@ -234,7 +264,12 @@
 | 
			
		||||
         }
 | 
			
		||||
         else
 | 
			
		||||
         {
 | 
			
		||||
-            this.setAir(300);
 | 
			
		||||
+            // CraftBukkit start - Only set if needed to work around a DataWatcher inefficiency
 | 
			
		||||
+            if (this.getAir() != 300)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.setAir(maxAirTicks);
 | 
			
		||||
+            }
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         if (this.isEntityAlive() && this.isWet())
 | 
			
		||||
@@ -299,6 +334,22 @@
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    public int getExpReward()
 | 
			
		||||
+    {
 | 
			
		||||
+        int exp = this.getExperiencePoints(this.attackingPlayer);
 | 
			
		||||
+
 | 
			
		||||
+        if (!this.worldObj.isRemote && (this.recentlyHit > 0 || this.isPlayer()) && this.func_146066_aG())
 | 
			
		||||
+        {
 | 
			
		||||
+            return exp;
 | 
			
		||||
+        }
 | 
			
		||||
+        else
 | 
			
		||||
+        {
 | 
			
		||||
+            return 0;
 | 
			
		||||
+        }
 | 
			
		||||
+    }
 | 
			
		||||
+    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
     public boolean isChild()
 | 
			
		||||
     {
 | 
			
		||||
         return false;
 | 
			
		||||
@@ -308,22 +359,21 @@
 | 
			
		||||
     {
 | 
			
		||||
         ++this.deathTime;
 | 
			
		||||
 
 | 
			
		||||
-        if (this.deathTime == 20)
 | 
			
		||||
+        if (this.deathTime >= 20 && !this.isDead)   // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead)
 | 
			
		||||
         {
 | 
			
		||||
             int i;
 | 
			
		||||
+            // CraftBukkit start - Update getExpReward() above if the removed if() changes!
 | 
			
		||||
+            i = this.expToDrop;
 | 
			
		||||
 
 | 
			
		||||
-            if (!this.worldObj.isRemote && (this.recentlyHit > 0 || this.isPlayer()) && this.func_146066_aG() && this.worldObj.getGameRules().getGameRuleBooleanValue("doMobLoot"))
 | 
			
		||||
+            while (i > 0)
 | 
			
		||||
             {
 | 
			
		||||
-                i = this.getExperiencePoints(this.attackingPlayer);
 | 
			
		||||
-
 | 
			
		||||
-                while (i > 0)
 | 
			
		||||
-                {
 | 
			
		||||
-                    int j = EntityXPOrb.getXPSplit(i);
 | 
			
		||||
-                    i -= j;
 | 
			
		||||
-                    this.worldObj.spawnEntityInWorld(new EntityXPOrb(this.worldObj, this.posX, this.posY, this.posZ, j));
 | 
			
		||||
-                }
 | 
			
		||||
+                int j = EntityXPOrb.getXPSplit(i);
 | 
			
		||||
+                i -= j;
 | 
			
		||||
+                this.worldObj.spawnEntityInWorld(new EntityXPOrb(this.worldObj, this.posX, this.posY, this.posZ, j));
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
+            this.expToDrop = 0;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.setDead();
 | 
			
		||||
 
 | 
			
		||||
             for (i = 0; i < 20; ++i)
 | 
			
		||||
@@ -485,6 +535,22 @@
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        if (p_70037_1_.hasKey("Bukkit.MaxHealth"))
 | 
			
		||||
+        {
 | 
			
		||||
+            NBTBase nbtbase = p_70037_1_.getTag("Bukkit.MaxHealth");
 | 
			
		||||
+
 | 
			
		||||
+            if (nbtbase.getId() == 5)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue((double) ((NBTTagFloat) nbtbase).func_150291_c());
 | 
			
		||||
+            }
 | 
			
		||||
+            else if (nbtbase.getId() == 3)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue((double) ((NBTTagInt) nbtbase).func_150287_d());
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
         if (p_70037_1_.hasKey("HealF", 99))
 | 
			
		||||
         {
 | 
			
		||||
             this.setHealth(p_70037_1_.getFloat("HealF"));
 | 
			
		||||
@@ -614,12 +680,14 @@
 | 
			
		||||
 
 | 
			
		||||
     public boolean isPotionActive(int p_82165_1_)
 | 
			
		||||
     {
 | 
			
		||||
-        return this.activePotionsMap.containsKey(Integer.valueOf(p_82165_1_));
 | 
			
		||||
+        // CraftBukkit - Add size check for efficiency
 | 
			
		||||
+        return this.activePotionsMap.size() != 0 && this.activePotionsMap.containsKey(Integer.valueOf(p_82165_1_));
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public boolean isPotionActive(Potion p_70644_1_)
 | 
			
		||||
     {
 | 
			
		||||
-        return this.activePotionsMap.containsKey(Integer.valueOf(p_70644_1_.id));
 | 
			
		||||
+        // CraftBukkit - Add size check for efficiency
 | 
			
		||||
+        return this.activePotionsMap.size() != 0 && this.activePotionsMap.containsKey(Integer.valueOf(p_70644_1_.id));
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public PotionEffect getActivePotionEffect(Potion p_70660_1_)
 | 
			
		||||
@@ -710,25 +778,66 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // CraftBukkit start - Delegate so we can handle providing a reason for health being regained
 | 
			
		||||
     public void heal(float p_70691_1_)
 | 
			
		||||
     {
 | 
			
		||||
+        heal(p_70691_1_, EntityRegainHealthEvent.RegainReason.CUSTOM);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    public void heal(float p_70691_1_, EntityRegainHealthEvent.RegainReason regainReason)
 | 
			
		||||
+    {
 | 
			
		||||
         p_70691_1_ = net.minecraftforge.event.ForgeEventFactory.onLivingHeal(this, p_70691_1_);
 | 
			
		||||
         if (p_70691_1_ <= 0) return;
 | 
			
		||||
         float f1 = this.getHealth();
 | 
			
		||||
 
 | 
			
		||||
         if (f1 > 0.0F)
 | 
			
		||||
         {
 | 
			
		||||
-            this.setHealth(f1 + p_70691_1_);
 | 
			
		||||
+            EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), p_70691_1_, regainReason);
 | 
			
		||||
+            this.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+            if (!event.isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.setHealth((float) (this.getHealth() + event.getAmount()));
 | 
			
		||||
+            }
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public final float getHealth()
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start - Use unscaled health
 | 
			
		||||
+        if (this instanceof EntityPlayerMP)
 | 
			
		||||
+        {
 | 
			
		||||
+            return (float) ((EntityPlayerMP) this).getBukkitEntity().getHealth();
 | 
			
		||||
+        }
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         return this.dataWatcher.getWatchableObjectFloat(6);
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public void setHealth(float p_70606_1_)
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start - Handle scaled health
 | 
			
		||||
+        if (this instanceof EntityPlayerMP)
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayerMP) this).getBukkitEntity();
 | 
			
		||||
+
 | 
			
		||||
+            // Squeeze
 | 
			
		||||
+            if (p_70606_1_ < 0.0F)
 | 
			
		||||
+            {
 | 
			
		||||
+                player.setRealHealth(0.0D);
 | 
			
		||||
+            }
 | 
			
		||||
+            else if (p_70606_1_ > player.getMaxHealth())
 | 
			
		||||
+            {
 | 
			
		||||
+                player.setRealHealth(player.getMaxHealth());
 | 
			
		||||
+            }
 | 
			
		||||
+            else
 | 
			
		||||
+            {
 | 
			
		||||
+                player.setRealHealth(p_70606_1_);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            this.dataWatcher.updateObject(6, Float.valueOf(player.getScaledHealth()));
 | 
			
		||||
+            return;
 | 
			
		||||
+        }
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         this.dataWatcher.updateObject(6, Float.valueOf(MathHelper.clamp_float(p_70606_1_, 0.0F, this.getMaxHealth())));
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -757,7 +866,8 @@
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
             {
 | 
			
		||||
-                if ((p_70097_1_ == DamageSource.anvil || p_70097_1_ == DamageSource.fallingBlock) && this.getEquipmentInSlot(4) != null)
 | 
			
		||||
+                // CraftBukkit - Moved into damageEntity_CB(DamageSource, float)
 | 
			
		||||
+                if (false && (p_70097_1_ == DamageSource.anvil || p_70097_1_ == DamageSource.fallingBlock) && this.getEquipmentInSlot(4) != null)
 | 
			
		||||
                 {
 | 
			
		||||
                     this.getEquipmentInSlot(4).damageItem((int)(p_70097_2_ * 4.0F + this.rand.nextFloat() * p_70097_2_ * 2.0F), this);
 | 
			
		||||
                     p_70097_2_ *= 0.75F;
 | 
			
		||||
@@ -773,16 +883,27 @@
 | 
			
		||||
                         return false;
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
-                    this.damageEntity(p_70097_1_, p_70097_2_ - this.lastDamage);
 | 
			
		||||
+                    // CraftBukkit start
 | 
			
		||||
+                    if (!this.damageEntity_CB(p_70097_1_, p_70097_2_ - this.lastDamage))
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return false;
 | 
			
		||||
+                    }
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     this.lastDamage = p_70097_2_;
 | 
			
		||||
                     flag = false;
 | 
			
		||||
                 }
 | 
			
		||||
                 else
 | 
			
		||||
                 {
 | 
			
		||||
+                    // CraftBukkit start
 | 
			
		||||
+                    float previousHealth = this.getHealth();
 | 
			
		||||
+                    if (!this.damageEntity_CB(p_70097_1_, p_70097_2_))
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return false;
 | 
			
		||||
+                    }
 | 
			
		||||
                     this.lastDamage = p_70097_2_;
 | 
			
		||||
-                    this.prevHealth = this.getHealth();
 | 
			
		||||
+                    this.prevHealth = previousHealth;
 | 
			
		||||
                     this.hurtResistantTime = this.maxHurtResistantTime;
 | 
			
		||||
-                    this.damageEntity(p_70097_1_, p_70097_2_);
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
                     this.hurtTime = this.maxHurtTime = 10;
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
@@ -938,6 +1059,22 @@
 | 
			
		||||
 
 | 
			
		||||
             if (!ForgeHooks.onLivingDrops(this, p_70645_1_, capturedDrops, i, recentlyHit > 0, j))
 | 
			
		||||
             {
 | 
			
		||||
+                // Cauldron start - capture drops for plugins then fire event
 | 
			
		||||
+                if (this.capturedDrops.size() > 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    java.util.List<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>();
 | 
			
		||||
+                    for (EntityItem item : capturedDrops)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        loot.add(CraftItemStack.asCraftMirror(item.getEntityItem()));
 | 
			
		||||
+                    }
 | 
			
		||||
+                    CraftEventFactory.callEntityDeathEvent(this, loot);
 | 
			
		||||
+                }
 | 
			
		||||
+                else
 | 
			
		||||
+                {
 | 
			
		||||
+                    CraftEventFactory.callEntityDeathEvent(this);
 | 
			
		||||
+                }
 | 
			
		||||
+                // Cauldron end
 | 
			
		||||
+
 | 
			
		||||
                 for (EntityItem item : capturedDrops)
 | 
			
		||||
                 {
 | 
			
		||||
                     worldObj.spawnEntityInWorld(item);
 | 
			
		||||
@@ -1010,8 +1147,17 @@
 | 
			
		||||
 
 | 
			
		||||
         if (i > 0)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (!this.attackEntityFrom(DamageSource.fall, (float) i))
 | 
			
		||||
+            {
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
+        if (i > 0)
 | 
			
		||||
+        {
 | 
			
		||||
             this.playSound(this.func_146067_o(i), 1.0F, 1.0F);
 | 
			
		||||
-            this.attackEntityFrom(DamageSource.fall, (float)i);
 | 
			
		||||
+            // this.attackEntityFrom(DamageSource.fall, (float)i); // CraftBukkit - moved up
 | 
			
		||||
             int j = MathHelper.floor_double(this.posX);
 | 
			
		||||
             int k = MathHelper.floor_double(this.posY - 0.20000000298023224D - (double)this.yOffset);
 | 
			
		||||
             int l = MathHelper.floor_double(this.posZ);
 | 
			
		||||
@@ -1065,7 +1211,7 @@
 | 
			
		||||
         {
 | 
			
		||||
             int i = 25 - this.getTotalArmorValue();
 | 
			
		||||
             float f1 = p_70655_2_ * (float)i;
 | 
			
		||||
-            this.damageArmor(p_70655_2_);
 | 
			
		||||
+            // this.damageArmor(p_70655_2_); // CraftBukkit - Moved into damageEntity_CB(DamageSource, float)
 | 
			
		||||
             p_70655_2_ = f1 / 25.0F;
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
@@ -1089,7 +1235,8 @@
 | 
			
		||||
             int j;
 | 
			
		||||
             float f1;
 | 
			
		||||
 
 | 
			
		||||
-            if (this.isPotionActive(Potion.resistance) && p_70672_1_ != DamageSource.outOfWorld)
 | 
			
		||||
+            // CraftBukkit - Moved to damageEntity_CB(DamageSource, float)
 | 
			
		||||
+            if (false && this.isPotionActive(Potion.resistance) && p_70672_1_ != DamageSource.outOfWorld)
 | 
			
		||||
             {
 | 
			
		||||
                 i = (this.getActivePotionEffect(Potion.resistance).getAmplifier() + 1) * 5;
 | 
			
		||||
                 j = 25 - i;
 | 
			
		||||
@@ -1122,26 +1269,156 @@
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    // Cauldron start - vanilla compatibility
 | 
			
		||||
     protected void damageEntity(DamageSource p_70665_1_, float p_70665_2_)
 | 
			
		||||
     {
 | 
			
		||||
+        this.damageEntity_CB(p_70665_1_, p_70665_2_);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    // Cauldron end
 | 
			
		||||
+
 | 
			
		||||
+    // CraftBukkit start
 | 
			
		||||
+    protected boolean damageEntity_CB(final DamageSource damagesource, float f)
 | 
			
		||||
+    { // void -> boolean, add final
 | 
			
		||||
         if (!this.isEntityInvulnerable())
 | 
			
		||||
         {
 | 
			
		||||
-            p_70665_2_ = ForgeHooks.onLivingHurt(this, p_70665_1_, p_70665_2_);
 | 
			
		||||
-            if (p_70665_2_ <= 0) return;
 | 
			
		||||
-            p_70665_2_ = this.applyArmorCalculations(p_70665_1_, p_70665_2_);
 | 
			
		||||
-            p_70665_2_ = this.applyPotionDamageCalculations(p_70665_1_, p_70665_2_);
 | 
			
		||||
-            float f1 = p_70665_2_;
 | 
			
		||||
-            p_70665_2_ = Math.max(p_70665_2_ - this.getAbsorptionAmount(), 0.0F);
 | 
			
		||||
-            this.setAbsorptionAmount(this.getAbsorptionAmount() - (f1 - p_70665_2_));
 | 
			
		||||
+            final boolean human = this instanceof EntityPlayer;
 | 
			
		||||
+            float originalDamage = f;
 | 
			
		||||
+            // Cauldron start - apply forge damage hook
 | 
			
		||||
+            f = ForgeHooks.onLivingHurt(this, damagesource, f);
 | 
			
		||||
+            if (f <= 0) return false;
 | 
			
		||||
+            // Cauldron end
 | 
			
		||||
+            Function<Double, Double> hardHat = new Function<Double, Double>() {
 | 
			
		||||
+                @Override
 | 
			
		||||
+                public Double apply(Double f)
 | 
			
		||||
+                {
 | 
			
		||||
+                    if ((damagesource == DamageSource.anvil || damagesource == DamageSource.fallingBlock)
 | 
			
		||||
+                            && EntityLivingBase.this.getEquipmentInSlot(4) != null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return -(f - (f * 0.75F));
 | 
			
		||||
+                    }
 | 
			
		||||
+                    return -0.0;
 | 
			
		||||
+                }
 | 
			
		||||
+            };
 | 
			
		||||
 
 | 
			
		||||
-            if (p_70665_2_ != 0.0F)
 | 
			
		||||
+            float hardHatModifier = hardHat.apply((double) f).floatValue();
 | 
			
		||||
+            f += hardHatModifier;
 | 
			
		||||
+
 | 
			
		||||
+            Function<Double, Double> blocking = new Function<Double, Double>() {
 | 
			
		||||
+                @Override
 | 
			
		||||
+                public Double apply(Double f)
 | 
			
		||||
+                {
 | 
			
		||||
+                    if (human)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        if (!damagesource.isUnblockable() && ((EntityPlayer) EntityLivingBase.this).isBlocking() && f > 0.0F)
 | 
			
		||||
+                        {
 | 
			
		||||
+                            return -(f - ((1.0F + f) * 0.5F));
 | 
			
		||||
+                        }
 | 
			
		||||
+                    }
 | 
			
		||||
+                    return -0.0;
 | 
			
		||||
+                }
 | 
			
		||||
+            };
 | 
			
		||||
+            float blockingModifier = blocking.apply((double) f).floatValue();
 | 
			
		||||
+            f += blockingModifier;
 | 
			
		||||
+
 | 
			
		||||
+            Function<Double, Double> armor = new Function<Double, Double>() {
 | 
			
		||||
+                @Override
 | 
			
		||||
+                public Double apply(Double f)
 | 
			
		||||
+                {
 | 
			
		||||
+                    // Cauldron start - apply forge armor hook
 | 
			
		||||
+                    if (human)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return -(f - ArmorProperties.ApplyArmor(EntityLivingBase.this, ((EntityPlayer) EntityLivingBase.this).inventory.armorInventory,
 | 
			
		||||
+                                damagesource, f.floatValue()));
 | 
			
		||||
+                    }
 | 
			
		||||
+                    // Cauldron end
 | 
			
		||||
+                    return -(f - EntityLivingBase.this.applyArmorCalculations(damagesource, f.floatValue()));
 | 
			
		||||
+                }
 | 
			
		||||
+            };
 | 
			
		||||
+            float armorModifier = armor.apply((double) f).floatValue();
 | 
			
		||||
+            f += armorModifier;
 | 
			
		||||
+
 | 
			
		||||
+            Function<Double, Double> resistance = new Function<Double, Double>() {
 | 
			
		||||
+                @Override
 | 
			
		||||
+                public Double apply(Double f)
 | 
			
		||||
+                {
 | 
			
		||||
+                    if (!damagesource.isDamageAbsolute() && EntityLivingBase.this.isPotionActive(Potion.resistance) && damagesource != DamageSource.outOfWorld)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        int i = (EntityLivingBase.this.getActivePotionEffect(Potion.resistance).getAmplifier() + 1) * 5;
 | 
			
		||||
+                        int j = 25 - i;
 | 
			
		||||
+                        float f1 = f.floatValue() * (float) j;
 | 
			
		||||
+                        return -(f - (f1 / 25.0F));
 | 
			
		||||
+                    }
 | 
			
		||||
+                    return -0.0;
 | 
			
		||||
+                }
 | 
			
		||||
+            };
 | 
			
		||||
+            float resistanceModifier = resistance.apply((double) f).floatValue();
 | 
			
		||||
+            f += resistanceModifier;
 | 
			
		||||
+
 | 
			
		||||
+            Function<Double, Double> magic = new Function<Double, Double>() {
 | 
			
		||||
+                @Override
 | 
			
		||||
+                public Double apply(Double f)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return -(f - EntityLivingBase.this.applyPotionDamageCalculations(damagesource, f.floatValue()));
 | 
			
		||||
+                }
 | 
			
		||||
+            };
 | 
			
		||||
+            float magicModifier = magic.apply((double) f).floatValue();
 | 
			
		||||
+            f += magicModifier;
 | 
			
		||||
+
 | 
			
		||||
+            Function<Double, Double> absorption = new Function<Double, Double>() {
 | 
			
		||||
+                @Override
 | 
			
		||||
+                public Double apply(Double f)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return -(Math.max(f - Math.max(f - EntityLivingBase.this.getAbsorptionAmount(), 0.0F), 0.0F));
 | 
			
		||||
+                }
 | 
			
		||||
+            };
 | 
			
		||||
+            float absorptionModifier = absorption.apply((double) f).floatValue();
 | 
			
		||||
+
 | 
			
		||||
+            EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, hardHatModifier, blockingModifier,
 | 
			
		||||
+                    armorModifier, resistanceModifier, magicModifier, absorptionModifier, hardHat, blocking, armor, resistance, magic, absorption);
 | 
			
		||||
+            if (event.isCancelled())
 | 
			
		||||
             {
 | 
			
		||||
+                return false;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            f = (float) event.getFinalDamage();
 | 
			
		||||
+
 | 
			
		||||
+            // Apply damage to helmet
 | 
			
		||||
+            if ((damagesource == DamageSource.anvil || damagesource == DamageSource.fallingBlock) && this.getEquipmentInSlot(4) != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.getEquipmentInSlot(4).damageItem((int) (event.getDamage() * 4.0F + this.rand.nextFloat() * event.getDamage() * 2.0F), this);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // Apply damage to armor
 | 
			
		||||
+            if (!damagesource.isUnblockable())
 | 
			
		||||
+            {
 | 
			
		||||
+                float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT));
 | 
			
		||||
+                this.damageArmor(armorDamage);
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION);
 | 
			
		||||
+            this.setAbsorptionAmount(Math.max(this.getAbsorptionAmount() - absorptionModifier, 0.0F));
 | 
			
		||||
+            if (f != 0.0F)
 | 
			
		||||
+            {
 | 
			
		||||
+                if (human)
 | 
			
		||||
+                {
 | 
			
		||||
+                    ((EntityPlayer) this).addExhaustion(damagesource.getHungerDamage());
 | 
			
		||||
+                }
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 float f2 = this.getHealth();
 | 
			
		||||
-                this.setHealth(f2 - p_70665_2_);
 | 
			
		||||
-                this.func_110142_aN().func_94547_a(p_70665_1_, f2, p_70665_2_);
 | 
			
		||||
-                this.setAbsorptionAmount(this.getAbsorptionAmount() - p_70665_2_);
 | 
			
		||||
+                this.setHealth(f2 - f);
 | 
			
		||||
+                this.func_110142_aN().func_94547_a(damagesource, f2, f);
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (human)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return true;
 | 
			
		||||
+                }
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+                this.setAbsorptionAmount(this.getAbsorptionAmount() - f);
 | 
			
		||||
             }
 | 
			
		||||
+            return true; // CraftBukkit
 | 
			
		||||
         }
 | 
			
		||||
+        return false; // CraftBukkit
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     public CombatTracker func_110142_aN()
 | 
			
		||||
@@ -1558,6 +1835,7 @@
 | 
			
		||||
     public void onUpdate()
 | 
			
		||||
     {
 | 
			
		||||
         if (ForgeHooks.onLivingUpdate(this)) return;
 | 
			
		||||
+        SpigotTimings.timerEntityBaseTick.startTiming(); // Spigot
 | 
			
		||||
         super.onUpdate();
 | 
			
		||||
 
 | 
			
		||||
         if (!this.worldObj.isRemote)
 | 
			
		||||
@@ -1608,7 +1886,9 @@
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        SpigotTimings.timerEntityBaseTick.stopTiming(); // Spigot
 | 
			
		||||
         this.onLivingUpdate();
 | 
			
		||||
+        SpigotTimings.timerEntityTickRest.startTiming(); // Spigot
 | 
			
		||||
         double d0 = this.posX - this.prevPosX;
 | 
			
		||||
         double d1 = this.posZ - this.prevPosZ;
 | 
			
		||||
         float f = (float)(d0 * d0 + d1 * d1);
 | 
			
		||||
@@ -1621,7 +1901,8 @@
 | 
			
		||||
         {
 | 
			
		||||
             f3 = 1.0F;
 | 
			
		||||
             f2 = (float)Math.sqrt((double)f) * 3.0F;
 | 
			
		||||
-            f1 = (float)Math.atan2(d1, d0) * 180.0F / (float)Math.PI - 90.0F;
 | 
			
		||||
+            // CraftBukkit - Math -> TrigMath
 | 
			
		||||
+            f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / (float)Math.PI - 90.0F;
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         if (this.swingProgress > 0.0F)
 | 
			
		||||
@@ -1682,6 +1963,7 @@
 | 
			
		||||
 
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
         this.field_70764_aw += f2;
 | 
			
		||||
+        SpigotTimings.timerEntityTickRest.stopTiming(); // Spigot
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     protected float func_110146_f(float p_110146_1_, float p_110146_2_)
 | 
			
		||||
@@ -1757,6 +2039,7 @@
 | 
			
		||||
             this.motionZ = 0.0D;
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        SpigotTimings.timerEntityAI.startTiming(); // Spigot
 | 
			
		||||
         this.worldObj.theProfiler.startSection("ai");
 | 
			
		||||
 
 | 
			
		||||
         if (this.isMovementBlocked())
 | 
			
		||||
@@ -1783,6 +2066,7 @@
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
+        SpigotTimings.timerEntityAI.stopTiming(); // Spigot
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
         this.worldObj.theProfiler.startSection("jump");
 | 
			
		||||
 
 | 
			
		||||
@@ -1811,13 +2095,17 @@
 | 
			
		||||
         this.moveStrafing *= 0.98F;
 | 
			
		||||
         this.moveForward *= 0.98F;
 | 
			
		||||
         this.randomYawVelocity *= 0.9F;
 | 
			
		||||
+        SpigotTimings.timerEntityAIMove.startTiming(); // Spigot
 | 
			
		||||
         this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
 | 
			
		||||
+        SpigotTimings.timerEntityAIMove.stopTiming(); // Spigot
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
         this.worldObj.theProfiler.startSection("push");
 | 
			
		||||
 
 | 
			
		||||
         if (!this.worldObj.isRemote)
 | 
			
		||||
         {
 | 
			
		||||
+            SpigotTimings.timerEntityAICollision.startTiming(); // Spigot
 | 
			
		||||
             this.collideWithNearbyEntities();
 | 
			
		||||
+            SpigotTimings.timerEntityAICollision.stopTiming(); // Spigot
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         this.worldObj.theProfiler.endSection();
 | 
			
		||||
@@ -1829,17 +2117,36 @@
 | 
			
		||||
     {
 | 
			
		||||
         List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D));
 | 
			
		||||
 
 | 
			
		||||
-        if (list != null && !list.isEmpty())
 | 
			
		||||
+        if (this.canBeCollidedWith() && list != null && !list.isEmpty()) // Spigot: Add this.canBeCollidedWith() condition
 | 
			
		||||
         {
 | 
			
		||||
+            numCollisions -= worldObj.getSpigotConfig().maxCollisionsPerEntity; // Spigot // Cauldron
 | 
			
		||||
+
 | 
			
		||||
             for (int i = 0; i < list.size(); ++i)
 | 
			
		||||
             {
 | 
			
		||||
-                Entity entity = (Entity)list.get(i);
 | 
			
		||||
+                if (numCollisions > worldObj.getSpigotConfig().maxCollisionsPerEntity) // Cauldron
 | 
			
		||||
+                {
 | 
			
		||||
+                    break; // Spigot
 | 
			
		||||
+                }
 | 
			
		||||
 
 | 
			
		||||
+                Entity entity = (Entity) list.get(i);
 | 
			
		||||
+
 | 
			
		||||
+                // TODO better check now?
 | 
			
		||||
+                // CraftBukkit start - Only handle mob (non-player) collisions
 | 
			
		||||
+                // every other tick
 | 
			
		||||
+                if (entity instanceof EntityLivingBase && !(this instanceof EntityPlayerMP) && this.ticksExisted % 2 == 0)
 | 
			
		||||
+                {
 | 
			
		||||
+                    continue;
 | 
			
		||||
+                }
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                 if (entity.canBePushed())
 | 
			
		||||
                 {
 | 
			
		||||
+                    entity.numCollisions++; // Spigot
 | 
			
		||||
+                    numCollisions++; // Spigot
 | 
			
		||||
                     this.collideWithEntity(entity);
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
+            numCollisions = 0; // Spigot
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityMinecartCommandBlock.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityMinecartCommandBlock.java
 | 
			
		||||
@@ -16,33 +16,9 @@
 | 
			
		||||
 
 | 
			
		||||
 public class EntityMinecartCommandBlock extends EntityMinecart
 | 
			
		||||
 {
 | 
			
		||||
-    private final CommandBlockLogic field_145824_a = new CommandBlockLogic()
 | 
			
		||||
-    {
 | 
			
		||||
-        private static final String __OBFID = "CL_00001673";
 | 
			
		||||
-        public void func_145756_e()
 | 
			
		||||
-        {
 | 
			
		||||
-            EntityMinecartCommandBlock.this.getDataWatcher().updateObject(23, this.func_145753_i());
 | 
			
		||||
-            EntityMinecartCommandBlock.this.getDataWatcher().updateObject(24, IChatComponent.Serializer.func_150696_a(this.func_145749_h()));
 | 
			
		||||
-        }
 | 
			
		||||
-        @SideOnly(Side.CLIENT)
 | 
			
		||||
-        public int func_145751_f()
 | 
			
		||||
-        {
 | 
			
		||||
-            return 1;
 | 
			
		||||
-        }
 | 
			
		||||
-        @SideOnly(Side.CLIENT)
 | 
			
		||||
-        public void func_145757_a(ByteBuf p_145757_1_)
 | 
			
		||||
-        {
 | 
			
		||||
-            p_145757_1_.writeInt(EntityMinecartCommandBlock.this.getEntityId());
 | 
			
		||||
-        }
 | 
			
		||||
-        public ChunkCoordinates getPlayerCoordinates()
 | 
			
		||||
-        {
 | 
			
		||||
-            return new ChunkCoordinates(MathHelper.floor_double(EntityMinecartCommandBlock.this.posX), MathHelper.floor_double(EntityMinecartCommandBlock.this.posY + 0.5D), MathHelper.floor_double(EntityMinecartCommandBlock.this.posZ));
 | 
			
		||||
-        }
 | 
			
		||||
-        public World getEntityWorld()
 | 
			
		||||
-        {
 | 
			
		||||
-            return EntityMinecartCommandBlock.this.worldObj;
 | 
			
		||||
-        }
 | 
			
		||||
-    };
 | 
			
		||||
+    private final EntityMinecartCommandBlockListener field_145824_a_CB= new EntityMinecartCommandBlockListener(this); // CraftBukkit
 | 
			
		||||
+    private final CommandBlockLogic field_145824_a = field_145824_a_CB; // Cauldron
 | 
			
		||||
+
 | 
			
		||||
     private int field_145823_b = 0;
 | 
			
		||||
     private static final String __OBFID = "CL_00001672";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								patches/net/minecraft/entity/EntityTracker.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								patches/net/minecraft/entity/EntityTracker.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityTracker.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityTracker.java
 | 
			
		||||
@@ -38,6 +38,7 @@
 | 
			
		||||
 import net.minecraft.world.chunk.Chunk;
 | 
			
		||||
 import org.apache.logging.log4j.LogManager;
 | 
			
		||||
 import org.apache.logging.log4j.Logger;
 | 
			
		||||
+import net.minecraft.server.MinecraftServer; // Spigot
 | 
			
		||||
 
 | 
			
		||||
 import cpw.mods.fml.common.registry.EntityRegistry;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +47,7 @@
 | 
			
		||||
     private static final Logger logger = LogManager.getLogger();
 | 
			
		||||
     private final WorldServer theWorld;
 | 
			
		||||
     private Set trackedEntities = new HashSet();
 | 
			
		||||
-    private IntHashMap trackedEntityIDs = new IntHashMap();
 | 
			
		||||
+    public IntHashMap trackedEntityIDs = new IntHashMap(); // CraftBukkit - private -> public
 | 
			
		||||
     private int entityViewDistance;
 | 
			
		||||
     private static final String __OBFID = "CL_00001431";
 | 
			
		||||
 
 | 
			
		||||
@@ -184,6 +185,7 @@
 | 
			
		||||
 
 | 
			
		||||
     public void addEntityToTracker(Entity p_72785_1_, int p_72785_2_, final int p_72785_3_, boolean p_72785_4_)
 | 
			
		||||
     {
 | 
			
		||||
+        p_72785_2_ = org.spigotmc.TrackingRange.getEntityTrackingRange(p_72785_1_, p_72785_2_); // Spigot
 | 
			
		||||
         if (p_72785_2_ > this.entityViewDistance)
 | 
			
		||||
         {
 | 
			
		||||
             p_72785_2_ = this.entityViewDistance;
 | 
			
		||||
							
								
								
									
										216
									
								
								patches/net/minecraft/entity/EntityTrackerEntry.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								patches/net/minecraft/entity/EntityTrackerEntry.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,216 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/EntityTrackerEntry.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/EntityTrackerEntry.java
 | 
			
		||||
@@ -56,9 +56,15 @@
 | 
			
		||||
 import net.minecraft.world.storage.MapData;
 | 
			
		||||
 import org.apache.logging.log4j.LogManager;
 | 
			
		||||
 import org.apache.logging.log4j.Logger;
 | 
			
		||||
+import net.minecraft.server.MinecraftServer; // Spigot
 | 
			
		||||
 
 | 
			
		||||
 import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.entity.Player;
 | 
			
		||||
+import org.bukkit.event.player.PlayerVelocityEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class EntityTrackerEntry
 | 
			
		||||
 {
 | 
			
		||||
     private static final Logger logger = LogManager.getLogger();
 | 
			
		||||
@@ -131,15 +137,15 @@
 | 
			
		||||
             this.func_151259_a(new S1BPacketEntityAttach(0, this.myEntity, this.myEntity.ridingEntity));
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
-        if (this.myEntity instanceof EntityItemFrame && this.ticks % 10 == 0)
 | 
			
		||||
+        if (this.myEntity instanceof EntityItemFrame /*&& this.ticks % 10 == 0*/)   // CraftBukkit - Moved below, should always enter this block
 | 
			
		||||
         {
 | 
			
		||||
             EntityItemFrame entityitemframe = (EntityItemFrame)this.myEntity;
 | 
			
		||||
             ItemStack itemstack = entityitemframe.getDisplayedItem();
 | 
			
		||||
 
 | 
			
		||||
-            if (itemstack != null && itemstack.getItem() instanceof ItemMap)
 | 
			
		||||
+            if (this.ticks % 10 == 0 && itemstack != null && itemstack.getItem() instanceof ItemMap)   // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks
 | 
			
		||||
             {
 | 
			
		||||
                 MapData mapdata = Items.filled_map.getMapData(itemstack, this.myEntity.worldObj);
 | 
			
		||||
-                Iterator iterator = p_73122_1_.iterator();
 | 
			
		||||
+                Iterator iterator = this.trackingPlayers.iterator(); // CraftBukkit
 | 
			
		||||
 
 | 
			
		||||
                 while (iterator.hasNext())
 | 
			
		||||
                 {
 | 
			
		||||
@@ -177,6 +183,22 @@
 | 
			
		||||
                 boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.ticks % 60 == 0;
 | 
			
		||||
                 boolean flag1 = Math.abs(l - this.lastYaw) >= 4 || Math.abs(i1 - this.lastPitch) >= 4;
 | 
			
		||||
 
 | 
			
		||||
+                // CraftBukkit start - Code moved from below
 | 
			
		||||
+                if (flag)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.lastScaledXPosition = i;
 | 
			
		||||
+                    this.lastScaledYPosition = j;
 | 
			
		||||
+                    this.lastScaledZPosition = k;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                if (flag1)
 | 
			
		||||
+                {
 | 
			
		||||
+                    this.lastYaw = l;
 | 
			
		||||
+                    this.lastPitch = i1;
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                 if (this.ticks > 0 || this.myEntity instanceof EntityArrow)
 | 
			
		||||
                 {
 | 
			
		||||
                     if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.ticksSinceLastForcedTeleport <= 400 && !this.ridingEntity)
 | 
			
		||||
@@ -197,7 +219,15 @@
 | 
			
		||||
                     else
 | 
			
		||||
                     {
 | 
			
		||||
                         this.ticksSinceLastForcedTeleport = 0;
 | 
			
		||||
-                        object = new S18PacketEntityTeleport(this.myEntity.getEntityId(), i, j, k, (byte)l, (byte)i1);
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit start - Refresh list of who can see a player before sending teleport packet
 | 
			
		||||
+                        if (this.myEntity instanceof EntityPlayerMP)
 | 
			
		||||
+                        {
 | 
			
		||||
+                            this.sendEventsToPlayers(new java.util.ArrayList(this.trackingPlayers));
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
+                        object = new S18PacketEntityTeleport(this.myEntity.getEntityId(), i, j, k, (byte) l, (byte) i1);
 | 
			
		||||
                     }
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
@@ -224,7 +254,7 @@
 | 
			
		||||
                 }
 | 
			
		||||
 
 | 
			
		||||
                 this.sendMetadataToAllAssociatedPlayers();
 | 
			
		||||
-
 | 
			
		||||
+                /* CraftBukkit start - Code moved up
 | 
			
		||||
                 if (flag)
 | 
			
		||||
                 {
 | 
			
		||||
                     this.lastScaledXPosition = i;
 | 
			
		||||
@@ -237,7 +267,7 @@
 | 
			
		||||
                     this.lastYaw = l;
 | 
			
		||||
                     this.lastPitch = i1;
 | 
			
		||||
                 }
 | 
			
		||||
-
 | 
			
		||||
+                // CraftBukkit end */
 | 
			
		||||
                 this.ridingEntity = false;
 | 
			
		||||
             }
 | 
			
		||||
             else
 | 
			
		||||
@@ -275,7 +305,32 @@
 | 
			
		||||
 
 | 
			
		||||
         if (this.myEntity.velocityChanged)
 | 
			
		||||
         {
 | 
			
		||||
-            this.func_151261_b(new S12PacketEntityVelocity(this.myEntity));
 | 
			
		||||
+            // CraftBukkit start - Create PlayerVelocity event
 | 
			
		||||
+            boolean cancelled = false;
 | 
			
		||||
+
 | 
			
		||||
+            if (this.myEntity instanceof EntityPlayerMP)
 | 
			
		||||
+            {
 | 
			
		||||
+                Player player = (Player) this.myEntity.getBukkitEntity();
 | 
			
		||||
+                org.bukkit.util.Vector velocity = player.getVelocity();
 | 
			
		||||
+                PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity);
 | 
			
		||||
+                this.myEntity.worldObj.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
+
 | 
			
		||||
+                if (event.isCancelled())
 | 
			
		||||
+                {
 | 
			
		||||
+                    cancelled = true;
 | 
			
		||||
+                }
 | 
			
		||||
+                else if (!velocity.equals(event.getVelocity()))
 | 
			
		||||
+                {
 | 
			
		||||
+                    player.setVelocity(velocity);
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            if (!cancelled)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.func_151261_b((Packet)(new S12PacketEntityVelocity(this.myEntity)));
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.myEntity.velocityChanged = false;
 | 
			
		||||
         }
 | 
			
		||||
     }
 | 
			
		||||
@@ -296,6 +351,13 @@
 | 
			
		||||
 
 | 
			
		||||
             if (!set.isEmpty())
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start - Send scaled max health
 | 
			
		||||
+                if (this.myEntity instanceof EntityPlayerMP)
 | 
			
		||||
+                {
 | 
			
		||||
+                    ((EntityPlayerMP) this.myEntity).getBukkitEntity().injectScaledMaxHealth(set, false);
 | 
			
		||||
+                }
 | 
			
		||||
+
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
                 this.func_151261_b(new S20PacketEntityProperties(this.myEntity.getEntityId(), set));
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
@@ -353,6 +415,19 @@
 | 
			
		||||
 
 | 
			
		||||
             if (d0 >= (double)(-this.blocksDistanceThreshold) && d0 <= (double)this.blocksDistanceThreshold && d1 >= (double)(-this.blocksDistanceThreshold) && d1 <= (double)this.blocksDistanceThreshold)
 | 
			
		||||
             {
 | 
			
		||||
+                // CraftBukkit start
 | 
			
		||||
+                if (this.myEntity instanceof EntityPlayerMP)
 | 
			
		||||
+                {
 | 
			
		||||
+                    Player player = ((EntityPlayerMP) this.myEntity).getBukkitEntity();
 | 
			
		||||
+
 | 
			
		||||
+                    if (!p_73117_1_.getBukkitEntity().canSee(player))
 | 
			
		||||
+                    {
 | 
			
		||||
+                        return;
 | 
			
		||||
+                    }
 | 
			
		||||
+                }
 | 
			
		||||
+                // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
+                p_73117_1_.destroyedItemsNetCache.remove(Integer.valueOf(this.myEntity.getEntityId()));
 | 
			
		||||
                 if (!this.trackingPlayers.contains(p_73117_1_) && (this.isPlayerWatchingThisChunk(p_73117_1_) || this.myEntity.forceSpawn))
 | 
			
		||||
                 {
 | 
			
		||||
                     this.trackingPlayers.add(p_73117_1_);
 | 
			
		||||
@@ -369,6 +444,13 @@
 | 
			
		||||
                         ServersideAttributeMap serversideattributemap = (ServersideAttributeMap)((EntityLivingBase)this.myEntity).getAttributeMap();
 | 
			
		||||
                         Collection collection = serversideattributemap.getWatchedAttributes();
 | 
			
		||||
 
 | 
			
		||||
+                        // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health
 | 
			
		||||
+                        if (this.myEntity.getEntityId() == p_73117_1_.getEntityId())
 | 
			
		||||
+                        {
 | 
			
		||||
+                            ((EntityPlayerMP) this.myEntity).getBukkitEntity().injectScaledMaxHealth(collection, false);
 | 
			
		||||
+                        }
 | 
			
		||||
+
 | 
			
		||||
+                        // CraftBukkit end
 | 
			
		||||
                         if (!collection.isEmpty())
 | 
			
		||||
                         {
 | 
			
		||||
                             p_73117_1_.playerNetServerHandler.sendPacket(new S20PacketEntityProperties(this.myEntity.getEntityId(), collection));
 | 
			
		||||
@@ -397,6 +479,14 @@
 | 
			
		||||
                         p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(0, this.myEntity, this.myEntity.ridingEntity));
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
+                    // CraftBukkit start
 | 
			
		||||
+                    if (this.myEntity.riddenByEntity != null)
 | 
			
		||||
+                    {
 | 
			
		||||
+                        p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(0, this.myEntity.riddenByEntity, this.myEntity));
 | 
			
		||||
+                    }
 | 
			
		||||
+
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                     if (this.myEntity instanceof EntityLiving && ((EntityLiving)this.myEntity).getLeashedToEntity() != null)
 | 
			
		||||
                     {
 | 
			
		||||
                         p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this.myEntity, ((EntityLiving)this.myEntity).getLeashedToEntity()));
 | 
			
		||||
@@ -425,6 +515,11 @@
 | 
			
		||||
                         }
 | 
			
		||||
                     }
 | 
			
		||||
 
 | 
			
		||||
+                    // CraftBukkit start - Fix for nonsensical head yaw
 | 
			
		||||
+                    this.lastHeadMotion = MathHelper.floor_float(this.myEntity.getRotationYawHead() * 256.0F / 360.0F); // tracker.ao() should be getHeadRotation
 | 
			
		||||
+                    this.func_151259_a(new S19PacketEntityHeadLook(this.myEntity, (byte) lastHeadMotion));
 | 
			
		||||
+                    // CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
                     if (this.myEntity instanceof EntityLivingBase)
 | 
			
		||||
                     {
 | 
			
		||||
                         EntityLivingBase entitylivingbase = (EntityLivingBase)this.myEntity;
 | 
			
		||||
@@ -465,7 +560,10 @@
 | 
			
		||||
     {
 | 
			
		||||
         if (this.myEntity.isDead)
 | 
			
		||||
         {
 | 
			
		||||
-            logger.warn("Fetching addPacket for removed entity");
 | 
			
		||||
+            // CraftBukkit start - Remove useless error spam, just return
 | 
			
		||||
+            // logger.warn("Fetching addPacket for removed entity");
 | 
			
		||||
+            return null;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         Packet pkt = FMLNetworkHandler.getEntitySpawningPacket(this.myEntity);
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIArrowAttack.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIArrowAttack.java
 | 
			
		||||
@@ -5,6 +5,11 @@
 | 
			
		||||
 import net.minecraft.entity.IRangedAttackMob;
 | 
			
		||||
 import net.minecraft.util.MathHelper;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.Entity;
 | 
			
		||||
+import org.bukkit.event.entity.EntityTargetEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class EntityAIArrowAttack extends EntityAIBase
 | 
			
		||||
 {
 | 
			
		||||
     private final EntityLiving entityHost;
 | 
			
		||||
@@ -67,6 +72,10 @@
 | 
			
		||||
 
 | 
			
		||||
     public void resetTask()
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        EntityTargetEvent.TargetReason reason = this.attackTarget.isEntityAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED;
 | 
			
		||||
+        org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent((Entity) rangedAttackEntityHost, null, reason);
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         this.attackTarget = null;
 | 
			
		||||
         this.field_75318_f = 0;
 | 
			
		||||
         this.rangedAttackTime = -1;
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIAttackOnCollide.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIAttackOnCollide.java
 | 
			
		||||
@@ -7,6 +7,11 @@
 | 
			
		||||
 import net.minecraft.util.MathHelper;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import net.minecraft.entity.Entity;
 | 
			
		||||
+import org.bukkit.event.entity.EntityTargetEvent;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class EntityAIAttackOnCollide extends EntityAIBase
 | 
			
		||||
 {
 | 
			
		||||
     World worldObj;
 | 
			
		||||
@@ -73,6 +78,15 @@
 | 
			
		||||
     public boolean continueExecuting()
 | 
			
		||||
     {
 | 
			
		||||
         EntityLivingBase entitylivingbase = this.attacker.getAttackTarget();
 | 
			
		||||
+        // CraftBukkit start
 | 
			
		||||
+        EntityTargetEvent.TargetReason reason = this.attacker.getAttackTarget() == null ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED;
 | 
			
		||||
+
 | 
			
		||||
+        if (this.attacker.getAttackTarget() == null || (this.attacker.getAttackTarget() != null && !this.attacker.getAttackTarget().isEntityAlive()))
 | 
			
		||||
+        {
 | 
			
		||||
+            org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(attacker, null, reason);
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         return entitylivingbase == null ? false : (!entitylivingbase.isEntityAlive() ? false : (!this.longMemory ? !this.attacker.getNavigator().noPath() : this.attacker.isWithinHomeDistance(MathHelper.floor_double(entitylivingbase.posX), MathHelper.floor_double(entitylivingbase.posY), MathHelper.floor_double(entitylivingbase.posZ))));
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								patches/net/minecraft/entity/ai/EntityAIBreakDoor.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								patches/net/minecraft/entity/ai/EntityAIBreakDoor.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIBreakDoor.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIBreakDoor.java
 | 
			
		||||
@@ -58,6 +58,14 @@
 | 
			
		||||
 
 | 
			
		||||
         if (this.breakingTime == 240 && this.theEntity.worldObj.difficultySetting == EnumDifficulty.HARD)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start
 | 
			
		||||
+            if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.theEntity, this.entityPosX, this.entityPosY, this.entityPosZ).isCancelled())
 | 
			
		||||
+            {
 | 
			
		||||
+                this.updateTask();
 | 
			
		||||
+                return;
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.theEntity.worldObj.setBlockToAir(this.entityPosX, this.entityPosY, this.entityPosZ);
 | 
			
		||||
             this.theEntity.worldObj.playAuxSFX(1012, this.entityPosX, this.entityPosY, this.entityPosZ, 0);
 | 
			
		||||
             this.theEntity.worldObj.playAuxSFX(2001, this.entityPosX, this.entityPosY, this.entityPosZ, Block.getIdFromBlock(this.field_151504_e));
 | 
			
		||||
							
								
								
									
										34
									
								
								patches/net/minecraft/entity/ai/EntityAIEatGrass.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								patches/net/minecraft/entity/ai/EntityAIEatGrass.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIEatGrass.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIEatGrass.java
 | 
			
		||||
@@ -6,6 +6,11 @@
 | 
			
		||||
 import net.minecraft.util.MathHelper;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+// CraftBukkit start
 | 
			
		||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
 | 
			
		||||
+import org.bukkit.Material;
 | 
			
		||||
+// CraftBukkit end
 | 
			
		||||
+
 | 
			
		||||
 public class EntityAIEatGrass extends EntityAIBase
 | 
			
		||||
 {
 | 
			
		||||
     private EntityLiving field_151500_b;
 | 
			
		||||
@@ -69,7 +74,8 @@
 | 
			
		||||
 
 | 
			
		||||
             if (this.field_151501_c.getBlock(i, j, k) == Blocks.tallgrass)
 | 
			
		||||
             {
 | 
			
		||||
-                if (this.field_151501_c.getGameRules().getGameRuleBooleanValue("mobGriefing"))
 | 
			
		||||
+                // CraftBukkit
 | 
			
		||||
+                if (!CraftEventFactory.callEntityChangeBlockEvent(this.field_151500_b, this.field_151500_b.worldObj.getWorld().getBlockAt(i, j, k), Material.AIR, !this.field_151501_c.getGameRules().getGameRuleBooleanValue("mobGriefing")).isCancelled())
 | 
			
		||||
                 {
 | 
			
		||||
                     this.field_151501_c.func_147480_a(i, j, k, false);
 | 
			
		||||
                 }
 | 
			
		||||
@@ -78,7 +84,8 @@
 | 
			
		||||
             }
 | 
			
		||||
             else if (this.field_151501_c.getBlock(i, j - 1, k) == Blocks.grass)
 | 
			
		||||
             {
 | 
			
		||||
-                if (this.field_151501_c.getGameRules().getGameRuleBooleanValue("mobGriefing"))
 | 
			
		||||
+                // CraftBukkit
 | 
			
		||||
+                if (!CraftEventFactory.callEntityChangeBlockEvent(this.field_151500_b, this.field_151500_b.worldObj.getWorld().getBlockAt(i, j - 1, k), Material.DIRT, !this.field_151501_c.getGameRules().getGameRuleBooleanValue("mobGriefing")).isCancelled())
 | 
			
		||||
                 {
 | 
			
		||||
                     this.field_151501_c.playAuxSFX(2001, i, j - 1, k, Block.getIdFromBlock(Blocks.grass));
 | 
			
		||||
                     this.field_151501_c.setBlock(i, j - 1, k, Blocks.dirt, 0, 2);
 | 
			
		||||
							
								
								
									
										42
									
								
								patches/net/minecraft/entity/ai/EntityAIMate.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								patches/net/minecraft/entity/ai/EntityAIMate.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIMate.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIMate.java
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
 import java.util.List;
 | 
			
		||||
 import java.util.Random;
 | 
			
		||||
 import net.minecraft.entity.EntityAgeable;
 | 
			
		||||
+import net.minecraft.entity.EntityLiving;
 | 
			
		||||
 import net.minecraft.entity.item.EntityXPOrb;
 | 
			
		||||
 import net.minecraft.entity.passive.EntityAnimal;
 | 
			
		||||
 import net.minecraft.entity.passive.EntityCow;
 | 
			
		||||
@@ -12,6 +13,8 @@
 | 
			
		||||
 import net.minecraft.stats.StatList;
 | 
			
		||||
 import net.minecraft.world.World;
 | 
			
		||||
 
 | 
			
		||||
+import net.minecraft.entity.passive.EntityTameable; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class EntityAIMate extends EntityAIBase
 | 
			
		||||
 {
 | 
			
		||||
     private EntityAnimal theAnimal;
 | 
			
		||||
@@ -93,6 +96,13 @@
 | 
			
		||||
 
 | 
			
		||||
         if (entityageable != null)
 | 
			
		||||
         {
 | 
			
		||||
+            // CraftBukkit start - set persistence for tame animals
 | 
			
		||||
+            if (entityageable instanceof EntityTameable && ((EntityTameable) entityageable).isTamed())
 | 
			
		||||
+            {
 | 
			
		||||
+                ((EntityLiving)entityageable).persistenceRequired = true; // Cauldron - fix illegal access error. SS bug?
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             EntityPlayer entityplayer = this.theAnimal.func_146083_cb();
 | 
			
		||||
 
 | 
			
		||||
             if (entityplayer == null && this.targetMate.func_146083_cb() != null)
 | 
			
		||||
@@ -116,7 +126,7 @@
 | 
			
		||||
             this.targetMate.resetInLove();
 | 
			
		||||
             entityageable.setGrowingAge(-24000);
 | 
			
		||||
             entityageable.setLocationAndAngles(this.theAnimal.posX, this.theAnimal.posY, this.theAnimal.posZ, 0.0F, 0.0F);
 | 
			
		||||
-            this.theWorld.spawnEntityInWorld(entityageable);
 | 
			
		||||
+            this.theWorld.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
 | 
			
		||||
             Random random = this.theAnimal.getRNG();
 | 
			
		||||
 
 | 
			
		||||
             for (int i = 0; i < 7; ++i)
 | 
			
		||||
							
								
								
									
										26
									
								
								patches/net/minecraft/entity/ai/EntityAIPanic.java.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								patches/net/minecraft/entity/ai/EntityAIPanic.java.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIPanic.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIPanic.java
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 import net.minecraft.entity.EntityCreature;
 | 
			
		||||
 import net.minecraft.util.Vec3;
 | 
			
		||||
 
 | 
			
		||||
+import net.minecraft.entity.EntityLivingBase; // CraftBukkit
 | 
			
		||||
+
 | 
			
		||||
 public class EntityAIPanic extends EntityAIBase
 | 
			
		||||
 {
 | 
			
		||||
     private EntityCreature theEntityCreature;
 | 
			
		||||
@@ -50,6 +52,14 @@
 | 
			
		||||
 
 | 
			
		||||
     public boolean continueExecuting()
 | 
			
		||||
     {
 | 
			
		||||
+        // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly
 | 
			
		||||
+        if ((this.theEntityCreature.ticksExisted - this.theEntityCreature.func_142015_aE()) > 100)
 | 
			
		||||
+        {
 | 
			
		||||
+            this.theEntityCreature.setRevengeTarget((EntityLivingBase) null);
 | 
			
		||||
+            return false;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // CraftBukkit end
 | 
			
		||||
         return !this.theEntityCreature.getNavigator().noPath();
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
--- ../src-base/minecraft/net/minecraft/entity/ai/EntityAIRunAroundLikeCrazy.java
 | 
			
		||||
+++ ../src-work/minecraft/net/minecraft/entity/ai/EntityAIRunAroundLikeCrazy.java
 | 
			
		||||
@@ -64,7 +64,8 @@
 | 
			
		||||
                 int i = this.horseHost.getTemper();
 | 
			
		||||
                 int j = this.horseHost.getMaxTemper();
 | 
			
		||||
 
 | 
			
		||||
-                if (j > 0 && this.horseHost.getRNG().nextInt(j) < i)
 | 
			
		||||
+                // CraftBukkit
 | 
			
		||||
+                if (j > 0 && this.horseHost.getRNG().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horseHost, (EntityPlayer) this.horseHost.riddenByEntity).isCancelled() && this.horseHost.riddenByEntity instanceof EntityPlayer)
 | 
			
		||||
                 {
 | 
			
		||||
                     this.horseHost.setTamedBy((EntityPlayer)this.horseHost.riddenByEntity);
 | 
			
		||||
                     this.horseHost.worldObj.setEntityState(this.horseHost, (byte)7);
 | 
			
		||||
@@ -74,8 +75,20 @@
 | 
			
		||||
                 this.horseHost.increaseTemper(5);
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
-            this.horseHost.riddenByEntity.mountEntity((Entity)null);
 | 
			
		||||
-            this.horseHost.riddenByEntity = null;
 | 
			
		||||
+            // CraftBukkit start - Handle dismounting to account for VehicleExitEvent being fired.
 | 
			
		||||
+            if (this.horseHost.riddenByEntity != null)
 | 
			
		||||
+            {
 | 
			
		||||
+                this.horseHost.riddenByEntity.mountEntity((Entity) null);
 | 
			
		||||
+
 | 
			
		||||
+                // If the entity still has a passenger, then a plugin cancelled the event.
 | 
			
		||||
+                if (this.horseHost.riddenByEntity != null)
 | 
			
		||||
+                {
 | 
			
		||||
+                    return;
 | 
			
		||||
+                }
 | 
			
		||||
+            }
 | 
			
		||||
+
 | 
			
		||||
+            // this.entity.passenger = null;
 | 
			
		||||
+            // CraftBukkit end
 | 
			
		||||
             this.horseHost.makeHorseRearWithSound();
 | 
			
		||||
             this.horseHost.worldObj.setEntityState(this.horseHost, (byte)6);
 | 
			
		||||
         }
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user