Merge branch 'master' into gh-pages
Dieser Commit ist enthalten in:
Commit
37a77d2295
@ -3,6 +3,6 @@
|
|||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||||
<classpathentry kind="lib" path="D:/Games/Minecraft/Server Mods/API/bukkit-1.3.1-R2.0.jar"/>
|
<classpathentry kind="lib" path="D:/Games/Minecraft/Server Mods/API/bukkit-1.3.1-R2.0.jar"/>
|
||||||
<classpathentry kind="lib" path="/ProtocolLib/bin/ProtocolLib.jar"/>
|
<classpathentry combineaccessrules="false" kind="src" path="/ProtocolLib"/>
|
||||||
<classpathentry kind="output" path="class"/>
|
<classpathentry kind="output" path="class"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
339
License.txt
Normale Datei
339
License.txt
Normale Datei
@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Lesser General Public License instead.) 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
|
||||||
|
this service 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 make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. 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.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
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
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the 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 a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE 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.
|
||||||
|
|
||||||
|
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
|
||||||
|
convey 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 2 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, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision 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, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This 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.
|
@ -1,14 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<classpath>
|
<classpath>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry including="**/*.java" kind="src" output="target/classes" path="src/main/java"/>
|
||||||
<classpathentry kind="src" output="class_test" path="test"/>
|
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
|
||||||
<classpathentry kind="lib" path="D:/Games/Minecraft/Server Mods/Server/craftbukkit-1.3.1-R2.0.jar"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
||||||
<classpathentry kind="lib" path="lib/cglib-nodep-2.2.3.jar">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="javadoc_location" value="jar:file:/D:/Kristian/Programmer/Binaries/cglib.2.2.3/cglib-docs-2.2.3.jar!/"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/>
|
<attributes>
|
||||||
<classpathentry kind="output" path="class"/>
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
1
ProtocolLib/.gitignore
vendored
Normale Datei
1
ProtocolLib/.gitignore
vendored
Normale Datei
@ -0,0 +1 @@
|
|||||||
|
target/
|
@ -10,8 +10,14 @@
|
|||||||
<arguments>
|
<arguments>
|
||||||
</arguments>
|
</arguments>
|
||||||
</buildCommand>
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
@ -8,4 +8,5 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
|||||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
org.eclipse.jdt.core.compiler.source=1.6
|
org.eclipse.jdt.core.compiler.source=1.6
|
||||||
|
4
ProtocolLib/.settings/org.eclipse.m2e.core.prefs
Normale Datei
4
ProtocolLib/.settings/org.eclipse.m2e.core.prefs
Normale Datei
@ -0,0 +1,4 @@
|
|||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<project default="compile" name="Project ItemDisguise" basedir=".">
|
|
||||||
<!--ANT 1.7 is required -->
|
|
||||||
<target name="compile">
|
|
||||||
<jar destfile="bin/ProtocolLib.jar" filesetmanifest="mergewithoutmain" excludes="test/*">
|
|
||||||
<manifest>
|
|
||||||
<attribute name="Main-Class" value="com.comphenix.itemdisguise.Application"/>
|
|
||||||
<attribute name="Class-Path" value="."/>
|
|
||||||
</manifest>
|
|
||||||
<fileset dir="class"/>
|
|
||||||
<zipfileset excludes="META-INF/*.SF" src="lib/cglib-nodep-2.2.3.jar"/>
|
|
||||||
</jar>
|
|
||||||
</target>
|
|
||||||
</project>
|
|
153
ProtocolLib/dependency-reduced-pom.xml
Normale Datei
153
ProtocolLib/dependency-reduced-pom.xml
Normale Datei
@ -0,0 +1,153 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>oss-parent</artifactId>
|
||||||
|
<groupId>org.sonatype.oss</groupId>
|
||||||
|
<version>7</version>
|
||||||
|
<relativePath>../pom.xml/pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.comphenix.protocol</groupId>
|
||||||
|
<artifactId>ProtocolLib</artifactId>
|
||||||
|
<name>ProtocolLib</name>
|
||||||
|
<version>1.3.1</version>
|
||||||
|
<description>Provides read/write access to the Minecraft protocol.</description>
|
||||||
|
<url>http://dev.bukkit.org/server-mods/protocollib/</url>
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<id>aadnk</id>
|
||||||
|
<name>Kristian S. Stangeland</name>
|
||||||
|
<email>kr_stang@hotmail.com</email>
|
||||||
|
<url>http://comphenix.net/</url>
|
||||||
|
<roles>
|
||||||
|
<role>developer</role>
|
||||||
|
<role>maintainer</role>
|
||||||
|
</roles>
|
||||||
|
<timezone>1</timezone>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>GNU GENERAL PUBLIC LICENSE - Version 2, June 1991</name>
|
||||||
|
<url>http://www.gnu.org/licenses/gpl-2.0.txt</url>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:git://github.com/aadnk/ProtocolLib.git</connection>
|
||||||
|
<developerConnection>scm:git:git@github.com:aadnk/ProtocolLib.git</developerConnection>
|
||||||
|
<url>https://github.com/aadnk/ProtocolLib</url>
|
||||||
|
</scm>
|
||||||
|
<build>
|
||||||
|
<sourceDirectory>src/main/java</sourceDirectory>
|
||||||
|
<testSourceDirectory>src/test/java</testSourceDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/java</directory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>2.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<artifactSet>
|
||||||
|
<excludes>
|
||||||
|
<exclude>org.bukkit:craftbukkit</exclude>
|
||||||
|
<exclude>junit:junit</exclude>
|
||||||
|
</excludes>
|
||||||
|
</artifactSet>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>2.3.2</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.6</source>
|
||||||
|
<target>1.6</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>release-sign-artifacts</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>2.2</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.9</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bukkit</groupId>
|
||||||
|
<artifactId>craftbukkit</artifactId>
|
||||||
|
<version>1.3.2-R1.1-SNAPSHOT</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.10</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>hamcrest-core</artifactId>
|
||||||
|
<groupId>org.hamcrest</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
</project>
|
||||||
|
|
Binäre Datei nicht angezeigt.
173
ProtocolLib/pom.xml
Normale Datei
173
ProtocolLib/pom.xml
Normale Datei
@ -0,0 +1,173 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.comphenix.protocol</groupId>
|
||||||
|
<artifactId>ProtocolLib</artifactId>
|
||||||
|
<version>1.3.1</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<description>Provides read/write access to the Minecraft protocol.</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.sonatype.oss</groupId>
|
||||||
|
<artifactId>oss-parent</artifactId>
|
||||||
|
<version>7</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<sourceDirectory>src/main/java</sourceDirectory>
|
||||||
|
<testSourceDirectory>src/test/java</testSourceDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/java</directory>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>2.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<artifactSet>
|
||||||
|
<excludes>
|
||||||
|
<exclude>org.bukkit:craftbukkit</exclude>
|
||||||
|
<exclude>junit:junit</exclude>
|
||||||
|
</excludes>
|
||||||
|
</artifactSet>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>2.3.2</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.6</source>
|
||||||
|
<target>1.6</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>release-sign-artifacts</id>
|
||||||
|
<activation>
|
||||||
|
<property>
|
||||||
|
<name>performRelease</name>
|
||||||
|
<value>true</value>
|
||||||
|
</property>
|
||||||
|
</activation>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>2.2</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.9</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
<url>http://dev.bukkit.org/server-mods/protocollib/</url>
|
||||||
|
<name>ProtocolLib</name>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:git://github.com/aadnk/ProtocolLib.git</connection>
|
||||||
|
<developerConnection>scm:git:git@github.com:aadnk/ProtocolLib.git</developerConnection>
|
||||||
|
<url>https://github.com/aadnk/ProtocolLib</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>GNU GENERAL PUBLIC LICENSE - Version 2, June 1991</name>
|
||||||
|
<url>http://www.gnu.org/licenses/gpl-2.0.txt</url>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<id>aadnk</id>
|
||||||
|
<name>Kristian S. Stangeland</name>
|
||||||
|
<email>kr_stang@hotmail.com</email>
|
||||||
|
<url>http://comphenix.net/</url>
|
||||||
|
<roles>
|
||||||
|
<role>developer</role>
|
||||||
|
<role>maintainer</role>
|
||||||
|
</roles>
|
||||||
|
<timezone>1</timezone>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cglib</groupId>
|
||||||
|
<artifactId>cglib-nodep</artifactId>
|
||||||
|
<version>2.2.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bukkit</groupId>
|
||||||
|
<artifactId>craftbukkit</artifactId>
|
||||||
|
<version>1.3.2-R1.1-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.10</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -1,35 +0,0 @@
|
|||||||
package com.comphenix.protocol.async;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A runnable representing a asynchronous event listener.
|
|
||||||
*
|
|
||||||
* @author Kristian
|
|
||||||
*/
|
|
||||||
public interface AsyncRunnable extends Runnable {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a unique worker ID.
|
|
||||||
* @return Unique worker ID.
|
|
||||||
*/
|
|
||||||
public int getID();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop the given runnable.
|
|
||||||
* <p>
|
|
||||||
* This may not occur right away.
|
|
||||||
* @return TRUE if the thread was stopped, FALSE if it was already stopped.
|
|
||||||
*/
|
|
||||||
public boolean stop() throws InterruptedException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if we're running or not.
|
|
||||||
* @return TRUE if we're running, FALSE otherwise.
|
|
||||||
*/
|
|
||||||
public boolean isRunning();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if this runnable has already run its course.
|
|
||||||
* @return TRUE if it has been stopped, FALSE otherwise.
|
|
||||||
*/
|
|
||||||
boolean isFinished();
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
package com.comphenix.protocol.async;
|
|
||||||
|
|
||||||
import com.comphenix.protocol.events.PacketEvent;
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import com.google.common.collect.ComparisonChain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides a comparable to a packet event.
|
|
||||||
*
|
|
||||||
* @author Kristian
|
|
||||||
*/
|
|
||||||
class PacketEventHolder implements Comparable<PacketEventHolder> {
|
|
||||||
|
|
||||||
private PacketEvent event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A wrapper that ensures the packet event is ordered by sending index.
|
|
||||||
* @param event - packet event to wrap.
|
|
||||||
*/
|
|
||||||
public PacketEventHolder(PacketEvent event) {
|
|
||||||
this.event = Preconditions.checkNotNull(event, "Event must be non-null");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the stored event.
|
|
||||||
* @return The stored event.
|
|
||||||
*/
|
|
||||||
public PacketEvent getEvent() {
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(PacketEventHolder other) {
|
|
||||||
AsyncMarker marker = other != null ? other.getEvent().getAsyncMarker() : null;
|
|
||||||
|
|
||||||
return ComparisonChain.start().
|
|
||||||
compare(event.getAsyncMarker(), marker).
|
|
||||||
result();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
package com.comphenix.protocol.injector;
|
|
||||||
|
|
||||||
import net.minecraft.server.Packet;
|
|
||||||
|
|
||||||
import com.comphenix.protocol.events.PacketEvent;
|
|
||||||
|
|
||||||
public interface ListenerInvoker {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invokes the given packet event for every registered listener.
|
|
||||||
* @param event - the packet event to invoke.
|
|
||||||
*/
|
|
||||||
public abstract void invokePacketRecieving(PacketEvent event);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invokes the given packet event for every registered listener.
|
|
||||||
* @param event - the packet event to invoke.
|
|
||||||
*/
|
|
||||||
public abstract void invokePacketSending(PacketEvent event);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the associated ID of a packet.
|
|
||||||
* @param packet - the packet.
|
|
||||||
* @return The packet ID.
|
|
||||||
*/
|
|
||||||
public abstract int getPacketID(Packet packet);
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
package com.comphenix.protocol.reflect.compiler;
|
|
||||||
|
|
||||||
import com.comphenix.protocol.reflect.StructureModifier;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to save the result of an compilation.
|
|
||||||
*
|
|
||||||
* @author Kristian
|
|
||||||
* @param <TKey> - type of the structure modifier field.
|
|
||||||
*/
|
|
||||||
public interface CompileListener<TKey> {
|
|
||||||
/**
|
|
||||||
* Invoked when a structure modifier has been successfully compiled.
|
|
||||||
* @param compiledModifier - the compiled structure modifier.
|
|
||||||
*/
|
|
||||||
public void onCompiled(StructureModifier<TKey> compiledModifier);
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
package com.comphenix.protocol.reflect.instances;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a type generator for specific types.
|
|
||||||
*
|
|
||||||
* @author Kristian
|
|
||||||
*/
|
|
||||||
public interface InstanceProvider {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an instance given a type, if possible.
|
|
||||||
* @param type - type to create.
|
|
||||||
* @return The instance, or NULL if the type cannot be created.
|
|
||||||
*/
|
|
||||||
public abstract Object create(@Nullable Class<?> type);
|
|
||||||
}
|
|
@ -17,6 +17,11 @@
|
|||||||
|
|
||||||
package com.comphenix.protocol;
|
package com.comphenix.protocol;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore this class.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
public class Application {
|
public class Application {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// For now, though we might consider making a proper application
|
// For now, though we might consider making a proper application
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol;
|
package com.comphenix.protocol;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -15,7 +32,6 @@ import com.comphenix.protocol.events.PacketListener;
|
|||||||
* @author Kristian
|
* @author Kristian
|
||||||
*/
|
*/
|
||||||
public interface AsynchronousManager {
|
public interface AsynchronousManager {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an asynchronous packet handler.
|
* Registers an asynchronous packet handler.
|
||||||
* <p>
|
* <p>
|
||||||
@ -74,4 +90,13 @@ public interface AsynchronousManager {
|
|||||||
* Remove listeners, close threads and transmit every delayed packet.
|
* Remove listeners, close threads and transmit every delayed packet.
|
||||||
*/
|
*/
|
||||||
public abstract void cleanupAll();
|
public abstract void cleanupAll();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signal that a packet is ready to be transmitted.
|
||||||
|
* <p>
|
||||||
|
* This should only be called if {@link com.comphenix.protocol.async.AsyncMarker#incrementProcessingDelay() AsyncMarker.incrementProcessingDelay()}
|
||||||
|
* has been called previously.
|
||||||
|
* @param packet - packet to signal.
|
||||||
|
*/
|
||||||
|
public abstract void signalPacketTransmission(PacketEvent packet);
|
||||||
}
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol;
|
package com.comphenix.protocol;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
@ -1,5 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol;
|
package com.comphenix.protocol;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.injector.PacketFilterManager;
|
||||||
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
import com.comphenix.protocol.reflect.IntEnum;
|
import com.comphenix.protocol.reflect.IntEnum;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -92,6 +113,25 @@ public final class Packets {
|
|||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the given packet is a valid server packet in the current version of Minecraft.
|
||||||
|
* @param packetID - the packet to test.
|
||||||
|
* @return TRUE if this packet is supported, FALSE otherwise.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the server packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static boolean isSupported(int packetID) throws FieldAccessException {
|
||||||
|
return PacketFilterManager.getServerPackets().contains(packetID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve every client packet the current version of Minecraft is aware of.
|
||||||
|
* @return Every supported server packet.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the server packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static Set<Integer> getSupported() throws FieldAccessException {
|
||||||
|
return PacketFilterManager.getServerPackets();
|
||||||
|
}
|
||||||
|
|
||||||
// We only allow a single instance of this class
|
// We only allow a single instance of this class
|
||||||
private Server() {
|
private Server() {
|
||||||
super();
|
super();
|
||||||
@ -146,6 +186,25 @@ public final class Packets {
|
|||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the given packet is a valid client packet in the current version of Minecraft.
|
||||||
|
* @param packetID - the packet to test.
|
||||||
|
* @return TRUE if this packet is supported, FALSE otherwise.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the client packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static boolean isSupported(int packetID) throws FieldAccessException {
|
||||||
|
return PacketFilterManager.getClientPackets().contains(packetID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve every client packet the current version of Minecraft is aware of.
|
||||||
|
* @return Every supported client packet.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the client packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static Set<Integer> getSupported() throws FieldAccessException {
|
||||||
|
return PacketFilterManager.getClientPackets();
|
||||||
|
}
|
||||||
|
|
||||||
// Like above
|
// Like above
|
||||||
private Client() {
|
private Client() {
|
||||||
super();
|
super();
|
@ -30,6 +30,11 @@ import com.comphenix.protocol.injector.PacketFilterManager;
|
|||||||
import com.comphenix.protocol.metrics.Statistics;
|
import com.comphenix.protocol.metrics.Statistics;
|
||||||
import com.comphenix.protocol.reflect.compiler.BackgroundCompiler;
|
import com.comphenix.protocol.reflect.compiler.BackgroundCompiler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main entry point for ProtocolLib.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
public class ProtocolLibrary extends JavaPlugin {
|
public class ProtocolLibrary extends JavaPlugin {
|
||||||
|
|
||||||
// There should only be one protocol manager, so we'll make it static
|
// There should only be one protocol manager, so we'll make it static
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -180,9 +197,14 @@ public class AsyncFilterManager implements AsynchronousManager {
|
|||||||
* @param syncPacket - synchronous packet event.
|
* @param syncPacket - synchronous packet event.
|
||||||
* @param asyncMarker - the asynchronous marker to use.
|
* @param asyncMarker - the asynchronous marker to use.
|
||||||
*/
|
*/
|
||||||
public void enqueueSyncPacket(PacketEvent syncPacket, AsyncMarker asyncMarker) {
|
public synchronized void enqueueSyncPacket(PacketEvent syncPacket, AsyncMarker asyncMarker) {
|
||||||
PacketEvent newEvent = PacketEvent.fromSynchronous(syncPacket, asyncMarker);
|
PacketEvent newEvent = PacketEvent.fromSynchronous(syncPacket, asyncMarker);
|
||||||
|
|
||||||
|
if (asyncMarker.isQueued() || asyncMarker.isTransmitted())
|
||||||
|
throw new IllegalArgumentException("Cannot queue a packet that has already been queued.");
|
||||||
|
|
||||||
|
asyncMarker.setQueuedSendingIndex(asyncMarker.getNewSendingIndex());
|
||||||
|
|
||||||
// Start the process
|
// Start the process
|
||||||
getSendingQueue(syncPacket).enqueue(newEvent);
|
getSendingQueue(syncPacket).enqueue(newEvent);
|
||||||
|
|
||||||
@ -256,12 +278,29 @@ public class AsyncFilterManager implements AsynchronousManager {
|
|||||||
serverQueue.cleanupAll();
|
serverQueue.cleanupAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void signalPacketTransmission(PacketEvent packet) {
|
||||||
|
signalPacketTransmission(packet, onMainThread());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Signal that a packet is ready to be transmitted.
|
* Signal that a packet is ready to be transmitted.
|
||||||
* @param packet - packet to signal.
|
* @param packet - packet to signal.
|
||||||
|
* @param onMainThread - whether or not this method was run by the main thread.
|
||||||
*/
|
*/
|
||||||
public void signalPacketUpdate(PacketEvent packet) {
|
private void signalPacketTransmission(PacketEvent packet, boolean onMainThread) {
|
||||||
getSendingQueue(packet).signalPacketUpdate(packet, onMainThread());
|
AsyncMarker marker = packet.getAsyncMarker();
|
||||||
|
if (marker == null)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"A sync packet cannot be transmitted by the asynchronous manager.");
|
||||||
|
if (!marker.isQueued())
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"A packet must have been queued before it can be transmitted.");
|
||||||
|
|
||||||
|
// Only send if the packet is ready
|
||||||
|
if (marker.decrementProcessingDelay() == 0) {
|
||||||
|
getSendingQueue(packet).signalPacketUpdate(packet, onMainThread);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -277,7 +316,7 @@ public class AsyncFilterManager implements AsynchronousManager {
|
|||||||
* Signal that a packet has finished processing.
|
* Signal that a packet has finished processing.
|
||||||
* @param packet - packet to signal.
|
* @param packet - packet to signal.
|
||||||
*/
|
*/
|
||||||
public void signalProcessingDone(PacketEvent packet) {
|
public void signalFreeProcessingSlot(PacketEvent packet) {
|
||||||
getProcessingQueue(packet).signalProcessingDone();
|
getProcessingQueue(packet).signalProcessingDone();
|
||||||
}
|
}
|
||||||
|
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -9,9 +26,12 @@ import java.util.logging.Level;
|
|||||||
|
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.events.ListeningWhitelist;
|
||||||
import com.comphenix.protocol.events.PacketAdapter;
|
import com.comphenix.protocol.events.PacketAdapter;
|
||||||
import com.comphenix.protocol.events.PacketEvent;
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
import com.comphenix.protocol.events.PacketListener;
|
import com.comphenix.protocol.events.PacketListener;
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Joiner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a handler for an asynchronous event.
|
* Represents a handler for an asynchronous event.
|
||||||
@ -198,7 +218,7 @@ public class AsyncListenerHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start a singler worker thread handling the asynchronous.
|
* Start a singler worker thread handling the asynchronous listener.
|
||||||
*/
|
*/
|
||||||
public synchronized void start() {
|
public synchronized void start() {
|
||||||
if (listener.getPlugin() == null)
|
if (listener.getPlugin() == null)
|
||||||
@ -206,7 +226,91 @@ public class AsyncListenerHandler {
|
|||||||
if (cancelled)
|
if (cancelled)
|
||||||
throw new IllegalStateException("Cannot start a worker when the listener is closing.");
|
throw new IllegalStateException("Cannot start a worker when the listener is closing.");
|
||||||
|
|
||||||
filterManager.scheduleAsyncTask(listener.getPlugin(), getListenerLoop());
|
final AsyncRunnable listenerLoop = getListenerLoop();
|
||||||
|
|
||||||
|
filterManager.scheduleAsyncTask(listener.getPlugin(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Thread thread = Thread.currentThread();
|
||||||
|
|
||||||
|
String previousName = thread.getName();
|
||||||
|
String workerName = getFriendlyWorkerName(listenerLoop.getID());
|
||||||
|
|
||||||
|
// Add the friendly worker name
|
||||||
|
thread.setName(workerName);
|
||||||
|
listenerLoop.run();
|
||||||
|
thread.setName(previousName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a singler worker thread handling the asynchronous listener.
|
||||||
|
* <p>
|
||||||
|
* This method is intended to allow callers to customize the thread priority
|
||||||
|
* before the worker loop is actually called. This is simpler than to
|
||||||
|
* schedule the worker threads manually.
|
||||||
|
* <pre><code>
|
||||||
|
* listenerHandler.start(new Function<AsyncRunnable, Void>() {
|
||||||
|
* @Override
|
||||||
|
* public Void apply(@Nullable AsyncRunnable workerLoop) {
|
||||||
|
* Thread thread = Thread.currentThread();
|
||||||
|
* int prevPriority = thread.getPriority();
|
||||||
|
*
|
||||||
|
* thread.setPriority(Thread.MIN_PRIORITY);
|
||||||
|
* workerLoop.run();
|
||||||
|
* thread.setPriority(prevPriority);
|
||||||
|
* return null;
|
||||||
|
* }
|
||||||
|
* });
|
||||||
|
* }
|
||||||
|
* </code></pre>
|
||||||
|
* @param executor - a method that will execute the given listener loop.
|
||||||
|
*/
|
||||||
|
public synchronized void start(Function<AsyncRunnable, Void> executor) {
|
||||||
|
if (listener.getPlugin() == null)
|
||||||
|
throw new IllegalArgumentException("Cannot start task without a valid plugin.");
|
||||||
|
if (cancelled)
|
||||||
|
throw new IllegalStateException("Cannot start a worker when the listener is closing.");
|
||||||
|
|
||||||
|
final AsyncRunnable listenerLoop = getListenerLoop();
|
||||||
|
final Function<AsyncRunnable, Void> delegateCopy = executor;
|
||||||
|
|
||||||
|
filterManager.scheduleAsyncTask(listener.getPlugin(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
delegateCopy.apply(listenerLoop);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a friendly thread name using the following convention:
|
||||||
|
* <p><code>
|
||||||
|
* Protocol Worker {id} - {plugin} - [recv: {packets}, send: {packets}]
|
||||||
|
* </code></p>
|
||||||
|
* @param id - the worker ID.
|
||||||
|
* @return A friendly thread name.
|
||||||
|
*/
|
||||||
|
public String getFriendlyWorkerName(int id) {
|
||||||
|
return String.format("Protocol Worker #%s - %s - [recv: %s, send: %s]",
|
||||||
|
id,
|
||||||
|
PacketAdapter.getPluginName(listener),
|
||||||
|
fromWhitelist(listener.getReceivingWhitelist()),
|
||||||
|
fromWhitelist(listener.getSendingWhitelist())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the given whitelist to a comma-separated list of packet IDs.
|
||||||
|
* @param whitelist - the whitelist.
|
||||||
|
* @return A comma separated list of packet IDs in the whitelist, or the emtpy string.
|
||||||
|
*/
|
||||||
|
private String fromWhitelist(ListeningWhitelist whitelist) {
|
||||||
|
if (whitelist == null)
|
||||||
|
return "";
|
||||||
|
else
|
||||||
|
return Joiner.on(", ").join(whitelist.getWhitelist());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -258,7 +362,7 @@ public class AsyncListenerHandler {
|
|||||||
stop();
|
stop();
|
||||||
|
|
||||||
// May happen if another thread is doing something similar to "setWorkers"
|
// May happen if another thread is doing something similar to "setWorkers"
|
||||||
if ((System.currentTimeMillis() - time) > 1000)
|
if ((System.currentTimeMillis() - time) > 50)
|
||||||
throw new RuntimeException("Failed to set worker count.");
|
throw new RuntimeException("Failed to set worker count.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -329,10 +433,12 @@ public class AsyncListenerHandler {
|
|||||||
marker.setListenerHandler(this);
|
marker.setListenerHandler(this);
|
||||||
marker.setWorkerID(workerID);
|
marker.setWorkerID(workerID);
|
||||||
|
|
||||||
if (packet.isServerPacket())
|
synchronized (marker.getProcessingLock()) {
|
||||||
listener.onPacketSending(packet);
|
if (packet.isServerPacket())
|
||||||
else
|
listener.onPacketSending(packet);
|
||||||
listener.onPacketReceiving(packet);
|
else
|
||||||
|
listener.onPacketReceiving(packet);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
// Minecraft doesn't want your Exception.
|
// Minecraft doesn't want your Exception.
|
||||||
@ -351,8 +457,10 @@ public class AsyncListenerHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// There are no more listeners - queue the packet for transmission
|
// There are no more listeners - queue the packet for transmission
|
||||||
filterManager.signalPacketUpdate(packet);
|
filterManager.signalFreeProcessingSlot(packet);
|
||||||
filterManager.signalProcessingDone(packet);
|
|
||||||
|
// Note that listeners can opt to delay the packet transmission
|
||||||
|
filterManager.signalPacketTransmission(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -6,6 +23,7 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import net.minecraft.server.Packet;
|
import net.minecraft.server.Packet;
|
||||||
|
|
||||||
@ -58,6 +76,9 @@ public class AsyncMarker implements Serializable, Comparable<AsyncMarker> {
|
|||||||
private long originalSendingIndex;
|
private long originalSendingIndex;
|
||||||
private long newSendingIndex;
|
private long newSendingIndex;
|
||||||
|
|
||||||
|
// Used to determine if a packet must be reordered in the sending queue
|
||||||
|
private Long queuedSendingIndex;
|
||||||
|
|
||||||
// Whether or not the packet has been processed by the listeners
|
// Whether or not the packet has been processed by the listeners
|
||||||
private volatile boolean processed;
|
private volatile boolean processed;
|
||||||
|
|
||||||
@ -67,6 +88,12 @@ public class AsyncMarker implements Serializable, Comparable<AsyncMarker> {
|
|||||||
// Whether or not the asynchronous processing itself should be cancelled
|
// Whether or not the asynchronous processing itself should be cancelled
|
||||||
private volatile boolean asyncCancelled;
|
private volatile boolean asyncCancelled;
|
||||||
|
|
||||||
|
// Whether or not to delay processing
|
||||||
|
private AtomicInteger processingDelay = new AtomicInteger();
|
||||||
|
|
||||||
|
// Used to synchronize processing on the shared PacketEvent
|
||||||
|
private Object processingLock = new Object();
|
||||||
|
|
||||||
// Used to identify the asynchronous worker
|
// Used to identify the asynchronous worker
|
||||||
private AsyncListenerHandler listenerHandler;
|
private AsyncListenerHandler listenerHandler;
|
||||||
private int workerID;
|
private int workerID;
|
||||||
@ -178,6 +205,80 @@ public class AsyncMarker implements Serializable, Comparable<AsyncMarker> {
|
|||||||
this.processed = processed;
|
this.processed = processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment the number of times this packet must be signalled as done before its transmitted.
|
||||||
|
* <p>
|
||||||
|
* This is useful if an asynchronous listener is waiting for further information before the
|
||||||
|
* packet can be sent to the user. A packet listener <b>MUST</b> eventually call
|
||||||
|
* {@link AsyncFilterManager#signalPacketTransmission(PacketEvent)},
|
||||||
|
* even if the packet is cancelled, after this method is called.
|
||||||
|
* <p>
|
||||||
|
* It is recommended that processing outside a packet listener is wrapped in a synchronized block
|
||||||
|
* using the {@link #getProcessingLock()} method.
|
||||||
|
* <p>
|
||||||
|
* To decrement the processing delay, call signalPacketUpdate. A thread that calls this method
|
||||||
|
* multiple times must call signalPacketUpdate at least that many times.
|
||||||
|
* @return The new processing delay.
|
||||||
|
*/
|
||||||
|
public int incrementProcessingDelay() {
|
||||||
|
return processingDelay.incrementAndGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrement the number of times this packet must be signalled as done before it's transmitted.
|
||||||
|
* @return The new processing delay. If zero, the packet should be sent.
|
||||||
|
*/
|
||||||
|
int decrementProcessingDelay() {
|
||||||
|
return processingDelay.decrementAndGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the number of times a packet must be signalled to be done before it's sent.
|
||||||
|
* @return Number of processing delays.
|
||||||
|
*/
|
||||||
|
public int getProcessingDelay() {
|
||||||
|
return processingDelay.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not this packet is or has been queued for processing.
|
||||||
|
* @return TRUE if it has, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
public boolean isQueued() {
|
||||||
|
return queuedSendingIndex != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the sending index when the packet was queued.
|
||||||
|
* @return Queued sending index.
|
||||||
|
*/
|
||||||
|
public long getQueuedSendingIndex() {
|
||||||
|
return queuedSendingIndex != null ? queuedSendingIndex : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the sending index when the packet was queued.
|
||||||
|
* @param queuedSendingIndex - sending index.
|
||||||
|
*/
|
||||||
|
void setQueuedSendingIndex(Long queuedSendingIndex) {
|
||||||
|
this.queuedSendingIndex = queuedSendingIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processing lock used to synchronize access to the parent PacketEvent and PacketContainer.
|
||||||
|
* <p>
|
||||||
|
* This lock is automatically acquired for every asynchronous packet listener. It should only be
|
||||||
|
* used to synchronize access to a PacketEvent if it's processing has been delayed.
|
||||||
|
* @return A processing lock.
|
||||||
|
*/
|
||||||
|
public Object getProcessingLock() {
|
||||||
|
return processingLock;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProcessingLock(Object processingLock) {
|
||||||
|
this.processingLock = processingLock;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve whether or not this packet has already been sent.
|
* Retrieve whether or not this packet has already been sent.
|
||||||
* @return TRUE if it has been sent before, FALSE otherwise.
|
* @return TRUE if it has been sent before, FALSE otherwise.
|
||||||
@ -213,6 +314,10 @@ public class AsyncMarker implements Serializable, Comparable<AsyncMarker> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set whether or not the asynchronous handling should be cancelled.
|
* Set whether or not the asynchronous handling should be cancelled.
|
||||||
|
* <p>
|
||||||
|
* This is only relevant during the synchronous processing. Asynchronous
|
||||||
|
* listeners should use the normal cancel-field to cancel a PacketEvent.
|
||||||
|
*
|
||||||
* @param asyncCancelled - TRUE to cancel it, FALSE otherwise.
|
* @param asyncCancelled - TRUE to cancel it, FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
public void setAsyncCancelled(boolean asyncCancelled) {
|
public void setAsyncCancelled(boolean asyncCancelled) {
|
||||||
@ -276,7 +381,7 @@ public class AsyncMarker implements Serializable, Comparable<AsyncMarker> {
|
|||||||
* @param event - the packet to send.
|
* @param event - the packet to send.
|
||||||
* @throws IOException If the packet couldn't be sent.
|
* @throws IOException If the packet couldn't be sent.
|
||||||
*/
|
*/
|
||||||
public void sendPacket(PacketEvent event) throws IOException {
|
void sendPacket(PacketEvent event) throws IOException {
|
||||||
try {
|
try {
|
||||||
if (event.isServerPacket()) {
|
if (event.isServerPacket()) {
|
||||||
packetStream.sendServerPacket(event.getPlayer(), event.getPacket(), false);
|
packetStream.sendServerPacket(event.getPlayer(), event.getPacket(), false);
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A runnable representing a asynchronous event listener.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
|
public interface AsyncRunnable extends Runnable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a unique worker ID.
|
||||||
|
* @return Unique worker ID.
|
||||||
|
*/
|
||||||
|
public int getID();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the given runnable.
|
||||||
|
* <p>
|
||||||
|
* This may not occur right away.
|
||||||
|
* @return TRUE if the thread was stopped, FALSE if it was already stopped.
|
||||||
|
*/
|
||||||
|
public boolean stop() throws InterruptedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if we're running or not.
|
||||||
|
* @return TRUE if we're running, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
public boolean isRunning();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if this runnable has already run its course.
|
||||||
|
* @return TRUE if it has been stopped, FALSE otherwise.
|
||||||
|
*/
|
||||||
|
boolean isFinished();
|
||||||
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.ComparisonChain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a comparable to a packet event.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
|
class PacketEventHolder implements Comparable<PacketEventHolder> {
|
||||||
|
|
||||||
|
private PacketEvent event;
|
||||||
|
private long sendingIndex = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A wrapper that ensures the packet event is ordered by sending index.
|
||||||
|
* @param event - packet event to wrap.
|
||||||
|
*/
|
||||||
|
public PacketEventHolder(PacketEvent event) {
|
||||||
|
this.event = Preconditions.checkNotNull(event, "Event must be non-null");
|
||||||
|
|
||||||
|
if (event.getAsyncMarker() != null)
|
||||||
|
this.sendingIndex = event.getAsyncMarker().getNewSendingIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the stored event.
|
||||||
|
* @return The stored event.
|
||||||
|
*/
|
||||||
|
public PacketEvent getEvent() {
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(PacketEventHolder other) {
|
||||||
|
return ComparisonChain.start().
|
||||||
|
compare(sendingIndex, other.sendingIndex).
|
||||||
|
result();
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -100,6 +117,8 @@ class PacketProcessingQueue extends AbstractConcurrentListenerMultimap<AsyncList
|
|||||||
AsyncMarker marker = packet.getAsyncMarker();
|
AsyncMarker marker = packet.getAsyncMarker();
|
||||||
Collection<PrioritizedListener<AsyncListenerHandler>> list = getListener(packet.getPacketID());
|
Collection<PrioritizedListener<AsyncListenerHandler>> list = getListener(packet.getPacketID());
|
||||||
|
|
||||||
|
marker.incrementProcessingDelay();
|
||||||
|
|
||||||
// Yes, removing the marker will cause the chain to stop
|
// Yes, removing the marker will cause the chain to stop
|
||||||
if (list != null) {
|
if (list != null) {
|
||||||
Iterator<PrioritizedListener<AsyncListenerHandler>> iterator = list.iterator();
|
Iterator<PrioritizedListener<AsyncListenerHandler>> iterator = list.iterator();
|
||||||
@ -112,7 +131,8 @@ class PacketProcessingQueue extends AbstractConcurrentListenerMultimap<AsyncList
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The packet has no further listeners. Just send it.
|
// The packet has no further listeners. Just send it.
|
||||||
sendingQueue.signalPacketUpdate(packet, onMainThread);
|
if (marker.decrementProcessingDelay() == 0)
|
||||||
|
sendingQueue.signalPacketUpdate(packet, onMainThread);
|
||||||
signalProcessingDone();
|
signalProcessingDone();
|
||||||
|
|
||||||
} else {
|
} else {
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -9,6 +26,7 @@ import java.util.concurrent.PriorityBlockingQueue;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.comphenix.protocol.events.PacketEvent;
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
|
import com.comphenix.protocol.injector.PlayerLoggedOutException;
|
||||||
import com.comphenix.protocol.reflect.FieldAccessException;
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -43,7 +61,7 @@ class PacketSendingQueue {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Enqueue a packet for sending.
|
* Enqueue a packet for sending.
|
||||||
* @param packet
|
* @param packet - packet to queue.
|
||||||
*/
|
*/
|
||||||
public void enqueue(PacketEvent packet) {
|
public void enqueue(PacketEvent packet) {
|
||||||
sendingQueue.add(new PacketEventHolder(packet));
|
sendingQueue.add(new PacketEventHolder(packet));
|
||||||
@ -55,8 +73,22 @@ class PacketSendingQueue {
|
|||||||
* @param onMainThread - whether or not this is occuring on the main thread.
|
* @param onMainThread - whether or not this is occuring on the main thread.
|
||||||
*/
|
*/
|
||||||
public synchronized void signalPacketUpdate(PacketEvent packetUpdated, boolean onMainThread) {
|
public synchronized void signalPacketUpdate(PacketEvent packetUpdated, boolean onMainThread) {
|
||||||
|
|
||||||
|
AsyncMarker marker = packetUpdated.getAsyncMarker();
|
||||||
|
|
||||||
|
// Should we reorder the event?
|
||||||
|
if (marker.getQueuedSendingIndex() != marker.getNewSendingIndex()) {
|
||||||
|
PacketEvent copy = PacketEvent.fromSynchronous(packetUpdated, marker);
|
||||||
|
|
||||||
|
// "Cancel" the original event
|
||||||
|
packetUpdated.setCancelled(true);
|
||||||
|
|
||||||
|
// Enqueue the copy with the new sending index
|
||||||
|
enqueue(copy);
|
||||||
|
}
|
||||||
|
|
||||||
// Mark this packet as finished
|
// Mark this packet as finished
|
||||||
packetUpdated.getAsyncMarker().setProcessed(true);
|
marker.setProcessed(true);
|
||||||
trySendPackets(onMainThread);
|
trySendPackets(onMainThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,6 +203,12 @@ class PacketSendingQueue {
|
|||||||
marker.sendPacket(event);
|
marker.sendPacket(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} catch (PlayerLoggedOutException e) {
|
||||||
|
System.out.println(String.format(
|
||||||
|
"Warning: Dropped packet index %s of ID %s",
|
||||||
|
marker.getOriginalSendingIndex(), event.getPacketID()
|
||||||
|
));
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// Just print the error
|
// Just print the error
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.async;
|
package com.comphenix.protocol.async;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.concurrency;
|
package com.comphenix.protocol.concurrency;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.concurrency;
|
package com.comphenix.protocol.concurrency;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
@ -145,7 +145,7 @@ public class PacketContainer implements Serializable {
|
|||||||
// Convert from and to the Bukkit wrapper
|
// Convert from and to the Bukkit wrapper
|
||||||
return structureModifier.<ItemStack>withType(net.minecraft.server.ItemStack.class, new EquivalentConverter<ItemStack>() {
|
return structureModifier.<ItemStack>withType(net.minecraft.server.ItemStack.class, new EquivalentConverter<ItemStack>() {
|
||||||
public Object getGeneric(ItemStack specific) {
|
public Object getGeneric(ItemStack specific) {
|
||||||
return ((CraftItemStack) specific).getHandle();
|
return toStackNMS(specific);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -175,7 +175,7 @@ public class PacketContainer implements Serializable {
|
|||||||
|
|
||||||
// Unwrap every item
|
// Unwrap every item
|
||||||
for (int i = 0; i < result.length; i++) {
|
for (int i = 0; i < result.length; i++) {
|
||||||
result[i] = ((CraftItemStack) specific[i]).getHandle();
|
result[i] = toStackNMS(specific[i]);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -199,6 +199,20 @@ public class PacketContainer implements Serializable {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an item stack to the NMS equivalent.
|
||||||
|
* @param stack - Bukkit stack to convert.
|
||||||
|
* @return A bukkit stack.
|
||||||
|
*/
|
||||||
|
private net.minecraft.server.ItemStack toStackNMS(ItemStack stack) {
|
||||||
|
// We must be prepared for an object that simply implements ItemStcak
|
||||||
|
if (stack instanceof CraftItemStack) {
|
||||||
|
return ((CraftItemStack) stack).getHandle();
|
||||||
|
} else {
|
||||||
|
return (new CraftItemStack(stack)).getHandle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a read/write structure for the world type enum.
|
* Retrieves a read/write structure for the world type enum.
|
||||||
* <p>
|
* <p>
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.events;
|
package com.comphenix.protocol.events;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.injector.PacketConstructor.Unwrapper;
|
||||||
|
import com.comphenix.protocol.reflect.instances.DefaultInstances;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an object capable of converting wrapped Bukkit objects into NMS objects.
|
||||||
|
* <p>
|
||||||
|
* Typical conversions include:
|
||||||
|
* <ul>
|
||||||
|
* <li>org.bukkit.entity.Player -> net.minecraft.server.EntityPlayer</li>
|
||||||
|
* <li>org.bukkit.World -> net.minecraft.server.WorldServer</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
|
public class BukkitUnwrapper implements Unwrapper {
|
||||||
|
|
||||||
|
private static Map<Class<?>, Method> cache = new ConcurrentHashMap<Class<?>, Method>();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public Object unwrapItem(Object wrappedObject) {
|
||||||
|
|
||||||
|
// Special case
|
||||||
|
if (wrappedObject instanceof Collection) {
|
||||||
|
return handleCollection((Collection<Object>) wrappedObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> currentClass = wrappedObject.getClass();
|
||||||
|
Method cachedMethod = initializeCache(currentClass);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Retrieve the handle
|
||||||
|
if (cachedMethod != null)
|
||||||
|
return cachedMethod.invoke(wrappedObject);
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
// Impossible
|
||||||
|
return null;
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
return null;
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
// This is REALLY bad
|
||||||
|
throw new RuntimeException("Minecraft error.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object handleCollection(Collection<Object> wrappedObject) {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Collection<Object> copy = DefaultInstances.DEFAULT.getDefault(wrappedObject.getClass());
|
||||||
|
|
||||||
|
if (copy != null) {
|
||||||
|
// Unwrap every element
|
||||||
|
for (Object element : wrappedObject) {
|
||||||
|
copy.add(unwrapItem(element));
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Impossible
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Method initializeCache(Class<?> type) {
|
||||||
|
|
||||||
|
// See if we're already determined this
|
||||||
|
if (cache.containsKey(type)) {
|
||||||
|
// We will never remove from the cache, so this ought to be thread safe
|
||||||
|
return cache.get(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Method find = type.getMethod("getHandle");
|
||||||
|
|
||||||
|
// It's thread safe, as getMethod should return the same handle
|
||||||
|
cache.put(type, find);
|
||||||
|
return find;
|
||||||
|
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
return null;
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector;
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
@ -15,7 +32,6 @@ import org.bukkit.craftbukkit.CraftWorld;
|
|||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.comphenix.protocol.injector.PacketConstructor.BukkitUnwrapper;
|
|
||||||
import com.comphenix.protocol.reflect.FieldAccessException;
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
import com.comphenix.protocol.reflect.FieldUtils;
|
import com.comphenix.protocol.reflect.FieldUtils;
|
||||||
import com.comphenix.protocol.reflect.FuzzyReflection;
|
import com.comphenix.protocol.reflect.FuzzyReflection;
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
|
import net.minecraft.server.Packet;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an object that initiate the packet listeners.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
|
public interface ListenerInvoker {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes the given packet event for every registered listener.
|
||||||
|
* @param event - the packet event to invoke.
|
||||||
|
*/
|
||||||
|
public abstract void invokePacketRecieving(PacketEvent event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes the given packet event for every registered listener.
|
||||||
|
* @param event - the packet event to invoke.
|
||||||
|
*/
|
||||||
|
public abstract void invokePacketSending(PacketEvent event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the associated ID of a packet.
|
||||||
|
* @param packet - the packet.
|
||||||
|
* @return The packet ID.
|
||||||
|
*/
|
||||||
|
public abstract int getPacketID(Packet packet);
|
||||||
|
}
|
@ -19,13 +19,17 @@ package com.comphenix.protocol.injector;
|
|||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import net.minecraft.server.Packet;
|
import net.minecraft.server.Packet;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
import com.comphenix.protocol.reflect.FieldUtils;
|
import com.comphenix.protocol.reflect.FieldUtils;
|
||||||
import com.comphenix.protocol.reflect.FuzzyReflection;
|
import com.comphenix.protocol.reflect.FuzzyReflection;
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static registries in Minecraft.
|
* Static registries in Minecraft.
|
||||||
@ -35,9 +39,16 @@ import com.google.common.base.Objects;
|
|||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
class MinecraftRegistry {
|
class MinecraftRegistry {
|
||||||
|
|
||||||
|
// Fuzzy reflection
|
||||||
|
private static FuzzyReflection packetRegistry;
|
||||||
|
|
||||||
// The packet class to packet ID translator
|
// The packet class to packet ID translator
|
||||||
private static Map<Class, Integer> packetToID;
|
private static Map<Class, Integer> packetToID;
|
||||||
|
|
||||||
|
// Whether or not certain packets are sent by the client or the server
|
||||||
|
private static Set<Integer> serverPackets;
|
||||||
|
private static Set<Integer> clientPackets;
|
||||||
|
|
||||||
// New proxy values
|
// New proxy values
|
||||||
private static Map<Integer, Class> overwrittenPackets = new HashMap<Integer, Class>();
|
private static Map<Integer, Class> overwrittenPackets = new HashMap<Integer, Class>();
|
||||||
|
|
||||||
@ -49,7 +60,7 @@ class MinecraftRegistry {
|
|||||||
// Initialize it, if we haven't already
|
// Initialize it, if we haven't already
|
||||||
if (packetToID == null) {
|
if (packetToID == null) {
|
||||||
try {
|
try {
|
||||||
Field packetsField = FuzzyReflection.fromClass(Packet.class, true).getFieldByType("packetsField", Map.class);
|
Field packetsField = getPacketRegistry().getFieldByType("packetsField", Map.class);
|
||||||
packetToID = (Map<Class, Integer>) FieldUtils.readStaticField(packetsField, true);
|
packetToID = (Map<Class, Integer>) FieldUtils.readStaticField(packetsField, true);
|
||||||
|
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
@ -60,14 +71,80 @@ class MinecraftRegistry {
|
|||||||
return packetToID;
|
return packetToID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the cached fuzzy reflection instance allowing access to the packet registry.
|
||||||
|
* @return Reflected packet registry.
|
||||||
|
*/
|
||||||
|
private static FuzzyReflection getPacketRegistry() {
|
||||||
|
if (packetRegistry == null)
|
||||||
|
packetRegistry = FuzzyReflection.fromClass(Packet.class, true);
|
||||||
|
return packetRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the injected proxy classes handlig each packet ID.
|
||||||
|
* @return Injected classes.
|
||||||
|
*/
|
||||||
public static Map<Integer, Class> getOverwrittenPackets() {
|
public static Map<Integer, Class> getOverwrittenPackets() {
|
||||||
return overwrittenPackets;
|
return overwrittenPackets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the vanilla classes handling each packet ID.
|
||||||
|
* @return Vanilla classes.
|
||||||
|
*/
|
||||||
public static Map<Integer, Class> getPreviousPackets() {
|
public static Map<Integer, Class> getPreviousPackets() {
|
||||||
return previousValues;
|
return previousValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve every known and supported server packet.
|
||||||
|
* @return An immutable set of every known server packet.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the server packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static Set<Integer> getServerPackets() throws FieldAccessException {
|
||||||
|
initializeSets();
|
||||||
|
return serverPackets;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve every known and supported client packet.
|
||||||
|
* @return An immutable set of every known client packet.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the client packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static Set<Integer> getClientPackets() throws FieldAccessException {
|
||||||
|
initializeSets();
|
||||||
|
return clientPackets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static void initializeSets() throws FieldAccessException {
|
||||||
|
if (serverPackets == null || clientPackets == null) {
|
||||||
|
List<Field> sets = getPacketRegistry().getFieldListByType(Set.class);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (sets.size() > 1) {
|
||||||
|
serverPackets = (Set<Integer>) FieldUtils.readStaticField(sets.get(0), true);
|
||||||
|
clientPackets = (Set<Integer>) FieldUtils.readStaticField(sets.get(1), true);
|
||||||
|
|
||||||
|
// Impossible
|
||||||
|
if (serverPackets == null || clientPackets == null)
|
||||||
|
throw new FieldAccessException("Packet sets are in an illegal state.");
|
||||||
|
|
||||||
|
// NEVER allow callers to modify the underlying sets
|
||||||
|
serverPackets = ImmutableSet.copyOf(serverPackets);
|
||||||
|
clientPackets = ImmutableSet.copyOf(clientPackets);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new FieldAccessException("Cannot retrieve packet client/server sets.");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new FieldAccessException("Cannot access field.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the correct packet class from a given packet ID.
|
* Retrieves the correct packet class from a given packet ID.
|
||||||
* @param packetID - the packet ID.
|
* @param packetID - the packet ID.
|
@ -1,11 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector;
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
import net.minecraft.server.Packet;
|
import net.minecraft.server.Packet;
|
||||||
|
|
||||||
@ -174,58 +188,17 @@ public class PacketConstructor {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BukkitUnwrapper implements Unwrapper {
|
/**
|
||||||
|
* Represents a unwrapper for a constructor parameter.
|
||||||
private static Map<Class<?>, Method> cache = new ConcurrentHashMap<Class<?>, Method>();
|
*
|
||||||
|
* @author Kristian
|
||||||
@Override
|
*/
|
||||||
public Object unwrapItem(Object wrappedObject) {
|
|
||||||
|
|
||||||
Class<?> currentClass = wrappedObject.getClass();
|
|
||||||
Method cachedMethod = initializeCache(currentClass);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Retrieve the handle
|
|
||||||
if (cachedMethod != null)
|
|
||||||
return cachedMethod.invoke(wrappedObject);
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
// Impossible
|
|
||||||
return null;
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
return null;
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
// This is REALLY bad
|
|
||||||
throw new RuntimeException("Minecraft error.", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Method initializeCache(Class<?> type) {
|
|
||||||
|
|
||||||
// See if we're already determined this
|
|
||||||
if (cache.containsKey(type)) {
|
|
||||||
// We will never remove from the cache, so this ought to be thread safe
|
|
||||||
return cache.get(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Method find = type.getMethod("getHandle");
|
|
||||||
|
|
||||||
// It's thread safe, as getMethod should return the same handle
|
|
||||||
cache.put(type, find);
|
|
||||||
return find;
|
|
||||||
|
|
||||||
} catch (SecurityException e) {
|
|
||||||
return null;
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static interface Unwrapper {
|
public static interface Unwrapper {
|
||||||
|
/**
|
||||||
|
* Convert the given wrapped object to the equivalent net.minecraft.server object.
|
||||||
|
* @param wrappedObject - wrapped object.
|
||||||
|
* @return The net.minecraft.server object.
|
||||||
|
*/
|
||||||
public Object unwrapItem(Object wrappedObject);
|
public Object unwrapItem(Object wrappedObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -61,13 +61,6 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
* @author Kristian
|
* @author Kristian
|
||||||
*/
|
*/
|
||||||
public enum PlayerInjectHooks {
|
public enum PlayerInjectHooks {
|
||||||
/**
|
|
||||||
* Override the packet queue lists in NetworkHandler.
|
|
||||||
* <p>
|
|
||||||
* Cannot intercept MapChunk packets.
|
|
||||||
*/
|
|
||||||
NETWORK_HANDLER_FIELDS,
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override the network handler object itself. Only works in 1.3.
|
* Override the network handler object itself. Only works in 1.3.
|
||||||
* <p>
|
* <p>
|
||||||
@ -75,6 +68,13 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
*/
|
*/
|
||||||
NETWORK_MANAGER_OBJECT,
|
NETWORK_MANAGER_OBJECT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the packet queue lists in NetworkHandler.
|
||||||
|
* <p>
|
||||||
|
* Cannot intercept MapChunk packets.
|
||||||
|
*/
|
||||||
|
NETWORK_HANDLER_FIELDS,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override the server handler object. Versatile, but a tad slower.
|
* Override the server handler object. Versatile, but a tad slower.
|
||||||
*/
|
*/
|
||||||
@ -107,6 +107,11 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
// The async packet handler
|
// The async packet handler
|
||||||
private AsyncFilterManager asyncFilterManager;
|
private AsyncFilterManager asyncFilterManager;
|
||||||
|
|
||||||
|
// Valid server and client packets
|
||||||
|
private Set<Integer> serverPackets;
|
||||||
|
private Set<Integer> clientPackets;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only create instances of this class if protocol lib is disabled.
|
* Only create instances of this class if protocol lib is disabled.
|
||||||
*/
|
*/
|
||||||
@ -123,6 +128,15 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
this.playerInjection = new PlayerInjectionHandler(classLoader, logger, this, server);
|
this.playerInjection = new PlayerInjectionHandler(classLoader, logger, this, server);
|
||||||
this.packetInjector = new PacketInjector(classLoader, this, playerInjection);
|
this.packetInjector = new PacketInjector(classLoader, this, playerInjection);
|
||||||
this.asyncFilterManager = new AsyncFilterManager(logger, server.getScheduler(), this);
|
this.asyncFilterManager = new AsyncFilterManager(logger, server.getScheduler(), this);
|
||||||
|
|
||||||
|
// Attempt to load the list of server and client packets
|
||||||
|
try {
|
||||||
|
this.serverPackets = MinecraftRegistry.getServerPackets();
|
||||||
|
this.clientPackets = MinecraftRegistry.getClientPackets();
|
||||||
|
} catch (FieldAccessException e) {
|
||||||
|
logger.log(Level.WARNING, "Cannot load server and client packet list.", e);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
logger.log(Level.SEVERE, "Unable to initialize packet injector.", e);
|
logger.log(Level.SEVERE, "Unable to initialize packet injector.", e);
|
||||||
}
|
}
|
||||||
@ -180,7 +194,7 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
if (hasSending) {
|
if (hasSending) {
|
||||||
verifyWhitelist(listener, sending);
|
verifyWhitelist(listener, sending);
|
||||||
sendingListeners.addListener(listener, sending);
|
sendingListeners.addListener(listener, sending);
|
||||||
enablePacketFilters(ConnectionSide.SERVER_SIDE, sending.getWhitelist());
|
enablePacketFilters(listener, ConnectionSide.SERVER_SIDE, sending.getWhitelist());
|
||||||
|
|
||||||
// Make sure this is possible
|
// Make sure this is possible
|
||||||
playerInjection.checkListener(listener);
|
playerInjection.checkListener(listener);
|
||||||
@ -188,7 +202,7 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
if (hasReceiving) {
|
if (hasReceiving) {
|
||||||
verifyWhitelist(listener, receiving);
|
verifyWhitelist(listener, receiving);
|
||||||
recievedListeners.addListener(listener, receiving);
|
recievedListeners.addListener(listener, receiving);
|
||||||
enablePacketFilters(ConnectionSide.CLIENT_SIDE, receiving.getWhitelist());
|
enablePacketFilters(listener, ConnectionSide.CLIENT_SIDE, receiving.getWhitelist());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inform our injected hooks
|
// Inform our injected hooks
|
||||||
@ -304,18 +318,39 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
* <p>
|
* <p>
|
||||||
* Note that all packets are disabled by default.
|
* Note that all packets are disabled by default.
|
||||||
*
|
*
|
||||||
|
* @param listener - the listener that requested to enable these filters.
|
||||||
* @param side - which side the event will arrive from.
|
* @param side - which side the event will arrive from.
|
||||||
* @param packets - the packet id(s).
|
* @param packets - the packet id(s).
|
||||||
*/
|
*/
|
||||||
private void enablePacketFilters(ConnectionSide side, Iterable<Integer> packets) {
|
private void enablePacketFilters(PacketListener listener, ConnectionSide side, Iterable<Integer> packets) {
|
||||||
if (side == null)
|
if (side == null)
|
||||||
throw new IllegalArgumentException("side cannot be NULL.");
|
throw new IllegalArgumentException("side cannot be NULL.");
|
||||||
|
|
||||||
|
// Note the difference between unsupported and valid.
|
||||||
|
// Every packet ID between and including 0 - 255 is valid, but only a subset is supported.
|
||||||
|
|
||||||
for (int packetID : packets) {
|
for (int packetID : packets) {
|
||||||
if (side.isForServer())
|
// Only register server packets that are actually supported by Minecraft
|
||||||
playerInjection.addPacketHandler(packetID);
|
if (side.isForServer()) {
|
||||||
if (side.isForClient() && packetInjector != null)
|
if (serverPackets != null && serverPackets.contains(packetID))
|
||||||
packetInjector.addPacketHandler(packetID);
|
playerInjection.addPacketHandler(packetID);
|
||||||
|
else
|
||||||
|
logger.warning(String.format(
|
||||||
|
"[%s] Unsupported server packet ID in current Minecraft version: %s",
|
||||||
|
PacketAdapter.getPluginName(listener), packetID
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// As above, only for client packets
|
||||||
|
if (side.isForClient() && packetInjector != null) {
|
||||||
|
if (clientPackets != null && clientPackets.contains(packetID))
|
||||||
|
packetInjector.addPacketHandler(packetID);
|
||||||
|
else
|
||||||
|
logger.warning(String.format(
|
||||||
|
"[%s] Unsupported client packet ID in current Minecraft version: %s",
|
||||||
|
PacketAdapter.getPluginName(listener), packetID
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,18 +475,17 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
manager.registerEvents(new Listener() {
|
manager.registerEvents(new Listener() {
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
playerInjection.injectPlayer(event.getPlayer());
|
playerInjection.injectPlayer(event.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
playerInjection.uninjectPlayer(event.getPlayer());
|
playerInjection.uninjectPlayer(event.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onPluginDisabled(PluginDisableEvent event) {
|
public void onPluginDisabled(PluginDisableEvent event) {
|
||||||
// Clean up in case the plugin forgets
|
// Clean up in case the plugin forgets
|
||||||
if (event.getPlugin() != plugin) {
|
if (event.getPlugin() != plugin) {
|
||||||
@ -487,7 +521,7 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
Class eventPriority = loader.loadClass("org.bukkit.event.Event$Priority");
|
Class eventPriority = loader.loadClass("org.bukkit.event.Event$Priority");
|
||||||
|
|
||||||
// Get the priority
|
// Get the priority
|
||||||
Object priorityNormal = Enum.valueOf(eventPriority, "Highest");
|
Object priorityNormal = Enum.valueOf(eventPriority, "Monitor");
|
||||||
|
|
||||||
// Get event types
|
// Get event types
|
||||||
Object playerJoinType = Enum.valueOf(eventTypes, "PLAYER_JOIN");
|
Object playerJoinType = Enum.valueOf(eventTypes, "PLAYER_JOIN");
|
||||||
@ -561,6 +595,24 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve every known and supported server packet.
|
||||||
|
* @return An immutable set of every known server packet.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the server packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static Set<Integer> getServerPackets() throws FieldAccessException {
|
||||||
|
return MinecraftRegistry.getServerPackets();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve every known and supported client packet.
|
||||||
|
* @return An immutable set of every known client packet.
|
||||||
|
* @throws FieldAccessException If we're unable to retrieve the client packet data from Minecraft.
|
||||||
|
*/
|
||||||
|
public static Set<Integer> getClientPackets() throws FieldAccessException {
|
||||||
|
return MinecraftRegistry.getClientPackets();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the current plugin class loader.
|
* Retrieves the current plugin class loader.
|
||||||
* @return Class loader.
|
* @return Class loader.
|
||||||
@ -574,6 +626,9 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok
|
|||||||
return hasClosed;
|
return hasClosed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when ProtocolLib is closing.
|
||||||
|
*/
|
||||||
public void close() {
|
public void close() {
|
||||||
// Guard
|
// Guard
|
||||||
if (hasClosed)
|
if (hasClosed)
|
@ -117,6 +117,10 @@ class PacketInjector {
|
|||||||
Map<Class, Integer> registry = MinecraftRegistry.getPacketToID();
|
Map<Class, Integer> registry = MinecraftRegistry.getPacketToID();
|
||||||
Class old = MinecraftRegistry.getPacketClassFromID(packetID);
|
Class old = MinecraftRegistry.getPacketClassFromID(packetID);
|
||||||
|
|
||||||
|
// If this packet is not known
|
||||||
|
if (old == null) {
|
||||||
|
throw new IllegalStateException("Packet ID " + packetID + " is not a valid packet ID in this version.");
|
||||||
|
}
|
||||||
// Check for previous injections
|
// Check for previous injections
|
||||||
if (!old.getName().startsWith("net.minecraft.")) {
|
if (!old.getName().startsWith("net.minecraft.")) {
|
||||||
throw new IllegalStateException("Packet " + packetID + " has already been injected.");
|
throw new IllegalStateException("Packet " + packetID + " has already been injected.");
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector;
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector;
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
import com.comphenix.protocol.events.ListenerPriority;
|
import com.comphenix.protocol.events.ListenerPriority;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector;
|
package com.comphenix.protocol.injector;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.injector.player;
|
package com.comphenix.protocol.injector.player;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
@ -1,6 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect;
|
package com.comphenix.protocol.reflect;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import com.google.common.collect.BiMap;
|
import com.google.common.collect.BiMap;
|
||||||
import com.google.common.collect.HashBiMap;
|
import com.google.common.collect.HashBiMap;
|
||||||
@ -76,4 +94,12 @@ public class IntEnum {
|
|||||||
public String getDeclaredName(Integer id) {
|
public String getDeclaredName(Integer id) {
|
||||||
return members.get(id);
|
return members.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the ID of every registered member.
|
||||||
|
* @return Enumeration of every value.
|
||||||
|
*/
|
||||||
|
public Set<Integer> values() {
|
||||||
|
return members.keySet();
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect;
|
package com.comphenix.protocol.reflect;
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.compiler;
|
package com.comphenix.protocol.reflect.compiler;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.compiler;
|
package com.comphenix.protocol.reflect.compiler;
|
||||||
|
|
||||||
import net.sf.cglib.asm.*;
|
import net.sf.cglib.asm.*;
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.comphenix.protocol.reflect.compiler;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.reflect.StructureModifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to save the result of an compilation.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
* @param <TKey> - type of the structure modifier field.
|
||||||
|
*/
|
||||||
|
public interface CompileListener<TKey> {
|
||||||
|
/**
|
||||||
|
* Invoked when a structure modifier has been successfully compiled.
|
||||||
|
* @param compiledModifier - the compiled structure modifier.
|
||||||
|
*/
|
||||||
|
public void onCompiled(StructureModifier<TKey> compiledModifier);
|
||||||
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.compiler;
|
package com.comphenix.protocol.reflect.compiler;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.compiler;
|
package com.comphenix.protocol.reflect.compiler;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.compiler;
|
package com.comphenix.protocol.reflect.compiler;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.instances;
|
package com.comphenix.protocol.reflect.instances;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.instances;
|
package com.comphenix.protocol.reflect.instances;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.comphenix.protocol.reflect.instances;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a type generator for specific types.
|
||||||
|
*
|
||||||
|
* @author Kristian
|
||||||
|
*/
|
||||||
|
public interface InstanceProvider {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an instance given a type, if possible.
|
||||||
|
* @param type - type to create.
|
||||||
|
* @return The instance, or NULL if the type cannot be created.
|
||||||
|
*/
|
||||||
|
public abstract Object create(@Nullable Class<?> type);
|
||||||
|
}
|
@ -1,3 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* ProtocolLib - Bukkit server library that allows access to the Minecraft protocol.
|
||||||
|
* Copyright (C) 2012 Kristian S. Stangeland
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
package com.comphenix.protocol.reflect.instances;
|
package com.comphenix.protocol.reflect.instances;
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
@ -1,5 +1,5 @@
|
|||||||
name: ProtocolLib
|
name: ProtocolLib
|
||||||
version: 1.3.0
|
version: 1.3.1
|
||||||
description: Provides read/write access to the Minecraft protocol.
|
description: Provides read/write access to the Minecraft protocol.
|
||||||
author: Comphenix
|
author: Comphenix
|
||||||
website: http://www.comphenix.net/ProtocolLib
|
website: http://www.comphenix.net/ProtocolLib
|
In neuem Issue referenzieren
Einen Benutzer sperren