Initial commit
This commit is contained in:
3
Java/TextToSpeech/.idea/.gitignore
generated
vendored
Normal file
3
Java/TextToSpeech/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
6
Java/TextToSpeech/.idea/discord.xml
generated
Normal file
6
Java/TextToSpeech/.idea/discord.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="PROJECT_FILES" />
|
||||
</component>
|
||||
</project>
|
||||
9
Java/TextToSpeech/.idea/libraries/TextToSpeech_resourcepack.xml
generated
Normal file
9
Java/TextToSpeech/.idea/libraries/TextToSpeech_resourcepack.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
||||
<component name="libraryTable">
|
||||
<library name="TextToSpeech-resourcepack">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/TextToSpeech-resourcepack.zip!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
||||
11
Java/TextToSpeech/.idea/libraries/spigot_1_12_2.xml
generated
Normal file
11
Java/TextToSpeech/.idea/libraries/spigot_1_12_2.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<component name="libraryTable">
|
||||
<library name="spigot-1.12.2">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/../spigot-1.12.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$PROJECT_DIR$/../spigot-1.12.2.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
||||
11
Java/TextToSpeech/.idea/misc.xml
generated
Normal file
11
Java/TextToSpeech/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EntryPointsManager">
|
||||
<list size="1">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" />
|
||||
</list>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_16" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
8
Java/TextToSpeech/.idea/modules.xml
generated
Normal file
8
Java/TextToSpeech/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/TextToSpeech.iml" filepath="$PROJECT_DIR$/TextToSpeech.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
Java/TextToSpeech/.idea/vcs.xml
generated
Normal file
6
Java/TextToSpeech/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
339
Java/TextToSpeech/LICENSE
Normal file
339
Java/TextToSpeech/LICENSE
Normal file
@@ -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.
|
||||
339
Java/TextToSpeech/License.txt
Normal file
339
Java/TextToSpeech/License.txt
Normal file
@@ -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.
|
||||
2
Java/TextToSpeech/README.md
Normal file
2
Java/TextToSpeech/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# TextToSpeech
|
||||
A plugin which allows TTS for servers older than 1.12.
|
||||
BIN
Java/TextToSpeech/TextToSpeech-resourcepack.zip
Normal file
BIN
Java/TextToSpeech/TextToSpeech-resourcepack.zip
Normal file
Binary file not shown.
21
Java/TextToSpeech/TextToSpeech.iml
Normal file
21
Java/TextToSpeech/TextToSpeech.iml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="minecraft" name="Minecraft">
|
||||
<configuration>
|
||||
<autoDetectTypes>
|
||||
<platformType>SPIGOT</platformType>
|
||||
</autoDetectTypes>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="spigot-1.12.2" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
50
Java/TextToSpeech/changelog.txt
Normal file
50
Java/TextToSpeech/changelog.txt
Normal file
@@ -0,0 +1,50 @@
|
||||
Change Log
|
||||
Plugin: TextToSpeech
|
||||
1.0.11
|
||||
Added ability for players to read signs and books.
|
||||
Restructured code
|
||||
|
||||
1.0.10
|
||||
Updated updater
|
||||
Changed class locations
|
||||
Fixed speed configuration
|
||||
|
||||
1.0.9
|
||||
Made speech timing configurable
|
||||
|
||||
1.0.8
|
||||
Updated resouce link. Thanks bukkitdev!
|
||||
|
||||
1.0.7
|
||||
Updated updater
|
||||
|
||||
1.0.6
|
||||
Updated code for the new BukkitDev site
|
||||
Added changelog
|
||||
Updated updater
|
||||
|
||||
1.0.5
|
||||
Added transition sounds. The voice should not dip out during certain sounds (like X , Z ,or H)
|
||||
Added more words to the lang file
|
||||
Added support for words ending in "er".
|
||||
|
||||
1.0.4
|
||||
Added a lang file. If you want add new words, open the lang.txt file in the /plugins/TextToSpeech/ directory and add the word.
|
||||
Fixed resourecepack for 1.11
|
||||
Added some support for Italian.
|
||||
|
||||
1.0.3
|
||||
Added new resource pack prompt. Use /tts get to get the resourcepack.
|
||||
|
||||
1.0.2
|
||||
Fixed minor bugs.
|
||||
|
||||
1.0.1
|
||||
Added more words
|
||||
Fixed issue with error being thrown if you add an greater than sign ( > ) after setting the pitch (Now <test:8> will work)
|
||||
Fixed issue with pitch being reset if another player with a different pitch types anything into chat.
|
||||
|
||||
1.0.0
|
||||
Init post
|
||||
|
||||
|
||||
22
Java/TextToSpeech/plugin.yml
Normal file
22
Java/TextToSpeech/plugin.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
main: me.zombie_striker.tts.CoreTTS
|
||||
version: 1.0.11
|
||||
name: TextToSpeech
|
||||
commands:
|
||||
tts:
|
||||
description: text to speech
|
||||
aliases: [texttospeech]
|
||||
permissions:
|
||||
tts.*:
|
||||
description: Gives access to all TTS commands
|
||||
children:
|
||||
tts.create: true
|
||||
tts.join: true
|
||||
tts.kick: true
|
||||
tts.join:
|
||||
description: Allows you create PixelPrinter images
|
||||
tts.ban:
|
||||
description: Allows you create PixelPrinter images
|
||||
tts.create:
|
||||
description: Allows you create PixelPrinter images
|
||||
author:
|
||||
Zombie_Striker
|
||||
303
Java/TextToSpeech/src/me/zombie_striker/tts/CoreTTS.java
Normal file
303
Java/TextToSpeech/src/me/zombie_striker/tts/CoreTTS.java
Normal file
@@ -0,0 +1,303 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Zombie_Striker
|
||||
*
|
||||
* 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 me.zombie_striker.tts;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import me.zombie_striker.tts.data.*;
|
||||
import me.zombie_striker.tts.util.*;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.*;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class CoreTTS extends JavaPlugin implements Listener {
|
||||
public HashMap<StoreableStrings, Word> words = new HashMap<StoreableStrings, Word>();
|
||||
public HashMap<Long, PlayObject> map = new HashMap<Long, PlayObject>();
|
||||
HashMap<Long, Integer> mapP = new HashMap<Long, Integer>();
|
||||
|
||||
HashMap<String, List<UUID>> bannedG = new HashMap<String, List<UUID>>();
|
||||
|
||||
HashMap<UUID, String> groups = new HashMap<UUID, String>();
|
||||
HashMap<UUID, Integer> lType = new HashMap<UUID, Integer>();
|
||||
public HashMap<UUID, Integer> pitch = new HashMap<UUID, Integer>();
|
||||
|
||||
String prefix = ChatColor.RED + "[TTS]" + ChatColor.RESET;
|
||||
|
||||
// public static String RES = "https://dev.bukkit.org/media/files/956/355/TextToSpeech.zip";
|
||||
public static String RES = "https://dev.bukkit.org/projects/texttospeach/files/956355/download";
|
||||
|
||||
private long tick = 0;
|
||||
|
||||
private File langFile = null;
|
||||
|
||||
private int speed;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public void onEnable() {
|
||||
Bukkit.getPluginManager().registerEvents(this, this);
|
||||
|
||||
// Do it afterwords so words can be overwritten
|
||||
|
||||
try {
|
||||
langFile = new File(this.getDataFolder(), "lang.txt");
|
||||
LangFile.verify(langFile);
|
||||
|
||||
BufferedReader br = new BufferedReader(new FileReader(langFile));
|
||||
for (int i = 0; i < 2000; i++) {
|
||||
String word = br.readLine();
|
||||
if (word == null)
|
||||
break;
|
||||
if (word.trim().length() == 0)
|
||||
continue;
|
||||
if (word.trim().startsWith("+"))
|
||||
continue;
|
||||
|
||||
StoreableStrings ss = StoreableStrings.getStoreableString(word
|
||||
.split(" : ")[0].trim());
|
||||
|
||||
words.put(ss, new Word(word.split(" : ")[1].trim()));
|
||||
}
|
||||
br.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
initG(p);
|
||||
}
|
||||
for (String group : getConfig().getStringList("group.list")) {
|
||||
List<UUID> pp = new ArrayList<UUID>();
|
||||
bannedG.put(group, pp);
|
||||
for (String uuid : getConfig().getStringList(
|
||||
"group." + group + ".banned")) {
|
||||
pp.add(UUID.fromString(uuid));
|
||||
}
|
||||
}
|
||||
TTSCommand ttsc = new TTSCommand(this);
|
||||
getCommand("tts").setExecutor(ttsc);
|
||||
getCommand("tts").setTabCompleter(ttsc);
|
||||
|
||||
if(!getConfig().contains("SpeechDelay")){
|
||||
getConfig().set("SpeechDelay", 3);
|
||||
saveConfig();
|
||||
}
|
||||
speed = getConfig().getInt("SpeechDelay");
|
||||
|
||||
Bukkit.getScheduler().scheduleAsyncRepeatingTask(this, new Runnable() {
|
||||
public void run() {
|
||||
tick();
|
||||
if (!map.containsKey(getTick()))
|
||||
return;
|
||||
PlayObject po = map.get(getTick());
|
||||
if (po == null)
|
||||
return;
|
||||
Location locationOfVoice = po.locationOfVoice;
|
||||
for (UUID uuidS : groups.keySet()) {
|
||||
Player p = Bukkit.getPlayer(uuidS);
|
||||
|
||||
if ((po.sound.get(locationOfVoice) == null))
|
||||
System.out
|
||||
.println(" Owner is null. This should not be happening.");
|
||||
|
||||
if (p != null) {
|
||||
Location loc = null;
|
||||
if (lType.get(uuidS) == 1) {// local
|
||||
loc = locationOfVoice;
|
||||
// po.sound.get(owner).chars + "", 1, 0.5f +
|
||||
// ((float) po.pitch.get(owner) / 10));
|
||||
} else if (lType.get(uuidS) == 2) {// world
|
||||
if (locationOfVoice.getWorld().equals(p.getWorld()))
|
||||
loc = p.getLocation();
|
||||
// PlaySound.playSound(p, p.getLocation(),
|
||||
// po.sound.get(owner).chars + "", 1, 0.5f +
|
||||
// ((float) po.pitch.get(owner) / 10));
|
||||
} else if (lType.get(uuidS) == 3) {// global
|
||||
loc = p.getLocation();
|
||||
// PlaySound.playSound(p, p.getLocation(),
|
||||
// po.sound.get(owner).chars + "", 1, 0.5f +
|
||||
// ((float) po.pitch.get(owner) / 10));
|
||||
}
|
||||
if (loc != null) {
|
||||
p.playSound(
|
||||
locationOfVoice,
|
||||
po.sound.get(locationOfVoice).chars + "",
|
||||
3,
|
||||
0.5f + ((float) po.pitch.get(locationOfVoice) / 10));
|
||||
|
||||
if (map.containsKey(getTick()+1)) {
|
||||
PlayObject po2 = map.get(getTick() + 1);
|
||||
|
||||
if ((po2.sound.get(locationOfVoice) != null)) {
|
||||
int sP = po2.sound.get(locationOfVoice).pitch;
|
||||
String extSound = "";
|
||||
if(sP==0&&po.sound.get(locationOfVoice).pitch==0)extSound="xaa";
|
||||
if(sP==1&&po.sound.get(locationOfVoice).pitch==0)extSound="xab";
|
||||
if(sP==0&&po.sound.get(locationOfVoice).pitch==1)extSound="xba";
|
||||
|
||||
|
||||
p.playSound(locationOfVoice,
|
||||
extSound,
|
||||
3, 0.5f + ((float) po.pitch
|
||||
.get(locationOfVoice) / 10));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
map.remove(getTick());
|
||||
}
|
||||
}, 0, speed);
|
||||
|
||||
if (!getConfig().contains("auto-update")) {
|
||||
getConfig().set("auto-update", true);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
new Updater(this, 103001, getConfig().getBoolean("auto-update"));
|
||||
|
||||
// bStats metrics
|
||||
Metrics met = new Metrics(this);
|
||||
met.addCustomChart(new Metrics.SimplePie("updater-active") {
|
||||
@Override
|
||||
public String getValue() {
|
||||
return String.valueOf(getConfig().getBoolean("auto-update"));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
reloadConfig();
|
||||
LangFile.words = null;
|
||||
CoreTTS.RES = null;
|
||||
for (UUID k : groups.keySet()) {
|
||||
int l = lType.get(k);
|
||||
String g = groups.get(k);
|
||||
getConfig().set("users." + k.toString() + ".g", g);
|
||||
getConfig().set("users." + k.toString() + ".l", l);
|
||||
}
|
||||
for (String group : bannedG.keySet()) {
|
||||
List<String> ls = new ArrayList<String>();
|
||||
for (UUID uuid : bannedG.get(group)) {
|
||||
ls.add(uuid.toString());
|
||||
}
|
||||
getConfig().set("group." + group + ".banned", ls);
|
||||
}
|
||||
List<String> groups = new ArrayList<String>(bannedG.keySet());
|
||||
getConfig().set("group.list", groups);
|
||||
saveConfig();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(final PlayerJoinEvent e) {
|
||||
initG(e.getPlayer());
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
|
||||
public void run(){
|
||||
TalkUtil.speakOut("Text To Speech has been activated", e.getPlayer());
|
||||
}
|
||||
}, 10L);
|
||||
}
|
||||
@EventHandler
|
||||
public void onInteract(PlayerInteractEvent e){
|
||||
if(e.getClickedBlock()!=null){
|
||||
if(e.getClickedBlock().getType()==Material.WALL_SIGN||e.getClickedBlock().getType()==Material.SIGN_POST){
|
||||
Sign sign = (Sign)e.getClickedBlock().getState();
|
||||
String text = sign.getLine(0)+" . "+sign.getLine(1)+" . "+sign.getLine(2)+" . "+sign.getLine(3);
|
||||
TalkUtil.speakOut(text, e.getPlayer());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onChat(AsyncPlayerChatEvent e) {
|
||||
if (groups.get(e.getPlayer().getUniqueId()).equalsIgnoreCase("none"))
|
||||
return;
|
||||
|
||||
Pattern noRepeats = Pattern.compile(".*([a-z[A-Z[0-9]]])\\1{5,}.*");
|
||||
Matcher match = noRepeats.matcher(e.getMessage());
|
||||
boolean repeats = match.find();
|
||||
if (repeats) {
|
||||
e.getPlayer().sendMessage(
|
||||
prefix + "Do not mic spam. Voice over canceled.");
|
||||
return;
|
||||
}
|
||||
|
||||
String mF = e.getMessage();
|
||||
TalkUtil.speakOut(mF, e.getPlayer());
|
||||
}
|
||||
|
||||
public void initG(Player p) {
|
||||
if (!groups.containsKey(p.getUniqueId().toString())) {
|
||||
String group = getConfig().getString(
|
||||
"users." + p.getUniqueId().toString() + ".g");
|
||||
if (group == null || group.length() == 0) {
|
||||
getConfig().set("users." + p.getUniqueId().toString() + ".g",
|
||||
"none");
|
||||
saveConfig();
|
||||
groups.put(p.getUniqueId(), "none");
|
||||
group = "none";
|
||||
}
|
||||
groups.put(p.getUniqueId(), group);
|
||||
}
|
||||
if (!lType.containsKey(p.getUniqueId().toString())) {
|
||||
int l = getConfig().getInt(
|
||||
"users." + p.getUniqueId().toString() + ".t");
|
||||
if (l == 0 || l == -1) {
|
||||
int lt = 2;
|
||||
|
||||
getConfig().set("users." + p.getUniqueId().toString() + ".l",
|
||||
lt);
|
||||
saveConfig();
|
||||
lType.put(p.getUniqueId(), lt);
|
||||
l = lt;
|
||||
}
|
||||
lType.put(p.getUniqueId(), l);
|
||||
}
|
||||
if (!pitch.containsKey(p.getUniqueId().toString())) {
|
||||
int l = getConfig().getInt(
|
||||
"users." + p.getUniqueId().toString() + ".p");
|
||||
if (l == 0 || l == -1) {
|
||||
int pi = 6;
|
||||
|
||||
getConfig().set("users." + p.getUniqueId().toString() + ".p",
|
||||
pi);
|
||||
saveConfig();
|
||||
pitch.put(p.getUniqueId(), pi);
|
||||
l = pi;
|
||||
}
|
||||
pitch.put(p.getUniqueId(), l);
|
||||
}
|
||||
}
|
||||
|
||||
public void tick() {
|
||||
tick++;
|
||||
}
|
||||
|
||||
public long getTick() {
|
||||
return tick;
|
||||
}
|
||||
}
|
||||
916
Java/TextToSpeech/src/me/zombie_striker/tts/Metrics.java
Normal file
916
Java/TextToSpeech/src/me/zombie_striker/tts/Metrics.java
Normal file
@@ -0,0 +1,916 @@
|
||||
package me.zombie_striker.tts;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.URL;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
/**
|
||||
* bStats collects some data for plugin authors.
|
||||
*
|
||||
* Check out https://bStats.org/ to learn more about bStats!
|
||||
*/
|
||||
public class Metrics {
|
||||
|
||||
// The version of this bStats class
|
||||
public static final int B_STATS_VERSION = 1;
|
||||
|
||||
// The url to which the data is sent
|
||||
private static final String URL = "https://bStats.org/submitData";
|
||||
|
||||
// Should failed requests be logged?
|
||||
private static boolean logFailedRequests;
|
||||
|
||||
// The uuid of the server
|
||||
private static String serverUUID;
|
||||
|
||||
// The plugin
|
||||
private final JavaPlugin plugin;
|
||||
|
||||
// A list with all custom charts
|
||||
private final List<CustomChart> charts = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param plugin The plugin which stats should be submitted.
|
||||
*/
|
||||
public Metrics(JavaPlugin plugin) {
|
||||
if (plugin == null) {
|
||||
throw new IllegalArgumentException("Plugin cannot be null!");
|
||||
}
|
||||
this.plugin = plugin;
|
||||
|
||||
// Get the config file
|
||||
File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats");
|
||||
File configFile = new File(bStatsFolder, "config.yml");
|
||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
|
||||
|
||||
// Check if the config file exists
|
||||
if (!config.isSet("serverUuid")) {
|
||||
|
||||
// Add default values
|
||||
config.addDefault("enabled", true);
|
||||
// Every server gets it's unique random id.
|
||||
config.addDefault("serverUuid", UUID.randomUUID().toString());
|
||||
// Should failed request be logged?
|
||||
config.addDefault("logFailedRequests", false);
|
||||
|
||||
// Inform the server owners about bStats
|
||||
config.options().header(
|
||||
"bStats collects some data for plugin authors like how many servers are using their plugins.\n" +
|
||||
"To honor their work, you should not disable it.\n" +
|
||||
"This has nearly no effect on the server performance!\n" +
|
||||
"Check out https://bStats.org/ to learn more :)"
|
||||
).copyDefaults(true);
|
||||
try {
|
||||
config.save(configFile);
|
||||
} catch (IOException ignored) { }
|
||||
}
|
||||
|
||||
// Load the data
|
||||
serverUUID = config.getString("serverUuid");
|
||||
logFailedRequests = config.getBoolean("logFailedRequests", false);
|
||||
if (config.getBoolean("enabled", true)) {
|
||||
boolean found = false;
|
||||
// Search for all other bStats Metrics classes to see if we are the first one
|
||||
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
|
||||
try {
|
||||
service.getField("B_STATS_VERSION"); // Our identifier :)
|
||||
found = true; // We aren't the first
|
||||
break;
|
||||
} catch (NoSuchFieldException ignored) { }
|
||||
}
|
||||
// Register our service
|
||||
Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal);
|
||||
if (!found) {
|
||||
// We are the first!
|
||||
startSubmitting();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a custom chart.
|
||||
*
|
||||
* @param chart The chart to add.
|
||||
*/
|
||||
public void addCustomChart(CustomChart chart) {
|
||||
if (chart == null) {
|
||||
throw new IllegalArgumentException("Chart cannot be null!");
|
||||
}
|
||||
charts.add(chart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the Scheduler which submits our data every 30 minutes.
|
||||
*/
|
||||
private void startSubmitting() {
|
||||
final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags
|
||||
timer.scheduleAtFixedRate(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!plugin.isEnabled()) { // Plugin was disabled
|
||||
timer.cancel();
|
||||
return;
|
||||
}
|
||||
// Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler
|
||||
// Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;)
|
||||
Bukkit.getScheduler().runTask(plugin, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
submitData();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, 1000*60*5, 1000*60*30);
|
||||
// Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start
|
||||
// WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted!
|
||||
// WARNING: Just don't do it!
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the plugin specific data.
|
||||
* This method is called using Reflection.
|
||||
*
|
||||
* @return The plugin specific data.
|
||||
*/
|
||||
public JSONObject getPluginData() {
|
||||
JSONObject data = new JSONObject();
|
||||
|
||||
String pluginName = plugin.getDescription().getName();
|
||||
String pluginVersion = plugin.getDescription().getVersion();
|
||||
|
||||
data.put("pluginName", pluginName); // Append the name of the plugin
|
||||
data.put("pluginVersion", pluginVersion); // Append the version of the plugin
|
||||
JSONArray customCharts = new JSONArray();
|
||||
for (CustomChart customChart : charts) {
|
||||
// Add the data of the custom charts
|
||||
JSONObject chart = customChart.getRequestJsonObject();
|
||||
if (chart == null) { // If the chart is null, we skip it
|
||||
continue;
|
||||
}
|
||||
customCharts.add(chart);
|
||||
}
|
||||
data.put("customCharts", customCharts);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the server specific data.
|
||||
*
|
||||
* @return The server specific data.
|
||||
*/
|
||||
private JSONObject getServerData() {
|
||||
// Minecraft specific data
|
||||
int playerAmount = Bukkit.getOnlinePlayers().size();
|
||||
int onlineMode = Bukkit.getOnlineMode() ? 1 : 0;
|
||||
String bukkitVersion = org.bukkit.Bukkit.getVersion();
|
||||
bukkitVersion = bukkitVersion.substring(bukkitVersion.indexOf("MC: ") + 4, bukkitVersion.length() - 1);
|
||||
|
||||
// OS/Java specific data
|
||||
String javaVersion = System.getProperty("java.version");
|
||||
String osName = System.getProperty("os.name");
|
||||
String osArch = System.getProperty("os.arch");
|
||||
String osVersion = System.getProperty("os.version");
|
||||
int coreCount = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
|
||||
data.put("serverUUID", serverUUID);
|
||||
|
||||
data.put("playerAmount", playerAmount);
|
||||
data.put("onlineMode", onlineMode);
|
||||
data.put("bukkitVersion", bukkitVersion);
|
||||
|
||||
data.put("javaVersion", javaVersion);
|
||||
data.put("osName", osName);
|
||||
data.put("osArch", osArch);
|
||||
data.put("osVersion", osVersion);
|
||||
data.put("coreCount", coreCount);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collects the data and sends it afterwards.
|
||||
*/
|
||||
private void submitData() {
|
||||
final JSONObject data = getServerData();
|
||||
|
||||
JSONArray pluginData = new JSONArray();
|
||||
// Search for all other bStats Metrics classes to get their plugin data
|
||||
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
|
||||
try {
|
||||
service.getField("B_STATS_VERSION"); // Our identifier :)
|
||||
} catch (NoSuchFieldException ignored) {
|
||||
continue; // Continue "searching"
|
||||
}
|
||||
// Found one!
|
||||
try {
|
||||
pluginData.add(service.getMethod("getPluginData").invoke(Bukkit.getServicesManager().load(service)));
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { }
|
||||
}
|
||||
|
||||
data.put("plugins", pluginData);
|
||||
|
||||
// Create a new thread for the connection to the bStats server
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
// Send the data
|
||||
sendData(data);
|
||||
} catch (Exception e) {
|
||||
// Something went wrong! :(
|
||||
if (logFailedRequests) {
|
||||
plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the data to the bStats server.
|
||||
*
|
||||
* @param data The data to send.
|
||||
* @throws Exception If the request failed.
|
||||
*/
|
||||
private static void sendData(JSONObject data) throws Exception {
|
||||
if (data == null) {
|
||||
throw new IllegalArgumentException("Data cannot be null!");
|
||||
}
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
throw new IllegalAccessException("This method must not be called from the main thread!");
|
||||
}
|
||||
HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection();
|
||||
|
||||
// Compress the data to save bandwidth
|
||||
byte[] compressedData = compress(data.toString());
|
||||
|
||||
// Add headers
|
||||
connection.setRequestMethod("POST");
|
||||
connection.addRequestProperty("Accept", "application/json");
|
||||
connection.addRequestProperty("Connection", "close");
|
||||
connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request
|
||||
connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
|
||||
connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format
|
||||
connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION);
|
||||
|
||||
// Send data
|
||||
connection.setDoOutput(true);
|
||||
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
|
||||
outputStream.write(compressedData);
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
|
||||
connection.getInputStream().close(); // We don't care about the response - Just send our data :)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gzips the given String.
|
||||
*
|
||||
* @param str The string to gzip.
|
||||
* @return The gzipped String.
|
||||
* @throws IOException If the compression failed.
|
||||
*/
|
||||
private static byte[] compress(final String str) throws IOException {
|
||||
if (str == null) {
|
||||
return null;
|
||||
}
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
GZIPOutputStream gzip = new GZIPOutputStream(outputStream);
|
||||
gzip.write(str.getBytes("UTF-8"));
|
||||
gzip.close();
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom chart.
|
||||
*/
|
||||
public static abstract class CustomChart {
|
||||
|
||||
// The id of the chart
|
||||
protected final String chartId;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public CustomChart(String chartId) {
|
||||
if (chartId == null || chartId.isEmpty()) {
|
||||
throw new IllegalArgumentException("ChartId cannot be null or empty!");
|
||||
}
|
||||
this.chartId = chartId;
|
||||
}
|
||||
|
||||
protected JSONObject getRequestJsonObject() {
|
||||
JSONObject chart = new JSONObject();
|
||||
chart.put("chartId", chartId);
|
||||
try {
|
||||
JSONObject data = getChartData();
|
||||
if (data == null) {
|
||||
// If the data is null we don't send the chart.
|
||||
return null;
|
||||
}
|
||||
chart.put("data", data);
|
||||
} catch (Throwable t) {
|
||||
if (logFailedRequests) {
|
||||
Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return chart;
|
||||
}
|
||||
|
||||
protected abstract JSONObject getChartData();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom simple pie.
|
||||
*/
|
||||
public static abstract class SimplePie extends CustomChart {
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public SimplePie(String chartId) {
|
||||
super(chartId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of the pie.
|
||||
*
|
||||
* @return The value of the pie.
|
||||
*/
|
||||
public abstract String getValue();
|
||||
|
||||
@Override
|
||||
protected JSONObject getChartData() {
|
||||
JSONObject data = new JSONObject();
|
||||
String value = getValue();
|
||||
if (value == null || value.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.put("value", value);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom advanced pie.
|
||||
*/
|
||||
public static abstract class AdvancedPie extends CustomChart {
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public AdvancedPie(String chartId) {
|
||||
super(chartId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the values of the pie.
|
||||
*
|
||||
* @param valueMap Just an empty map. The only reason it exists is to make your life easier.
|
||||
* You don't have to create a map yourself!
|
||||
* @return The values of the pie.
|
||||
*/
|
||||
public abstract HashMap<String, Integer> getValues(HashMap<String, Integer> valueMap);
|
||||
|
||||
@Override
|
||||
protected JSONObject getChartData() {
|
||||
JSONObject data = new JSONObject();
|
||||
JSONObject values = new JSONObject();
|
||||
HashMap<String, Integer> map = getValues(new HashMap<String, Integer>());
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<String, Integer> entry : map.entrySet()) {
|
||||
if (entry.getValue() == 0) {
|
||||
continue; // Skip this invalid
|
||||
}
|
||||
allSkipped = false;
|
||||
values.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
if (allSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.put("values", values);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom single line chart.
|
||||
*/
|
||||
public static abstract class SingleLineChart extends CustomChart {
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public SingleLineChart(String chartId) {
|
||||
super(chartId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of the chart.
|
||||
*
|
||||
* @return The value of the chart.
|
||||
*/
|
||||
public abstract int getValue();
|
||||
|
||||
@Override
|
||||
protected JSONObject getChartData() {
|
||||
JSONObject data = new JSONObject();
|
||||
int value = getValue();
|
||||
if (value == 0) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.put("value", value);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom multi line chart.
|
||||
*/
|
||||
public static abstract class MultiLineChart extends CustomChart {
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public MultiLineChart(String chartId) {
|
||||
super(chartId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the values of the chart.
|
||||
*
|
||||
* @param valueMap Just an empty map. The only reason it exists is to make your life easier.
|
||||
* You don't have to create a map yourself!
|
||||
* @return The values of the chart.
|
||||
*/
|
||||
public abstract HashMap<String, Integer> getValues(HashMap<String, Integer> valueMap);
|
||||
|
||||
@Override
|
||||
protected JSONObject getChartData() {
|
||||
JSONObject data = new JSONObject();
|
||||
JSONObject values = new JSONObject();
|
||||
HashMap<String, Integer> map = getValues(new HashMap<String, Integer>());
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<String, Integer> entry : map.entrySet()) {
|
||||
if (entry.getValue() == 0) {
|
||||
continue; // Skip this invalid
|
||||
}
|
||||
allSkipped = false;
|
||||
values.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
if (allSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.put("values", values);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom simple map chart.
|
||||
*/
|
||||
public static abstract class SimpleMapChart extends CustomChart {
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public SimpleMapChart(String chartId) {
|
||||
super(chartId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of the chart.
|
||||
*
|
||||
* @return The value of the chart.
|
||||
*/
|
||||
public abstract Country getValue();
|
||||
|
||||
@Override
|
||||
protected JSONObject getChartData() {
|
||||
JSONObject data = new JSONObject();
|
||||
Country value = getValue();
|
||||
|
||||
if (value == null) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.put("value", value.getCountryIsoTag());
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom advanced map chart.
|
||||
*/
|
||||
public static abstract class AdvancedMapChart extends CustomChart {
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param chartId The id of the chart.
|
||||
*/
|
||||
public AdvancedMapChart(String chartId) {
|
||||
super(chartId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of the chart.
|
||||
*
|
||||
* @param valueMap Just an empty map. The only reason it exists is to make your life easier.
|
||||
* You don't have to create a map yourself!
|
||||
* @return The value of the chart.
|
||||
*/
|
||||
public abstract HashMap<Country, Integer> getValues(HashMap<Country, Integer> valueMap);
|
||||
|
||||
@Override
|
||||
protected JSONObject getChartData() {
|
||||
JSONObject data = new JSONObject();
|
||||
JSONObject values = new JSONObject();
|
||||
HashMap<Country, Integer> map = getValues(new HashMap<Country, Integer>());
|
||||
if (map == null || map.isEmpty()) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
boolean allSkipped = true;
|
||||
for (Map.Entry<Country, Integer> entry : map.entrySet()) {
|
||||
if (entry.getValue() == 0) {
|
||||
continue; // Skip this invalid
|
||||
}
|
||||
allSkipped = false;
|
||||
values.put(entry.getKey().getCountryIsoTag(), entry.getValue());
|
||||
}
|
||||
if (allSkipped) {
|
||||
// Null = skip the chart
|
||||
return null;
|
||||
}
|
||||
data.put("values", values);
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A enum which is used for custom maps.
|
||||
*/
|
||||
public enum Country {
|
||||
|
||||
/**
|
||||
* bStats will use the country of the server.
|
||||
*/
|
||||
AUTO_DETECT("AUTO", "Auto Detected"),
|
||||
|
||||
ANDORRA("AD", "Andorra"),
|
||||
UNITED_ARAB_EMIRATES("AE", "United Arab Emirates"),
|
||||
AFGHANISTAN("AF", "Afghanistan"),
|
||||
ANTIGUA_AND_BARBUDA("AG", "Antigua and Barbuda"),
|
||||
ANGUILLA("AI", "Anguilla"),
|
||||
ALBANIA("AL", "Albania"),
|
||||
ARMENIA("AM", "Armenia"),
|
||||
NETHERLANDS_ANTILLES("AN", "Netherlands Antilles"),
|
||||
ANGOLA("AO", "Angola"),
|
||||
ANTARCTICA("AQ", "Antarctica"),
|
||||
ARGENTINA("AR", "Argentina"),
|
||||
AMERICAN_SAMOA("AS", "American Samoa"),
|
||||
AUSTRIA("AT", "Austria"),
|
||||
AUSTRALIA("AU", "Australia"),
|
||||
ARUBA("AW", "Aruba"),
|
||||
ÃLAND_ISLANDS("AX", "Ã…land Islands"),
|
||||
AZERBAIJAN("AZ", "Azerbaijan"),
|
||||
BOSNIA_AND_HERZEGOVINA("BA", "Bosnia and Herzegovina"),
|
||||
BARBADOS("BB", "Barbados"),
|
||||
BANGLADESH("BD", "Bangladesh"),
|
||||
BELGIUM("BE", "Belgium"),
|
||||
BURKINA_FASO("BF", "Burkina Faso"),
|
||||
BULGARIA("BG", "Bulgaria"),
|
||||
BAHRAIN("BH", "Bahrain"),
|
||||
BURUNDI("BI", "Burundi"),
|
||||
BENIN("BJ", "Benin"),
|
||||
SAINT_BARTHÃLEMY("BL", "Saint Barthélemy"),
|
||||
BERMUDA("BM", "Bermuda"),
|
||||
BRUNEI("BN", "Brunei"),
|
||||
BOLIVIA("BO", "Bolivia"),
|
||||
BONAIRE_SINT_EUSTATIUS_AND_SABA("BQ", "Bonaire, Sint Eustatius and Saba"),
|
||||
BRAZIL("BR", "Brazil"),
|
||||
BAHAMAS("BS", "Bahamas"),
|
||||
BHUTAN("BT", "Bhutan"),
|
||||
BOUVET_ISLAND("BV", "Bouvet Island"),
|
||||
BOTSWANA("BW", "Botswana"),
|
||||
BELARUS("BY", "Belarus"),
|
||||
BELIZE("BZ", "Belize"),
|
||||
CANADA("CA", "Canada"),
|
||||
COCOS_ISLANDS("CC", "Cocos Islands"),
|
||||
THE_DEMOCRATIC_REPUBLIC_OF_CONGO("CD", "The Democratic Republic Of Congo"),
|
||||
CENTRAL_AFRICAN_REPUBLIC("CF", "Central African Republic"),
|
||||
CONGO("CG", "Congo"),
|
||||
SWITZERLAND("CH", "Switzerland"),
|
||||
CTE_D_IVOIRE("CI", "Côte d'Ivoire"),
|
||||
COOK_ISLANDS("CK", "Cook Islands"),
|
||||
CHILE("CL", "Chile"),
|
||||
CAMEROON("CM", "Cameroon"),
|
||||
CHINA("CN", "China"),
|
||||
COLOMBIA("CO", "Colombia"),
|
||||
COSTA_RICA("CR", "Costa Rica"),
|
||||
CUBA("CU", "Cuba"),
|
||||
CAPE_VERDE("CV", "Cape Verde"),
|
||||
CURAÃAO("CW", "Curaçao"),
|
||||
CHRISTMAS_ISLAND("CX", "Christmas Island"),
|
||||
CYPRUS("CY", "Cyprus"),
|
||||
CZECH_REPUBLIC("CZ", "Czech Republic"),
|
||||
GERMANY("DE", "Germany"),
|
||||
DJIBOUTI("DJ", "Djibouti"),
|
||||
DENMARK("DK", "Denmark"),
|
||||
DOMINICA("DM", "Dominica"),
|
||||
DOMINICAN_REPUBLIC("DO", "Dominican Republic"),
|
||||
ALGERIA("DZ", "Algeria"),
|
||||
ECUADOR("EC", "Ecuador"),
|
||||
ESTONIA("EE", "Estonia"),
|
||||
EGYPT("EG", "Egypt"),
|
||||
WESTERN_SAHARA("EH", "Western Sahara"),
|
||||
ERITREA("ER", "Eritrea"),
|
||||
SPAIN("ES", "Spain"),
|
||||
ETHIOPIA("ET", "Ethiopia"),
|
||||
FINLAND("FI", "Finland"),
|
||||
FIJI("FJ", "Fiji"),
|
||||
FALKLAND_ISLANDS("FK", "Falkland Islands"),
|
||||
MICRONESIA("FM", "Micronesia"),
|
||||
FAROE_ISLANDS("FO", "Faroe Islands"),
|
||||
FRANCE("FR", "France"),
|
||||
GABON("GA", "Gabon"),
|
||||
UNITED_KINGDOM("GB", "United Kingdom"),
|
||||
GRENADA("GD", "Grenada"),
|
||||
GEORGIA("GE", "Georgia"),
|
||||
FRENCH_GUIANA("GF", "French Guiana"),
|
||||
GUERNSEY("GG", "Guernsey"),
|
||||
GHANA("GH", "Ghana"),
|
||||
GIBRALTAR("GI", "Gibraltar"),
|
||||
GREENLAND("GL", "Greenland"),
|
||||
GAMBIA("GM", "Gambia"),
|
||||
GUINEA("GN", "Guinea"),
|
||||
GUADELOUPE("GP", "Guadeloupe"),
|
||||
EQUATORIAL_GUINEA("GQ", "Equatorial Guinea"),
|
||||
GREECE("GR", "Greece"),
|
||||
SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS("GS", "South Georgia And The South Sandwich Islands"),
|
||||
GUATEMALA("GT", "Guatemala"),
|
||||
GUAM("GU", "Guam"),
|
||||
GUINEA_BISSAU("GW", "Guinea-Bissau"),
|
||||
GUYANA("GY", "Guyana"),
|
||||
HONG_KONG("HK", "Hong Kong"),
|
||||
HEARD_ISLAND_AND_MCDONALD_ISLANDS("HM", "Heard Island And McDonald Islands"),
|
||||
HONDURAS("HN", "Honduras"),
|
||||
CROATIA("HR", "Croatia"),
|
||||
HAITI("HT", "Haiti"),
|
||||
HUNGARY("HU", "Hungary"),
|
||||
INDONESIA("ID", "Indonesia"),
|
||||
IRELAND("IE", "Ireland"),
|
||||
ISRAEL("IL", "Israel"),
|
||||
ISLE_OF_MAN("IM", "Isle Of Man"),
|
||||
INDIA("IN", "India"),
|
||||
BRITISH_INDIAN_OCEAN_TERRITORY("IO", "British Indian Ocean Territory"),
|
||||
IRAQ("IQ", "Iraq"),
|
||||
IRAN("IR", "Iran"),
|
||||
ICELAND("IS", "Iceland"),
|
||||
ITALY("IT", "Italy"),
|
||||
JERSEY("JE", "Jersey"),
|
||||
JAMAICA("JM", "Jamaica"),
|
||||
JORDAN("JO", "Jordan"),
|
||||
JAPAN("JP", "Japan"),
|
||||
KENYA("KE", "Kenya"),
|
||||
KYRGYZSTAN("KG", "Kyrgyzstan"),
|
||||
CAMBODIA("KH", "Cambodia"),
|
||||
KIRIBATI("KI", "Kiribati"),
|
||||
COMOROS("KM", "Comoros"),
|
||||
SAINT_KITTS_AND_NEVIS("KN", "Saint Kitts And Nevis"),
|
||||
NORTH_KOREA("KP", "North Korea"),
|
||||
SOUTH_KOREA("KR", "South Korea"),
|
||||
KUWAIT("KW", "Kuwait"),
|
||||
CAYMAN_ISLANDS("KY", "Cayman Islands"),
|
||||
KAZAKHSTAN("KZ", "Kazakhstan"),
|
||||
LAOS("LA", "Laos"),
|
||||
LEBANON("LB", "Lebanon"),
|
||||
SAINT_LUCIA("LC", "Saint Lucia"),
|
||||
LIECHTENSTEIN("LI", "Liechtenstein"),
|
||||
SRI_LANKA("LK", "Sri Lanka"),
|
||||
LIBERIA("LR", "Liberia"),
|
||||
LESOTHO("LS", "Lesotho"),
|
||||
LITHUANIA("LT", "Lithuania"),
|
||||
LUXEMBOURG("LU", "Luxembourg"),
|
||||
LATVIA("LV", "Latvia"),
|
||||
LIBYA("LY", "Libya"),
|
||||
MOROCCO("MA", "Morocco"),
|
||||
MONACO("MC", "Monaco"),
|
||||
MOLDOVA("MD", "Moldova"),
|
||||
MONTENEGRO("ME", "Montenegro"),
|
||||
SAINT_MARTIN("MF", "Saint Martin"),
|
||||
MADAGASCAR("MG", "Madagascar"),
|
||||
MARSHALL_ISLANDS("MH", "Marshall Islands"),
|
||||
MACEDONIA("MK", "Macedonia"),
|
||||
MALI("ML", "Mali"),
|
||||
MYANMAR("MM", "Myanmar"),
|
||||
MONGOLIA("MN", "Mongolia"),
|
||||
MACAO("MO", "Macao"),
|
||||
NORTHERN_MARIANA_ISLANDS("MP", "Northern Mariana Islands"),
|
||||
MARTINIQUE("MQ", "Martinique"),
|
||||
MAURITANIA("MR", "Mauritania"),
|
||||
MONTSERRAT("MS", "Montserrat"),
|
||||
MALTA("MT", "Malta"),
|
||||
MAURITIUS("MU", "Mauritius"),
|
||||
MALDIVES("MV", "Maldives"),
|
||||
MALAWI("MW", "Malawi"),
|
||||
MEXICO("MX", "Mexico"),
|
||||
MALAYSIA("MY", "Malaysia"),
|
||||
MOZAMBIQUE("MZ", "Mozambique"),
|
||||
NAMIBIA("NA", "Namibia"),
|
||||
NEW_CALEDONIA("NC", "New Caledonia"),
|
||||
NIGER("NE", "Niger"),
|
||||
NORFOLK_ISLAND("NF", "Norfolk Island"),
|
||||
NIGERIA("NG", "Nigeria"),
|
||||
NICARAGUA("NI", "Nicaragua"),
|
||||
NETHERLANDS("NL", "Netherlands"),
|
||||
NORWAY("NO", "Norway"),
|
||||
NEPAL("NP", "Nepal"),
|
||||
NAURU("NR", "Nauru"),
|
||||
NIUE("NU", "Niue"),
|
||||
NEW_ZEALAND("NZ", "New Zealand"),
|
||||
OMAN("OM", "Oman"),
|
||||
PANAMA("PA", "Panama"),
|
||||
PERU("PE", "Peru"),
|
||||
FRENCH_POLYNESIA("PF", "French Polynesia"),
|
||||
PAPUA_NEW_GUINEA("PG", "Papua New Guinea"),
|
||||
PHILIPPINES("PH", "Philippines"),
|
||||
PAKISTAN("PK", "Pakistan"),
|
||||
POLAND("PL", "Poland"),
|
||||
SAINT_PIERRE_AND_MIQUELON("PM", "Saint Pierre And Miquelon"),
|
||||
PITCAIRN("PN", "Pitcairn"),
|
||||
PUERTO_RICO("PR", "Puerto Rico"),
|
||||
PALESTINE("PS", "Palestine"),
|
||||
PORTUGAL("PT", "Portugal"),
|
||||
PALAU("PW", "Palau"),
|
||||
PARAGUAY("PY", "Paraguay"),
|
||||
QATAR("QA", "Qatar"),
|
||||
REUNION("RE", "Reunion"),
|
||||
ROMANIA("RO", "Romania"),
|
||||
SERBIA("RS", "Serbia"),
|
||||
RUSSIA("RU", "Russia"),
|
||||
RWANDA("RW", "Rwanda"),
|
||||
SAUDI_ARABIA("SA", "Saudi Arabia"),
|
||||
SOLOMON_ISLANDS("SB", "Solomon Islands"),
|
||||
SEYCHELLES("SC", "Seychelles"),
|
||||
SUDAN("SD", "Sudan"),
|
||||
SWEDEN("SE", "Sweden"),
|
||||
SINGAPORE("SG", "Singapore"),
|
||||
SAINT_HELENA("SH", "Saint Helena"),
|
||||
SLOVENIA("SI", "Slovenia"),
|
||||
SVALBARD_AND_JAN_MAYEN("SJ", "Svalbard And Jan Mayen"),
|
||||
SLOVAKIA("SK", "Slovakia"),
|
||||
SIERRA_LEONE("SL", "Sierra Leone"),
|
||||
SAN_MARINO("SM", "San Marino"),
|
||||
SENEGAL("SN", "Senegal"),
|
||||
SOMALIA("SO", "Somalia"),
|
||||
SURINAME("SR", "Suriname"),
|
||||
SOUTH_SUDAN("SS", "South Sudan"),
|
||||
SAO_TOME_AND_PRINCIPE("ST", "Sao Tome And Principe"),
|
||||
EL_SALVADOR("SV", "El Salvador"),
|
||||
SINT_MAARTEN_DUTCH_PART("SX", "Sint Maarten (Dutch part)"),
|
||||
SYRIA("SY", "Syria"),
|
||||
SWAZILAND("SZ", "Swaziland"),
|
||||
TURKS_AND_CAICOS_ISLANDS("TC", "Turks And Caicos Islands"),
|
||||
CHAD("TD", "Chad"),
|
||||
FRENCH_SOUTHERN_TERRITORIES("TF", "French Southern Territories"),
|
||||
TOGO("TG", "Togo"),
|
||||
THAILAND("TH", "Thailand"),
|
||||
TAJIKISTAN("TJ", "Tajikistan"),
|
||||
TOKELAU("TK", "Tokelau"),
|
||||
TIMOR_LESTE("TL", "Timor-Leste"),
|
||||
TURKMENISTAN("TM", "Turkmenistan"),
|
||||
TUNISIA("TN", "Tunisia"),
|
||||
TONGA("TO", "Tonga"),
|
||||
TURKEY("TR", "Turkey"),
|
||||
TRINIDAD_AND_TOBAGO("TT", "Trinidad and Tobago"),
|
||||
TUVALU("TV", "Tuvalu"),
|
||||
TAIWAN("TW", "Taiwan"),
|
||||
TANZANIA("TZ", "Tanzania"),
|
||||
UKRAINE("UA", "Ukraine"),
|
||||
UGANDA("UG", "Uganda"),
|
||||
UNITED_STATES_MINOR_OUTLYING_ISLANDS("UM", "United States Minor Outlying Islands"),
|
||||
UNITED_STATES("US", "United States"),
|
||||
URUGUAY("UY", "Uruguay"),
|
||||
UZBEKISTAN("UZ", "Uzbekistan"),
|
||||
VATICAN("VA", "Vatican"),
|
||||
SAINT_VINCENT_AND_THE_GRENADINES("VC", "Saint Vincent And The Grenadines"),
|
||||
VENEZUELA("VE", "Venezuela"),
|
||||
BRITISH_VIRGIN_ISLANDS("VG", "British Virgin Islands"),
|
||||
U_S__VIRGIN_ISLANDS("VI", "U.S. Virgin Islands"),
|
||||
VIETNAM("VN", "Vietnam"),
|
||||
VANUATU("VU", "Vanuatu"),
|
||||
WALLIS_AND_FUTUNA("WF", "Wallis And Futuna"),
|
||||
SAMOA("WS", "Samoa"),
|
||||
YEMEN("YE", "Yemen"),
|
||||
MAYOTTE("YT", "Mayotte"),
|
||||
SOUTH_AFRICA("ZA", "South Africa"),
|
||||
ZAMBIA("ZM", "Zambia"),
|
||||
ZIMBABWE("ZW", "Zimbabwe");
|
||||
|
||||
private String isoTag;
|
||||
private String name;
|
||||
|
||||
Country(String isoTag, String name) {
|
||||
this.isoTag = isoTag;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name of the country.
|
||||
*
|
||||
* @return The name of the country.
|
||||
*/
|
||||
public String getCountryName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the iso tag of the country.
|
||||
*
|
||||
* @return The iso tag of the country.
|
||||
*/
|
||||
public String getCountryIsoTag() {
|
||||
return isoTag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a country by it's iso tag.
|
||||
*
|
||||
* @param isoTag The iso tag of the county.
|
||||
* @return The country with the given iso tag or <code>null</code> if unknown.
|
||||
*/
|
||||
public static Country byIsoTag(String isoTag) {
|
||||
for (Country country : Country.values()) {
|
||||
if (country.getCountryIsoTag().equals(isoTag)) {
|
||||
return country;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a country by a locale.
|
||||
*
|
||||
* @param locale The locale.
|
||||
* @return The country from the giben locale or <code>null</code> if unknown country or
|
||||
* if the locale does not contain a country.
|
||||
*/
|
||||
public static Country byLocale(Locale locale) {
|
||||
return byIsoTag(locale.getCountry());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
59
Java/TextToSpeech/src/me/zombie_striker/tts/PlaySound.java
Normal file
59
Java/TextToSpeech/src/me/zombie_striker/tts/PlaySound.java
Normal file
@@ -0,0 +1,59 @@
|
||||
package me.zombie_striker.tts;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
public class PlaySound {
|
||||
|
||||
// private final static Class<?> CRAFTPLAYERCLASS = ReflectionUtil
|
||||
// .getCraftbukkitClass("CraftPlayer", "entity");
|
||||
// private static final Class<?> PACKET_PLAY_OUT_NAMED_SOUND = /*ReflectionUtil
|
||||
// .isVersionHigherThan(1, 7) ?*/ReflectionUtil
|
||||
// .getNMSClass("PacketPlayOutNamedSoundEffect")/*: ReflectionUtil
|
||||
// .getNMSClass("Packet201PlayerInfo")*/;
|
||||
// private static final Class<?> MINECRAFT_KEY = ReflectionUtil
|
||||
// .getNMSClass("MinecraftKey");
|
||||
// private static final Class<?> SOUND_EFFECT = ReflectionUtil
|
||||
// .getNMSClass("SoundEffect");
|
||||
// private static final Class<?> PACKET_CLASS = ReflectionUtil
|
||||
// .getNMSClass("Packet");
|
||||
|
||||
public static void playSound(Player p, Location l, String sound, float vol, float pitch){
|
||||
// PacketPlayOutNamedSoundEffect packet = new PacketPlayOutNamedSoundEffect(new SoundEffect(new MinecraftKey(sound)), SoundCategory.VOICE, l.getX(), l.getY(), l.getZ(), vol, pitch);
|
||||
/*Object packet = ReflectionUtil
|
||||
.instantiate((Constructor<?>) ReflectionUtil
|
||||
.getConstructor(PACKET_PLAY_OUT_NAMED_SOUND)
|
||||
.get());
|
||||
|
||||
try {
|
||||
Object mckey = ReflectionUtil.instantiate((Constructor<?>) ReflectionUtil
|
||||
.getConstructor(MINECRAFT_KEY)
|
||||
.get());
|
||||
ReflectionUtil.setInstanceField(mckey, "a", sound);
|
||||
|
||||
Object sf = ReflectionUtil.instantiate((Constructor<?>) ReflectionUtil
|
||||
.getConstructor(SOUND_EFFECT)
|
||||
.get());
|
||||
ReflectionUtil.setInstanceField(sf, "a", mckey);*
|
||||
|
||||
ReflectionUtil.setInstanceField(packet, "a", sf);
|
||||
ReflectionUtil.setInstanceField(packet, "b", 1);
|
||||
ReflectionUtil.setInstanceField(packet, "c", l.getBlockX()*32);
|
||||
ReflectionUtil.setInstanceField(packet, "d", l.getBlockY()*32);
|
||||
ReflectionUtil.setInstanceField(packet, "e", l.getBlockZ()*32);
|
||||
ReflectionUtil.setInstanceField(packet, "f", vol);
|
||||
ReflectionUtil.setInstanceField(packet, "g", pitch);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}*/
|
||||
|
||||
// Object handle = ReflectionUtil.invokeMethod(
|
||||
// CRAFTPLAYERCLASS.cast(p), "getHandle", null);
|
||||
// Object playerConnection = ReflectionUtil.getInstanceField(handle,
|
||||
// "playerConnection");
|
||||
// ReflectionUtil.invokeMethod(playerConnection, "sendPacket",
|
||||
// new Class[] { PACKET_CLASS }, packet);
|
||||
|
||||
}
|
||||
}
|
||||
308
Java/TextToSpeech/src/me/zombie_striker/tts/ReflectionUtil.java
Normal file
308
Java/TextToSpeech/src/me/zombie_striker/tts/ReflectionUtil.java
Normal file
@@ -0,0 +1,308 @@
|
||||
package me.zombie_striker.tts;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
/**
|
||||
* A small help with reflection
|
||||
*/
|
||||
public class ReflectionUtil {
|
||||
private static final String SERVER_VERSION;
|
||||
|
||||
|
||||
static {
|
||||
String name = Bukkit.getServer().getClass().getName();
|
||||
name = name.substring(name.indexOf("craftbukkit.")
|
||||
+ "craftbukkit.".length());
|
||||
name = name.substring(0, name.indexOf("."));
|
||||
SERVER_VERSION = name;
|
||||
}
|
||||
public static boolean isVersionHigherThan(int mainVersion,
|
||||
int secondVersion) {
|
||||
String firstChar = SERVER_VERSION.substring(1, 2);
|
||||
int fInt = Integer.parseInt(firstChar);
|
||||
if (fInt < mainVersion)
|
||||
return false;
|
||||
StringBuilder secondChar = new StringBuilder();
|
||||
for (int i = 3; i < 10; i++) {
|
||||
if (SERVER_VERSION.charAt(i) == '_'
|
||||
|| SERVER_VERSION.charAt(i) == '.')
|
||||
break;
|
||||
secondChar.append(SERVER_VERSION.charAt(i));
|
||||
}
|
||||
int sInt = Integer.parseInt(secondChar.toString());
|
||||
if (sInt < secondVersion)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the NMS class.
|
||||
*
|
||||
* @param name
|
||||
* The name of the class
|
||||
*
|
||||
* @return The NMS class or null if an error occurred
|
||||
*/
|
||||
public static Class<?> getNMSClass(String name) {
|
||||
try {
|
||||
return Class.forName("net.minecraft.server." + SERVER_VERSION
|
||||
+ "." + name);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the CraftBukkit class.
|
||||
*
|
||||
* @param name
|
||||
* The name of the class
|
||||
*
|
||||
* @return The CraftBukkit class or null if an error occurred
|
||||
*/
|
||||
|
||||
public static Class<?> getCraftbukkitClass(String name,
|
||||
String packageName) {
|
||||
try {
|
||||
return Class.forName("org.bukkit.craftbukkit." + SERVER_VERSION
|
||||
+ "." + packageName + "." + name);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the mojang.authlib class.
|
||||
*
|
||||
* @param name
|
||||
* The name of the class
|
||||
*
|
||||
* @return The mojang.authlib class or null if an error occurred
|
||||
*/
|
||||
|
||||
public static Class<?> getMojangAuthClass(String name) {
|
||||
try {
|
||||
return Class.forName("com.mojang.authlib." + name);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes the method
|
||||
*
|
||||
* @param handle
|
||||
* The handle to invoke it on
|
||||
* @param methodName
|
||||
* The name of the method
|
||||
* @param parameterClasses
|
||||
* The parameter types
|
||||
* @param args
|
||||
* The arguments
|
||||
*
|
||||
* @return The resulting object or null if an error occurred / the
|
||||
* method didn't return a thing
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Object invokeMethod(Object handle, String methodName,
|
||||
Class[] parameterClasses, Object... args) {
|
||||
return invokeMethod(handle.getClass(), handle, methodName,
|
||||
parameterClasses, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes the method
|
||||
*
|
||||
* @param clazz
|
||||
* The class to invoke it from
|
||||
* @param handle
|
||||
* The handle to invoke it on
|
||||
* @param methodName
|
||||
* The name of the method
|
||||
* @param parameterClasses
|
||||
* The parameter types
|
||||
* @param args
|
||||
* The arguments
|
||||
*
|
||||
* @return The resulting object or null if an error occurred / the
|
||||
* method didn't return a thing
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Object invokeMethod(Class<?> clazz, Object handle,
|
||||
String methodName, Class[] parameterClasses, Object... args) {
|
||||
Optional<Method> methodOptional = getMethod(clazz, methodName,
|
||||
parameterClasses);
|
||||
|
||||
if (!methodOptional.isPresent()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Method method = methodOptional.get();
|
||||
|
||||
try {
|
||||
return method.invoke(handle, args);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of an instance field
|
||||
*
|
||||
* @param handle
|
||||
* The handle to invoke it on
|
||||
* @param name
|
||||
* The name of the field
|
||||
* @param value
|
||||
* The new value of the field
|
||||
*/
|
||||
public static void setInstanceField(Object handle, String name,
|
||||
Object value) {
|
||||
Class<?> clazz = handle.getClass();
|
||||
Optional<Field> fieldOptional = getField(clazz, name);
|
||||
if (!fieldOptional.isPresent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Field field = fieldOptional.get();
|
||||
if (!field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
try {
|
||||
field.set(handle, value);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of an instance field
|
||||
*
|
||||
* @param handle
|
||||
* The handle to invoke it on
|
||||
* @param name
|
||||
* The name of the field
|
||||
*
|
||||
* @return The result
|
||||
*/
|
||||
public static Object getInstanceField(Object handle, String name) {
|
||||
Class<?> clazz = handle.getClass();
|
||||
Optional<Field> fieldOptional = getField(clazz, name);
|
||||
if (!fieldOptional.isPresent()) {
|
||||
return handle;
|
||||
}
|
||||
Field field = fieldOptional.get();
|
||||
if (!field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
try {
|
||||
return field.get(handle);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an enum constant
|
||||
*
|
||||
* @param enumClass
|
||||
* The class of the enum
|
||||
* @param name
|
||||
* The name of the enum constant
|
||||
*
|
||||
* @return The enum entry or null
|
||||
*/
|
||||
public static Object getEnumConstant(Class<?> enumClass, String name) {
|
||||
if (!enumClass.isEnum()) {
|
||||
return null;
|
||||
}
|
||||
for (Object o : enumClass.getEnumConstants()) {
|
||||
if (name.equals(invokeMethod(o, "name", new Class[0]))) {
|
||||
return o;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the constructor
|
||||
*
|
||||
* @param clazz
|
||||
* The class
|
||||
* @param params
|
||||
* The Constructor parameters
|
||||
*
|
||||
* @return The Constructor or an empty Optional if there is none with
|
||||
* these parameters
|
||||
*/
|
||||
public static Optional<?> getConstructor(Class<?> clazz,
|
||||
Class<?>... params) {
|
||||
try {
|
||||
return Optional.of(clazz.getConstructor(params));
|
||||
} catch (NoSuchMethodException e) {
|
||||
try {
|
||||
return Optional.of(clazz.getDeclaredConstructor(params));
|
||||
} catch (NoSuchMethodException e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates the class. Will print the errors it gets
|
||||
*
|
||||
* @param constructor
|
||||
* The constructor
|
||||
* @param arguments
|
||||
* The initial arguments
|
||||
*
|
||||
* @return The resulting object, or null if an error occurred.
|
||||
*/
|
||||
public static Object instantiate(Constructor<?> constructor,
|
||||
Object... arguments) {
|
||||
try {
|
||||
return constructor.newInstance(arguments);
|
||||
} catch (InstantiationException | IllegalAccessException
|
||||
| InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Optional<Method> getMethod(Class<?> clazz, String name,
|
||||
Class<?>... params) {
|
||||
try {
|
||||
return Optional.of(clazz.getMethod(name, params));
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
return Optional.of(clazz.getDeclaredMethod(name, params));
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
public static Optional<Field> getField(Class<?> clazz, String name) {
|
||||
try {
|
||||
return Optional.of(clazz.getField(name));
|
||||
} catch (NoSuchFieldException e){}
|
||||
|
||||
try {
|
||||
return Optional.of(clazz.getDeclaredField(name));
|
||||
} catch (NoSuchFieldException e) {}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
255
Java/TextToSpeech/src/me/zombie_striker/tts/TTSCommand.java
Normal file
255
Java/TextToSpeech/src/me/zombie_striker/tts/TTSCommand.java
Normal file
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Zombie_Striker
|
||||
*
|
||||
* 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 me.zombie_striker.tts;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import me.zombie_striker.tts.util.TalkUtil;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.meta.BookMeta;
|
||||
|
||||
public class TTSCommand implements CommandExecutor, TabCompleter {
|
||||
|
||||
CoreTTS tts;
|
||||
|
||||
public TTSCommand(CoreTTS tts) {
|
||||
this.tts = tts;// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender arg0, Command arg1,
|
||||
String arg2, String[] args) {
|
||||
List<String> ls = new ArrayList<String>();
|
||||
if (args.length == 1) {
|
||||
startsWith(ls, "get", args[0]);
|
||||
startsWith(ls, "join", args[0]);
|
||||
startsWith(ls, "leave", args[0]);
|
||||
startsWith(ls, "kick", args[0]);
|
||||
startsWith(ls, "ban", args[0]);
|
||||
startsWith(ls, "unban", args[0]);
|
||||
startsWith(ls, "setpitch", args[0]);
|
||||
startsWith(ls, "download", args[0]);
|
||||
startsWith(ls, "ban", args[0]);
|
||||
startsWith(ls, "readBook", args[0]);
|
||||
} else if (args.length == 2) {
|
||||
if (args[0].equalsIgnoreCase("join")) {
|
||||
startsWith(ls, "public", args[1]);
|
||||
for (String groups : tts.groups.values()) {
|
||||
if (!ls.contains(groups))
|
||||
startsWith(ls, groups, args[1]);
|
||||
}
|
||||
} else if (args[0].equalsIgnoreCase("kick")
|
||||
|| args[0].equalsIgnoreCase("ban")) {
|
||||
for (UUID player : tts.groups.keySet()) {
|
||||
if (tts.groups.get(player).equalsIgnoreCase(
|
||||
tts.groups.get(Bukkit.getPlayer(arg0.getName())
|
||||
.getUniqueId())))
|
||||
startsWith(ls, tts.groups.get(player), args[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ls;
|
||||
}
|
||||
|
||||
public void startsWith(List<String> ls, String s, String arg) {
|
||||
if (s.startsWith(arg))
|
||||
ls.add(s);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command arg1, String arg2,
|
||||
String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage("You need to be a player in order to issue these commands.");
|
||||
return true;
|
||||
}
|
||||
final Player p = (Player) sender;
|
||||
if (args.length == 0) {
|
||||
sendHelp(p);
|
||||
return true;
|
||||
}
|
||||
if (args[0].equalsIgnoreCase("join")) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(tts.prefix
|
||||
+ "You need to specify a group to join");
|
||||
return true;
|
||||
}
|
||||
String group = args[1];
|
||||
if (tts.bannedG.containsKey(group)
|
||||
&& tts.bannedG.get(group).contains(p.getUniqueId())) {
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " You have been banned from this group. If you feel this is a mistake, please talk to an admin.");
|
||||
return true;
|
||||
}
|
||||
tts.groups.put(p.getUniqueId(), group);
|
||||
sender.sendMessage(tts.prefix + " You have been added to group "
|
||||
+ group);
|
||||
sender.sendMessage(ChatColor.BOLD+tts.prefix+ChatColor.BOLD+" If you do not have the voice resource pack, you can download it here. Current Version 1.3");
|
||||
sender.sendMessage(CoreTTS.RES);
|
||||
p.sendTitle("Downloading will begin soon", "If the prompt does not display in 5 seconds, use the link in the chat.");
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.tts, new Runnable(){public void run(){p.setResourcePack(CoreTTS.RES);}}, 20*5);
|
||||
} else if (args[0].equalsIgnoreCase("readbook")){
|
||||
if(p.getInventory().getItemInMainHand()!=null&&p.getInventory().getItemInMainHand().getType()==Material.BOOK_AND_QUILL){
|
||||
BookMeta bm = (BookMeta) p.getInventory().getItemInMainHand().getItemMeta();
|
||||
StringBuilder fullBook = new StringBuilder();
|
||||
for(String page : bm.getPages()){
|
||||
fullBook.append(page+" .. ");
|
||||
}
|
||||
TalkUtil.speakOut(fullBook.toString(), p);
|
||||
|
||||
|
||||
}else{
|
||||
p.sendMessage("You must have the book in your hand.");
|
||||
}
|
||||
} else if (args[0].equalsIgnoreCase("get")){
|
||||
sender.sendMessage(ChatColor.BOLD+tts.prefix+ChatColor.BOLD+" If you do not have the voice resource pack, you can download it here. Current Version 1.3");
|
||||
sender.sendMessage(CoreTTS.RES);
|
||||
p.sendTitle("Downloading will begin soon", "If the prompt does not display in 5 seconds, use the link in the chat.");
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this.tts, new Runnable(){public void run(){p.setResourcePack(CoreTTS.RES);}}, 20*5);
|
||||
} else if (args[0].equalsIgnoreCase("leave")) {
|
||||
tts.groups.put(p.getUniqueId(), "none");
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " You have been removed from your groups.");
|
||||
} else if (args[0].equalsIgnoreCase("kick")) {
|
||||
if (sender.hasPermission("tts.ban") || sender.isOp()) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " You have to specify which player to " + args[0]);
|
||||
return true;
|
||||
}
|
||||
Player p2 = Bukkit.getPlayer(args[1]);
|
||||
if (p2 == null) {
|
||||
sender.sendMessage(tts.prefix + " The player you want to "
|
||||
+ args[0] + " must be on the server.");
|
||||
return true;
|
||||
}
|
||||
tts.groups.put(p2.getUniqueId(), "none");
|
||||
p2.sendMessage(tts.prefix + " You have been " + args[0]
|
||||
+ " from your group.");
|
||||
p.sendMessage(tts.prefix + " You have " + args[0] + " "
|
||||
+ p2.getName() + " from your group.");
|
||||
}
|
||||
} else if (args[0].equalsIgnoreCase("ban")
|
||||
|| args[0].equalsIgnoreCase("unban")) {
|
||||
if (sender.hasPermission("tts.ban") || sender.isOp()) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " You have to specify which player to " + args[0]);
|
||||
return true;
|
||||
}
|
||||
Player p2 = Bukkit.getPlayer(args[1]);
|
||||
if (p2 == null) {
|
||||
sender.sendMessage(tts.prefix + " The player you want to "
|
||||
+ args[0] + " must be on the server.");
|
||||
return true;
|
||||
}
|
||||
if (args.length < 3) {
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " You have to specify which group to unban the player from");
|
||||
return true;
|
||||
}
|
||||
String group = args[2];
|
||||
if (args[0].equalsIgnoreCase("ban")) {
|
||||
tts.groups.put(p2.getUniqueId(), "none");
|
||||
if (!tts.bannedG.containsKey(group))
|
||||
tts.bannedG.put(group, new ArrayList<UUID>());
|
||||
tts.bannedG.get(group).add(p2.getUniqueId());
|
||||
} else {
|
||||
if (tts.bannedG.containsKey(group))
|
||||
tts.bannedG.get(group).remove(p2.getUniqueId());
|
||||
}
|
||||
tts.groups.put(p2.getUniqueId(), "none");
|
||||
p2.sendMessage(tts.prefix + " You have been " + args[0]
|
||||
+ " from the group " + group);
|
||||
p.sendMessage(tts.prefix + " You have " + args[0] + " "
|
||||
+ p2.getName() + " from the group." + group);
|
||||
}
|
||||
}else if (args[0].equalsIgnoreCase("setPitch")){
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("You need to specify the pitch between 0 and 10. Default is 5");
|
||||
return true;
|
||||
}
|
||||
int pitch=5;
|
||||
try{
|
||||
pitch = Integer.parseInt(args[1]);
|
||||
}catch(Exception e){
|
||||
sender.sendMessage("You need to specify a number");
|
||||
return true;
|
||||
}
|
||||
tts.pitch.put(p.getUniqueId(), pitch);
|
||||
p.sendMessage("Your pitch has been set to "+pitch+".");
|
||||
} else if (args[0].equalsIgnoreCase("type")) {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage("You need to specify the type <local, world, or global>");
|
||||
return true;
|
||||
}
|
||||
String t = args[1];
|
||||
if (t.equalsIgnoreCase("local")) {
|
||||
tts.lType.put(p.getUniqueId(), 1);
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " Your chattype has been set to Local.");
|
||||
} else if (t.equalsIgnoreCase("world")) {
|
||||
tts.lType.put(p.getUniqueId(), 2);
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " Your chattype has been set to World.");
|
||||
} else if (t.equalsIgnoreCase("global")) {
|
||||
tts.lType.put(p.getUniqueId(), 3);
|
||||
sender.sendMessage(tts.prefix
|
||||
+ " Your chattype has been set to Global.");
|
||||
} else {
|
||||
sender.sendMessage("Choose either 'Local', 'World', or 'Global'.");
|
||||
}
|
||||
} else if (args[0].equalsIgnoreCase("download")) {
|
||||
sender.sendMessage(tts.prefix+" Link to resourcepack. Download it and activate it to hear the voices.");
|
||||
sender.sendMessage("https://dev.bukkit.org/bukkit-plugins/texttospeach/files/4-voice-pack-1-1/");
|
||||
} else {
|
||||
sendHelp(p);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void sendHelp(Player p) {
|
||||
p.sendMessage(ChatColor.GRAY + " /tts type <local,world,global>:"
|
||||
+ ChatColor.RESET + " changes the chat type");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts join <group>:" + ChatColor.RESET
|
||||
+ " Join a selected group");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts leave :" + ChatColor.RESET
|
||||
+ " Leave the group you are in");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts get:"
|
||||
+ ChatColor.RESET + " gives the player the link to the resourcepack.");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts kick <player> :"
|
||||
+ ChatColor.RESET + " Kicks a player from their group.");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts ban/unban <player> <group>:" + ChatColor.RESET
|
||||
+ "(un)Bans a player from the group.");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts setPitch <pitch> :" + ChatColor.RESET
|
||||
+ " sets the pitch for your player.");
|
||||
p.sendMessage(ChatColor.GRAY + " /tts readbook :" + ChatColor.RESET
|
||||
+ " Reads the book in your hand.");
|
||||
p.sendMessage(ChatColor.DARK_RED+""+ChatColor.BOLD+"If a word is not right, please go here:");
|
||||
p.sendMessage("https://dev.bukkit.org/bukkit-plugins/texttospeach/");
|
||||
}
|
||||
}
|
||||
738
Java/TextToSpeech/src/me/zombie_striker/tts/Updater.java
Normal file
738
Java/TextToSpeech/src/me/zombie_striker/tts/Updater.java
Normal file
@@ -0,0 +1,738 @@
|
||||
package me.zombie_striker.tts;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipException;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
/**
|
||||
* Checks and auto updates a plugin<br>
|
||||
* <br>
|
||||
* <b>You must have a option in your config to disable the updater!</b>
|
||||
*
|
||||
* @author Arsen
|
||||
*/
|
||||
public class Updater {
|
||||
|
||||
private static final String HOST = "https://api.curseforge.com";
|
||||
private static final String QUERY = "/servermods/files?projectIds=";
|
||||
private static final String AGENT = "Mozilla/5.0 Updater by ArsenArsen";
|
||||
private static final File WORKING_DIR = new File("plugins" + File.separator + "AUpdater" + File.separator);
|
||||
private static final File BACKUP_DIR = new File(WORKING_DIR, "backups" + File.separator);
|
||||
private static final File LOG_FILE = new File(WORKING_DIR, "updater.log");
|
||||
private static final File CONFIG_FILE = new File(WORKING_DIR, "global.yml");
|
||||
private static final char[] HEX_CHAR_ARRAY = "0123456789abcdef".toCharArray();
|
||||
private static final Pattern NAME_MATCH = Pattern.compile(".+\\sv?[0-9.]+");
|
||||
private static final String VERSION_SPLIT = "\\sv?";
|
||||
|
||||
private int id = -1;
|
||||
|
||||
private Plugin p;
|
||||
@SuppressWarnings("FieldCanBeLocal")
|
||||
private boolean debug = false;
|
||||
private UpdateAvailability lastCheck = null;
|
||||
private UpdateResult lastUpdate = UpdateResult.NOT_UPDATED;
|
||||
private File pluginFile = null;
|
||||
private String downloadURL = null;
|
||||
private String futuremd5;
|
||||
private String downloadName;
|
||||
private List<Channel> allowedChannels = Arrays.asList(Channel.ALPHA, Channel.BETA, Channel.RELEASE);
|
||||
private List<UpdateCallback> callbacks = new ArrayList<>();
|
||||
private SyncCallbackCaller caller = new SyncCallbackCaller();
|
||||
private List<String> skipTags = new ArrayList<>();
|
||||
private String latest;
|
||||
private FileConfiguration global;
|
||||
|
||||
/**
|
||||
* Makes the updater for a plugin
|
||||
*
|
||||
* @param p Plugin to update
|
||||
*/
|
||||
public Updater(Plugin p) {
|
||||
this.p = p;
|
||||
try {
|
||||
pluginFile = new File(URLDecoder.decode(p.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
debug(e.toString());
|
||||
// Should not ever happen
|
||||
}
|
||||
latest = p.getDescription().getVersion();
|
||||
if (!CONFIG_FILE.exists()) {
|
||||
try {
|
||||
CONFIG_FILE.getParentFile().mkdirs();
|
||||
CONFIG_FILE.createNewFile();
|
||||
log("Created config file!");
|
||||
} catch (IOException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not create " + CONFIG_FILE.getName() + "!", e);
|
||||
}
|
||||
}
|
||||
global = YamlConfiguration.loadConfiguration(CONFIG_FILE);
|
||||
global.options().header("Updater by ArsenArsen\nGlobal config\nSets should updates be downloaded globaly");
|
||||
if (!global.isSet("update")) {
|
||||
global.set("update", true);
|
||||
try {
|
||||
global.save(CONFIG_FILE);
|
||||
} catch (IOException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not save default config file!", e);
|
||||
}
|
||||
}
|
||||
if (!LOG_FILE.exists()) {
|
||||
try {
|
||||
LOG_FILE.getParentFile().mkdirs();
|
||||
LOG_FILE.createNewFile();
|
||||
log("Created log file!");
|
||||
} catch (IOException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not create " + LOG_FILE.getName() + "!", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the updater for a plugin with an ID
|
||||
*
|
||||
* @param p The plugin
|
||||
* @param id Plugin ID
|
||||
*/
|
||||
public Updater(Plugin p, int id) {
|
||||
this(p);
|
||||
setID(id);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the updater for a plugin with an ID
|
||||
*
|
||||
* @param p The plugin
|
||||
* @param id Plugin ID
|
||||
* @param download Set to true if your plugin needs to be immediately downloaded
|
||||
* @param skipTags Tags, endings of a filename, that updater will ignore, must begin with a dash ('-')
|
||||
*/
|
||||
public Updater(Plugin p, int id, boolean download, String... skipTags) {
|
||||
this(p);
|
||||
setID(id);
|
||||
for (String tag : skipTags)
|
||||
if (tag.startsWith("-"))
|
||||
this.skipTags.add(tag);
|
||||
if (download && (checkForUpdates() == UpdateAvailability.UPDATE_AVAILABLE)) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the updater for a plugin with an ID
|
||||
*
|
||||
* @param p The plugin
|
||||
* @param id Plugin ID
|
||||
* @param download Set to true if your plugin needs to be immediately downloaded
|
||||
* @param skipTags Tags, endings of a filename, that updater will ignore, or null for none
|
||||
* @param callbacks All update callbacks you need
|
||||
*/
|
||||
public Updater(Plugin p, int id, boolean download, String[] skipTags, UpdateCallback... callbacks) {
|
||||
this(p);
|
||||
setID(id);
|
||||
this.callbacks.addAll(Arrays.asList(callbacks));
|
||||
if (skipTags != null) {
|
||||
for (String tag : skipTags)
|
||||
if (tag.startsWith("-"))
|
||||
this.skipTags.add(tag);
|
||||
}
|
||||
if (global.getBoolean("update", true) && download && (checkForUpdates() == UpdateAvailability.UPDATE_AVAILABLE)) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the plugin ID
|
||||
*
|
||||
* @return the plugin ID
|
||||
*/
|
||||
public int getID() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the plugin ID
|
||||
*
|
||||
* @param id The plugin ID
|
||||
*/
|
||||
public void setID(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new callback
|
||||
*
|
||||
* @param callback Callback to register
|
||||
*/
|
||||
public void registerCallback(UpdateCallback callback) {
|
||||
callbacks.add(callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts a update
|
||||
*
|
||||
* @throws IllegalStateException if the ID was not set
|
||||
*/
|
||||
public void update() {
|
||||
debug(WORKING_DIR.getAbsolutePath());
|
||||
debug("Update!");
|
||||
if (id == -1) {
|
||||
throw new IllegalStateException("Plugin ID is not set!");
|
||||
}
|
||||
|
||||
if (lastCheck == null) {
|
||||
checkForUpdates();
|
||||
}
|
||||
|
||||
if (!BACKUP_DIR.exists() || !BACKUP_DIR.isDirectory()) {
|
||||
BACKUP_DIR.mkdir();
|
||||
}
|
||||
final Updater updater = this;
|
||||
if (!global.getBoolean("update", true)) {
|
||||
lastUpdate = UpdateResult.DISABLED;
|
||||
debug("Disabled!");
|
||||
caller.call(callbacks, UpdateResult.DISABLED, updater);
|
||||
return;
|
||||
}
|
||||
if (lastCheck == UpdateAvailability.UPDATE_AVAILABLE) {
|
||||
new BukkitRunnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
debug("Update STARTED!");
|
||||
p.getLogger().info("Starting update of " + p.getName());
|
||||
log("Updating " + p.getName() + "!");
|
||||
lastUpdate = download();
|
||||
p.getLogger().log(Level.INFO, "Update done! Result: " + lastUpdate);
|
||||
caller.call(callbacks, lastUpdate, updater);
|
||||
}
|
||||
}.runTaskAsynchronously(p);
|
||||
} else if (lastCheck == UpdateAvailability.SM_UNREACHABLE) {
|
||||
lastUpdate = UpdateResult.IOERROR;
|
||||
debug("Fail!");
|
||||
caller.call(callbacks, UpdateResult.IOERROR, updater);
|
||||
} else {
|
||||
lastUpdate = UpdateResult.GENERAL_ERROR;
|
||||
debug("Fail!");
|
||||
caller.call(callbacks, UpdateResult.IOERROR, updater);
|
||||
}
|
||||
}
|
||||
|
||||
private UpdateResult download() {
|
||||
try {
|
||||
Files.copy(pluginFile.toPath(),
|
||||
new File(BACKUP_DIR, "backup-" + System.currentTimeMillis() + "-" + p.getName() + ".jar").toPath(),
|
||||
StandardCopyOption.REPLACE_EXISTING);
|
||||
final File downloadTo = new File(pluginFile.getParentFile().getAbsolutePath() +
|
||||
File.separator + "AUpdater" + File.separator, downloadName);
|
||||
downloadTo.getParentFile().mkdirs();
|
||||
downloadTo.delete();
|
||||
debug("Started download!");
|
||||
|
||||
downloadIsSeperateBecauseGotoGotRemoved(downloadTo);
|
||||
|
||||
debug("Ended download!");
|
||||
if (!fileHash(downloadTo).equalsIgnoreCase(futuremd5))
|
||||
return UpdateResult.BAD_HASH;
|
||||
if (downloadTo.getName().endsWith(".jar")) {
|
||||
pluginFile.setWritable(true, false);
|
||||
pluginFile.delete();
|
||||
debug("Started copy!");
|
||||
InputStream in = new FileInputStream(downloadTo);
|
||||
File file = new File(pluginFile.getParentFile()
|
||||
.getAbsoluteFile() + File.separator + "update" + File.separator, pluginFile.getName());
|
||||
file.getParentFile().mkdirs();
|
||||
file.createNewFile();
|
||||
OutputStream out = new FileOutputStream(file);
|
||||
long bytes = copy(in, out);
|
||||
p.getLogger().info("Update done! Downloaded " + bytes + " bytes!");
|
||||
log("Updated plugin " + p.getName() + " with " + bytes + "bytes!");
|
||||
return UpdateResult.UPDATE_SUCCEEDED;
|
||||
} else
|
||||
return unzip(downloadTo);
|
||||
} catch (IOException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Couldn't download update for " + p.getName(), e);
|
||||
log("Failed to update " + p.getName() + "!", e);
|
||||
return UpdateResult.IOERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* God damn it Gosling, <a href="http://stackoverflow.com/a/4547764/3809164">reference here.</a>
|
||||
*/
|
||||
private void downloadIsSeperateBecauseGotoGotRemoved(File downloadTo) throws IOException {
|
||||
URL url = new URL(downloadURL);
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.addRequestProperty("User-Agent", AGENT);
|
||||
connection.connect();
|
||||
if (connection.getResponseCode() >= 300 && connection.getResponseCode() < 400) {
|
||||
downloadURL = connection.getHeaderField("Location");
|
||||
downloadIsSeperateBecauseGotoGotRemoved(downloadTo);
|
||||
} else {
|
||||
debug(connection.getResponseCode() + " " + connection.getResponseMessage() + " when requesting " + downloadURL);
|
||||
copy(connection.getInputStream(), new FileOutputStream(downloadTo));
|
||||
}
|
||||
}
|
||||
|
||||
private long copy(InputStream in, OutputStream out) throws IOException {
|
||||
long bytes = 0;
|
||||
byte[] buf = new byte[0x1000];
|
||||
while (true) {
|
||||
int r = in.read(buf);
|
||||
if (r == -1)
|
||||
break;
|
||||
out.write(buf, 0, r);
|
||||
bytes += r;
|
||||
debug("Another 4K, current: " + r);
|
||||
}
|
||||
out.flush();
|
||||
out.close();
|
||||
in.close();
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
private UpdateResult unzip(File download) {
|
||||
ZipFile zipFile = null;
|
||||
try {
|
||||
zipFile = new ZipFile(download);
|
||||
Enumeration<? extends ZipEntry> entries = zipFile.entries();
|
||||
ZipEntry entry;
|
||||
File updateFile = new File(pluginFile.getParentFile()
|
||||
.getAbsoluteFile() + File.separator + "update" + File.separator, pluginFile.getName());
|
||||
while ((entry = entries.nextElement()) != null) {
|
||||
File target = new File(updateFile, entry.getName());
|
||||
File inPlugins = new File(pluginFile.getParentFile(), entry.getName());
|
||||
if(!inPlugins.exists()){
|
||||
target = inPlugins;
|
||||
}
|
||||
if (!entry.isDirectory()) {
|
||||
target.getParentFile().mkdirs();
|
||||
InputStream zipStream = zipFile.getInputStream(entry);
|
||||
OutputStream fileStream = new FileOutputStream(target);
|
||||
copy(zipStream, fileStream);
|
||||
}
|
||||
}
|
||||
return UpdateResult.UPDATE_SUCCEEDED;
|
||||
} catch (IOException e) {
|
||||
if (e instanceof ZipException) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not unzip downloaded file!", e);
|
||||
log("Update for " + p.getName() + "was an unknown filetype! ", e);
|
||||
return UpdateResult.UNKNOWN_FILE_TYPE;
|
||||
} else {
|
||||
p.getLogger().log(Level.SEVERE,
|
||||
"An IOException occured while trying to update %s!".replace("%s", p.getName()), e);
|
||||
log("Update for " + p.getName() + "was an unknown filetype! ", e);
|
||||
return UpdateResult.IOERROR;
|
||||
}
|
||||
} finally {
|
||||
if (zipFile != null) {
|
||||
try {
|
||||
zipFile.close();
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for new updates
|
||||
*
|
||||
* @param force Discards the cached state in order to get a new one, ignored if update check didn't run
|
||||
* @return Is there any updates
|
||||
* @throws IllegalStateException If the plugin ID is not set
|
||||
*/
|
||||
public UpdateAvailability checkForUpdates(boolean force) {
|
||||
if (id == -1) {
|
||||
throw new IllegalStateException("Plugin ID is not set!");
|
||||
}
|
||||
|
||||
if (force || lastCheck == null) {
|
||||
String target = HOST + QUERY + id;
|
||||
debug(target);
|
||||
try {
|
||||
URL url = new URL(target);
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.addRequestProperty("User-Agent", AGENT);
|
||||
connection.connect();
|
||||
debug("Connecting!");
|
||||
BufferedReader responseReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
StringBuilder responseBuffer = new StringBuilder();
|
||||
String line;
|
||||
while ((line = responseReader.readLine()) != null) {
|
||||
responseBuffer.append(line);
|
||||
}
|
||||
debug("All read!");
|
||||
responseReader.close();
|
||||
String response = responseBuffer.toString();
|
||||
int counter = 1;
|
||||
if (connection.getResponseCode() == 200) {
|
||||
|
||||
try {
|
||||
debug("RESCODE 200");
|
||||
while (true) {
|
||||
debug("Counter: " + counter);
|
||||
JSONParser parser = new JSONParser();
|
||||
JSONArray json = (JSONArray) parser.parse(response);
|
||||
if (json.size() - counter < 0) {
|
||||
lastCheck = UpdateAvailability.NO_UPDATE;
|
||||
debug("No update!");
|
||||
break;
|
||||
}
|
||||
JSONObject latest = (JSONObject) json.get(json.size() - counter);
|
||||
futuremd5 = (String) latest.get("md5");
|
||||
String channel = (String) latest.get("releaseType");
|
||||
String name = (String) latest.get("name");
|
||||
if (allowedChannels.contains(Channel.matchChannel(channel.toUpperCase()))
|
||||
&& !hasTag(name)) {
|
||||
String noTagName = name;
|
||||
String oldVersion = p.getDescription().getVersion().replaceAll("-.*", "");
|
||||
for (String tag : skipTags) {
|
||||
noTagName = noTagName.replace(tag, "");
|
||||
oldVersion = oldVersion.replace(tag, "");
|
||||
}
|
||||
if (!NAME_MATCH.matcher(noTagName).matches()) {
|
||||
lastCheck = UpdateAvailability.CANT_PARSE_NAME;
|
||||
return lastCheck;
|
||||
}
|
||||
String[] splitName = noTagName.split(VERSION_SPLIT);
|
||||
String version = splitName[splitName.length - 1];
|
||||
if (oldVersion.length() > version.length()) {
|
||||
while (oldVersion.length() > version.length()) {
|
||||
version += ".0";
|
||||
}
|
||||
} else if (oldVersion.length() < version.length()) {
|
||||
while (oldVersion.length() < version.length()) {
|
||||
oldVersion += ".0";
|
||||
}
|
||||
}
|
||||
debug("Versions are same length");
|
||||
String[] splitOldVersion = oldVersion.split("\\.");
|
||||
String[] splitVersion = version.split("\\.");
|
||||
|
||||
Integer[] parsedOldVersion = new Integer[splitOldVersion.length];
|
||||
Integer[] parsedVersion = new Integer[splitVersion.length];
|
||||
|
||||
for (int i = 0; i < parsedOldVersion.length; i++) {
|
||||
parsedOldVersion[i] = Integer.parseInt(splitOldVersion[i]);
|
||||
}
|
||||
for (int i = 0; i < parsedVersion.length; i++) {
|
||||
parsedVersion[i] = Integer.parseInt(splitVersion[i]);
|
||||
}
|
||||
boolean update = false;
|
||||
for (int i = 0; i < parsedOldVersion.length; i++) {
|
||||
if (parsedOldVersion[i] < parsedVersion[i]) {
|
||||
update = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!update) {
|
||||
lastCheck = UpdateAvailability.NO_UPDATE;
|
||||
} else {
|
||||
lastCheck = UpdateAvailability.UPDATE_AVAILABLE;
|
||||
downloadURL = ((String) latest.get("downloadUrl")).replace(" ", "%20");
|
||||
downloadName = (String) latest.get("fileName");
|
||||
}
|
||||
break;
|
||||
} else
|
||||
counter++;
|
||||
}
|
||||
debug("While loop over!");
|
||||
} catch (ParseException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not parse API Response for " + target, e);
|
||||
log("Could not parse API Response for " + target + " while updating " + p.getName(), e);
|
||||
lastCheck = UpdateAvailability.CANT_UNDERSTAND;
|
||||
}
|
||||
} else {
|
||||
log("Could not reach API for " + target + " while updating " + p.getName());
|
||||
lastCheck = UpdateAvailability.SM_UNREACHABLE;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not check for updates for plugin " + p.getName(), e);
|
||||
log("Could not reach API for " + target + " while updating " + p.getName(), e);
|
||||
lastCheck = UpdateAvailability.SM_UNREACHABLE;
|
||||
}
|
||||
}
|
||||
log("Update check ran for " + p.getName() + "! Check resulted in " + lastCheck);
|
||||
return lastCheck;
|
||||
}
|
||||
|
||||
private void debug(String message) {
|
||||
if (debug)
|
||||
p.getLogger().info(message + ' ' + new Throwable().getStackTrace()[1]);
|
||||
}
|
||||
|
||||
private void log(String message) {
|
||||
try {
|
||||
Files.write(LOG_FILE.toPath(), Collections.singletonList(
|
||||
"[" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "] " + message),
|
||||
StandardCharsets.UTF_8, StandardOpenOption.APPEND);
|
||||
} catch (IOException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not log to " + LOG_FILE.getAbsolutePath() + "!", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void log(String message, Exception exception) {
|
||||
StringWriter string = new StringWriter();
|
||||
PrintWriter print = new PrintWriter(string);
|
||||
exception.printStackTrace(print);
|
||||
log(message + " " + string.toString());
|
||||
try {
|
||||
string.close();
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
print.close();
|
||||
}
|
||||
|
||||
private boolean hasTag(String name) {
|
||||
for (String tag : skipTags) {
|
||||
if (name.toLowerCase().endsWith(tag.toLowerCase())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for new updates, non forcing cache override
|
||||
*
|
||||
* @return Is there any updates
|
||||
* @throws IllegalStateException If the plugin ID is not set
|
||||
*/
|
||||
public UpdateAvailability checkForUpdates() {
|
||||
return checkForUpdates(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks did the update run successfully
|
||||
*
|
||||
* @return The update state
|
||||
*/
|
||||
public UpdateResult isUpdated() {
|
||||
return lastUpdate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets allowed channels, AKA release types
|
||||
*
|
||||
* @param channels The allowed channels
|
||||
*/
|
||||
public void setChannels(Channel... channels) {
|
||||
allowedChannels.clear();
|
||||
allowedChannels.addAll(Arrays.asList(channels));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the latest version
|
||||
*
|
||||
* @return The latest version
|
||||
*/
|
||||
public String getLatest() {
|
||||
return latest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the outcome of an update
|
||||
*
|
||||
* @author Arsen
|
||||
*/
|
||||
public enum UpdateResult {
|
||||
/**
|
||||
* Update was successful
|
||||
*/
|
||||
UPDATE_SUCCEEDED,
|
||||
|
||||
/**
|
||||
* Update was not attempted yet
|
||||
*/
|
||||
NOT_UPDATED,
|
||||
|
||||
/**
|
||||
* Could not unpack the update
|
||||
*/
|
||||
UNKNOWN_FILE_TYPE,
|
||||
|
||||
/**
|
||||
* Miscellanies error occurred while update checking
|
||||
*/
|
||||
GENERAL_ERROR,
|
||||
|
||||
/**
|
||||
* Updater is globally disabled
|
||||
*/
|
||||
DISABLED,
|
||||
/**
|
||||
* The hashing algorithm and the remote hash had different results.
|
||||
*/
|
||||
BAD_HASH,
|
||||
/**
|
||||
* An unknown IO error occurred
|
||||
*/
|
||||
IOERROR
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the outcome of an update check
|
||||
*
|
||||
* @author Arsen
|
||||
*/
|
||||
public enum UpdateAvailability {
|
||||
/**
|
||||
* There is an update
|
||||
*/
|
||||
UPDATE_AVAILABLE,
|
||||
|
||||
/**
|
||||
* You have the latest version
|
||||
*/
|
||||
NO_UPDATE,
|
||||
|
||||
/**
|
||||
* Could not reach server mods API
|
||||
*/
|
||||
SM_UNREACHABLE,
|
||||
|
||||
/**
|
||||
* Update name cannot be parsed, meaning the version cannot be compared
|
||||
*/
|
||||
CANT_PARSE_NAME,
|
||||
|
||||
/**
|
||||
* Could not parse response from server mods API
|
||||
*/
|
||||
CANT_UNDERSTAND
|
||||
}
|
||||
|
||||
public enum Channel {
|
||||
/**
|
||||
* Normal release
|
||||
*/
|
||||
RELEASE("release"),
|
||||
|
||||
/**
|
||||
* Beta release
|
||||
*/
|
||||
BETA("beta"),
|
||||
|
||||
/**
|
||||
* Alpha release
|
||||
*/
|
||||
ALPHA("alpha");
|
||||
|
||||
private String channel;
|
||||
|
||||
Channel(String channel) {
|
||||
this.channel = channel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the channel value
|
||||
*
|
||||
* @return the channel value
|
||||
*/
|
||||
public String getChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns channel whose channel value matches the given string
|
||||
*
|
||||
* @param channel The channel value
|
||||
* @return The Channel constant
|
||||
*/
|
||||
public static Channel matchChannel(String channel) {
|
||||
for (Channel c : values()) {
|
||||
if (c.channel.equalsIgnoreCase(channel)) {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates files MD5 hash
|
||||
*
|
||||
* @param file The file to digest
|
||||
* @return The MD5 hex or null, if the operation failed
|
||||
*/
|
||||
public String fileHash(File file) {
|
||||
FileInputStream is;
|
||||
try {
|
||||
is = new FileInputStream(file);
|
||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||
byte[] bytes = new byte[2048];
|
||||
int numBytes;
|
||||
while ((numBytes = is.read(bytes)) != -1) {
|
||||
md.update(bytes, 0, numBytes);
|
||||
}
|
||||
byte[] digest = md.digest();
|
||||
char[] hexChars = new char[digest.length * 2];
|
||||
for (int j = 0; j < digest.length; j++) {
|
||||
int v = digest[j] & 0xFF;
|
||||
hexChars[j * 2] = HEX_CHAR_ARRAY[v >>> 4];
|
||||
hexChars[j * 2 + 1] = HEX_CHAR_ARRAY[v & 0x0F];
|
||||
}
|
||||
is.close();
|
||||
return new String(hexChars);
|
||||
} catch (IOException | NoSuchAlgorithmException e) {
|
||||
p.getLogger().log(Level.SEVERE, "Could not digest " + file.getPath(), e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called right after update is done
|
||||
*
|
||||
* @author Arsen
|
||||
*/
|
||||
public interface UpdateCallback {
|
||||
|
||||
void updated(UpdateResult updateResult, Updater updater);
|
||||
}
|
||||
|
||||
private class SyncCallbackCaller extends BukkitRunnable {
|
||||
private List<UpdateCallback> callbacks;
|
||||
private UpdateResult updateResult;
|
||||
private Updater updater;
|
||||
|
||||
public void run() {
|
||||
for (UpdateCallback callback : callbacks) {
|
||||
callback.updated(updateResult, updater);
|
||||
}
|
||||
}
|
||||
|
||||
void call(List<UpdateCallback> callbacks, UpdateResult updateResult, Updater updater) {
|
||||
this.callbacks = callbacks;
|
||||
this.updateResult = updateResult;
|
||||
this.updater = updater;
|
||||
if (!Bukkit.getServer().isPrimaryThread())
|
||||
runTask(updater.p);
|
||||
else run();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package me.zombie_striker.tts;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
public class PlaySound {
|
||||
|
||||
// private final static Class<?> CRAFTPLAYERCLASS = ReflectionUtil
|
||||
// .getCraftbukkitClass("CraftPlayer", "entity");
|
||||
// private static final Class<?> PACKET_PLAY_OUT_NAMED_SOUND = /*ReflectionUtil
|
||||
// .isVersionHigherThan(1, 7) ?*/ReflectionUtil
|
||||
// .getNMSClass("PacketPlayOutNamedSoundEffect")/*: ReflectionUtil
|
||||
// .getNMSClass("Packet201PlayerInfo")*/;
|
||||
// private static final Class<?> MINECRAFT_KEY = ReflectionUtil
|
||||
// .getNMSClass("MinecraftKey");
|
||||
// private static final Class<?> SOUND_EFFECT = ReflectionUtil
|
||||
// .getNMSClass("SoundEffect");
|
||||
// private static final Class<?> PACKET_CLASS = ReflectionUtil
|
||||
// .getNMSClass("Packet");
|
||||
|
||||
public static void playSound(Player p, Location l, String sound, float vol, float pitch){
|
||||
// PacketPlayOutNamedSoundEffect packet = new PacketPlayOutNamedSoundEffect(new SoundEffect(new MinecraftKey(sound)), SoundCategory.VOICE, l.getX(), l.getY(), l.getZ(), vol, pitch);
|
||||
/*Object packet = ReflectionUtil
|
||||
.instantiate((Constructor<?>) ReflectionUtil
|
||||
.getConstructor(PACKET_PLAY_OUT_NAMED_SOUND)
|
||||
.get());
|
||||
|
||||
try {
|
||||
Object mckey = ReflectionUtil.instantiate((Constructor<?>) ReflectionUtil
|
||||
.getConstructor(MINECRAFT_KEY)
|
||||
.get());
|
||||
ReflectionUtil.setInstanceField(mckey, "a", sound);
|
||||
|
||||
Object sf = ReflectionUtil.instantiate((Constructor<?>) ReflectionUtil
|
||||
.getConstructor(SOUND_EFFECT)
|
||||
.get());
|
||||
ReflectionUtil.setInstanceField(sf, "a", mckey);*
|
||||
|
||||
ReflectionUtil.setInstanceField(packet, "a", sf);
|
||||
ReflectionUtil.setInstanceField(packet, "b", 1);
|
||||
ReflectionUtil.setInstanceField(packet, "c", l.getBlockX()*32);
|
||||
ReflectionUtil.setInstanceField(packet, "d", l.getBlockY()*32);
|
||||
ReflectionUtil.setInstanceField(packet, "e", l.getBlockZ()*32);
|
||||
ReflectionUtil.setInstanceField(packet, "f", vol);
|
||||
ReflectionUtil.setInstanceField(packet, "g", pitch);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}*/
|
||||
|
||||
// Object handle = ReflectionUtil.invokeMethod(
|
||||
// CRAFTPLAYERCLASS.cast(p), "getHandle", null);
|
||||
// Object playerConnection = ReflectionUtil.getInstanceField(handle,
|
||||
// "playerConnection");
|
||||
// ReflectionUtil.invokeMethod(playerConnection, "sendPacket",
|
||||
// new Class[] { PACKET_CLASS }, packet);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package me.zombie_striker.tts.data;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
public class PlayObject {
|
||||
public HashMap<Location,Sound> sound = new HashMap<>();
|
||||
public HashMap<Location,Integer> pitch = new HashMap<>();
|
||||
|
||||
public Location locationOfVoice;
|
||||
}
|
||||
39
Java/TextToSpeech/src/me/zombie_striker/tts/data/Sound.java
Normal file
39
Java/TextToSpeech/src/me/zombie_striker/tts/data/Sound.java
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Zombie_Striker
|
||||
*
|
||||
* 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 me.zombie_striker.tts.data;
|
||||
|
||||
public enum Sound {
|
||||
a('a',1), b('b',1), c('c',1), d('d',1), e('e',1), f('f',0), g('g',0), h('h',0), i('i',1), j(
|
||||
'j',0), l('l',1), m('m',1), n('n',1), o('o',1), p('p',1), q('q',0), r('r',1), s('s',0), t(
|
||||
't',0), u('u',1), v('v',0), w('w',1), x('x',0), y('y',1), z('z',0), th('#',0), ch(
|
||||
'~',1), E('&',1), A('@',1), I('!',1), oo('%',0), ow('(',1), oh(')',0), space(' ',-1);
|
||||
public char chars;
|
||||
public int pitch;
|
||||
|
||||
private Sound(char chars,int pitch) {
|
||||
this.chars = chars;
|
||||
this.pitch = pitch;
|
||||
}
|
||||
|
||||
public static Sound getClosestChar(String chars) {
|
||||
if(chars.equals("k"))return c;
|
||||
for (Sound s : Sound.values()) {
|
||||
if (chars.equals(s.chars + ""))
|
||||
return s;
|
||||
}
|
||||
return space;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Zombie_Striker
|
||||
*
|
||||
* 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 me.zombie_striker.tts.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class StoreableStrings {
|
||||
|
||||
static List<StoreableStrings> ls = new ArrayList<StoreableStrings>();
|
||||
public String s;
|
||||
|
||||
private StoreableStrings(String b) {
|
||||
this.s = b;
|
||||
ls.add(this);
|
||||
}
|
||||
|
||||
public static StoreableStrings getStoreableString(String s) {
|
||||
for (StoreableStrings ss : ls) {
|
||||
if (ss.s.equals(s))
|
||||
return ss;
|
||||
}
|
||||
return new StoreableStrings(s);
|
||||
}
|
||||
}
|
||||
123
Java/TextToSpeech/src/me/zombie_striker/tts/data/Word.java
Normal file
123
Java/TextToSpeech/src/me/zombie_striker/tts/data/Word.java
Normal file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Zombie_Striker
|
||||
*
|
||||
* 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 me.zombie_striker.tts.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Word {
|
||||
|
||||
public List<Sound> ls = new ArrayList<Sound>();
|
||||
|
||||
public Word(String s) {
|
||||
String[] g = s.replace(",", "").split("");
|
||||
for (int i = 0; i < g.length; i++) {
|
||||
ls.add(Sound.getClosestChar(g[i].toLowerCase()));
|
||||
}
|
||||
}
|
||||
|
||||
public Word(Object[] g) {
|
||||
for (int i = 0; i < g.length; i++) {
|
||||
ls.add((Sound) (g[i]));
|
||||
}
|
||||
}
|
||||
|
||||
public static Word parseString(String s1) {
|
||||
List<Sound> so = new ArrayList<Sound>();
|
||||
String s = s1
|
||||
// four letters
|
||||
.replaceAll("able", "@bl")
|
||||
.replaceAll("que", "qu")
|
||||
// Three letters
|
||||
.replaceAll("awe", "aw")
|
||||
.replaceFirst("age", "@j")
|
||||
.replaceAll("ele", "el&")
|
||||
.replaceAll("ght", "t")
|
||||
// two letters
|
||||
.replaceAll("kn", "n").replaceAll("ph", "f").replaceAll("en", "ehn")
|
||||
.replaceAll("gh", "g").replaceAll("ch", "~")
|
||||
.replaceAll("ee", "&").replaceAll("eo", "&")
|
||||
.replaceAll("ea", "&").replaceAll("oo", "%")
|
||||
.replaceAll("ou", "%").replaceAll("oi", "%!")
|
||||
.replaceAll("ia", "!a").replaceAll("ou", ")")
|
||||
.replaceAll("ow", "(").replaceAll("qu", "q%")
|
||||
.replaceAll("oa", "%").replaceAll("th", "#")
|
||||
.replaceAll("ai", "@").replaceAll("iece", "&s")
|
||||
.replaceAll("ie", "&").replaceAll("ce", "s")
|
||||
.replaceAll("gg", "g").replaceAll("nn", "n")
|
||||
.replaceAll("wh", "w").replaceAll("tt", "t")
|
||||
.replaceAll("le", "l").replaceAll("ll", "l")
|
||||
.replaceAll("ow", "(").replaceAll("dd", "d")
|
||||
.replaceAll("pp", "p").replaceAll("rr", "r")
|
||||
.replaceAll("ey", "&").replaceAll("ay", "@")
|
||||
.replaceAll("ck", "c")
|
||||
// One letter.
|
||||
.replaceAll("k", "c")
|
||||
|
||||
// For small sounds
|
||||
// .replaceAll("x", "xx").replaceAll("v","vv")
|
||||
|
||||
// Make sure no existing, common letters are read
|
||||
.replaceAll("!", "");
|
||||
|
||||
if (s.endsWith("o")) {
|
||||
s = s.substring(0, s.length() - 1) + ")";
|
||||
}
|
||||
|
||||
if ((s.length() - 3 >= 0 && (s.charAt(s.length() - 1) == 'e') && !(s
|
||||
.equals("the")))
|
||||
|| (s.length() - 4 >= 0 && (s.charAt(s.length() - 2) == 'e' && s
|
||||
.charAt(s.length() - 1) == 'r'))) {
|
||||
|
||||
int er = 0;
|
||||
if ((s.length() - 4 >= 0 && (s.charAt(s.length() - 2) == 'e' && s
|
||||
.charAt(s.length() - 1) == 'r')))
|
||||
er = 1;
|
||||
|
||||
s = s.substring(0, s.length() - 1-er);
|
||||
if (s.charAt(s.length() - 2 ) == 'a')
|
||||
s = s.substring(0, s.length() - 2 ) + "@"
|
||||
+ s.substring(s.length() - 1);
|
||||
else if (s.charAt(s.length() - 2) == 'e')
|
||||
s = s.substring(0, s.length() - 2) + "&"
|
||||
+ s.substring(s.length() - 1);
|
||||
else if (s.charAt(s.length() - 2 ) == 'i')
|
||||
s = s.substring(0, s.length() - 2 ) + "!"
|
||||
+ s.substring(s.length() - 1 );
|
||||
else if (s.charAt(s.length() - 2) == 'o')
|
||||
s = s.substring(0, s.length() - 2 ) + ")"
|
||||
+ s.substring(s.length() - 1 );
|
||||
else if (s.charAt(s.length() - 2 ) == 'u')
|
||||
s = s.substring(0, s.length() - 2 ) + "%"
|
||||
+ s.substring(s.length() - 1 );
|
||||
|
||||
if(er==1)s=s+"er";
|
||||
}
|
||||
//Secondary stuff
|
||||
s=s.replaceAll("er", "r");
|
||||
|
||||
|
||||
for (int chars = 0; chars < s.length(); chars++) {
|
||||
for (Sound s2 : Sound.values()) {
|
||||
if (s.charAt(chars) == (s2.chars)) {
|
||||
so.add(s2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Word(so.toArray());
|
||||
}
|
||||
}
|
||||
425
Java/TextToSpeech/src/me/zombie_striker/tts/util/LangFile.java
Normal file
425
Java/TextToSpeech/src/me/zombie_striker/tts/util/LangFile.java
Normal file
@@ -0,0 +1,425 @@
|
||||
package me.zombie_striker.tts.util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import me.zombie_striker.tts.CoreTTS;
|
||||
import me.zombie_striker.tts.data.Sound;
|
||||
import me.zombie_striker.tts.data.StoreableStrings;
|
||||
import me.zombie_striker.tts.data.Word;
|
||||
|
||||
public class LangFile {
|
||||
public static HashMap<StoreableStrings, Word> words = new HashMap<StoreableStrings, Word>();
|
||||
|
||||
static double currentVersion = 1.2;
|
||||
|
||||
public static void verify(File langFile) {
|
||||
try {
|
||||
boolean newFile = false;
|
||||
if (!langFile.exists()) {
|
||||
langFile.createNewFile();
|
||||
newFile = true;
|
||||
}
|
||||
BufferedReader br = new BufferedReader(new FileReader(langFile));
|
||||
if (newFile
|
||||
|| Double.parseDouble(br.readLine().split(": ")[1].trim()) != currentVersion) {
|
||||
|
||||
for (int i = 0; i < 2000; i++) {
|
||||
String word = br.readLine();
|
||||
if (word == null)
|
||||
break;
|
||||
if (word.trim().length() == 0)
|
||||
continue;
|
||||
if (word.trim().startsWith("+"))
|
||||
continue;
|
||||
|
||||
StoreableStrings ss = StoreableStrings
|
||||
.getStoreableString(word.split(" : ")[0].trim());
|
||||
|
||||
words.put(ss, new Word(word.split(" : ")[1].trim()));
|
||||
}
|
||||
addWords();
|
||||
|
||||
BufferedWriter bw = new BufferedWriter(new FileWriter(langFile));
|
||||
bw.write("+Version: " + currentVersion);
|
||||
bw.newLine();
|
||||
bw.write("+ This is a reminder that comments can be made by adding + to the beginning of a line.");
|
||||
bw.newLine();
|
||||
bw.write("+ ");
|
||||
bw.newLine();
|
||||
bw.write("+ To add a new word, create a new line starting with the word, in lower case, that you want MC to read out");
|
||||
bw.newLine();
|
||||
bw.write("+ and add a colon and then the sounds needed to read-out the word.");
|
||||
bw.newLine();
|
||||
bw.write("+ ");
|
||||
bw.newLine();
|
||||
bw.write("+ Known sounds : a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,#,~,&,@,!,%,( , )");
|
||||
bw.newLine();
|
||||
bw.write("+ '#' is 'th', '~' is 'ch', '& is 'E', '@' is A, '!' is 'I' '%' is 'oo' (as in Loot), '(' is 'ow', and ')' is 'oh' ");
|
||||
bw.newLine();
|
||||
bw.write("+ Below is an example of how to add a words, and how to use the extra characters");
|
||||
bw.newLine();
|
||||
for (Entry<StoreableStrings, Word> wo : words.entrySet()) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (Sound s : wo.getValue().ls) {
|
||||
sb.append(s.chars);
|
||||
}
|
||||
bw.write(wo.getKey().s + " : " + sb.toString());
|
||||
bw.newLine();
|
||||
}
|
||||
|
||||
bw.flush();
|
||||
bw.close();
|
||||
}
|
||||
br.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
words.clear();
|
||||
}
|
||||
|
||||
private static void addWords() {
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("1"), new Word("won"));
|
||||
words.put(StoreableStrings.getStoreableString("one"), new Word("won"));
|
||||
words.put(StoreableStrings.getStoreableString("won"), new Word("won"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("2"), new Word("t%"));
|
||||
words.put(StoreableStrings.getStoreableString("to"), new Word("t%"));
|
||||
words.put(StoreableStrings.getStoreableString("too"), new Word("t%"));
|
||||
words.put(StoreableStrings.getStoreableString("two"), new Word("t%"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("3"), new Word("#r&"));
|
||||
words.put(StoreableStrings.getStoreableString("three"), new Word("#r&"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("4"), new Word("f)r"));
|
||||
words.put(StoreableStrings.getStoreableString("four"), new Word("f)r"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("5"), new Word("f!vv"));
|
||||
words.put(StoreableStrings.getStoreableString("five"), new Word("f!vv"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("6"), new Word("sixx"));
|
||||
words.put(StoreableStrings.getStoreableString("six"), new Word("sixx"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("7"), new Word("seven"));
|
||||
words.put(StoreableStrings.getStoreableString("seven"), new Word(
|
||||
"seven"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("8"), new Word("@t"));
|
||||
words.put(StoreableStrings.getStoreableString("eight"), new Word("@t"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("9"), new Word("n!nne"));
|
||||
words.put(StoreableStrings.getStoreableString("nine"),
|
||||
new Word("n!nne"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("0"), new Word("z&ro"));
|
||||
words.put(StoreableStrings.getStoreableString("zero"), new Word("z&ro"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("10"), new Word("ten"));
|
||||
words.put(StoreableStrings.getStoreableString("ten"), new Word("ten"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("a"), new Word("a")); // Changed
|
||||
// from
|
||||
// @
|
||||
// to
|
||||
// a
|
||||
// for
|
||||
// multiple
|
||||
// languages
|
||||
words.put(StoreableStrings.getStoreableString("b"), new Word("b&"));
|
||||
words.put(StoreableStrings.getStoreableString("c"), new Word("s&"));
|
||||
words.put(StoreableStrings.getStoreableString("d"), new Word("d&"));
|
||||
words.put(StoreableStrings.getStoreableString("e"), new Word("&"));
|
||||
words.put(StoreableStrings.getStoreableString("f"), new Word("ef"));
|
||||
words.put(StoreableStrings.getStoreableString("g"), new Word("j&"));
|
||||
words.put(StoreableStrings.getStoreableString("h"), new Word("@~"));
|
||||
words.put(StoreableStrings.getStoreableString("i"), new Word("!"));
|
||||
words.put(StoreableStrings.getStoreableString("j"), new Word("j@"));
|
||||
words.put(StoreableStrings.getStoreableString("k"), new Word("c@"));
|
||||
words.put(StoreableStrings.getStoreableString("l"), new Word("el"));
|
||||
words.put(StoreableStrings.getStoreableString("m"), new Word("em"));
|
||||
words.put(StoreableStrings.getStoreableString("n"), new Word("en"));
|
||||
words.put(StoreableStrings.getStoreableString("o"), new Word(")"));
|
||||
words.put(StoreableStrings.getStoreableString("p"), new Word("p&"));
|
||||
words.put(StoreableStrings.getStoreableString("q"), new Word("qy%"));
|
||||
words.put(StoreableStrings.getStoreableString("r"), new Word("ar"));
|
||||
words.put(StoreableStrings.getStoreableString("s"), new Word("es"));
|
||||
words.put(StoreableStrings.getStoreableString("t"), new Word("t&"));
|
||||
words.put(StoreableStrings.getStoreableString("u"), new Word("y%"));
|
||||
words.put(StoreableStrings.getStoreableString("v"), new Word("v&"));
|
||||
words.put(StoreableStrings.getStoreableString("w"), new Word("dubl y%"));
|
||||
words.put(StoreableStrings.getStoreableString("x"), new Word("exx"));
|
||||
words.put(StoreableStrings.getStoreableString("y"), new Word("w!"));
|
||||
words.put(StoreableStrings.getStoreableString("z"), new Word("z&"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("future"), new Word(
|
||||
"f%~or"));
|
||||
words.put(StoreableStrings.getStoreableString("damn"), new Word("dam"));
|
||||
words.put(StoreableStrings.getStoreableString("dance"),
|
||||
new Word("dans"));
|
||||
words.put(StoreableStrings.getStoreableString("cat"), new Word("cat"));
|
||||
words.put(StoreableStrings.getStoreableString("nice"), new Word("n!s"));
|
||||
words.put(StoreableStrings.getStoreableString("high"), new Word("h!"));
|
||||
words.put(StoreableStrings.getStoreableString("sky"), new Word("h!"));
|
||||
words.put(StoreableStrings.getStoreableString("skyblock"), new Word(
|
||||
"h!"));
|
||||
words.put(StoreableStrings.getStoreableString("eye"), new Word("!"));
|
||||
words.put(StoreableStrings.getStoreableString("eyes"), new Word("!s"));
|
||||
words.put(StoreableStrings.getStoreableString("have"), new Word("hav"));
|
||||
words.put(StoreableStrings.getStoreableString("fancy"), new Word(
|
||||
"fanc&"));
|
||||
words.put(StoreableStrings.getStoreableString("fantasy"), new Word(
|
||||
"fantas&"));
|
||||
words.put(StoreableStrings.getStoreableString("pineapple"), new Word(
|
||||
"p!napl"));
|
||||
words.put(StoreableStrings.getStoreableString("because"), new Word(
|
||||
"b&cus"));
|
||||
words.put(StoreableStrings.getStoreableString("makes"),
|
||||
new Word("m@cs"));
|
||||
words.put(StoreableStrings.getStoreableString("voice"),
|
||||
new Word("v%!s"));
|
||||
words.put(StoreableStrings.getStoreableString("thread"), new Word(
|
||||
"#red"));
|
||||
words.put(StoreableStrings.getStoreableString("easy"), new Word("&s&"));
|
||||
words.put(StoreableStrings.getStoreableString("easier"), new Word(
|
||||
"&s&r"));
|
||||
words.put(StoreableStrings.getStoreableString("easiest"), new Word(
|
||||
"&s&est"));
|
||||
words.put(StoreableStrings.getStoreableString("beautiful"), new Word(
|
||||
"b&yutiful"));
|
||||
words.put(StoreableStrings.getStoreableString("beautifull"), new Word(
|
||||
"b&yutiful"));
|
||||
words.put(StoreableStrings.getStoreableString("secret"), new Word(
|
||||
"s&cret"));
|
||||
words.put(StoreableStrings.getStoreableString("iron"), new Word("!ron"));
|
||||
words.put(StoreableStrings.getStoreableString("gold"), new Word("G)ld"));
|
||||
words.put(StoreableStrings.getStoreableString("queue"), new Word("q%"));
|
||||
words.put(StoreableStrings.getStoreableString("work"), new Word("wrc"));
|
||||
words.put(StoreableStrings.getStoreableString("working"), new Word(
|
||||
"wrcing"));
|
||||
words.put(StoreableStrings.getStoreableString("robot"), new Word(
|
||||
"r)bot"));
|
||||
words.put(StoreableStrings.getStoreableString("loot"), new Word("l%t"));
|
||||
words.put(StoreableStrings.getStoreableString("pi"), new Word("p!"));
|
||||
words.put(StoreableStrings.getStoreableString("pie"), new Word("p!"));
|
||||
words.put(StoreableStrings.getStoreableString("pizza"),
|
||||
new Word("p&za"));
|
||||
words.put(StoreableStrings.getStoreableString("lite"), new Word("l!t"));
|
||||
words.put(StoreableStrings.getStoreableString("light"), new Word("l!t"));
|
||||
words.put(StoreableStrings.getStoreableString("im"), new Word("!m"));
|
||||
words.put(StoreableStrings.getStoreableString("he"), new Word("h&"));
|
||||
words.put(StoreableStrings.getStoreableString("hes"), new Word("h&s"));
|
||||
words.put(StoreableStrings.getStoreableString("life"), new Word("l!f"));
|
||||
words.put(StoreableStrings.getStoreableString("man"), new Word("man"));
|
||||
words.put(StoreableStrings.getStoreableString("human"), new Word(
|
||||
"h%man"));
|
||||
words.put(StoreableStrings.getStoreableString("you"), new Word("y%"));
|
||||
words.put(StoreableStrings.getStoreableString("crazy"), new Word(
|
||||
"cr@z&"));
|
||||
words.put(StoreableStrings.getStoreableString("love"), new Word("luvv"));
|
||||
words.put(StoreableStrings.getStoreableString("once"), new Word("wons"));
|
||||
words.put(StoreableStrings.getStoreableString("me"), new Word("m&"));
|
||||
words.put(StoreableStrings.getStoreableString("now"), new Word("n(w"));
|
||||
words.put(StoreableStrings.getStoreableString("know"), new Word("n("));
|
||||
words.put(StoreableStrings.getStoreableString("knowledge"), new Word(
|
||||
"n(lej"));
|
||||
words.put(StoreableStrings.getStoreableString("ledge"), new Word("lej"));
|
||||
words.put(StoreableStrings.getStoreableString("edge"), new Word("ej"));
|
||||
words.put(StoreableStrings.getStoreableString("baby"), new Word("b@b&"));
|
||||
words.put(StoreableStrings.getStoreableString("like"), new Word("l!c"));
|
||||
words.put(StoreableStrings.getStoreableString("any"), new Word("a,n,&"));
|
||||
words.put(StoreableStrings.getStoreableString("anyway"), new Word(
|
||||
"a,n,&,w,a,y"));
|
||||
words.put(StoreableStrings.getStoreableString("anyways"), new Word(
|
||||
"a,n,&,w,a,y,s"));
|
||||
words.put(StoreableStrings.getStoreableString("were"),
|
||||
new Word("w,e,r"));
|
||||
words.put(StoreableStrings.getStoreableString("die"), new Word("d,!"));
|
||||
words.put(StoreableStrings.getStoreableString("friend"), new Word(
|
||||
"f,r,e,n,d"));
|
||||
words.put(StoreableStrings.getStoreableString("friends"), new Word(
|
||||
"f,r,e,n,d,s"));
|
||||
words.put(StoreableStrings.getStoreableString("no"), new Word("n,)"));
|
||||
words.put(StoreableStrings.getStoreableString("my"), new Word("m,!"));
|
||||
words.put(StoreableStrings.getStoreableString("so"), new Word("s,)"));
|
||||
words.put(StoreableStrings.getStoreableString("here"),
|
||||
new Word("h,&,r"));
|
||||
words.put(StoreableStrings.getStoreableString("some"),
|
||||
new Word("s,o,m"));
|
||||
words.put(StoreableStrings.getStoreableString("together"), new Word(
|
||||
"t,%,g,e,#,e,r"));
|
||||
words.put(StoreableStrings.getStoreableString("the"), new Word("#,&"));
|
||||
words.put(StoreableStrings.getStoreableString("whole"), new Word(
|
||||
"h,),l"));
|
||||
words.put(StoreableStrings.getStoreableString("we"), new Word("w,&"));
|
||||
words.put(StoreableStrings.getStoreableString("somebody"), new Word(
|
||||
"s,o,m,b,o,d,&"));
|
||||
words.put(StoreableStrings.getStoreableString("heres"), new Word(
|
||||
"h,&,r,s"));
|
||||
words.put(StoreableStrings.getStoreableString("over"), new Word(
|
||||
"%,v,e,r"));
|
||||
words.put(StoreableStrings.getStoreableString("what"), new Word(
|
||||
"w,a,h,t"));
|
||||
words.put(StoreableStrings.getStoreableString("angels"), new Word(
|
||||
"a,n,j,e,l,s"));
|
||||
words.put(StoreableStrings.getStoreableString("angel"), new Word(
|
||||
"a,n,j,e,l"));
|
||||
words.put(StoreableStrings.getStoreableString("are"), new Word("a,r"));
|
||||
words.put(StoreableStrings.getStoreableString("go"), new Word("g,%"));
|
||||
words.put(StoreableStrings.getStoreableString("sandstone"), new Word(
|
||||
"s,a,n,d,s,t,),n"));
|
||||
words.put(StoreableStrings.getStoreableString("stone"), new Word(
|
||||
"s,t,),n"));
|
||||
words.put(StoreableStrings.getStoreableString("going"), new Word(
|
||||
"g,%,i,n,g"));
|
||||
words.put(StoreableStrings.getStoreableString("oh"), new Word(")"));
|
||||
words.put(StoreableStrings.getStoreableString("fire"),
|
||||
new Word("f,!,r"));
|
||||
words.put(StoreableStrings.getStoreableString("do"), new Word("d,%"));
|
||||
words.put(StoreableStrings.getStoreableString("doing"), new Word(
|
||||
"d,%,i,n,g"));
|
||||
words.put(StoreableStrings.getStoreableString("people"), new Word(
|
||||
"p,&,p,),l"));
|
||||
words.put(StoreableStrings.getStoreableString("take"),
|
||||
new Word("t,@,c"));
|
||||
words.put(StoreableStrings.getStoreableString("sign"),
|
||||
new Word("s,!,n"));
|
||||
words.put(StoreableStrings.getStoreableString("town"),
|
||||
new Word("t,(,n"));
|
||||
words.put(StoreableStrings.getStoreableString("hi"), new Word("h,!"));
|
||||
words.put(StoreableStrings.getStoreableString("hia"), new Word("h,!,a"));
|
||||
words.put(StoreableStrings.getStoreableString("be"), new Word(
|
||||
"b&"));
|
||||
words.put(StoreableStrings.getStoreableString("cute"),
|
||||
new Word("c,%,t"));
|
||||
words.put(StoreableStrings.getStoreableString("maybe"), new Word(
|
||||
"m,@,b,&,&"));
|
||||
words.put(StoreableStrings.getStoreableString("wood"),
|
||||
new Word("w,%,d"));
|
||||
words.put(StoreableStrings.getStoreableString("ocean"), new Word(
|
||||
"),s,u,n"));
|
||||
words.put(StoreableStrings.getStoreableString("would"), new Word(
|
||||
"w,%,d"));
|
||||
words.put(StoreableStrings.getStoreableString("kind"), new Word(
|
||||
"c,!,n,d"));
|
||||
words.put(StoreableStrings.getStoreableString("kindly"), new Word(
|
||||
"c,!,n,d,l,y"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("omg"), new Word(
|
||||
"),e,m,j,&"));
|
||||
words.put(StoreableStrings.getStoreableString("lol"), new Word(
|
||||
"e,l,),e,l"));
|
||||
words.put(StoreableStrings.getStoreableString("gtfo"), new Word(
|
||||
"j,&,t,&,e,f,)"));
|
||||
words.put(StoreableStrings.getStoreableString("wtf"), new Word(
|
||||
"w,u,t, ,#,e, ,e,f"));
|
||||
words.put(StoreableStrings.getStoreableString("wth"), new Word(
|
||||
"w,u,t, ,#,e, ,@,~"));
|
||||
words.put(StoreableStrings.getStoreableString("wrench"), new Word(
|
||||
"w,r,e,n,~"));
|
||||
words.put(StoreableStrings.getStoreableString("makes"), new Word(
|
||||
"m,@,c,s"));
|
||||
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("laugh"), new Word(
|
||||
"l,a,f"));
|
||||
|
||||
words.put(StoreableStrings.getStoreableString("photo"), new Word(
|
||||
"f,),t,)"));
|
||||
words.put(StoreableStrings.getStoreableString("photograph"), new Word(
|
||||
"f,),t,),g,r,a,f"));
|
||||
|
||||
// Italian
|
||||
words.put(StoreableStrings.getStoreableString("ciao"), new Word("sao"));
|
||||
words.put(StoreableStrings.getStoreableString("tutti"),
|
||||
new Word("t%t&"));
|
||||
words.put(StoreableStrings.getStoreableString("mi"), new Word("m&"));
|
||||
words.put(StoreableStrings.getStoreableString("chiamo"), new Word(
|
||||
"~amo"));
|
||||
words.put(StoreableStrings.getStoreableString("mio"), new Word("m&o"));
|
||||
words.put(StoreableStrings.getStoreableString("giocatore"), new Word(
|
||||
"z%gator@"));
|
||||
words.put(StoreableStrings.getStoreableString("moderatore"), new Word(
|
||||
"moderator@"));
|
||||
words.put(StoreableStrings.getStoreableString("amministratore"),
|
||||
new Word("aministrator@"));
|
||||
words.put(StoreableStrings.getStoreableString("passeggio"), new Word(
|
||||
"passezz)"));
|
||||
words.put(StoreableStrings.getStoreableString("esecuzione"), new Word(
|
||||
"esec%zune"));
|
||||
words.put(StoreableStrings.getStoreableString("collegare"), new Word(
|
||||
"c)legare"));
|
||||
words.put(StoreableStrings.getStoreableString("pelle"), new Word(
|
||||
"pel@"));
|
||||
words.put(StoreableStrings.getStoreableString("diamante"), new Word(
|
||||
"d&amonte"));
|
||||
words.put(StoreableStrings.getStoreableString("oro"), new Word(
|
||||
"or)"));
|
||||
words.put(StoreableStrings.getStoreableString("ferro"), new Word(
|
||||
"fe#ro"));
|
||||
words.put(StoreableStrings.getStoreableString("mela"), new Word(
|
||||
"mela"));
|
||||
words.put(StoreableStrings.getStoreableString("melone"), new Word(
|
||||
"mel)ne"));
|
||||
words.put(StoreableStrings.getStoreableString("rotaia"), new Word(
|
||||
"rotaia"));
|
||||
words.put(StoreableStrings.getStoreableString("pietra"), new Word(
|
||||
"p&etra"));
|
||||
words.put(StoreableStrings.getStoreableString("sporco"), new Word(
|
||||
"sporco"));
|
||||
words.put(StoreableStrings.getStoreableString("los"), new Word(
|
||||
"l)s"));
|
||||
words.put(StoreableStrings.getStoreableString("lo"), new Word(
|
||||
"l)s"));
|
||||
words.put(StoreableStrings.getStoreableString("granito"), new Word(
|
||||
"gran&to"));
|
||||
words.put(StoreableStrings.getStoreableString("ossidiana"), new Word(
|
||||
")sidana"));
|
||||
words.put(StoreableStrings.getStoreableString("letto"), new Word(
|
||||
"let)"));
|
||||
words.put(StoreableStrings.getStoreableString("uomini"), new Word(
|
||||
"%amin&"));
|
||||
words.put(StoreableStrings.getStoreableString("uomo"), new Word(
|
||||
"%om)"));
|
||||
words.put(StoreableStrings.getStoreableString("cane"), new Word(
|
||||
"cane"));
|
||||
words.put(StoreableStrings.getStoreableString("gatto"), new Word(
|
||||
"gat)"));
|
||||
words.put(StoreableStrings.getStoreableString("lupo"), new Word(
|
||||
"l%p)"));
|
||||
words.put(StoreableStrings.getStoreableString("calamaro"), new Word(
|
||||
"calamar)"));
|
||||
words.put(StoreableStrings.getStoreableString("mucca"), new Word(
|
||||
"m%ca"));
|
||||
words.put(StoreableStrings.getStoreableString("mucche"), new Word(
|
||||
"m%ce"));
|
||||
words.put(StoreableStrings.getStoreableString("pollo"), new Word(
|
||||
"p)lo"));
|
||||
words.put(StoreableStrings.getStoreableString("polli"), new Word(
|
||||
"poli"));
|
||||
words.put(StoreableStrings.getStoreableString("bloccare"), new Word(
|
||||
"blocare"));
|
||||
words.put(StoreableStrings.getStoreableString("blocchi"), new Word(
|
||||
"bloc&"));
|
||||
words.put(StoreableStrings.getStoreableString("cielo"), new Word(
|
||||
"~elo"));
|
||||
words.put(StoreableStrings.getStoreableString("Luna"), new Word(
|
||||
"l%na"));
|
||||
words.put(StoreableStrings.getStoreableString("saluti"), new Word(
|
||||
"sal%t&"));
|
||||
words.put(StoreableStrings.getStoreableString("saluto"), new Word(
|
||||
"saluto"));
|
||||
words.put(StoreableStrings.getStoreableString("bene"), new Word(
|
||||
"bene"));
|
||||
words.put(StoreableStrings.getStoreableString("cattivo"), new Word(
|
||||
"cat&v)"));
|
||||
words.put(StoreableStrings.getStoreableString("peggio"), new Word(
|
||||
"pedz)"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package me.zombie_striker.tts.util;
|
||||
|
||||
import me.zombie_striker.tts.CoreTTS;
|
||||
import me.zombie_striker.tts.data.PlayObject;
|
||||
import me.zombie_striker.tts.data.Sound;
|
||||
import me.zombie_striker.tts.data.StoreableStrings;
|
||||
import me.zombie_striker.tts.data.Word;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class TalkUtil {
|
||||
|
||||
private static CoreTTS core;
|
||||
|
||||
static{
|
||||
core = (CoreTTS) Bukkit.getPluginManager().getPlugin("TextToSpeech");
|
||||
}
|
||||
|
||||
public static void speakOut(String fullText, Player from){
|
||||
int pitch = core.pitch.get(from.getUniqueId());
|
||||
speakOut(fullText, from.getLocation(), pitch);
|
||||
}
|
||||
public static void speakOut(String fullText, Location from, int pitch){
|
||||
String[] message = ChatColor.stripColor(fullText.toLowerCase()).split(" ");
|
||||
long currentTick = core.getTick() + 3;
|
||||
for (int i = 0; i < message.length; i++) {
|
||||
int pause = 0;
|
||||
String m = message[i];
|
||||
//int pitch =core.pitch.get(e.getPlayer().getUniqueId());
|
||||
|
||||
if (m.startsWith("<") && m.contains(":")) {
|
||||
pitch = Integer.parseInt(m.split(":")[1].replaceAll(">", ""));
|
||||
m = m.substring(1);
|
||||
}else{
|
||||
m = m.replaceAll("9", " 9 ").replaceAll("8", " 8 ")
|
||||
.replaceAll("7", " 7 ").replaceAll("6", " 6 ")
|
||||
.replaceAll("5", " 5 ").replaceAll("4", " 4 ")
|
||||
.replaceAll("3", " 3 ").replaceAll("2", " 2 ")
|
||||
.replaceAll("1", " 1 ").replaceAll("0", " 0 ");
|
||||
}
|
||||
|
||||
if (m.contains(",")) {
|
||||
m = m.replaceAll(",", "");
|
||||
pause += 2;
|
||||
}
|
||||
if (m.contains(".")) {
|
||||
m = m.replaceAll(".", "");
|
||||
pause += 3;
|
||||
}
|
||||
if (m.contains("'"))
|
||||
m = m.replaceAll("'", "");
|
||||
|
||||
StoreableStrings ss = StoreableStrings.getStoreableString(m
|
||||
.toLowerCase());
|
||||
Word w = null;
|
||||
if (core.words.containsKey(ss)) {
|
||||
w = core.words.get(ss);
|
||||
} else {
|
||||
w = Word.parseString(ss.s.toLowerCase());
|
||||
core.words.put(ss, w);
|
||||
}
|
||||
for (int l = 0; l < w.ls.size(); l++) {
|
||||
PlayObject ls = core.map.get(currentTick);
|
||||
if (ls == null)
|
||||
ls = new PlayObject();
|
||||
ls.sound.put(from, w.ls.get(l));
|
||||
ls.pitch.put(from, pitch);
|
||||
ls.locationOfVoice=from;
|
||||
core.map.put(currentTick, ls);
|
||||
currentTick++;
|
||||
//Make the I sound longer
|
||||
if (w.ls.get(l) == Sound.I)
|
||||
currentTick++;
|
||||
}
|
||||
currentTick += 0 + pause;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user