Reupload after bitbucket wipe
34
CREATORS
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
http://www.hlxcommunity.com
|
||||||
|
Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
|
||||||
|
HLstatsX is an enhanced version of ELstatsNEO
|
||||||
|
ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
http://ovrsized.neo-soft.org/
|
||||||
|
Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
|
||||||
|
ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
http://www.hlstatsx.com/
|
||||||
|
Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
|
||||||
|
HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
http://sourceforge.net/projects/hlstats/
|
||||||
|
Copyright (C) 2001 Simon Garner
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
For support and installation notes visit http://ovrsized.neo-soft.org!
|
101
IMAGES
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
HLStatsX Community Edition
|
||||||
|
IMAGES Credits
|
||||||
|
|
||||||
|
NOTE: The developers have made a good-faith effort to give credit where credit is due for images provided to the project.
|
||||||
|
All images remain the property of their respective owners.
|
||||||
|
|
||||||
|
HLStatsX Community Edition
|
||||||
|
Classic Game Icons: vaksa (http://www.myspace.com/vaksa)
|
||||||
|
Logo: Viper
|
||||||
|
Nav-icons: Viper
|
||||||
|
Signature Images: R3M
|
||||||
|
|
||||||
|
Hitbox Flash Animation by sandman {sandman@borgcluster.de)
|
||||||
|
Updated with new logo by BusteR
|
||||||
|
|
||||||
|
Age of Chivalry
|
||||||
|
Game icon: pirate555
|
||||||
|
|
||||||
|
Counter-Strike
|
||||||
|
Maps: (jumpin) banana from HLStats Project
|
||||||
|
Ribbons: Unity
|
||||||
|
Weapons: (jumpin) banana from HLStats Project
|
||||||
|
|
||||||
|
Counter-Strike: Source
|
||||||
|
Awards: Hellraiser from ELstatsNEO (http://forum.elstatsneo.de), HS Fighter
|
||||||
|
Heatmaps: stachi,
|
||||||
|
Ribbons: Hellraiser from ELstatsNEO (http://forum.elstatsneo.de), HS Fighter
|
||||||
|
Weapons: HO!NO!
|
||||||
|
|
||||||
|
Day of Defeat
|
||||||
|
Heatmaps: Zuko
|
||||||
|
Maps: (jumpin) banana from HLStats Project
|
||||||
|
Weapons: (jumpin) banana from HLStats Project
|
||||||
|
|
||||||
|
Day of Defeat: Source
|
||||||
|
Awards: Mosalar
|
||||||
|
|
||||||
|
Fistful of Frags
|
||||||
|
Awards: Mosalar
|
||||||
|
|
||||||
|
Goldeneye Source
|
||||||
|
Awards: Dr.NO
|
||||||
|
Maps: Dr.NO
|
||||||
|
Roles: Dr.NO
|
||||||
|
Weapons: Dr.No
|
||||||
|
|
||||||
|
HL2DM
|
||||||
|
Awards: Osiris_TSGK
|
||||||
|
Ribbons: Osiris_TSGK
|
||||||
|
|
||||||
|
Insurgency
|
||||||
|
Awards: Trawa
|
||||||
|
Ribbons: Trawa
|
||||||
|
Other: Zuko, _KaszpiR_
|
||||||
|
|
||||||
|
Left4Dead
|
||||||
|
Awards: U#O, MrXorMrY
|
||||||
|
Maps: Honk
|
||||||
|
Ribbons: U#O, MrXorMrY
|
||||||
|
Roles: MrXorMrY
|
||||||
|
Weapons: R3M
|
||||||
|
|
||||||
|
Left4Dead 2
|
||||||
|
Awards: U#0, MrXorMry
|
||||||
|
Ribbons: U#0, MrXorMry
|
||||||
|
Roles: ribit
|
||||||
|
Weapons: R3M
|
||||||
|
Signature images: gH0sTy (http://www.affenkaefig.com/)
|
||||||
|
|
||||||
|
Natural-Selection
|
||||||
|
Heatmaps: Zuko
|
||||||
|
Maps: (jumpin) banana from HLStats Project from HLStats Project
|
||||||
|
Weapons: (jumpin) banana from HLStats Project
|
||||||
|
|
||||||
|
NeoTokyo Source
|
||||||
|
Awards: R3M
|
||||||
|
Maps: R3M
|
||||||
|
Ribbons: R3M
|
||||||
|
Weapons: R3M
|
||||||
|
|
||||||
|
Stargate: The Last Stand
|
||||||
|
Heatmaps: Zuko
|
||||||
|
|
||||||
|
Team Fortress Classic
|
||||||
|
Heatmaps: Zuko
|
||||||
|
Maps: (jumpin) banana from HLStats Project
|
||||||
|
Weapons: (jumpin) banana from HLStats Project
|
||||||
|
|
||||||
|
Team Fortress 2
|
||||||
|
Awards: FernFerret, Semikolon, DragonShadow, Fluff-a-Licious, Rakshot, bug
|
||||||
|
Heatmaps: Patalete, Roman Sobol
|
||||||
|
Maps: Extrim25
|
||||||
|
Ribbons: FernFerret, Semikolon, DragonShadow, Rakshot, bug
|
||||||
|
Sandvich Award Icon: aveneyer (aveneyer@gmail.com)
|
||||||
|
Weapons: HO!NO!, Semikolon, FernFerret, DragonShadow, Solarpowered, soolshock, bug
|
||||||
|
|
||||||
|
Zombie Panic Source
|
||||||
|
Awards: aveneyer (aveneyer@gmail.com)
|
||||||
|
Game icon: ~WaywerdWolf (wiff23@msn.com)
|
||||||
|
Weapons: aveneyer (aveneyer@gmail.com)
|
||||||
|
|
340
LICENSE
Normal file
|
@ -0,0 +1,340 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General
|
||||||
|
Public License instead of this License.
|
54
README
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
===========================================================
|
||||||
|
HLstatsX Community Edition
|
||||||
|
http://www.hlxce.com
|
||||||
|
===========================================================
|
||||||
|
|
||||||
|
HLstatsX Community Edition is an open-source project licensed
|
||||||
|
under GNU General Public License v2 and is a real-time stats
|
||||||
|
and ranking for Source engine based games. HLstatsX Community
|
||||||
|
Edition uses a Perl daemon to parse the log streamed from the
|
||||||
|
game server. The data is stored in a MySQL Database and has
|
||||||
|
a PHP frontend.
|
||||||
|
|
||||||
|
|
||||||
|
For installation help, please visit our web site:
|
||||||
|
|
||||||
|
http://www.hlxce.com
|
||||||
|
http://wiki.hlxce.com
|
||||||
|
|
||||||
|
or our forums:
|
||||||
|
|
||||||
|
http://forums.hlxce.com
|
||||||
|
|
||||||
|
or join us on IRC:
|
||||||
|
|
||||||
|
irc.gamesurge.net, channel #HLXCE
|
||||||
|
|
||||||
|
|
||||||
|
To be notified of upcoming releases, you can join our
|
||||||
|
FreeLists group:
|
||||||
|
|
||||||
|
http://www.freelists.org/list/hlxce
|
||||||
|
|
||||||
|
|
||||||
|
We are also always looking for Beta-Testers. Join our
|
||||||
|
Google Group at:
|
||||||
|
|
||||||
|
http://groups.google.com/group/hlxce-beta-testers
|
||||||
|
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
|
||||||
|
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.
|
BIN
amxmodx/plugins/hlstatsx_commands_cstrike.amxx
Normal file
BIN
amxmodx/plugins/hlstatsx_commands_dod.amxx
Normal file
BIN
amxmodx/plugins/hlstatsx_commands_ns.amxx
Normal file
BIN
amxmodx/plugins/hlstatsx_commands_tfc.amxx
Normal file
1355
amxmodx/scripting/hlstatsx_commands_cstrike.sma
Normal file
1138
amxmodx/scripting/hlstatsx_commands_dod.sma
Normal file
872
amxmodx/scripting/hlstatsx_commands_ns.sma
Normal file
|
@ -0,0 +1,872 @@
|
||||||
|
/**
|
||||||
|
* 2008 - Modified by Nicholas Hastings (psychonic) for used with HLstatsX Community Edition
|
||||||
|
* http://www.hlxcommunity.com
|
||||||
|
*
|
||||||
|
* HLstatsX - AMX Mod X plugin to display ingame messages
|
||||||
|
* http://www.hlstatsx.com/
|
||||||
|
* Copyright (C) 2007-2008 TTS Oetzel & Goerz GmbH
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma dynamic 16000
|
||||||
|
|
||||||
|
#include <amxmodx>
|
||||||
|
#include <amxmisc>
|
||||||
|
|
||||||
|
#include <engine>
|
||||||
|
#include <ns>
|
||||||
|
|
||||||
|
#include <cellarray>
|
||||||
|
#include <fakemeta>
|
||||||
|
|
||||||
|
#define VERSION "1.6.19 (HL1)"
|
||||||
|
|
||||||
|
new g_hlx_block_commands
|
||||||
|
new g_hlx_message_prefix
|
||||||
|
new blocked_commands[][] = { "rank", "skill", "points", "place", "session", "session_data",
|
||||||
|
"kpd", "kdratio", "kdeath", "next", "load", "status", "servers",
|
||||||
|
"top20", "top10", "top5", "clans", "cheaters", "statsme", "weapons",
|
||||||
|
"weapon", "action", "actions", "accuracy", "targets", "target", "kills",
|
||||||
|
"kill", "player_kills", "cmd", "cmds", "command", "hlx_display 0",
|
||||||
|
"hlx_display 1", "hlx_teams 0", "hlx_teams 1", "hlx_hideranking",
|
||||||
|
"hlx_chat 0", "hlx_chat 1", "hlx_menu", "servers 1", "servers 2",
|
||||||
|
"servers 3", "hlx", "hlstatsx", "help" }
|
||||||
|
|
||||||
|
|
||||||
|
new g_msgSayText
|
||||||
|
new g_HLstatsX_MainMenu
|
||||||
|
new g_HLstatsX_AutoMenu
|
||||||
|
new g_HLstatsX_EventsMenu
|
||||||
|
|
||||||
|
new logmessage_ignore[512]
|
||||||
|
new display_menu_keys = MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9
|
||||||
|
|
||||||
|
|
||||||
|
public plugin_init()
|
||||||
|
{
|
||||||
|
register_plugin("HLstatsX CE Ingame Plugin", VERSION, "psychonic")
|
||||||
|
register_srvcmd("hlx_amx_psay", "hlx_amx_psay", 0, "<name or #userid><message> - sends private message")
|
||||||
|
register_srvcmd("hlx_amx_psay2", "hlx_amx_psay2", 0, "<name or #userid><colored><message> - sends green colored private message")
|
||||||
|
register_srvcmd("hlx_amx_bulkpsay", "hlx_amx_bulkpsay", 0, "<userid list><message> - sends private message to many")
|
||||||
|
register_srvcmd("hlx_amx_say", "hlx_amx_say", 0, "<message> - sends message to all players")
|
||||||
|
register_srvcmd("hlx_amx_csay", "hlx_amx_csay", 0, "<message> - sends center hud message to all players")
|
||||||
|
register_srvcmd("hlx_amx_hint", "hlx_amx_hint", 0, "<name or #userid><message> - sends hint message")
|
||||||
|
register_srvcmd("hlx_amx_msay", "hlx_amx_msay", 0, "<delay><userid><message> - displays advanced information")
|
||||||
|
register_srvcmd("hlx_amx_browse", "hlx_amx_browse", 0, "<userid><url> - displays internal browser")
|
||||||
|
register_srvcmd("hlx_amx_swap", "hlx_amx_swap", 0, "<userid> - swaps players to the opposite team")
|
||||||
|
|
||||||
|
register_cvar("hlxce_plugin_version", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
|
||||||
|
register_cvar("hlxce_version", "", FCVAR_SPONLY|FCVAR_SERVER)
|
||||||
|
register_cvar("hlxce_webpage", "http://www.hlxcommunity.com", FCVAR_SPONLY|FCVAR_SERVER)
|
||||||
|
g_hlx_block_commands = register_cvar("hlx_block_commands", "1")
|
||||||
|
g_hlx_message_prefix = register_cvar("hlx_message_prefix", "")
|
||||||
|
|
||||||
|
// building the menus only once
|
||||||
|
g_HLstatsX_MainMenu = menu_create("HLstatsX - Main Menu", "mainmenu_handle")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Display Rank", "1")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Next Players", "2")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Top10 Players", "3")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Auto Ranking", "7")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Console Events", "8")
|
||||||
|
menu_setprop(g_HLstatsX_MainMenu, MPROP_PERPAGE, 6)
|
||||||
|
|
||||||
|
g_HLstatsX_AutoMenu = menu_create("HLstatsX - Auto-Ranking", "automenu_handle")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Enable on round-start", "1")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Enable on round-end", "2")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Enable on player death", "3")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Disable", "4")
|
||||||
|
menu_setprop(g_HLstatsX_AutoMenu, MPROP_PERPAGE, 0)
|
||||||
|
|
||||||
|
g_HLstatsX_EventsMenu = menu_create("HLstatsX - Console Events", "eventsmenu_handle")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Enable Events", "1")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Disable Events", "2")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Enable Global Chat", "3")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Disable Global Chat", "4")
|
||||||
|
menu_setprop(g_HLstatsX_EventsMenu, MPROP_PERPAGE, 0)
|
||||||
|
|
||||||
|
register_menucmd(register_menuid("Display Menu"), display_menu_keys, "handle_internal_menu")
|
||||||
|
|
||||||
|
register_clcmd("say", "hlx_block_commands")
|
||||||
|
register_clcmd("say_team", "hlx_block_commands")
|
||||||
|
|
||||||
|
g_msgSayText = get_user_msgid("SayText")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public log_player_event(client, verb[32], player_event[192], display_location)
|
||||||
|
{
|
||||||
|
if ((client > 0) && (is_user_connected(client))) {
|
||||||
|
new player_userid = get_user_userid(client)
|
||||||
|
|
||||||
|
static player_authid[32]
|
||||||
|
get_user_authid(client, player_authid, 31)
|
||||||
|
|
||||||
|
static player_name[32]
|
||||||
|
get_user_name(client, player_name, 31)
|
||||||
|
|
||||||
|
static player_team[16]
|
||||||
|
get_user_team(client, player_team, 15)
|
||||||
|
|
||||||
|
if (display_location > 0) {
|
||||||
|
new player_origin[3]
|
||||||
|
get_user_origin (client, player_origin)
|
||||||
|
|
||||||
|
format(logmessage_ignore, 511, "^"%s<%d><%s><%s>^" %s ^"%s^"", player_name, player_userid, player_authid, player_team, verb, player_event)
|
||||||
|
log_message("^"%s<%d><%s><%s>^" %s ^"%s^" (position ^"%d %d %d^")", player_name, player_userid, player_authid, player_team, verb, player_event, player_origin[0], player_origin[1], player_origin[2])
|
||||||
|
} else {
|
||||||
|
log_message("^"%s<%d><%s><%s>^" %s ^"%s^"", player_name, player_userid, player_authid, player_team, verb, player_event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public game_log_hook(AlertType: type, message[])
|
||||||
|
{
|
||||||
|
if (type != at_logged ) {
|
||||||
|
return FMRES_IGNORED
|
||||||
|
}
|
||||||
|
if ((strcmp("", logmessage_ignore) != 0) && (contain(message, logmessage_ignore) != -1)) {
|
||||||
|
if (contain(message, "position") == -1) {
|
||||||
|
logmessage_ignore = ""
|
||||||
|
return FMRES_SUPERCEDE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FMRES_IGNORED
|
||||||
|
}
|
||||||
|
|
||||||
|
stock ExplodeString( Output[][], Max, Size, Input[], Delimiter )
|
||||||
|
{
|
||||||
|
new Idx, l = strlen(Input), Len;
|
||||||
|
do Len += (1 + copyc( Output[Idx], Size, Input[Len], Delimiter ));
|
||||||
|
while( (Len < l) && (++Idx < Max) )
|
||||||
|
return Idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
psay (client_id[], client_message[192])
|
||||||
|
{
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new Players[32]
|
||||||
|
new player_count, temp_player_index, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (temp_player_index = 0; temp_player_index < player_count; temp_player_index++) {
|
||||||
|
new player = Players[temp_player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
player_index = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((player_index > 0) && (!is_user_bot(player_index)) && (is_user_connected(player_index))) {
|
||||||
|
|
||||||
|
static display_message[192]
|
||||||
|
static message_prefix[64]
|
||||||
|
get_pcvar_string(g_hlx_message_prefix, message_prefix, 64)
|
||||||
|
if (strcmp(message_prefix, "") == 0) {
|
||||||
|
format(display_message, 192, "%s", client_message)
|
||||||
|
} else {
|
||||||
|
format(display_message, 192, "%s %s", message_prefix, client_message)
|
||||||
|
}
|
||||||
|
|
||||||
|
message_begin(MSG_ONE, g_msgSayText, {0,0,0}, player_index)
|
||||||
|
write_byte(player_index)
|
||||||
|
write_string(display_message)
|
||||||
|
message_end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_bulkpsay(id, level, cid)
|
||||||
|
{
|
||||||
|
new argument_count = read_argc()
|
||||||
|
if (argument_count < 3) {
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_id_list[48]
|
||||||
|
read_argv(1, client_id_list, 47)
|
||||||
|
new client_ids[8][6];
|
||||||
|
ExplodeString(client_ids, 7, 5, client_id_list, ',');
|
||||||
|
|
||||||
|
static colored_param[32]
|
||||||
|
read_argv(2, colored_param, 31)
|
||||||
|
|
||||||
|
new ignore_param = 0
|
||||||
|
if (strcmp(colored_param, "1") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(colored_param, "0") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = (1 + ignore_param); i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > (1 + ignore_param)) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (new i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
psay(client_ids[i], client_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_psay(id, level, cid)
|
||||||
|
{
|
||||||
|
new argument_count = read_argc()
|
||||||
|
if (argument_count < 3) {
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
|
||||||
|
static colored_param[32]
|
||||||
|
read_argv(2, colored_param, 31)
|
||||||
|
|
||||||
|
new ignore_param = 0
|
||||||
|
if (strcmp(colored_param, "1") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(colored_param, "0") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = (1 + ignore_param); i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > (1 + ignore_param)) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
psay(client_id, client_message)
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_psay2(id, level, cid)
|
||||||
|
{
|
||||||
|
new argument_count = read_argc()
|
||||||
|
if (argument_count < 3) {
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
|
||||||
|
static colored_param[32]
|
||||||
|
read_argv(2, colored_param, 31)
|
||||||
|
new ignore_param = 0
|
||||||
|
if (strcmp(colored_param, "1") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(colored_param, "0") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = (1 + ignore_param); i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > (1 + ignore_param)) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new Players[32]
|
||||||
|
new player_count, temp_player_index, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (temp_player_index = 0; temp_player_index < player_count; temp_player_index++) {
|
||||||
|
new player = Players[temp_player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
player_index = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((player_index > 0) && (!is_user_bot(player_index)) && (is_user_connected(player_index))) {
|
||||||
|
new color_index = player_index
|
||||||
|
|
||||||
|
static display_message[192]
|
||||||
|
static message_prefix[64]
|
||||||
|
get_pcvar_string(g_hlx_message_prefix, message_prefix, 64)
|
||||||
|
if (strcmp(message_prefix, "") == 0) {
|
||||||
|
format(display_message, 192, "%s", client_message)
|
||||||
|
} else {
|
||||||
|
format(display_message, 192, "%s %s", message_prefix, client_message)
|
||||||
|
}
|
||||||
|
|
||||||
|
message_begin(MSG_ONE, g_msgSayText, {0,0,0}, player_index)
|
||||||
|
write_byte(color_index)
|
||||||
|
write_string(display_message)
|
||||||
|
message_end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_say(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static message[192]
|
||||||
|
read_args(message, 191)
|
||||||
|
remove_quotes(message)
|
||||||
|
|
||||||
|
static message_prefix[64]
|
||||||
|
get_pcvar_string(g_hlx_message_prefix, message_prefix, 64)
|
||||||
|
if (strcmp(message_prefix, "") == 0) {
|
||||||
|
client_print(0, print_chat, "%s", message)
|
||||||
|
} else {
|
||||||
|
client_print(0, print_chat, "%s %s", message_prefix, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_csay(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static message[192]
|
||||||
|
read_args(message, 191)
|
||||||
|
remove_quotes(message)
|
||||||
|
|
||||||
|
new color3[0][] = {255, 255, 255}
|
||||||
|
new Float:verpos = 0.3
|
||||||
|
|
||||||
|
set_hudmessage(color3[0][0], color3[0][1], color3[0][2], -1.0, verpos, 0, 6.0, 6.0, 0.5, 0.15, -1)
|
||||||
|
show_hudmessage(0, "%s", message)
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_hint(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
new argument_count = read_argc()
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = 1; i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > 1) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new Players[32]
|
||||||
|
new player_count, temp_player_index, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (temp_player_index = 0; temp_player_index < player_count; temp_player_index++) {
|
||||||
|
new player = Players[temp_player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
player_index = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((player_index > 0) && (!is_user_bot(player_index)) && (is_user_connected(player_index))) {
|
||||||
|
new color3[0][] = {255, 128, 0}
|
||||||
|
new Float:verpos = 0.80
|
||||||
|
|
||||||
|
set_hudmessage(color3[0][0], color3[0][1], color3[0][2], -1.0, verpos, 0, 6.0, 6.0, 0.5, 0.15, -1)
|
||||||
|
show_hudmessage(player_index, "%s", client_message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_msay(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 3))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static delay[8]
|
||||||
|
read_argv(1, delay, 7)
|
||||||
|
remove_quotes(delay)
|
||||||
|
|
||||||
|
static name[32]
|
||||||
|
read_argv(2, name, 31)
|
||||||
|
copy(name, 30, name[1])
|
||||||
|
new raw_user_id = str_to_num(name)
|
||||||
|
|
||||||
|
static handler_param[32]
|
||||||
|
read_argv(3, handler_param, 31)
|
||||||
|
new ignore_param = 0
|
||||||
|
new need_handler = 0
|
||||||
|
if (strcmp(handler_param, "1") == 0) {
|
||||||
|
need_handler = 1
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(handler_param, "0") == 0) {
|
||||||
|
need_handler = 0
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
static message[1024]
|
||||||
|
new userid
|
||||||
|
new Players[32]
|
||||||
|
new player_count, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (player_index = 0; player_index < player_count; player_index++) {
|
||||||
|
new player = Players[player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == raw_user_id) {
|
||||||
|
userid = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_args(message, 1023)
|
||||||
|
|
||||||
|
new find_pattern[] = "#"
|
||||||
|
new find_pos = strfind(message, find_pattern)
|
||||||
|
new text_pos = find_pos + strlen(name) + 2
|
||||||
|
if (ignore_param == 1) {
|
||||||
|
text_pos += 3
|
||||||
|
}
|
||||||
|
|
||||||
|
static menu_text[1024]
|
||||||
|
copy(menu_text, 1023, message[text_pos])
|
||||||
|
remove_quotes(menu_text)
|
||||||
|
|
||||||
|
new menu_display[1024]
|
||||||
|
|
||||||
|
new i, start = 0
|
||||||
|
new nLen = 0
|
||||||
|
new buffer[1024]
|
||||||
|
|
||||||
|
for(i = 0; i < strlen(menu_text); i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
if ((menu_text[i-1] == '\') && (menu_text[i] == 'n')) {
|
||||||
|
buffer = ""
|
||||||
|
copy(buffer, (i - start)-1 , menu_text[start])
|
||||||
|
nLen += format(menu_display[nLen], (1023 - nLen), "%s^n", buffer)
|
||||||
|
i += 1
|
||||||
|
start = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((userid > 0) && (!is_user_bot(userid)) && (is_user_connected(userid))) {
|
||||||
|
if (need_handler == 0) {
|
||||||
|
show_menu(userid, display_menu_keys, menu_display, 15)
|
||||||
|
} else {
|
||||||
|
show_menu(userid, display_menu_keys, menu_display, 15, "Display Menu")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public handle_internal_menu(id, key)
|
||||||
|
{
|
||||||
|
new client = id
|
||||||
|
if (is_user_connected(client)) {
|
||||||
|
if (key < 9) {
|
||||||
|
static player_event[192]
|
||||||
|
new slot = key
|
||||||
|
slot++
|
||||||
|
num_to_str(slot, player_event, 192)
|
||||||
|
log_player_event(client, "selected", player_event, 0)
|
||||||
|
} else {
|
||||||
|
new player_event[192] = "cancel"
|
||||||
|
log_player_event(client, "selected", player_event, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_browse(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static name[32]
|
||||||
|
read_argv(1, name, 31)
|
||||||
|
copy(name, 30, name[1])
|
||||||
|
new raw_user_id = str_to_num(name)
|
||||||
|
|
||||||
|
static message[160]
|
||||||
|
new userid
|
||||||
|
new Players[32]
|
||||||
|
new player_count, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (player_index = 0; player_index < player_count; player_index++) {
|
||||||
|
new player = Players[player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == raw_user_id) {
|
||||||
|
userid = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_args(message, 159)
|
||||||
|
|
||||||
|
new find_pattern[] = "#"
|
||||||
|
new find_pos = strfind(message, find_pattern)
|
||||||
|
|
||||||
|
static url[160]
|
||||||
|
copy(url, 159, message[find_pos + strlen(name) + 2])
|
||||||
|
remove_quotes(url)
|
||||||
|
|
||||||
|
if ((userid > 0) && (!is_user_bot(userid)) && (is_user_connected(userid))) {
|
||||||
|
show_motd(userid, url, "HLstatsX CE")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_swap(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 1))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new userid = 0
|
||||||
|
new Players[32]
|
||||||
|
new player_count, player_index
|
||||||
|
get_players(Players, player_count, "h")
|
||||||
|
for (player_index = 0; player_index < player_count; player_index++) {
|
||||||
|
new player = Players[player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
userid = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static player_team[32]
|
||||||
|
get_user_team(userid, player_team, 31)
|
||||||
|
|
||||||
|
if ((userid > 0) && (is_user_connected(userid))) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
stock make_player_command(client, player_command[192])
|
||||||
|
{
|
||||||
|
if (client > 0) {
|
||||||
|
log_player_event(client, "say", player_command, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_menu(menu, id)
|
||||||
|
{
|
||||||
|
menu_display(id, menu, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_mainmenu(id)
|
||||||
|
{
|
||||||
|
display_menu(g_HLstatsX_MainMenu, id)
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_automenu(id)
|
||||||
|
{
|
||||||
|
display_menu(g_HLstatsX_AutoMenu, id)
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_eventsmenu(id)
|
||||||
|
{
|
||||||
|
display_menu(g_HLstatsX_EventsMenu, id)
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public mainmenu_handle(id, menu, item)
|
||||||
|
{
|
||||||
|
if (item < 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
static command[16], name[64]
|
||||||
|
new access, callback
|
||||||
|
menu_item_getinfo(menu, item, access, command, 15, name, 63, callback)
|
||||||
|
|
||||||
|
new choice = str_to_num(command)
|
||||||
|
switch (choice) {
|
||||||
|
case 1 :
|
||||||
|
make_player_command(id, "/rank")
|
||||||
|
case 2 :
|
||||||
|
make_player_command(id, "/next")
|
||||||
|
case 3 :
|
||||||
|
make_player_command(id, "/top10")
|
||||||
|
case 4 :
|
||||||
|
make_player_command(id, "/clans")
|
||||||
|
case 5 :
|
||||||
|
make_player_command(id, "/status")
|
||||||
|
case 6 :
|
||||||
|
make_player_command(id, "/statsme")
|
||||||
|
case 7 :
|
||||||
|
display_automenu(id)
|
||||||
|
case 8 :
|
||||||
|
display_eventsmenu(id)
|
||||||
|
case 9 :
|
||||||
|
make_player_command(id, "/weapons")
|
||||||
|
case 10 :
|
||||||
|
make_player_command(id, "/accuracy")
|
||||||
|
case 11 :
|
||||||
|
make_player_command(id, "/targets")
|
||||||
|
case 12 :
|
||||||
|
make_player_command(id, "/kills")
|
||||||
|
case 13 :
|
||||||
|
make_player_command(id, "/hlx_hideranking")
|
||||||
|
case 14 :
|
||||||
|
make_player_command(id, "/cheaters")
|
||||||
|
case 15 :
|
||||||
|
make_player_command(id, "/help")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public automenu_handle(id, menu, item)
|
||||||
|
{
|
||||||
|
if (item < 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
static command[16], name[64]
|
||||||
|
new access, callback
|
||||||
|
menu_item_getinfo(menu, item, access, command, 15, name, 63, callback)
|
||||||
|
|
||||||
|
new choice = str_to_num(command)
|
||||||
|
switch (choice) {
|
||||||
|
case 1 :
|
||||||
|
make_player_command(id, "/hlx_auto start rank")
|
||||||
|
case 2 :
|
||||||
|
make_player_command(id, "/hlx_auto end rank")
|
||||||
|
case 3 :
|
||||||
|
make_player_command(id, "/hlx_auto kill rank")
|
||||||
|
case 4 :
|
||||||
|
make_player_command(id, "/hlx_auto clear")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public eventsmenu_handle(id, menu, item)
|
||||||
|
{
|
||||||
|
if (item < 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
static command[16], name[64]
|
||||||
|
new access, callback
|
||||||
|
menu_item_getinfo(menu, item, access, command, 15, name, 63, callback)
|
||||||
|
|
||||||
|
new choice = str_to_num(command)
|
||||||
|
switch (choice) {
|
||||||
|
case 1 :
|
||||||
|
make_player_command(id, "/hlx_display 1")
|
||||||
|
case 2 :
|
||||||
|
make_player_command(id, "/hlx_display 0")
|
||||||
|
case 3 :
|
||||||
|
make_player_command(id, "/hlx_chat 1")
|
||||||
|
case 4 :
|
||||||
|
make_player_command(id, "/hlx_chat 0")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
stock is_command_blocked(command[192])
|
||||||
|
{
|
||||||
|
new command_blocked = 0
|
||||||
|
new command_index = 0
|
||||||
|
while ((command_blocked == 0) && (command_index < sizeof(blocked_commands))) {
|
||||||
|
if (strcmp(command, blocked_commands[command_index]) == 0) {
|
||||||
|
command_blocked++
|
||||||
|
}
|
||||||
|
command_index++
|
||||||
|
}
|
||||||
|
if (command_blocked > 0) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_block_commands(client)
|
||||||
|
{
|
||||||
|
if (client) {
|
||||||
|
if (client == 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
new block_chat_commands = get_pcvar_num(g_hlx_block_commands)
|
||||||
|
|
||||||
|
static user_command[192]
|
||||||
|
read_args(user_command, 192)
|
||||||
|
static origin_command[192]
|
||||||
|
|
||||||
|
new start_index = 0
|
||||||
|
new command_length = strlen(user_command)
|
||||||
|
if (command_length > 0) {
|
||||||
|
if (user_command[start_index] == 34) {
|
||||||
|
start_index = start_index + 1
|
||||||
|
if (user_command[command_length - 1] == 34) {
|
||||||
|
user_command[command_length - 1] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user_command[start_index] == 47) {
|
||||||
|
start_index++
|
||||||
|
}
|
||||||
|
|
||||||
|
copy(origin_command, 192, user_command[start_index])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command_length > 0) {
|
||||||
|
if (block_chat_commands > 0) {
|
||||||
|
|
||||||
|
new command_type[32] = "say"
|
||||||
|
new command_blocked = is_command_blocked(origin_command)
|
||||||
|
|
||||||
|
if (command_blocked > 0) {
|
||||||
|
|
||||||
|
if (is_user_connected(client)) {
|
||||||
|
if ((strcmp("hlx_menu", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlx", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlstatsx", user_command[start_index]) == 0)) {
|
||||||
|
|
||||||
|
display_mainmenu(client)
|
||||||
|
}
|
||||||
|
log_player_event(client, command_type, origin_command, 0)
|
||||||
|
}
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (is_user_connected(client)) {
|
||||||
|
if ((strcmp("hlx_menu", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlx", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlstatsx", user_command[start_index]) == 0)) {
|
||||||
|
display_mainmenu(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
|
913
amxmodx/scripting/hlstatsx_commands_tfc.sma
Normal file
|
@ -0,0 +1,913 @@
|
||||||
|
/**
|
||||||
|
* 2008 - Modified by Nicholas Hastings (psychonic) for used with HLstatsX Community Edition
|
||||||
|
* http://www.hlxcommunity.com
|
||||||
|
*
|
||||||
|
* HLstatsX - AMX Mod X plugin to display ingame messages
|
||||||
|
* http://www.hlstatsx.com/
|
||||||
|
* Copyright (C) 2007-2008 TTS Oetzel & Goerz GmbH
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma dynamic 16000
|
||||||
|
|
||||||
|
#include <amxmodx>
|
||||||
|
#include <amxmisc>
|
||||||
|
|
||||||
|
#include <engine>
|
||||||
|
#include <tfcx>
|
||||||
|
|
||||||
|
#include <cellarray>
|
||||||
|
#include <fakemeta>
|
||||||
|
|
||||||
|
#define VERSION "1.6.19 (HL1)"
|
||||||
|
|
||||||
|
|
||||||
|
new g_hlx_block_commands
|
||||||
|
new g_hlx_message_prefix
|
||||||
|
new blocked_commands[][] = { "rank", "skill", "points", "place", "session", "session_data",
|
||||||
|
"kpd", "kdratio", "kdeath", "next", "load", "status", "servers",
|
||||||
|
"top20", "top10", "top5", "clans", "cheaters", "statsme", "weapons",
|
||||||
|
"weapon", "action", "actions", "accuracy", "targets", "target", "kills",
|
||||||
|
"kill", "player_kills", "cmd", "cmds", "command", "hlx_display 0",
|
||||||
|
"hlx_display 1", "hlx_teams 0", "hlx_teams 1", "hlx_hideranking",
|
||||||
|
"hlx_chat 0", "hlx_chat 1", "hlx_menu", "servers 1", "servers 2",
|
||||||
|
"servers 3", "hlx", "hlstatsx", "help" }
|
||||||
|
|
||||||
|
|
||||||
|
new g_msgSayText
|
||||||
|
new g_HLstatsX_MainMenu
|
||||||
|
new g_HLstatsX_AutoMenu
|
||||||
|
new g_HLstatsX_EventsMenu
|
||||||
|
|
||||||
|
new logmessage_ignore[512]
|
||||||
|
new display_menu_keys = MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9
|
||||||
|
|
||||||
|
|
||||||
|
public plugin_init()
|
||||||
|
{
|
||||||
|
register_plugin("HLstatsX CE Ingame Plugin", VERSION, "psychonic")
|
||||||
|
register_srvcmd("hlx_amx_psay", "hlx_amx_psay", 0, "<name or #userid><message> - sends private message")
|
||||||
|
register_srvcmd("hlx_amx_bulkpsay", "hlx_amx_bulkpsay", 0, "<userid list><message> - sends private message to many")
|
||||||
|
register_srvcmd("hlx_amx_psay2", "hlx_amx_psay2", 0, "<name or #userid><colored><message> - sends green colored private message")
|
||||||
|
register_srvcmd("hlx_amx_say", "hlx_amx_say", 0, "<message> - sends message to all players")
|
||||||
|
register_srvcmd("hlx_amx_csay", "hlx_amx_csay", 0, "<message> - sends center hud message to all players")
|
||||||
|
register_srvcmd("hlx_amx_hint", "hlx_amx_hint", 0, "<name or #userid><message> - sends hint message")
|
||||||
|
register_srvcmd("hlx_amx_msay", "hlx_amx_msay", 0, "<delay><userid><message> - displays advanced information")
|
||||||
|
register_srvcmd("hlx_amx_browse", "hlx_amx_browse", 0, "<userid><url> - displays internal browser")
|
||||||
|
register_srvcmd("hlx_amx_swap", "hlx_amx_swap", 0, "<userid> - swaps players to the opposite team")
|
||||||
|
|
||||||
|
register_cvar("hlxce_plugin_version", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
|
||||||
|
register_cvar("hlxce_version", "", FCVAR_SPONLY|FCVAR_SERVER)
|
||||||
|
register_cvar("hlxce_webpage", "http://www.hlxcommunity.com", FCVAR_SPONLY|FCVAR_SERVER)
|
||||||
|
g_hlx_block_commands = register_cvar("hlx_block_commands", "1")
|
||||||
|
g_hlx_message_prefix = register_cvar("hlx_message_prefix", "")
|
||||||
|
|
||||||
|
// building the menus only once
|
||||||
|
g_HLstatsX_MainMenu = menu_create("HLstatsX - Main Menu", "mainmenu_handle")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Display Rank", "1")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Next Players", "2")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Top10 Players", "3")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Clans Ranking", "4")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Server Status", "5")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Statsme", "6")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Auto Ranking", "7")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Console Events", "8")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Weapon Usage", "9")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Weapons Accuracy", "10")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Weapons Targets", "11")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Player Kills", "12")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Toggle Ranking Display", "13")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "VAC Cheaterlist", "14")
|
||||||
|
menu_additem(g_HLstatsX_MainMenu, "Display Help", "15")
|
||||||
|
menu_setprop(g_HLstatsX_MainMenu, MPROP_PERPAGE, 6)
|
||||||
|
|
||||||
|
g_HLstatsX_AutoMenu = menu_create("HLstatsX - Auto-Ranking", "automenu_handle")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Enable on round-start", "1")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Enable on round-end", "2")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Enable on player death", "3")
|
||||||
|
menu_additem(g_HLstatsX_AutoMenu, "Disable", "4")
|
||||||
|
menu_setprop(g_HLstatsX_AutoMenu, MPROP_PERPAGE, 0)
|
||||||
|
|
||||||
|
g_HLstatsX_EventsMenu = menu_create("HLstatsX - Console Events", "eventsmenu_handle")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Enable Events", "1")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Disable Events", "2")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Enable Global Chat", "3")
|
||||||
|
menu_additem(g_HLstatsX_EventsMenu, "Disable Global Chat", "4")
|
||||||
|
menu_setprop(g_HLstatsX_EventsMenu, MPROP_PERPAGE, 0)
|
||||||
|
|
||||||
|
register_menucmd(register_menuid("Display Menu"), display_menu_keys, "handle_internal_menu")
|
||||||
|
|
||||||
|
register_clcmd("say", "hlx_block_commands")
|
||||||
|
register_clcmd("say_team", "hlx_block_commands")
|
||||||
|
|
||||||
|
g_msgSayText = get_user_msgid("SayText")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public log_player_event(client, verb[32], player_event[192], display_location)
|
||||||
|
{
|
||||||
|
if ((client > 0) && (is_user_connected(client))) {
|
||||||
|
new player_userid = get_user_userid(client)
|
||||||
|
|
||||||
|
static player_authid[32]
|
||||||
|
get_user_authid(client, player_authid, 31)
|
||||||
|
|
||||||
|
static player_name[32]
|
||||||
|
get_user_name(client, player_name, 31)
|
||||||
|
|
||||||
|
static player_team[16]
|
||||||
|
get_user_team(client, player_team, 15)
|
||||||
|
|
||||||
|
if (display_location > 0) {
|
||||||
|
new player_origin[3]
|
||||||
|
get_user_origin (client, player_origin)
|
||||||
|
|
||||||
|
format(logmessage_ignore, 511, "^"%s<%d><%s><%s>^" %s ^"%s^"", player_name, player_userid, player_authid, player_team, verb, player_event)
|
||||||
|
log_message("^"%s<%d><%s><%s>^" %s ^"%s^" (position ^"%d %d %d^")", player_name, player_userid, player_authid, player_team, verb, player_event, player_origin[0], player_origin[1], player_origin[2])
|
||||||
|
} else {
|
||||||
|
log_message("^"%s<%d><%s><%s>^" %s ^"%s^"", player_name, player_userid, player_authid, player_team, verb, player_event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public game_log_hook(AlertType: type, message[])
|
||||||
|
{
|
||||||
|
if (type != at_logged ) {
|
||||||
|
return FMRES_IGNORED
|
||||||
|
}
|
||||||
|
if ((strcmp("", logmessage_ignore) != 0) && (contain(message, logmessage_ignore) != -1)) {
|
||||||
|
if (contain(message, "position") == -1) {
|
||||||
|
logmessage_ignore = ""
|
||||||
|
return FMRES_SUPERCEDE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FMRES_IGNORED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public client_death(killer, victim, wpnindex, hitplace, TK)
|
||||||
|
{
|
||||||
|
new id = victim
|
||||||
|
|
||||||
|
if ((id > 0) && (is_user_connected(id))) {
|
||||||
|
new iStats[8], iHits[8]
|
||||||
|
static szTeam[16], szName[32], szAuthid[32], szWeapon[24]
|
||||||
|
new iUserid = get_user_userid(id)
|
||||||
|
new _max = TFCMAX_WEAPONS
|
||||||
|
|
||||||
|
get_user_team(id, szTeam, 15)
|
||||||
|
get_user_name(id, szName, 31)
|
||||||
|
get_user_authid(id, szAuthid, 31)
|
||||||
|
|
||||||
|
for (new i = 1; i < _max; ++i) {
|
||||||
|
if (get_user_wstats(id, i, iStats, iHits)) {
|
||||||
|
xmod_get_wpnlogname(i, szWeapon, 23)
|
||||||
|
|
||||||
|
log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats^" (weapon ^"%s^") (shots ^"%d^") (hits ^"%d^") (kills ^"%d^") (headshots ^"%d^") (tks ^"%d^") (damage ^"%d^") (deaths ^"%d^")",
|
||||||
|
szName, iUserid, szAuthid, szTeam, szWeapon, iStats[4], iStats[5], iStats[0], iStats[2], iStats[3], iStats[6], iStats[1])
|
||||||
|
log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats2^" (weapon ^"%s^") (head ^"%d^") (chest ^"%d^") (stomach ^"%d^") (leftarm ^"%d^") (rightarm ^"%d^") (leftleg ^"%d^") (rightleg ^"%d^")",
|
||||||
|
szName, iUserid, szAuthid, szTeam, szWeapon, iHits[1], iHits[2], iHits[3], iHits[4], iHits[5], iHits[6], iHits[7])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reset_user_wstats(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stock ExplodeString( Output[][], Max, Size, Input[], Delimiter )
|
||||||
|
{
|
||||||
|
new Idx, l = strlen(Input), Len;
|
||||||
|
do Len += (1 + copyc( Output[Idx], Size, Input[Len], Delimiter ));
|
||||||
|
while( (Len < l) && (++Idx < Max) )
|
||||||
|
return Idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
psay (client_id[], client_message[192])
|
||||||
|
{
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new Players[32]
|
||||||
|
new player_count, temp_player_index, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (temp_player_index = 0; temp_player_index < player_count; temp_player_index++) {
|
||||||
|
new player = Players[temp_player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
player_index = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((player_index > 0) && (!is_user_bot(player_index)) && (is_user_connected(player_index))) {
|
||||||
|
|
||||||
|
static display_message[192]
|
||||||
|
static message_prefix[64]
|
||||||
|
get_pcvar_string(g_hlx_message_prefix, message_prefix, 64)
|
||||||
|
if (strcmp(message_prefix, "") == 0) {
|
||||||
|
format(display_message, 192, "%s", client_message)
|
||||||
|
} else {
|
||||||
|
format(display_message, 192, "%s %s", message_prefix, client_message)
|
||||||
|
}
|
||||||
|
|
||||||
|
message_begin(MSG_ONE, g_msgSayText, {0,0,0}, player_index)
|
||||||
|
write_byte(player_index)
|
||||||
|
write_string(display_message)
|
||||||
|
message_end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_bulkpsay(id, level, cid)
|
||||||
|
{
|
||||||
|
new argument_count = read_argc()
|
||||||
|
if (argument_count < 3) {
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_id_list[48]
|
||||||
|
read_argv(1, client_id_list, 47)
|
||||||
|
new client_ids[8][6];
|
||||||
|
ExplodeString(client_ids, 7, 5, client_id_list, ',');
|
||||||
|
|
||||||
|
static colored_param[32]
|
||||||
|
read_argv(2, colored_param, 31)
|
||||||
|
|
||||||
|
new ignore_param = 0
|
||||||
|
if (strcmp(colored_param, "1") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(colored_param, "0") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = (1 + ignore_param); i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > (1 + ignore_param)) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (new i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
psay(client_ids[i], client_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_psay(id, level, cid)
|
||||||
|
{
|
||||||
|
new argument_count = read_argc()
|
||||||
|
if (argument_count < 3) {
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
|
||||||
|
static colored_param[32]
|
||||||
|
read_argv(2, colored_param, 31)
|
||||||
|
|
||||||
|
new ignore_param = 0
|
||||||
|
if (strcmp(colored_param, "1") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(colored_param, "0") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = (1 + ignore_param); i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > (1 + ignore_param)) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
psay(client_id, client_message)
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_psay2(id, level, cid)
|
||||||
|
{
|
||||||
|
new argument_count = read_argc()
|
||||||
|
if (argument_count < 3) {
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
|
||||||
|
static colored_param[32]
|
||||||
|
read_argv(2, colored_param, 31)
|
||||||
|
new ignore_param = 0
|
||||||
|
if (strcmp(colored_param, "1") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(colored_param, "0") == 0) {
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = (1 + ignore_param); i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > (1 + ignore_param)) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new Players[32]
|
||||||
|
new player_count, temp_player_index, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (temp_player_index = 0; temp_player_index < player_count; temp_player_index++) {
|
||||||
|
new player = Players[temp_player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
player_index = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((player_index > 0) && (!is_user_bot(player_index)) && (is_user_connected(player_index))) {
|
||||||
|
new color_index = player_index
|
||||||
|
|
||||||
|
static display_message[192]
|
||||||
|
static message_prefix[64]
|
||||||
|
get_pcvar_string(g_hlx_message_prefix, message_prefix, 64)
|
||||||
|
if (strcmp(message_prefix, "") == 0) {
|
||||||
|
format(display_message, 192, "%s", client_message)
|
||||||
|
} else {
|
||||||
|
format(display_message, 192, "%s %s", message_prefix, client_message)
|
||||||
|
}
|
||||||
|
|
||||||
|
message_begin(MSG_ONE, g_msgSayText, {0,0,0}, player_index)
|
||||||
|
write_byte(color_index)
|
||||||
|
write_string(display_message)
|
||||||
|
message_end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_say(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static message[192]
|
||||||
|
read_args(message, 191)
|
||||||
|
remove_quotes(message)
|
||||||
|
|
||||||
|
static message_prefix[64]
|
||||||
|
get_pcvar_string(g_hlx_message_prefix, message_prefix, 64)
|
||||||
|
if (strcmp(message_prefix, "") == 0) {
|
||||||
|
client_print(0, print_chat, "%s", message)
|
||||||
|
} else {
|
||||||
|
client_print(0, print_chat, "%s %s", message_prefix, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_csay(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static message[192]
|
||||||
|
read_args(message, 191)
|
||||||
|
remove_quotes(message)
|
||||||
|
|
||||||
|
new color3[0][] = {255, 255, 255}
|
||||||
|
new Float:verpos = 0.3
|
||||||
|
|
||||||
|
set_hudmessage(color3[0][0], color3[0][1], color3[0][2], -1.0, verpos, 0, 6.0, 6.0, 0.5, 0.15, -1)
|
||||||
|
show_hudmessage(0, "%s", message)
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_hint(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
new argument_count = read_argc()
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
|
||||||
|
new client_message[192]
|
||||||
|
for(new i = 1; i < argument_count; i++) {
|
||||||
|
static temp_argument[192]
|
||||||
|
read_argv(i + 1, temp_argument, 191)
|
||||||
|
if (i > 1) {
|
||||||
|
if ((191 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
if ((temp_argument[0] == 41) || (temp_argument[0] == 125)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else if ((strlen(client_message) > 0) && (client_message[strlen(client_message)-1] != 40) && (client_message[strlen(client_message)-1] != 123) && (client_message[strlen(client_message)-1] != 58) && (client_message[strlen(client_message)-1] != 39) && (client_message[strlen(client_message)-1] != 44)) {
|
||||||
|
if ((strcmp(temp_argument, ":") != 0) && (strcmp(temp_argument, ",") != 0) && (strcmp(temp_argument, "'") != 0)) {
|
||||||
|
client_message[strlen(client_message)] = 32
|
||||||
|
}
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
} else {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((192 - strlen(client_message)) > strlen(temp_argument)) {
|
||||||
|
copy(client_message[strlen(client_message)], 191, temp_argument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new Players[32]
|
||||||
|
new player_count, temp_player_index, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (temp_player_index = 0; temp_player_index < player_count; temp_player_index++) {
|
||||||
|
new player = Players[temp_player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
player_index = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((player_index > 0) && (!is_user_bot(player_index)) && (is_user_connected(player_index))) {
|
||||||
|
new color3[0][] = {255, 128, 0}
|
||||||
|
new Float:verpos = 0.80
|
||||||
|
|
||||||
|
set_hudmessage(color3[0][0], color3[0][1], color3[0][2], -1.0, verpos, 0, 6.0, 6.0, 0.5, 0.15, -1)
|
||||||
|
show_hudmessage(player_index, "%s", client_message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_msay(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 3))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static delay[8]
|
||||||
|
read_argv(1, delay, 7)
|
||||||
|
remove_quotes(delay)
|
||||||
|
|
||||||
|
static name[32]
|
||||||
|
read_argv(2, name, 31)
|
||||||
|
copy(name, 30, name[1])
|
||||||
|
new raw_user_id = str_to_num(name)
|
||||||
|
|
||||||
|
static handler_param[32]
|
||||||
|
read_argv(3, handler_param, 31)
|
||||||
|
new ignore_param = 0
|
||||||
|
new need_handler = 0
|
||||||
|
if (strcmp(handler_param, "1") == 0) {
|
||||||
|
need_handler = 1
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
if (strcmp(handler_param, "0") == 0) {
|
||||||
|
need_handler = 0
|
||||||
|
ignore_param = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
static message[1024]
|
||||||
|
new userid
|
||||||
|
new Players[32]
|
||||||
|
new player_count, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (player_index = 0; player_index < player_count; player_index++) {
|
||||||
|
new player = Players[player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == raw_user_id) {
|
||||||
|
userid = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_args(message, 1023)
|
||||||
|
|
||||||
|
new find_pattern[] = "#"
|
||||||
|
new find_pos = strfind(message, find_pattern)
|
||||||
|
new text_pos = find_pos + strlen(name) + 2
|
||||||
|
if (ignore_param == 1) {
|
||||||
|
text_pos += 3
|
||||||
|
}
|
||||||
|
|
||||||
|
static menu_text[1024]
|
||||||
|
copy(menu_text, 1023, message[text_pos])
|
||||||
|
remove_quotes(menu_text)
|
||||||
|
|
||||||
|
new menu_display[1024]
|
||||||
|
|
||||||
|
new i, start = 0
|
||||||
|
new nLen = 0
|
||||||
|
new buffer[1024]
|
||||||
|
|
||||||
|
for(i = 0; i < strlen(menu_text); i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
if ((menu_text[i-1] == '\') && (menu_text[i] == 'n')) {
|
||||||
|
buffer = ""
|
||||||
|
copy(buffer, (i - start)-1 , menu_text[start])
|
||||||
|
nLen += format(menu_display[nLen], (1023 - nLen), "%s^n", buffer)
|
||||||
|
i += 1
|
||||||
|
start = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((userid > 0) && (!is_user_bot(userid)) && (is_user_connected(userid))) {
|
||||||
|
if (need_handler == 0) {
|
||||||
|
show_menu(userid, display_menu_keys, menu_display, 15)
|
||||||
|
} else {
|
||||||
|
show_menu(userid, display_menu_keys, menu_display, 15, "Display Menu")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public handle_internal_menu(id, key)
|
||||||
|
{
|
||||||
|
new client = id
|
||||||
|
if (is_user_connected(client)) {
|
||||||
|
if (key < 9) {
|
||||||
|
static player_event[192]
|
||||||
|
new slot = key
|
||||||
|
slot++
|
||||||
|
num_to_str(slot, player_event, 192)
|
||||||
|
log_player_event(client, "selected", player_event, 0)
|
||||||
|
} else {
|
||||||
|
new player_event[192] = "cancel"
|
||||||
|
log_player_event(client, "selected", player_event, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_amx_browse(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 2))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static name[32]
|
||||||
|
read_argv(1, name, 31)
|
||||||
|
copy(name, 30, name[1])
|
||||||
|
new raw_user_id = str_to_num(name)
|
||||||
|
|
||||||
|
static message[1024]
|
||||||
|
new userid
|
||||||
|
new Players[32]
|
||||||
|
new player_count, player_index
|
||||||
|
get_players(Players, player_count, "ch")
|
||||||
|
for (player_index = 0; player_index < player_count; player_index++) {
|
||||||
|
new player = Players[player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == raw_user_id) {
|
||||||
|
userid = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
read_args(message, 1023)
|
||||||
|
|
||||||
|
new find_pattern[] = "#"
|
||||||
|
new find_pos = strfind(message, find_pattern)
|
||||||
|
|
||||||
|
static url[1024]
|
||||||
|
copy(url, 1023, message[find_pos + strlen(name) + 2])
|
||||||
|
remove_quotes(url)
|
||||||
|
|
||||||
|
if ((userid > 0) && (!is_user_bot(userid)) && (is_user_connected(userid))) {
|
||||||
|
show_motd(userid, url, "HLstatsX CE")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public hlx_amx_swap(id, level, cid)
|
||||||
|
{
|
||||||
|
if (!cmd_access(id, level, cid, 1))
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
|
||||||
|
static client_id[32]
|
||||||
|
read_argv(1, client_id, 31)
|
||||||
|
copy(client_id, 30, client_id[1])
|
||||||
|
new client = str_to_num(client_id)
|
||||||
|
|
||||||
|
if (client > 0) {
|
||||||
|
new userid = 0
|
||||||
|
new Players[32]
|
||||||
|
new player_count, player_index
|
||||||
|
get_players(Players, player_count, "h")
|
||||||
|
for (player_index = 0; player_index < player_count; player_index++) {
|
||||||
|
new player = Players[player_index]
|
||||||
|
new temp_user_id = get_user_userid(player)
|
||||||
|
if (temp_user_id == client) {
|
||||||
|
userid = player
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static player_team[32]
|
||||||
|
get_user_team(userid, player_team, 31)
|
||||||
|
|
||||||
|
if ((userid > 0) && (is_user_connected(userid))) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
stock make_player_command(client, player_command[192])
|
||||||
|
{
|
||||||
|
if (client > 0) {
|
||||||
|
log_player_event(client, "say", player_command, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_menu(menu, id)
|
||||||
|
{
|
||||||
|
menu_display(id, menu, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_mainmenu(id)
|
||||||
|
{
|
||||||
|
display_menu(g_HLstatsX_MainMenu, id)
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_automenu(id)
|
||||||
|
{
|
||||||
|
display_menu(g_HLstatsX_AutoMenu, id)
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public display_eventsmenu(id)
|
||||||
|
{
|
||||||
|
display_menu(g_HLstatsX_EventsMenu, id)
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public mainmenu_handle(id, menu, item)
|
||||||
|
{
|
||||||
|
if (item < 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
static command[16], name[64]
|
||||||
|
new access, callback
|
||||||
|
menu_item_getinfo(menu, item, access, command, 15, name, 63, callback)
|
||||||
|
|
||||||
|
new choice = str_to_num(command)
|
||||||
|
switch (choice) {
|
||||||
|
case 1 :
|
||||||
|
make_player_command(id, "/rank")
|
||||||
|
case 2 :
|
||||||
|
make_player_command(id, "/next")
|
||||||
|
case 3 :
|
||||||
|
make_player_command(id, "/top10")
|
||||||
|
case 4 :
|
||||||
|
make_player_command(id, "/clans")
|
||||||
|
case 5 :
|
||||||
|
make_player_command(id, "/status")
|
||||||
|
case 6 :
|
||||||
|
make_player_command(id, "/statsme")
|
||||||
|
case 7 :
|
||||||
|
display_automenu(id)
|
||||||
|
case 8 :
|
||||||
|
display_eventsmenu(id)
|
||||||
|
case 9 :
|
||||||
|
make_player_command(id, "/weapons")
|
||||||
|
case 10 :
|
||||||
|
make_player_command(id, "/accuracy")
|
||||||
|
case 11 :
|
||||||
|
make_player_command(id, "/targets")
|
||||||
|
case 12 :
|
||||||
|
make_player_command(id, "/kills")
|
||||||
|
case 13 :
|
||||||
|
make_player_command(id, "/hlx_hideranking")
|
||||||
|
case 14 :
|
||||||
|
make_player_command(id, "/cheaters")
|
||||||
|
case 15 :
|
||||||
|
make_player_command(id, "/help")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public automenu_handle(id, menu, item)
|
||||||
|
{
|
||||||
|
if (item < 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
static command[16], name[64]
|
||||||
|
new access, callback
|
||||||
|
menu_item_getinfo(menu, item, access, command, 15, name, 63, callback)
|
||||||
|
|
||||||
|
new choice = str_to_num(command)
|
||||||
|
switch (choice) {
|
||||||
|
case 1 :
|
||||||
|
make_player_command(id, "/hlx_auto start rank")
|
||||||
|
case 2 :
|
||||||
|
make_player_command(id, "/hlx_auto end rank")
|
||||||
|
case 3 :
|
||||||
|
make_player_command(id, "/hlx_auto kill rank")
|
||||||
|
case 4 :
|
||||||
|
make_player_command(id, "/hlx_auto clear")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
public eventsmenu_handle(id, menu, item)
|
||||||
|
{
|
||||||
|
if (item < 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
static command[16], name[64]
|
||||||
|
new access, callback
|
||||||
|
menu_item_getinfo(menu, item, access, command, 15, name, 63, callback)
|
||||||
|
|
||||||
|
new choice = str_to_num(command)
|
||||||
|
switch (choice) {
|
||||||
|
case 1 :
|
||||||
|
make_player_command(id, "/hlx_display 1")
|
||||||
|
case 2 :
|
||||||
|
make_player_command(id, "/hlx_display 0")
|
||||||
|
case 3 :
|
||||||
|
make_player_command(id, "/hlx_chat 1")
|
||||||
|
case 4 :
|
||||||
|
make_player_command(id, "/hlx_chat 0")
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
|
||||||
|
stock is_command_blocked(command[192])
|
||||||
|
{
|
||||||
|
new command_blocked = 0
|
||||||
|
new command_index = 0
|
||||||
|
while ((command_blocked == 0) && (command_index < sizeof(blocked_commands))) {
|
||||||
|
if (strcmp(command, blocked_commands[command_index]) == 0) {
|
||||||
|
command_blocked++
|
||||||
|
}
|
||||||
|
command_index++
|
||||||
|
}
|
||||||
|
if (command_blocked > 0) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public hlx_block_commands(client)
|
||||||
|
{
|
||||||
|
if (client) {
|
||||||
|
if (client == 0) {
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
new block_chat_commands = get_pcvar_num(g_hlx_block_commands)
|
||||||
|
|
||||||
|
static user_command[192]
|
||||||
|
read_args(user_command, 192)
|
||||||
|
static origin_command[192]
|
||||||
|
|
||||||
|
new start_index = 0
|
||||||
|
new command_length = strlen(user_command)
|
||||||
|
if (command_length > 0) {
|
||||||
|
if (user_command[start_index] == 34) {
|
||||||
|
start_index = start_index + 1
|
||||||
|
if (user_command[command_length - 1] == 34) {
|
||||||
|
user_command[command_length - 1] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user_command[start_index] == 47) {
|
||||||
|
start_index++
|
||||||
|
}
|
||||||
|
|
||||||
|
copy(origin_command, 192, user_command[start_index])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command_length > 0) {
|
||||||
|
if (block_chat_commands > 0) {
|
||||||
|
|
||||||
|
new command_type[32] = "say"
|
||||||
|
new command_blocked = is_command_blocked(origin_command)
|
||||||
|
|
||||||
|
if (command_blocked > 0) {
|
||||||
|
|
||||||
|
if (is_user_connected(client)) {
|
||||||
|
if ((strcmp("hlx_menu", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlx", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlstatsx", user_command[start_index]) == 0)) {
|
||||||
|
|
||||||
|
display_mainmenu(client)
|
||||||
|
}
|
||||||
|
log_player_event(client, command_type, origin_command, 0)
|
||||||
|
}
|
||||||
|
return PLUGIN_HANDLED
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (is_user_connected(client)) {
|
||||||
|
if ((strcmp("hlx_menu", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlx", user_command[start_index]) == 0) ||
|
||||||
|
(strcmp("hlstatsx", user_command[start_index]) == 0)) {
|
||||||
|
display_mainmenu(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PLUGIN_CONTINUE
|
||||||
|
}
|
||||||
|
|
||||||
|
|
BIN
heatmaps/DejaVuSans.ttf
Normal file
14
heatmaps/README
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
HLstatsX Community Edition
|
||||||
|
Heatmap Generation Installation Instructions
|
||||||
|
|
||||||
|
WARNING: Heatmap generation will consume alot of processor time. Please be sure to plan accordingly!
|
||||||
|
300k kills on one map will take ~10min to generate on one 2.4Ghz core processor.
|
||||||
|
|
||||||
|
Install:
|
||||||
|
- change user, password, database and path to your "web" folder in config.inc.php
|
||||||
|
- download the appropriate heatmap pack from www.hlxcommunity.com and put into "src"
|
||||||
|
|
||||||
|
To generate heatmaps:
|
||||||
|
- run: php generate.php
|
||||||
|
|
||||||
|
report problems to hlx forums or irc
|
20
heatmaps/config.inc.php
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
ini_set("memory_limit", "32M");
|
||||||
|
ini_set("max_execution_time", "0");
|
||||||
|
|
||||||
|
define('DB_HOST', 'localhost');
|
||||||
|
define('DB_USER', '');
|
||||||
|
define('DB_PASS', '');
|
||||||
|
define('DB_NAME', '');
|
||||||
|
define('HLXCE_WEB', '/path/to/where/you/have/your/hlstats/web');
|
||||||
|
define('HUD_URL', 'http://www.hlxcommunity.com');
|
||||||
|
define('OUTPUT_SIZE', 'medium');
|
||||||
|
|
||||||
|
define('DB_PREFIX', 'hlstats');
|
||||||
|
define('KILL_LIMIT', 10000);
|
||||||
|
define('DEBUG', 1);
|
||||||
|
|
||||||
|
// No need to change this unless you are on really low disk.
|
||||||
|
define('CACHE_DIR', dirname(__FILE__) . '/cache');
|
||||||
|
|
19
heatmaps/generate.php
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
#!/usr/bin/php
|
||||||
|
<?php
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
ini_set("memory_limit", "32M");
|
||||||
|
|
||||||
|
require_once 'config.inc.php';
|
||||||
|
require_once 'heatmap.class.php';
|
||||||
|
|
||||||
|
$heat = new Heatmap;
|
||||||
|
$heat->init();
|
||||||
|
|
||||||
|
foreach (Env::get('mapinfo') as $game => $gameconf) {
|
||||||
|
foreach ($gameconf as $map => $data) {
|
||||||
|
$heat->generate($game, $map, "kill");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
show::Event("CREATE", "Heatmap creation done.", 1);
|
||||||
|
?>
|
608
heatmaps/heatmap.class.php
Normal file
|
@ -0,0 +1,608 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class holds Environmental vars that can be used anywhere in the code
|
||||||
|
* For example the database object to perform mysql stuff
|
||||||
|
*/
|
||||||
|
class Env {
|
||||||
|
private static $data = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the specified key=>value to the environmental data array
|
||||||
|
*
|
||||||
|
* @param string $key this is the identifier of the value you are adding
|
||||||
|
* @param string $value The value to add into the array
|
||||||
|
*/
|
||||||
|
public static function set($key, $value) {
|
||||||
|
self::$data[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the current value from the data array
|
||||||
|
*
|
||||||
|
* @param string $key The key to lookup in the array
|
||||||
|
* @throws SteambansException if the variable cannot be found
|
||||||
|
* @return mixed null if the key cannot be found, or the value that was stored in the array
|
||||||
|
*/
|
||||||
|
public static function get($key) {
|
||||||
|
return array_key_exists($key, self::$data) ? self::$data[$key] : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Heatmap API to generate/add/update/delete content for heatmaps.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Heatmap {
|
||||||
|
var $version = "0.1";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stuff we want to fire when we start.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function init () {
|
||||||
|
global $argv;
|
||||||
|
DB::connect();
|
||||||
|
self::mapinfo();
|
||||||
|
self::parseArguments($argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function that builds the maplist from db elements.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function mapinfo () {
|
||||||
|
$query = 'SELECT
|
||||||
|
g.code,
|
||||||
|
hc.game,
|
||||||
|
hc.map,
|
||||||
|
hc.xoffset,
|
||||||
|
hc.yoffset,
|
||||||
|
hc.flipx,
|
||||||
|
hc.flipy,
|
||||||
|
hc.rotate,
|
||||||
|
hc.days,
|
||||||
|
hc.brush,
|
||||||
|
hc.scale,
|
||||||
|
hc.font,
|
||||||
|
hc.thumbw,
|
||||||
|
hc.thumbh,
|
||||||
|
hc.cropx1,
|
||||||
|
hc.cropx2,
|
||||||
|
hc.cropy1,
|
||||||
|
hc.cropy2
|
||||||
|
FROM
|
||||||
|
' . DB_PREFIX . '_Games AS g
|
||||||
|
INNER JOIN
|
||||||
|
' . DB_PREFIX . '_Heatmap_Config AS hc
|
||||||
|
ON
|
||||||
|
hc.game = g.realgame
|
||||||
|
WHERE 1=1
|
||||||
|
ORDER BY code ASC, game ASC, map ASC';
|
||||||
|
|
||||||
|
$result = DB::doQuery($query);
|
||||||
|
if (DB::numRows($result)) {
|
||||||
|
while ($row = DB::getAssoc($result)) {
|
||||||
|
foreach ($row as $key => $val) {
|
||||||
|
$mapinfo[$row['code']][$row['map']][$key] = $val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Env::set('mapinfo', $mapinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function printHeatDot($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
|
||||||
|
if(!isset($pct)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$pct /= 100;
|
||||||
|
|
||||||
|
// Get image width and height
|
||||||
|
$w = imagesx( $src_im );
|
||||||
|
$h = imagesy( $src_im );
|
||||||
|
|
||||||
|
// Turn alpha blending off
|
||||||
|
imagealphablending( $src_im, false );
|
||||||
|
|
||||||
|
// Find the most opaque pixel in the image (the one with the smallest alpha value)
|
||||||
|
$minalpha = 127;
|
||||||
|
for( $x = 0; $x < $w; $x++ ) {
|
||||||
|
for( $y = 0; $y < $h; $y++ ){
|
||||||
|
$alpha = ( imagecolorat( $src_im, $x, $y ) >> 24 ) & 0xFF;
|
||||||
|
if( $alpha < $minalpha ){
|
||||||
|
$minalpha = $alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//loop through image pixels and modify alpha for each
|
||||||
|
for( $x = 0; $x < $w; $x++ ){
|
||||||
|
for( $y = 0; $y < $h; $y++ ){
|
||||||
|
//get current alpha value (represents the TANSPARENCY!)
|
||||||
|
$colorxy = imagecolorat( $src_im, $x, $y );
|
||||||
|
$alpha = ( $colorxy >> 24 ) & 0xFF;
|
||||||
|
|
||||||
|
//calculate new alpha
|
||||||
|
if( $minalpha !== 127 ){
|
||||||
|
$alpha = 127 + 127 * $pct * ( $alpha - 127 ) / ( 127 - $minalpha );
|
||||||
|
} else {
|
||||||
|
$alpha += 127 * $pct;
|
||||||
|
}
|
||||||
|
|
||||||
|
//get the color index with new alpha
|
||||||
|
$alphacolorxy = imagecolorallocatealpha( $src_im, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
|
||||||
|
|
||||||
|
//set pixel with the new color + opacity
|
||||||
|
if( !imagesetpixel( $src_im, $x, $y, $alphacolorxy ) ){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The image copy
|
||||||
|
imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function generate($code, $map, $mode) {
|
||||||
|
// generatemap($map, $code, "Total Kills", "HlstatsX:CE")
|
||||||
|
self::buildQuery($code, $map);
|
||||||
|
|
||||||
|
|
||||||
|
$mapinfo = Env::get('mapinfo');
|
||||||
|
$map_query = Env::get('map_query');
|
||||||
|
$disable_cache = Env::get('disable_cache');
|
||||||
|
|
||||||
|
// See if we need to rotate the map or not.
|
||||||
|
$rotate = $mapinfo[$code][$map]['rotate'];
|
||||||
|
|
||||||
|
|
||||||
|
$timestamp = time();
|
||||||
|
|
||||||
|
// Fix the last part of your path.
|
||||||
|
$path = HLXCE_WEB . "/hlstatsimg/games/" . $mapinfo[$code][$map]['code'] . "/heatmaps";
|
||||||
|
show::Event("PATH", $path, 3);
|
||||||
|
|
||||||
|
// Does the source image exists? else there is no idea to spend resources on it.
|
||||||
|
if (!file_exists(dirname(__FILE__) . "/src/" . $mapinfo[$code][$map]['game'] . "/" . $map . ".jpg")) {
|
||||||
|
show::Event("FILE", dirname(__FILE__) . "/src/" . $mapinfo[$code][$map]['game'] . "/" . $map . ".jpg doesn't exists", 3);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the dir exists, else try to create it.
|
||||||
|
if (!is_dir($path)) {
|
||||||
|
if (!@mkdir($path)) {
|
||||||
|
show::Event("PREPARE", "Couln't create outputfolder: $path", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have cached info, then we should work from that instead.
|
||||||
|
if (is_dir(CACHE_DIR . "/$code")) {
|
||||||
|
if ($handle = opendir(CACHE_DIR. "/$code")) {
|
||||||
|
while (false !== ($file = readdir($handle))) {
|
||||||
|
if ($file != "." && $file != ".." && preg_match(str_replace("\$","\\\$","/${map}_(\d+).png/i"), $file, $matches)) {
|
||||||
|
$cache_file = CACHE_DIR . "/$code/$file";
|
||||||
|
$oldtimestamp = $matches[1];
|
||||||
|
|
||||||
|
// unless it's over 30 days old cache file, then we delete it and go from 0 again.
|
||||||
|
if (floor((time() - $oldtimestamp) / 86400 > 30)) {
|
||||||
|
$obsolite_cache = true;
|
||||||
|
show::Event("CACHE", "Cache file is obsolite, " . floor((time() - $oldtimestamp) / 86400) . " days old. Generating from scratch", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we called with --disable-cache we want to clean up and then regen from our start.
|
||||||
|
if ($disable_cache || isset($obsolite_cache)) {
|
||||||
|
$disable_cache = true;
|
||||||
|
if (file_exists($cache_file)) {
|
||||||
|
unlink($cache_file);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
show::Event("CACHE","Found cached file ($file), we will use timestamp $oldtimestamp instead", 1);
|
||||||
|
$find = '/.*AND hef.eventTime >= FROM_UNIXTIME\([0-9]+\).*/i';
|
||||||
|
$replace = ' AND hef.eventTime > FROM_UNIXTIME(' . $oldtimestamp . ')';
|
||||||
|
$map_query = preg_replace($find, $replace, $map_query);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir($handle);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!@mkdir(CACHE_DIR . "/$code")) {
|
||||||
|
show::Event("CACHE", "Can't create cache_dir: " . CACHE_DIR . "/$code", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = DB::doQuery($map_query);
|
||||||
|
$num_kills = DB::numRows($result);
|
||||||
|
|
||||||
|
if (!$num_kills) {
|
||||||
|
show::Event("IGNORE", "Game: $code, Map: $map, Kills: $num_kills, (to few kills)", 1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$firstdata = time();
|
||||||
|
|
||||||
|
$img = imagecreatefromjpeg("./src/" . $mapinfo[$code][$map]['game'] . "/" . $map . ".jpg");
|
||||||
|
imagealphablending($img, true);
|
||||||
|
imagesavealpha($img, true);
|
||||||
|
|
||||||
|
if (isset($cache_file) && !$disable_cache) {
|
||||||
|
$overlay = imagecreatefrompng($cache_file);
|
||||||
|
} else {
|
||||||
|
$overlay = imagecreatetruecolor(imagesx($img), imagesy($img));
|
||||||
|
}
|
||||||
|
|
||||||
|
imagealphablending($overlay, true);
|
||||||
|
imagesavealpha($overlay, true);
|
||||||
|
|
||||||
|
$brush = imagecreatefrompng("./src/brush_" . $mapinfo[$code][$map]['brush'] . ".png");
|
||||||
|
$brushsize = ($mapinfo[$code][$map]['brush'] == "large") ? 33 : 17;
|
||||||
|
|
||||||
|
$white = imagecolorallocate($overlay, 255, 255, 255);
|
||||||
|
$black = imagecolorallocate($overlay, 0, 0, 0);
|
||||||
|
|
||||||
|
imagefill($overlay, 0, 0, $black);
|
||||||
|
imagecolortransparent($overlay, $black);
|
||||||
|
|
||||||
|
$num_kills = ($num_kills) ? $num_kills : 1;
|
||||||
|
|
||||||
|
show::Event("CREATE", "Game: $code, Map: $map, Kills: $num_kills", 1);
|
||||||
|
$opacity = intval((500 / $num_kills) * 100);
|
||||||
|
|
||||||
|
|
||||||
|
if ($opacity > 40) $opacity = 40;
|
||||||
|
if ($opacity < 1) $opacity = 2;
|
||||||
|
|
||||||
|
|
||||||
|
$max_red = 0;
|
||||||
|
$i = 0;
|
||||||
|
while ($row = DB::getAssoc($result)) {
|
||||||
|
if ($row['eventTime'] < $firstdata) $firstdata = $row['eventTime'];
|
||||||
|
|
||||||
|
if ($mapinfo[$code][$map]['flipx']) $row['pos_x'] = $row['pos_x'] * -1;
|
||||||
|
if ($mapinfo[$code][$map]['flipy']) $row['pos_y'] = $row['pos_y'] * -1;
|
||||||
|
|
||||||
|
$x = ($row['pos_x'] + $mapinfo[$code][$map]['xoffset']) / $mapinfo[$code][$map]['scale'];
|
||||||
|
$y = ($row['pos_y'] + $mapinfo[$code][$map]['yoffset']) / $mapinfo[$code][$map]['scale'];
|
||||||
|
|
||||||
|
$rgb = imagecolorat($overlay, $x, $y);
|
||||||
|
$colors = imagecolorsforindex($overlay, $rgb);
|
||||||
|
|
||||||
|
if ($colors['red'] > $max_red) $max_red = $colors['red'];
|
||||||
|
|
||||||
|
if ($colors['red'] <= 200) {
|
||||||
|
// Rotate the image
|
||||||
|
if ($rotate) {
|
||||||
|
self::printHeatDot($overlay, $brush, $y - ($brushsize / 2), $x - ($brushsize / 2), 0, 0, $brushsize, $brushsize, $opacity);
|
||||||
|
} else {
|
||||||
|
self::printHeatDot($overlay, $brush, $x - ($brushsize / 2), $y - ($brushsize / 2), 0, 0, $brushsize, $brushsize, $opacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
imagedestroy($brush);
|
||||||
|
|
||||||
|
$colorarr = array();
|
||||||
|
$colors = array(0, 0, 255);
|
||||||
|
|
||||||
|
for ($line = 0; $line < 128; ++$line) {
|
||||||
|
$colors = array(0, $colors[1] + 2, $colors[2] -2);
|
||||||
|
$colorarr[$line] = $colors;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($line = 128; $line < 255; ++$line) {
|
||||||
|
$colors = array($colors[0] + 2, $colors[1] -2, 0);
|
||||||
|
$colorarr[$line] = $colors;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($x = 0; $x < imagesx($overlay); ++$x) {
|
||||||
|
for ($y = 0; $y < imagesy($overlay); ++$y) {
|
||||||
|
$index = imagecolorat($overlay, $x, $y);
|
||||||
|
$rgb = imagecolorsforindex($overlay, $index);
|
||||||
|
$alpha = ( imagecolorat( $overlay, $x, $y ) >> 24 ) & 0xFF;
|
||||||
|
|
||||||
|
$color = imagecolorallocatealpha($img, $colorarr[$rgb['red']][0], $colorarr[$rgb['red']][1], $colorarr[$rgb['red']][2], 127 - ($rgb['red'] / 2));
|
||||||
|
if (!imagesetpixel($img, $x, $y, $color)) echo ".";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mapinfo[$code][$map]['cropy2'] > 0 && $mapinfo[$code][$map]['cropy2'] > 0) {
|
||||||
|
$temp = imagecreatetruecolor($mapinfo[$code][$map]['cropx2'], $mapinfo[$code][$map]['cropy2']);
|
||||||
|
imagecopy($temp, $img, 0, 0, $mapinfo[$code][$map]['cropx1'], $mapinfo[$code][$map]['cropy1'], $mapinfo[$code][$map]['cropx2'], $mapinfo[$code][$map]['cropy2']);
|
||||||
|
imagedestroy($img);
|
||||||
|
|
||||||
|
$img = imagecreatetruecolor(imagesx($temp), imagesy($temp));
|
||||||
|
imagecopy($img, $temp, 0, 0, 0, 0, imagesx($temp), imagesy($temp));
|
||||||
|
imagedestroy($temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mapinfo[$code][$map]['thumbw'] > 0 && $mapinfo[$code][$map]['thumbh'] > 0) {
|
||||||
|
$thumb = imagecreatetruecolor(imagesx($img) * $mapinfo[$code][$map]['thumbw'], imagesy($img) * $mapinfo[$code][$map]['thumbh']);
|
||||||
|
imagecopyresampled($thumb, $img, 0, 0, 0, 0, imagesx($thumb), imagesy($thumb), imagesx($img), imagesy($img));
|
||||||
|
imagejpeg($thumb, $path . "/" . $map . "-" . $mode . "-thumb.jpg", 100);
|
||||||
|
imagedestroy($thumb);
|
||||||
|
}
|
||||||
|
|
||||||
|
$img = self::drawHud($img, $map, "HLX:CE", "Total Kills", $num_kills, $firstdata);
|
||||||
|
|
||||||
|
if (imagejpeg($img, $path . "/" . $map . "-" . $mode . ".jpg", 100)) $return = true;
|
||||||
|
if (imagepng($overlay, CACHE_DIR . "/$code/${map}_${timestamp}.png", 9)) $return = true;
|
||||||
|
imagedestroy($overlay);
|
||||||
|
|
||||||
|
// Clean upc cache file
|
||||||
|
if (isset($cache_file) && file_exists($cache_file)) {
|
||||||
|
unlink(CACHE_DIR . "/$code/${map}_${oldtimestamp}.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
imagedestroy($img);
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function buildQuery ($code, $map) {
|
||||||
|
$mapinfo = Env::get('mapinfo');
|
||||||
|
Env::set('code', $code);
|
||||||
|
$ignore_infected = Env::get('ignore_infected');
|
||||||
|
$timescope = (time() - 60*60*24*$mapinfo[$code][$map]['days']);
|
||||||
|
|
||||||
|
$map_query = 'SELECT
|
||||||
|
"frag" AS killtype,
|
||||||
|
hef.id,
|
||||||
|
hef.map,
|
||||||
|
hs.game,
|
||||||
|
hef.eventTime,
|
||||||
|
hef.pos_x,
|
||||||
|
hef.pos_y
|
||||||
|
FROM
|
||||||
|
hlstats_Events_Frags as hef,
|
||||||
|
hlstats_Servers as hs
|
||||||
|
WHERE 1=1
|
||||||
|
AND hef.map = "' . $map . '"
|
||||||
|
AND hs.serverId = hef.serverId
|
||||||
|
AND hs.game = "' . $code. '"
|
||||||
|
AND hef.pos_x IS NOT NULL
|
||||||
|
AND hef.pos_y IS NOT NULL
|
||||||
|
AND hef.eventTime >= FROM_UNIXTIME(' . $timescope . ')
|
||||||
|
';
|
||||||
|
if ($ignore_infected) {
|
||||||
|
$map_query.= ' AND hef.victimRole != "infected"
|
||||||
|
';
|
||||||
|
}
|
||||||
|
$map_query.= ' LIMIT ' . KILL_LIMIT . '
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
"teamkill" AS killtype,
|
||||||
|
hef.id,
|
||||||
|
hef.map,
|
||||||
|
hs.game,
|
||||||
|
hef.eventTime,
|
||||||
|
hef.pos_x,
|
||||||
|
hef.pos_y
|
||||||
|
FROM
|
||||||
|
hlstats_Events_Teamkills as hef,
|
||||||
|
hlstats_Servers as hs
|
||||||
|
WHERE 1=1
|
||||||
|
AND hef.map = "' . $map . '"
|
||||||
|
AND hs.serverId = hef.serverId
|
||||||
|
AND hs.game = "' . $code. '"
|
||||||
|
AND hef.pos_x IS NOT NULL
|
||||||
|
AND hef.pos_y IS NOT NULL
|
||||||
|
AND hef.eventTime >= FROM_UNIXTIME(' . $timescope . ')
|
||||||
|
LIMIT ' . KILL_LIMIT . '
|
||||||
|
';
|
||||||
|
|
||||||
|
Env::set('map_query', $map_query);
|
||||||
|
show::Event("SQL", $map_query, 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function drawHud ($img, $map, $heatmapname, $method, $num_kills, $firstdata) {
|
||||||
|
$mapinfo = Env::get('mapinfo');
|
||||||
|
$code = Env::get('code');
|
||||||
|
|
||||||
|
|
||||||
|
// Resize the image according to your settings
|
||||||
|
$img = self::resize($img);
|
||||||
|
|
||||||
|
$hudText = array(
|
||||||
|
strtoupper($map) . " - " . strtoupper($heatmapname) . " HEATMAP - " . strtoupper($method),
|
||||||
|
date("m/d/y", intval(time() - 60*60*24*30)) . " - " . date("m/d/y", time()),
|
||||||
|
"Generated: " . date("Y-m-d H:i:s"),
|
||||||
|
HUD_URL
|
||||||
|
);
|
||||||
|
|
||||||
|
show::Event("HUD", "Creating Overlay HUD", 2);
|
||||||
|
|
||||||
|
$hudx = imagesx($img);
|
||||||
|
$hudy = intval(intval($mapinfo[$code][$map]['font'] + 4) * intval(count($hudText) + 1) + 8);
|
||||||
|
|
||||||
|
$hud = imagecreatetruecolor(imagesx($img), imagesy($img)) or die('Cannot Initialize new GD image stream');
|
||||||
|
imagesavealpha($hud, true);
|
||||||
|
|
||||||
|
$trans_colour = imagecolorallocatealpha($hud, 0, 0, 0, 127);
|
||||||
|
$black = imagecolorallocatealpha($hud, 0, 0, 0, 90);
|
||||||
|
|
||||||
|
imagefill($hud, 0, 0, $trans_colour);
|
||||||
|
imagefilledrectangle($hud, 0, 0, imagesx($img) - 1, imagesy($img) - 1, $black);
|
||||||
|
|
||||||
|
$font = "./DejaVuSans.ttf";
|
||||||
|
|
||||||
|
// Copy the hud to the top of the image.
|
||||||
|
imagecopy($img, $hud, 0, 0, 0, 0, $hudx, $hudy);
|
||||||
|
|
||||||
|
//array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
|
||||||
|
$i = 1;
|
||||||
|
foreach ($hudText as $text) {
|
||||||
|
imagettftext( $img,
|
||||||
|
$mapinfo[$code][$map]['font'],
|
||||||
|
0,
|
||||||
|
10,
|
||||||
|
intval(intval($mapinfo[$code][$map]['font'] + 4) * $i + 8),
|
||||||
|
imagecolorallocate($img, 255, 255, 255),
|
||||||
|
$font,
|
||||||
|
$text
|
||||||
|
);
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
imagedestroy($hud);
|
||||||
|
|
||||||
|
show::Event("HUD", "Done...", 2);
|
||||||
|
return $img;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function resize ($img) {
|
||||||
|
switch (OUTPUT_SIZE) {
|
||||||
|
case "small":
|
||||||
|
$newwidth = 800;
|
||||||
|
$newheight = 600;
|
||||||
|
break;
|
||||||
|
case "medium":
|
||||||
|
$newwidth = 1024;
|
||||||
|
$newheight = 768;
|
||||||
|
break;
|
||||||
|
case "large":
|
||||||
|
$newwidth = 1280;
|
||||||
|
$newheight = 1024;
|
||||||
|
// As for now we don't do anything since this is default size
|
||||||
|
return $img;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$newwidth = 1024;
|
||||||
|
$newheight = 768;
|
||||||
|
}
|
||||||
|
|
||||||
|
show::Event("RESIZE", "Adjusting Heatmap to current setting: " . OUTPUT_SIZE, 2);
|
||||||
|
|
||||||
|
$resized = imagecreatetruecolor($newwidth, $newheight);
|
||||||
|
imagecopyresized($resized, $img, 0, 0, 0, 0, $newwidth, $newheight, imagesx($img), imagesy($img));
|
||||||
|
|
||||||
|
imagedestroy($img);
|
||||||
|
|
||||||
|
show::Event("RESIZE", "Done...", 2);
|
||||||
|
return $resized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function arguments($argv) {
|
||||||
|
$_ARG = array();
|
||||||
|
foreach ($argv as $arg) {
|
||||||
|
if (preg_match('/\-\-[a-zA-Z0-9]*=.*/', $arg)) {
|
||||||
|
$str = explode('=', $arg);
|
||||||
|
$arg = '';
|
||||||
|
$key = preg_replace('/\-\-/', '', $str[0]);
|
||||||
|
for ( $i = 1; $i < count($str); $i++ ) {
|
||||||
|
$arg .= $str[$i];
|
||||||
|
}
|
||||||
|
$_ARG[$key] = $arg;
|
||||||
|
} elseif(preg_match('/\-[a-zA-Z0-9]/', $arg)) {
|
||||||
|
$arg = preg_replace('/\-/', '', $arg);
|
||||||
|
$_ARG[$arg] = 'true';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function parseArguments($argv) {
|
||||||
|
$mapinfo = Env::get('mapinfo');
|
||||||
|
$cache = false;
|
||||||
|
$args = self::arguments($argv);
|
||||||
|
|
||||||
|
if (isset($args['game'])) {
|
||||||
|
if (!isset($mapinfo[$args['game']])) {
|
||||||
|
show::Event("ERROR", "Game: " . $args['game'] . " doesn't exists, escaping", 1);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($args['map'])) {
|
||||||
|
if (!isset($mapinfo[$args['game']][$args['map']])) {
|
||||||
|
show::Event("ERROR", "Game: " . $args['game'] . " Map: " . $args['map'] . " doesn't exists, escaping", 1);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp[$args['game']][$args['map']] = $mapinfo[$args['game']][$args['map']];
|
||||||
|
show::Event("ARGS", "--game=" . $args['game'], 2);
|
||||||
|
show::Event("ARGS", "--map=" . $args['map'], 2);
|
||||||
|
} else {
|
||||||
|
$tmp[$args['game']] = $mapinfo[$args['game']];
|
||||||
|
show::Event("ARGS", "--game=" . $args['game'], 2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$visible = '';
|
||||||
|
$query = "SELECT code FROM hlstats_Games WHERE hidden='0'";
|
||||||
|
$result = DB::doQuery($query);
|
||||||
|
if (DB::numRows($result)) {
|
||||||
|
while ($row = DB::getAssoc($result)) {
|
||||||
|
foreach ($row as $key => $val) {
|
||||||
|
if (isset($mapinfo[$val])) {
|
||||||
|
$visible .= "$val, ";
|
||||||
|
$tmp[$val] = $mapinfo[$val];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
show::Event("GAMES", substr($visible, 0, -2), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($tmp)) {
|
||||||
|
$mapinfo = $tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($args['disablecache'])) {
|
||||||
|
$cache = true;
|
||||||
|
show::Event("ARGS", "--disable-cache=true", 2);
|
||||||
|
} else {
|
||||||
|
$cache = false;
|
||||||
|
show::Event("ARGS", "--disable-cache=false", 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($args['ignoreinfected'])) {
|
||||||
|
$ignore_infected = true;
|
||||||
|
show::Event("ARGS", "--ignore-infected=true", 2);
|
||||||
|
} else {
|
||||||
|
$ignore_infected = false;
|
||||||
|
show::Event("ARGS", "--ignore-infected=false", 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
Env::set('mapinfo', $mapinfo);
|
||||||
|
Env::set('disable_cache', $cache);
|
||||||
|
Env::set('ignore_infected', $ignore_infected);
|
||||||
|
}
|
||||||
|
|
||||||
|
// End of Heat Class
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class DB {
|
||||||
|
public static function connect () {
|
||||||
|
mysql_connect(DB_HOST, DB_USER, DB_PASS);
|
||||||
|
mysql_select_db(DB_NAME);
|
||||||
|
show::Event("DB", "Connected to " . DB_NAME . " as " . DB_USER . "@" . DB_HOST, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function doQuery ($query) {
|
||||||
|
return mysql_query($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getAssoc ($result) {
|
||||||
|
return mysql_fetch_assoc($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function numRows ($result) {
|
||||||
|
return mysql_num_rows($result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class show {
|
||||||
|
public static function Event ($type, $text, $runlevel) {
|
||||||
|
if ($runlevel <= DEBUG) {
|
||||||
|
print date("Y-m-d H:i:s") . "\t\t$type: $text\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
5
heatmaps/src/README
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
The Heatmap source files are not included with the release packages of HLXCE.
|
||||||
|
|
||||||
|
Heatmap Packs can be downloaded from http://www.hlxce.com.
|
||||||
|
|
||||||
|
Heatmap Pack source files are stored in the HLX-Extras repository.
|
BIN
heatmaps/src/brush_large.png
Normal file
After Width: | Height: | Size: 923 B |
BIN
heatmaps/src/brush_small.png
Normal file
After Width: | Height: | Size: 521 B |
384
scripts/BASTARDrcon.pm
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
package BASTARDrcon;
|
||||||
|
#
|
||||||
|
# BASTARDrcon Perl Module - execute commands on a remote Half-Life 1 server using Rcon.
|
||||||
|
# A merge of the KKrcon library into HLstatsX
|
||||||
|
# Copyright (C) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
|
||||||
|
# KKrcon Perl Module - execute commands on a remote Half-Life server using Rcon.
|
||||||
|
# http://kkrcon.sourceforge.net
|
||||||
|
#
|
||||||
|
# TRcon Perl Module - execute commands on a remote Half-Life2 server using remote console.
|
||||||
|
# http://www.hlstatsx.com
|
||||||
|
#
|
||||||
|
# Copyright (C) 2000, 2001 Rod May
|
||||||
|
# Enhanced in 2005 by Tobi (Tobi@gameme.de)
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use sigtrap;
|
||||||
|
use Socket;
|
||||||
|
use Sys::Hostname;
|
||||||
|
use bytes;
|
||||||
|
|
||||||
|
##
|
||||||
|
## Main
|
||||||
|
##
|
||||||
|
|
||||||
|
#
|
||||||
|
# Constructor
|
||||||
|
#
|
||||||
|
sub new
|
||||||
|
{
|
||||||
|
my ($class_name, $server_object) = @_;
|
||||||
|
my ($self) = {};
|
||||||
|
bless($self, $class_name);
|
||||||
|
|
||||||
|
# Initialise properties
|
||||||
|
$self->{server_object} = $server_object;
|
||||||
|
$self->{rcon_password} = $server_object->{rcon} or die("BASTARDrcon: a Password is required\n");
|
||||||
|
$self->{server_host} = $server_object->{address};
|
||||||
|
$self->{server_port} = int($server_object->{port}) or die("BASTARDrcon: invalid Port \"" . $server_object->{port} . "\"\n");
|
||||||
|
|
||||||
|
$self->{socket} = undef;
|
||||||
|
$self->{error} = "";
|
||||||
|
|
||||||
|
# Set up socket parameters
|
||||||
|
$self->{_ipaddr} = gethostbyname($self->{server_host}) or die("BASTARDrcon: could not resolve Host \"" . $self->{server_host} . "\"\n");
|
||||||
|
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Execute an Rcon command and return the response
|
||||||
|
#
|
||||||
|
sub execute
|
||||||
|
{
|
||||||
|
my ($self, $command) = @_;
|
||||||
|
my $msg;
|
||||||
|
my $ans;
|
||||||
|
|
||||||
|
# version x.1.0.6+ HL1 server
|
||||||
|
$msg = "\xFF\xFF\xFF\xFFchallenge rcon\n\0";
|
||||||
|
$ans = $self->_sendrecv($msg);
|
||||||
|
|
||||||
|
if ($ans =~ /challenge +rcon +(\d+)/)
|
||||||
|
{
|
||||||
|
$msg = "\xFF\xFF\xFF\xFFrcon $1 \"" . $self->{"rcon_password"} . "\" $command\0";
|
||||||
|
$ans = $self->_sendrecv($msg);
|
||||||
|
}
|
||||||
|
elsif (!$self->error())
|
||||||
|
{
|
||||||
|
$ans = "";
|
||||||
|
$self->{"error"} = "No challenge response";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ans =~ /bad rcon_password/i)
|
||||||
|
{
|
||||||
|
$self->{"error"} = "Bad Password";
|
||||||
|
}
|
||||||
|
return $ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _sendrecv
|
||||||
|
{
|
||||||
|
my ($self, $msg) = @_;
|
||||||
|
my $host = $self->{"server_host"};
|
||||||
|
my $port = $self->{"server_port"};
|
||||||
|
my $ipaddr = $self->{"_ipaddr"};
|
||||||
|
my $proto = $self->{"_proto"};
|
||||||
|
|
||||||
|
# Open socket
|
||||||
|
socket($self->{"socket"}, PF_INET, SOCK_DGRAM, $proto) or die("BASTARDrcon(141): socket: $!\n");
|
||||||
|
my $hispaddr = sockaddr_in($port, $ipaddr);
|
||||||
|
|
||||||
|
die("BASTARDrcon: send $ipaddr:$port : $!") unless(defined(send($self->{"socket"}, $msg, 0, $hispaddr)));
|
||||||
|
|
||||||
|
my $rin = "";
|
||||||
|
vec($rin, fileno($self->{"socket"}), 1) = 1;
|
||||||
|
my $ans = "TIMEOUT";
|
||||||
|
if (select($rin, undef, undef, 0.5))
|
||||||
|
{
|
||||||
|
$ans = "";
|
||||||
|
$hispaddr = recv($self->{"socket"}, $ans, 8192, 0);
|
||||||
|
$ans =~ s/\x00+$//; # trailing crap
|
||||||
|
$ans =~ s/^\xFF\xFF\xFF\xFFl//; # HL response
|
||||||
|
$ans =~ s/^\xFF\xFF\xFF\xFFn//; # QW response
|
||||||
|
$ans =~ s/^\xFF\xFF\xFF\xFF//; # Q2/Q3 response
|
||||||
|
$ans =~ s/^\xFE\xFF\xFF\xFF.....//; # old HL bug/feature
|
||||||
|
}
|
||||||
|
# Close socket
|
||||||
|
close($self->{"socket"});
|
||||||
|
|
||||||
|
if ($ans eq "TIMEOUT")
|
||||||
|
{
|
||||||
|
$ans = "";
|
||||||
|
$self->{"error"} = "Rcon timeout";
|
||||||
|
}
|
||||||
|
return $ans;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Send a package
|
||||||
|
#
|
||||||
|
sub send_rcon
|
||||||
|
{
|
||||||
|
my ($self, $id, $command, $string1, $string2) = @_;
|
||||||
|
my $tmp = pack("VVZ*Z*",$id,$command,$string1,$string2);
|
||||||
|
my $size = length($tmp);
|
||||||
|
if($size > 4096)
|
||||||
|
{
|
||||||
|
$self->{error} = "Command too long to send!";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
$tmp = pack("V", $size) .$tmp;
|
||||||
|
|
||||||
|
unless(defined(send($self->{"socket"},$tmp,0)))
|
||||||
|
{
|
||||||
|
die("BASTARDrcon: send $!");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Recieve a package
|
||||||
|
#
|
||||||
|
sub recieve_rcon
|
||||||
|
{
|
||||||
|
my $self = shift;
|
||||||
|
my ($size, $id, $command, $msg);
|
||||||
|
my $rin = "";
|
||||||
|
my $tmp = "";
|
||||||
|
|
||||||
|
vec($rin, fileno($self->{"socket"}), 1) = 1;
|
||||||
|
if(select($rin, undef, undef, 0.5))
|
||||||
|
{
|
||||||
|
while(length($size) < 4)
|
||||||
|
{
|
||||||
|
$tmp = "";
|
||||||
|
recv($self->{"socket"}, $tmp, (4-length($size)), 0);
|
||||||
|
$size .= $tmp;
|
||||||
|
}
|
||||||
|
$size = unpack("V", $size);
|
||||||
|
if($size < 10 || $size > 8192)
|
||||||
|
{
|
||||||
|
close($self->{"socket"});
|
||||||
|
$self->{error} = "illegal size $size ";
|
||||||
|
return (-1, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while(length($id)<4)
|
||||||
|
{
|
||||||
|
$tmp = "";
|
||||||
|
recv($self->{"socket"}, $tmp, (4-length($id)), 0);
|
||||||
|
$id .= $tmp;
|
||||||
|
}
|
||||||
|
$id = unpack("V", $id);
|
||||||
|
$size = $size - 4;
|
||||||
|
while(length($command)<4)
|
||||||
|
{
|
||||||
|
$tmp ="";
|
||||||
|
recv($self->{"socket"}, $tmp, (4-length($command)),0);
|
||||||
|
$command.=$tmp;
|
||||||
|
}
|
||||||
|
$command = unpack("V", $command);
|
||||||
|
$size = $size - 4;
|
||||||
|
my $msg = "";
|
||||||
|
while($size >= 1)
|
||||||
|
{
|
||||||
|
$tmp = "";
|
||||||
|
recv($self->{"socket"}, $tmp, $size, 0);
|
||||||
|
$size -= length($tmp);
|
||||||
|
$msg .= $tmp;
|
||||||
|
}
|
||||||
|
my ($string1,$string2) = unpack("Z*Z*",$msg);
|
||||||
|
$msg = $string1.$string2;
|
||||||
|
return ($id, $command, $msg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (-1, -1, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get error message
|
||||||
|
#
|
||||||
|
sub error
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
return $self->{"error"};
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parse "status" command output into player information
|
||||||
|
#
|
||||||
|
sub getPlayers
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
my $status = $self->execute("status");
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $status);
|
||||||
|
|
||||||
|
my %players;
|
||||||
|
|
||||||
|
# HL1
|
||||||
|
# name userid uniqueid frag time ping loss adr
|
||||||
|
# 1 "psychonic" 1 STEAM_0:1:4153990 0 00:33 13 0 192.168.5.115:27005
|
||||||
|
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
if ($line =~ /^\#\s*\d+\s+
|
||||||
|
"(.+)"\s+ # name
|
||||||
|
(\d+)\s+ # userid
|
||||||
|
([^\s]+)\s+\d+\s+ # uniqueid
|
||||||
|
([\d:]+)\s+ # time
|
||||||
|
(\d+)\s+ # ping
|
||||||
|
(\d+)\s+ # loss
|
||||||
|
([^:]+): # addr
|
||||||
|
(\S+) # port
|
||||||
|
$/x)
|
||||||
|
|
||||||
|
{
|
||||||
|
my $name = $1;
|
||||||
|
my $userid = $2;
|
||||||
|
my $uniqueid = $3;
|
||||||
|
my $time = $4;
|
||||||
|
my $ping = $5;
|
||||||
|
my $loss = $6;
|
||||||
|
my $state = "";
|
||||||
|
my $address = $7;
|
||||||
|
my $port = $8;
|
||||||
|
|
||||||
|
$uniqueid =~ s/^STEAM_[0-9]+?\://i;
|
||||||
|
|
||||||
|
# &::printEvent("DEBUG", "USERID: '$userid', NAME: '$name', UNIQUEID: '$uniqueid', TIME: '$time', PING: '$ping', LOSS: '$loss', ADDRESS:'$address', CLI_PORT: '$port'", 1);
|
||||||
|
|
||||||
|
if ($::g_mode eq "NameTrack") {
|
||||||
|
$players{$name} = {
|
||||||
|
"Name" => $name,
|
||||||
|
"UserID" => $userid,
|
||||||
|
"UniqueID" => $uniqueid,
|
||||||
|
"Time" => $time,
|
||||||
|
"Ping" => $ping,
|
||||||
|
"Loss" => $loss,
|
||||||
|
"State" => $state,
|
||||||
|
"Address" => $address,
|
||||||
|
"ClientPort" => $port
|
||||||
|
};
|
||||||
|
} elsif ($::g_mode eq "LAN") {
|
||||||
|
$players{$address} = {
|
||||||
|
"Name" => $name,
|
||||||
|
"UserID" => $userid,
|
||||||
|
"UniqueID" => $uniqueid,
|
||||||
|
"Time" => $time,
|
||||||
|
"Ping" => $ping,
|
||||||
|
"Loss" => $loss,
|
||||||
|
"State" => $state,
|
||||||
|
"Address" => $address,
|
||||||
|
"ClientPort" => $port
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
$players{$uniqueid} = {
|
||||||
|
"Name" => $name,
|
||||||
|
"UserID" => $userid,
|
||||||
|
"UniqueID" => $uniqueid,
|
||||||
|
"Time" => $time,
|
||||||
|
"Ping" => $ping,
|
||||||
|
"Loss" => $loss,
|
||||||
|
"State" => $state,
|
||||||
|
"Address" => $address,
|
||||||
|
"ClientPort" => $port
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return %players;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getServerData
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
my $status = $self->execute("status");
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $status);
|
||||||
|
|
||||||
|
my $servhostname = "";
|
||||||
|
my $map = "";
|
||||||
|
my $max_players = 0;
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
if ($line =~ /^\s*hostname\s*:\s*([\S].*)$/x)
|
||||||
|
{
|
||||||
|
$servhostname = $1;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^\s*map\s*:\s*([\S]+).*$/x)
|
||||||
|
{
|
||||||
|
$map = $1;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^\s*players\s*:\s*\d+.+\((\d+)\smax.*$/)
|
||||||
|
{
|
||||||
|
$max_players = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ($servhostname, $map, $max_players, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub getVisiblePlayers
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
my $status = $self->execute("sv_visiblemaxplayers");
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $status);
|
||||||
|
|
||||||
|
|
||||||
|
my $max_players = -1;
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
# "sv_visiblemaxplayers" = "-1"
|
||||||
|
# - Overrides the max players reported to prospective clients
|
||||||
|
if ($line =~ /^\s*"sv_visiblemaxplayers"\s*=\s*"([-0-9]+)".*$/x)
|
||||||
|
{
|
||||||
|
$max_players = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ($max_players);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get information about a player by userID
|
||||||
|
#
|
||||||
|
|
||||||
|
sub getPlayer
|
||||||
|
{
|
||||||
|
my ($self, $uniqueid) = @_;
|
||||||
|
my %players = $self->getPlayers();
|
||||||
|
|
||||||
|
if (defined($players{$uniqueid}))
|
||||||
|
{
|
||||||
|
return $players{$uniqueid};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$self->{"error"} = "No such player # $uniqueid";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
# end
|
247
scripts/ConfigReaderSimple.pm
Normal file
|
@ -0,0 +1,247 @@
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
|
||||||
|
package ConfigReaderSimple;
|
||||||
|
#
|
||||||
|
# Simple interface to a configuration file
|
||||||
|
#
|
||||||
|
# Originally developed by Ben Oberin.
|
||||||
|
# Modified for HLstats by Simon Garner.
|
||||||
|
# Modified for HLstatsX by Tobias Oetzel.
|
||||||
|
#
|
||||||
|
# ObLegalStuff:
|
||||||
|
# Copyright (c) 2000 Bek Oberin. All rights reserved. This program is
|
||||||
|
# free software; you can redistribute it and/or modify it under the
|
||||||
|
# same terms as Perl itself.
|
||||||
|
#
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
|
||||||
|
@ISA = qw(Exporter);
|
||||||
|
@EXPORT = qw();
|
||||||
|
@EXPORT_OK = qw();
|
||||||
|
|
||||||
|
$VERSION = "1.0";
|
||||||
|
|
||||||
|
my $DEBUG = 0;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
ConfigReader::Simple - Simple configuration file parser
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use ConfigReader::Simple;
|
||||||
|
|
||||||
|
$config = ConfigReader::Simple->new("configrc", [qw(Foo Bar Baz Quux)]);
|
||||||
|
|
||||||
|
$config->parse();
|
||||||
|
|
||||||
|
$config->get("Foo");
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
C<ConfigReader::Simple> reads and parses simple configuration files. It's
|
||||||
|
designed to be smaller and simpler than the C<ConfigReader> module
|
||||||
|
and is more suited to simple configuration files.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
# Functions under here are member functions #
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
=head1 CONSTRUCTOR
|
||||||
|
|
||||||
|
=item new ( FILENAME, DIRECTIVES )
|
||||||
|
|
||||||
|
This is the constructor for a new ConfigReader::Simple object.
|
||||||
|
|
||||||
|
C<FILENAME> tells the instance where to look for the configuration
|
||||||
|
file.
|
||||||
|
|
||||||
|
C<DIRECTIVES> is an optional argument and is a reference to an array.
|
||||||
|
Each member of the array should contain one valid directive. A directive
|
||||||
|
is the name of a key that must occur in the configuration file. If it
|
||||||
|
is not found, the module will die. The directive list may contain all
|
||||||
|
the keys in the configuration file, a sub set of keys or no keys at all.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my $prototype = shift;
|
||||||
|
my $filename = shift;
|
||||||
|
my $keyref = shift;
|
||||||
|
|
||||||
|
my $class = ref($prototype) || $prototype;
|
||||||
|
my $self = {};
|
||||||
|
|
||||||
|
$self->{"filename"} = $filename;
|
||||||
|
$self->{"validkeys"} = $keyref;
|
||||||
|
|
||||||
|
bless($self, $class);
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# destructor
|
||||||
|
#
|
||||||
|
sub DESTROY {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
=pod
|
||||||
|
=item parse ()
|
||||||
|
|
||||||
|
This does the actual work. No parameters needed.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub parse {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
open(CONFIG, $self->{"filename"}) ||
|
||||||
|
die "Config: Can't open config file " . $self->{"filename"} . ": $!";
|
||||||
|
|
||||||
|
my @array_buffer;
|
||||||
|
my $ext_option = 0;
|
||||||
|
my $parsed_line = 0;
|
||||||
|
|
||||||
|
while (<CONFIG>) {
|
||||||
|
chomp;
|
||||||
|
next if /^\s*$/; # blank
|
||||||
|
next if /^\s*#/; # comment
|
||||||
|
next if /^\s*.*\[[0-9]+\]\s*=\s*\(/; # old style server config start
|
||||||
|
next if /^\s*.*\s*=>\s*\.*".*\",/; # old style server config option
|
||||||
|
|
||||||
|
$parsed_line = 0;
|
||||||
|
my $input_text = $_;
|
||||||
|
|
||||||
|
if (($ext_option == 0) && ($parsed_line == 0)) {
|
||||||
|
my ($key, $value) = &parse_line($input_text);
|
||||||
|
warn "Key: '$key' Value: '$value'\n" if $DEBUG;
|
||||||
|
$self->{"config_data"}{$key} = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(CONFIG);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
=pod
|
||||||
|
=item get ( DIRECTIVE )
|
||||||
|
|
||||||
|
Returns the parsed value for that directive.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub get {
|
||||||
|
my $self = shift;
|
||||||
|
my $key = shift;
|
||||||
|
|
||||||
|
unless (ref $self->{"config_data"}{$key}) {
|
||||||
|
return $self->{"config_data"}{$key};
|
||||||
|
} else {
|
||||||
|
return %{$self->{"config_data"}{$key}};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Internal methods
|
||||||
|
|
||||||
|
sub parse_line {
|
||||||
|
my $text = shift;
|
||||||
|
|
||||||
|
my ($key, $value);
|
||||||
|
|
||||||
|
if ($text =~ /^\s*(\w+)\s+(['"]?)(.*?)\2\s*$/) {
|
||||||
|
$key = $1;
|
||||||
|
$value = $3;
|
||||||
|
} else {
|
||||||
|
die "Config: Can't parse line: $text\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
|
=head1 LIMITATIONS/BUGS
|
||||||
|
|
||||||
|
Directives are case-sensitive.
|
||||||
|
|
||||||
|
If a directive is repeated, the first instance will silently be
|
||||||
|
ignored.
|
||||||
|
|
||||||
|
Always die()s on errors instead of reporting them.
|
||||||
|
|
||||||
|
C<get()> doesn't warn if used before C<parse()>.
|
||||||
|
|
||||||
|
C<get()> doesn't warn if you try to acces the value of an
|
||||||
|
unknown directive not know (ie: one that wasn't passed via C<new()>).
|
||||||
|
|
||||||
|
All these will be addressed in future releases.
|
||||||
|
|
||||||
|
=head1 CREDITS
|
||||||
|
|
||||||
|
Kim Ryan <kimaryan@ozemail.com.au> adapted the module to make declaring
|
||||||
|
keys optional. Thanks Kim.
|
||||||
|
|
||||||
|
=head1 AUTHORS
|
||||||
|
|
||||||
|
Bek Oberin <gossamer@tertius.net.au>
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2000 Bek Oberin. All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
#
|
||||||
|
# End code.
|
||||||
|
#
|
||||||
|
1;
|
86
scripts/GeoLiteCity/GeoLite_Import.sh
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
# Configure the variables below
|
||||||
|
|
||||||
|
# Set this value to 1 if you are running Gentoo linux, or any other linux distro where the "cal" command outputs not Sunday as the first day in every row!
|
||||||
|
LINUX_OTHER="0"
|
||||||
|
|
||||||
|
# Login information for your MySQL server
|
||||||
|
DBHOST="localhost"
|
||||||
|
DBNAME=""
|
||||||
|
DBUSER=""
|
||||||
|
DBPASS=""
|
||||||
|
|
||||||
|
#
|
||||||
|
# Nothing to change below here.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# database is updated every first tuesday of any month, so download it with that specific date and import it
|
||||||
|
TODAY_MONTH=$( date +%m )
|
||||||
|
TODAY_YEAR=$( date +%Y )
|
||||||
|
if [ $LINUX_OTHER == "1" ]
|
||||||
|
then CAL_COMMAND="cal -s"
|
||||||
|
else CAL_COMMAND="cal"
|
||||||
|
fi
|
||||||
|
FIRST_TUESDAY_MONTH=$( $CAL_COMMAND $TODAY_MONTH $TODAY_YEAR |
|
||||||
|
awk '
|
||||||
|
NR == 1 { next }
|
||||||
|
NR == 2 { next }
|
||||||
|
NF <= 4 { next }
|
||||||
|
NF == 5 { print $1 ; exit }
|
||||||
|
NF == 6 { print $2 ; exit }
|
||||||
|
NF == 7 { print $3 ; exit }
|
||||||
|
' )
|
||||||
|
|
||||||
|
DATE=""$TODAY_YEAR""$TODAY_MONTH"0"$FIRST_TUESDAY_MONTH""
|
||||||
|
DIR="GeoLiteCity_$DATE"
|
||||||
|
FILE="GeoLiteCity_$DATE.zip"
|
||||||
|
ls *.csv &>/dev/null && rm *.csv
|
||||||
|
[ -f $FILE ] || wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/$FILE || exit 1
|
||||||
|
unzip -o $FILE || exit 1
|
||||||
|
mv $DIR/GeoLiteCity-Blocks.csv geoLiteCity_Blocks.csv
|
||||||
|
mv $DIR/GeoLiteCity-Location.csv geoLiteCity_Location.csv.temp
|
||||||
|
iconv -f ISO-8859-1 -t UTF-8 geoLiteCity_Location.csv.temp > geoLiteCity_Location.csv
|
||||||
|
mysqlimport -C -d --fields-terminated-by=, --fields-enclosed-by=\" --ignore-lines=2 --default-character-set=utf8 -L -i -h $DBHOST -u $DBUSER --password=$DBPASS $DBNAME geoLiteCity_Blocks.csv
|
||||||
|
mysqlimport -C -d --fields-terminated-by=, --fields-enclosed-by=\" --ignore-lines=2 --default-character-set=utf8 -L -i -h $DBHOST -u $DBUSER --password=$DBPASS $DBNAME geoLiteCity_Location.csv
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
ls *.csv &>/dev/null && rm *.csv
|
||||||
|
ls *.csv.temp &>/dev/null && rm *.csv.temp
|
||||||
|
rm $FILE
|
||||||
|
rmdir $DIR
|
17
scripts/GeoLiteCity/README
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
Included in this folder are two scripts to import data from the MaxMind (http://www.maxmind.com) from the GeoLiteCity database into your HLX db.
|
||||||
|
|
||||||
|
For Linux:
|
||||||
|
Edit the GeoLite_Import.sh file to insert your database settings in the top section and then execute.
|
||||||
|
|
||||||
|
For Windows:
|
||||||
|
Download the HLstatsX CE GeoLiteCity Importer from http://code.google.com/p/hlstatsxcommunity
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------
|
||||||
|
Alternative method by *XYZ*SaYnt:
|
||||||
|
--------------------------------------------------------------
|
||||||
|
* For Windows or Linux.
|
||||||
|
* Requires python.
|
||||||
|
* Generates INSERTs in case LOAD DATA command is disabled
|
||||||
|
|
||||||
|
Edit the geoip.py file to insert your database settings in the top section and then execute.
|
196
scripts/GeoLiteCity/geoip.py
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
|
||||||
|
import os,sys
|
||||||
|
|
||||||
|
# version 1.0 alpha contributed to hlstatsx community by *XYZ*SaYnt
|
||||||
|
|
||||||
|
DBHOST="localhost"
|
||||||
|
DBNAME="your_hlstats_db"
|
||||||
|
DBUSER="your_sql_username"
|
||||||
|
DBPASS="your_sql_password"
|
||||||
|
|
||||||
|
|
||||||
|
def system(cmd):
|
||||||
|
"""
|
||||||
|
executes a system call and returns the text as a string. Returns only the first line of output.
|
||||||
|
"""
|
||||||
|
print("EXECUTING: %s"%cmd)
|
||||||
|
f = os.popen(cmd)
|
||||||
|
output = f.readlines()
|
||||||
|
f.close()
|
||||||
|
if len(output) > 0:
|
||||||
|
return output[0].replace("\n","")
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_geodata():
|
||||||
|
"""
|
||||||
|
Obtains the geoLiteCity raw data, resulting in geoLiteCity_Location.csv and geoLiteCity_Blocks.csv
|
||||||
|
"""
|
||||||
|
# database is updated on 1st every month, so download the file from the 1st of current month
|
||||||
|
DAT = system("date +%Y%m01")
|
||||||
|
FIL = "GeoLiteCity_%s"%DAT
|
||||||
|
FILE = FIL + ".zip"
|
||||||
|
system("rm *.csv > /dev/null")
|
||||||
|
if not os.path.exists(FILE):
|
||||||
|
system("wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/" + FILE)
|
||||||
|
system("unzip -o " + FILE)
|
||||||
|
|
||||||
|
system("mv %s/GeoLiteCity-Blocks.csv geoLiteCity_Blocks.csv"%FIL)
|
||||||
|
system("mv %s/GeoLiteCity-Location.csv geoLiteCity_Location.csv.temp"%FIL)
|
||||||
|
system("rmdir " + FIL)
|
||||||
|
system("iconv -f ISO-8859-1 -t UTF-8 geoLiteCity_Location.csv.temp > geoLiteCity_Location.csv")
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def dump_sql(fname):
|
||||||
|
"""
|
||||||
|
Dump the new sql data into our database
|
||||||
|
"""
|
||||||
|
system("mysql -u %s -p%s -h %s %s < %s"%(DBUSER,DBPASS,DBHOST,DBNAME,fname))
|
||||||
|
|
||||||
|
|
||||||
|
def write_sql(fname):
|
||||||
|
"""
|
||||||
|
Write a file of sql commands so that our data can be imported into our database.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
fout = open(fname,"w")
|
||||||
|
except:
|
||||||
|
print("ERROR: unable to open "+fname)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
fout.write("""
|
||||||
|
DROP TABLE IF EXISTS `geoLiteCity_Blocks`;
|
||||||
|
DROP TABLE IF EXISTS `geolitecity_blocks`;
|
||||||
|
DROP TABLE IF EXISTS `geolitecity_location`;
|
||||||
|
DROP TABLE IF EXISTS `geoLiteCity_Location`;
|
||||||
|
|
||||||
|
CREATE TABLE `geoLiteCity_Blocks`
|
||||||
|
(`startIpNum` bigint(11) unsigned NOT NULL default '0',
|
||||||
|
`endIpNum` bigint(11) unsigned NOT NULL default '0',
|
||||||
|
`locId` bigint(11) unsigned NOT NULL default '0'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `geoLiteCity_Location` (
|
||||||
|
`locId` bigint(11) unsigned NOT NULL default '0',
|
||||||
|
`country` varchar(2) NOT NULL,
|
||||||
|
`region` varchar(50) default NULL,
|
||||||
|
`city` varchar(50) default NULL,
|
||||||
|
`postalCode` varchar(10) default NULL,
|
||||||
|
`latitude` decimal(14,4) default NULL,
|
||||||
|
`longitude` decimal(14,4) default NULL,
|
||||||
|
PRIMARY KEY (`locId`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
""")
|
||||||
|
|
||||||
|
# read in the raw data
|
||||||
|
f = open("geoLiteCity_Blocks.csv")
|
||||||
|
raw = f.readlines()
|
||||||
|
f.close()
|
||||||
|
del raw[0:2]
|
||||||
|
|
||||||
|
# chunk up the raw data
|
||||||
|
chunksize = 1000
|
||||||
|
gblocks = []
|
||||||
|
chunks = len(raw)/chunksize + 1
|
||||||
|
for i in xrange(0,chunks): gblocks.append(raw[i*chunksize:(i+1)*chunksize])
|
||||||
|
print("SQL: %d data items, %d chunks"%(len(raw),chunks))
|
||||||
|
del raw
|
||||||
|
|
||||||
|
for chunk in gblocks:
|
||||||
|
if chunk:
|
||||||
|
s = "insert into `geoLiteCity_Blocks`(`startIpNum`,`endIpNum`,`locId`) values"
|
||||||
|
for l in chunk:
|
||||||
|
vals = l.replace('"',"").replace('\n',"").split(',')
|
||||||
|
s += "(%s,%s,%s),"%(vals[0],vals[1],vals[2])
|
||||||
|
s = s[0:-1] # chop the last comma
|
||||||
|
fout.write(s + ";\n");
|
||||||
|
del gblocks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
f = open("geoLiteCity_Location.csv")
|
||||||
|
raw = f.readlines()
|
||||||
|
f.close()
|
||||||
|
del raw[0:2]
|
||||||
|
|
||||||
|
# chunk up the raw data
|
||||||
|
gblocks = []
|
||||||
|
chunks = len(raw)/chunksize + 1
|
||||||
|
for i in xrange(0,chunks): gblocks.append(raw[i*chunksize:(i+1)*chunksize])
|
||||||
|
print("SQL: %d data items, %d chunks"%(len(raw),chunks))
|
||||||
|
del raw
|
||||||
|
|
||||||
|
for chunk in gblocks:
|
||||||
|
if chunk:
|
||||||
|
s = "insert into `geoLiteCity_Location`(`locId`,`country`,`region`,`city`,`postalCode`,`latitude`,`longitude`) values"
|
||||||
|
for l in chunk:
|
||||||
|
vals = l.replace('"',"").replace('\n',"").split(',')
|
||||||
|
for i,v in enumerate(vals): vals[i] = v.replace("'","\\'")
|
||||||
|
s += "(%s,'%s','%s','%s','%s','%s','%s'),"%(vals[0],vals[1],vals[2],vals[3],vals[4],vals[5],vals[6])
|
||||||
|
s = s[0:-1] # chop the last comma
|
||||||
|
fout.write(s + ";\n");
|
||||||
|
del gblocks
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
sqlname = "geodata.sql"
|
||||||
|
print("DOWNLOADING GEO DATA....")
|
||||||
|
fetch_geodata()
|
||||||
|
print("WRITING DATABASE FILE....")
|
||||||
|
if write_sql(sqlname):
|
||||||
|
print("IMPORTING DATABASE FILE....")
|
||||||
|
dump_sql(sqlname)
|
||||||
|
else:
|
||||||
|
print("Fatal error; unable to finish.")
|
||||||
|
|
||||||
|
# clean up.
|
||||||
|
system("rm "+sqlname)
|
||||||
|
|
||||||
|
print("DONE.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
54
scripts/GeoLiteCity/install_binary.sh
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
# *** You should not need to configure anything in this script. ***
|
||||||
|
# URL is the location to download the GeoLiteCity.dat.gz file from.
|
||||||
|
URL=http://geolite.maxmind.com/download/geoip/database/
|
||||||
|
|
||||||
|
# File is the file to download from the server above, as well as what to store it as locally.
|
||||||
|
FILE=GeoLiteCity.dat.gz
|
||||||
|
|
||||||
|
# ***** NOTHING TO CONFIGURE BELOW HERE *****
|
||||||
|
|
||||||
|
# Change to directory where installer is
|
||||||
|
cd `dirname $0`
|
||||||
|
|
||||||
|
echo Downloading a new copy of GeoLiteCity, if needed.
|
||||||
|
wget -N -q $URL$FILE
|
||||||
|
echo Uncompressing database
|
||||||
|
gzip -dc < $FILE > $(basename $FILE .gz)
|
||||||
|
chmod 777 *.dat
|
||||||
|
echo Done
|
49
scripts/GeoLiteCity/ip2number.php
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
HLstatsX Community Edition is a continuation of
|
||||||
|
ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
http://ovrsized.neo-soft.org/
|
||||||
|
|
||||||
|
ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
http://www.hlstatsx.com/
|
||||||
|
Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
|
||||||
|
HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
http://sourceforge.net/projects/hlstats/
|
||||||
|
Copyright (C) 2001 Simon Garner
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
$ip = "62.77.230.10";
|
||||||
|
|
||||||
|
$ip = explode(".",$ip);
|
||||||
|
$number = ($ip[0]*16777216) + ($ip[1]*65536) + ($ip[2]*256) + $ip[3];
|
||||||
|
|
||||||
|
echo $number;
|
||||||
|
|
||||||
|
// example SQL to determine location
|
||||||
|
// SELECT geoLiteCity_Location.* FROM geoLiteCity_Blocks INNER JOIN geoLiteCity_Location ON (geoLiteCity_Blocks.locId=geoLiteCity_Location.locId) WHERE startIpNum<=$number AND endIpNum>=$number;
|
||||||
|
|
||||||
|
?>
|
31
scripts/HLStatsFTP/README
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
hlstats-ftp.pl README
|
||||||
|
|
||||||
|
Utility written by Woody.
|
||||||
|
|
||||||
|
This utility can be used to grab log files from a remote game server through FTP and then use the HLStatsX Daemon to enter
|
||||||
|
the data into the database. You must have perl installed to use this utility.
|
||||||
|
|
||||||
|
The script "remembers" the modification time (mtime) of the last log file that has been processed, and when run again,
|
||||||
|
only processes files with a later mtime.
|
||||||
|
|
||||||
|
*** NOTE ***
|
||||||
|
To use this utility you must copy it into the same folder your hlstats.pl (the daemon) is in.
|
||||||
|
You probably want to configure this as a cronjob as well.
|
||||||
|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
hlstats-ftp.pl --help
|
||||||
|
hlstats-ftp.pl --version
|
||||||
|
hlstats-ftp.pl --gs-ip=GSIP --gs-port=GSPORT [--ftp-ip=FTPIP] --ftp-usr=FTPUSR --ftp-pwd=FTPPWD --ftp-dir=FTPDIR [--quiet]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
--gs-ip=IP game server IP address
|
||||||
|
--gs-port=PORT game server port
|
||||||
|
--ftp-ip=IP ftp log server IP address, if different from
|
||||||
|
game server IP address (--gs-ip)
|
||||||
|
--ftp-usr=USERNAME ftp log server user name
|
||||||
|
--ftp-pwd=PASSWORD ftp log server password
|
||||||
|
--ftp-dir=DIRECTORY ftp log server directory
|
||||||
|
--quiet quiet operation, i.e. no output
|
235
scripts/HLStatsFTP/hlstats-ftp.pl
Normal file
|
@ -0,0 +1,235 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
################################################################################################################
|
||||||
|
# hlstats-ftp.pl
|
||||||
|
################################################################################################################
|
||||||
|
# Feed HLstatsX with log data via FTP
|
||||||
|
# (w) 2009 by Woody (http://woodystree.net)
|
||||||
|
################################################################################################################
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use Getopt::Long;
|
||||||
|
use Net::FTP;
|
||||||
|
|
||||||
|
use constant VERSION => "0.42";
|
||||||
|
use constant USAGE => <<EOT
|
||||||
|
|
||||||
|
Feed HLstatsX with log data via FTP.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
hlstats-ftp.pl --help
|
||||||
|
hlstats-ftp.pl --version
|
||||||
|
hlstats-ftp.pl --gs-ip=<IP> --gs-port=<PORT> [--ftp-ip=<IP>] --ftp-usr=<USR> --ftp-pwd=<PWD> --ftp-dir=<DIR> [--quiet]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
--gs-ip=IP game server IP address
|
||||||
|
--gs-port=PORT game server port
|
||||||
|
--ftp-ip=IP ftp log server IP address, if different from
|
||||||
|
game server IP address (--gs-ip)
|
||||||
|
--ftp-usr=USR ftp log server user name
|
||||||
|
--ftp-pwd=PWD ftp log server password
|
||||||
|
--ftp-dir=DIR ftp log server directory
|
||||||
|
--quiet quiet operation, i.e. no output
|
||||||
|
|
||||||
|
(w)2009 by Woody (http://woodystree.net)
|
||||||
|
|
||||||
|
|
||||||
|
EOT
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# define output subroutine
|
||||||
|
################################################################################################################
|
||||||
|
sub output {
|
||||||
|
if (!(our $opt_quiet)) {
|
||||||
|
my $text = shift;
|
||||||
|
print $text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# get & parse command line options
|
||||||
|
################################################################################################################
|
||||||
|
my $opt_help; my $opt_version; my $gs_ip; my $gs_port; my $ftp_ip; my $ftp_usr; my $ftp_pwd; my $ftp_dir; our $opt_quiet;
|
||||||
|
GetOptions(
|
||||||
|
"help" => \$opt_help,
|
||||||
|
"version" => \$opt_version,
|
||||||
|
"gs-ip=s" => \$gs_ip,
|
||||||
|
"gs-port=i" => \$gs_port,
|
||||||
|
"ftp-ip=s" => \$ftp_ip,
|
||||||
|
"ftp-usr=s" => \$ftp_usr,
|
||||||
|
"ftp-pwd=s" => \$ftp_pwd,
|
||||||
|
"ftp-dir=s" => \$ftp_dir,
|
||||||
|
"quiet" => \$opt_quiet
|
||||||
|
) or die(USAGE);
|
||||||
|
|
||||||
|
if ($opt_help) {
|
||||||
|
print USAGE;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($opt_version) {
|
||||||
|
print "\nhlstats-ftp.pl - Version " . VERSION . "\n";
|
||||||
|
print "Feed HLstatsX with log data via FTP.\n";
|
||||||
|
print "(w)2009 by Woody (http://woodystree.net)\n\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(defined $gs_ip) && !(defined $gs_port) && !(defined $ftp_usr) && !(defined $ftp_pwd) && !(defined $ftp_dir)) {
|
||||||
|
die(USAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(defined $ftp_ip)) {
|
||||||
|
$ftp_ip = $gs_ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# OK, lets go...
|
||||||
|
################################################################################################################
|
||||||
|
output("\nStarting hlstats-ftp.pl for IP $gs_ip, Port $gs_port...\n\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# create tmp directory
|
||||||
|
################################################################################################################
|
||||||
|
output(" - creating tmp directory... ");
|
||||||
|
|
||||||
|
my $tmp_dir = "hlstats-ftp-$gs_ip-$gs_port.tmp";
|
||||||
|
|
||||||
|
if (-e $tmp_dir) {
|
||||||
|
if (!(-w $tmp_dir)) {
|
||||||
|
die "Writing to tmp directory is not possible.";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mkdir($tmp_dir, 0775) || die "Make tmp directory \"$tmp_dir\" failed: $!";
|
||||||
|
}
|
||||||
|
|
||||||
|
output("OK.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# get last mtime info, if any
|
||||||
|
################################################################################################################
|
||||||
|
output(" - getting last mtime info... ");
|
||||||
|
|
||||||
|
my $last_mtime_filename = "hlstats-ftp-$gs_ip-$gs_port.last";
|
||||||
|
my $last_mtime = 0;
|
||||||
|
|
||||||
|
if (-e $last_mtime_filename) {
|
||||||
|
open(LASTMTIME, "<$last_mtime_filename") || die "Open file \"$last_mtime_filename\" failed: $!";
|
||||||
|
$last_mtime = <LASTMTIME>;
|
||||||
|
close(LASTMTIME);
|
||||||
|
output("OK: last mtime $last_mtime.\n");
|
||||||
|
} else {
|
||||||
|
output("none: using default 0.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# establish ftp connection
|
||||||
|
################################################################################################################
|
||||||
|
output(" - establishing FTP connection... ");
|
||||||
|
|
||||||
|
my $ftp = Net::FTP->new($ftp_ip) || die "FTP connect to \"$ftp_ip\" failed: $!";
|
||||||
|
$ftp->login($ftp_usr,$ftp_pwd) || die "FTP login for user \"$ftp_usr\" failed: $!";
|
||||||
|
$ftp->binary() || die "FTP binary mode failed: $!";
|
||||||
|
$ftp->cwd($ftp_dir) || die "FTP chdir to \"$ftp_dir\" failed: $!";
|
||||||
|
|
||||||
|
output("OK.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# get complete list of log files
|
||||||
|
################################################################################################################
|
||||||
|
output(" - getting complete list of log files... ");
|
||||||
|
|
||||||
|
my @files = $ftp->ls("-t *.log"); # get list of log files sorted by mtime
|
||||||
|
$#files = $#files - 1; # skip last file, i.e. the latest file, which is possibly still in use by the game server
|
||||||
|
|
||||||
|
output("OK.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# transfer log files to tmp directory, if todo
|
||||||
|
################################################################################################################
|
||||||
|
output(" + transfering log files, if todo:\n");
|
||||||
|
|
||||||
|
my @todo_files = ();
|
||||||
|
my @todo_mtimes = ();
|
||||||
|
|
||||||
|
foreach my $file (@files) {
|
||||||
|
output(" - \"$file\" ");
|
||||||
|
my $mtime = $ftp->mdtm($file) || die "FTP mtdm failed: $!";
|
||||||
|
output("(mtime $mtime): ");
|
||||||
|
if ($mtime > $last_mtime) {
|
||||||
|
output("transferring... ");
|
||||||
|
$ftp->get($file, "$tmp_dir/$file") || die "FTP get with \"$file\" failed: $!";
|
||||||
|
push(@todo_files, $file);
|
||||||
|
push(@todo_mtimes, $mtime);
|
||||||
|
output("OK.\n");
|
||||||
|
} else {
|
||||||
|
output("skipping.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# close ftp connection
|
||||||
|
################################################################################################################
|
||||||
|
output(" - closing FTP connection... ");
|
||||||
|
|
||||||
|
$ftp->close() || die "FTP close failed: $!";
|
||||||
|
|
||||||
|
output("OK.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# process log files in tmp directory
|
||||||
|
################################################################################################################
|
||||||
|
output(" + parsing log files:\n");
|
||||||
|
|
||||||
|
for (my $i = 0; $i <= $#todo_files; $i++) {
|
||||||
|
my $progress = "(" . ($i+1) . "/" . ($#todo_files+1) . ")";
|
||||||
|
output(" - \"" . $todo_files[$i] . "\" " . $progress . ": parsing... ");
|
||||||
|
system("./hlstats.pl --stdin --server-ip $gs_ip --server-port $gs_port < $tmp_dir/" . $todo_files[$i] . " > /dev/null");
|
||||||
|
output("updating last mtime...");
|
||||||
|
open(LASTMTIME, ">$last_mtime_filename") || die "Open file \"$last_mtime_filename\" failed: $!";
|
||||||
|
print LASTMTIME $todo_mtimes[$i];
|
||||||
|
close(LASTMTIME);
|
||||||
|
output("OK.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# delete tmp log files and directory
|
||||||
|
################################################################################################################
|
||||||
|
output(" - delete tmp log files and directory... ");
|
||||||
|
|
||||||
|
foreach my $file (<$tmp_dir/*>) {
|
||||||
|
unlink($file) || die "Delete tmp log files failed: $!";
|
||||||
|
}
|
||||||
|
rmdir($tmp_dir) || die "Delete tmp directory failed: $!";
|
||||||
|
|
||||||
|
output("OK.\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################################################
|
||||||
|
# the end
|
||||||
|
################################################################################################################
|
||||||
|
output("\nSo Long, and Thanks for all the Fish.\n\n");
|
455
scripts/HLstats.plib
Normal file
|
@ -0,0 +1,455 @@
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
|
||||||
|
# HLstatsX CE release version number
|
||||||
|
|
||||||
|
$g_version = "<Unable to Detect>";
|
||||||
|
my %db_stmt_cache = ();
|
||||||
|
|
||||||
|
%g_eventTables = (
|
||||||
|
"TeamBonuses",
|
||||||
|
["playerId", "actionId", "bonus"],
|
||||||
|
"ChangeRole",
|
||||||
|
["playerId", "role"],
|
||||||
|
"ChangeName",
|
||||||
|
["playerId", "oldName", "newName"],
|
||||||
|
"ChangeTeam",
|
||||||
|
["playerId", "team"],
|
||||||
|
"Connects",
|
||||||
|
["playerId", "ipAddress", "hostname", "hostgroup"],
|
||||||
|
"Disconnects",
|
||||||
|
["playerId"],
|
||||||
|
"Entries",
|
||||||
|
["playerId"],
|
||||||
|
"Frags",
|
||||||
|
["killerId", "victimId", "weapon", "headshot", "killerRole", "victimRole", "pos_x","pos_y","pos_z", "pos_victim_x","pos_victim_y","pos_victim_z"],
|
||||||
|
"PlayerActions",
|
||||||
|
["playerId", "actionId", "bonus", "pos_x","pos_y","pos_z"],
|
||||||
|
"PlayerPlayerActions",
|
||||||
|
["playerId", "victimId", "actionId", "bonus", "pos_x","pos_y","pos_z", "pos_victim_x","pos_victim_y","pos_victim_z"],
|
||||||
|
"Suicides",
|
||||||
|
["playerId", "weapon", "pos_x","pos_y","pos_z"],
|
||||||
|
"Teamkills",
|
||||||
|
["killerId", "victimId", "weapon", "pos_x","pos_y","pos_z", "pos_victim_x","pos_victim_y","pos_victim_z"],
|
||||||
|
"Rcon",
|
||||||
|
["type", "remoteIp", "password", "command"],
|
||||||
|
"Admin",
|
||||||
|
["type", "message", "playerName"],
|
||||||
|
"Statsme",
|
||||||
|
["playerId", "weapon", "shots", "hits", "headshots", "damage", "kills", "deaths"],
|
||||||
|
"Statsme2",
|
||||||
|
["playerId", "weapon", "head", "chest", "stomach", "leftarm", "rightarm", "leftleg", "rightleg"],
|
||||||
|
"StatsmeLatency",
|
||||||
|
["playerId", "ping"],
|
||||||
|
"StatsmeTime",
|
||||||
|
["playerId", "time"],
|
||||||
|
"Latency",
|
||||||
|
["playerId", "ping"],
|
||||||
|
"Chat",
|
||||||
|
["playerId", "message_mode", "message"]
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Common Functions
|
||||||
|
##
|
||||||
|
|
||||||
|
sub number_format {
|
||||||
|
local $_ = shift;
|
||||||
|
1 while s/^(-?\d+)(\d{3})/$1,$2/;
|
||||||
|
return $_;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub date_format {
|
||||||
|
my $timestamp = shift;
|
||||||
|
return sprintf('%dd %02d:%02d:%02dh',
|
||||||
|
$timestamp / 86400,
|
||||||
|
$timestamp / 3600 % 24,
|
||||||
|
$timestamp / 60 % 60,
|
||||||
|
$timestamp % 60
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# void error (string errormsg)
|
||||||
|
#
|
||||||
|
# Dies, and optionally mails error messages to $g_mailto.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub error
|
||||||
|
{
|
||||||
|
my $errormsg = $_[0];
|
||||||
|
|
||||||
|
if ($g_mailto && $g_mailpath)
|
||||||
|
{
|
||||||
|
system("echo \"$errormsg\" | $g_mailpath -s \"HLstatsX:CE crashed `date`\" $g_mailto");
|
||||||
|
}
|
||||||
|
|
||||||
|
die("$errormsg\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# string quoteSQL (string varQuote)
|
||||||
|
#
|
||||||
|
# Escapes all quote characters in a variable, making it suitable for use in an
|
||||||
|
# SQL query. Returns the escaped version.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub quoteSQL
|
||||||
|
{
|
||||||
|
my $varQuote = $_[0];
|
||||||
|
|
||||||
|
$varQuote =~ s/\\/\\\\/g; # replace \ with \\
|
||||||
|
$varQuote =~ s/'/\\'/g; # replace ' with \'
|
||||||
|
|
||||||
|
return $varQuote;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# void doConnect
|
||||||
|
#
|
||||||
|
# Connects to the HLstatsX database
|
||||||
|
#
|
||||||
|
|
||||||
|
sub doConnect
|
||||||
|
{
|
||||||
|
$db_conn = DBI->connect(
|
||||||
|
"DBI:mysql:$db_name:$db_host",
|
||||||
|
$db_user, $db_pass, { mysql_enable_utf8 => 1 }
|
||||||
|
);
|
||||||
|
while(!$db_conn) {
|
||||||
|
&printEvent("MYSQL", "\nCan't connect to MySQL database '$db_name' on '$db_host'\n" .
|
||||||
|
"Server error: $DBI::errstr\n");
|
||||||
|
sleep(5);
|
||||||
|
$db_conn = DBI->connect(
|
||||||
|
"DBI:mysql:$db_name:$db_host",
|
||||||
|
$db_user, $db_pass, { mysql_enable_utf8 => 1 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$db_conn->do("SET NAMES 'utf8'");
|
||||||
|
&printEvent("MYSQL", "Connecting to MySQL database '$db_name' on '$db_host' as user '$db_user' ... connected ok", 1);
|
||||||
|
%db_stmt_cache = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# result doQuery (string query)
|
||||||
|
#
|
||||||
|
# Executes the SQL query 'query' and returns the result identifier.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub doQuery
|
||||||
|
{
|
||||||
|
my ($query, $callref) = @_;
|
||||||
|
if(!$db_conn->ping()) {
|
||||||
|
&printEvent("HLSTATSX", "Lost database connection. Trying to reconnect...", 1);
|
||||||
|
&doConnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
my $result = $db_conn->prepare($query) or die("Unable to prepare query:\n$query\n$DBI::errstr\n$callref");
|
||||||
|
$result->execute or die("Unable to execute query:\n$query\n$DBI::errstr\n$callref");
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub execNonQuery
|
||||||
|
{
|
||||||
|
my ($query) = @_;
|
||||||
|
if(!$db_conn->ping()) {
|
||||||
|
&printEvent("HLSTATSX", "Lost database connection. Trying to reconnect...", 1);
|
||||||
|
&doConnect();
|
||||||
|
}
|
||||||
|
#&printEvent("DEBUG","execNonQuery:\n".$query);
|
||||||
|
$db_conn->do($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub execCached {
|
||||||
|
my ($query_id,$query, @bind_args) = @_;
|
||||||
|
|
||||||
|
if(!$db_conn->ping()) {
|
||||||
|
&printEvent("HLSTATSX", "Lost database connection. Trying to reconnect...", 1);
|
||||||
|
&doConnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$db_stmt_cache{$query_id}) {
|
||||||
|
$db_stmt_cache{$query_id} = $db_conn->prepare($query) or die("Unable to prepare query ($query_id):\n$query\n$DBI::errstr");
|
||||||
|
#&printEvent("HLSTATSX", "Prepared a statement ($query_id) for the first time.", 1);
|
||||||
|
}
|
||||||
|
$db_stmt_cache{$query_id}->execute(@bind_args) or die ("Unable to execute query ($query_id):\n$query\n$DBI::errstr");
|
||||||
|
return $db_stmt_cache{$query_id};
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# string resolveIp (string ip, boolean quiet)
|
||||||
|
#
|
||||||
|
# Do a DNS reverse-lookup on an IP address and return the hostname, or empty
|
||||||
|
# string on error.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub resolveIp
|
||||||
|
{
|
||||||
|
my ($ip, $quiet) = @_;
|
||||||
|
my ($host) = "";
|
||||||
|
|
||||||
|
unless ($g_dns_resolveip)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
eval
|
||||||
|
{
|
||||||
|
$SIG{ALRM} = sub { die "DNS Timeout\n" };
|
||||||
|
alarm $g_dns_timeout; # timeout after $g_dns_timeout sec
|
||||||
|
$host = gethostbyaddr(inet_aton($ip), AF_INET);
|
||||||
|
alarm 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($@)
|
||||||
|
{
|
||||||
|
my $error = $@;
|
||||||
|
chomp($error);
|
||||||
|
printEvent("DNS", "Resolving hostname (timeout $g_dns_timeout sec) for IP \"$ip\" - $error ", 1);
|
||||||
|
$host = ""; # some error occurred
|
||||||
|
}
|
||||||
|
elsif (!defined($host))
|
||||||
|
{
|
||||||
|
printEvent("DNS", "Resolving hostname (timeout $g_dns_timeout sec) for IP \"$ip\" - No Host ", 1);
|
||||||
|
$host = ""; # ip did not resolve to any host
|
||||||
|
} else {
|
||||||
|
$host = lc($host); # lowercase
|
||||||
|
printEvent("DNS", "Resolving hostname (timeout $g_dns_timeout sec) for IP \"$ip\" - $host ", 1);
|
||||||
|
}
|
||||||
|
chomp($host);
|
||||||
|
return $host;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# object queryHostGroups ()
|
||||||
|
#
|
||||||
|
# Returns result identifier.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub queryHostGroups
|
||||||
|
{
|
||||||
|
return &doQuery("
|
||||||
|
SELECT
|
||||||
|
pattern,
|
||||||
|
name,
|
||||||
|
LENGTH(pattern) AS patternlength
|
||||||
|
FROM
|
||||||
|
hlstats_HostGroups
|
||||||
|
ORDER BY
|
||||||
|
patternlength DESC,
|
||||||
|
pattern ASC
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# string getHostGroup (string hostname[, object result])
|
||||||
|
#
|
||||||
|
# Return host group name if any match, or last 2 or 3 parts of hostname.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub getHostGroup
|
||||||
|
{
|
||||||
|
my ($hostname, $result) = @_;
|
||||||
|
my $hostgroup = "";
|
||||||
|
|
||||||
|
# User can define special named hostgroups in hlstats_HostGroups, i.e.
|
||||||
|
# '.adsl.someisp.net' => 'SomeISP ADSL'
|
||||||
|
|
||||||
|
$result = &queryHostGroups() unless ($result);
|
||||||
|
$result->execute();
|
||||||
|
|
||||||
|
while (my($pattern, $name) = $result->fetchrow_array())
|
||||||
|
{
|
||||||
|
$pattern = quotemeta($pattern);
|
||||||
|
$pattern =~ s/\\\*/[^.]*/g; # allow basic shell-style globbing in pattern
|
||||||
|
if ($hostname =~ /$pattern$/)
|
||||||
|
{
|
||||||
|
$hostgroup = $name;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$result->finish;
|
||||||
|
|
||||||
|
if (!$hostgroup)
|
||||||
|
{
|
||||||
|
#
|
||||||
|
# Group by last 2 or 3 parts of hostname, i.e. 'max1.xyz.someisp.net' as
|
||||||
|
# 'someisp.net', and 'max1.xyz.someisp.net.nz' as 'someisp.net.nz'.
|
||||||
|
# Unfortunately some countries do not have categorical SLDs, so this
|
||||||
|
# becomes more complicated. The dom_nosld array below contains a list of
|
||||||
|
# known country codes that do not use categorical second level domains.
|
||||||
|
# If a country uses SLDs and is not listed below, then it will be
|
||||||
|
# incorrectly grouped, i.e. 'max1.xyz.someisp.yz' will become
|
||||||
|
# 'xyz.someisp.yz', instead of just 'someisp.yz'.
|
||||||
|
#
|
||||||
|
# Please mail sgarner@hlstats.org with any additions.
|
||||||
|
#
|
||||||
|
|
||||||
|
my @dom_nosld = (
|
||||||
|
"ca", # Canada
|
||||||
|
"ch", # Switzerland
|
||||||
|
"be", # Belgium
|
||||||
|
"de", # Germany
|
||||||
|
"ee", # Estonia
|
||||||
|
"es", # Spain
|
||||||
|
"fi", # Finland
|
||||||
|
"fr", # France
|
||||||
|
"ie", # Ireland
|
||||||
|
"nl", # Netherlands
|
||||||
|
"no", # Norway
|
||||||
|
"ru", # Russia
|
||||||
|
"se", # Sweden
|
||||||
|
);
|
||||||
|
|
||||||
|
my $dom_nosld = join("|", @dom_nosld);
|
||||||
|
|
||||||
|
if ($hostname =~ /([\w-]+\.(?:$dom_nosld|\w\w\w))$/)
|
||||||
|
{
|
||||||
|
$hostgroup = $1;
|
||||||
|
}
|
||||||
|
elsif ($hostname =~ /([\w-]+\.[\w-]+\.\w\w)$/)
|
||||||
|
{
|
||||||
|
$hostgroup = $1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$hostgroup = $hostname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $hostgroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# void doConf (object conf, hash directives)
|
||||||
|
#
|
||||||
|
# Walk through configuration directives, setting values of global variables.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub doConf
|
||||||
|
{
|
||||||
|
my ($conf, %directives) = @_;
|
||||||
|
|
||||||
|
while (($directive, $variable) = each(%directives))
|
||||||
|
{
|
||||||
|
if ($directive eq "Servers") {
|
||||||
|
%$variable = $conf->get($directive);
|
||||||
|
} else {
|
||||||
|
$$variable = $conf->get($directive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# void setOptionsConf (hash optionsconf)
|
||||||
|
#
|
||||||
|
# Walk through configuration directives, setting values of global variables.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub setOptionsConf
|
||||||
|
{
|
||||||
|
my (%optionsconf) = @_;
|
||||||
|
|
||||||
|
while (($thekey, $theval) = each(%optionsconf))
|
||||||
|
{
|
||||||
|
if($theval)
|
||||||
|
{
|
||||||
|
$$thekey = $theval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# string abbreviate (string thestring[, int maxlength)
|
||||||
|
#
|
||||||
|
# Returns thestring abbreviated to maxlength-3 characters plus "...", unless
|
||||||
|
# thestring is shorter than maxlength.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub abbreviate
|
||||||
|
{
|
||||||
|
my ($thestring, $maxlength) = @_;
|
||||||
|
|
||||||
|
$maxlength = 12 unless ($maxlength);
|
||||||
|
|
||||||
|
if (length($thestring) > $maxlength)
|
||||||
|
{
|
||||||
|
$thestring = substr($thestring, 0, $maxlength - 3);
|
||||||
|
return "$thestring...";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $thestring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# void printEvent (int code, string description)
|
||||||
|
#
|
||||||
|
# Logs event information to stdout.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub printEvent
|
||||||
|
{
|
||||||
|
my ($code, $description, $update_timestamp, $force_output) = @_;
|
||||||
|
if ( (($g_debug > 0) && ($g_stdin == 0))|| (($g_stdin == 1) && ($force_output == 1)) ) {
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time());
|
||||||
|
my $timestamp = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
|
||||||
|
if ($update_timestamp == 0) {
|
||||||
|
$timestamp = $ev_timestamp;
|
||||||
|
}
|
||||||
|
if (is_number($code)) {
|
||||||
|
printf("%s: %21s - E%03d: %s\n", $timestamp, $s_addr, $code, $description);
|
||||||
|
} else {
|
||||||
|
printf("%s: %21s - %s: %s\n", $timestamp, $s_addr, $code, $description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
3096
scripts/HLstats_EventHandlers.plib
Normal file
104
scripts/HLstats_Game.pm
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
package HLstats_Game;
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
#
|
||||||
|
# Constructor
|
||||||
|
#
|
||||||
|
|
||||||
|
sub new
|
||||||
|
{
|
||||||
|
my $class_name = shift;
|
||||||
|
my $game = shift;
|
||||||
|
|
||||||
|
my $self = {};
|
||||||
|
bless($self, $class_name);
|
||||||
|
|
||||||
|
# Initialise Properties
|
||||||
|
$self->{game} = $game;
|
||||||
|
$self->{weapons} = ();
|
||||||
|
$self->{actions} = ();
|
||||||
|
|
||||||
|
# Set Property Values
|
||||||
|
|
||||||
|
die("HLstats_Game->new(): must specify game's game code\n") if ($game eq "");
|
||||||
|
#&::printEvent("DEBUG","game is $game");
|
||||||
|
my $weaponlist = &::doQuery("SELECT code, name, modifier FROM hlstats_Weapons WHERE game='".&::quoteSQL($game)."'");
|
||||||
|
while ( my($code,$name,$modifier) = $weaponlist->fetchrow_array) {
|
||||||
|
$self->{weapons}{$code}{name} = $name;
|
||||||
|
$self->{weapons}{$code}{modifier} = $modifier;
|
||||||
|
#&::printEvent("DEBUG","Weapon: name is \"$name\"; modifier is $modifier");
|
||||||
|
}
|
||||||
|
|
||||||
|
my $actionlist = &::doQuery("SELECT id, code, reward_player, reward_team, team, description, for_PlayerActions, for_PlayerPlayerActions, for_TeamActions, for_WorldActions FROM hlstats_Actions WHERE game='".&::quoteSQL($game)."'");
|
||||||
|
while ( my($id, $code, $reward_player,$reward_team,$team, $descr, $paction, $ppaction, $taction, $waction) = $actionlist->fetchrow_array) {
|
||||||
|
$self->{actions}{$code}{id} = $id;
|
||||||
|
$self->{actions}{$code}{descr} = $descr;
|
||||||
|
$self->{actions}{$code}{reward_player} = $reward_player;
|
||||||
|
$self->{actions}{$code}{reward_team} = $reward_team;
|
||||||
|
$self->{actions}{$code}{team} = $team;
|
||||||
|
$self->{actions}{$code}{paction} = $paction;
|
||||||
|
$self->{actions}{$code}{ppaction} = $ppaction;
|
||||||
|
$self->{actions}{$code}{taction} = $taction;
|
||||||
|
$self->{actions}{$code}{waction} = $waction;
|
||||||
|
}
|
||||||
|
$actionlist->finish;
|
||||||
|
|
||||||
|
&::printNotice("Created new game object " . $game);
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getTotalPlayers
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
|
||||||
|
my $query = "
|
||||||
|
SELECT
|
||||||
|
COUNT(*)
|
||||||
|
FROM
|
||||||
|
hlstats_Players
|
||||||
|
WHERE
|
||||||
|
game=?
|
||||||
|
AND hideranking = 0
|
||||||
|
AND kills >= 1
|
||||||
|
";
|
||||||
|
my $resultTotalPlayers = &::execCached("get_game_total_players", $query, &::quoteSQL($self->{game}));
|
||||||
|
my ($totalplayers) = $resultTotalPlayers->fetchrow_array;
|
||||||
|
$resultTotalPlayers->finish;
|
||||||
|
|
||||||
|
return $totalplayers;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
56
scripts/HLstats_GameConstants.plib
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
use constant {
|
||||||
|
UNKNOWN => -1,
|
||||||
|
CSS => 0,
|
||||||
|
HL2MP => 1,
|
||||||
|
TF => 2,
|
||||||
|
DODS => 3,
|
||||||
|
INSMOD => 4,
|
||||||
|
FF => 5,
|
||||||
|
HIDDEN => 6,
|
||||||
|
ZPS => 7,
|
||||||
|
AOC => 8,
|
||||||
|
CSTRIKE => 9,
|
||||||
|
TFC => 10,
|
||||||
|
DOD => 11,
|
||||||
|
NS => 12,
|
||||||
|
L4D => 13,
|
||||||
|
FOF => 14,
|
||||||
|
GES => 15,
|
||||||
|
BG2 => 16,
|
||||||
|
SGTLS => 17,
|
||||||
|
DYSTOPIA => 18,
|
||||||
|
NTS => 19,
|
||||||
|
PVKII => 20,
|
||||||
|
CSP => 21,
|
||||||
|
VALVE => 22,
|
||||||
|
NUCLEARDAWN => 23,
|
||||||
|
DDD => 24,
|
||||||
|
};
|
||||||
|
|
||||||
|
%gamecode_to_game = (
|
||||||
|
'css' => CSS(),
|
||||||
|
'hl2mp' => HL2MP(),
|
||||||
|
'tf' => TF(),
|
||||||
|
'dods' => DODS(),
|
||||||
|
'insmod' => INSMOD(),
|
||||||
|
'ff' => FF(),
|
||||||
|
'hidden' => HIDDEN(),
|
||||||
|
'zps' => ZPS(),
|
||||||
|
'aoc' => AOC(),
|
||||||
|
'cstrike' => CSTRIKE(),
|
||||||
|
'tfc' => TFC(),
|
||||||
|
'dod' => DOD(),
|
||||||
|
'ns' => NS(),
|
||||||
|
'l4d' => L4D(),
|
||||||
|
'fof' => FOF(),
|
||||||
|
'ges' => GES(),
|
||||||
|
'bg2' => BG2(),
|
||||||
|
'sgtls' => SGTLS(),
|
||||||
|
'dystopia' => DYSTOPIA(),
|
||||||
|
'nts' => NTS(),
|
||||||
|
'pvkii' => PVKII(),
|
||||||
|
'csp' => CSP(),
|
||||||
|
'valve' => VALVE(),
|
||||||
|
'nucleardawn' => NUCLEARDAWN(),
|
||||||
|
'dinodday' => DDD()
|
||||||
|
);
|
1124
scripts/HLstats_Player.pm
Normal file
1414
scripts/HLstats_Server.pm
Normal file
55
scripts/ImportBans/README
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
HLStatsX:CE Import Ban Options
|
||||||
|
----------------------
|
||||||
|
Description:
|
||||||
|
HLStatsX:CE has two different scripts to use to import bans from your banning system:
|
||||||
|
|
||||||
|
1) ImportBans
|
||||||
|
ImportBans.pl is a perl script and is the original importing script.
|
||||||
|
It only imports bans and does not unban a player if they're unbanned from your ban system.
|
||||||
|
This script supports SourceBans, AMXBans, BeetleMod, and GlobalBan.
|
||||||
|
You must have perl installed to use this script.
|
||||||
|
|
||||||
|
2) hlstatsxbans
|
||||||
|
Hlstatsxbans is written by Peace-Maker and is written in PHP.
|
||||||
|
This script will ban AND UNBAN players as they are banned from your banning system.
|
||||||
|
Forum URL: http://forums.interwavestudios.com/topic/167-import-mysql-bans-to-hlxce-bancheater-page/
|
||||||
|
This script suports SourceBans, AMXBans, BeetleMod, and GlobalBan.
|
||||||
|
You must have PHP installed to use this script.
|
||||||
|
|
||||||
|
Configuration:
|
||||||
|
Select which ban system you want to use, either ImportBans or HLStatsXBans. You must then edit the corresponding file.
|
||||||
|
|
||||||
|
*run_importbans
|
||||||
|
** Open run_importbans in a text editor
|
||||||
|
** Configure "BANSYSTEM" for which script you would like to use.
|
||||||
|
|
||||||
|
*ImportBans
|
||||||
|
** Open ImportBans.pl in a text editor.
|
||||||
|
** Fill in the HLX DB INFO section (should be same as that found in hlstats.conf in the Perl directory)
|
||||||
|
** Fill in at least one of the other databases (Sourcebans, AMXBans, BeetlesMod) that you want to import from.
|
||||||
|
|
||||||
|
NOTE: You can use any of these databases simultaneously -- fill in the ones you want
|
||||||
|
to pull from and those databases will be queried.
|
||||||
|
|
||||||
|
*HLStatsXBans
|
||||||
|
** Open HLStatsXBans.cfg in a text editor.
|
||||||
|
** Fill in the database info for HLX.
|
||||||
|
** Fill in at least one of the other databases that you want to import from.
|
||||||
|
|
||||||
|
Running:
|
||||||
|
You should run the script manually one time to make sure everything is working.
|
||||||
|
To run ImportBans, run:
|
||||||
|
|
||||||
|
./importbans.pl
|
||||||
|
|
||||||
|
To run HLStatsXBans, run:
|
||||||
|
|
||||||
|
php hlstatsxbans.php
|
||||||
|
|
||||||
|
If everything works, you can either schedule the exact same command you just executed to run at a configured interval or time,
|
||||||
|
or use the run_importbans wrapper to get logging (great for console use).
|
||||||
|
To use run_importbans, make sure you have edited the file for which script you want to use, and then simply execute:
|
||||||
|
|
||||||
|
./run_importbans.
|
||||||
|
|
||||||
|
Note: you will not get any output from this script. Everything is written into your logs/ directory.
|
105
scripts/ImportBans/hlstatsxban.cfg
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
<?php
|
||||||
|
/***************
|
||||||
|
** Deactivate HLstatsX ranking for banned players
|
||||||
|
** and reactivate them if unbanned
|
||||||
|
** Supports SourceBans, AMXBans, Beetlesmod, Globalban, MySQL Banning*
|
||||||
|
** by Jannik 'Peace-Maker' Hartung
|
||||||
|
** http://www.sourcebans.net/, http://www.wcfan.de/
|
||||||
|
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** Version 1.3: Added MySQL Banning support
|
||||||
|
** Version 1.2: Added more error handling
|
||||||
|
** Version 1.1: Fixed banned players not marked as banned, if a previous ban was unbanned
|
||||||
|
** Version 1.0: Initial Release
|
||||||
|
|
||||||
|
|
||||||
|
** YOU MUST ADJUST THIS FILE TO MEET YOUR NEEDS!
|
||||||
|
** Please fill in AT LEAST one bans database AND
|
||||||
|
** the HLStatsX Database section! Don't forget the names
|
||||||
|
** of the HLStatsX Databases near the end of this file!
|
||||||
|
**************/
|
||||||
|
|
||||||
|
//** SOURCEBANS MYSQL INFO ----------------------------
|
||||||
|
// http://www.sourcebans.net/
|
||||||
|
define('SB_HOST', 'localhost'); // MySQL host
|
||||||
|
define('SB_PORT', 3306); // MySQL port (Default 3306)
|
||||||
|
define('SB_USER', ''); // MySQL user
|
||||||
|
define('SB_PASS', ''); // MySQL password
|
||||||
|
define('SB_NAME', ''); // MySQL database name
|
||||||
|
define('SB_PREFIX', 'sb'); // MySQL table prefix
|
||||||
|
//** END SOURCEBANS MYSQL INFO ------------------------
|
||||||
|
|
||||||
|
//** AMXBANS MYSQL INFO -------------------------------
|
||||||
|
// http://www.amxbans.net/
|
||||||
|
define('AMX_HOST', 'localhost'); // MySQL host
|
||||||
|
define('AMX_PORT', 3306); // MySQL port (Default 3306)
|
||||||
|
define('AMX_USER', ''); // MySQL user
|
||||||
|
define('AMX_PASS', ''); // MySQL password
|
||||||
|
define('AMX_NAME', ''); // MySQL database name
|
||||||
|
define('AMX_PREFIX', 'amx'); // MySQL table prefix
|
||||||
|
//** END AMXBANS MYSQL INFO ---------------------------
|
||||||
|
|
||||||
|
//** BEETLESMOD MYSQL INFO ----------------------------
|
||||||
|
// http://www.beetlesmod.com/
|
||||||
|
define('BM_HOST', 'localhost'); // MySQL host
|
||||||
|
define('BM_PORT', 3306); // MySQL port (Default 3306)
|
||||||
|
define('BM_USER', ''); // MySQL user
|
||||||
|
define('BM_PASS', ''); // MySQL password
|
||||||
|
define('BM_NAME', ''); // MySQL database name
|
||||||
|
define('BM_PREFIX', 'bm'); // MySQL table prefix
|
||||||
|
//** END BEETLESMOD MYSQL INFO ------------------------
|
||||||
|
|
||||||
|
//** GLOBALBAN MYSQL INFO -----------------------------
|
||||||
|
// http://addons.eventscripts.com/addons/view/GlobalBan
|
||||||
|
// http://forums.eventscripts.com/viewtopic.php?t=14384
|
||||||
|
define('GB_HOST', 'localhost'); // MySQL host
|
||||||
|
define('GB_PORT', 3306); // MySQL port (Default 3306)
|
||||||
|
define('GB_USER', ''); // MySQL user
|
||||||
|
define('GB_PASS', ''); // MySQL password
|
||||||
|
define('GB_NAME', 'global_ban'); // MySQL database name
|
||||||
|
define('GB_PREFIX', 'gban'); // MySQL table prefix
|
||||||
|
//** END GLOBALBAN MYSQL INFO -------------------------
|
||||||
|
|
||||||
|
//** MySQL Banning - MYSQL INFO -----------------------
|
||||||
|
// http://forums.alliedmods.net/showthread.php?t=65822
|
||||||
|
define('MB_HOST', 'localhost'); // MySQL host
|
||||||
|
define('MB_PORT', 3306); // MySQL port (Default 3306)
|
||||||
|
define('MB_USER', ''); // MySQL user
|
||||||
|
define('MB_PASS', ''); // MySQL password
|
||||||
|
define('MB_NAME', ''); // MySQL database name
|
||||||
|
define('MB_PREFIX', 'mysql'); // MySQL table prefix
|
||||||
|
//** END MySQL Banning - MYSQL INFO -------------------
|
||||||
|
|
||||||
|
//** HLSTATSX MYSQL INFO ------------------------------
|
||||||
|
// http://www.hlxcommunity.com/
|
||||||
|
define('HLX_HOST', 'localhost'); // MySQL host
|
||||||
|
define('HLX_PORT', 3306); // MySQL port (Default 3306)
|
||||||
|
define('HLX_USER', ''); // MySQL user
|
||||||
|
define('HLX_PASS', ''); // MySQL password
|
||||||
|
define('HLX_PREFIX', 'hlstats'); // MySQL table prefix
|
||||||
|
|
||||||
|
/*************************************************
|
||||||
|
/* We're using different databases for each of our server to isolate each ranking
|
||||||
|
/* Type the HLstatsX database name here like
|
||||||
|
/* $hlxdbs[] = "databasename";
|
||||||
|
/* It's fine to just type one database.
|
||||||
|
**************************************************/
|
||||||
|
$hlxdbs = array();
|
||||||
|
$hlxdbs[] = "hlstatsx";
|
||||||
|
//** END HLSTATSX MYSQL INFO --------------------------
|
||||||
|
|
||||||
|
?>
|
362
scripts/ImportBans/hlstatsxban.php
Normal file
|
@ -0,0 +1,362 @@
|
||||||
|
<?php
|
||||||
|
/***************
|
||||||
|
** Deactivate HLstatsX ranking for banned players
|
||||||
|
** and reactivate them if unbanned
|
||||||
|
** Supports SourceBans, AMXBans, Beetlesmod, Globalban, MySQL Banning*
|
||||||
|
** by Jannik 'Peace-Maker' Hartung
|
||||||
|
** http://www.sourcebans.net/, http://www.wcfan.de/
|
||||||
|
|
||||||
|
** 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.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** Version 1.3: Added MySQL Banning support
|
||||||
|
** Version 1.2: Added more error handling
|
||||||
|
** Version 1.1: Fixed banned players not marked as banned, if a previous ban was unbanned
|
||||||
|
** Version 1.0: Initial Release
|
||||||
|
***************/
|
||||||
|
|
||||||
|
/*****************************
|
||||||
|
/***MAKE YOUR CONFIGURATION***
|
||||||
|
/********SETTINGS IN**********
|
||||||
|
/******hlstatsxban.cfg********
|
||||||
|
/***** DON'T EDIT BELOW ******
|
||||||
|
/*****************************/
|
||||||
|
|
||||||
|
require("hlstatsxban.cfg");
|
||||||
|
|
||||||
|
if (!extension_loaded('mysqli')) {
|
||||||
|
die("This script requires the MySQLi extension to be enabled. Consult your administrator, or edit your php.ini file, to enable this extension.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$usesb = (SB_HOST == ""||SB_PORT == ""||SB_USER == ""||SB_PASS == ""||SB_NAME == ""||SB_PREFIX == ""?false:true);
|
||||||
|
$useamx = (AMX_HOST == ""||AMX_PORT == ""||AMX_USER == ""||AMX_PASS == ""||AMX_NAME == ""||AMX_PREFIX == ""?false:true);
|
||||||
|
$usebm = (BM_HOST == ""||BM_PORT == ""||BM_USER == ""||BM_PASS == ""||BM_NAME == ""||BM_PREFIX == ""?false:true);
|
||||||
|
$usegb = (GB_HOST == ""||GB_PORT == ""||GB_USER == ""||GB_PASS == ""||GB_NAME == ""||GB_PREFIX == ""?false:true);
|
||||||
|
$usemb = (MB_HOST == ""||MB_PORT == ""||MB_USER == ""||MB_PASS == ""||MB_NAME == ""||MB_PREFIX == ""?false:true);
|
||||||
|
$hlxready = (HLX_HOST == ""||HLX_PORT == ""||HLX_USER == ""||HLX_PASS == ""||empty($hlxdbs)||HLX_PREFIX == ""?false:true);
|
||||||
|
|
||||||
|
if (!$hlxready || (!$usesb && !$useamx && !$usebm && !$usegb && !$usemb))
|
||||||
|
die('[-] Please type your database information for HLstatsX and at least for one other ban database.');
|
||||||
|
|
||||||
|
$bannedplayers = array();
|
||||||
|
$unbannedplayers = array();
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// SourceBans Part
|
||||||
|
//------------------------------
|
||||||
|
if ($usesb)
|
||||||
|
{
|
||||||
|
// Connect to the SourceBans database.
|
||||||
|
$con = new mysqli(SB_HOST, SB_USER, SB_PASS, SB_NAME, SB_PORT);
|
||||||
|
if (mysqli_connect_error()) die('[-] Can\'t connect to SourceBans Database (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
|
||||||
|
|
||||||
|
print("[+] Successfully connected to SourceBans database. Retrieving bans now.\n");
|
||||||
|
|
||||||
|
// Get permanent banned players
|
||||||
|
$bcnt = 0;
|
||||||
|
if ($bans = $con->query("SELECT `authid` FROM `".SB_PREFIX."_bans` WHERE `RemoveType` IS NULL AND `length` = 0")) {
|
||||||
|
while ($banned = $bans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($banned["authid"], $bannedplayers)) {
|
||||||
|
$bannedplayers[] = $banned["authid"];
|
||||||
|
++$bcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die('[-] Error retrieving banned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Read unbanned players
|
||||||
|
$ubcnt = 0;
|
||||||
|
if ($unbans = $con->query("SELECT `authid` FROM `".SB_PREFIX."_bans` WHERE `RemoveType` IS NOT NULL AND `RemovedOn` IS NOT NULL")) {
|
||||||
|
while ($unbanned = $unbans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($unbanned["authid"], $bannedplayers) && !in_array($unbanned["authid"], $unbannedplayers)) {
|
||||||
|
$unbannedplayers[] = $unbanned["authid"];
|
||||||
|
++$ubcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die('[-] Error retrieving unbanned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$con->close();
|
||||||
|
print("[+] Retrieved ".$bcnt." banned and ".$ubcnt." unbanned players from SourceBans.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// AMXBans Part
|
||||||
|
//------------------------------
|
||||||
|
if ($useamx)
|
||||||
|
{
|
||||||
|
// Connect to the AMXBans database.
|
||||||
|
$con = new mysqli(AMX_HOST, AMX_USER, AMX_PASS, AMX_NAME, AMX_PORT);
|
||||||
|
if (mysqli_connect_error()) die('[-] Can\'t connect to AMXBans Database (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
|
||||||
|
|
||||||
|
print("[+] Successfully connected to AMXBans database. Retrieving bans now.\n");
|
||||||
|
|
||||||
|
// Get permanent banned players
|
||||||
|
$bcnt = 0;
|
||||||
|
if ($bans = $con->query("SELECT `player_id` FROM `".AMX_PREFIX."_bans` WHERE `ban_length` = 0")) {
|
||||||
|
while ($banned = $bans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($banned["player_id"], $bannedplayers))
|
||||||
|
{
|
||||||
|
$bannedplayers[] = $banned["player_id"];
|
||||||
|
++$bcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving banned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Read unbanned players
|
||||||
|
$ubcnt = 0;
|
||||||
|
// Handles (apparently) pre-6.0 version DB or lower
|
||||||
|
if ($unbans = $con->query("SELECT `player_id` FROM `".AMX_PREFIX."_banhistory` WHERE `ban_length` = 0")) {
|
||||||
|
while ($unbanned = $unbans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($unbanned["player_id"], $bannedplayers) && !in_array($unbanned["player_id"], $unbannedplayers))
|
||||||
|
{
|
||||||
|
$unbannedplayers[] = $unbanned["player_id"];
|
||||||
|
++$ubcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Handles (apparently) 6.0 version DB or higher
|
||||||
|
else if ($unbans = $con->query("SELECT `player_id` FROM `".AMX_PREFIX."_bans` WHERE `expired` = 1")) {
|
||||||
|
while ($unbanned = $unbans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($unbanned["player_id"], $bannedplayers) && !in_array($unbanned["player_id"], $unbannedplayers))
|
||||||
|
{
|
||||||
|
$unbannedplayers[] = $unbanned["player_id"];
|
||||||
|
++$ubcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving unbanned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$con->close();
|
||||||
|
print("[+] Retrieved ".$bcnt." banned and ".$ubcnt." unbanned players from AMXBans.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// Beetlesmod Part
|
||||||
|
//------------------------------
|
||||||
|
if ($usebm)
|
||||||
|
{
|
||||||
|
// Connect to the Beetlesmod database.
|
||||||
|
$con = new mysqli(BM_HOST, BM_USER, BM_PASS, BM_NAME, BM_PORT);
|
||||||
|
if (mysqli_connect_error()) die('[-] Can\'t connect to Beetlesmod Database (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
|
||||||
|
|
||||||
|
print("[+] Successfully connected to Beetlesmod database. Retrieving bans now.\n");
|
||||||
|
|
||||||
|
// Get permanent banned players
|
||||||
|
$bcnt = 0;
|
||||||
|
if ($bans = $con->query("SELECT `steamid` FROM `".BM_PREFIX."_bans` WHERE `Until` IS NULL")) {
|
||||||
|
while ($banned = $bans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($banned["steamid"], $bannedplayers))
|
||||||
|
{
|
||||||
|
$bannedplayers[] = $banned["steamid"];
|
||||||
|
++$bcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving banned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Read unbanned players
|
||||||
|
$ubcnt = 0;
|
||||||
|
if ($unbans = $con->query("SELECT `steamid` FROM `".BM_PREFIX."_bans` WHERE `Until` IS NULL AND `Remove` = 0")) {
|
||||||
|
while ($unbanned = $unbans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($unbanned["steamid"], $bannedplayers) && !in_array($unbanned["steamid"], $unbannedplayers))
|
||||||
|
{
|
||||||
|
$unbannedplayers[] = $unbanned["steamid"];
|
||||||
|
++$ubcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving unbanned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$con->close();
|
||||||
|
print("[+] Retrieved ".$bcnt." banned and ".$ubcnt." unbanned players from Beetlesmod.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// Globalban Part
|
||||||
|
//------------------------------
|
||||||
|
if ($usegb)
|
||||||
|
{
|
||||||
|
// Connect to the Globalban database.
|
||||||
|
$con = new mysqli(GB_HOST, GB_USER, GB_PASS, GB_NAME, GB_PORT);
|
||||||
|
if (mysqli_connect_error()) die('[-] Can\'t connect to Globalban Database (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
|
||||||
|
|
||||||
|
print("[+] Successfully connected to Globalban database. Retrieving bans now.\n");
|
||||||
|
|
||||||
|
// Get permanent banned players
|
||||||
|
$bcnt = 0;
|
||||||
|
if ($bans = $con->query("SELECT `steam_id` FROM `".GB_PREFIX."_ban` WHERE `active` = 1 AND `pending` = 0 AND `length` = 0")) {
|
||||||
|
while ($banned = $bans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($banned["steam_id"], $bannedplayers))
|
||||||
|
{
|
||||||
|
$bannedplayers[] = $banned["steam_id"];
|
||||||
|
++$bcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving banned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Read unbanned players
|
||||||
|
$ubcnt = 0;
|
||||||
|
if ($unbans = $con->query("SELECT `steam_id` FROM `".GB_PREFIX."_ban` WHERE `active` = 0 AND `pending` = 0 AND `length` = 0")) {
|
||||||
|
while ($unbanned = $unbans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($unbanned["steam_id"], $bannedplayers) && !in_array($unbanned["steam_id"], $unbannedplayers))
|
||||||
|
{
|
||||||
|
$unbannedplayers[] = $unbanned["steam_id"];
|
||||||
|
++$ubcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving unbanned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$con->close();
|
||||||
|
print("[+] Retrieved ".$bcnt." banned and ".$ubcnt." unbanned players from Globalban.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// MySQL Banning Part
|
||||||
|
//------------------------------
|
||||||
|
if ($usemb)
|
||||||
|
{
|
||||||
|
// Connect to the MySQL Banning database.
|
||||||
|
$con = new mysqli(MB_HOST, MB_USER, MB_PASS, MB_NAME, MB_PORT);
|
||||||
|
if (mysqli_connect_error()) die('[-] Can\'t connect to MySQL Banning Database (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
|
||||||
|
|
||||||
|
print("[+] Successfully connected to MySQL Banning database. Retrieving bans now.\n");
|
||||||
|
|
||||||
|
// Get permanent banned players
|
||||||
|
$bcnt = 0;
|
||||||
|
if ($bans = $con->query("SELECT `steam_id` FROM `".MB_PREFIX."_bans` WHERE `ban_length` = 0")) {
|
||||||
|
while ($banned = $bans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
if(!in_array($banned["steam_id"], $bannedplayers))
|
||||||
|
{
|
||||||
|
$bannedplayers[] = $banned["steam_id"];
|
||||||
|
++$bcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die('[-] Error retrieving banned players: ' . $con->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****** SM MySQL Banning doesn't provide a ban history AFAIK ******/
|
||||||
|
|
||||||
|
// Read unbanned players
|
||||||
|
// $ubcnt = 0;
|
||||||
|
// if ($unbans = $con->query("SELECT `steam_id` FROM `".MB_PREFIX."_bans` WHERE `ban_length` = 0")) {
|
||||||
|
// while ($unbanned = $unbans->fetch_array(MYSQL_ASSOC)) {
|
||||||
|
// if(!in_array($unbanned["steam_id"], $bannedplayers) && !in_array($unbanned["steam_id"], $unbannedplayers))
|
||||||
|
// {
|
||||||
|
// $unbannedplayers[] = $unbanned["steam_id"];
|
||||||
|
// ++$ubcnt;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// die('[-] Error retrieving unbanned players: ' . $con->error);
|
||||||
|
//}
|
||||||
|
|
||||||
|
$con->close();
|
||||||
|
//print("[+] Retrieved ".$bcnt." banned and ".$ubcnt." unbanned players from MySQL Banning.\n");
|
||||||
|
print("[+] Retrieved ".$bcnt." banned players from MySQL Banning.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// HLstatsX Part
|
||||||
|
//------------------------------
|
||||||
|
|
||||||
|
if(empty($bannedplayers) && empty($unbannedplayers))
|
||||||
|
die('[-] Nothing to change. Exiting.');
|
||||||
|
|
||||||
|
$bannedsteamids="''";
|
||||||
|
$unbannedsteamids="''";
|
||||||
|
|
||||||
|
if(!empty($bannedplayers))
|
||||||
|
{
|
||||||
|
$bannedsteamids = "'";
|
||||||
|
foreach ($bannedplayers as $steamid)
|
||||||
|
{
|
||||||
|
$steamid = preg_replace('/^STEAM_[0-9]+?\:/i','',$steamid);
|
||||||
|
$bannedsteamids .= $steamid."','";
|
||||||
|
}
|
||||||
|
$bannedsteamids .= preg_replace('/\,\'$/','',$steamid);
|
||||||
|
$bannedsteamids .= "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($unbannedplayers))
|
||||||
|
{
|
||||||
|
$unbannedsteamids = "'";
|
||||||
|
foreach ($unbannedplayers as $steamid)
|
||||||
|
{
|
||||||
|
$steamid = preg_replace('/^STEAM_[0-9]+?\:/i','',$steamid);
|
||||||
|
$unbannedsteamids .= $steamid."','";
|
||||||
|
}
|
||||||
|
$unbannedsteamids .= preg_replace('/\,\'$/','',$steamid);
|
||||||
|
$unbannedsteamids .= "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connection to DB
|
||||||
|
$hlxcon = new mysqli(HLX_HOST, HLX_USER, HLX_PASS, '', HLX_PORT);
|
||||||
|
if (mysqli_connect_error()) die('[-] Can\'t connect to HLstatsX Database (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
|
||||||
|
|
||||||
|
print("[+] Successfully connected to HLstatsX database server. Updating players...\n");
|
||||||
|
// Loop through all hlstatsx databases
|
||||||
|
foreach ($hlxdbs as $hlxdb)
|
||||||
|
{
|
||||||
|
$unbancnt = $bancnt = 0;
|
||||||
|
$hlxcon->select_db($hlxdb);
|
||||||
|
// Hide all banned players
|
||||||
|
if ($hlxban = $hlxcon->query("UPDATE `".HLX_PREFIX."_Players` SET `hideranking` = 2 WHERE `hideranking` < 2 AND `playerId` IN (SELECT `playerId` FROM `".HLX_PREFIX."_PlayerUniqueIds` WHERE `uniqueId` IN (".$bannedsteamids."));")) {
|
||||||
|
$bancnt = ($hlxcon->affected_rows?$hlxcon->affected_rows:0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die('[-] Error hiding banned players: ' . $hlxcon->error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show all unbanned players
|
||||||
|
if ($hlxunban = $hlxcon->query("UPDATE `".HLX_PREFIX."_Players` SET `hideranking` = 0 WHERE `hideranking` = 2 AND `playerId` IN (SELECT `playerId` FROM `".HLX_PREFIX."_PlayerUniqueIds` WHERE `uniqueId` IN (".$unbannedsteamids."));")) {
|
||||||
|
$unbancnt = ($hlxcon->affected_rows?$hlxcon->affected_rows:0);
|
||||||
|
|
||||||
|
if ($bancnt>0||$unbancnt>0) {
|
||||||
|
print("[+] ".$hlxdb.": ".$bancnt." players were marked as banned, ".$unbancnt." players were reenabled again.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print("[-] ".$hlxdb.": No player changed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die('[-] Error showing unbanned players: ' . $hlxcon->error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$hlxcon->close();
|
||||||
|
?>
|
194
scripts/ImportBans/importbans.pl
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
####
|
||||||
|
# Script to mark banned users in HLstatsX Community Edition from a Sourcebans, AMXBans, Beetlesmod, or ES GlobalBan database (or multiple at once!)
|
||||||
|
# Last Revised: 2009-07-22 13:35 GMT
|
||||||
|
# BeetlesMod and GlobalBan support added by Bo Tribun (R3M)
|
||||||
|
|
||||||
|
#######################################################################################
|
||||||
|
# You must fill info out for the HLX DB and at least one of the Bans databases
|
||||||
|
#######################################################################################
|
||||||
|
# Sourcebans DB Info
|
||||||
|
$sb_dbhost = "localhost";
|
||||||
|
$sb_dbport = 3306;
|
||||||
|
$sb_dbuser = "";
|
||||||
|
$sb_dbpass = "";
|
||||||
|
$sb_dbname = "";
|
||||||
|
$sb_prefix = "sb_"; # be sure to include the underscore (_)
|
||||||
|
|
||||||
|
# AMXBans DB Info
|
||||||
|
$amxb_dbhost = "localhost";
|
||||||
|
$amxb_dbport = 3306;
|
||||||
|
$amxb_dbuser = "";
|
||||||
|
$amxb_dbpass = "";
|
||||||
|
$amxb_dbname = "";
|
||||||
|
|
||||||
|
# BeetlesMod DB Info
|
||||||
|
$bm_dbhost = "localhost";
|
||||||
|
$bm_dbport = 3306;
|
||||||
|
$bm_dbuser = "";
|
||||||
|
$bm_dbpass = "";
|
||||||
|
$bm_dbname = "";
|
||||||
|
|
||||||
|
# ES GlobalBan DB Info
|
||||||
|
$gb_dbhost = "localhost";
|
||||||
|
$gb_dbport = 3306;
|
||||||
|
$gb_dbuser = "";
|
||||||
|
$gb_dbpass = "";
|
||||||
|
$gb_dbname = "";
|
||||||
|
|
||||||
|
# HLX DB Info
|
||||||
|
$hlx_dbhost = "localhost";
|
||||||
|
$hlx_dbport = 3306;
|
||||||
|
$hlx_dbuser = "";
|
||||||
|
$hlx_dbpass = "";
|
||||||
|
$hlx_dbname = "";
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
##
|
||||||
|
################################################################################
|
||||||
|
## No need to edit below this line
|
||||||
|
##
|
||||||
|
|
||||||
|
use DBI;
|
||||||
|
|
||||||
|
$havesbinfo = ($sb_dbhost eq "" || $sb_dbuser eq "" || $sb_dbpass eq "" || $sb_dbname eq "")?0:1;
|
||||||
|
$haveamxbinfo = ($amxb_dbhost eq "" || $amxb_dbuser eq "" || $amxb_dbpass eq "" || $amxb_dbname eq "")?0:1;
|
||||||
|
$havebminfo = ($bm_dbhost eq "" || $bm_dbuser eq "" || $bm_dbpass eq "" || $bm_dbname eq "")?0:1;
|
||||||
|
$havegbinfo = ($gb_dbhost eq "" || $gb_dbuser eq "" || $gb_dbpass eq "" || $gb_dbname eq "")?0:1;
|
||||||
|
$havehlxinfo = ($hlx_dbhost eq "" || $hlx_dbuser eq "" || $hlx_dbpass eq "" || $hlx_dbname eq "")?0:1;
|
||||||
|
|
||||||
|
die("DB login info incomplete. Exiting\n") if ($havehlxinfo == 0 || ($havesbinfo == 0 && $haveamxbinfo == 0 && $havebminfo == 0 && $havegbinfo == 0));
|
||||||
|
|
||||||
|
@steamids = ();
|
||||||
|
|
||||||
|
if ($havesbinfo) {
|
||||||
|
print "Connecting to Sourcebans database...\n";
|
||||||
|
my $sb_dbconn = DBI->connect(
|
||||||
|
"DBI:mysql:database=$sb_dbname;host=$sb_dbhost;port=$sb_dbport",
|
||||||
|
$sb_dbuser, $sb_dbpass) or die ("\nCan't connect to Sourcebans database '$sb_dbname' on '$sb_dbhost'\n" .
|
||||||
|
"Server error: $DBI::errstr\n");
|
||||||
|
|
||||||
|
print "Successfully connected to Sourcebans database. Retrieving banned Steam IDs now...\n";
|
||||||
|
|
||||||
|
my $result = &doQuery($sb_dbconn, "SELECT `authid` FROM ".$sb_prefix."bans WHERE `length` = 0 AND `RemovedBy` IS NULL");
|
||||||
|
while ( my($steamid) = $result->fetchrow_array) {
|
||||||
|
push(@steamids, $steamid);
|
||||||
|
}
|
||||||
|
my $rows = $result->rows;
|
||||||
|
if ($rows) {
|
||||||
|
print $rows." banned users retrieved from Sourcebans.\n";
|
||||||
|
}
|
||||||
|
$sb_dbconn->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($haveamxbinfo) {
|
||||||
|
print "Connecting to AMXBans database...\n";
|
||||||
|
my $amxb_dbconn = DBI->connect(
|
||||||
|
"DBI:mysql:database=$amxb_dbname;host=$amxb_dbhost;port=$amxb_dbport",
|
||||||
|
$amxb_dbuser, $amxb_dbpass) or die ("\nCan't connect to AMXBans database '$amxb_dbname' on '$amxb_dbhost'\n" .
|
||||||
|
"Server error: $DBI::errstr\n");
|
||||||
|
|
||||||
|
print "Successfully connected to AMXBans database. Retrieving banned Steam IDs now...\n";
|
||||||
|
|
||||||
|
my $result = &doQuery($amxb_dbconn, "SELECT `player_id` FROM amx_bans WHERE `ban_length` = 0");
|
||||||
|
while ( my($steamid) = $result->fetchrow_array) {
|
||||||
|
push(@steamids, $steamid);
|
||||||
|
}
|
||||||
|
my $rows = $result->rows;
|
||||||
|
if ($rows) {
|
||||||
|
print $rows." banned users retrieved from AMXBans.\n";
|
||||||
|
}
|
||||||
|
$amxb_dbconn->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($havebminfo) {
|
||||||
|
print "Connecting to BeetlesMod database...\n";
|
||||||
|
my $bm_dbconn = DBI->connect(
|
||||||
|
"DBI:mysql:database=$bm_dbname;host=$bm_dbhost;port=$bm_dbport",
|
||||||
|
$bm_dbuser, $bm_dbpass) or die ("\nCan't connect to BeetlesMod database '$bm_dbname' on '$bm_dbhost'\n" .
|
||||||
|
"Server error: $DBI::errstr\n");
|
||||||
|
|
||||||
|
print "Successfully connected to BeetlesMod database. Retrieving banned Steam IDs now...\n";
|
||||||
|
|
||||||
|
my $result = &doQuery($bm_dbconn, "SELECT `steamid` FROM `bm_bans` WHERE `Until` IS NULL");
|
||||||
|
while ( my($steamid) = $result->fetchrow_array) {
|
||||||
|
push(@steamids, $steamid);
|
||||||
|
}
|
||||||
|
my $rows = $result->rows;
|
||||||
|
if ($rows) {
|
||||||
|
print $rows." banned users retrieved from BeetlesMod.\n";
|
||||||
|
}
|
||||||
|
$bm_dbconn->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($havegbinfo) {
|
||||||
|
print "Connecting to ES GlobalBan database...\n";
|
||||||
|
my $gb_dbconn = DBI->connect(
|
||||||
|
"DBI:mysql:database=$gb_dbname;host=$gb_dbhost;port=$gb_dbport",
|
||||||
|
$gb_dbuser, $gb_dbpass) or die ("\nCan't connect to ES GlobalBan database '$gb_dbname' on '$gb_dbhost'\n" .
|
||||||
|
"Server error: $DBI::errstr\n");
|
||||||
|
|
||||||
|
print "Successfully connected to ES GlobalBan database. Retrieving banned Steam IDs now...\n";
|
||||||
|
|
||||||
|
my $result = &doQuery($gb_dbconn, "SELECT `steam_id` FROM `gban_ban` WHERE `active` = 1 AND `pending` = 0 AND `length` = 0");
|
||||||
|
while ( my($steamid) = $result->fetchrow_array) {
|
||||||
|
push(@steamids, $steamid);
|
||||||
|
}
|
||||||
|
my $rows = $result->rows;
|
||||||
|
if ($rows) {
|
||||||
|
print $rows." banned users retrieved from ES GlobalBan.\n";
|
||||||
|
}
|
||||||
|
$gb_dbconn->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@steamids) {
|
||||||
|
$steamidstring = "'";
|
||||||
|
foreach $steamid (@steamids)
|
||||||
|
{
|
||||||
|
$steamid =~ s/^STEAM_[0-9]+?\://i;
|
||||||
|
$steamidstring .= $steamid."','";
|
||||||
|
}
|
||||||
|
$steamidstring =~ s/\,\'$//;
|
||||||
|
|
||||||
|
print "Connecting to HLX:CE database...\n";
|
||||||
|
$hlx_dbconn = DBI->connect(
|
||||||
|
"DBI:mysql:database=$hlx_dbname;host=$hlx_dbhost;port=$hlx_dbport",
|
||||||
|
$hlx_dbuser, $hlx_dbpass) or die ("\nCan't connect to HLX:CE database '$hlx_dbname' on '$hlx_dbhost'\n" .
|
||||||
|
"Server error: $DBI::errstr\n");
|
||||||
|
print "Updating HLX:CE banned players...\n";
|
||||||
|
$result = &doQuery($hlx_dbconn, "UPDATE `hlstats_Players` SET `hideranking` = 2 WHERE `playerId` IN (SELECT `playerId` FROM hlstats_PlayerUniqueIds WHERE `uniqueId` IN ($steamidstring)) AND `hideranking` < 2");
|
||||||
|
print $result->rows." users newly marked as banned.\n";
|
||||||
|
$hlx_dbconn->disconnect;
|
||||||
|
} else {
|
||||||
|
die("No banned users found in database(s). Exiting\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub doQuery
|
||||||
|
{
|
||||||
|
my ($dbconn, $query, $callref) = @_;
|
||||||
|
my $result = $dbconn->prepare($query) or die("Unable to prepare query:\n$query\n$DBI::errstr\n$callref");
|
||||||
|
$result->execute or die("Unable to execute query:\n$query\n$DBI::errstr\n$callref");
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
79
scripts/ImportBans/run_importbans
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
# HLStatsX:CE now has two import ban utilities:
|
||||||
|
# 1) ImportBans.pl is the original importing script written in perl.
|
||||||
|
#
|
||||||
|
# 2) hlstatsxbans.php is written by Peace-Maker and is written in PHP.
|
||||||
|
#
|
||||||
|
# More information on these scripts can be found in README.
|
||||||
|
|
||||||
|
|
||||||
|
# Please select your banning system below using the number that corresponds to the ban system above.
|
||||||
|
BANSYSTEM=1
|
||||||
|
|
||||||
|
### Nothing needs to be modified below here ###
|
||||||
|
|
||||||
|
# verify that you have a logs directory
|
||||||
|
if [ ! -d logs ];then
|
||||||
|
mkdir logs
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -w logs ];then
|
||||||
|
echo "you need write access to the logs folder"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# print info to the log file and run importbans.pl
|
||||||
|
echo Importing Bans -- `date +%c` >> logs/log`date +_%Y%m%d`
|
||||||
|
|
||||||
|
case $BANSYSTEM in
|
||||||
|
1)
|
||||||
|
echo Using importbans.pl >> logs/log`date +_%Y%m%d` 2>&1
|
||||||
|
./importbans.pl >> logs/log`date +_%Y%m%d` 2>&1
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo Using hlstatsxbans.php >> logs/log`date +_%Y%m%d` 2>&1
|
||||||
|
/usr/bin/php `pwd`/hlstatsxban.php >> logs/log`date +_%Y%m%d` 2>&1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo Warning: BANSYSTEM is not correctly configured. Please check your configuration.
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo >> logs/log`date +_%Y%m%d`
|
||||||
|
|
||||||
|
|
||||||
|
exit 0
|
500
scripts/TRcon.pm
Normal file
|
@ -0,0 +1,500 @@
|
||||||
|
package TRcon;
|
||||||
|
#
|
||||||
|
# TRcon Perl Module - execute commands on a remote Half-Life2 server using remote console.
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
no strict 'vars';
|
||||||
|
|
||||||
|
use Sys::Hostname;
|
||||||
|
use IO::Socket;
|
||||||
|
use IO::Select;
|
||||||
|
use bytes;
|
||||||
|
use Scalar::Util;
|
||||||
|
|
||||||
|
do "$::opt_libdir/HLstats_GameConstants.plib";
|
||||||
|
|
||||||
|
my $VERSION = "1.00";
|
||||||
|
my $TIMEOUT = 1.0;
|
||||||
|
|
||||||
|
my $SERVERDATA_EXECCOMMAND = 2;
|
||||||
|
my $SERVERDATA_AUTH = 3;
|
||||||
|
my $SERVERDATA_RESPONSE_VALUE = 0;
|
||||||
|
my $SERVERDATA_AUTH_RESPONSE = 2;
|
||||||
|
my $REFRESH_SOCKET_COUNTER_LIMIT = 100;
|
||||||
|
my $AUTH_PACKET_ID = 1;
|
||||||
|
my $SPLIT_END_PACKET_ID = 2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Constructor
|
||||||
|
#
|
||||||
|
|
||||||
|
sub new
|
||||||
|
{
|
||||||
|
my ($class_name, $server_object) = @_;
|
||||||
|
my ($self) = {};
|
||||||
|
bless($self, $class_name);
|
||||||
|
|
||||||
|
$self->{"rcon_socket"} = 0;
|
||||||
|
$self->{"server_object"} = $server_object;
|
||||||
|
Scalar::Util::weaken($self->{"server_object"});
|
||||||
|
$self->{"auth"} = 0;
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
$self->{"packet_id"} = 10;
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub execute
|
||||||
|
{
|
||||||
|
my ($self, $command, $splitted_answer) = @_;
|
||||||
|
if ($::g_stdin == 0) {
|
||||||
|
my $answer = $self->sendrecv($command, $splitted_answer);
|
||||||
|
if ($answer =~ /bad rcon_password/i) {
|
||||||
|
&::printEvent("TRCON", "Bad Password");
|
||||||
|
}
|
||||||
|
return $answer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_auth_code
|
||||||
|
{
|
||||||
|
my ($self, $id) = @_;
|
||||||
|
my $auth = 0;
|
||||||
|
|
||||||
|
if ($id == $AUTH_PACKET_ID) {
|
||||||
|
&::printEvent("TRCON", "Rcon password accepted");
|
||||||
|
$auth = 1;
|
||||||
|
$self->{"auth"} = 1;
|
||||||
|
} elsif( $id == -1) {
|
||||||
|
&::printEvent("TRCON", "Rcon password refused");
|
||||||
|
$self->{"auth"} = 0;
|
||||||
|
$auth = 0;
|
||||||
|
} else {
|
||||||
|
&::printEvent("TRCON", "Bad password response id=$id");
|
||||||
|
$self->{"auth"} = 0;
|
||||||
|
$auth = 0;
|
||||||
|
}
|
||||||
|
return $auth;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub sendrecv
|
||||||
|
{
|
||||||
|
my ($self, $msg, $splitted_answer) = @_;
|
||||||
|
|
||||||
|
my $rs_counter = $self->{"refresh_socket_counter"};
|
||||||
|
if ($rs_counter % $REFRESH_SOCKET_COUNTER_LIMIT == 0) {
|
||||||
|
if ($self->{"rcon_socket"} > 0) {
|
||||||
|
shutdown($self->{"rcon_socket"}, 2);
|
||||||
|
$self->{"rcon_socket"} = 0;
|
||||||
|
}
|
||||||
|
my $server_object = $self->{"server_object"};
|
||||||
|
$self->{"rcon_socket"} = IO::Socket::INET->new(
|
||||||
|
Proto=>"tcp",
|
||||||
|
PeerAddr=>$server_object->{address},
|
||||||
|
PeerPort=>$server_object->{port},
|
||||||
|
);
|
||||||
|
if (!$self->{"rcon_socket"}) {
|
||||||
|
&::printEvent("TRCON", "Cannot setup TCP socket on ".$server_object->{address}.":".$server_object->{port}.": $!");
|
||||||
|
}
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
$self->{"auth"} = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
my $r_socket = $self->{"rcon_socket"};
|
||||||
|
my $server = $self->{"server_object"};
|
||||||
|
|
||||||
|
my $auth = $self->{"auth"};
|
||||||
|
my $response = "";
|
||||||
|
my $packet_id = $self->{"packet_id"};
|
||||||
|
|
||||||
|
if (($r_socket) && ($r_socket->connected() )) {
|
||||||
|
if ($auth == 0) {
|
||||||
|
&::printEvent("TRCON", "Trying to get rcon access (auth)");
|
||||||
|
if ($self->send_rcon($AUTH_PACKET_ID, $SERVERDATA_AUTH, $server->{rcon}, "")) {
|
||||||
|
&::printEvent("TRCON", "Couldn't send password");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
my ($id, $command, $response) = $self->recieve_rcon($AUTH_PACKET_ID);
|
||||||
|
if($command == $SERVERDATA_AUTH_RESPONSE) {
|
||||||
|
$auth = $self->get_auth_code($id);
|
||||||
|
} elsif (($command == $SERVERDATA_RESPONSE_VALUE) && ($id == $AUTH_PACKET_ID)) {
|
||||||
|
#Source servers sends one junk packet during the authentication step, before it responds
|
||||||
|
# with the correct authentication response.
|
||||||
|
&::printEvent("TRCON", "Junk packet from Source Engine");
|
||||||
|
my ($id, $command, $response) = $self->recieve_rcon($AUTH_PACKET_ID);
|
||||||
|
$auth = $self->get_auth_code($id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($auth == 1) {
|
||||||
|
$self->{"refresh_socket_counter"}++;
|
||||||
|
$self->send_rcon($packet_id, $SERVERDATA_EXECCOMMAND, $msg);
|
||||||
|
if ($splitted_answer > 0) {
|
||||||
|
$self->send_rcon($SPLIT_END_PACKET_ID, $SERVERDATA_EXECCOMMAND, "");
|
||||||
|
}
|
||||||
|
my ($id, $command, $response) = $self->recieve_rcon($packet_id, $splitted_answer);
|
||||||
|
$self->{"packet_id"}++;
|
||||||
|
if ($self->{"packet_id"} > 32767) {
|
||||||
|
$self->{"packet_id"} = 10;
|
||||||
|
}
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Send a package
|
||||||
|
#
|
||||||
|
sub send_rcon
|
||||||
|
{
|
||||||
|
my ($self, $id, $command, $string1, $string2) = @_;
|
||||||
|
my $data = pack("VVZ*Z*", $id, $command, $string1, $string2);
|
||||||
|
my $size = length($data);
|
||||||
|
if($size > 4096) {
|
||||||
|
&::printEvent("TRCON", "Command to long to send!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
$data = pack("V", $size).$data;
|
||||||
|
|
||||||
|
my $r_socket = $self->{"rcon_socket"};
|
||||||
|
if ($r_socket && $r_socket->connected() && $r_socket->peeraddr()) {
|
||||||
|
$r_socket->send($data, 0);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Recieve a package
|
||||||
|
#
|
||||||
|
sub recieve_rcon
|
||||||
|
{
|
||||||
|
my ($self, $packet_id, $splitted_answer) = @_;
|
||||||
|
my ($size, $id, $command, $msg);
|
||||||
|
my $tmp = "";
|
||||||
|
|
||||||
|
my $r_socket = $self->{"rcon_socket"};
|
||||||
|
my $server = $self->{"server_object"};
|
||||||
|
my $auth = $self->{"auth"};
|
||||||
|
my $packet_id = $self->{"packet_id"};
|
||||||
|
|
||||||
|
if (($r_socket) && ($r_socket->connected() )) {
|
||||||
|
if(IO::Select->new($r_socket)->can_read($TIMEOUT)) { # $TIMEOUT seconds timeout
|
||||||
|
$r_socket->recv($tmp, 1500);
|
||||||
|
$size = unpack("V", substr($tmp, 0, 4));
|
||||||
|
if ($size == 0) {
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
return (-1, -1, -1);
|
||||||
|
}
|
||||||
|
$id = unpack("V", substr($tmp, 4, 4));
|
||||||
|
$command = unpack("V", substr($tmp, 8, 4));
|
||||||
|
if ($id == $packet_id) {
|
||||||
|
$tmp = substr($tmp, 12, length($tmp)-12);
|
||||||
|
if ($splitted_answer > 0) {
|
||||||
|
my $last_packet_id = $id;
|
||||||
|
while ($last_packet_id != $SPLIT_END_PACKET_ID) {
|
||||||
|
if(IO::Select->new($r_socket)->can_read($TIMEOUT)) {
|
||||||
|
$r_socket->recv($split_data, 1500);
|
||||||
|
my $split_size = unpack("V", substr($split_data, 0, 4));
|
||||||
|
my $split_id = unpack("V", substr($split_data, 4, 4));
|
||||||
|
my $split_command = unpack("V", substr($split_data, 8, 4));
|
||||||
|
if ($split_id == $last_packet_id) {
|
||||||
|
$split_data = substr($split_data, 12, length($split_data)-12);
|
||||||
|
}
|
||||||
|
if (!defined($split_id)){
|
||||||
|
$last_packet_id = $SPLIT_END_PACKET_ID;
|
||||||
|
} else {
|
||||||
|
$last_packet_id = $split_id;
|
||||||
|
}
|
||||||
|
$tmp .= $split_data;
|
||||||
|
} else {
|
||||||
|
&::printNotice("TRCON", "Multiple packet error");
|
||||||
|
$last_packet_id = $SPLIT_END_PACKET_ID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (length($tmp) > 0) {
|
||||||
|
$tmp .= "\x00";
|
||||||
|
my ($string1, $string2) = unpack("Z*Z*", $tmp);
|
||||||
|
$msg = $string1.$string2;
|
||||||
|
} else {
|
||||||
|
$msg = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ($id, $command, $msg);
|
||||||
|
} else {
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
return (-1, -1, -1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$self->{"refresh_socket_counter"} = 0;
|
||||||
|
return (-1, -1, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get error message
|
||||||
|
#
|
||||||
|
|
||||||
|
sub error
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
return $self->{"rcon_error"};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parse "status" command output into player information
|
||||||
|
#
|
||||||
|
|
||||||
|
sub getPlayers
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
my $status = $self->execute("status", 1);
|
||||||
|
if (!$status)
|
||||||
|
{
|
||||||
|
return ("", -1, "", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $status);
|
||||||
|
|
||||||
|
my %players;
|
||||||
|
|
||||||
|
# HL2 standard
|
||||||
|
# userid name uniqueid connected ping loss state adr
|
||||||
|
# 187 ".:[SoV]:.Evil Shadow" STEAM_0:1:6200412 13:48 97 0 active 213.10.196.229:24085
|
||||||
|
|
||||||
|
# L4D
|
||||||
|
# userid name uniqueid connected ping loss state rate adr
|
||||||
|
# 2 1 "psychonic" STEAM_1:1:4153990 00:45 68 1 active 20000 192.168.5.115:27006
|
||||||
|
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
if ($line =~ /^\#\s*
|
||||||
|
(\d+)\s+ # userid
|
||||||
|
(?:\d+\s+|) # extra number in L4D, not sure what this is??
|
||||||
|
"(.+)"\s+ # name
|
||||||
|
(.+)\s+ # uniqueid
|
||||||
|
([\d:]+)\s+ # time
|
||||||
|
(\d+)\s+ # ping
|
||||||
|
(\d+)\s+ # loss
|
||||||
|
([A-Za-z]+)\s+ # state
|
||||||
|
(?:\d+\s+|) # rate (L4D only)
|
||||||
|
([^:]+): # addr
|
||||||
|
(\S+) # port
|
||||||
|
$/x)
|
||||||
|
{
|
||||||
|
my $userid = $1;
|
||||||
|
my $name = $2;
|
||||||
|
my $uniqueid = $3;
|
||||||
|
my $time = $4;
|
||||||
|
my $ping = $5;
|
||||||
|
my $loss = $6;
|
||||||
|
my $state = $7;
|
||||||
|
my $address = $8;
|
||||||
|
my $port = $9;
|
||||||
|
|
||||||
|
$uniqueid =~ s/^STEAM_[0-9]+?\://i;
|
||||||
|
|
||||||
|
# &::printEvent("DEBUG", "USERID: '$userid', NAME: '$name', UNIQUEID: '$uniqueid', TIME: '$time', PING: '$ping', LOSS: '$loss', STATE: '$state', ADDRESS:'$address', CLI_PORT: '$port'", 1);
|
||||||
|
|
||||||
|
if ($::g_mode eq "NameTrack") {
|
||||||
|
$players{$name} = {
|
||||||
|
"Name" => $name,
|
||||||
|
"UserID" => $userid,
|
||||||
|
"UniqueID" => $uniqueid,
|
||||||
|
"Time" => $time,
|
||||||
|
"Ping" => $ping,
|
||||||
|
"Loss" => $loss,
|
||||||
|
"State" => $state,
|
||||||
|
"Address" => $address,
|
||||||
|
"ClientPort" => $port
|
||||||
|
};
|
||||||
|
} elsif ($::g_mode eq "LAN") {
|
||||||
|
$players{$address} = {
|
||||||
|
"Name" => $name,
|
||||||
|
"UserID" => $userid,
|
||||||
|
"UniqueID" => $uniqueid,
|
||||||
|
"Time" => $time,
|
||||||
|
"Ping" => $ping,
|
||||||
|
"Loss" => $loss,
|
||||||
|
"State" => $state,
|
||||||
|
"Address" => $address,
|
||||||
|
"ClientPort" => $port
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
$players{$uniqueid} = {
|
||||||
|
"Name" => $name,
|
||||||
|
"UserID" => $userid,
|
||||||
|
"UniqueID" => $uniqueid,
|
||||||
|
"Time" => $time,
|
||||||
|
"Ping" => $ping,
|
||||||
|
"Loss" => $loss,
|
||||||
|
"State" => $state,
|
||||||
|
"Address" => $address,
|
||||||
|
"ClientPort" => $port
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return %players;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub getServerData
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
my $status = $self->execute("status", 1);
|
||||||
|
|
||||||
|
my $server_object = $self->{server_object};
|
||||||
|
my $game = $server_object->{play_game};
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $status);
|
||||||
|
|
||||||
|
my $servhostname = "";
|
||||||
|
my $map = "";
|
||||||
|
my $max_players = 0;
|
||||||
|
my $difficulty = 0;
|
||||||
|
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
if ($line =~ /^\s*hostname\s*:\s*([\S].*)$/)
|
||||||
|
{
|
||||||
|
$servhostname = $1;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^\s*map\s*:\s*([\S]+).*$/)
|
||||||
|
{
|
||||||
|
$map = $1;
|
||||||
|
}
|
||||||
|
elsif ($line =~ /^\s*players\s*:\s*\d+.+\((\d+)\smax.*$/)
|
||||||
|
{
|
||||||
|
$max_players = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($game == L4D()) {
|
||||||
|
$difficulty = $self->getDifficulty();
|
||||||
|
}
|
||||||
|
return ($servhostname, $map, $max_players, $difficulty);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub getVisiblePlayers
|
||||||
|
{
|
||||||
|
my ($self) = @_;
|
||||||
|
my $status = $self->execute("sv_visiblemaxplayers");
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $status);
|
||||||
|
|
||||||
|
|
||||||
|
my $max_players = -1;
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
# "sv_visiblemaxplayers" = "-1"
|
||||||
|
# - Overrides the max players reported to prospective clients
|
||||||
|
if ($line =~ /^\s*"sv_visiblemaxplayers"\s*=\s*"([-0-9]+)".*$/x)
|
||||||
|
{
|
||||||
|
$max_players = $1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ($max_players);
|
||||||
|
}
|
||||||
|
|
||||||
|
my %l4d_difficulties = (
|
||||||
|
'Easy' => 1,
|
||||||
|
'Normal' => 2,
|
||||||
|
'Hard' => 3,
|
||||||
|
'Impossible' => 4
|
||||||
|
);
|
||||||
|
|
||||||
|
sub getDifficulty
|
||||||
|
{
|
||||||
|
#z_difficulty
|
||||||
|
#"z_difficulty" = "Normal"
|
||||||
|
# game replicated
|
||||||
|
# - Difficulty of the current game (Easy, Normal, Hard, Impossible)
|
||||||
|
|
||||||
|
my ($self) = @_;
|
||||||
|
my $zdifficulty = $self->execute("z_difficulty");
|
||||||
|
|
||||||
|
my @lines = split(/[\r\n]+/, $zdifficulty);
|
||||||
|
|
||||||
|
foreach my $line (@lines)
|
||||||
|
{
|
||||||
|
if ($line =~ /^\s*"z_difficulty"\s*=\s*"([A-Za-z]+)".*$/x)
|
||||||
|
{
|
||||||
|
if (exists($l4d_difficulties{$1}))
|
||||||
|
{
|
||||||
|
return $l4d_difficulties{$1};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get information about a player by userID
|
||||||
|
#
|
||||||
|
|
||||||
|
sub getPlayer
|
||||||
|
{
|
||||||
|
my ($self, $uniqueid) = @_;
|
||||||
|
my %players = $self->getPlayers();
|
||||||
|
|
||||||
|
if (defined($players{$uniqueid}))
|
||||||
|
{
|
||||||
|
return $players{$uniqueid};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$self->{"error"} = "No such player # $uniqueid";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
# end
|
1282
scripts/hlstats-awards.pl
Normal file
374
scripts/hlstats-resolve.pl
Normal file
|
@ -0,0 +1,374 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
# $opt_configfile - Absolute path and filename of configuration file.
|
||||||
|
$opt_configfile = "./hlstats.conf";
|
||||||
|
|
||||||
|
# $opt_libdir - Directory to look in for local required files
|
||||||
|
# (our *.plib, *.pm files).
|
||||||
|
$opt_libdir = "./";
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
##
|
||||||
|
################################################################################
|
||||||
|
## No need to edit below this line
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
use IO::Socket;
|
||||||
|
use DBI;
|
||||||
|
|
||||||
|
require "$opt_libdir/ConfigReaderSimple.pm";
|
||||||
|
do "$opt_libdir/HLstats.plib";
|
||||||
|
|
||||||
|
$|=1;
|
||||||
|
Getopt::Long::Configure ("bundling");
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Functions
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
sub is_number ($) { ( $_[0] ^ $_[0] ) eq '0' }
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# void printEvent (int code, string description)
|
||||||
|
#
|
||||||
|
# Logs event information to stdout.
|
||||||
|
#
|
||||||
|
|
||||||
|
sub printEvent
|
||||||
|
{
|
||||||
|
my ($code, $description, $update_timestamp) = @_;
|
||||||
|
|
||||||
|
if ($g_debug > 0)
|
||||||
|
{
|
||||||
|
if ($update_timestamp > 0)
|
||||||
|
{
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time());
|
||||||
|
my $timestamp = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
|
||||||
|
} else {
|
||||||
|
my $timestamp = $ev_timestamp;
|
||||||
|
}
|
||||||
|
print localtime(time) . "" unless ($timestamp);
|
||||||
|
if (is_number($code))
|
||||||
|
{
|
||||||
|
printf("%s: %21s - E%03d: %s\n", $timestamp, $s_addr, $code, $description);
|
||||||
|
} else {
|
||||||
|
printf("%s: %21s - %s: %s\n", $timestamp, $s_addr, $code, $description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## MAIN
|
||||||
|
##
|
||||||
|
|
||||||
|
# Options
|
||||||
|
|
||||||
|
$opt_help = 0;
|
||||||
|
$opt_version = 0;
|
||||||
|
$opt_regroup = 0;
|
||||||
|
|
||||||
|
$db_host = "localhost";
|
||||||
|
$db_user = "";
|
||||||
|
$db_pass = "";
|
||||||
|
$db_name = "hlstats";
|
||||||
|
|
||||||
|
$g_dns_timeout = 5;
|
||||||
|
$g_debug = 0;
|
||||||
|
|
||||||
|
# Usage message
|
||||||
|
|
||||||
|
$usage = <<EOT
|
||||||
|
Usage: hlstats-resolve.pl [OPTION]...
|
||||||
|
Resolve player IP addresses to hostnames.
|
||||||
|
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-v, --version output version information and exit
|
||||||
|
-d, --debug enable debugging output (-dd for more)
|
||||||
|
-n, --nodebug disables above; reduces debug level
|
||||||
|
--db-host=HOST database ip:port
|
||||||
|
--db-name=DATABASE database name
|
||||||
|
--db-password=PASSWORD database password (WARNING: specifying the
|
||||||
|
password on the command line is insecure.
|
||||||
|
Use the configuration file instead.)
|
||||||
|
--db-username=USERNAME database username
|
||||||
|
--dns-timeout=SEC timeout DNS queries after SEC seconds [$g_dns_timeout]
|
||||||
|
-r, --regroup only re-group hostnames--don't resolve any IPs
|
||||||
|
|
||||||
|
Long options can be abbreviated, where such abbreviation is not ambiguous.
|
||||||
|
|
||||||
|
Most options can be specified in the configuration file:
|
||||||
|
$opt_configfile
|
||||||
|
Note: Options set on the command line take precedence over options set in the
|
||||||
|
configuration file.
|
||||||
|
|
||||||
|
HLstats: http://www.hlstats.org
|
||||||
|
EOT
|
||||||
|
;
|
||||||
|
|
||||||
|
# Read Config File
|
||||||
|
|
||||||
|
if ($opt_configfile && -r $opt_configfile)
|
||||||
|
{
|
||||||
|
$conf = ConfigReaderSimple->new($opt_configfile);
|
||||||
|
$conf->parse();
|
||||||
|
|
||||||
|
%directives = (
|
||||||
|
"DBHost", "db_host",
|
||||||
|
"DBUsername", "db_user",
|
||||||
|
"DBPassword", "db_pass",
|
||||||
|
"DBName", "db_name",
|
||||||
|
"DNSTimeout", "g_dns_timeout",
|
||||||
|
"DebugLevel", "g_debug"
|
||||||
|
);
|
||||||
|
|
||||||
|
&doConf($conf, %directives);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print "-- Warning: unable to open configuration file '$opt_configfile'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read Command Line Arguments
|
||||||
|
|
||||||
|
GetOptions(
|
||||||
|
"help|h" => \$opt_help,
|
||||||
|
"version|v" => \$opt_version,
|
||||||
|
"debug|d+" => \$g_debug,
|
||||||
|
"nodebug|n+" => \$g_nodebug,
|
||||||
|
"db-host=s" => \$db_host,
|
||||||
|
"db-name=s" => \$db_name,
|
||||||
|
"db-password=s" => \$db_pass,
|
||||||
|
"db-username=s" => \$db_user,
|
||||||
|
"dns-timeout=i" => \$g_dns_timeout,
|
||||||
|
"regroup|r" => \$opt_regroup
|
||||||
|
) or die($usage);
|
||||||
|
|
||||||
|
if ($opt_help)
|
||||||
|
{
|
||||||
|
print $usage;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($opt_version)
|
||||||
|
{
|
||||||
|
print "hlstats-resolve.pl (HLstats) $g_version\n"
|
||||||
|
. "Real-time player and clan rankings and statistics for Half-Life\n\n"
|
||||||
|
. "Copyright (C) 2001 Simon Garner\n"
|
||||||
|
. "This is free software; see the source for copying conditions. There is NO\n"
|
||||||
|
. "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$g_debug -= $g_nodebug;
|
||||||
|
$g_debug = 0 if ($g_debug < 0);
|
||||||
|
|
||||||
|
if ($g_debug >= 2)
|
||||||
|
{
|
||||||
|
$opt_quiet = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$opt_quiet = 1; # quiet name resolution
|
||||||
|
}
|
||||||
|
|
||||||
|
$g_dns_resolveip = 1;
|
||||||
|
|
||||||
|
|
||||||
|
# Startup
|
||||||
|
|
||||||
|
print "++ HLstats Resolve $g_version starting...\n\n";
|
||||||
|
|
||||||
|
# Connect to the database
|
||||||
|
|
||||||
|
print "-- Connecting to MySQL database '$db_name' on '$db_host' as user '$db_user' ... ";
|
||||||
|
|
||||||
|
$db_conn = DBI->connect(
|
||||||
|
"DBI:mysql:$db_name:$db_host",
|
||||||
|
$db_user, $db_pass
|
||||||
|
) or die ("Can't connect to MySQL database '$db_name' on '$db_host'\n" .
|
||||||
|
"$DBI::errstr\n");
|
||||||
|
|
||||||
|
print "connected OK\n";
|
||||||
|
|
||||||
|
# Print configuration
|
||||||
|
|
||||||
|
print "-- DNS timeout is $g_dns_timeout seconds. Debug level is $g_debug.\n";
|
||||||
|
|
||||||
|
|
||||||
|
# Main data routine
|
||||||
|
|
||||||
|
if ($opt_regroup)
|
||||||
|
{
|
||||||
|
my $result = &doQuery("
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
hostname
|
||||||
|
FROM
|
||||||
|
hlstats_Events_Connects
|
||||||
|
WHERE
|
||||||
|
hostname != ''
|
||||||
|
");
|
||||||
|
|
||||||
|
my $total = $result->rows;
|
||||||
|
|
||||||
|
if ($total > 0) {
|
||||||
|
print "\n++ Re-grouping hosts (total $total hostnames) ... ";
|
||||||
|
|
||||||
|
my $resultHG = &queryHostGroups();
|
||||||
|
|
||||||
|
if ($g_debug > 0)
|
||||||
|
{
|
||||||
|
print "\n\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $p = 1;
|
||||||
|
while( my($id, $hostname) = $result->fetchrow_array )
|
||||||
|
{
|
||||||
|
my $percent = ($p / $total) * 100;
|
||||||
|
|
||||||
|
my $hostgroup = &getHostGroup($hostname, $resultHG);
|
||||||
|
|
||||||
|
&execNonQuery("
|
||||||
|
UPDATE
|
||||||
|
hlstats_Events_Connects
|
||||||
|
SET
|
||||||
|
hostgroup='" . "eSQL($hostgroup) . "'
|
||||||
|
WHERE
|
||||||
|
id=$id
|
||||||
|
");
|
||||||
|
|
||||||
|
if ($g_debug > 0)
|
||||||
|
{
|
||||||
|
printf("-> (%3d%%) %50s = %s\n", $percent, $hostname, $hostgroup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("\b\b\b\b%3d%%", $percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
$p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
print "\n" unless ($g_debug > 0);
|
||||||
|
} else {
|
||||||
|
print "\n++ No Connects found!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my $result = &doQuery("
|
||||||
|
SELECT
|
||||||
|
DISTINCT ipAddress,
|
||||||
|
hostname
|
||||||
|
FROM
|
||||||
|
hlstats_Events_Connects
|
||||||
|
");
|
||||||
|
|
||||||
|
my $total = $result->rows;
|
||||||
|
if ($total > 0) {
|
||||||
|
print "\n++ Resolving IPs and re-grouping hosts (total $total connects) ... ";
|
||||||
|
|
||||||
|
my $resultHG = &queryHostGroups();
|
||||||
|
|
||||||
|
if ($g_debug > 0)
|
||||||
|
{
|
||||||
|
print "\n\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
print " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $p = 1;
|
||||||
|
while( my($ipAddress, $hostname) = $result->fetchrow_array )
|
||||||
|
{
|
||||||
|
my $percent = ($p / $total) * 100;
|
||||||
|
|
||||||
|
if ($hostname eq "")
|
||||||
|
{
|
||||||
|
$hostname = &resolveIp($ipAddress, $opt_quiet);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $hostgroup = &getHostGroup($hostname, $resultHG);
|
||||||
|
|
||||||
|
&execNonQuery("
|
||||||
|
UPDATE
|
||||||
|
hlstats_Events_Connects
|
||||||
|
SET
|
||||||
|
hostname='$hostname',
|
||||||
|
hostgroup='" . "eSQL($hostgroup) . "'
|
||||||
|
WHERE
|
||||||
|
ipAddress='$ipAddress'
|
||||||
|
");
|
||||||
|
|
||||||
|
if ($g_debug > 0)
|
||||||
|
{
|
||||||
|
printf("-> (%3d%%) %15s = %50s = %s\n", $percent, $ipAddress, $hostname, $hostgroup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("\b\b\b\b%3d%%", $percent);
|
||||||
|
}
|
||||||
|
|
||||||
|
$p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
print "\n" unless ($g_debug > 0);
|
||||||
|
} else {
|
||||||
|
print "\n++ No Connects found!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print "\n++ Operation complete.\n";
|
||||||
|
exit(0);
|
83
scripts/hlstats.conf
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Database Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
# DBHost - Database server "address" or "address:port". Address can be an IP or
|
||||||
|
# a hostname. The default MySQL port is 3306 (tcp).
|
||||||
|
DBHost ""
|
||||||
|
|
||||||
|
# DBUsername - User to connect to the database as.
|
||||||
|
DBUsername ""
|
||||||
|
|
||||||
|
# DBPassword - Password for the database user.
|
||||||
|
DBPassword ""
|
||||||
|
|
||||||
|
# DBName - Name of the database to use.
|
||||||
|
DBName ""
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## UDP Socket Settings (should match "logaddress ip port" on the game servers)
|
||||||
|
##
|
||||||
|
|
||||||
|
# BindIP - IP address to bind to (leave empty to use all interfaces).
|
||||||
|
BindIP ""
|
||||||
|
|
||||||
|
# Port - Port to listen on for log data from the game servers. this is also valid for proxy-daemon.pl
|
||||||
|
Port 27500
|
||||||
|
|
||||||
|
##
|
||||||
|
## Cpanel hack
|
||||||
|
##
|
||||||
|
## Set this to 1 if you use cpanel and need to use a user-installed Perl module
|
||||||
|
CpanelHack 0
|
||||||
|
|
||||||
|
##
|
||||||
|
## Event Queue
|
||||||
|
##
|
||||||
|
## Number of each type of events to queue before inserting events of that type
|
||||||
|
## (larger installs may try raising this for better performance
|
||||||
|
EventQueueSize 10
|
||||||
|
|
||||||
|
# DebugLevel - Set this to 1 to have debugging information printed on stdout.
|
||||||
|
# Set higher for even more debugging information. Set to 0 for
|
||||||
|
# quiet operation. It is recommended that you set this to 1 when
|
||||||
|
# first configuring HLstats, to help diagnose any problems.
|
||||||
|
DebugLevel 1
|
||||||
|
|
3626
scripts/hlstats.pl
Normal file
456
scripts/proxy-daemon.pl
Normal file
|
@ -0,0 +1,456 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use DBI;
|
||||||
|
use IO::Socket;
|
||||||
|
use IO::Select;
|
||||||
|
use Getopt::Long;
|
||||||
|
use Time::Local;
|
||||||
|
|
||||||
|
no strict 'vars';
|
||||||
|
|
||||||
|
##
|
||||||
|
## Settings
|
||||||
|
##
|
||||||
|
|
||||||
|
# $opt_configfile - Absolute path and filename of configuration file.
|
||||||
|
$opt_configfile = "./hlstats.conf";
|
||||||
|
|
||||||
|
# $opt_libdir - Directory to look in for local required files
|
||||||
|
# (our *.plib, *.pm files).
|
||||||
|
$opt_libdir = "./";
|
||||||
|
$heartbeat = 30;
|
||||||
|
|
||||||
|
##
|
||||||
|
##
|
||||||
|
################################################################################
|
||||||
|
## No need to edit below this line
|
||||||
|
##
|
||||||
|
require "$opt_libdir/ConfigReaderSimple.pm";
|
||||||
|
do "$opt_libdir/HLstats.plib";
|
||||||
|
|
||||||
|
$|=1;
|
||||||
|
Getopt::Long::Configure ("bundling");
|
||||||
|
|
||||||
|
binmode STDIN, ":utf8";
|
||||||
|
binmode STDOUT, ":utf8";
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
my %srv_list = ();
|
||||||
|
my ($datagram,$flags);
|
||||||
|
my $oldtime = (time + $heartbeat);
|
||||||
|
|
||||||
|
$usage = <<EOT
|
||||||
|
Usage: hlstats.pl [OPTION]...
|
||||||
|
Collect statistics from one or more Half-Life2 servers for distribution
|
||||||
|
to sub-daemons (hlstats.pl).
|
||||||
|
|
||||||
|
-h, --help display this help and exit
|
||||||
|
-d, --debug enable debugging output (-dd for more)
|
||||||
|
-c, --configfile Specific configfile to use, settings in this file can't
|
||||||
|
be overided with commandline settings.
|
||||||
|
|
||||||
|
HLstatsX: Community Edition http://www.hlxcommunity.com
|
||||||
|
EOT
|
||||||
|
;
|
||||||
|
|
||||||
|
# Read Config File
|
||||||
|
|
||||||
|
if ($opt_configfile && -r $opt_configfile) {
|
||||||
|
$conf = ConfigReaderSimple->new($opt_configfile);
|
||||||
|
$conf->parse();
|
||||||
|
|
||||||
|
%directives = (
|
||||||
|
"DBHost", "db_host",
|
||||||
|
"DBUsername", "db_user",
|
||||||
|
"DBPassword", "db_pass",
|
||||||
|
"DBName", "db_name",
|
||||||
|
"BindIP", "s_ip",
|
||||||
|
"Port", "proxy_port",
|
||||||
|
"DebugLevel", "g_debug",
|
||||||
|
);
|
||||||
|
|
||||||
|
&doConf($conf, %directives);
|
||||||
|
} else {
|
||||||
|
&printEvent("CONFIG", "-- Warning: unable to open configuration file '$opt_configfile'", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read Command Line Arguments
|
||||||
|
GetOptions(
|
||||||
|
"help|h" => \$opt_help,
|
||||||
|
"configfile|c=s" => \$configfile,
|
||||||
|
"debug|d+" => \$g_debug
|
||||||
|
) or die($usage);
|
||||||
|
|
||||||
|
if ($opt_help) {
|
||||||
|
print $usage;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($configfile && -r $configfile) {
|
||||||
|
$conf = '';
|
||||||
|
$conf = ConfigReaderSimple->new($configfile);
|
||||||
|
$conf->parse();
|
||||||
|
&doConf($conf, %directives);
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# assignDaemon(string ipaddr, string ipport, hash daemon, hash srv_list)
|
||||||
|
#
|
||||||
|
# Round-Robin kind of way of spreading the load to different daemons.
|
||||||
|
#
|
||||||
|
sub assignDaemon
|
||||||
|
{
|
||||||
|
my ($ipaddr, $ipport, $daemon, $srv_list) = @_;
|
||||||
|
my $next = "";
|
||||||
|
|
||||||
|
if (defined($$srv_list{'rr-next'})) {
|
||||||
|
$next = $$srv_list{'rr-next'};
|
||||||
|
} else {
|
||||||
|
$next = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $max = keys %$daemon;
|
||||||
|
|
||||||
|
if (!defined($$srv_list{$ipaddr}{$ipport})) {
|
||||||
|
if ($next eq $max) {
|
||||||
|
$next = 1;
|
||||||
|
} else {
|
||||||
|
$next++;
|
||||||
|
}
|
||||||
|
$$srv_list{'rr-next'} = $next;
|
||||||
|
|
||||||
|
$$srv_list{$ipaddr}{$ipport}{'dest_ip'} = $$daemon{$next}{'ip'};
|
||||||
|
$$srv_list{$ipaddr}{$ipport}{'dest_port'} = $$daemon{$next}{'port'};
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# checkHeartbeat (hash daemon, string proxy_key)
|
||||||
|
#
|
||||||
|
# Prints and update the state of the perl daemons, if they are up or not.
|
||||||
|
#
|
||||||
|
sub checkHeartbeat
|
||||||
|
{
|
||||||
|
my ($daemon, $proxy_key) = @_;
|
||||||
|
|
||||||
|
my $state = '';
|
||||||
|
foreach my $key (keys(%$daemon)) {
|
||||||
|
my $value = $$daemon{$key};
|
||||||
|
my $socket = IO::Socket::INET->new( Proto=>"udp",
|
||||||
|
PeerHost=>$$daemon{$key}{'ip'},
|
||||||
|
PeerPort=>$$daemon{$key}{'port'}
|
||||||
|
);
|
||||||
|
$packet = "C;HEARTBEAT;";
|
||||||
|
$socket->send("PROXY Key=$proxy_key PROXY $packet");
|
||||||
|
|
||||||
|
if(IO::Select->new($socket)->can_read(4)) { # 4 second timeout
|
||||||
|
$socket->recv($msg,1024);
|
||||||
|
if ($msg =~ /Heartbeat OK/) {
|
||||||
|
$state = "up";
|
||||||
|
} else {
|
||||||
|
$state = "down";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($$daemon{$key}{'curstate'} eq "") {
|
||||||
|
$$daemon{$key}{'curstate'} = "n/a";
|
||||||
|
}
|
||||||
|
|
||||||
|
$$daemon{$key}{'oldstate'} = $$daemon{$key}{'curstate'};
|
||||||
|
$$daemon{$key}{'curstate'} = $state;
|
||||||
|
|
||||||
|
&printEvent("HEARTBEAT", "Sending HB to $$daemon{$key}{'ip'}:$$daemon{$key}{'port'}... state: $$daemon{$key}{'curstate'} (old: $$daemon{$key}{'oldstate'})", 1);
|
||||||
|
$state = '';
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# string retunrServerList(hash srv_list)
|
||||||
|
#
|
||||||
|
# Return a list of servers to requestor (udp package C;SERVERLIST).
|
||||||
|
#
|
||||||
|
sub returnServerList
|
||||||
|
{
|
||||||
|
my ($srv_list) = @_;
|
||||||
|
#$srv_list{$ipaddr}{$ipport}{'dest_ip'}
|
||||||
|
|
||||||
|
for my $ip (keys(%srv_list)) {
|
||||||
|
for my $port (keys(%{$srv_list{$ip}})) {
|
||||||
|
$msg = $msg . "$ip:$port -> $srv_list{$ip}{$port}{'dest_ip'}:$srv_list{$ip}{$port}{'dest_port'}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# string theTime(int sec, int min, int hour, int mday, int year, int wday, int yday, int isdst)
|
||||||
|
#
|
||||||
|
# Makes a pretty timestampformat to output
|
||||||
|
#
|
||||||
|
sub theTime
|
||||||
|
{
|
||||||
|
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
|
||||||
|
$year = $year + 1900;
|
||||||
|
$mon = $mon + 1;
|
||||||
|
|
||||||
|
if ($mon <= 9) { $mon = "0$mon"; }
|
||||||
|
if ($mday <= 9) { $mday = "0$mday"; }
|
||||||
|
if ($hour <= 9) { $hour = "0$hour"; }
|
||||||
|
if ($min <= 9) { $min = "0$min"; }
|
||||||
|
if ($sec <= 9) { $sec = "0$sec"; }
|
||||||
|
|
||||||
|
my $time = "[$year-$mon-$mday $hour:$min:$sec] ";
|
||||||
|
|
||||||
|
return $time;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# string reloadDaemon(hash daemon, string proxy_key)
|
||||||
|
#
|
||||||
|
# Sends reload package to all daemons specified in hlstats.Options.Proxy_Daemons
|
||||||
|
#
|
||||||
|
sub reloadDaemon
|
||||||
|
{
|
||||||
|
my ($daemon, $proxy_key) = @_;
|
||||||
|
my $fake_ip = "127.0.0.1";
|
||||||
|
my $fake_port = "30000";
|
||||||
|
my $msg = '';
|
||||||
|
$packet = "C;RELOAD;";
|
||||||
|
|
||||||
|
foreach my $key (keys(%$daemon)) {
|
||||||
|
if ($$daemon{$key}{'curstate'} eq "up") {
|
||||||
|
&printEvent("CONTROL", "Sending RELOAD packet to $$daemon{$key}{'ip'}:$$daemon{$key}{'port'}", 1);
|
||||||
|
$msg = $msg . &theTime() . "Sending RELOAD packet to $daemon{$key}{'ip'}:$daemon{$key}{'port'}\n";
|
||||||
|
|
||||||
|
# Sedning actual message to the daemon.
|
||||||
|
my $cmd = IO::Socket::INET->new( Proto=>"udp",
|
||||||
|
PeerHost=>$$daemon{$key}{'ip'},
|
||||||
|
PeerPort=>$$daemon{$key}{'port'}
|
||||||
|
);
|
||||||
|
$cmd->send("PROXY Key=$proxy_key PROXY $packet");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# string getProxyKey ()
|
||||||
|
#
|
||||||
|
# Get the value for Proxy_Key
|
||||||
|
#
|
||||||
|
sub getProxyKey
|
||||||
|
{
|
||||||
|
my $query = "SELECT `value` FROM hlstats_Options WHERE `keyname` = 'Proxy_Key'";
|
||||||
|
my $result = &doQuery($query);
|
||||||
|
my ($proxy_key) = $result->fetchrow_array;
|
||||||
|
$result->finish;
|
||||||
|
|
||||||
|
return $proxy_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub is_number ($) { ( $_[0] ^ $_[0] ) eq '0' }
|
||||||
|
|
||||||
|
|
||||||
|
############## Main program ##############
|
||||||
|
$g_stdin = 0;
|
||||||
|
|
||||||
|
# Connect yo mysql DB to get required settings
|
||||||
|
&doConnect();
|
||||||
|
|
||||||
|
my $proxy_key = &getProxyKey();
|
||||||
|
|
||||||
|
# Get the daemons you will use
|
||||||
|
$query = "SELECT `value` FROM hlstats_Options WHERE `keyname` = 'Proxy_Daemons'";
|
||||||
|
$result = &doQuery($query);
|
||||||
|
|
||||||
|
my ($daemonlist) = $result->fetchrow_array;
|
||||||
|
$result->finish;
|
||||||
|
my @proxy_daemons = split(/,/, $daemonlist);
|
||||||
|
my $total_daemons = scalar(@proxy_daemons);
|
||||||
|
|
||||||
|
my %daemon = ();
|
||||||
|
my $i = 1;
|
||||||
|
|
||||||
|
while ($i <= $total_daemons) {
|
||||||
|
($daemon{$i}{'ip'}, $daemon{$i}{'port'}) = split(/:/, $proxy_daemons[$i-1]);
|
||||||
|
$daemon{$i}{'oldstate'} = "";
|
||||||
|
$daemon{$i}{'curstate'} = "";
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setting up the proxy port to listen on.
|
||||||
|
my $server = IO::Socket::INET->new( LocalPort=>$proxy_port,
|
||||||
|
Proto=>"udp"
|
||||||
|
) or die "Can't create UDP server: $@";
|
||||||
|
|
||||||
|
# It went ok, lets start recive messages...
|
||||||
|
&printEvent("DAEMON", "HlstatsX Proxy Daemon up and running on port: $proxy_port, key: $proxy_key", 1);
|
||||||
|
|
||||||
|
# Do initial heartbeat check.
|
||||||
|
&checkHeartbeat(\%daemon, $proxy_key);
|
||||||
|
|
||||||
|
# Reload all child daemons config
|
||||||
|
&reloadDaemon(\%daemon, $proxy_key);
|
||||||
|
|
||||||
|
while ($server->recv($datagram,1024,$flags)) {
|
||||||
|
my $control = 0;
|
||||||
|
# Checks the subdaemons every 30 sec if they are alive.
|
||||||
|
# the interval can be changed by modify $heartbeat value in beginning of script.
|
||||||
|
if (time > $oldtime) {
|
||||||
|
&checkHeartbeat(\%daemon, $proxy_key);
|
||||||
|
$oldtime = (time + $heartbeat);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $ipaddr = $server->peerhost;
|
||||||
|
my $ipport = $server->peerport;
|
||||||
|
|
||||||
|
if ($ipaddr eq "127.0.0.1" && $datagram =~/C;HEARTBEAT;/) {
|
||||||
|
$control = 1;
|
||||||
|
$msg = '';
|
||||||
|
$msg = "Heartbeat OK";
|
||||||
|
&printEvent("CONTROL", "Sending Heartbeat to $ipaddr:$ipport", 1);
|
||||||
|
} elsif ($ipaddr eq "127.0.0.1" && $datagram =~/C;SERVERLIST;/) {
|
||||||
|
$control = 1;
|
||||||
|
$msg = '';
|
||||||
|
$msg = returnServerList($srv_list);
|
||||||
|
$msg = "ServerList\n$msg";
|
||||||
|
&printEvent("CONTROL", "Sending Serverlist to $ipaddr:$ipport", 1);
|
||||||
|
} elsif ($ipaddr eq "127.0.0.1" && $datagram =~/C;RELOAD;/) {
|
||||||
|
$control = 1;
|
||||||
|
$msg = '';
|
||||||
|
$msg = &reloadDaemon($daemon);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ipaddr eq "127.0.0.1" && $control == 1) {
|
||||||
|
# Sending actual message to the daemon.
|
||||||
|
my $dest = sockaddr_in($ipport, inet_aton($ipaddr));
|
||||||
|
my $bytes = send($server, $msg, 0, $dest);
|
||||||
|
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($datagram =~ /PROXY Key=(.+) (.*)PROXY (.+)/) {
|
||||||
|
if ($proxy_key eq $1) {
|
||||||
|
if ($3 =~ /C;HEARTBEAT;/) {
|
||||||
|
$msg = '';
|
||||||
|
$msg = "Heartbeat OK";
|
||||||
|
&printEvent("CONTROL", "Sending Heartbeat to $ipaddr:$ipport", 1);
|
||||||
|
} elsif ($3 =~ /C;SERVERLIST;/) {
|
||||||
|
$msg = '';
|
||||||
|
$msg = returnServerList($srv_list);
|
||||||
|
$msg = "ServerList\n$msg";
|
||||||
|
&printEvent("CONTROL", "Sending Serverlist to $ipaddr:$ipport", 1);
|
||||||
|
&printEvent("CONTROL", $msg, 1);
|
||||||
|
} elsif ($3 =~ /C;RELOAD;/) {
|
||||||
|
$msg = '';
|
||||||
|
$msg = &reloadDaemon($daemon);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$msg = "FAILED PROXY REQUEST ($ipaddr:$ipport)\n";
|
||||||
|
&printEvent("E403", "Sending FAILED PROXY REQUEST to $ipaddr:$ipport", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Sedning actual message to the daemon.
|
||||||
|
my $dest = sockaddr_in($ipport, inet_aton($ipaddr));
|
||||||
|
my $bytes = send($server, $msg, 0, $dest);
|
||||||
|
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined($srv_list{$ipaddr}{$ipport})) {
|
||||||
|
# Check the oldstate, curstate of your logging daemon
|
||||||
|
foreach my $key (keys %daemon) {
|
||||||
|
if ($srv_list{$ipaddr}{$ipport}{'dest_ip'} eq $daemon{$key}{'ip'} && $srv_list{$ipaddr}{$ipport}{'dest_port'} eq $daemon{$key}{'port'}) {;
|
||||||
|
if ($daemon{$key}{'curstate'} eq "up" && $daemon{$key}{'oldstate'} eq "down") {
|
||||||
|
# Recovering, should do a reload of some kind here.
|
||||||
|
%srv_list = ();
|
||||||
|
|
||||||
|
} elsif ($daemon{$key}{'curstate'} eq "down" && $daemon{$key}{'oldstate'} eq "up") {
|
||||||
|
# Daemon died, assing a new daemon to server
|
||||||
|
|
||||||
|
delete $srv_list{$ipaddr}{$ipport};
|
||||||
|
($daemon, $srv_list) = &assignDaemon($ipaddr, $ipport, $daemon, $srv_list);
|
||||||
|
&printEvent("BALANCE", "down - up: Re-Assing daemon $srv_list{$ipaddr}{$ipport}{'dest_ip'}:$srv_list{$ipaddr}{$ipport}{'dest_port'} to $ipaddr:$ipport", 1);
|
||||||
|
} elsif ($daemon{$key}{'curstate'} eq "down" && $daemon{$key}{'oldstate'} eq "down") {
|
||||||
|
# DOWN, should already reassinged the daemon.
|
||||||
|
|
||||||
|
delete $srv_list{$ipaddr}{$ipport};
|
||||||
|
($daemon, $srv_list) = &assignDaemon($ipaddr, $ipport, $daemon, $srv_list);
|
||||||
|
&printEvent("BALANCE", "down-down: Re-Assing daemon $srv_list{$ipaddr}{$ipport}{'dest_ip'}:$srv_list{$ipaddr}{$ipport}{'dest_port'} to $ipaddr:$ipport", 1);
|
||||||
|
} elsif ($daemon{$key}{'curstate'} eq "down" && $daemon{$key}{'oldstate'} eq "n/a") {
|
||||||
|
# Daemon down when we started proxy, assing another daemon.
|
||||||
|
|
||||||
|
delete $srv_list{$ipaddr}{$ipport};
|
||||||
|
($daemon, $srv_list) = &assignDaemon($ipaddr, $ipport, $daemon, $srv_list);
|
||||||
|
&printEvent("BALANCE", "down - na: Assing daemon $srv_list{$ipaddr}{$ipport}{'dest_ip'}:$srv_list{$ipaddr}{$ipport}{'dest_port'} to $ipaddr:$ipport from down/na", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Assign a logging daemon for your server:port
|
||||||
|
delete $srv_list{$ipaddr}{$ipport};
|
||||||
|
&assignDaemon($ipaddr, $ipport, \%daemon, \%srv_list);
|
||||||
|
&printEvent("BALANCE", "Assing daemon $srv_list{$ipaddr}{$ipport}{'dest_ip'}:$srv_list{$ipaddr}{$ipport}{'dest_port'} to $ipaddr:$ipport", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if ($datagram =~ /.*rcon from.*: command "status".*/ || $datagram =~ /.*rcon from.*: command "stats".*/ || $datagram =~ /.*rcon from.*: command "".*/) {
|
||||||
|
# skip messages that looks like this, to ease the load on the sub daemons alittle
|
||||||
|
&printEvent("NOTICE", "Skipping message...", 1) if ($g_debug > 1);
|
||||||
|
} else {
|
||||||
|
if (defined($srv_list{$ipaddr}{$ipport}{'dest_ip'}) && defined($srv_list{$ipaddr}{$ipport}{'dest_port'})) {
|
||||||
|
$datagram =~ s/^.*RL /RL /g;
|
||||||
|
|
||||||
|
&printEvent("NOTICE", "Sending $datagram to daemon $srv_list{$ipaddr}{$ipport}{'dest_ip'}:$srv_list{$ipaddr}{$ipport}{'dest_port'}", 1) if ($g_debug > 1);
|
||||||
|
# Sedning actual message to the daemon.
|
||||||
|
my $forward = IO::Socket::INET->new( Proto=>"udp",
|
||||||
|
PeerHost=>$srv_list{$ipaddr}{$ipport}{'dest_ip'},
|
||||||
|
PeerPort=>$srv_list{$ipaddr}{$ipport}{'dest_port'}
|
||||||
|
);
|
||||||
|
$forward->send("PROXY Key=$proxy_key $ipaddr:".$ipport."PROXY $datagram");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
791
scripts/run_hlstats
Normal file
|
@ -0,0 +1,791 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxce.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Usage
|
||||||
|
# Information on how to use this script can be found on our wiki:
|
||||||
|
# http://wiki.hlxce.com
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Script Configuration
|
||||||
|
# These parameters allow you to adjust various functions of the daemon.
|
||||||
|
# In general, they should not need to be modified.
|
||||||
|
# Please visit our wiki for more information: http://wiki.hlxce.com
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# SCRIPTPATH:
|
||||||
|
# File system path to daemon and supporting files
|
||||||
|
# NOTE: This is only needed if the other scripts files will be in another directory.
|
||||||
|
# In general, NO TOUCHY! :)
|
||||||
|
SCRIPTPATH=.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# CONFFILE:
|
||||||
|
# Specifies the configuration file (relative to SCRIPTPATH) to use for the daemon
|
||||||
|
CONFFILE=hlstats.conf
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# DAEMON:
|
||||||
|
# Specifies the daemon Perl script to be used
|
||||||
|
DAEMON=hlstats.pl
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# LOGDIR:
|
||||||
|
# Specifies the location to store logs
|
||||||
|
LOGDIR=${SCRIPTPATH}/logs
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# LOGDATE:
|
||||||
|
# Specifies the date format to use in log file names
|
||||||
|
LOGDATE_FORMAT=%Y-%m-%d_%H-%M-%S
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# PIDDIR:
|
||||||
|
# Specifies location to store daemon PID files
|
||||||
|
PIDDIR=${SCRIPTPATH}
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Nothing to modify below here
|
||||||
|
WEBSITE=http://www.hlxce.com
|
||||||
|
WIKI=http://wiki.hlxce.com
|
||||||
|
|
||||||
|
# Start output
|
||||||
|
echo
|
||||||
|
echo "HLstatsX:CE daemon control"
|
||||||
|
echo "${WEBSITE}"
|
||||||
|
echo "---------------------------"
|
||||||
|
|
||||||
|
# Change to directory of script
|
||||||
|
cd `dirname ${0}`
|
||||||
|
|
||||||
|
# Perform some initial checks before we encounter later errors
|
||||||
|
# Check if we can write to the SCRIPTPATH
|
||||||
|
if [ ! -w ${SCRIPTPATH} ]; then
|
||||||
|
echo "CRITICAL ERROR: Could not write to SCRIPTPATH: ${SCRIPTPATH}"
|
||||||
|
echo "Verify you have write access to this directory."
|
||||||
|
echo "Visit our wiki for more information: ${WIKI}."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if the daemon perl script exists
|
||||||
|
if [ ! -f ${SCRIPTPATH}/${DAEMON} ]; then
|
||||||
|
echo "CRITICAL ERROR: Cannot access the daemon: ${DAEMON}"
|
||||||
|
echo "Verify that the daemon, and corresponding files, exist in ${SCRIPTPATH}"
|
||||||
|
echo "Visit our wiki for more information: ${WIKI}."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify shebang line in daemon
|
||||||
|
SHEBANG=`head -n1 ${SCRIPTPATH}/${DAEMON}`
|
||||||
|
if [[ ${SHEBANG} =~ ^#! ]]; then
|
||||||
|
SHEBANG_BINARY=`echo "${SHEBANG}" | sed 's/^#!//'`
|
||||||
|
if [ ! -f ${SHEBANG_BINARY} ]; then
|
||||||
|
echo "CRITICAL ERROR: The path to Perl is incorrect in ${DAEMON}."
|
||||||
|
echo "Current Perl path in shebang: ${SHEBANG_BINARY}"
|
||||||
|
echo "Visit our wiki for more information: ${WIKI}."
|
||||||
|
echo
|
||||||
|
echo "Potential paths for Perl: "
|
||||||
|
echo `which perl`
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: The shebang line is incorrectly configured. Please verify that your shebang line is correct in ${DAEMON}."
|
||||||
|
echo "Current shebang line: ${SHEBANG}"
|
||||||
|
echo "Visit our wiki for more information: ${WIKI}."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create logdir if needed
|
||||||
|
if [ ! -d ${LOGDIR} ]; then
|
||||||
|
mkdir ${LOGDIR}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure we can write to logdir
|
||||||
|
if [ ! -w ${LOGDIR} ]; then
|
||||||
|
echo "CRITICAL ERROR: Could not write to the log folder: ${LOGDIR}"
|
||||||
|
echo "Verify that you have write access to the log folder."
|
||||||
|
echo "Visit our wiki for more information: ${WIKI}."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Daemon control functions
|
||||||
|
function start_daemon {
|
||||||
|
# This function handles the creation of a new daemon process.
|
||||||
|
# This function requires one parameter: PORT
|
||||||
|
# Returns:
|
||||||
|
# 0 - Daemon started
|
||||||
|
# 1 - Daemon failed to start
|
||||||
|
# 2 - Daemon already running
|
||||||
|
|
||||||
|
if [ ! $1 ]; then
|
||||||
|
echo "CRITICAL ERROR: No port was received on function start_daemon"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
local PORT=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local LOG=${LOGDIR}/hlstats_${PORT}_`date +${LOGDATE_FORMAT}`
|
||||||
|
|
||||||
|
local PID=`get_pid ${PORT}`
|
||||||
|
# Check if a PID exists for this port number
|
||||||
|
if [ "${PID}" != "" ]; then
|
||||||
|
# PID exists -- check if the daemon is running.
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
# Daemon running -- nothing to do.
|
||||||
|
return 2
|
||||||
|
else
|
||||||
|
# Daemon not running -- remove pid.
|
||||||
|
remove_pidfile ${PORT}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start the daemon on requested port
|
||||||
|
echo -ne "Attempting to start HLstatsX:CE daemon on port ${PORT}..."
|
||||||
|
${SCRIPTPATH}/${DAEMON} --configfile=${CONFFILE} --port=${PORT} &> ${LOG} &
|
||||||
|
# Store PID in memory until we verify Daemon has launched
|
||||||
|
PID=$!
|
||||||
|
|
||||||
|
# Perform one quick check to see if PID is running
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
create_pidfile ${PORT} ${PID}
|
||||||
|
echo ""
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
# PID not detected in time, keep checking for 10 more seconds.
|
||||||
|
local i=1
|
||||||
|
while [ $i -le 10 ]
|
||||||
|
do
|
||||||
|
echo -ne " ${i}"
|
||||||
|
sleep 1
|
||||||
|
# Perform a kill check against saved PID
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
# Check results of pid test
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
# Process does not exist
|
||||||
|
let i++
|
||||||
|
if [ $i -eq 10 ]; then
|
||||||
|
# Daemon did not respond to start request within 10 seconds.
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Daemon started successfully -- commit PID to file
|
||||||
|
create_pidfile ${PORT} ${PID}
|
||||||
|
echo ""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop_daemon {
|
||||||
|
# This function handles shutting a daemon down.
|
||||||
|
# This function requires one parameter: PORT.
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - Daemon gracefully stopped
|
||||||
|
# 1 - Daemon forcefully stopped
|
||||||
|
# 2 - Daemon could not be stopped
|
||||||
|
# 3 - No daemon to stop or PID missing
|
||||||
|
|
||||||
|
if [ ! $1 ]; then
|
||||||
|
echo "CRITICAL ERROR: No port was received on function stop_daemon"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
local PORT=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local PID=`get_pid ${PORT}`
|
||||||
|
|
||||||
|
if [ ${PID} -eq 0 ]; then
|
||||||
|
return 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Attempt to stop the daemon
|
||||||
|
echo -n "Attempting graceful shutdown of HLstatsX:CE daemon on port ${PORT} "
|
||||||
|
kill -INT ${PID} &> /dev/null
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
# Daemon is not running, purge the PID.
|
||||||
|
remove_pidfile ${PORT}
|
||||||
|
echo ""
|
||||||
|
return 3
|
||||||
|
else
|
||||||
|
# Found running PID -- perform a quick check before entering loop
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
# Daemon stopped, remove PID
|
||||||
|
remove_pidfile ${PORT}
|
||||||
|
echo ""
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
local i=1
|
||||||
|
while [ $i -le 10 ]
|
||||||
|
do
|
||||||
|
echo -n " ${i}"
|
||||||
|
sleep 1
|
||||||
|
# Perform a kill check against saved PID
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
# Daemon still operating
|
||||||
|
let i++
|
||||||
|
else
|
||||||
|
# Daemon stopped, remove PID
|
||||||
|
remove_pidfile ${PORT}
|
||||||
|
echo ""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Daemon did not respond to shutdown, attempt a forced kill
|
||||||
|
echo ""
|
||||||
|
echo "WARNING: Daemon did not respond to a graceful shut down. Forcing a shut down on port ${PORT} "
|
||||||
|
local i=1
|
||||||
|
while [ $i -le 5 ]
|
||||||
|
do
|
||||||
|
kill -KILL ${PID} &> /dev/null
|
||||||
|
echo -n " ${i}"
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# Check if PID is still present
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
# Daemon still operating
|
||||||
|
let i++
|
||||||
|
else
|
||||||
|
# Daemon stopped successfully.
|
||||||
|
remove_pidfile ${PORT}
|
||||||
|
echo ""
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload_daemon {
|
||||||
|
# This function handles reloading a daemon down.
|
||||||
|
# This function requires one parameter: PORT.
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - Reload sent successfully
|
||||||
|
# 1 - Daemon not running or pid file missing
|
||||||
|
|
||||||
|
# Sanity check on incoming required parameter
|
||||||
|
if [ ! $1 ]; then
|
||||||
|
echo "CRITICAL ERROR: No port was received on function reload_daemon"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
local PORT=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
local PID=`get_pid ${PORT}`
|
||||||
|
# Check to verify the daemon is operational
|
||||||
|
if [ ${PID} -ne 0 ]; then
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
kill -HUP ${PID} &> /dev/null
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_port {
|
||||||
|
# This function verifies user input on the port number
|
||||||
|
# One argument is required
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - Valid input
|
||||||
|
# 1 - Invalid Input (non-digit or not in UDP port range)
|
||||||
|
|
||||||
|
if [ $1 ]; then
|
||||||
|
# Perform regex test on input
|
||||||
|
echo ${1} | grep -q '^[0-9]\{1,5\}$'
|
||||||
|
# Check if within range and if grep test was successful.
|
||||||
|
if [ $? -eq 0 ] && [ $1 -le 65535 ] && [ $1 -ge 1 ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_status {
|
||||||
|
# This function performs a lookup for the PID on specified port and checks status
|
||||||
|
# Parameters:
|
||||||
|
# 1 - port
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - PID is running
|
||||||
|
# 1 - PID is not running
|
||||||
|
# 2 - Invalid PID
|
||||||
|
|
||||||
|
if [ $1 ]; then
|
||||||
|
local PID=`get_pid ${1}`
|
||||||
|
if [ "${PID}" != "" ]; then
|
||||||
|
kill -0 ${PID} &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_pidfile {
|
||||||
|
# This function will handle the creation of a PID file for a corresponding port
|
||||||
|
# Parameters required:
|
||||||
|
# 1 - port number
|
||||||
|
# 2 - PID
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - PID saved
|
||||||
|
# 1 - Unable to save PID
|
||||||
|
|
||||||
|
if [[ $1 && $2 ]]; then
|
||||||
|
PIDFILE=${PIDDIR}/hlstats_${1}.pid
|
||||||
|
echo ${2} > ${PIDFILE}
|
||||||
|
|
||||||
|
if [ "`cat ${PIDFILE}`" -eq "${2}" ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function remove_pidfile {
|
||||||
|
# This function will handle the deletion of a PID file for a corresponding port
|
||||||
|
# Parameters required:
|
||||||
|
# 1 - port number
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - PID removed
|
||||||
|
# 1 - PID does not exist
|
||||||
|
|
||||||
|
if [ $1 ]; then
|
||||||
|
PIDFILE=${PIDDIR}/hlstats_${1}.pid
|
||||||
|
rm -f ${PIDFILE} &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function get_pid {
|
||||||
|
# This function will echo out the found pid and return 0, or return 1 if it finds nothing
|
||||||
|
# Parameters required:
|
||||||
|
# 1 - port number
|
||||||
|
|
||||||
|
# Output
|
||||||
|
# Requested PID on return 0
|
||||||
|
|
||||||
|
# Returns:
|
||||||
|
# 0 - PID number for corresponding process
|
||||||
|
# 1 - No PID file for specified port
|
||||||
|
|
||||||
|
if [ $1 ]; then
|
||||||
|
PIDFILE=${PIDDIR}/hlstats_${1}.pid
|
||||||
|
PID=`cat ${PIDFILE} 2> /dev/null`
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo ${PID}
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cleanup old legacy run_hlstats stuff
|
||||||
|
# Check if hlstats.pid exists (original pid from legacy run_hlstats)
|
||||||
|
if [ -f ${PIDDIR}/hlstats.pid ]; then
|
||||||
|
echo "WARNING: A old PID file has been detected. To prevent further troubles this daemon will be shut down."
|
||||||
|
kill -KILL `cat ${PIDDIR}/hlstats.pid` &> /dev/null
|
||||||
|
sleep 1
|
||||||
|
# Check if PID is dead
|
||||||
|
i=1
|
||||||
|
while [ $i -le 5 ]
|
||||||
|
do
|
||||||
|
kill -0 `cat ${PIDDIR}/hlstats.pid` &> /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
# Daemon still operating
|
||||||
|
let i++
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
# Daemon stopped successfully.
|
||||||
|
rm -f ${PIDDIR}/hlstats.pid
|
||||||
|
echo ""
|
||||||
|
echo "HLstatsX:CE daemon has been forcefully stopped."
|
||||||
|
echo "Please re-run this script to control your daemon."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Daemon control case switcher
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
# Usage: run_hlstats start <# of daemons> <first port number> <port increment number>
|
||||||
|
# All arguments are optional
|
||||||
|
# Defaults: # of Daemons = 1; First port number = 27500; Port increment number = 1
|
||||||
|
NUMDAEMONS=1
|
||||||
|
STARTPORT=27500
|
||||||
|
INCREMENT=1
|
||||||
|
|
||||||
|
# Get user-specified number of daemons
|
||||||
|
if [ $2 ]; then
|
||||||
|
NUMDAEMONS=$2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $3 ]; then
|
||||||
|
check_port $3
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
STARTPORT=$3
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: An invalid port number was specified."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $4 ]; then
|
||||||
|
INCREMENT=$4
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Saving this for a future release -- right now this would prevent people from running run_hlstats every few minutes to make sure their daemon is operational.
|
||||||
|
#else
|
||||||
|
# # Lookup the highest currently used port number
|
||||||
|
# LASTPORT=`ls ${PIDDIR} | egrep 'hlstats_[0-9]{1,5}.pid' | egrep -o '[0-9]{1,5}' | tail -1`
|
||||||
|
# if [ "${LASTPORT}" != "" ]; then
|
||||||
|
# # We have currently running daemons, to take the current highest port number and increment it
|
||||||
|
# let STARTPORT=LASTPORT+INCREMENT
|
||||||
|
# fi
|
||||||
|
#
|
||||||
|
#fi
|
||||||
|
|
||||||
|
i=0
|
||||||
|
CURRENTPORT=${STARTPORT}
|
||||||
|
while [ ${i} -lt ${NUMDAEMONS} ]
|
||||||
|
do
|
||||||
|
start_daemon ${CURRENTPORT}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
echo "Daemon successfully started on port ${CURRENTPORT}"
|
||||||
|
let CURRENTPORT=CURRENTPORT+INCREMENT
|
||||||
|
let i++
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
echo "CRITICAL ERROR: Unable to start daemon on port ${CURRENTPORT}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "Daemon is already running on port ${CURRENTPORT}"
|
||||||
|
let CURRENTPORT=CURRENTPORT+INCREMENT
|
||||||
|
let i++
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
stop)
|
||||||
|
# Usage: run_hlstats stop <port>
|
||||||
|
# All arguments are optional
|
||||||
|
# Defaults: port = ALL
|
||||||
|
|
||||||
|
if [ $2 ]; then
|
||||||
|
check_port $2
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
PORT=$2
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: An invalid port number was specified."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
PORT=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stop a single daemon
|
||||||
|
if [ ${PORT} -ne 0 ]; then
|
||||||
|
stop_daemon ${PORT}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
echo "Daemon gracefully stopped on port ${PORT}"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
echo "Daemon forcefully stopped on port ${PORT}"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "WARNING: Daemon could not be stopped on port ${PORT}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
echo "No daemon running on port ${PORT} or PID file is missing."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stop all daemons
|
||||||
|
PORTS=`ls ${PIDDIR} | egrep 'hlstats_[0-9]{1,5}.pid' | egrep -o '[0-9]{1,5}'`
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
for port in ${PORTS} ; do
|
||||||
|
stop_daemon ${port}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
echo "Daemon gracefully stopped on port ${port}"
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
echo "Daemon forcefully stopped on port ${port}"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "WARNING: Daemon could not be stopped on port ${port}"
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
echo "No daemon running on port ${port} or PID file is missing."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "No daemons found running, or PID files are missing."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
restart)
|
||||||
|
# Usage: run_hlstats restart <port>
|
||||||
|
# All arguments are optional
|
||||||
|
# Defaults: port = ALL
|
||||||
|
|
||||||
|
if [ $2 ]; then
|
||||||
|
check_port $2
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
PORT=$2
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: An invalid port number was specified."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
PORT=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle individual restart request
|
||||||
|
if [ ${PORT} -ne 0 ]; then
|
||||||
|
stop_daemon ${PORT}
|
||||||
|
case $? in
|
||||||
|
0 | 1 | 3)
|
||||||
|
start_daemon ${PORT}
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Daemon successfully restarted on port ${PORT}"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: Failed to restart daemon on port ${PORT}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "WARNING: Daemon could not be stopped on port ${port}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Restart all PIDs
|
||||||
|
PORTS=`ls ${PIDDIR} | egrep 'hlstats_[0-9]{1,5}.pid' | egrep -o '[0-9]{1,5}'`
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
for port in ${PORTS} ; do
|
||||||
|
stop_daemon ${port}
|
||||||
|
case $? in
|
||||||
|
0 | 1 | 3)
|
||||||
|
start_daemon ${port}
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Daemon successfully restarted on port ${port}"
|
||||||
|
else
|
||||||
|
echo "WARNING: Failed to restart daemon on port ${port}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "WARNING: Daemon could not be stopped on port ${port}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "WARNING: No HLstatsX:CE daemons currently running."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
reload)
|
||||||
|
# Usage: run_hlstats reload <port>
|
||||||
|
# All arguments are optional
|
||||||
|
# Defaults: port = ALL
|
||||||
|
|
||||||
|
if [ $2 ]; then
|
||||||
|
check_port $2
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
PORT=$2
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: An invalid port number was specified."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
PORT=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle individual reload request
|
||||||
|
if [ ${PORT} -ne 0 ]; then
|
||||||
|
reload_daemon ${PORT}
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Successfully reloaded daemon running on port ${PORT}"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "WARNING: Unable to reload daemon on port ${PORT} (daemon might not be running)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reload all PIDs
|
||||||
|
PORTS=`ls ${PIDDIR} | egrep 'hlstats_[0-9]{1,5}.pid' | egrep -o '[0-9]{1,5}'`
|
||||||
|
if [ "${PORTS}" != "" ]; then
|
||||||
|
for port in ${PORTS} ; do
|
||||||
|
reload_daemon ${port}
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Successfully reloaded daemon running on port ${port}"
|
||||||
|
else
|
||||||
|
echo "WARNING: Unable to reload daemon on port ${port} (daemon might not be running)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "WARNING: No HLstatsX:CE daemons currently running."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
status)
|
||||||
|
# Usage: run_hlstats status <port>
|
||||||
|
# All arguments are optional
|
||||||
|
# Defaults: port = ALL
|
||||||
|
|
||||||
|
if [ $2 ]; then
|
||||||
|
check_port $2
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
PORT=$2
|
||||||
|
else
|
||||||
|
echo "CRITICAL ERROR: An invalid port number was specified."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
PORT=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle individual status request
|
||||||
|
if [ ${PORT} -ne 0 ]; then
|
||||||
|
get_status ${PORT}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
echo "Daemon on port ${PORT} is currently running."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
echo "A stale process was found for daemon on port ${PORT}."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "There is no daemon running on port ${PORT}."
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Reload all PIDs
|
||||||
|
PORTS=`ls ${PIDDIR} | egrep 'hlstats_[0-9]{1,5}.pid' | egrep -o '[0-9]{1,5}'`
|
||||||
|
if [ "${PORTS}" != "" ]; then
|
||||||
|
for port in ${PORTS} ; do
|
||||||
|
get_status ${port}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
echo "Daemon on port ${port} is currently running."
|
||||||
|
;;
|
||||||
|
1)
|
||||||
|
echo "A stale process was found for daemon on port ${port}. It has been removed."
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "There is no daemon running on port ${port}."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "WARNING: No HLstatsX:CE daemons currently running."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Usage"
|
||||||
|
echo "All optional arguments are in <>. The default is in ()."
|
||||||
|
echo ""
|
||||||
|
echo -e "\trun_hlstats start <number of daemons (1)> <starting port number (27500)> <port increment (1)>"
|
||||||
|
echo -e "\trun_hlstats stop <port # of daemon to stop (ALL)>"
|
||||||
|
echo -e "\trun_hlstats status <port # of daemon to check status of (ALL)>"
|
||||||
|
echo -e "\trun_hlstats restart <port # of daemon to restart (ALL)>"
|
||||||
|
echo -e "\trun_hlstats reload <port # of daemon to reload (ALL)>"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit
|
||||||
|
|
50
scripts/run_hlstats_multi
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
# If you wish to run this script as a daemon script (in /etc/init.d, etc.)
|
||||||
|
# you must configure the "confdir" variable below.
|
||||||
|
# The other variables are optional and really should not be modified.
|
||||||
|
|
||||||
|
echo "
|
||||||
|
WARNING: run_hlstats_multi is deprecated as of 1.6.11.
|
||||||
|
If you need to start multiple daemons you should now use run_hlstats with the correct parameters.
|
||||||
|
|
||||||
|
For information run_hlstats, run:
|
||||||
|
|
||||||
|
./run_hlstats help
|
||||||
|
|
||||||
|
or visit http://wiki.hlxce.com/wiki/Controlling_the_HLXCE_daemon"
|
||||||
|
exit 0
|
151
scripts/run_proxy
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
# http://www.hlxcommunity.com
|
||||||
|
#
|
||||||
|
# HLstatsX Community Edition is a continuation of
|
||||||
|
# ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
# Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
# http://ovrsized.neo-soft.org/
|
||||||
|
#
|
||||||
|
# ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
# HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
# http://www.hlstatsx.com/
|
||||||
|
# Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
#
|
||||||
|
# HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
# HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
# http://sourceforge.net/projects/hlstats/
|
||||||
|
# Copyright (C) 2001 Simon Garner
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
# If you wish to run this script as a daemon script (in /etc/init.d, etc.)
|
||||||
|
# you must configure the "confdir" variable below.
|
||||||
|
# The other variables are optional and really should not be modified.
|
||||||
|
|
||||||
|
# Set the path to the scripts folder (you should not need to modify this.)
|
||||||
|
confdir=.
|
||||||
|
|
||||||
|
# Set the configuration file for the daemon (you should not need to modify this.)
|
||||||
|
conffile=hlstats.conf
|
||||||
|
# Set the filename of the daemon to use (you should not need to modify this.)
|
||||||
|
daemonfile=proxy-daemon.pl
|
||||||
|
# Set where you want to log to. This is a directory inside of the confdir setting.
|
||||||
|
# (You should not need to modify this.)
|
||||||
|
logdir=logs
|
||||||
|
# Set the format of the log file
|
||||||
|
logfile=proxy`date +_%Y%m%d_%H-%M-%S`
|
||||||
|
# Set where to store PID files
|
||||||
|
piddir=${confdir}
|
||||||
|
|
||||||
|
# verify that we can see the daemon file
|
||||||
|
if [ ! -f ${confdir}/${daemonfile} ]; then
|
||||||
|
echo "Can't see the daemon. (${daemonfile})"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# verify that you have write access to the directories
|
||||||
|
if [ ! -w ${confdir} ]; then
|
||||||
|
echo "you need write access to ${confdir}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# verify that you have a logs directory
|
||||||
|
if [ ! -d ${confdir}/${logdir} ];then
|
||||||
|
mkdir ${confdir}/${logdir}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -w ${confdir}/${logdir} ];then
|
||||||
|
echo "you need write access to ${confdir}/${logdir}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Grab out original directory so we can return after
|
||||||
|
origdir=`pwd`
|
||||||
|
|
||||||
|
# Move into configured directory
|
||||||
|
cd ${confdir}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
# verify that we have a .conf file
|
||||||
|
if [ ! -f ${conffile} ]; then
|
||||||
|
echo "You're missing your configuration file. (${conffile})"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Starting HLstatsX:CE...";
|
||||||
|
if [ -f ${piddir}/proxy-daemon.pid ]; then
|
||||||
|
kill -0 `cat ${piddir}/proxy-daemon.pid` >/dev/null 2>&1
|
||||||
|
if [ "$?" == "0" ]; then
|
||||||
|
echo "HLstatsX:CE already running!"
|
||||||
|
else
|
||||||
|
rm -rf ${piddir}/proxy-daemon.pid
|
||||||
|
./${daemonfile} --configfile=${conffile} > ${logdir}/${logfile} 2>&1 &
|
||||||
|
echo $! >${piddir}/proxy-daemon.pid
|
||||||
|
echo "PID file created"
|
||||||
|
echo "Started successfully"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
./${daemonfile} --configfile=${conffile} > ${logdir}/${logfile} 2>&1 &
|
||||||
|
echo $! >${piddir}/proxy-daemon.pid
|
||||||
|
echo "PID file created"
|
||||||
|
echo "Started successfully"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
stop)
|
||||||
|
echo "Stopping HLstatsX:CE..."
|
||||||
|
kill -9 `cat ${piddir}/proxy-daemon.pid` >/dev/null 2>&1
|
||||||
|
if [ "$?" == "0" ]; then
|
||||||
|
rm -rf ${piddir}/proxy-daemon.pid
|
||||||
|
echo "Stopped successfully"
|
||||||
|
else
|
||||||
|
echo "No HLstatsX:CE running!"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
restart)
|
||||||
|
echo "Restarting HLstatsX:CE..."
|
||||||
|
kill -9 `cat ${piddir}/proxy-daemon.pid` >/dev/null 2>&1
|
||||||
|
if [ "$?" == "0" ]; then
|
||||||
|
rm -rf ${piddir}/proxy-daemon.pid
|
||||||
|
./${daemonfile} --configfile=${conffile} > ${logdir}/${logfile} 2>&1 &
|
||||||
|
echo $! >${piddir}/proxy-daemon.pid
|
||||||
|
echo "PID file created"
|
||||||
|
echo "Restarted successfully"
|
||||||
|
else
|
||||||
|
echo "HLstatsX:CE"
|
||||||
|
if [ -f ${piddir}/proxy-daemon.pid ]; then
|
||||||
|
rm -rf ${piddir}/proxy-daemon.pid
|
||||||
|
fi
|
||||||
|
./${daemonfile} --configfile=${conffile} > ${logdir}/${logfile} 2>&1 &
|
||||||
|
echo $! >${piddir}/proxy-daemon.pid
|
||||||
|
echo "PID file created"
|
||||||
|
echo "Started successfully"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Usage: ./run_hlstats [ start | stop | restart ]"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Return to original directory
|
||||||
|
cd ${origdir}
|
||||||
|
|
||||||
|
exit 0
|
BIN
sourcemod/plugins/hlstatsx.smx
Normal file
1
sourcemod/scripting/README.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
As of HLX:CE 1.6.0, the hlstatsx.sp does not add any extra log information. To get auxilary logging for more actions supported by HLX:CE, please run the SuperLogs plugin for your game (in extras/SuperLogs or on the AlliedModders site). If a SuperLogs plugin is not available for your game, it is likely that the "SuperLogs: Generic" plugin will still be of use to add some extra information.
|
2147
sourcemod/scripting/hlstatsx.sp
Normal file
198
sourcemod/scripting/include/loghelper.inc
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
#define LOGHELPER_VERSION 3
|
||||||
|
|
||||||
|
#include <sourcemod>
|
||||||
|
#include <sdktools>
|
||||||
|
|
||||||
|
new String:g_team_list[16][64];
|
||||||
|
|
||||||
|
// Call this on map start to cache team names in g_team_list
|
||||||
|
|
||||||
|
stock GetTeams(bool:insmod = false)
|
||||||
|
{
|
||||||
|
if (!insmod)
|
||||||
|
{
|
||||||
|
new max_teams_count = GetTeamCount();
|
||||||
|
for (new team_index = 0; (team_index < max_teams_count); team_index++)
|
||||||
|
{
|
||||||
|
decl String: team_name[64];
|
||||||
|
GetTeamName(team_index, team_name, sizeof(team_name));
|
||||||
|
|
||||||
|
if (strcmp(team_name, "") != 0)
|
||||||
|
{
|
||||||
|
g_team_list[team_index] = team_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// they really need to get their act together... GetTeamName() would be awesome since they can't even keep their team indexes consistent
|
||||||
|
decl String:mapname[64];
|
||||||
|
GetCurrentMap(mapname, sizeof(mapname));
|
||||||
|
if (strcmp(mapname, "ins_karam") == 0 || strcmp(mapname, "ins_baghdad") == 0)
|
||||||
|
{
|
||||||
|
g_team_list[1] = "Iraqi Insurgents";
|
||||||
|
g_team_list[2] = "U.S. Marines";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_team_list[1] = "U.S. Marines";
|
||||||
|
g_team_list[2] = "Iraqi Insurgents";
|
||||||
|
}
|
||||||
|
g_team_list[0] = "Unassigned";
|
||||||
|
g_team_list[3] = "SPECTATOR";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stock LogPlayerEvent(client, const String:verb[], const String:event[], bool:display_location = false, const String:properties[] = "")
|
||||||
|
{
|
||||||
|
if (IsValidPlayer(client))
|
||||||
|
{
|
||||||
|
decl String:player_authid[32];
|
||||||
|
if (!GetClientAuthString(client, player_authid, sizeof(player_authid)))
|
||||||
|
{
|
||||||
|
strcopy(player_authid, sizeof(player_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display_location)
|
||||||
|
{
|
||||||
|
decl Float:player_origin[3];
|
||||||
|
GetClientAbsOrigin(client, player_origin);
|
||||||
|
LogToGame("\"%N<%d><%s><%s>\" %s \"%s\"%s (position \"%d %d %d\")", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, properties, RoundFloat(player_origin[0]), RoundFloat(player_origin[1]), RoundFloat(player_origin[2]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogToGame("\"%N<%d><%s><%s>\" %s \"%s\"%s", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stock LogPlyrPlyrEvent(client, victim, const String:verb[], const String:event[], bool:display_location = false, const String:properties[] = "")
|
||||||
|
{
|
||||||
|
if (IsValidPlayer(client) && IsValidPlayer(victim))
|
||||||
|
{
|
||||||
|
decl String:player_authid[32];
|
||||||
|
if (!GetClientAuthString(client, player_authid, sizeof(player_authid)))
|
||||||
|
{
|
||||||
|
strcopy(player_authid, sizeof(player_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
decl String:victim_authid[32];
|
||||||
|
if (!GetClientAuthString(victim, victim_authid, sizeof(victim_authid)))
|
||||||
|
{
|
||||||
|
strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display_location)
|
||||||
|
{
|
||||||
|
decl Float:player_origin[3];
|
||||||
|
GetClientAbsOrigin(client, player_origin);
|
||||||
|
|
||||||
|
decl Float:victim_origin[3];
|
||||||
|
GetClientAbsOrigin(victim, victim_origin);
|
||||||
|
|
||||||
|
LogToGame("\"%N<%d><%s><%s>\" %s \"%s\" against \"%N<%d><%s><%s>\"%s (position \"%d %d %d\") (victim_position \"%d %d %d\")", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], properties, RoundFloat(player_origin[0]), RoundFloat(player_origin[1]), RoundFloat(player_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogToGame("\"%N<%d><%s><%s>\" %s \"%s\" against \"%N<%d><%s><%s>\"%s", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stock LogKill(attacker, victim, const String:weapon[], bool:display_location = false, const String:properties[] = "")
|
||||||
|
{
|
||||||
|
if (IsValidPlayer(attacker) && IsValidPlayer(victim))
|
||||||
|
{
|
||||||
|
decl String:attacker_authid[32];
|
||||||
|
if (!GetClientAuthString(attacker, attacker_authid, sizeof(attacker_authid)))
|
||||||
|
{
|
||||||
|
strcopy(attacker_authid, sizeof(attacker_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
decl String:victim_authid[32];
|
||||||
|
if (!GetClientAuthString(victim, victim_authid, sizeof(victim_authid)))
|
||||||
|
{
|
||||||
|
strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display_location)
|
||||||
|
{
|
||||||
|
decl Float:attacker_origin[3];
|
||||||
|
GetClientAbsOrigin(attacker, attacker_origin);
|
||||||
|
decl Float:victim_origin[3];
|
||||||
|
GetClientAbsOrigin(victim, victim_origin);
|
||||||
|
|
||||||
|
LogToGame("\"%N<%d><%s><%s>\" killed \"%N<%d><%s><%s>\" with \"%s\"%s (attacker_position \"%d %d %d\") (victim_position \"%d %d %d\")", attacker, GetClientUserId(attacker), attacker_authid, g_team_list[GetClientTeam(attacker)], victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, properties, RoundFloat(attacker_origin[0]), RoundFloat(attacker_origin[1]), RoundFloat(attacker_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogToGame("\"%N<%d><%s><%s>\" killed \"%N<%d><%s><%s>\" with \"%s\"%s", attacker, GetClientUserId(attacker), attacker_authid, g_team_list[GetClientTeam(attacker)], victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Psychostats "KTRAJ" kill trajectory log lines
|
||||||
|
stock LogPSKillTraj(attacker, victim, const String:weapon[])
|
||||||
|
{
|
||||||
|
if (IsValidPlayer(attacker) && IsValidPlayer(victim))
|
||||||
|
{
|
||||||
|
decl String:attacker_authid[32];
|
||||||
|
if (!GetClientAuthString(attacker, attacker_authid, sizeof(attacker_authid)))
|
||||||
|
{
|
||||||
|
strcopy(attacker_authid, sizeof(attacker_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
decl String:victim_authid[32];
|
||||||
|
if (!GetClientAuthString(victim, victim_authid, sizeof(victim_authid)))
|
||||||
|
{
|
||||||
|
strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN");
|
||||||
|
}
|
||||||
|
|
||||||
|
decl Float:attacker_origin[3];
|
||||||
|
GetClientAbsOrigin(attacker, attacker_origin);
|
||||||
|
decl Float:victim_origin[3];
|
||||||
|
GetClientAbsOrigin(victim, victim_origin);
|
||||||
|
|
||||||
|
LogToGame("[KTRAJ] \"%N<%d><%s><%s>\" killed \"%N<%d><%s><%s>\" with \"%s\" (attacker_position \"%d %d %d\") (victim_position \"%d %d %d\")", attacker, GetClientUserId(attacker), attacker_authid, g_team_list[GetClientTeam(attacker)], victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, RoundFloat(attacker_origin[0]), RoundFloat(attacker_origin[1]), RoundFloat(attacker_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verb should always be "triggered" for this.
|
||||||
|
stock LogTeamEvent(team, const String:verb[], const String:event[], const String:properties[] = "")
|
||||||
|
{
|
||||||
|
if (team > -1)
|
||||||
|
{
|
||||||
|
LogToGame("Team \"%s\" %s \"%s\"%s", g_team_list[team], verb, event, properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stock LogKillLoc(attacker, victim)
|
||||||
|
{
|
||||||
|
if (attacker > 0 && victim > 0)
|
||||||
|
{
|
||||||
|
decl Float:attacker_origin[3];
|
||||||
|
GetClientAbsOrigin(attacker, attacker_origin);
|
||||||
|
decl Float:victim_origin[3];
|
||||||
|
GetClientAbsOrigin(victim, victim_origin);
|
||||||
|
|
||||||
|
LogToGame("World triggered \"killlocation\" (attacker_position \"%d %d %d\") (victim_position \"%d %d %d\")", RoundFloat(attacker_origin[0]), RoundFloat(attacker_origin[1]), RoundFloat(attacker_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stock LogRoleChange(client, const String:role[], const String:properties[] = "")
|
||||||
|
{
|
||||||
|
LogPlayerEvent( client, "changed role to", role, false, properties );
|
||||||
|
}
|
||||||
|
|
||||||
|
stock LogMapLoad()
|
||||||
|
{
|
||||||
|
decl String:map[64];
|
||||||
|
GetCurrentMap(map, sizeof(map));
|
||||||
|
LogToGame("Loading map \"%s\"", map);
|
||||||
|
}
|
||||||
|
|
||||||
|
stock IsValidPlayer(client)
|
||||||
|
{
|
||||||
|
if (client > 0 && client <= MaxClients && IsClientInGame(client))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
76
sql/Upgrade 1.00 - 1.1/upgrade_hlxcomm100_11.sql
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
ALTER TABLE `hlstats_Actions`
|
||||||
|
DROP KEY `gamecode`,
|
||||||
|
ADD UNIQUE KEY `gamecode` (`code`,`game`,`object`,`event`,`team`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`, `count`, `object`, `event`) VALUES
|
||||||
|
('ff', 'headshot', 1, 0, '', 'Headshot kill', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('hidden', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', '', 0, NULL, NULL);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Actions` SET `for_PlayerActions`='0', `for_PlayerPlayerActions`='0', `for_TeamActions`='1', `for_WorldActions`='0' WHERE `game`='tf' AND `code` IN ('Round_Win','Mini_Round_Win');
|
||||||
|
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`, `d_winner_id`, `d_winner_count`) VALUES
|
||||||
|
('W', 'hidden', 'fn2000', 'FN2000 Assault Rifle', 'kills with FN2000 Assault Rifle', NULL, NULL),
|
||||||
|
('W', 'hidden', 'p90', 'FN P90 Sub Machine Gun', 'kills with FN P90 Sub Machine Gun', NULL, NULL),
|
||||||
|
('W', 'hidden', 'shotgun', 'Remington 870 MCS Shotgun', 'kills with Remington 870 MCS Shotgun', NULL, NULL),
|
||||||
|
('W', 'hidden', 'fn303', 'FN303 Less Lethal Launcher', 'kills with FN303 Less Lethal Launcher', NULL, NULL),
|
||||||
|
('W', 'hidden', 'pistol', 'FN FiveSeven Pistol', 'kills with FN FiveSeven Pistol', NULL, NULL),
|
||||||
|
('W', 'hidden', 'pistol2', 'FNP-9 Pistol', 'kills with FNP-9 Pistol', NULL, NULL),
|
||||||
|
('W', 'hidden', 'knife', 'Kabar D2 Knife', 'kills with Kabar D2 Knife', NULL, NULL),
|
||||||
|
('W', 'hidden', 'grenade_projectile', 'Pipe Bomb', 'kills with Pipe Bomb', NULL, NULL),
|
||||||
|
('W', 'hidden', 'physics', 'Physics', 'kills with Physics', NULL, NULL);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games` (`code`, `name`, `hidden`) VALUES
|
||||||
|
('hidden','The Hidden: Source','1');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options` (`keyname`, `value`) VALUES
|
||||||
|
('gamehome_show_awards', '0');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ranks` (`image`, `minKills`, `maxKills`, `rankName`, `game`) VALUES
|
||||||
|
('recruit',0,49,'Recruit','hidden'),
|
||||||
|
('private',50,99,'Private','hidden'),
|
||||||
|
('private_firstclass',100,149,'Private First Class','hidden'),
|
||||||
|
('second_lieutenant',150,249,'2nd Lieutenant','hidden'),
|
||||||
|
('first_lieutenant',250,499,'1st Lieutenant','hidden'),
|
||||||
|
('captain',500,749,'Captain','hidden'),
|
||||||
|
('major',750,999,'Major','hidden'),
|
||||||
|
('lieutenant_colonel',1000,1249,'Lieutenant Colonel','hidden'),
|
||||||
|
('colonel',1250,1749,'Colonel','hidden'),
|
||||||
|
('brigadier_general',1750,2499,'Brigardier General','hidden'),
|
||||||
|
('major_general',2500,4999,'Major General','hidden'),
|
||||||
|
('lieutenant_general',5000,7499,'Lieutenant General','hidden'),
|
||||||
|
('general',7500,9999,'General','hidden'),
|
||||||
|
('general_5Star',10000,14999,'5 Star General','hidden'),
|
||||||
|
('ubersoldat',15000,999999999,'The Ubersoldat','hidden');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Teams` (`game`, `code`, `name`, `hidden`, `playerlist_bgcolor`, `playerlist_color`, `playerlist_index`) VALUES
|
||||||
|
('hidden','Hidden','Subject 617', '0', '#F7FF89', '#808700', 1),
|
||||||
|
('hidden','IRIS','I.R.I.S.', '0', '#D2E8F7','#0080C0', 2),
|
||||||
|
('hidden','Spectator','Spectator','0', '#D5D5D5','#050505', 0);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Teams` SET `code`='#FF_TEAM_UNASSIGNED' WHERE `code`='SPECTATOR' and `game`='ff';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`, `kills`, `headshots`) VALUES
|
||||||
|
('ff', 'weapon_umbrella','Umbrella', 10.00, 0, 0),
|
||||||
|
('ff', 'grenade_gas','Gas Grenade', 1.00, 0, 0),
|
||||||
|
('ff', 'weapon_tommygun', 'Tommygun', 1.00, 0, 0),
|
||||||
|
('ff', 'weapon_nailgun', 'Nailgun', 1.00, 0, 0),
|
||||||
|
('hidden', 'fn2000','FN2000 Assault Rifle',1.50, 0, 0),
|
||||||
|
('hidden', 'p90','FN P90 Sub Machine Gun',2.00, 0, 0),
|
||||||
|
('hidden', 'shotgun','Remington 870 MCS Shotgun',2.00, 0, 0),
|
||||||
|
('hidden', 'fn303','FN303 Less Lethal Launcher',2.00, 0, 0),
|
||||||
|
('hidden', 'pistol','FN FiveSeven Pistol',3.00, 0, 0),
|
||||||
|
('hidden', 'pistol2','FNP-9 Pistol',3.00, 0, 0),
|
||||||
|
('hidden', 'knife','Kabar D2 Knife',2.50, 0, 0),
|
||||||
|
('hidden', 'grenade_projectile','Pipe Bomb',2.00, 0, 0),
|
||||||
|
('hidden', 'physics','Physics',3.00, 0, 0);
|
3
sql/Upgrade 1.1 - 1.2/upgrade_hlxcomm11_12.sql
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`, `count`, `object`, `event`) VALUES
|
||||||
|
('dods', 'domination', 7, 0, '', 'Domination', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('dods', 'revenge', 5, 0, '', 'Revenge', '1', '', '', '', 0, NULL, NULL);
|
226
sql/Upgrade 1.2 - 1.3/upgrade_hlxcomm12_13.sql
Normal file
|
@ -0,0 +1,226 @@
|
||||||
|
DELETE FROM `hlstats_Actions` WHERE `game`='tf' and `code` in ('Round_Win','Mini_Round_Win') and `team`='red';
|
||||||
|
|
||||||
|
UPDATE `hlstats_Actions` SET `team`='' WHERE `game`='tf' and `code` in ('Round_Win','Mini_Round_Win') and `team`='blue';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`, `count`, `object`, `event`) VALUES
|
||||||
|
('tf', 'Round_Win', 0, 10, '', 'Round Win', '', '', '1', '', 0, NULL, NULL),
|
||||||
|
('tf', 'Mini_Round_Win', 0, 5, '', 'Mini-Round Win', '', '', '1', '', 0, NULL, NULL),
|
||||||
|
('tf', 'sandvich', 0, 0, '', 'Ate a Sandvich', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('zps', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', '', 0, NULL, NULL),
|
||||||
|
('aoc', 'headshot', 2, 0, '', 'Headshot/Decapitate Kill', '1', '', '', '', 0, NULL, NULL);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`, `d_winner_id`, `d_winner_count`) VALUES
|
||||||
|
('O', 'tf', 'sandvich', 'Hungry Hungry Heavy', 'sandviches eaten.', NULL, NULL),
|
||||||
|
('W', 'zps', 'arms', 'Armed and Dangerous', 'kills with Zombie Arms', NULL, NULL),
|
||||||
|
('W', 'zps', 'carrierarms', 'Carry on...', 'kills with Carrier Arms', NULL, NULL),
|
||||||
|
('W', 'zps', 'ak47', 'AK-47', 'kills with AK-47', NULL, NULL),
|
||||||
|
('W', 'zps', 'mp5', 'MP5', 'kills with MP5', NULL, NULL),
|
||||||
|
('W', 'zps', 'revolver', 'Revolver', 'kills with Revolver', NULL, NULL),
|
||||||
|
('W', 'zps', 'glock', 'Glock 17', 'kills with Glock 17', NULL, NULL),
|
||||||
|
('W', 'zps', 'glock18c', 'Glock 18c', 'kills with Glock 18c', NULL, NULL),
|
||||||
|
('W', 'zps', 'ppk', 'PPK', 'kills with PPK', NULL, NULL),
|
||||||
|
('W', 'zps', 'usp', 'H & K USP', 'kills with H & K USP', NULL, NULL),
|
||||||
|
('W', 'zps', '870', 'Rem. 870', 'kills with Rem. 870', NULL, NULL),
|
||||||
|
('W', 'zps', 'supershorty', 'Super Shorty', 'kills with Super Shorty', NULL, NULL),
|
||||||
|
('W', 'zps', 'grenade_frag', 'Grenade', 'kills with Grenades', NULL, NULL),
|
||||||
|
('W', 'zps', 'sledgehammer', 'Sledgehammer', 'kills with Sledgehammer', NULL, NULL),
|
||||||
|
('W', 'zps', 'crowbar', 'Hello, I\'m Gordon Freeman', 'kills with Crowbar', NULL, NULL),
|
||||||
|
('W', 'zps', 'chair', 'Sorry, I thought this was \"pro\" wrestling', 'kills with Chair', NULL, NULL),
|
||||||
|
('W', 'zps', 'keyboard', 'Keyboard', 'kills with Keyboard', NULL, NULL),
|
||||||
|
('W', 'zps', 'plank', 'Plank', 'kills with Plank', NULL, NULL),
|
||||||
|
('W', 'zps', 'shovel', 'Grave Digger', 'kills with Shovel', NULL, NULL),
|
||||||
|
('W', 'zps', 'golf', 'Fore!', 'kills with Golf Club', NULL, NULL),
|
||||||
|
('W', 'zps', 'machete', 'Cuttin\' em Down', 'kills with Machete', NULL, NULL),
|
||||||
|
('W', 'zps', 'fryingpan', 'Frying Pan', 'kills with Frying Pan', NULL, NULL),
|
||||||
|
('W', 'zps', 'spanner', 'Wrench', 'kills with Wrench', NULL, NULL),
|
||||||
|
('W', 'zps', 'axe', 'Axe', 'kills with Axe', NULL, NULL),
|
||||||
|
('W', 'zps', 'tireiron', 'Tire Iron', 'kills with Tire Iron', NULL, NULL),
|
||||||
|
('W', 'zps', 'hammer', 'Hammer', 'kills with Hammer', NULL, NULL),
|
||||||
|
('W', 'zps', 'broom', 'Broom', 'kills with Broom', NULL, NULL),
|
||||||
|
('W', 'zps', 'pot', 'Pot', 'kills with Pot', NULL, NULL),
|
||||||
|
('W', 'zps', 'racket', 'Tennis Racket', 'kills with Tennis Racket', NULL, NULL),
|
||||||
|
('W', 'aoc', 'flamberge', 'Flamberge', 'kills with Flamberge', NULL, NULL),
|
||||||
|
('W', 'aoc', 'longsword', 'Longsword', 'kills with Longsword', NULL, NULL),
|
||||||
|
('W', 'aoc', 'halberd', 'Knights Halberd', 'kills with Knights Halbred', NULL, NULL),
|
||||||
|
('W', 'aoc', 'dagger', 'Daggers', 'kills with Dual Daggers', NULL, NULL),
|
||||||
|
('W', 'aoc', 'flamberge_kiteshield', 'Flamberge & Kite Shield', 'kills with Flamberge & Kite Shield', NULL, NULL),
|
||||||
|
('W', 'aoc', 'sword2', 'Shortsword', 'kills with Shortsword', NULL, NULL),
|
||||||
|
('W', 'aoc', 'warhammer', 'Warhammer', 'kills with Warhammer', NULL, NULL),
|
||||||
|
('W', 'aoc', 'mace', 'Mace', 'kills with Mace', NULL, NULL),
|
||||||
|
('W', 'aoc', 'mace_buckler', 'Mace & Buckler', 'kills with Mace & Buckler', NULL, NULL),
|
||||||
|
('W', 'aoc', 'sword01_evil_shield', 'Mason Broadsword & Shield', 'kills with Mason Broadsword & Shield', NULL, NULL),
|
||||||
|
('W', 'aoc', 'crossbow', 'Crossbow', 'kills with Crossbow', NULL, NULL),
|
||||||
|
('W', 'aoc', 'longbow', 'Longbow', 'kills with Longbow', NULL, NULL),
|
||||||
|
('W', 'aoc', 'longsword_kiteshield', 'Longsword & Kite Shield', 'kills with Longsword & Kite Shield', NULL, NULL),
|
||||||
|
('W', 'aoc', 'sword01_good_shield', 'Knights Broadsword & Shield', 'kills with Knights Broadsword & Shield', NULL, NULL),
|
||||||
|
('W', 'aoc', 'onehandaxe', 'Hatchet', 'kills with Hatchet', NULL, NULL),
|
||||||
|
('W', 'aoc', 'doubleaxe', 'Battle Axe', 'kills with Battle Axe', NULL, NULL),
|
||||||
|
('W', 'aoc', 'flail_evil_shield', 'Mason Flail & Shield', 'kills with Mason Flail & Shield', NULL, NULL),
|
||||||
|
('W', 'aoc', 'flail_good_shield', 'Knights Flail & Shield', 'kills with Knights Flail & Shield', NULL, NULL),
|
||||||
|
('W', 'aoc', 'thrown_spear', 'Javelin', 'kills with Javelin', NULL, NULL),
|
||||||
|
('W', 'aoc', 'shortsword', 'Spiked Mace', 'kills with Spiked Mace', NULL, NULL),
|
||||||
|
('W', 'aoc', 'spear_buckler', 'Knights Spear & Buckler', 'kills with Knights Spear & Buckler', NULL, NULL),
|
||||||
|
('W', 'aoc', 'spikedmace_buckler', 'Spiked Mace & Buckler', 'kills with Spiked Mace & Buckler', NULL, NULL),
|
||||||
|
('W', 'aoc', 'dagger2', 'Dagger', 'kills with Dagger', NULL, NULL),
|
||||||
|
('W', 'aoc', 'mtest', 'Footman Longsward', 'kills with Footman Longsword', NULL, NULL),
|
||||||
|
('W', 'aoc', 'thrown_dagger2', 'Thrown Dagger', 'kills with Thrown Dagger', NULL, NULL),
|
||||||
|
('W', 'aoc', 'spear_buckler2', 'Spiked Mace & Buckler', 'kills with Spiked Mace & Buckler', NULL, NULL),
|
||||||
|
('W', 'aoc', 'evil_halberd', 'Mason Halberd', 'kills with Mason Halberd', NULL, NULL),
|
||||||
|
('W', 'aoc', 'env_explosion', 'Fire', 'kills with Fire', NULL, NULL),
|
||||||
|
('W', 'aoc', 'oilpot', 'Oil Pot', 'kills with Oil Pot', NULL, NULL),
|
||||||
|
('O', 'aoc', 'headshot', 'Headshot/Decapitation', 'Headshots and Decapitations', NULL, NULL);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games` (`code`, `name`, `hidden`) VALUES
|
||||||
|
('zps','Zombie Panic! Source','1'),
|
||||||
|
('aoc','Age of Chivalry','1');
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_PerlConfig` WHERE `parameter` IN ('HLStatsXCountryMaster','MasterBanlistBantime');
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_PerlConfig_Default` WHERE `parameter` IN ('HLStatsXCountryMaster','MasterBanlistBantime');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ranks` (`image`, `minKills`, `maxKills`, `rankName`, `game`) VALUES
|
||||||
|
('recruit',0,49,'Recruit','zps'),
|
||||||
|
('private',50,99,'Private','zps'),
|
||||||
|
('private_firstclass',100,149,'Private First Class','zps'),
|
||||||
|
('second_lieutenant',150,249,'2nd Lieutenant','zps'),
|
||||||
|
('first_lieutenant',250,499,'1st Lieutenant','zps'),
|
||||||
|
('captain',500,749,'Captain','zps'),
|
||||||
|
('major',750,999,'Major','zps'),
|
||||||
|
('lieutenant_colonel',1000,1249,'Lieutenant Colonel','zps'),
|
||||||
|
('colonel',1250,1749,'Colonel','zps'),
|
||||||
|
('brigadier_general',1750,2499,'Brigardier General','zps'),
|
||||||
|
('major_general',2500,4999,'Major General','zps'),
|
||||||
|
('lieutenant_general',5000,7499,'Lieutenant General','zps'),
|
||||||
|
('general',7500,9999,'General','zps'),
|
||||||
|
('general_5Star',10000,14999,'5 Star General','zps'),
|
||||||
|
('ubersoldat',15000,999999999,'The Ubersoldat','zps'),
|
||||||
|
('recruit',0,49,'Recruit','aoc'),
|
||||||
|
('private',50,99,'Private','aoc'),
|
||||||
|
('private_firstclass',100,149,'Private First Class','aoc'),
|
||||||
|
('second_lieutenant',150,249,'2nd Lieutenant','aoc'),
|
||||||
|
('first_lieutenant',250,499,'1st Lieutenant','aoc'),
|
||||||
|
('captain',500,749,'Captain','aoc'),
|
||||||
|
('major',750,999,'Major','aoc'),
|
||||||
|
('lieutenant_colonel',1000,1249,'Lieutenant Colonel','aoc'),
|
||||||
|
('colonel',1250,1749,'Colonel','aoc'),
|
||||||
|
('brigadier_general',1750,2499,'Brigardier General','aoc'),
|
||||||
|
('major_general',2500,4999,'Major General','aoc'),
|
||||||
|
('lieutenant_general',5000,7499,'Lieutenant General','aoc'),
|
||||||
|
('general',7500,9999,'General','aoc'),
|
||||||
|
('general_5Star',10000,14999,'5 Star General','aoc'),
|
||||||
|
('ubersoldat',15000,999999999,'The Ubersoldat','aoc');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Roles` (`game`, `code`, `name`, `hidden`, `picked`, `kills`, `deaths`) VALUES
|
||||||
|
('ff','Engineer','Engineer','0',0,0,0),
|
||||||
|
('ff','Spy','Spy','0',0,0,0),
|
||||||
|
('ff','Soldier','Soldier','0',0,0,0),
|
||||||
|
('ff','Scout','Scout','0',0,0,0),
|
||||||
|
('ff','Demoman','Demo Man','0',0,0,0),
|
||||||
|
('ff','Sniper','Sniper','0',0,0,0),
|
||||||
|
('ff','Medic','Medic','0',0,0,0),
|
||||||
|
('ff','Pyro','Pyro','0',0,0,0),
|
||||||
|
('ff','HWGuy','HWGuy','0',0,0,0),
|
||||||
|
('ff','Civilian','Civilian','0',0,0,0);
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Servers_Config` WHERE `parameter` IN ('MasterServerData','MasterServerInterval','RawSocketSupport','RawSocketHelpNotice');
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Servers_Config_Default` WHERE `parameter` IN ('MasterServerData','MasterServerInterval','RawSocketSupport','RawSocketHelpNotice');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers`
|
||||||
|
ADD COLUMN `lat` varchar(32) NOT NULL default '',
|
||||||
|
ADD COLUMN `lng` varchar(32) NOT NULL default '',
|
||||||
|
ADD COLUMN `city` varchar(128) NOT NULL default '',
|
||||||
|
ADD COLUMN `country` varchar(128) NOT NULL default '';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Teams` (`game`, `code`, `name`, `hidden`, `playerlist_bgcolor`, `playerlist_color`, `playerlist_index`) VALUES
|
||||||
|
('zps','Undead','Undead', '0', '#F7FF89', '#808700', 1),
|
||||||
|
('zps','Survivor','Survivors', '0', '#D2E8F7','#0080C0', 2),
|
||||||
|
('zps','Spectator','Spectator','0', '#D5D5D5','#050505', 0),
|
||||||
|
('aoc','The Mason Order','The Mason Order','','#FFD5D5','#FF2D2D',2),
|
||||||
|
('aoc','Agathia Knights','Agathia Knights','','#D2E8F7','#0080C0',1),
|
||||||
|
('aoc','Spectator','Spectator','0', '#D5D5D5','#050505', 0);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`, `kills`, `headshots`) VALUES
|
||||||
|
('zps', 'arms','Zombie',1, 0, 0),
|
||||||
|
('zps', 'carrierarms','Carrier',1, 0, 0),
|
||||||
|
('zps', 'ak47','AK-47',1, 0, 0),
|
||||||
|
('zps', 'mp5','MP5',1, 0, 0),
|
||||||
|
('zps', 'revolver','Revolver',1, 0, 0),
|
||||||
|
('zps', 'glock','Glock 17',1, 0, 0),
|
||||||
|
('zps', 'glock18c','Glock 18c',1, 0, 0),
|
||||||
|
('zps', 'ppk','Walther PPK',1, 0, 0),
|
||||||
|
('zps', 'usp','Heckler & Kock USP',1, 0, 0),
|
||||||
|
('zps', '870','Remington 870',1, 0, 0),
|
||||||
|
('zps', 'supershorty','Mossberg Super Shorty',1, 0, 0),
|
||||||
|
('zps', 'grenade_frag','Grenade',1, 0, 0),
|
||||||
|
('zps', 'sledgehammer','Sledgehammer',1.5, 0, 0),
|
||||||
|
('zps', 'crowbar','Crowbar',1.5, 0, 0),
|
||||||
|
('zps', 'chair','Chair',1.5, 0, 0),
|
||||||
|
('zps', 'keyboard','Keyboard',1.5, 0, 0),
|
||||||
|
('zps', 'plank','Wooden Plank',1.5, 0, 0),
|
||||||
|
('zps', 'shovel','Shovel',1.5, 0, 0),
|
||||||
|
('zps', 'golf','Golf Club',1.5, 0, 0),
|
||||||
|
('zps', 'machete','Machete',1.5, 0, 0),
|
||||||
|
('zps', 'fryingpan','Frying Pan',1.5, 0, 0),
|
||||||
|
('zps', 'spanner','Wrench',1.5, 0, 0),
|
||||||
|
('zps', 'axe','Axe',1.5, 0, 0),
|
||||||
|
('zps', 'tireiron','Tire Iron',1.5, 0, 0),
|
||||||
|
('zps', 'hammer','Hammer',1.5, 0, 0),
|
||||||
|
('zps', 'broom','Broom',1.5, 0, 0),
|
||||||
|
('zps', 'pot','Pot',1.5, 0, 0),
|
||||||
|
('zps', 'world','World',1.5, 0, 0),
|
||||||
|
('zps', 'physics','Physics',1.5, 0, 0),
|
||||||
|
('zps', 'racket','Tennis Racket',1.5, 0, 0),
|
||||||
|
('zps', 'torque','Torque', 1.5, 0, 0),
|
||||||
|
('aoc', 'flamberge','Flamberge',1, 0, 0),
|
||||||
|
('aoc', 'longsword','Longsword',1, 0, 0),
|
||||||
|
('aoc', 'halberd','Knights Halberd',1, 0, 0),
|
||||||
|
('aoc', 'dagger','Dual Daggers',1, 0, 0),
|
||||||
|
('aoc', 'flamberge_kiteshield', 'Flamberge & Kite Shield', 1, 0, 0),
|
||||||
|
('aoc', 'world','World',1, 0, 0),
|
||||||
|
('aoc', 'chivalry','Chivalry',1, 0, 0),
|
||||||
|
('aoc', 'sword2','Shortsword',1, 0, 0),
|
||||||
|
('aoc', 'warhammer','Warhammer',1, 0, 0),
|
||||||
|
('aoc', 'mace','Mace',1, 0, 0),
|
||||||
|
('aoc', 'mace_buckler','Mace & Buckler',1, 0, 0),
|
||||||
|
('aoc', 'sword01_evil_shield', 'Mason Broadsword & Shield', 1, 0, 0),
|
||||||
|
('aoc', 'crossbow','Crossbow',1, 0, 0),
|
||||||
|
('aoc', 'longbow','Longbow',1, 0, 0),
|
||||||
|
('aoc', 'longsword_kiteshield', 'Longsword & Kite Shield', 1, 0, 0),
|
||||||
|
('aoc', 'sword01_good_shield', 'Knights Broadsword & Shield', 1, 0, 0),
|
||||||
|
('aoc', 'onehandaxe', 'Hatchet', 1, 0, 0),
|
||||||
|
('aoc', 'doubleaxe','Battle Axe',1, 0, 0),
|
||||||
|
('aoc', 'flail_evil_shield','Mason Flail & Shield',1, 0, 0),
|
||||||
|
('aoc', 'flail_good_shield','Knights Flail & Shield',1, 0, 0),
|
||||||
|
('aoc', 'thrown_spear', 'Javelin', 1, 0, 0),
|
||||||
|
('aoc', 'spear_buckler', 'Knights Spear & Buckler', 1, 0, 0),
|
||||||
|
('aoc', 'dagger2', 'Dagger', 1, 0, 0),
|
||||||
|
('aoc', 'mtest', 'Footman Longsword', 1, 0, 0),
|
||||||
|
('aoc', 'thrown_dagger2', 'Thrown Dagger', 1, 0, 0),
|
||||||
|
('aoc', 'spear_buckler2', 'Mason Spear & Buckler', 1, 0, 0),
|
||||||
|
('aoc', 'shortsword', 'Spiked Mace', 1, 0, 0),
|
||||||
|
('aoc', 'spikedmace_buckler','Spiked Mace & Buckler',1, 0, 0),
|
||||||
|
('aoc', 'evil_halberd', 'Mason Halberd', 1, 0, 0),
|
||||||
|
('aoc', 'env_explosion', 'Fire', 1, 4, 0),
|
||||||
|
('aoc', 'oilpot', 'Oil Pot', 1, 1, 0);
|
1486
sql/Upgrade 1.3 - 1.4/upgrade_hlxcomm_13_14.sql
Normal file
834
sql/Upgrade 1.4 or 1.4.1 to 1.5/upgrade_hlxcomm_14_15.sql
Normal file
|
@ -0,0 +1,834 @@
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'flagevent_defended' WHERE `code` = 'flagevent' AND `event` = 'defended' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'flagevent_captured' WHERE `code` = 'flagevent' AND `event` = 'captured' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'flagevent_dropped', `description` = 'Dropped the flag (while alive)' WHERE `code` = 'flagevent' AND `event` = 'dropped' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'flagevent_picked_up' WHERE `code` = 'flagevent' AND `event` = 'picked up' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'killedobject_obj_teleporter_exit' WHERE `code` = 'killedobject' AND `object` = 'OBJ_TELEPORTER_EXIT' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'killedobject_obj_teleporter_entrance' WHERE `code` = 'killedobject' AND `object` = 'OBJ_TELEPORTER_ENTRANCE' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'killedobject_obj_dispenser' WHERE `code` = 'killedobject' AND `object` = 'OBJ_DISPENSER' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'killedobject_obj_sentrygun' WHERE `code` = 'killedobject' AND `object` = 'OBJ_SENTRYGUN' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'killedobject_obj_attachment_sapper' WHERE `code` = 'killedobject' AND `object` = 'OBJ_ATTACHMENT_SAPPER' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'builtobject_obj_teleporter_exit' WHERE `code` = 'builtobject' AND `object` = 'OBJ_TELEPORTER_EXIT' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'builtobject_obj_teleporter_entrance' WHERE `code` = 'builtobject' AND `object` = 'OBJ_TELEPORTER_ENTRANCE' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'builtobject_obj_dispenser' WHERE `code` = 'builtobject' AND `object` = 'OBJ_DISPENSER' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'builtobject_obj_sentrygun' WHERE `code` = 'builtobject' AND `object` = 'OBJ_SENTRYGUN' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'builtobject_obj_attachment_sapper' WHERE `code` = 'builtobject' AND `object` = 'OBJ_ATTACHMENT_SAPPER' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'owner_killedobject_obj_teleporter_exit' WHERE `code` = 'owner_killedobject' AND `object` = 'OBJ_TELEPORTER_EXIT' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'owner_killedobject_obj_teleporter_entrance' WHERE `code` = 'owner_killedobject' AND `object` = 'OBJ_TELEPORTER_ENTRANCE' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'owner_killedobject_obj_dispenser' WHERE `code` = 'owner_killedobject' AND `object` = 'OBJ_DISPENSER' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
UPDATE `hlstats_Actions` SET `code` = 'owner_killedobject_obj_sentrygun' WHERE `code` = 'owner_killedobject' AND `object` = 'OBJ_SENTRYGUN' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Actions`
|
||||||
|
DROP KEY `gamecode`,
|
||||||
|
DROP COLUMN `object`,
|
||||||
|
DROP COLUMN `event`,
|
||||||
|
ADD UNIQUE KEY `gamecode` (`code`,`game`,`team`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`) VALUES
|
||||||
|
('tf', 'flagevent_dropped_death', 0, 0, '', 'Dropped the flag (on death)', '1', '', '', ''),
|
||||||
|
('tf', 'crit_kill', -1, 0, '', 'Critical Kill', '1', '', '', ''),
|
||||||
|
('tf', 'force_suicide', 0, 0, '', 'Force Suicide', '1', '', '', ''),
|
||||||
|
('tf', 'hit_by_train', 0, 0, '', 'LOL TRAIN\'D', '1', '', '', ''),
|
||||||
|
('tf', 'drowned', 0, 0, '', 'Drowned', '1', '', '', ''),
|
||||||
|
('tf', 'owner_killedobject_obj_attachment_sapper', -2, 0, '', 'Console-killed sapper', '1', '', '', ''),
|
||||||
|
('tfc','Sentry_Dismantle',3,0,'0','Dismantled Sentry Gun','0','1','0','0'),
|
||||||
|
('tfc','Dispenser_Dismantle',3,0,'0','Dismantled Dispenser','0','1','0','0'),
|
||||||
|
('l4d', 'headshot', 0, 0, '', 'Headshot Kill', '1', '', '', ''),
|
||||||
|
('l4d', 'rescued_survivor', 2, 0, '', 'Rescued Teammate', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'healed_teammate', 5, 0, '', 'Healed Teammate', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'revived_teammate', 3, 0, '', 'Revived Teammate', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'startled_witch', -5, 0, '', 'Startled the Witch', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'pounce', 6, 0, '', '(Hunter) Pounced on Survivor', '0', '1', '0', '0'),
|
||||||
|
('l4d', 'tongue_grab', 6, 0, '', '(Smoker) Tongue Grabbed Survivor', '0', '1', '0', '0'),
|
||||||
|
('l4d', 'vomit', 6, 0, '', '(Boomer) Vomited on Survivor', '0', '1', '0', '0'),
|
||||||
|
('l4d', 'killed_gas', 1, 0, '', 'Killed a Smoker', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'killed_exploding', 1, 0, '', 'Killed a Boomer', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'killed_hunter', 1, 0, '', 'Killed a Hunter', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'killed_tank', 3, 0, '', 'Killed a Tank', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'killed_witch', 3, 0, '', 'Killed a Witch', '1', '0', '0', '0'),
|
||||||
|
('l4d', 'killed_survivor', 25, 0, '', 'Incapacitated/Killed Survivor', '0', '1', '0', '0'),
|
||||||
|
('l4d', 'friendly_fire', -10, 0, '', 'Friendly Fire', '1', '0', '0', '0'),
|
||||||
|
('ff', 'sentrygun_upgraded', 1, 0, '', 'Upgraded Sentry Gun', '1', '', '', ''),
|
||||||
|
('ff', 'build_sentrygun', 1, 0, '', 'Built Sentry Gun', '1', '', '', ''),
|
||||||
|
('ff', 'build_dispenser', 1, 0, '', 'Built Dispenser', '1', '', '', ''),
|
||||||
|
('ff', 'dispenser_detonated', -1, 0, '', 'Dispenser Detonated', '1', '', '', ''),
|
||||||
|
('ff', 'sentry_detonated', -1, 0, '', 'Sentry Gun Detonated', '1', '', '', ''),
|
||||||
|
('ff', 'sentry_dismantled', -1, 0, '', 'Sentry Gun Dismantled', '1', '', '', ''),
|
||||||
|
('ff', 'dispenser_dismantled', -1, 0, '', 'Dispenser Dismantled', '1', '', '', ''),
|
||||||
|
('ff', 'build_mancannon', 1, 0, '', 'Built Jump Pad', '1', '', '', ''),
|
||||||
|
('ff', 'mancannon_detonated', -1, 0, '', 'Detonated Jump Pad', '1', '', '', ''),
|
||||||
|
('ff', 'build_detpack', 1, 0, '', 'Placed Detpack', '1', '', '', ''),
|
||||||
|
('ff', 'flag_touch', 3, 0, '', 'Flag Picked Up', '1', '', '', ''),
|
||||||
|
('ff', 'flag_capture', 3, 0, '', 'Flag Captured', '1', '', '', ''),
|
||||||
|
('ff', 'flag_dropped', -3, 0, '', 'Flag Dropped', '1', '', '', ''),
|
||||||
|
('ff', 'flag_thrown', -3, 0, '', 'Flag Thrown', '1', '', '', ''),
|
||||||
|
('ff', 'disguise_lost', 1, 0, '', 'Uncovered Enemy', '', '1', '', ''),
|
||||||
|
('fof', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', ''),
|
||||||
|
('fof', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', ''),
|
||||||
|
('fof', 'loot_drop', -2, 0, '', 'Dropped the loot', '1', '', '', ''),
|
||||||
|
('fof', 'loot_capture', 8, 0, '', 'Captured the loot', '1', '', '', ''),
|
||||||
|
('fof', 'carrier_protect', 5, 0, '', 'Protected the carrier', '1', '', '', ''),
|
||||||
|
('fof', 'headshot', 1, 0, '', 'Headshot Kill', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', ''),
|
||||||
|
('ges', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', ''),
|
||||||
|
('ges', 'Round_Win', 5, 0, '', 'Round Win', '1', '', '', ''),
|
||||||
|
('ges', 'Round_Win_Team', 0, 3, '', 'Team Round Win', '', '', '1', '');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Awards` CHANGE `awardType` `awardType` CHAR( 1 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'W';
|
||||||
|
|
||||||
|
UPDATE `hlstats_Awards` SET `code` = 'weapon_fnfal' WHERE `code`='weapon_fnfa1' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`) VALUES
|
||||||
|
('O', 'l4d', 'headshot', 'Brain Salad', 'headshot kills'),
|
||||||
|
('O', 'l4d', 'healed_teammate', 'Field Medic', 'healed Survivors'),
|
||||||
|
('O', 'l4d', 'killed_exploding', 'Stomach Upset', 'killed Boomers'),
|
||||||
|
('O', 'l4d', 'killed_gas', 'No Smoking Section', 'killed Smokers'),
|
||||||
|
('O', 'l4d', 'killed_hunter', 'Hunter Punter', 'killed Hunters'),
|
||||||
|
('P', 'l4d', 'killed_survivor', 'Dead Wreckening', 'downed Survivors'),
|
||||||
|
('O', 'l4d', 'killed_tank', 'Tankbuster', 'killed Tanks'),
|
||||||
|
('O', 'l4d', 'killed_witch', 'Inquisitor', 'killed Witches'),
|
||||||
|
('P', 'l4d', 'pounce', 'Free to Fly', 'pounced Survivors'),
|
||||||
|
('O', 'l4d', 'rescued_survivor', 'Ground Cover', 'rescued Survivors'),
|
||||||
|
('O', 'l4d', 'revived_teammate', 'Helping Hand', 'revived Survivors'),
|
||||||
|
('P', 'l4d', 'tongue_grab', 'Drag & Drop', 'constricted Survivors'),
|
||||||
|
('P', 'l4d', 'vomit', 'Barf Bagged', 'vomited on Survivors'),
|
||||||
|
('W', 'l4d', 'autoshotgun', 'Automation', 'kills with Auto Shotgun'),
|
||||||
|
('W', 'l4d', 'boomer_claw', 'Boom!', 'kills with Boomer\'s Claws'),
|
||||||
|
('W', 'l4d', 'dual_pistols', 'Akimbo Assassin', 'kills with Dual Pistols'),
|
||||||
|
('W', 'l4d', 'hunter_claw', 'Open Season', 'kills with Hunter\'s Claws'),
|
||||||
|
('W', 'l4d', 'hunting_rifle', 'Hawk Eye', 'kills with Hunting Rifle'),
|
||||||
|
('W', 'l4d', 'inferno', 'Pyromaniac', 'cremated Infected'),
|
||||||
|
('W', 'l4d', 'pipe_bomb', 'Pyrotechnician', 'blown up Infected'),
|
||||||
|
('W', 'l4d', 'pistol', 'Ammo Saver', 'kills with Pistol'),
|
||||||
|
('W', 'l4d', 'prop_minigun', 'No-One Left Behind', 'kills with Mounted Machine Gun'),
|
||||||
|
('W', 'l4d', 'pumpshotgun', 'Pump It!', 'kills with Pump Shotgun'),
|
||||||
|
('W', 'l4d', 'rifle', 'Commando', 'kills with M16 Assault Rifle'),
|
||||||
|
('W', 'l4d', 'smg', 'Safety First', 'kills with Uzi'),
|
||||||
|
('W', 'l4d', 'smoker_claw', 'Chain Smoker', 'kills with Smoker\'s Claws'),
|
||||||
|
('W', 'l4d', 'tank_claw', 'Burger Tank', 'kills with Tank\'s Claws'),
|
||||||
|
('W', 'l4d', 'tank_rock', 'Rock Star', 'kills with Tank\'s Rock'),
|
||||||
|
('W', 'l4d', 'latency', 'Lowest Ping', 'ms average connection'),
|
||||||
|
('W', 'fof', 'deringer', 'Deringer', 'kills with Deringer'),
|
||||||
|
('W', 'fof', 'carbine', 'Carbine', 'kills with Carbine'),
|
||||||
|
('W', 'fof', 'coltnavy', 'Colt Navy', 'kills with Colt Navy'),
|
||||||
|
('W', 'fof', 'bow', 'Bow', 'kills with Bow'),
|
||||||
|
('W', 'fof', 'arrow', 'Arrow', 'kills with Arrow'),
|
||||||
|
('W', 'fof', 'sharps', 'Sharps', 'kills with Sharps'),
|
||||||
|
('W', 'fof', 'coachgun', 'Coach Gun', 'kills with Coach Gun'),
|
||||||
|
('W', 'fof', 'peacemaker', 'Peacemaker', 'kills with Peacemaker'),
|
||||||
|
('W', 'fof', 'knife', 'Knife', 'kills with Knife'),
|
||||||
|
('W', 'fof', 'dualderinger', 'Dual Deringers', 'kills with Dual Deringers'),
|
||||||
|
('W', 'fof', 'thrown_axe', 'Thrown Axe', 'kills with Thrown Axe'),
|
||||||
|
('W', 'fof', 'arrow_fiery', 'Fire Arrow', 'kills with Fire Arrow'),
|
||||||
|
('W', 'fof', 'thrown_knife', 'Thrown Knife', 'kills with Thrown Knife'),
|
||||||
|
('W', 'fof', 'dualnavy', 'Dual Colt Navys', 'kills with Dual Colt Navys'),
|
||||||
|
('W', 'fof', 'dynamite', 'Dynamite', 'kills with Dynamite'),
|
||||||
|
('W', 'fof', 'explosive_arrow', 'Explosive Arrow', 'kills with Explosive Arrows'),
|
||||||
|
('W', 'fof', 'fists', 'Fists', 'kills with Fists'),
|
||||||
|
('W', 'fof', 'axe', 'Axe', 'kills with Axe'),
|
||||||
|
('W', 'fof', 'dualpeacemaker', 'Dual Peacemakers', 'kills with Dual Peacemakers'),
|
||||||
|
('W', 'fof', 'henryrifle', 'Henry Rifle', 'kills with Henry Rifle'),
|
||||||
|
('W', 'fof', 'whiskey', 'Whiskey', 'kills with Whiskey'),
|
||||||
|
('O', 'fof', 'loot_drop', 'Butter Fingers', 'Loot Drops'),
|
||||||
|
('O', 'fof', 'loot_capture', 'Gimme all yo loot', 'Loot Captures'),
|
||||||
|
('O', 'fof', 'carrier_protect', 'Grand Protector', 'carrier protections'),
|
||||||
|
('O', 'fof', 'headshot', 'BOOM HEADSHOT','headshot kills'),
|
||||||
|
('W', 'fof', 'latency', 'Lowest Ping','ms average connection'),
|
||||||
|
('W', 'ges', '#GE_ProximityMine', 'Proximity Mines', 'kills with Proximity Mines'),
|
||||||
|
('W', 'ges', '#GE_AutoShotgun', 'Automatic Shotgun', 'kills with Automatic Shotgun'),
|
||||||
|
('W', 'ges', '#GE_Phantom', 'Phantom', 'kills with Phantom'),
|
||||||
|
('W', 'ges', '#GE_Knife', 'Knife', 'kills with Hunting Knife'),
|
||||||
|
('W', 'ges', '#GE_D5K', 'D5K', 'kills with D5K Deutsche'),
|
||||||
|
('W', 'ges', '#GE_SilverPP7', 'Silver PP7', 'kills with Silver PP7'),
|
||||||
|
('W', 'ges', '#GE_DD44', 'DD44', 'kills with DD44'),
|
||||||
|
('W', 'ges', '#GE_Grenade', 'Grenade', 'kills with Grenades'),
|
||||||
|
('W', 'ges', '#GE_CougarMagnum', 'Cougar Magnum', 'kills with Cougar Magnum'),
|
||||||
|
('W', 'ges', '#GE_D5K_SILENCED', 'Silenced D5K', 'kills with D5K (Silenced)'),
|
||||||
|
('W', 'ges', '#GE_Shotgun', 'Shotgun', 'kills with Shotgun'),
|
||||||
|
('W', 'ges', '#GE_Klobb', 'Klobb', 'kills with Klobb'),
|
||||||
|
('W', 'ges', '#GE_RCP90', 'RC-P90', 'kills with RC-P90'),
|
||||||
|
('W', 'ges', '#GE_RemoteMine', 'Remote Mines', 'kills with Remote Mines'),
|
||||||
|
('W', 'ges', '#GE_KF7Soviet', 'KF7 Soviet', 'kills with KF7 Soviet'),
|
||||||
|
('W', 'ges', '#GE_ZMG', 'ZMG', 'kills with ZMG'),
|
||||||
|
('W', 'ges', '#GE_SniperRifle', 'Sniper Rifle', 'kills with Sniper Rifle'),
|
||||||
|
('W', 'ges', '#GE_GoldPP7', 'Golden PP7', 'kills with Golden PP7'),
|
||||||
|
('W', 'ges', '#GE_AR33', 'AR33', 'kills with US AR33 Assault'),
|
||||||
|
('W', 'ges', '#GE_GoldenGun', 'Golden Gun', 'kills with Golden Gun'),
|
||||||
|
('W', 'ges', '#GE_ThrowingKnife', 'Thorwing Knives', 'kills with Throwing Knives'),
|
||||||
|
('W', 'ges', '#GE_PP7', 'PP7', 'kills with PP7'),
|
||||||
|
('W', 'ges', '#GE_PP7_SILENCED', 'Silenced PP7', 'kills with PP7 (Silenced)'),
|
||||||
|
('W', 'ges', '#GE_TimedMine', 'Timed Mines', 'kills with Timed Mines'),
|
||||||
|
('W', 'ges', '#GE_MilitaryLaser', 'Military Laser', 'kills with Military Laser'),
|
||||||
|
('W', 'ges', '#GE_GrenadeLauncher', 'Grenade Launcher', 'kills with Grenade Launcher'),
|
||||||
|
('W', 'ges', '#GE_Rocket', 'Rocket Launcher', 'kills with Rocket Launcher'),
|
||||||
|
('W', 'ges', '#GE_Taser', 'Taser', 'kills with Taser'),
|
||||||
|
('W', 'ges', '#GE_SniperButt', 'Sniper Butt', 'kills with Sniper Butt'),
|
||||||
|
('W', 'ges', '#GE_Slapper', 'Slapper', 'kills with Slappers'),
|
||||||
|
('W', 'ges', '#GE_RocketLauncher', ', Rocket Launcher', 'kills with Rocket Launcher'),
|
||||||
|
('W', 'ges', 'latency', 'Lowest Ping','ms average connection');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',`code`,'flagevent_defended','Defender of the Flag','flag defenses' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',`code`,'flagevent_captured','The Mad Capper','flag captures' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',`code`,'killedobject_obj_dispenser','NO METAL FOR YOU!','dispensers destroyed' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',`code`,'killedobject_obj_sentrygun','Say no to sentries','sentry guns destoryed' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',`code`,'builtobject_obj_sentrygun','Bob the Builder','sentry guns built' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Admin`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_ChangeName`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_ChangeRole`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `role` `role` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_ChangeTeam`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `team` `team` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Chat`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Connects`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Disconnects`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Entries`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Frags`
|
||||||
|
DROP INDEX `map`,
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `weapon` `weapon` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `killerRole` `killerRole` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `victimRole` `victimRole` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
ADD INDEX ( `serverId` ),
|
||||||
|
ADD INDEX ( `headshot` ),
|
||||||
|
ADD INDEX ( `map` ( 5 ) );
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Frags` SET `weapon` = 'weapon_fnfal' WHERE `weapon` = 'weapon_fnfa1' AND serverId IN (SELECT serverId FROM `hlstats_Servers` WHERE `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod'));
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Latency`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_PlayerActions`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_PlayerPlayerActions`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Rcon`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `password` `password` VARCHAR( 128 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Statsme`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `weapon` `weapon` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Statsme2`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `weapon` `weapon` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_StatsmeLatency`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_StatsmeTime`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Suicides`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `weapon` `weapon` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Suicides` SET `weapon` = 'weapon_fnfal' WHERE `weapon` = 'weapon_fnfa1' AND serverId IN (SELECT serverId FROM `hlstats_Servers` WHERE `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod'));
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_TeamBonuses`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Teamkills`
|
||||||
|
CHANGE `map` `map` VARCHAR( 64 ) NOT NULL default '',
|
||||||
|
CHANGE `weapon` `weapon` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Teamkills` SET `weapon` = 'weapon_fnfal' WHERE `weapon` = 'weapon_fnfa1' AND serverId IN (SELECT serverId FROM `hlstats_Servers` WHERE `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod'));
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games` (`code`, `name`, `realgame`, `hidden`) VALUES
|
||||||
|
('l4d', 'Left 4 Dead', 'l4d', '1'),
|
||||||
|
('fof', 'Fistful of Frags', 'fof', '1'),
|
||||||
|
('ges', 'GoldenEye: Source', 'ges', '1');
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Games_Defaults` WHERE `parameter` = 'AdminContact';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`) VALUES
|
||||||
|
('l4d', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('l4d', 'GameEngine', '3'),
|
||||||
|
('l4d', 'AddressPort', '0.0.0.0:27015'),
|
||||||
|
('l4d', 'Admins', ''),
|
||||||
|
('l4d', 'AutoBanRetry', '0'),
|
||||||
|
('l4d', 'AutoTeamBalance', '0'),
|
||||||
|
('l4d', 'BonusRoundIgnore', '0'),
|
||||||
|
('l4d', 'BonusRoundTime', '0'),
|
||||||
|
('l4d', 'BroadCastEvents', '0'),
|
||||||
|
('l4d', 'BroadCastPlayerActions', '0'),
|
||||||
|
('l4d', 'EnablePublicCommands', '0'),
|
||||||
|
('l4d', 'GameType', '0'),
|
||||||
|
('l4d', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('l4d', 'IgnoreBots', '0'),
|
||||||
|
('l4d', 'MinimumPlayersRank', '0'),
|
||||||
|
('l4d', 'MinPlayers', '1'),
|
||||||
|
('l4d', 'PlayerEvents', '1'),
|
||||||
|
('l4d', 'ShowStats', '1'),
|
||||||
|
('l4d', 'SkillMode', '0'),
|
||||||
|
('l4d', 'SuicidePenalty', '5'),
|
||||||
|
('l4d', 'SwitchAdmins', '0'),
|
||||||
|
('l4d', 'TKPenalty', '25'),
|
||||||
|
('l4d', 'TrackServerLoad', '1'),
|
||||||
|
('fof', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('fof', 'GameEngine', '3'),
|
||||||
|
('fof', 'AddressPort', '0.0.0.0:27015'),
|
||||||
|
('fof', 'Admins', ''),
|
||||||
|
('fof', 'AutoBanRetry', '0'),
|
||||||
|
('fof', 'AutoTeamBalance', '0'),
|
||||||
|
('fof', 'BonusRoundIgnore', '0'),
|
||||||
|
('fof', 'BonusRoundTime', '0'),
|
||||||
|
('fof', 'BroadCastEvents', '1'),
|
||||||
|
('fof', 'BroadCastPlayerActions', '1'),
|
||||||
|
('fof', 'EnablePublicCommands', '1'),
|
||||||
|
('fof', 'GameType', '0'),
|
||||||
|
('fof', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('fof', 'IgnoreBots', '1'),
|
||||||
|
('fof', 'MinimumPlayersRank', '0'),
|
||||||
|
('fof', 'MinPlayers', '4'),
|
||||||
|
('fof', 'PlayerEvents', '1'),
|
||||||
|
('fof', 'ShowStats', '1'),
|
||||||
|
('fof', 'SkillMode', '0'),
|
||||||
|
('fof', 'SuicidePenalty', '5'),
|
||||||
|
('fof', 'SwitchAdmins', '0'),
|
||||||
|
('fof', 'TKPenalty', '25'),
|
||||||
|
('fof', 'TrackServerLoad', '1'),
|
||||||
|
('ges', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('ges', 'GameEngine', '3'),
|
||||||
|
('ges', 'AddressPort', '0.0.0.0:27015'),
|
||||||
|
('ges', 'Admins', ''),
|
||||||
|
('ges', 'AutoBanRetry', '0'),
|
||||||
|
('ges', 'AutoTeamBalance', '0'),
|
||||||
|
('ges', 'BonusRoundIgnore', '0'),
|
||||||
|
('ges', 'BonusRoundTime', '0'),
|
||||||
|
('ges', 'BroadCastEvents', '1'),
|
||||||
|
('ges', 'BroadCastPlayerActions', '1'),
|
||||||
|
('ges', 'EnablePublicCommands', '1'),
|
||||||
|
('ges', 'GameType', '0'),
|
||||||
|
('ges', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('ges', 'IgnoreBots', '1'),
|
||||||
|
('ges', 'MinimumPlayersRank', '0'),
|
||||||
|
('ges', 'MinPlayers', '4'),
|
||||||
|
('ges', 'PlayerEvents', '1'),
|
||||||
|
('ges', 'ShowStats', '1'),
|
||||||
|
('ges', 'SkillMode', '0'),
|
||||||
|
('ges', 'SuicidePenalty', '5'),
|
||||||
|
('ges', 'SwitchAdmins', '0'),
|
||||||
|
('ges', 'TKPenalty', '25'),
|
||||||
|
('ges', 'TrackServerLoad', '1');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Supported` (`code`, `name`) VALUES
|
||||||
|
('l4d', 'Left 4 Dead'),
|
||||||
|
('fof', 'Fistful of Frags'),
|
||||||
|
('ges', 'GoldenEye: Source');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Livestats`
|
||||||
|
CHANGE `team` `team` VARCHAR( 64 ) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Options`
|
||||||
|
ADD `opttype` TINYINT NOT NULL DEFAULT '1',
|
||||||
|
ADD INDEX ( `opttype` );
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `opttype` = 2;
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Options` (`keyname`, `value`, `opttype`)
|
||||||
|
(SELECT `parameter`, `value`, 0 FROM `hlstats_PerlConfig`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options` (`keyname`, `value`, `opttype`) VALUES
|
||||||
|
('slider', '1',2),
|
||||||
|
('modrewrite','0',2),
|
||||||
|
('UseGeoIPBinary', '0',0);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `value` = 'skill' WHERE `keyname` = 'rankingtype' AND `value`=1;
|
||||||
|
UPDATE `hlstats_Options` SET `value` = 'kills' WHERE `keyname` = 'rankingtype' AND `value`=2;
|
||||||
|
UPDATE `hlstats_Options` SET `opttype` = 1 WHERE `keyname` IN ('Mode','rankingtype','DeleteDays','MinActivity');
|
||||||
|
|
||||||
|
TRUNCATE TABLE `hlstats_Options_Choices`;
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options_Choices` (`keyname`, `value`, `text`, `isDefault`) VALUES
|
||||||
|
('rankingtype', 'skill', 'Skill', 1),
|
||||||
|
('rankingtype', 'kills', 'Kills', 0),
|
||||||
|
('bannerdisplay', '0', 'None', 1),
|
||||||
|
('bannerdisplay', '1', 'All Pages', 0),
|
||||||
|
('bannerdisplay', '2', 'Contents Page Only', 0),
|
||||||
|
('playerinfo_tabs', '1', 'New Style (hide sections by default)', 1),
|
||||||
|
('playerinfo_tabs', '0', 'Old Style (show all at once)', 0),
|
||||||
|
('nav_globalchat', '1', 'Show', 1),
|
||||||
|
('nav_globalchat', '0', 'Hide', 0),
|
||||||
|
('nav_cheaters', '0', 'Hide', 1),
|
||||||
|
('nav_cheaters', '1', 'Show', 0),
|
||||||
|
('show_weapon_target_flash', '1', 'Flash hitbox', 1),
|
||||||
|
('show_weapon_target_flash', '0', 'HTML Table', 0),
|
||||||
|
('show_server_load_image', '1', 'Show', 0),
|
||||||
|
('show_server_load_image', '0', 'Hide', 1),
|
||||||
|
('countrydata', '1', 'Show', 1),
|
||||||
|
('countrydata', '0', 'Hide', 0),
|
||||||
|
('gamehome_show_awards', '1', 'Show', 0),
|
||||||
|
('gamehome_show_awards', '0', 'Hide', 1),
|
||||||
|
('show_google_map', '0', 'Hide', 0),
|
||||||
|
('show_google_map', '1', 'Show', 1),
|
||||||
|
('google_map_region', 'NORTH AMERICA', 'North America', 1),
|
||||||
|
('google_map_region', 'SOUTH AMERICA', 'South America', 0),
|
||||||
|
('google_map_region', 'NORTH AFRICA', 'North Africa', 0),
|
||||||
|
('google_map_region', 'SOUTH AFRICA', 'South Africa', 0),
|
||||||
|
('google_map_region', 'NORTH EUROPE', 'North Europe', 0),
|
||||||
|
('google_map_region', 'EAST EUROPE', 'East Europe', 0),
|
||||||
|
('google_map_region', 'GERMANY', 'Germany', 0),
|
||||||
|
('google_map_region', 'FRANCE', 'France', 0),
|
||||||
|
('google_map_region', 'SPAIN', 'Spain', 0),
|
||||||
|
('google_map_region', 'UNITED KINGDOM', 'United Kingdom', 0),
|
||||||
|
('google_map_region', 'DENMARK', 'Denmark', 0),
|
||||||
|
('google_map_region', 'SWEDEN', 'Sweden', 0),
|
||||||
|
('google_map_region', 'NORWAY', 'Norway', 0),
|
||||||
|
('google_map_region', 'FINLAND', 'Finland', 0),
|
||||||
|
('google_map_region', 'NETHERLANDS', 'Netherlands', 0),
|
||||||
|
('google_map_region', 'BELGIUM', 'Belgium', 0),
|
||||||
|
('google_map_region', 'POLAND', 'Poland', 0),
|
||||||
|
('google_map_region', 'SUISSE', 'Suisse', 0),
|
||||||
|
('google_map_region', 'AUSTRIA', 'Austria', 0),
|
||||||
|
('google_map_region', 'ITALY', 'Italy', 0),
|
||||||
|
('google_map_region', 'TURKEY', 'Turkey', 0),
|
||||||
|
('google_map_region', 'BRAZIL', 'Brazil', 0),
|
||||||
|
('google_map_region', 'ARGENTINA', 'Argentina', 0),
|
||||||
|
('google_map_region', 'RUSSIA', 'Russia', 0),
|
||||||
|
('google_map_region', 'ASIA', 'Asia', 0),
|
||||||
|
('google_map_region', 'CHINA', 'China', 0),
|
||||||
|
('google_map_region', 'JAPAN', 'Japan', 0),
|
||||||
|
('google_map_region', 'SOUTH KOREA', 'South Korea', 0),
|
||||||
|
('google_map_region', 'AUSTRALIA', 'Australia', 0),
|
||||||
|
('google_map_region', 'WORLD', 'World', 0),
|
||||||
|
('google_map_type', 'HYBRID', 'Hybrid', 1),
|
||||||
|
('google_map_type', 'SATELLITE', 'Satellite', 0),
|
||||||
|
('google_map_type', 'MAP', 'Normal', 0),
|
||||||
|
('google_map_type', 'PHYSICAL', 'Physical', 0),
|
||||||
|
('slider', '1', 'Enabled', 1),
|
||||||
|
('slider', '0', 'Disabled', 0),
|
||||||
|
('modrewrite', '1', 'Enabled', 0),
|
||||||
|
('modrewrite', '0', 'Disabled', 1),
|
||||||
|
('DNSResolveIP', '1', 'Yes', 1),
|
||||||
|
('DNSResolveIP', '0', 'No', 0),
|
||||||
|
('Rcon', '1', 'Yes', 1),
|
||||||
|
('Rcon', '0', 'No', 0),
|
||||||
|
('RconIgnoreSelf', '0', 'No', 1),
|
||||||
|
('RconIgnoreSelf', '1', 'Yes', 0),
|
||||||
|
('RconRecord', '0', 'No', 1),
|
||||||
|
('RconRecord', '1', 'Yes', 0),
|
||||||
|
('Mode', 'Normal', 'Steam ID (recommended)', 1),
|
||||||
|
('Mode', 'NameTrack', 'Player Name', 0),
|
||||||
|
('Mode', 'LAN', 'IP Address', 0),
|
||||||
|
('UseTimestamp', '0', 'No', 1),
|
||||||
|
('UseTimestamp', '1', 'Yes', 0),
|
||||||
|
('AllowOnlyConfigServers', '0', 'No', 0),
|
||||||
|
('AllowOnlyConfigServers', '1', 'Yes', 1),
|
||||||
|
('TrackStatsTrend', '0', 'No', 0),
|
||||||
|
('TrackStatsTrend', '1', 'Yes', 1),
|
||||||
|
('GlobalBanning', '0', 'No', 1),
|
||||||
|
('GlobalBanning', '1', 'Yes', 0),
|
||||||
|
('LogChat', '0', 'No', 0),
|
||||||
|
('LogChat', '1', 'Yes', 1),
|
||||||
|
('LogChatAdmins', '0', 'No', 0),
|
||||||
|
('LogChatAdmins', '1', 'Yes', 1),
|
||||||
|
('GlobalChat', '0', 'None', 1),
|
||||||
|
('GlobalChat', '1', 'Broadcast to all', 0),
|
||||||
|
('GlobalChat', '2', 'Broadcast to admins', 0),
|
||||||
|
('SkillRatioCap', '0', 'No', 1),
|
||||||
|
('SkillRatioCap', '1', 'Yes', 0),
|
||||||
|
('UseGeoIPBinary', '0', 'GeoIP lookup via database', 1),
|
||||||
|
('UseGeoIPBinary', '1', 'GeoIP lookup via binary file', 0);
|
||||||
|
|
||||||
|
DROP TABLE `hlstats_PerlConfig`;
|
||||||
|
DROP TABLE `hlstats_PerlConfig_Choices`;
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Players` CHANGE `last_event` `last_event` INT( 11 ) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ranks` (`image`, `minKills`, `maxKills`, `rankName`, `game`) VALUES
|
||||||
|
('recruit', 0, 49, 'Recruit', 'l4d'),
|
||||||
|
('private', 50, 99, 'Private', 'l4d'),
|
||||||
|
('private-first-class', 100, 199, 'Private First Class', 'l4d'),
|
||||||
|
('lance-corporal', 200, 299, 'Lance Corporal', 'l4d'),
|
||||||
|
('corporal', 300, 399, 'Corporal', 'l4d'),
|
||||||
|
('sergeant', 400, 499, 'Sergeant', 'l4d'),
|
||||||
|
('staff-sergeant', 500, 599, 'Staff Sergeant', 'l4d'),
|
||||||
|
('gunnery-sergeant', 600, 699, 'Gunnery Sergeant', 'l4d'),
|
||||||
|
('master-sergeant', 700, 799, 'Master Sergeant', 'l4d'),
|
||||||
|
('first-sergeant', 800, 899, 'First Sergeant', 'l4d'),
|
||||||
|
('master-chief', 900, 999, 'Master Chief', 'l4d'),
|
||||||
|
('sergeant-major', 1000, 1199, 'Sergeant Major', 'l4d'),
|
||||||
|
('ensign', 1200, 1399, 'Ensign', 'l4d'),
|
||||||
|
('third-lieutenant', 1400, 1599, 'Third Lieutenant', 'l4d'),
|
||||||
|
('second-lieutenant', 1600, 1799, 'Second Lieutenant', 'l4d'),
|
||||||
|
('first-lieutenant', 1800, 1999, 'First Lieutenant', 'l4d'),
|
||||||
|
('captain', 2000, 2249, 'Captain', 'l4d'),
|
||||||
|
('group-captain', 2250, 2499, 'Group Captain', 'l4d'),
|
||||||
|
('senior-captain', 2500, 2749, 'Senior Captain', 'l4d'),
|
||||||
|
('lieutenant-major', 2750, 2999, 'Lieutenant Major', 'l4d'),
|
||||||
|
('major', 3000, 3499, 'Major', 'l4d'),
|
||||||
|
('group-major', 3500, 3999, 'Group Major', 'l4d'),
|
||||||
|
('lieutenant-commander', 4000, 4499, 'Lieutenant Commander', 'l4d'),
|
||||||
|
('commander', 4500, 4999, 'Commander', 'l4d'),
|
||||||
|
('group-commander', 5000, 5749, 'Group Commander', 'l4d'),
|
||||||
|
('lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel', 'l4d'),
|
||||||
|
('colonel', 6500, 7249, 'Colonel', 'l4d'),
|
||||||
|
('brigadier', 7250, 7999, 'Brigadier', 'l4d'),
|
||||||
|
('brigadier-general', 8000, 8999, 'Brigadier General', 'l4d'),
|
||||||
|
('major-general', 9000, 9999, 'Major General', 'l4d'),
|
||||||
|
('lieutenant-general', 10000, 12499, 'Lieutenant General', 'l4d'),
|
||||||
|
('general', 12500, 14999, 'General', 'l4d'),
|
||||||
|
('commander-general', 15000, 17499, 'Commander General', 'l4d'),
|
||||||
|
('field-vice-marshal', 17500, 19999, 'Field Vice Marshal', 'l4d'),
|
||||||
|
('field-marshal', 20000, 22499, 'Field Marshal', 'l4d'),
|
||||||
|
('vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army', 'l4d'),
|
||||||
|
('commander-of-the-army', 25000, 27499, 'Commander of the Army', 'l4d'),
|
||||||
|
('high-commander', 27500, 29999, 'High Commander', 'l4d'),
|
||||||
|
('supreme-commander', 30000, 34999, 'Supreme Commander', 'l4d'),
|
||||||
|
('terminator', 35000, 9999999, 'Terminator', 'l4d'),
|
||||||
|
('recruit', 0, 49, 'Recruit', 'fof'),
|
||||||
|
('private', 50, 99, 'Private', 'fof'),
|
||||||
|
('private-first-class', 100, 199, 'Private First Class', 'fof'),
|
||||||
|
('lance-corporal', 200, 299, 'Lance Corporal', 'fof'),
|
||||||
|
('corporal', 300, 399, 'Corporal', 'fof'),
|
||||||
|
('sergeant', 400, 499, 'Sergeant', 'fof'),
|
||||||
|
('staff-sergeant', 500, 599, 'Staff Sergeant', 'fof'),
|
||||||
|
('gunnery-sergeant', 600, 699, 'Gunnery Sergeant', 'fof'),
|
||||||
|
('master-sergeant', 700, 799, 'Master Sergeant', 'fof'),
|
||||||
|
('first-sergeant', 800, 899, 'First Sergeant', 'fof'),
|
||||||
|
('master-chief', 900, 999, 'Master Chief', 'fof'),
|
||||||
|
('sergeant-major', 1000, 1199, 'Sergeant Major', 'fof'),
|
||||||
|
('ensign', 1200, 1399, 'Ensign', 'fof'),
|
||||||
|
('third-lieutenant', 1400, 1599, 'Third Lieutenant', 'fof'),
|
||||||
|
('second-lieutenant', 1600, 1799, 'Second Lieutenant', 'fof'),
|
||||||
|
('first-lieutenant', 1800, 1999, 'First Lieutenant', 'fof'),
|
||||||
|
('captain', 2000, 2249, 'Captain', 'fof'),
|
||||||
|
('group-captain', 2250, 2499, 'Group Captain', 'fof'),
|
||||||
|
('senior-captain', 2500, 2749, 'Senior Captain', 'fof'),
|
||||||
|
('lieutenant-major', 2750, 2999, 'Lieutenant Major', 'fof'),
|
||||||
|
('major', 3000, 3499, 'Major', 'fof'),
|
||||||
|
('group-major', 3500, 3999, 'Group Major', 'fof'),
|
||||||
|
('lieutenant-commander', 4000, 4499, 'Lieutenant Commander', 'fof'),
|
||||||
|
('commander', 4500, 4999, 'Commander', 'fof'),
|
||||||
|
('group-commander', 5000, 5749, 'Group Commander', 'fof'),
|
||||||
|
('lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel', 'fof'),
|
||||||
|
('colonel', 6500, 7249, 'Colonel', 'fof'),
|
||||||
|
('brigadier', 7250, 7999, 'Brigadier', 'fof'),
|
||||||
|
('brigadier-general', 8000, 8999, 'Brigadier General', 'fof'),
|
||||||
|
('major-general', 9000, 9999, 'Major General', 'fof'),
|
||||||
|
('lieutenant-general', 10000, 12499, 'Lieutenant General', 'fof'),
|
||||||
|
('general', 12500, 14999, 'General', 'fof'),
|
||||||
|
('commander-general', 15000, 17499, 'Commander General', 'fof'),
|
||||||
|
('field-vice-marshal', 17500, 19999, 'Field Vice Marshal', 'fof'),
|
||||||
|
('field-marshal', 20000, 22499, 'Field Marshal', 'fof'),
|
||||||
|
('vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army', 'fof'),
|
||||||
|
('commander-of-the-army', 25000, 27499, 'Commander of the Army', 'fof'),
|
||||||
|
('high-commander', 27500, 29999, 'High Commander', 'fof'),
|
||||||
|
('supreme-commander', 30000, 34999, 'Supreme Commander', 'fof'),
|
||||||
|
('terminator', 35000, 9999999, 'Terminator', 'fof'),
|
||||||
|
('recruit', 0, 49, 'Recruit', 'ges'),
|
||||||
|
('private', 50, 99, 'Private', 'ges'),
|
||||||
|
('private-first-class', 100, 199, 'Private First Class', 'ges'),
|
||||||
|
('lance-corporal', 200, 299, 'Lance Corporal', 'ges'),
|
||||||
|
('corporal', 300, 399, 'Corporal', 'ges'),
|
||||||
|
('sergeant', 400, 499, 'Sergeant', 'ges'),
|
||||||
|
('staff-sergeant', 500, 599, 'Staff Sergeant', 'ges'),
|
||||||
|
('gunnery-sergeant', 600, 699, 'Gunnery Sergeant', 'ges'),
|
||||||
|
('master-sergeant', 700, 799, 'Master Sergeant', 'ges'),
|
||||||
|
('first-sergeant', 800, 899, 'First Sergeant', 'ges'),
|
||||||
|
('master-chief', 900, 999, 'Master Chief', 'ges'),
|
||||||
|
('sergeant-major', 1000, 1199, 'Sergeant Major', 'ges'),
|
||||||
|
('ensign', 1200, 1399, 'Ensign', 'ges'),
|
||||||
|
('third-lieutenant', 1400, 1599, 'Third Lieutenant', 'ges'),
|
||||||
|
('second-lieutenant', 1600, 1799, 'Second Lieutenant', 'ges'),
|
||||||
|
('first-lieutenant', 1800, 1999, 'First Lieutenant', 'ges'),
|
||||||
|
('captain', 2000, 2249, 'Captain', 'ges'),
|
||||||
|
('group-captain', 2250, 2499, 'Group Captain', 'ges'),
|
||||||
|
('senior-captain', 2500, 2749, 'Senior Captain', 'ges'),
|
||||||
|
('lieutenant-major', 2750, 2999, 'Lieutenant Major', 'ges'),
|
||||||
|
('major', 3000, 3499, 'Major', 'ges'),
|
||||||
|
('group-major', 3500, 3999, 'Group Major', 'ges'),
|
||||||
|
('lieutenant-commander', 4000, 4499, 'Lieutenant Commander', 'ges'),
|
||||||
|
('commander', 4500, 4999, 'Commander', 'ges'),
|
||||||
|
('group-commander', 5000, 5749, 'Group Commander', 'ges'),
|
||||||
|
('lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel', 'ges'),
|
||||||
|
('colonel', 6500, 7249, 'Colonel', 'ges'),
|
||||||
|
('brigadier', 7250, 7999, 'Brigadier', 'ges'),
|
||||||
|
('brigadier-general', 8000, 8999, 'Brigadier General', 'ges'),
|
||||||
|
('major-general', 9000, 9999, 'Major General', 'ges'),
|
||||||
|
('lieutenant-general', 10000, 12499, 'Lieutenant General', 'ges'),
|
||||||
|
('general', 12500, 14999, 'General', 'ges'),
|
||||||
|
('commander-general', 15000, 17499, 'Commander General', 'ges'),
|
||||||
|
('field-vice-marshal', 17500, 19999, 'Field Vice Marshal', 'ges'),
|
||||||
|
('field-marshal', 20000, 22499, 'Field Marshal', 'ges'),
|
||||||
|
('vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army', 'ges'),
|
||||||
|
('commander-of-the-army', 25000, 27499, 'Commander of the Army', 'ges'),
|
||||||
|
('high-commander', 27500, 29999, 'High Commander', 'ges'),
|
||||||
|
('supreme-commander', 30000, 34999, 'Supreme Commander', 'ges'),
|
||||||
|
('terminator', 35000, 9999999, 'Terminator', 'ges');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Ribbons` SET `awardCode` = 'weapon_fnfal' WHERE `awardCode`='weapon_fnfa1' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod');
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`) VALUES
|
||||||
|
('ak47',5,0,'cstrike','1_ak47.png','Award of AK47'),
|
||||||
|
('awp',5,0,'cstrike','1_awp.png','Award of AWP Sniper'),
|
||||||
|
('deagle',5,0,'cstrike','1_deagle.png','Award of Desert Eagle'),
|
||||||
|
('elite',5,0,'cstrike','1_elite.png','Award of Dual Beretta Elites'),
|
||||||
|
('famas',5,0,'cstrike','1_famas.png','Award of Fusil Automatique'),
|
||||||
|
('galil',5,0,'cstrike','1_galil.png','Award of Galil'),
|
||||||
|
('glock18',5,0,'cstrike','1_glock.png','Award of Glock'),
|
||||||
|
('knife',5,0,'cstrike','1_knife.png','Award of Combat Knife'),
|
||||||
|
('latency',5,0,'cstrike','1_latency.png','Award of Lowpinger'),
|
||||||
|
('m3',5,0,'cstrike','1_m3.png','Award of M3 Super'),
|
||||||
|
('m4a1',5,0,'cstrike','1_m4a1.png','Award of Colt M4A1'),
|
||||||
|
('p90',5,0,'cstrike','1_p90.png','Award of P90'),
|
||||||
|
('scout',5,0,'cstrike','1_scout.png','Award of Scout Elite'),
|
||||||
|
('usp',5,0,'cstrike','1_usp.png','Award of USP'),
|
||||||
|
('boomer_claw', '5', '0', 'l4d', '1_boomer_claw.png', 'Bronze Boom!'),
|
||||||
|
('headshot', '5', '0', 'l4d', '1_headshot.png', 'Bronze Brain Salad'),
|
||||||
|
('healed_teammate', '5', '0', 'l4d', '1_healed_teammate.png', 'Bronze Field Medic'),
|
||||||
|
('hunter_claw', '5', '0', 'l4d', '1_hunter_claw.png', 'Bronze Grim Reaper'),
|
||||||
|
('inferno', '5', '0', 'l4d', '1_inferno.png', 'Bronze Cremator'),
|
||||||
|
('killed_exploding', '5', '0', 'l4d', '1_killed_exploding.png', 'Bronze Stomach Upset'),
|
||||||
|
('killed_gas', '5', '0', 'l4d', '1_killed_gas.png', 'Bronze Tongue Twister'),
|
||||||
|
('killed_hunter', '5', '0', 'l4d', '1_killed_hunter.png', 'Bronze Hunter Punter'),
|
||||||
|
('killed_survivor', '5', '0', 'l4d', '1_killed_survivor.png', 'Bronze Dead Wreckening'),
|
||||||
|
('killed_tank', '5', '0', 'l4d', '1_killed_tank.png', 'Bronze Tankbuster'),
|
||||||
|
('killed_witch', '5', '0', 'l4d', '1_killed_witch.png', 'Bronze Inquisitor'),
|
||||||
|
('latency', '5', '0', 'l4d', '1_latency.png', 'Bronze Nothing Special'),
|
||||||
|
('pipe_bomb', '5', '0', 'l4d', '1_pipe_bomb.png', 'Bronze Pyrotechnician'),
|
||||||
|
('pounce', '5', '0', 'l4d', '1_pounce.png', 'Bronze Free 2 Fly'),
|
||||||
|
('rescued_survivor', '5', '0', 'l4d', '1_rescued_survivor.png', 'Bronze Ground Cover'),
|
||||||
|
('revived_teammate', '5', '0', 'l4d', '1_revived_teammate.png', 'Bronze Helping Hand'),
|
||||||
|
('smoker_claw', '5', '0', 'l4d', '1_smoker_claw.png', 'Bronze Chain Smoker'),
|
||||||
|
('tank_claw', '5', '0', 'l4d', '1_tank_claw.png', 'Bronze Lambs 2 Slaughter'),
|
||||||
|
('tongue_grab', '5', '0', 'l4d', '1_tongue_grab.png', 'Bronze Drag & Drop'),
|
||||||
|
('vomit', '5', '0', 'l4d', '1_vomit.png', 'Bronze Barf Bagged'),
|
||||||
|
('boomer_claw', '15', '0', 'l4d', '2_boomer_claw.png', 'Silver Boom!'),
|
||||||
|
('headshot', '15', '0', 'l4d', '2_headshot.png', 'Silver Brain Salad'),
|
||||||
|
('healed_teammate', '15', '0', 'l4d', '2_healed_teammate.png', 'Silver Field Medic'),
|
||||||
|
('hunter_claw', '15', '0', 'l4d', '2_hunter_claw.png', 'Silver Grim Reaper'),
|
||||||
|
('inferno', '15', '0', 'l4d', '2_inferno.png', 'Silver Cremator'),
|
||||||
|
('killed_exploding', '15', '0', 'l4d', '2_killed_exploding.png', 'Silver Stomach Upset'),
|
||||||
|
('killed_gas', '15', '0', 'l4d', '2_killed_gas.png', 'Silver Tongue Twister'),
|
||||||
|
('killed_hunter', '15', '0', 'l4d', '2_killed_hunter.png', 'Silver Hunter Punter'),
|
||||||
|
('killed_survivor', '15', '0', 'l4d', '2_killed_survivor.png', 'Silver Dead Wreckening'),
|
||||||
|
('killed_tank', '15', '0', 'l4d', '2_killed_tank.png', 'Silver Tankbuster'),
|
||||||
|
('killed_witch', '15', '0', 'l4d', '2_killed_witch.png', 'Silver Inquisitor'),
|
||||||
|
('latency', '15', '0', 'l4d', '2_latency.png', 'Silver Nothing Special'),
|
||||||
|
('pipe_bomb', '15', '0', 'l4d', '2_pipe_bomb.png', 'Silver Pyrotechnician'),
|
||||||
|
('pounce', '15', '0', 'l4d', '2_pounce.png', 'Silver Free 2 Fly'),
|
||||||
|
('rescued_survivor', '15', '0', 'l4d', '2_rescued_survivor.png', 'Silver Ground Cover'),
|
||||||
|
('revived_teammate', '15', '0', 'l4d', '2_revived_teammate.png', 'Silver Helping Hand'),
|
||||||
|
('smoker_claw', '15', '0', 'l4d', '2_smoker_claw.png', 'Silver Chain Smoker'),
|
||||||
|
('tank_claw', '15', '0', 'l4d', '2_tank_claw.png', 'Silver Lambs 2 Slaughter'),
|
||||||
|
('tongue_grab', '15', '0', 'l4d', '2_tongue_grab.png', 'Silver Drag & Drop'),
|
||||||
|
('vomit', '15', '0', 'l4d', '2_vomit.png', 'Silver Barf Bagged'),
|
||||||
|
('boomer_claw', '30', '0', 'l4d', '3_boomer_claw.png', 'Golden Boom!'),
|
||||||
|
('headshot', '30', '0', 'l4d', '3_headshot.png', 'Golden Brain Salad'),
|
||||||
|
('healed_teammate', '30', '0', 'l4d', '3_healed_teammate.png', 'Golden Field Medic'),
|
||||||
|
('hunter_claw', '30', '0', 'l4d', '3_hunter_claw.png', 'Golden Grim Reaper'),
|
||||||
|
('inferno', '30', '0', 'l4d', '3_inferno.png', 'Golden Cremator'),
|
||||||
|
('killed_exploding', '30', '0', 'l4d', '3_killed_exploding.png', 'Golden Stomach Upset'),
|
||||||
|
('killed_gas', '30', '0', 'l4d', '3_killed_gas.png', 'Golden Tongue Twister'),
|
||||||
|
('killed_hunter', '30', '0', 'l4d', '3_killed_hunter.png', 'Golden Hunter Punter'),
|
||||||
|
('killed_survivor', '30', '0', 'l4d', '3_killed_survivor.png', 'Golden Dead Wreckening'),
|
||||||
|
('killed_tank', '30', '0', 'l4d', '3_killed_tank.png', 'Golden Tankbuster'),
|
||||||
|
('killed_witch', '30', '0', 'l4d', '3_killed_witch.png', 'Golden Inquisitor'),
|
||||||
|
('latency', '30', '0', 'l4d', '3_latency.png', 'Golden Nothing Special'),
|
||||||
|
('pipe_bomb', '30', '0', 'l4d', '3_pipe_bomb.png', 'Golden Pyrotechnician'),
|
||||||
|
('pounce', '30', '0', 'l4d', '3_pounce.png', 'Golden Free 2 Fly'),
|
||||||
|
('rescued_survivor', '30', '0', 'l4d', '3_rescued_survivor.png', 'Golden Ground Cover'),
|
||||||
|
('revived_teammate', '30', '0', 'l4d', '3_revived_teammate.png', 'Golden Helping Hand'),
|
||||||
|
('smoker_claw', '30', '0', 'l4d', '3_smoker_claw.png', 'Golden Chain Smoker'),
|
||||||
|
('tank_claw', '30', '0', 'l4d', '3_tank_claw.png', 'Golden Lambs 2 Slaughter'),
|
||||||
|
('tongue_grab', '30', '0', 'l4d', '3_tongue_grab.png', 'Golden Drag & Drop'),
|
||||||
|
('vomit', '30', '0', 'l4d', '3_vomit.png', 'Golden Barf Bagged'),
|
||||||
|
('boomer_claw', '50', '0', 'l4d', '4_boomer_claw.png', 'Bloody Boom!'),
|
||||||
|
('headshot', '50', '0', 'l4d', '4_headshot.png', 'Bloody Brain Salad'),
|
||||||
|
('healed_teammate', '50', '0', 'l4d', '4_healed_teammate.png', 'Bloody Field Medic'),
|
||||||
|
('hunter_claw', '50', '0', 'l4d', '4_hunter_claw.png', 'Bloody Grim Reaper'),
|
||||||
|
('inferno', '50', '0', 'l4d', '4_inferno.png', 'Bloody Cremator'),
|
||||||
|
('killed_exploding', '50', '0', 'l4d', '4_killed_exploding.png', 'Bloody Stomach Upset'),
|
||||||
|
('killed_gas', '50', '0', 'l4d', '4_killed_gas.png', 'Bloody Tongue Twister'),
|
||||||
|
('killed_hunter', '50', '0', 'l4d', '4_killed_hunter.png', 'Bloody Hunter Punter'),
|
||||||
|
('killed_survivor', '50', '0', 'l4d', '4_killed_survivor.png', 'Bloody Dead Wreckening'),
|
||||||
|
('killed_tank', '50', '0', 'l4d', '4_killed_tank.png', 'Bloody Tankbuster'),
|
||||||
|
('killed_witch', '50', '0', 'l4d', '4_killed_witch.png', 'Bloody Inquisitor'),
|
||||||
|
('latency', '50', '0', 'l4d', '4_latency.png', 'Bloody Nothing Special'),
|
||||||
|
('pipe_bomb', '50', '0', 'l4d', '4_pipe_bomb.png', 'Bloody Pyrotechnician'),
|
||||||
|
('pounce', '50', '0', 'l4d', '4_pounce.png', 'Bloody Free 2 Fly'),
|
||||||
|
('rescued_survivor', '50', '0', 'l4d', '4_rescued_survivor.png', 'Bloody Ground Cover'),
|
||||||
|
('revived_teammate', '50', '0', 'l4d', '4_revived_teammate.png', 'Bloody Helping Hand'),
|
||||||
|
('smoker_claw', '50', '0', 'l4d', '4_smoker_claw.png', 'Bloody Chain Smoker'),
|
||||||
|
('tank_claw', '50', '0', 'l4d', '4_tank_claw.png', 'Bloody Lambs 2 Slaughter'),
|
||||||
|
('tongue_grab', '50', '0', 'l4d', '4_tongue_grab.png', 'Bloody Drag & Drop'),
|
||||||
|
('vomit', '50', '0', 'l4d', '4_vomit.png', 'Bloody Barf Bagged');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'scout' WHERE `code`='Scout' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'sniper' WHERE `code`='Sniper' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'soldier' WHERE `code`='Soldier' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'pyro' WHERE `code`='Pyro' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'hwguy' WHERE `code`='HWGuy' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'spy' WHERE `code`='Spy' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'demoman' WHERE `code`='Demoman' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'engineer' WHERE `code`='Engineer' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'medic' WHERE `code`='Medic' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
UPDATE `hlstats_Roles` SET `code` = 'civilian' WHERE `code`='Civilian' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'ff');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Roles` (`game`, `code`, `name`, `hidden`) VALUES
|
||||||
|
('l4d', 'NamVet', 'Bill', '0'),
|
||||||
|
('l4d', 'TeenGirl', 'Zoey', '0'),
|
||||||
|
('l4d', 'Biker', 'Francis', '0'),
|
||||||
|
('l4d', 'Manager', 'Louis', '0'),
|
||||||
|
('l4d', 'GAS', 'Smoker', '0'),
|
||||||
|
('l4d', 'EXPLODING', 'Boomer', '0'),
|
||||||
|
('l4d', 'HUNTER', 'Hunter', '0'),
|
||||||
|
('l4d', 'TANK', 'tank', '0'),
|
||||||
|
('l4d', 'infected', 'Infected Horde', '0'),
|
||||||
|
('l4d', 'witch', 'Witch', '0');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers`
|
||||||
|
CHANGE `act_map` `act_map` varchar(64) NOT NULL default '',
|
||||||
|
ADD COLUMN `sortorder` tinyint NOT NULL DEFAULT '0' AFTER `name`;
|
||||||
|
|
||||||
|
DROP TABLE `hlstats_server_addons`;
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_server_load`
|
||||||
|
CHANGE `map` `map` varchar(64) default NULL;
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Servers_Config` WHERE `parameter` = 'AdminContact';
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Servers_Config_Default` WHERE `parameter` = 'AdminContact';
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config_Default` SET `description` = 'Mode of skill changes on frags with following options:\r\n<UL>\r\n<LI>0 = Normal (Victims lose all the points which the killer gains).\r\n<LI>1 = Victims lose 3/4 the points which the killer gains.\r\n<LI>2 = Victims lose 1/2 the points which the killer gains.\r\n<LI>3 = Victims lose 1/4 the points which the killer gains.\r\n<LI>4 = Victims lose no points.\r\n<LI>ZPS-only. Survivor victims lose 1/2, Zombie victims lose 1/4\r\n</UL>' WHERE `parameter` = 'SkillMode';
|
||||||
|
UPDATE `hlstats_Servers_Config_Default` SET `description` = 'Mode of the current gametype:<UL>\r\n<LI>0 = Normal mod standard (default).\r\n<LI>1 = Deathmatch (only need to set if team names are NOT "Unassigned" during deathmatch (ie. in CSS Deathmatch).</UL>' WHERE `parameter` = 'GameType';
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Teams` WHERE `code` IN ('Spectator','Spectators','Unassigned','#FF_TEAM_UNASSIGNED');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Teams` SET `code` = 'Spectator' WHERE `code`='Spectators' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Teams` (`game`, `code`, `name`, `hidden`, `playerlist_bgcolor`, `playerlist_color`, `playerlist_index`) VALUES
|
||||||
|
('l4d', 'Survivor', 'Survivors', '0', '#E0E4E5', '#4B6168', 1),
|
||||||
|
('l4d', 'Infected', 'Infected', '0', '#E5D5D5', '#68090B', 2),
|
||||||
|
('fof', 'DESPERADOS', 'Desparados', '0', '#D2E8F7','#0080C0', 1),
|
||||||
|
('fof', 'VIGILANTES', 'Vigilantes', '0', '#FFD5D5','#FF2D2D', 2),
|
||||||
|
('ges', 'MI6', 'MI6', '0', '#D2E8F7','#0080C0', 1),
|
||||||
|
('ges', 'Janus', 'Janus', '0', '#FFD5D5','#FF2D2D', 2);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Weapons` SET `code` = 'weapon_fnfal' WHERE `code`='weapon_fnfa1' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'insmod');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`) VALUES
|
||||||
|
('zps', 'winchester','Winchester Double Barreled Shotgun',1),
|
||||||
|
('l4d', 'rifle', 'M16 Assault Rifle', 1.00),
|
||||||
|
('l4d', 'autoshotgun', 'Auto Shotgun', 1.00),
|
||||||
|
('l4d', 'pumpshotgun', 'Pump Shotgun', 1.30),
|
||||||
|
('l4d', 'smg', 'Uzi', 1.20),
|
||||||
|
('l4d', 'dual_pistols', 'Dual Pistols', 1.60),
|
||||||
|
('l4d', 'pipe_bomb', 'Pipe Bomb', 1.00),
|
||||||
|
('l4d', 'hunting_rifle', 'Hunting Rifle', 1.00),
|
||||||
|
('l4d', 'pistol', 'Pistol', 2.00),
|
||||||
|
('l4d', 'prop_minigun', 'Mounted Machine Gun', 1.20),
|
||||||
|
('l4d', 'tank_claw', 'Tank\'s Claws', 3.00),
|
||||||
|
('l4d', 'hunter_claw', 'Hunter\'s Claws', 3.00),
|
||||||
|
('l4d', 'smoker_claw', 'Smoker\'s Claws', 3.00),
|
||||||
|
('l4d', 'boomer_claw', 'Boomer\'s Claws', 3.00),
|
||||||
|
('l4d', 'inferno', 'Molotov/Gas Can Fire', 1.20),
|
||||||
|
('l4d', 'pipe_bomb', 'Pipe Bomb/Explosion', 0.80),
|
||||||
|
('l4d', 'infected', 'Infected Horde', 1.00),
|
||||||
|
('l4d', 'witch', 'Witch\'s Claws', 1.00),
|
||||||
|
('l4d', 'first_aid_kit', 'First Aid Kit Smash', 1.5),
|
||||||
|
('l4d', 'entityflame', 'Blaze', 3),
|
||||||
|
('l4d', 'gascan', 'Gas Can Smash', 1.5),
|
||||||
|
('l4d', 'molotov', 'Molotov Smash', 1.5),
|
||||||
|
('l4d', 'pain_pills', 'Pain Pills Smash', 1.5),
|
||||||
|
('l4d', 'player', 'Player', 1),
|
||||||
|
('l4d', 'propanetank', 'Propane Tank Smash', 1.5),
|
||||||
|
('l4d', 'tank_rock', 'Tank\'s Rock', 1.5),
|
||||||
|
('l4d', 'oxygentank', 'Oxygen Tank Smash', 1.5),
|
||||||
|
('l4d', 'world', 'World', 1),
|
||||||
|
('l4d', 'prop_physics', 'Prop Physics', 1),
|
||||||
|
('fof', 'deringer', 'Deringer', 1),
|
||||||
|
('fof', 'carbine', 'Carbine', 1),
|
||||||
|
('fof', 'coltnavy', 'Colt Navy', 1),
|
||||||
|
('fof', 'bow', 'Bow', 1),
|
||||||
|
('fof', 'arrow', 'Arrow', 1),
|
||||||
|
('fof', 'sharps', 'Sharps', 1),
|
||||||
|
('fof', 'coachgun', 'Coach Gun', 1),
|
||||||
|
('fof', 'peacemaker', 'Peacemaker', 1),
|
||||||
|
('fof', 'knife', 'Knife', 2),
|
||||||
|
('fof', 'physics', 'Exploding Barrel', 1),
|
||||||
|
('fof', 'dualderinger', 'Dual Deringers', 1),
|
||||||
|
('fof', 'thrown_axe', 'Thrown Axe', 3),
|
||||||
|
('fof', 'arrow_fiery', 'Fire Arrow', 2),
|
||||||
|
('fof', 'thrown_knife', 'Thrown Knife', 3),
|
||||||
|
('fof', 'dualnavy', 'Dual Colt Navys', 1),
|
||||||
|
('fof', 'dynamite', 'Dynamite', 3),
|
||||||
|
('fof', 'explosive_arrow', 'Explosive Arrow', 2),
|
||||||
|
('fof', 'fists', 'Fists', 2),
|
||||||
|
('fof', 'axe', 'Axe', 2),
|
||||||
|
('fof', 'dualpeacemaker', 'Dual Peacemakers', 1),
|
||||||
|
('fof', 'henryrifle', 'Henry Rifle', 1),
|
||||||
|
('ges', '#GE_ProximityMine', 'Proximity Mines', 1),
|
||||||
|
('ges', '#GE_AutoShotgun', 'Automatic Shotgun', 1),
|
||||||
|
('ges', '#GE_Phantom', 'Phantom', 1),
|
||||||
|
('ges', '#GE_Knife', 'Hunting Knife', 1),
|
||||||
|
('ges', '#GE_D5K', 'D5K Deutsche', 1),
|
||||||
|
('ges', '#GE_SilverPP7', 'Silver PP7', 1),
|
||||||
|
('ges', '#GE_DD44', 'DD44', 1),
|
||||||
|
('ges', '#GE_Grenade', 'Grenade', 1),
|
||||||
|
('ges', '#GE_CougarMagnum', 'Cougar Magnum', 1),
|
||||||
|
('ges', '#GE_D5K_SILENCED', 'D5K (Silenced)', 1),
|
||||||
|
('ges', '#GE_Shotgun', 'Shotgun', 1),
|
||||||
|
('ges', '#GE_Klobb', 'Klobb', 1),
|
||||||
|
('ges', '#GE_RCP90', 'RC-P90', 1),
|
||||||
|
('ges', '#GE_RemoteMine', 'Remote Mines', 1),
|
||||||
|
('ges', '#GE_KF7Soviet', 'KF7 Soviet', 1),
|
||||||
|
('ges', '#GE_ZMG', 'ZMG', 1),
|
||||||
|
('ges', '#GE_SniperRifle', 'Sniper Rifle', 1),
|
||||||
|
('ges', '#GE_GoldPP7', 'Golden PP7', 1),
|
||||||
|
('ges', '#GE_AR33', 'US AR33 Assault', 1),
|
||||||
|
('ges', '#GE_GoldenGun', 'Golden Gun', 1),
|
||||||
|
('ges', '#GE_ThrowingKnife', 'Throwing Knives', 1),
|
||||||
|
('ges', '#GE_PP7', 'PP7', 1),
|
||||||
|
('ges', '#GE_PP7_SILENCED', 'PP7 (Silenced)', 1),
|
||||||
|
('ges', '#GE_TimedMine', 'Timed Mines', 1),
|
||||||
|
('ges', '#GE_MilitaryLaser', 'Military Laser', 1),
|
||||||
|
('ges', '#GE_GrenadeLauncher', 'Grenade Launcher', 1),
|
||||||
|
('ges', '#GE_Rocket', 'Rocket Launcher', 1),
|
||||||
|
('ges', '#GE_Taser', 'Taser', 1),
|
||||||
|
('ges', '#GE_SniperButt', 'Sniper Butt', 1),
|
||||||
|
('ges', '#GE_Slapper', 'Slappers', 1),
|
||||||
|
('ges', '#GE_RocketLauncher', 'Rocket Launcher', 1);
|
216
sql/Upgrade 1.5 - 1.5.1/151_TF2Ribbons.sql
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
DELETE FROM `hlstats_Ribbons` WHERE game = 'tf';
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`) VALUES
|
||||||
|
('tf_projectile_rocket',1,0,'tf','1_tf_projectile_rocket.png','Bronze Rocket Launcher'),
|
||||||
|
('tf_projectile_rocket',5,0,'tf','2_tf_projectile_rocket.png','Silver Rocket Launcher'),
|
||||||
|
('tf_projectile_rocket',10,0,'tf','3_tf_projectile_rocket.png','Gold Rocket Launcher'),
|
||||||
|
('sniperrifle',1,0,'tf','1_sniperrifle.png','Bronze Sniper Rifle'),
|
||||||
|
('sniperrifle',5,0,'tf','2_sniperrifle.png','Silver Sniper Rifle'),
|
||||||
|
('sniperrifle',10,0,'tf','3_sniperrifle.png','Gold Sniper Rifle'),
|
||||||
|
('minigun',1,0,'tf','1_minigun.png','Bronze Minigun'),
|
||||||
|
('minigun',5,0,'tf','2_minigun.png','Silver Minigun'),
|
||||||
|
('minigun',10,0,'tf','3_minigun.png','Gold Minigun'),
|
||||||
|
('obj_sentrygun',1,0,'tf','1_obj_sentrygun.png','Bronze Sentry Gun'),
|
||||||
|
('obj_sentrygun',5,0,'tf','2_obj_sentrygun.png','Silver Sentry Gun'),
|
||||||
|
('obj_sentrygun',10,0,'tf','3_obj_sentrygun.png','Gold Sentry Gun'),
|
||||||
|
('knife',1,0,'tf','1_knife.png','Bronze Knife'),
|
||||||
|
('knife',5,0,'tf','2_knife.png','Silver Knife'),
|
||||||
|
('knife',10,0,'tf','3_knife.png','Gold Knife'),
|
||||||
|
('scattergun',1,0,'tf','1_scattergun.png','Bronze Scatter Gun'),
|
||||||
|
('scattergun',5,0,'tf','2_scattergun.png','Silver Scatter Gun'),
|
||||||
|
('scattergun',10,0,'tf','3_scattergun.png','Gold Scatter Gun'),
|
||||||
|
('tf_projectile_pipe',1,0,'tf','1_tf_projectile_pipe.png','Bronze Grenade Launcher'),
|
||||||
|
('tf_projectile_pipe',5,0,'tf','2_tf_projectile_pipe.png','Silver Grenade Launcher'),
|
||||||
|
('tf_projectile_pipe',10,0,'tf','3_tf_projectile_pipe.png','Gold Grenade Launcher'),
|
||||||
|
('flamethrower',1,0,'tf','1_flamethrower.png','Bronze Flamethrower'),
|
||||||
|
('flamethrower',5,0,'tf','2_flamethrower.png','Silver Flamethrower'),
|
||||||
|
('flamethrower',10,0,'tf','3_flamethrower.png','Gold Flamethrower'),
|
||||||
|
('tf_projectile_pipe_remote',1,0,'tf','1_tf_projectile_pipe_remote.png','Bronze Sticky Launcher'),
|
||||||
|
('tf_projectile_pipe_remote',5,0,'tf','2_tf_projectile_pipe_remote.png','Silver Sticky Launcher'),
|
||||||
|
('tf_projectile_pipe_remote',10,0,'tf','3_tf_projectile_pipe_remote.png','Gold Sticky Launcher'),
|
||||||
|
('shotgun_primary',1,0,'tf','1_shotgun_primary.png','Bronze Engy Shotgun'),
|
||||||
|
('shotgun_primary',5,0,'tf','2_shotgun_primary.png','Silver Engy Shotgun'),
|
||||||
|
('shotgun_primary',10,0,'tf','3_shotgun_primary.png','Gold Engy Shotgun'),
|
||||||
|
('smg',1,0,'tf','1_smg.png','Bronze Submachine Gun'),
|
||||||
|
('smg',5,0,'tf','2_smg.png','Silver Submachine Gun'),
|
||||||
|
('smg',10,0,'tf','3_smg.png','Gold Submachine Gun'),
|
||||||
|
('shotgun_soldier',1,0,'tf','1_shotgun_soldier.png','Bronze Soldier Shotgun'),
|
||||||
|
('shotgun_soldier',5,0,'tf','2_shotgun_soldier.png','Silver Soldier Shotgun'),
|
||||||
|
('shotgun_soldier',10,0,'tf','3_shotgun_soldier.png','Gold Soldier Shotgun'),
|
||||||
|
('revolver',1,0,'tf','1_revolver.png','Bronze Revolver'),
|
||||||
|
('revolver',5,0,'tf','2_revolver.png','Silver Revolver'),
|
||||||
|
('revolver',10,0,'tf','3_revolver.png','Gold Revolver'),
|
||||||
|
('shotgun_pyro',1,0,'tf','1_shotgun_pyro.png','Bronze Pyro Shotgun'),
|
||||||
|
('shotgun_pyro',5,0,'tf','2_shotgun_pyro.png','Silver Pyro Shotgun'),
|
||||||
|
('shotgun_pyro',10,0,'tf','3_shotgun_pyro.png','Gold Pyro Shotgun'),
|
||||||
|
('bat',1,0,'tf','1_bat.png','Bronze Bat'),
|
||||||
|
('bat',5,0,'tf','2_bat.png','Silver Bat'),
|
||||||
|
('bat',10,0,'tf','3_bat.png','Gold Bat'),
|
||||||
|
('wrench',1,0,'tf','1_wrench.png','Bronze Wrench'),
|
||||||
|
('wrench',5,0,'tf','2_wrench.png','Silver Wrench'),
|
||||||
|
('wrench',10,0,'tf','3_wrench.png','Gold Wrench'),
|
||||||
|
('shotgun_hwg',1,0,'tf','1_shotgun_hwg.png','Bronze Heavy Shotgun'),
|
||||||
|
('shotgun_hwg',5,0,'tf','2_shotgun_hwg.png','Silver Heavy Shotgun'),
|
||||||
|
('shotgun_hwg',10,0,'tf','3_shotgun_hwg.png','Gold Heavy Shotgun'),
|
||||||
|
('club',1,0,'tf','1_club.png','Bronze Machete'),
|
||||||
|
('club',5,0,'tf','2_club.png','Silver Machete'),
|
||||||
|
('club',10,0,'tf','3_club.png','Gold Machete'),
|
||||||
|
('pistol_scout',1,0,'tf','1_pistol_scout.png','Bronze Scout Pistol'),
|
||||||
|
('pistol_scout',5,0,'tf','2_pistol_scout.png','Silver Scout Pistol'),
|
||||||
|
('pistol_scout',10,0,'tf','3_pistol_scout.png','Gold Scout Pistol'),
|
||||||
|
('pistol',1,0,'tf','1_pistol.png','Bronze Engy Pistol'),
|
||||||
|
('pistol',5,0,'tf','2_pistol.png','Silver Engy Pistol'),
|
||||||
|
('pistol',10,0,'tf','3_pistol.png','Gold Engy Pistol'),
|
||||||
|
('bottle',1,0,'tf','1_bottle.png','Bronze Bottle'),
|
||||||
|
('bottle',5,0,'tf','2_bottle.png','Silver Bottle'),
|
||||||
|
('bottle',10,0,'tf','3_bottle.png','Gold Bottle'),
|
||||||
|
('shovel',1,0,'tf','1_shovel.png','Bronze Shovel'),
|
||||||
|
('shovel',5,0,'tf','2_shovel.png','Silver Shovel'),
|
||||||
|
('shovel',10,0,'tf','3_shovel.png','Gold Shovel'),
|
||||||
|
('fireaxe',1,0,'tf','1_fireaxe.png','Bronze Fire Axe'),
|
||||||
|
('fireaxe',5,0,'tf','2_fireaxe.png','Silver Fire Axe'),
|
||||||
|
('fireaxe',10,0,'tf','3_fireaxe.png','Gold Fire Axe'),
|
||||||
|
('fists',1,0,'tf','1_fists.png','Bronze Fists'),
|
||||||
|
('fists',5,0,'tf','2_fists.png','Silver Fists'),
|
||||||
|
('fists',10,0,'tf','3_fists.png','Gold Fists'),
|
||||||
|
('ubersaw',1,0,'tf','1_ubersaw.png','Bronze Ubersaw'),
|
||||||
|
('ubersaw',5,0,'tf','2_ubersaw.png','Silver Ubersaw'),
|
||||||
|
('ubersaw',10,0,'tf','3_ubersaw.png','Gold Ubersaw'),
|
||||||
|
('blutsauger',1,0,'tf','1_blutsauger.png','Bronze Blutsauger'),
|
||||||
|
('blutsauger',5,0,'tf','2_blutsauger.png','Silver Blutsauger'),
|
||||||
|
('blutsauger',10,0,'tf','3_blutsauger.png','Gold Blutsauger'),
|
||||||
|
('axtinguisher',1,0,'tf','1_axtinguisher.png','Bronze Axtinguisher'),
|
||||||
|
('axtinguisher',5,0,'tf','2_axtinguisher.png','Silver Axtinguisher'),
|
||||||
|
('axtinguisher',10,0,'tf','3_axtinguisher.png','Gold Axtinguisher'),
|
||||||
|
('deflect_flare',1,0,'tf','1_deflect_flare.png','Bronze Deflected Flare'),
|
||||||
|
('deflect_flare',5,0,'tf','2_deflect_flare.png','Silver Deflected Flare'),
|
||||||
|
('deflect_flare',10,0,'tf','3_deflect_flare.png','Gold Deflected Flare'),
|
||||||
|
('syringegun_medic',1,0,'tf','1_syringegun_medic.png','Bronze Syringe Gun'),
|
||||||
|
('syringegun_medic',5,0,'tf','2_syringegun_medic.png','Silver Syringe Gun'),
|
||||||
|
('syringegun_medic',10,0,'tf','3_syringegun_medic.png','Gold Syringe Gun'),
|
||||||
|
('bonesaw',1,0,'tf','1_bonesaw.png','Bronze Bonesaw'),
|
||||||
|
('bonesaw',5,0,'tf','2_bonesaw.png','Silver Bonesaw'),
|
||||||
|
('bonesaw',10,0,'tf','3_bonesaw.png','Gold Bonesaw'),
|
||||||
|
('deflect_promode',1,0,'tf','1_deflect_promode.png','Bronze Deflected Grenade'),
|
||||||
|
('deflect_promode',5,0,'tf','2_deflect_promode.png','Silver Deflected Grenade'),
|
||||||
|
('deflect_promode',10,0,'tf','3_deflect_promode.png','Gold Deflected Grenade'),
|
||||||
|
('deflect_rocket',1,0,'tf','1_deflect_rocket.png','Bronze Deflected Rocket'),
|
||||||
|
('deflect_rocket',5,0,'tf','2_deflect_rocket.png','Silver Deflected Rocket'),
|
||||||
|
('deflect_rocket',10,0,'tf','3_deflect_rocket.png','Gold Deflected Rocket'),
|
||||||
|
('deflect_sticky',1,0,'tf','1_deflect_sticky.png','Bronze Deflected Sticky'),
|
||||||
|
('deflect_sticky',5,0,'tf','2_deflect_sticky.png','Silver Deflected Sticky'),
|
||||||
|
('deflect_sticky',10,0,'tf','3_deflect_sticky.png','Gold Deflected Sticky'),
|
||||||
|
('flaregun',1,0,'tf','1_flaregun.png','Bronze Flare Gun'),
|
||||||
|
('flaregun',5,0,'tf','2_flaregun.png','Silver Flare Gun'),
|
||||||
|
('flaregun',10,0,'tf','3_flaregun.png','Gold Flare Gun'),
|
||||||
|
('natascha',1,0,'tf','1_natascha.png','Bronze Natascha'),
|
||||||
|
('natascha',5,0,'tf','2_natascha.png','Silver Natascha'),
|
||||||
|
('natascha',10,0,'tf','3_natascha.png','Gold Natascha'),
|
||||||
|
('gloves',1,0,'tf','1_gloves.png','Bronze K.G.B.'),
|
||||||
|
('gloves',5,0,'tf','2_gloves.png','Silver K.G.B.'),
|
||||||
|
('gloves',10,0,'tf','3_gloves.png','Gold K.G.B.'),
|
||||||
|
('taunt_heavy',1,0,'tf','1_taunt_heavy.png','Bronze Heavy Taunt'),
|
||||||
|
('taunt_heavy',5,0,'tf','2_taunt_heavy.png','Silver Heavy Taunt'),
|
||||||
|
('taunt_heavy',10,0,'tf','3_taunt_heavy.png','Gold Heavy Taunt'),
|
||||||
|
('taunt_pyro',1,0,'tf','1_taunt_pyro.png','Bronze Hadouken'),
|
||||||
|
('taunt_pyro',5,0,'tf','2_taunt_pyro.png','Silver Hadouken'),
|
||||||
|
('taunt_pyro',10,0,'tf','3_taunt_pyro.png','Gold Hadouken'),
|
||||||
|
('chargedeployed',1,0,'tf','1_chargedeployed.png','Bronze Uber'),
|
||||||
|
('chargedeployed',5,0,'tf','2_chargedeployed.png','Silver Uber'),
|
||||||
|
('chargedeployed',10,0,'tf','3_chargedeployed.png','Gold Uber'),
|
||||||
|
('sandvich',1,0,'tf','1_sandvich.png','Bronze Sandvich'),
|
||||||
|
('sandvich',5,0,'tf','2_sandvich.png','Silver Sandvich'),
|
||||||
|
('sandvich',10,0,'tf','3_sandvich.png','Gold Sandvich'),
|
||||||
|
('domination',1,0,'tf','1_domination.png','Bronze Dominator'),
|
||||||
|
('domination',5,0,'tf','2_domination.png','Silver Dominator'),
|
||||||
|
('domination',10,0,'tf','3_domination.png','Gold Dominator'),
|
||||||
|
('revenge',1,0,'tf','1_revenge.png','Bronze Revenger'),
|
||||||
|
('revenge',5,0,'tf','2_revenge.png','Silver Revenger'),
|
||||||
|
('revenge',10,0,'tf','3_revenge.png','Gold Revenger'),
|
||||||
|
('mostkills',1,0,'tf','1_mostkills.png','Bronze Kill Award'),
|
||||||
|
('mostkills',5,0,'tf','2_mostkills.png','Silver Kill Award'),
|
||||||
|
('mostkills',10,0,'tf','3_mostkills.png','Gold Kill Award'),
|
||||||
|
('backstab',1,0,'tf','1_backstab.png','Bronze Backstabber'),
|
||||||
|
('backstab',5,0,'tf','2_backstab.png','Silver Backstabber'),
|
||||||
|
('backstab',10,0,'tf','3_backstab.png','Gold Backstabber'),
|
||||||
|
('pointcaptured',1,0,'tf','1_pointcaptured.png','Bronze Capture Point'),
|
||||||
|
('pointcaptured',5,0,'tf','2_pointcaptured.png','Silver Capture Point'),
|
||||||
|
('pointcaptured',10,0,'tf','3_pointcaptured.png','Gold Capture Point'),
|
||||||
|
('captureblocked',1,0,'tf','1_captureblocked.png','Bronze Blocker'),
|
||||||
|
('captureblocked',5,0,'tf','2_captureblocked.png','Silver Blocker'),
|
||||||
|
('captureblocked',10,0,'tf','3_captureblocked.png','Gold Blocker'),
|
||||||
|
('flagevent_defended',1,0,'tf','1_flagevent_defended.png','Bronze Defender'),
|
||||||
|
('flagevent_defended',5,0,'tf','2_flagevent_defended.png','Silver Defender'),
|
||||||
|
('flagevent_defended',10,0,'tf','3_flagevent_defended.png','Gold Defender'),
|
||||||
|
('flagevent_captured',1,0,'tf','1_flagevent_captured.png','Bronze Intelligence'),
|
||||||
|
('flagevent_captured',5,0,'tf','2_flagevent_captured.png','Silver Intelligence'),
|
||||||
|
('flagevent_captured',10,0,'tf','3_flagevent_captured.png','Gold Intelligence'),
|
||||||
|
('kill assist',1,0,'tf','1_kill assist.png','Bronze Assister'),
|
||||||
|
('kill assist',5,0,'tf','2_kill assist.png','Silver Assister'),
|
||||||
|
('kill assist',10,0,'tf','3_kill assist.png','Gold Assister'),
|
||||||
|
('bonuspoints',1,0,'tf','1_bonuspoints.png','Bronze Healer'),
|
||||||
|
('bonuspoints',5,0,'tf','2_bonuspoints.png','Silver Healer'),
|
||||||
|
('bonuspoints',10,0,'tf','3_bonuspoints.png','Gold Healer'),
|
||||||
|
('kill_assist_medic',1,0,'tf','1_kill_assist_medic.png','Bronze Healer'),
|
||||||
|
('kill_assist_medic',5,0,'tf','2_kill_assist_medic.png','Silver Healer'),
|
||||||
|
('kill_assist_medic',10,0,'tf','3_kill_assist_medic.png','Gold Healer'),
|
||||||
|
('builtobject_obj_attachment_sapper',1,0,'tf','1_builtobject_obj_attachement_sapper.png','Bronze Sapper'),
|
||||||
|
('builtobject_obj_attachment_sapper',5,0,'tf','2_builtobject_obj_attachement_sapper.png','Silver Sapper'),
|
||||||
|
('builtobject_obj_attachment_sapper',10,0,'tf','3_builtobject_obj_attachement_sapper.png','Gold Sapper');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`) VALUES
|
||||||
|
('W','tf','tf_projectile_pipe_remote','Remote Demolition Man','pipe bomb kills'),
|
||||||
|
('W','tf','tf_projectile_pipe','Demolition Man','pipe bomb kills'),
|
||||||
|
('W','tf','sniperrifle','Top Sniper','snipings'),
|
||||||
|
('W','tf','smg','Submachine gun','smg kills'),
|
||||||
|
('W','tf','shotgun_soldier','Shotgun Soldier','shotgun kills'),
|
||||||
|
('W','tf','shotgun_pyro','Shotgun Pyro','shotgun kills'),
|
||||||
|
('W','tf','shotgun_primary','Shotgun','shotgun kills'),
|
||||||
|
('W','tf','scattergun','Fast and Furious','scattergun kills'),
|
||||||
|
('W','tf','revolver','Wayne','revolver kills'),
|
||||||
|
('W','tf','pistol','Pistol','pistol kills'),
|
||||||
|
('W','tf','obj_sentrygun','Engineer','sentry kills'),
|
||||||
|
('W','tf','minigun','Terminator','minigun kills'),
|
||||||
|
('W','tf','knife','Stabber','knifings'),
|
||||||
|
('W','tf','flamethrower','Pyro','flame burnings'),
|
||||||
|
('W','tf','bat','Baseball freak','bat kills'),
|
||||||
|
('O','tf','pointcaptured','Capturer','checkpoint captures'),
|
||||||
|
('O','tf','kill assist','Assistance','kill assists'),
|
||||||
|
('O','tf','captureblocked','Blocker','checkpoint blockings'),
|
||||||
|
('O','tf','chargedeployed','Ubermedic','deployed charges'),
|
||||||
|
('W','tf','latency','Best Latency','ms average connection'),
|
||||||
|
('W','tf','tf_projectile_rocket','Soldier','rocket kills'),
|
||||||
|
('W','tf','wrench','Engineer on Rage','wrench kills'),
|
||||||
|
('W','tf','shovel','Grave Digger','shovel kills'),
|
||||||
|
('W','tf','fireaxe','Axe-O-Mania','axe kills'),
|
||||||
|
('W','tf','bottle','Drunken Demoman','bottle kills'),
|
||||||
|
('W','tf','bonesaw','The Saw','sawed bones'),
|
||||||
|
('W','tf','fists','Fisting king','fistings'),
|
||||||
|
('W','tf','club','Now that\'s a knife','machete kills'),
|
||||||
|
('W','tf','pistol_scout','Scout Pistol','pistol kills'),
|
||||||
|
('W','tf','shotgun_hwg','Shotgun Heavy','shotgun kills'),
|
||||||
|
('W','tf','syringegun_medic','The Injector','syringe kills'),
|
||||||
|
('W','tf','axtinguisher', 'Axtinguisher', 'kills with the axtinguisher'),
|
||||||
|
('W','tf','backburner', 'Backburner', 'burned backs'),
|
||||||
|
('W','tf','blutsauger', 'Blutsauger', 'times sucked blood'),
|
||||||
|
('W','tf','flaregun', 'Flare Gun', 'flare gun kills'),
|
||||||
|
('W','tf','gloves', 'Heavy surgery', 'KGB kills'),
|
||||||
|
('W','tf','natascha', 'Nataschas Friend', 'Natascha kills'),
|
||||||
|
('W','tf','ubersaw', 'Ubersaw', 'kills with ubersaw'),
|
||||||
|
('W','tf','deflect_flare', 'Deflected Flare', 'kills with deflected flare'),
|
||||||
|
('W','tf','deflect_promode', 'Deflected Grenade', 'kills with deflected grenade'),
|
||||||
|
('W','tf','deflect_rocket', 'Deflected Rocket', 'kills with deflected rocket'),
|
||||||
|
('W','tf','deflect_sticky', 'Deflected Sticky', 'kills with deflected sticky'),
|
||||||
|
('W','tf','taunt_heavy', 'POW! Ha Ha', 'kills with heavy taunt'),
|
||||||
|
('W','tf','taunt_pyro', 'Hadouken', 'kills with Hadouken'),
|
||||||
|
('W','tf','mostkills','Most Kills','kills'),
|
||||||
|
('W','tf','bonuspoints','Most Bonus Points','bonus points'),
|
||||||
|
('O','tf', 'sandvich', 'Hungry Hungry Heavy', 'sandviches eaten'),
|
||||||
|
('O','tf', 'backstab', 'Backstabber', 'backstabs'),
|
||||||
|
('O','tf','flagevent_defended','Defender of the Flag','flag defenses'),
|
||||||
|
('O','tf','flagevent_captured','The Mad Capper','flag captures'),
|
||||||
|
('O','tf','killedobject_obj_dispenser','NO METAL FOR YOU!','dispensers destroyed'),
|
||||||
|
('O','tf','killedobject_obj_sentrygun','Say no to sentries','sentry guns destroyed'),
|
||||||
|
('O','tf','builtobject_obj_sentrygun','Bob the Builder','sentry guns built'),
|
||||||
|
('O','tf','builtobject_obj_attachment_sapper','Super Sapper','sappers placed'),
|
||||||
|
('O','tf','kill_assist_medic','Medic Assistance','medic assists');
|
4
sql/Upgrade 1.5 - 1.5.1/151_UpdateSteamIds.sql
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
UPDATE
|
||||||
|
hlstats_PlayerUniqueIds
|
||||||
|
SET
|
||||||
|
uniqueId = replace(uniqueId, 'STEAM_1:',''), uniqueId = replace(uniqueId, 'STEAM_0:','');
|
46
sql/Upgrade 1.5 - 1.5.1/upgrade_hlxcomm15_151.sql
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
ALTER TABLE `hlstats_Actions`
|
||||||
|
CHANGE `description` `description` varchar(128) default NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Admin`
|
||||||
|
CHANGE `type` `type` varchar(64) NOT NULL default 'Unknown',
|
||||||
|
CHANGE `message` `message` varchar(128) NOT NULL default '',
|
||||||
|
CHANGE `playerName` `playerName` varchar(64) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_ChangeName`
|
||||||
|
CHANGE `oldName` `oldName` varchar(64) NOT NULL default '',
|
||||||
|
CHANGE `newName` `newName` varchar(64) NOT NULL default '',
|
||||||
|
ADD KEY `playerId` (`playerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_ChangeRole`
|
||||||
|
ADD KEY `playerId` (`playerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_ChangeTeam`
|
||||||
|
ADD KEY `playerId` (`playerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Chat`
|
||||||
|
CHANGE `message` `message` varchar(128) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_PlayerPlayerActions`
|
||||||
|
ADD KEY `playerId` (`playerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Statsme2`
|
||||||
|
ADD KEY `weapon` (`weapon`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Suicides`
|
||||||
|
ADD KEY `playerId` (`playerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Teamkills`
|
||||||
|
ADD KEY `killerId` (`killerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Options`
|
||||||
|
CHANGE `keyname` `keyname` varchar(32) NOT NULL default '',
|
||||||
|
CHANGE `value` `value` varchar(128) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Options_Choices`
|
||||||
|
CHANGE `keyname` `keyname` varchar(32) NOT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Players`
|
||||||
|
CHANGE `lastName` `lastName` varchar(64) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_PlayerUniqueIds`
|
||||||
|
CHANGE `uniqueId` `uniqueId` varchar(64) NOT NULL default '';
|
14
sql/Upgrade 1.5.1 - 1.5.2/upgrade_hlxcomm_151_152.sql
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`) VALUES
|
||||||
|
('W','cstrike','grenade','Grenadier','kills with grenade');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `opttype` = 2 WHERE `keyname` IN ('awards_d_date','awards_numdays');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`) VALUES
|
||||||
|
('killed_a_hostage',5,0,'cstrike','1_killed_a_hostage.png','Award of Hostage Killing'),
|
||||||
|
('rescued_a_hostage',5,0,'cstrike','1_rescued_a_hostage.png','Award of Hostage Rescue'),
|
||||||
|
('planted_the_bomb',5,0,'cstrike','1_planted_the_bomb.png','Award of Planting the Bomb'),
|
||||||
|
('grenade',5,0,'cstrike','1_grenade.png','Award of Grenade'),
|
||||||
|
('defused_the_bomb',5,0,'cstrike','1_defused_the_bomb.png','Award of Defusing');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config_Default` SET `description` = 'If enabled, bots are not tracked 1=on 0=off(default).' WHERE `parameter` = 'IgnoreBots';
|
||||||
|
UPDATE `hlstats_Servers_Config_Default` SET `description` = 'Valid values are SOURCEMOD, MINISTATS, BEETLE, MANI, and AMXX if one of such plugins are installed.' WHERE `parameter` = 'Mod';
|
97
sql/Upgrade 1.5.2 - 1.5.3/upgrade_hlxcomm_152_153.sql
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`) VALUES
|
||||||
|
('tf', 'first_blood', 1, 0, '', 'First Blood', '1', '', '', ''),
|
||||||
|
('tf', 'steal_sandvich', 2, 0, '', 'Steal Sandvich', '', '1', '', ''),
|
||||||
|
('tf', 'stun', 0, 0, '', 'Stun', '', '1', '', ''),
|
||||||
|
('tfc','Capture Point 1',2,5,'1','Captured Point 1','1','0','0','0'),
|
||||||
|
('tfc','Capture Point 2',2,5,'1','Captured Point 2','1','0','0','0'),
|
||||||
|
('tfc','Capture Point 3',2,5,'1','Captured Point 3','1','0','0','0'),
|
||||||
|
('tfc','headshot',1,0,'0','Headshot Kill','1','0','0','0'),
|
||||||
|
('ges', 'headshot', 1, 0, '', 'Headshot Kill', '1', '', '', '');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',`code`,'taunt_scout','Home Run King','grand slams' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',`code`,'bat_wood','Mr. Sandman','kills with the Sandman' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',`code`,'stun','Absolutely Stunning','stuns' FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
UPDATE IGNORE `hlstats_Awards` SET `code` = 'builtobject_obj_attachment_sapper' WHERE `code` = 'builtobject_obj_attachement_sapper';
|
||||||
|
DELETE FROM `hlstats_Awards` WHERE `code` = 'builtobject_obj_attachement_sapper';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Entries`
|
||||||
|
ADD KEY `playerId` (`playerId`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`)
|
||||||
|
(SELECT `code`, 'ConnectAnnounce','1' FROM `hlstats_Games`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`)
|
||||||
|
(SELECT `code`, 'UpdateHostname','1' FROM `hlstats_Games`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`)
|
||||||
|
(SELECT `code`, 'DefaultDisplayEvents','1' FROM `hlstats_Games`);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Games_Defaults` SET `value` = 0 WHERE `code` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'l4d');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Livestats`
|
||||||
|
CHANGE `cli_city` `cli_city` varchar(64) NOT NULL default '',
|
||||||
|
CHANGE `cli_country` `cli_country` varchar(64) NOT NULL default '',
|
||||||
|
CHANGE `cli_state` `cli_state` varchar(64) NOT NULL default '',
|
||||||
|
CHANGE `steam_id` `steam_id` varchar(64) NOT NULL default '',
|
||||||
|
CHANGE `name` `name` varchar(64) NOT NULL;
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options` (`keyname`, `value`, `opttype`) VALUES
|
||||||
|
('dbversion', '1.5.3', 2);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_PlayerNames`
|
||||||
|
CHANGE `name` `name` varchar(64) NOT NULL default '';
|
||||||
|
|
||||||
|
UPDATE IGNORE `hlstats_Ribbons` SET `awardCode` = 'builtobject_obj_attachment_sapper' WHERE `awardCode` = 'builtobject_obj_attachement_sapper';
|
||||||
|
UPDATE IGNORE `hlstats_Ribbons` SET `image` = replace(image, 'attachement','attachment') WHERE `image` LIKE '%attachement%';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Roles`
|
||||||
|
CHANGE `name` `name` varchar(64) NOT NULL default '';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Roles` (`game`, `code`, `name`, `hidden`) VALUES
|
||||||
|
('ges', 'jaws', 'Jaws', '0'),
|
||||||
|
('ges', 'bond', 'Bond', '0'),
|
||||||
|
('ges', 'boris', 'Boris', '0'),
|
||||||
|
('ges', 'Mayday', 'May Day', '0'),
|
||||||
|
('ges', 'Mishkin', 'Mishkin', '0'),
|
||||||
|
('ges', 'oddjob', 'Oddjob', '0'),
|
||||||
|
('ges', 'ourumov', 'Ourumov', '0'),
|
||||||
|
('ges', 'samedi', 'Samedi', '0'),
|
||||||
|
('ges', 'valentin', 'Valentin', '0');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers`
|
||||||
|
CHANGE `city` `city` varchar(64) NOT NULL default '',
|
||||||
|
CHANGE `country` `country` varchar(64) NOT NULL default '';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverid`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'ConnectAnnounce','1' FROM `hlstats_Servers`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverid`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'UpdateHostname','1' FROM `hlstats_Servers`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverid`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'DefaultDisplayEvents','1' FROM `hlstats_Servers`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config_Default` (`parameter`, `value`, `description`) VALUES
|
||||||
|
('ConnectAnnounce', '1', 'Toggle display of message upon each player connect showing player points/kills, rank, and country of origin. 1=on(default) 0=off'),
|
||||||
|
('UpdateHostname', '1', 'Toggles auto-update of server name from hostname cvar 1=on(default) 0=off'),
|
||||||
|
('DefaultDisplayEvents', '1', 'Toggle players default option to see kill/event messages on server. 1=on(default) 0=off');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Weapons` SET `name` = 'Sentry Gun (Level 1)' WHERE `code` = 'obj_sentrygun' AND `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT `code`, 'taunt_scout', 'Grand Slam', 3 FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT `code`, 'bat_wood', 'The Sandman', 1.75 FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT `code`, 'obj_sentrygun2', 'Sentry Gun (Level 2)', 3 FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT `code`, 'obj_sentrygun3', 'Sentry Gun (Level 3)', 3 FROM `hlstats_Games` WHERE `realgame` = 'tf');
|
489
sql/Upgrade 1.5.3 - 1.5.4/upgrade_hlxcomm_153_154.sql
Normal file
|
@ -0,0 +1,489 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`) VALUES
|
||||||
|
('bg2', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', ''),
|
||||||
|
('bg2', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', ''),
|
||||||
|
('sgtls', 'Goa\'uld_Win', 5, 0, '', 'Goa\'uld Won Round', '', '', '1', ''),
|
||||||
|
('sgtls', 'Tau\'ri_Win', 5, 0, '', 'Tau\'ri Won Round', '', '', '1', ''),
|
||||||
|
('dystopia', 'kill_streak_2', 1, 0, '', 'Double Kill (2 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_3', 2, 0, '', 'Triple Kill (3 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_4', 3, 0, '', 'Domination (4 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_5', 4, 0, '', 'Rampage (5 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_6', 5, 0, '', 'Mega Kill (6 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_7', 6, 0, '', 'Ownage (7 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_8', 7, 0, '', 'Ultra Kill (8 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_9', 8, 0, '', 'Killing Spree (9 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_10', 9, 0, '', 'Monster Kill (10 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_11', 10, 0, '', 'Unstoppable (11 kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'kill_streak_12', 11, 0, '', 'God Like (12+ kills)', '1', '', '', ''),
|
||||||
|
('dystopia', 'Capture Guard Post', 2, 0, '', 'Capture Guard Post', '1', '', '', ''),
|
||||||
|
('dystopia', 'Capture Interior Spawn', 2, 0, '', 'Capture Interior Spawn', '1', '', '', ''),
|
||||||
|
('dystopia', 'Capture Internal Spawn', 2, 0, '', 'Capture Internal Spawn', '1', '', '', ''),
|
||||||
|
('dystopia', 'Capture The Docks', 2, 0, '', 'Capture The Docks', '1', '', '', ''),
|
||||||
|
('dystopia', 'Capture the Inner Base', 2, 0, '', 'Capture the Inner Base', '1', '', '', ''),
|
||||||
|
('dystopia', 'Capture the Spawn', 2, 0, '', 'Capture the Spawn', '1', '', '', ''),
|
||||||
|
('dystopia', 'Cut Entrance Spawn Power', 2, 0, '', 'Cut Entrance Spawn Power', '1', '', '', ''),
|
||||||
|
('dystopia', 'Defend Interior Spawn', 2, 0, '', 'Defend Interior Spawn', '1', '', '', ''),
|
||||||
|
('dystopia', 'Defend Middle Spawn', 2, 0, '', 'Defend Middle Spawn', '1', '', '', ''),
|
||||||
|
('dystopia', 'Defend Security JIP', 2, 0, '', 'Defend Security JIP', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy Broadcast Server', 2, 0, '', 'Destroy Broadcast Server', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy Cooling Access Door', 2, 0, '', 'Destroy Cooling Access Door', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy Cooling Tank', 2, 0, '', 'Destroy Cooling Tank', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy The Bulkhead', 2, 0, '', 'Destroy The Bulkhead', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy The Core', 2, 0, '', 'Destroy The Core', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy the Firewall', 2, 0, '', 'Destroy the Firewall', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy the Reactor', 2, 0, '', 'Destroy the Reactor', '1', '', '', ''),
|
||||||
|
('dystopia', 'Destroy Transformer', 2, 0, '', 'Destroy Transformer', '1', '', '', ''),
|
||||||
|
('dystopia', 'Enable Auxilary Power Feed', 2, 0, '', 'Enable Auxilary Power Feed', '1', '', '', ''),
|
||||||
|
('dystopia', 'Enable The 4-Point Override', 2, 0, '', 'Enable The 4-Point Override', '1', '', '', ''),
|
||||||
|
('dystopia', 'Escort Hostage', 2, 0, '', 'Escort Hostage', '1', '', '', ''),
|
||||||
|
('dystopia', 'Hack Middle Spawn', 2, 0, '', 'Hack Middle Spawn', '1', '', '', ''),
|
||||||
|
('dystopia', 'Hack Spawn Controls', 2, 0, '', 'Hack Spawn Controls', '1', '', '', ''),
|
||||||
|
('dystopia', 'Hack the Perimeter', 2, 0, '', 'Hack the Perimeter', '1', '', '', ''),
|
||||||
|
('dystopia', 'Inject The Virus', 2, 0, '', 'Inject The Virus', '1', '', '', ''),
|
||||||
|
('dystopia', 'Launch Missile', 2, 0, '', 'Launch Missile', '1', '', '', ''),
|
||||||
|
('dystopia', 'Locate profile', 2, 0, '', 'Locate profile', '1', '', '', ''),
|
||||||
|
('dystopia', 'Maintain Power Routing', 2, 0, '', 'Maintain Power Routing', '1', '', '', ''),
|
||||||
|
('dystopia', 'Open And Destroy Data Stores / Establish An Uplink', 2, 0, '', 'Open And Destroy Data Stores / Establish An Uplink', '1', '', '', ''),
|
||||||
|
('dystopia', 'Redirect Laser', 2, 0, '', 'Redirect Laser', '1', '', '', ''),
|
||||||
|
('dystopia', 'Reroute Power To Control Room', 2, 0, '', 'Reroute Power To Control Room', '1', '', '', ''),
|
||||||
|
('dystopia', 'Shut Down Security', 2, 0, '', 'Shut Down Security', '1', '', '', ''),
|
||||||
|
('dystopia', 'Shutdown The Production Line', 2, 0, '', 'hutdown The Production Line', '1', '', '', ''),
|
||||||
|
('dystopia', 'Smash Data Storage', 2, 0, '', 'Smash Data Storage', '1', '', '', ''),
|
||||||
|
('dystopia', 'Turn Power Offline', 2, 0, '', 'Turn Power Offline', '1', '', '', ''),
|
||||||
|
('l4d', 'cr0wned', 0, 0, '', 'Cr0wned (killed witch with single headshot)', '1', '', '', ''),
|
||||||
|
('l4d', 'hunter_punter', 0, 0, '', 'Hunter Punter (melee a Hunter mid-jump)', '1', '', '', ''),
|
||||||
|
('l4d', 'tounge_twister', 0, 0, '', 'Tounge Twister (kill a Smoker while he is dragging you)', '1', '', '', ''),
|
||||||
|
('l4d', 'protect_teammate', 0, 0, '', 'Protected Teammate', '1', '', '', ''),
|
||||||
|
('l4d', 'no_death_on_tank', 0, 0, '', 'No survivors died/incapped from tank', '1', '', '', ''),
|
||||||
|
('l4d', 'killed_all_survivors', 0, 0, '', 'Killed all survivors', '1', '', '', '');
|
||||||
|
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`) VALUES
|
||||||
|
('O', 'l4d', 'hunter_punter', 'Hunter Punter', 'hunter punts'),
|
||||||
|
('O', 'l4d', 'protect_teammate', 'Protector', 'hunter punts'),
|
||||||
|
('W', 'fof', 'shotgun', 'Winchester Shotgun', 'kills with the Winchester'),
|
||||||
|
('W', 'bg2', 'brownbess', 'Brown Bess', 'kills with Brown Bess'),
|
||||||
|
('W', 'bg2', 'brownbess_bayonet', 'Brown Bess - Bayonet', 'kills with Brown Bess Bayonet'),
|
||||||
|
('W', 'bg2', 'charleville', 'Charleville', 'kills with Charleville'),
|
||||||
|
('W', 'bg2', 'charleville_bayonet', 'Charleville - Bayonet', 'kills with Charleville Bayonet'),
|
||||||
|
('W', 'bg2', 'hirschf', 'Hirschfaenger', 'kills with Hirschfaenger'),
|
||||||
|
('W', 'bg2', 'jaeger', 'Jaeger Rifle', 'kills with Jaeger Rifle'),
|
||||||
|
('W', 'bg2', 'knife', 'Knife', 'kills with Knife'),
|
||||||
|
('W', 'bg2', 'pennsylvania', 'Pennsylvania', 'kills with Pennsylvania'),
|
||||||
|
('W', 'bg2', 'pistol_a', 'British Pistol', 'kills with British Pistol'),
|
||||||
|
('W', 'bg2', 'pistol_b', 'American Pistol', 'kills with American Pistol'),
|
||||||
|
('W', 'bg2', 'sabre_a', 'British Sabre', 'kills with British Sabre'),
|
||||||
|
('W', 'bg2', 'sabre_b', 'American Sabre', 'kills with American Sabre'),
|
||||||
|
('W', 'bg2', 'mostkills', 'Most Kills', 'kills'),
|
||||||
|
('W', 'bg2', 'latency', 'Best Latency', 'ms average connection'),
|
||||||
|
('W', 'sgtls', 'mostkills', 'Most Kills', 'kills'),
|
||||||
|
('W', 'sgtls', 'latency', 'Best Latency', 'ms average connection'),
|
||||||
|
('W', 'sgtls', 'p90', 'FN Herstal P-90 Red Dot / FN-H P-90RD', 'kills'),
|
||||||
|
('W', 'sgtls', 'pistol', 'Beretta M92F-s', 'kills'),
|
||||||
|
('W', 'sgtls', 'knife', 'Combat Knife', 'kills'),
|
||||||
|
('W', 'sgtls', 'staff_blast', 'Staff Weapon', 'kills'),
|
||||||
|
('W', 'sgtls', 'p90D', 'FN Herstal P-90 w/ Disruptor', 'kills'),
|
||||||
|
('W', 'sgtls', 'hdevice', 'Hand Device / Ribbon Device', 'kills'),
|
||||||
|
('W', 'sgtls', 'tac_pulse', 'Tac (turrent)', 'kills'),
|
||||||
|
('W', 'sgtls', 'tac_projectile', 'Tac (bomb)', 'kills'),
|
||||||
|
('W', 'sgtls', 'c4_charge', 'C4', 'kills'),
|
||||||
|
('W', 'sgtls', 'grenade_projectile', 'M67 Frag Grenade', 'kills'),
|
||||||
|
('W', 'sgtls', 'g36', 'H&K G-36', 'kills'),
|
||||||
|
('W', 'sgtls', 'kull_blast', 'Kull Warrior Staff Device', 'kills'),
|
||||||
|
('W', 'sgtls', 'suicide_bomb', 'Goa\'uld Suicide Bomb', 'kills'),
|
||||||
|
('W', 'sgtls', 'kullblaster', 'Kull Warrior Staff Device (blast)', 'kills'),
|
||||||
|
('W', 'sgtls', 'staff', 'Staff Weapon Melee', 'kills'),
|
||||||
|
('W', 'sgtls', 'zat_blast', 'Zat', 'kills'),
|
||||||
|
('W', 'sgtls', 'awp', 'AWP Rifle', 'kills'),
|
||||||
|
('W', 'sgtls', 'grenade', 'M67 Frag Grenade', 'kills'),
|
||||||
|
('W', 'sgtls', 'zat', 'Zat (splash)', 'kills'),
|
||||||
|
('W', 'sgtls', 'tac', 'Tac (splash)', 'kills'),
|
||||||
|
('O', 'dystopia', 'Capture Guard Post', 'Capture Guard Post', 'captures'),
|
||||||
|
('O', 'dystopia', 'Capture Interior Spawn', 'Capture Interior Spawn', 'captures'),
|
||||||
|
('O', 'dystopia', 'Capture Internal Spawn', 'Capture Internal Spawn', 'captures'),
|
||||||
|
('O', 'dystopia', 'Capture The Docks', 'Capture The Docks', 'captures'),
|
||||||
|
('O', 'dystopia', 'Capture the Inner Base', 'Capture the Inner Base', 'captures'),
|
||||||
|
('O', 'dystopia', 'Capture the Spawn', 'Capture the Spawn', 'captures'),
|
||||||
|
('O', 'dystopia', 'Cut Entrance Spawn Power', 'Cut Entrance Spawn Power', 'power cuts'),
|
||||||
|
('O', 'dystopia', 'Defend Interior Spawn', 'Defend Interior Spawn', 'defenses'),
|
||||||
|
('O', 'dystopia', 'Defend Middle Spawn', 'Defend Middle Spawn', 'defenses'),
|
||||||
|
('O', 'dystopia', 'Defend Security JIP', 'Defend Security JIP', 'defenses'),
|
||||||
|
('O', 'dystopia', 'Destroy Broadcast Server', 'Destroy Broadcast Server', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy Cooling Access Door', 'Destroy Cooling Access Door', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy Cooling Tank', 'Destroy Cooling Tank', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy The Bulkhead', 'Destroy The Bulkhead', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy The Core', 'Destroy The Core', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy the Firewall', 'Destroy the Firewall', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy the Reactor', 'Destroy the Reactor', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Destroy Transformer', 'Destroy Transformer', 'destructions'),
|
||||||
|
('O', 'dystopia', 'Enable Auxilary Power Feed', 'Enable Auxilary Power Feed', 'power feed enablings'),
|
||||||
|
('O', 'dystopia', 'Enable The 4-Point Override', 'Enable The 4-Point Override', '4-point override enablings'),
|
||||||
|
('O', 'dystopia', 'Escort Hostage', 'Escort Hostage', 'escorts'),
|
||||||
|
('O', 'dystopia', 'Hack Middle Spawn', 'Hack Middle Spawn', 'hacks'),
|
||||||
|
('O', 'dystopia', 'Hack Spawn Controls', 'Hack Spawn Controls', 'hacks'),
|
||||||
|
('O', 'dystopia', 'Hack the Perimeter', 'Hack the Perimeter', 'hacks'),
|
||||||
|
('O', 'dystopia', 'Inject The Virus', 'Inject The Virus', 'injections'),
|
||||||
|
('O', 'dystopia', 'Launch Missile', 'Launch Missile', 'launches'),
|
||||||
|
('O', 'dystopia', 'Locate profile', 'Locate profile', 'locations'),
|
||||||
|
('O', 'dystopia', 'Maintain Power Routing', 'Maintain Power Routing', 'maintenances'),
|
||||||
|
('O', 'dystopia', 'Open And Destroy Data Stores / Establish An Uplink', 'Open And Destroy Data Stores / Establish An Uplink', 'times'),
|
||||||
|
('O', 'dystopia', 'Redirect Laser', 'Redirect Laser', 'redirections'),
|
||||||
|
('O', 'dystopia', 'Reroute Power To Control Room', 'Reroute Power To Control Room', 'reroutings'),
|
||||||
|
('O', 'dystopia', 'Shut Down Security', 'Shut Down Security', 'shutdowns'),
|
||||||
|
('O', 'dystopia', 'Shutdown The Production Line', 'hutdown The Production Line', 'shutdowns'),
|
||||||
|
('O', 'dystopia', 'Smash Data Storage', 'Smash Data Storage', 'smashings'),
|
||||||
|
('O', 'dystopia', 'Turn Power Offline', 'Turn Power Offline', 'times'),
|
||||||
|
('W', 'dystopia', 'bonuspoints', 'Most Bonus Points', 'bonus points'),
|
||||||
|
('W', 'dystopia', 'latency', 'Best Latency', 'ms average connection'),
|
||||||
|
('W', 'dystopia', 'Light Katana', 'Light Katana', 'kills'),
|
||||||
|
('W', 'dystopia', 'Medium Katana', 'Medium Katana', 'kills'),
|
||||||
|
('W', 'dystopia', 'Fatman Fist', 'Fatman Fist', 'kills'),
|
||||||
|
('W', 'dystopia', 'Machine Pistol', 'Machine Pistol', 'kills'),
|
||||||
|
('W', 'dystopia', 'Shotgun', 'Shotgun', 'kills'),
|
||||||
|
('W', 'dystopia', 'Laser Rifle', 'Laser Rifle', 'kills'),
|
||||||
|
('W', 'dystopia', 'BoltGun', 'Bolt Gun', 'kills'),
|
||||||
|
('W', 'dystopia', 'SmartLock Pistols', 'Smartlock Pistols', 'kills'),
|
||||||
|
('W', 'dystopia', 'Assault Rifle', 'Assault Rifle', 'kills'),
|
||||||
|
('W', 'dystopia', 'Grenade Launcher', 'Grenade Launcher', 'kills'),
|
||||||
|
('W', 'dystopia', 'MK-808 Rifle', 'MK-808 Rifle', 'kills'),
|
||||||
|
('W', 'dystopia', 'Tesla Rifle', 'Tesla Rifle', 'kills'),
|
||||||
|
('W', 'dystopia', 'Rocket Launcher', 'Rocket Launcher', 'kills'),
|
||||||
|
('W', 'dystopia', 'Minigun', 'Minigun', 'kills'),
|
||||||
|
('W', 'dystopia', 'Ion Cannon', 'Ion Cannon', 'kills'),
|
||||||
|
('W', 'dystopia', 'Basilisk', 'Basilisk', 'kills'),
|
||||||
|
('W', 'dystopia', 'Frag Grenade', 'Frag Grenade', 'kills'),
|
||||||
|
('W', 'dystopia', 'EMP Grenade', 'EMP Grenade', 'kills'),
|
||||||
|
('W', 'dystopia', 'Spider Grenade', 'Spider Grenade', 'kills'),
|
||||||
|
('W', 'dystopia', 'Cortex Bomb', 'Cortex Bomb', 'kills'),
|
||||||
|
('W', 'dystopia', 'Leg Boosters', 'Leg Boosters', 'kills'),
|
||||||
|
('W', 'dystopia', 'Trap', 'Trap', 'kills'),
|
||||||
|
('W', 'dystopia', 'Turret', 'Turret', 'kills');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Clans`
|
||||||
|
ADD COLUMN `mapregion` varchar(128) NOT NULL default '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Admin`
|
||||||
|
CHANGE `message` `message` varchar(255) NOT NULL default '';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games` (`code`, `name`, `realgame`, `hidden`) VALUES
|
||||||
|
('bg2', 'Battle Grounds 2', 'bg2', '1'),
|
||||||
|
('sgtls', 'Stargate: The Last Stand', 'sgtls', '1'),
|
||||||
|
('dystopia', 'Dystopia', 'dystopia', '1');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Games_Defaults` SET `value` = 0 WHERE `parameter` = 'DisplayResultsInBrowser' AND `code` IN ('ges','insmod');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`) VALUES
|
||||||
|
('bg2', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('bg2', 'GameEngine', '3'),
|
||||||
|
('bg2', 'AddressPort', '0.0.0.0:27015'),
|
||||||
|
('bg2', 'Admins', ''),
|
||||||
|
('bg2', 'AutoBanRetry', '0'),
|
||||||
|
('bg2', 'AutoTeamBalance', '0'),
|
||||||
|
('bg2', 'BonusRoundIgnore', '0'),
|
||||||
|
('bg2', 'BonusRoundTime', '0'),
|
||||||
|
('bg2', 'BroadCastEvents', '1'),
|
||||||
|
('bg2', 'BroadCastPlayerActions', '1'),
|
||||||
|
('bg2', 'DefaultDisplayEvents', '1'),
|
||||||
|
('bg2', 'EnablePublicCommands', '1'),
|
||||||
|
('bg2', 'GameType', '0'),
|
||||||
|
('bg2', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('bg2', 'IgnoreBots', '1'),
|
||||||
|
('bg2', 'MinimumPlayersRank', '0'),
|
||||||
|
('bg2', 'MinPlayers', '4'),
|
||||||
|
('bg2', 'PlayerEvents', '1'),
|
||||||
|
('bg2', 'ShowStats', '1'),
|
||||||
|
('bg2', 'SkillMode', '0'),
|
||||||
|
('bg2', 'SuicidePenalty', '5'),
|
||||||
|
('bg2', 'SwitchAdmins', '0'),
|
||||||
|
('bg2', 'TKPenalty', '25'),
|
||||||
|
('bg2', 'TrackServerLoad', '1'),
|
||||||
|
('bg2', 'ConnectAnnounce', '1'),
|
||||||
|
('bg2', 'UpdateHostname', '1'),
|
||||||
|
('sgtls', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('sgtls', 'GameEngine', '3'),
|
||||||
|
('sgtls', 'AddressPort', '0.0.0.0:27015'),
|
||||||
|
('sgtls', 'Admins', ''),
|
||||||
|
('sgtls', 'AutoBanRetry', '0'),
|
||||||
|
('sgtls', 'AutoTeamBalance', '0'),
|
||||||
|
('sgtls', 'BonusRoundIgnore', '0'),
|
||||||
|
('sgtls', 'BonusRoundTime', '0'),
|
||||||
|
('sgtls', 'BroadCastEvents', '1'),
|
||||||
|
('sgtls', 'BroadCastPlayerActions', '1'),
|
||||||
|
('sgtls', 'DefaultDisplayEvents', '1'),
|
||||||
|
('sgtls', 'EnablePublicCommands', '1'),
|
||||||
|
('sgtls', 'GameType', '0'),
|
||||||
|
('sgtls', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('sgtls', 'IgnoreBots', '1'),
|
||||||
|
('sgtls', 'MinimumPlayersRank', '0'),
|
||||||
|
('sgtls', 'MinPlayers', '4'),
|
||||||
|
('sgtls', 'PlayerEvents', '1'),
|
||||||
|
('sgtls', 'ShowStats', '1'),
|
||||||
|
('sgtls', 'SkillMode', '0'),
|
||||||
|
('sgtls', 'SuicidePenalty', '5'),
|
||||||
|
('sgtls', 'SwitchAdmins', '0'),
|
||||||
|
('sgtls', 'TKPenalty', '25'),
|
||||||
|
('sgtls', 'TrackServerLoad', '1'),
|
||||||
|
('sgtls', 'ConnectAnnounce', '1'),
|
||||||
|
('sgtls', 'UpdateHostname', '1'),
|
||||||
|
('dystopia', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('dystopia', 'GameEngine', '2'),
|
||||||
|
('dystopia', 'AddressPort', '0.0.0.0:27015'),
|
||||||
|
('dystopia', 'Admins', ''),
|
||||||
|
('dystopia', 'AutoBanRetry', '0'),
|
||||||
|
('dystopia', 'AutoTeamBalance', '0'),
|
||||||
|
('dystopia', 'BonusRoundIgnore', '0'),
|
||||||
|
('dystopia', 'BonusRoundTime', '0'),
|
||||||
|
('dystopia', 'BroadCastEvents', '1'),
|
||||||
|
('dystopia', 'BroadCastPlayerActions', '1'),
|
||||||
|
('dystopia', 'DefaultDisplayEvents', '1'),
|
||||||
|
('dystopia', 'EnablePublicCommands', '1'),
|
||||||
|
('dystopia', 'GameType', '0'),
|
||||||
|
('dystopia', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('dystopia', 'IgnoreBots', '1'),
|
||||||
|
('dystopia', 'MinimumPlayersRank', '0'),
|
||||||
|
('dystopia', 'MinPlayers', '4'),
|
||||||
|
('dystopia', 'PlayerEvents', '1'),
|
||||||
|
('dystopia', 'ShowStats', '1'),
|
||||||
|
('dystopia', 'SkillMode', '0'),
|
||||||
|
('dystopia', 'SuicidePenalty', '5'),
|
||||||
|
('dystopia', 'SwitchAdmins', '0'),
|
||||||
|
('dystopia', 'TKPenalty', '25'),
|
||||||
|
('dystopia', 'TrackServerLoad', '1'),
|
||||||
|
('dystopia', 'ConnectAnnounce', '1'),
|
||||||
|
('dystopia', 'UpdateHostname', '1'),
|
||||||
|
('bg2', 'PlayerEventsCommandOSD', ''),
|
||||||
|
('hl2mp', 'PlayerEventsCommandOSD', '');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Supported` (`code`, `name`) VALUES
|
||||||
|
('bg2', 'Battle Grounds 2'),
|
||||||
|
('sgtls', 'Stargate: The Last Stand'),
|
||||||
|
('dystopia', 'Dystopia');
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Options` WHERE `keyname` = 'dbversion';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options` (`keyname`, `value`, `opttype`) VALUES
|
||||||
|
('dbversion', '4', 2),
|
||||||
|
('version', '1.5.4', 1),
|
||||||
|
('showqueries','1',2);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options_Choices` (`keyname`, `value`, `text`, `isDefault`) VALUES
|
||||||
|
('showqueries', '0', 'No', 1),
|
||||||
|
('showqueries', '1', 'Yes', 0),
|
||||||
|
('google_map_region', 'EUROPE', 'Europe', 0);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Players`
|
||||||
|
ADD COLUMN `blockavatar` int(1) unsigned NOT NULL default '0';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ranks` (`image`, `minKills`, `maxKills`, `rankName`, `game`) VALUES
|
||||||
|
('recruit', 0, 49, 'Recruit', 'bg2'),
|
||||||
|
('private', 50, 99, 'Private', 'bg2'),
|
||||||
|
('private-first-class', 100, 199, 'Private First Class', 'bg2'),
|
||||||
|
('lance-corporal', 200, 299, 'Lance Corporal', 'bg2'),
|
||||||
|
('corporal', 300, 399, 'Corporal', 'bg2'),
|
||||||
|
('sergeant', 400, 499, 'Sergeant', 'bg2'),
|
||||||
|
('staff-sergeant', 500, 599, 'Staff Sergeant', 'bg2'),
|
||||||
|
('gunnery-sergeant', 600, 699, 'Gunnery Sergeant', 'bg2'),
|
||||||
|
('master-sergeant', 700, 799, 'Master Sergeant', 'bg2'),
|
||||||
|
('first-sergeant', 800, 899, 'First Sergeant', 'bg2'),
|
||||||
|
('master-chief', 900, 999, 'Master Chief', 'bg2'),
|
||||||
|
('sergeant-major', 1000, 1199, 'Sergeant Major', 'bg2'),
|
||||||
|
('ensign', 1200, 1399, 'Ensign', 'bg2'),
|
||||||
|
('third-lieutenant', 1400, 1599, 'Third Lieutenant', 'bg2'),
|
||||||
|
('second-lieutenant', 1600, 1799, 'Second Lieutenant', 'bg2'),
|
||||||
|
('first-lieutenant', 1800, 1999, 'First Lieutenant', 'bg2'),
|
||||||
|
('captain', 2000, 2249, 'Captain', 'bg2'),
|
||||||
|
('group-captain', 2250, 2499, 'Group Captain', 'bg2'),
|
||||||
|
('senior-captain', 2500, 2749, 'Senior Captain', 'bg2'),
|
||||||
|
('lieutenant-major', 2750, 2999, 'Lieutenant Major', 'bg2'),
|
||||||
|
('major', 3000, 3499, 'Major', 'bg2'),
|
||||||
|
('group-major', 3500, 3999, 'Group Major', 'bg2'),
|
||||||
|
('lieutenant-commander', 4000, 4499, 'Lieutenant Commander', 'bg2'),
|
||||||
|
('commander', 4500, 4999, 'Commander', 'bg2'),
|
||||||
|
('group-commander', 5000, 5749, 'Group Commander', 'bg2'),
|
||||||
|
('lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel', 'bg2'),
|
||||||
|
('colonel', 6500, 7249, 'Colonel', 'bg2'),
|
||||||
|
('brigadier', 7250, 7999, 'Brigadier', 'bg2'),
|
||||||
|
('brigadier-general', 8000, 8999, 'Brigadier General', 'bg2'),
|
||||||
|
('major-general', 9000, 9999, 'Major General', 'bg2'),
|
||||||
|
('lieutenant-general', 10000, 12499, 'Lieutenant General', 'bg2'),
|
||||||
|
('general', 12500, 14999, 'General', 'bg2'),
|
||||||
|
('commander-general', 15000, 17499, 'Commander General', 'bg2'),
|
||||||
|
('field-vice-marshal', 17500, 19999, 'Field Vice Marshal', 'bg2'),
|
||||||
|
('field-marshal', 20000, 22499, 'Field Marshal', 'bg2'),
|
||||||
|
('vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army', 'bg2'),
|
||||||
|
('commander-of-the-army', 25000, 27499, 'Commander of the Army', 'bg2'),
|
||||||
|
('high-commander', 27500, 29999, 'High Commander', 'bg2'),
|
||||||
|
('supreme-commander', 30000, 34999, 'Supreme Commander', 'bg2'),
|
||||||
|
('terminator', 35000, 9999999, 'Terminator', 'bg2'),
|
||||||
|
('recruit', 0, 49, 'Recruit', 'sgtls'),
|
||||||
|
('private', 50, 99, 'Private', 'sgtls'),
|
||||||
|
('private-first-class', 100, 199, 'Private First Class', 'sgtls'),
|
||||||
|
('lance-corporal', 200, 299, 'Lance Corporal', 'sgtls'),
|
||||||
|
('corporal', 300, 399, 'Corporal', 'sgtls'),
|
||||||
|
('sergeant', 400, 499, 'Sergeant', 'sgtls'),
|
||||||
|
('staff-sergeant', 500, 599, 'Staff Sergeant', 'sgtls'),
|
||||||
|
('gunnery-sergeant', 600, 699, 'Gunnery Sergeant', 'sgtls'),
|
||||||
|
('master-sergeant', 700, 799, 'Master Sergeant', 'sgtls'),
|
||||||
|
('first-sergeant', 800, 899, 'First Sergeant', 'sgtls'),
|
||||||
|
('master-chief', 900, 999, 'Master Chief', 'sgtls'),
|
||||||
|
('sergeant-major', 1000, 1199, 'Sergeant Major', 'sgtls'),
|
||||||
|
('ensign', 1200, 1399, 'Ensign', 'sgtls'),
|
||||||
|
('third-lieutenant', 1400, 1599, 'Third Lieutenant', 'sgtls'),
|
||||||
|
('second-lieutenant', 1600, 1799, 'Second Lieutenant', 'sgtls'),
|
||||||
|
('first-lieutenant', 1800, 1999, 'First Lieutenant', 'sgtls'),
|
||||||
|
('captain', 2000, 2249, 'Captain', 'sgtls'),
|
||||||
|
('group-captain', 2250, 2499, 'Group Captain', 'sgtls'),
|
||||||
|
('senior-captain', 2500, 2749, 'Senior Captain', 'sgtls'),
|
||||||
|
('lieutenant-major', 2750, 2999, 'Lieutenant Major', 'sgtls'),
|
||||||
|
('major', 3000, 3499, 'Major', 'sgtls'),
|
||||||
|
('group-major', 3500, 3999, 'Group Major', 'sgtls'),
|
||||||
|
('lieutenant-commander', 4000, 4499, 'Lieutenant Commander', 'sgtls'),
|
||||||
|
('commander', 4500, 4999, 'Commander', 'sgtls'),
|
||||||
|
('group-commander', 5000, 5749, 'Group Commander', 'sgtls'),
|
||||||
|
('lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel', 'sgtls'),
|
||||||
|
('colonel', 6500, 7249, 'Colonel', 'sgtls'),
|
||||||
|
('brigadier', 7250, 7999, 'Brigadier', 'sgtls'),
|
||||||
|
('brigadier-general', 8000, 8999, 'Brigadier General', 'sgtls'),
|
||||||
|
('major-general', 9000, 9999, 'Major General', 'sgtls'),
|
||||||
|
('lieutenant-general', 10000, 12499, 'Lieutenant General', 'sgtls'),
|
||||||
|
('general', 12500, 14999, 'General', 'sgtls'),
|
||||||
|
('commander-general', 15000, 17499, 'Commander General', 'sgtls'),
|
||||||
|
('field-vice-marshal', 17500, 19999, 'Field Vice Marshal', 'sgtls'),
|
||||||
|
('field-marshal', 20000, 22499, 'Field Marshal', 'sgtls'),
|
||||||
|
('vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army', 'sgtls'),
|
||||||
|
('commander-of-the-army', 25000, 27499, 'Commander of the Army', 'sgtls'),
|
||||||
|
('high-commander', 27500, 29999, 'High Commander', 'sgtls'),
|
||||||
|
('supreme-commander', 30000, 34999, 'Supreme Commander', 'sgtls'),
|
||||||
|
('terminator', 35000, 9999999, 'Terminator', 'sgtls'),
|
||||||
|
('recruit', 0, 49, 'Recruit', 'dystopia'),
|
||||||
|
('private', 50, 99, 'Private', 'dystopia'),
|
||||||
|
('private-first-class', 100, 199, 'Private First Class', 'dystopia'),
|
||||||
|
('lance-corporal', 200, 299, 'Lance Corporal', 'dystopia'),
|
||||||
|
('corporal', 300, 399, 'Corporal', 'dystopia'),
|
||||||
|
('sergeant', 400, 499, 'Sergeant', 'dystopia'),
|
||||||
|
('staff-sergeant', 500, 599, 'Staff Sergeant', 'dystopia'),
|
||||||
|
('gunnery-sergeant', 600, 699, 'Gunnery Sergeant', 'dystopia'),
|
||||||
|
('master-sergeant', 700, 799, 'Master Sergeant', 'dystopia'),
|
||||||
|
('first-sergeant', 800, 899, 'First Sergeant', 'dystopia'),
|
||||||
|
('master-chief', 900, 999, 'Master Chief', 'dystopia'),
|
||||||
|
('sergeant-major', 1000, 1199, 'Sergeant Major', 'dystopia'),
|
||||||
|
('ensign', 1200, 1399, 'Ensign', 'dystopia'),
|
||||||
|
('third-lieutenant', 1400, 1599, 'Third Lieutenant', 'dystopia'),
|
||||||
|
('second-lieutenant', 1600, 1799, 'Second Lieutenant', 'dystopia'),
|
||||||
|
('first-lieutenant', 1800, 1999, 'First Lieutenant', 'dystopia'),
|
||||||
|
('captain', 2000, 2249, 'Captain', 'dystopia'),
|
||||||
|
('group-captain', 2250, 2499, 'Group Captain', 'dystopia'),
|
||||||
|
('senior-captain', 2500, 2749, 'Senior Captain', 'dystopia'),
|
||||||
|
('lieutenant-major', 2750, 2999, 'Lieutenant Major', 'dystopia'),
|
||||||
|
('major', 3000, 3499, 'Major', 'dystopia'),
|
||||||
|
('group-major', 3500, 3999, 'Group Major', 'dystopia'),
|
||||||
|
('lieutenant-commander', 4000, 4499, 'Lieutenant Commander', 'dystopia'),
|
||||||
|
('commander', 4500, 4999, 'Commander', 'dystopia'),
|
||||||
|
('group-commander', 5000, 5749, 'Group Commander', 'dystopia'),
|
||||||
|
('lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel', 'dystopia'),
|
||||||
|
('colonel', 6500, 7249, 'Colonel', 'dystopia'),
|
||||||
|
('brigadier', 7250, 7999, 'Brigadier', 'dystopia'),
|
||||||
|
('brigadier-general', 8000, 8999, 'Brigadier General', 'dystopia'),
|
||||||
|
('major-general', 9000, 9999, 'Major General', 'dystopia'),
|
||||||
|
('lieutenant-general', 10000, 12499, 'Lieutenant General', 'dystopia'),
|
||||||
|
('general', 12500, 14999, 'General', 'dystopia'),
|
||||||
|
('commander-general', 15000, 17499, 'Commander General', 'dystopia'),
|
||||||
|
('field-vice-marshal', 17500, 19999, 'Field Vice Marshal', 'dystopia'),
|
||||||
|
('field-marshal', 20000, 22499, 'Field Marshal', 'dystopia'),
|
||||||
|
('vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army', 'dystopia'),
|
||||||
|
('commander-of-the-army', 25000, 27499, 'Commander of the Army', 'dystopia'),
|
||||||
|
('high-commander', 27500, 29999, 'High Commander', 'dystopia'),
|
||||||
|
('supreme-commander', 30000, 34999, 'Supreme Commander', 'dystopia'),
|
||||||
|
('terminator', 35000, 9999999, 'Terminator', 'dystopia');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Roles` (`game`, `code`, `name`, `hidden`) VALUES
|
||||||
|
('dystopia','1','Light','0'),
|
||||||
|
('dystopia','2','Medium','0'),
|
||||||
|
('dystopia','3','Heavy','0');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config` SET `value` = 0 WHERE `parameter` = 'DisplayResultsInBrowser' AND `serverId` IN (SELECT `serverId` FROM `hlstats_Servers` WHERE `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` IN ('ges','insmod')));
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Teams` (`game`, `code`, `name`, `hidden`, `playerlist_bgcolor`, `playerlist_color`, `playerlist_index`) VALUES
|
||||||
|
('bg2','British','The British','','#FFD5D5','#FF2D2D',2),
|
||||||
|
('bg2','Americans','The Americans','','#D2E8F7','#0080C0',1),
|
||||||
|
('sgtls','Goa\'uld','Goa\'uld','','#FFD5D5','#FF2D2D',2),
|
||||||
|
('sgtls','Tau\'ri','Tau\'ri','','#D2E8F7','#0080C0',1),
|
||||||
|
('dystopia','Punks','Punks','','#FFD5D5','#FF2D2D',2),
|
||||||
|
('dystopia','Corps','Corps','','#D2E8F7','#0080C0',1);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`) VALUES
|
||||||
|
('fof', 'shotgun', 'Winchester Shotgun', 1),
|
||||||
|
('bg2', 'brownbess', 'Brown Bess', 1),
|
||||||
|
('bg2', 'brownbess_bayonet', 'Brown Bess - Bayonet', 1),
|
||||||
|
('bg2', 'charleville', 'Charleville', 1),
|
||||||
|
('bg2', 'charleville_bayonet', 'Charleville - Bayonet', 1),
|
||||||
|
('bg2', 'hirschf', 'Hirschfaenger', 1),
|
||||||
|
('bg2', 'jaeger', 'Jaeger Rifle', 1),
|
||||||
|
('bg2', 'knife', 'Knife', 2),
|
||||||
|
('bg2', 'pennsylvania', 'Pennsylvania', 1),
|
||||||
|
('bg2', 'pistol_a', 'British Pistol', 1.5),
|
||||||
|
('bg2', 'pistol_b', 'American Pistol', 1.5),
|
||||||
|
('bg2', 'sabre_a', 'British Sabre', 1),
|
||||||
|
('bg2', 'sabre_b', 'American Sabre', 1),
|
||||||
|
('sgtls', 'p90', 'FN Herstal P-90 Red Dot / FN-H P-90RD', 1),
|
||||||
|
('sgtls', 'pistol', 'Beretta M92F-s', 1),
|
||||||
|
('sgtls', 'knife', 'Combat Knife', 1),
|
||||||
|
('sgtls', 'staff_blast', 'Staff Weapon', 1),
|
||||||
|
('sgtls', 'p90D', 'FN Herstal P-90 w/ Disruptor', 1),
|
||||||
|
('sgtls', 'hdevice', 'Hand Device / Ribbon Device', 1),
|
||||||
|
('sgtls', 'tac_pulse', 'Tac (turrent)', 1),
|
||||||
|
('sgtls', 'tac_projectile', 'Tac (bomb)', 1),
|
||||||
|
('sgtls', 'c4_charge', 'C4', 1),
|
||||||
|
('sgtls', 'grenade_projectile', 'M67 Frag Grenade', 1),
|
||||||
|
('sgtls', 'g36', 'H&K G-36', 1),
|
||||||
|
('sgtls', 'kull_blast', 'Kull Warrior Staff Device', 1),
|
||||||
|
('sgtls', 'suicide_bomb', 'Goa\'uld Suicide Bomb', 1),
|
||||||
|
('sgtls', 'kullblaster', 'Kull Warrior Staff Device (blast)', 1),
|
||||||
|
('sgtls', 'staff', 'Staff Weapon Melee', 1),
|
||||||
|
('sgtls', 'zat_blast', 'Zat', 1),
|
||||||
|
('sgtls', 'awp', 'AWP Rifle', 1),
|
||||||
|
('sgtls', 'grenade', 'M67 Frag Grenade', 1),
|
||||||
|
('sgtls', 'zat', 'Zat (splash)', 1),
|
||||||
|
('sgtls', 'tac', 'Tac (splash)', 1),
|
||||||
|
('dystopia', 'Light Katana', 'Light Katana', 1),
|
||||||
|
('dystopia', 'Medium Katana', 'Medium Katana', 1),
|
||||||
|
('dystopia', 'Fatman Fist', 'Fatman Fist', 1),
|
||||||
|
('dystopia', 'Machine Pistol', 'Machine Pistol', 1),
|
||||||
|
('dystopia', 'Shotgun', 'Shotgun', 1),
|
||||||
|
('dystopia', 'Laser Rifle', 'Laser Rifle', 1),
|
||||||
|
('dystopia', 'BoltGun', 'Bolt Gun', 1),
|
||||||
|
('dystopia', 'SmartLock Pistols', 'Smartlock Pistols', 1),
|
||||||
|
('dystopia', 'Assault Rifle', 'Assault Rifle', 1),
|
||||||
|
('dystopia', 'Grenade Launcher', 'Grenade Launcher', 1),
|
||||||
|
('dystopia', 'MK-808 Rifle', 'MK-808 Rifle', 1),
|
||||||
|
('dystopia', 'Tesla Rifle', 'Tesla Rifle', 1),
|
||||||
|
('dystopia', 'Rocket Launcher', 'Rocket Launcher', 1),
|
||||||
|
('dystopia', 'Minigun', 'Minigun', 1),
|
||||||
|
('dystopia', 'Ion Cannon', 'Ion Cannon', 1),
|
||||||
|
('dystopia', 'Basilisk', 'Basilisk', 1),
|
||||||
|
('dystopia', 'Frag Grenade', 'Frag Grenade', 1),
|
||||||
|
('dystopia', 'EMP Grenade', 'EMP Grenade', 1),
|
||||||
|
('dystopia', 'Spider Grenade', 'Spider Grenade', 1),
|
||||||
|
('dystopia', 'Cortex Bomb', 'Cortex Bomb', 1),
|
||||||
|
('dystopia', 'Leg Boosters', 'Leg Boosters', 1),
|
||||||
|
('dystopia', 'Trap', 'Trap', 1),
|
||||||
|
('dystopia', 'Turret', 'Turret', 1);
|
67
sql/Upgrade 1.5.4 - 1.5.5/upgrade_hlxcomm_154_155.sql
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`) VALUES
|
||||||
|
('insmod', 'headshot', 1, 0, '', 'Headshot Kill', '1', '', '', ''),
|
||||||
|
('insmod', 'Round_Win', 0, 10, '', 'Round Win', '', '', '1', ''),
|
||||||
|
('ges', 'GE_AWARD_DEADLY', 10, 0, '', 'Most Deadly', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_HONORABLE', 5, 0, '', 'Most Honorable', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_PROFESSIONAL', 10, 0, '', 'Most Professional', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_MARKSMANSHIP', 1, 0, '', 'Marksmanship Award', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_AC10', 2, 0, '', 'AC-10 Award', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_FRANTIC', 2, 0, '', 'Most Frantic', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_WTA', 1, 0, '', 'Where''s the Ammo?', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_LEMMING', -1, 0, '', 'Lemming (suicide)', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_LONGIN', 1, 0, '', 'Longest Innings', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_SHORTIN', -1, 0, '', 'Shortest Innings', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_DISHONORABLE', -10, 0, '', 'Most Dishonorable', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_NOTAC10', 4, 0, '', 'Where''s the Armor?', '1', '', '', ''),
|
||||||
|
('ges', 'GE_AWARD_MOSTLYHARMLESS', -1, 0, '', 'Mostly Harmless', '1', '', '', '');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`) VALUES
|
||||||
|
('W', 'ges', 'mostkills', 'Bond, James Bond', 'kills');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`) VALUES
|
||||||
|
('bg2', 'PlayerEventsCommandHint', ''),
|
||||||
|
('dystopia', 'PlayerEventsCommandHint', ''),
|
||||||
|
('ff', 'PlayerEventsCommandHint', ''),
|
||||||
|
('fof', 'PlayerEventsCommandHint', ''),
|
||||||
|
('ges', 'PlayerEventsCommandHint', ''),
|
||||||
|
('hidden', 'PlayerEventsCommandHint', ''),
|
||||||
|
('insmod', 'PlayerEventsCommandHint', ''),
|
||||||
|
('l4d', 'PlayerEventsCommandHint', ''),
|
||||||
|
('sgtls', 'PlayerEventsCommandHint', ''),
|
||||||
|
('zps', 'PlayerEventsCommandHint', '');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Mods_Defaults` (`code`, `parameter`, `value`) VALUES
|
||||||
|
('', 'PlayerEventsCommandHint', ''),
|
||||||
|
('AMXX', 'PlayerEventsCommandHint', 'hlx_amx_hint'),
|
||||||
|
('BEETLE', 'PlayerEventsCommandHint', ''),
|
||||||
|
('MANI', 'PlayerEventsCommandHint', 'ma_hlx_hint'),
|
||||||
|
('MINISTATS', 'PlayerEventsCommandHint', ''),
|
||||||
|
('SOURCEMOD', 'PlayerEventsCommandHint', 'hlx_sm_hint');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverId`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'PlayerEventsCommandHint', '' FROM hlstats_Servers_Config WHERE `parameter`='MOD' and `value` IN ('', 'BEETLE', 'MINISTATS'));
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverId`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'PlayerEventsCommandHint', 'hlx_amx_hint' FROM hlstats_Servers_Config WHERE `parameter`='MOD' and `value` = 'AMXX');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverId`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'PlayerEventsCommandHint', 'ma_hlx_hint' FROM hlstats_Servers_Config WHERE `parameter`='MOD' and `value` = 'MANI');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Servers_Config` (`serverId`, `parameter`, `value`)
|
||||||
|
(SELECT `serverId`, 'PlayerEventsCommandHint', 'hlx_sm_hint' FROM hlstats_Servers_Config WHERE `parameter`='MOD' and `value` = 'SOURCEMOD');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config` SET `value` = '' WHERE `parameter` = 'PlayerEventsCommandHint' AND `serverId` IN (SELECT `serverId` FROM `hlstats_Servers` WHERE `game` IN (SELECT `code` FROM `hlstats_Games` WHERE `realgame` IN ('bg2', 'dystopia', 'ff', 'fof', 'ges', 'hidden', 'insmod', 'l4d', 'sgtls', 'zps')));
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config` SET `value` = 'amx_chat' WHERE `parameter` = 'PlayerEventsAdminCommand' AND `value` = '' AND serverId IN (SELECT serverId FROM (SELECT serverId FROM `hlstats_Servers_Config` WHERE `parameter` = 'MOD' AND `value` = 'AMXX') AS x);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config` SET `value` = 'admin_chat' WHERE `parameter` = 'PlayerEventsAdminCommand' AND `value` = '' AND serverId IN (SELECT serverId FROM (SELECT serverId FROM `hlstats_Servers_Config` WHERE `parameter` = 'MOD' AND `value` = 'BEETLE') AS x);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config` SET `value` = 'ma_chat' WHERE `parameter` = 'PlayerEventsAdminCommand' AND `value` = '' AND serverId IN (SELECT serverId FROM (SELECT serverId FROM `hlstats_Servers_Config` WHERE `parameter` = 'MOD' AND `value` = 'MANI') AS x);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Servers_Config` SET `value` = 'sm_chat' WHERE `parameter` = 'PlayerEventsAdminCommand' AND `value` = '' AND serverId IN (SELECT serverId FROM (SELECT serverId FROM `hlstats_Servers_Config` WHERE `parameter` = 'MOD' AND `value` = 'SOURCEMOD') AS x);
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Servers_Config_Default` (`parameter`, `value`, `description`) VALUES
|
||||||
|
('PlayerEventsCommandHint', 'hlx_sm_hint', 'The command to display "hint" style messages for ATB switches. Default is "".');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `value` = '1.5.5' WHERE `keyname` = 'version';
|
||||||
|
UPDATE `hlstats_Options` SET `value` = '5' WHERE `keyname` = 'dbversion';
|
54
sql/Upgrade 1.5.5 - 1.5.6/upgrade_hlxcomm_155_156.sql
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'pyro_extinguish', 1, 0, '', 'Extinguished Teammate (Pyro)', '1', '0', '0', '0' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'sniper_extinguish', 1, 0, '', 'Extinguished Teammate (Sniper)', '1', '0', '0', '0' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Awards` SET `code` = 'sandman' WHERE `code` = 'bat_wood';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O', code, 'pyro_extinguish', 'Give It a Little Blow', 'extinguishes with Flamethrower' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O', code, 'sniper_extinguish', 'Douser', 'extinguishes with Jarate' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W', code, 'force_a_nature', 'Who wants some of this?', 'kills with the Force-A-Nature' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W', code, 'ambassador', 'Diplomatic Immunity', 'kills with the Ambassador' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W', code, 'tf_projectile_arrow', 'Quivering Fool', 'kills with the Huntsman' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W', code, 'taunt_spy', 'Dangerous Crab', 'spy taunt kills' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W', code, 'taunt_sniper', 'Robin Hood', 'sniper taunt kills' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Frags` SET `weapon` = 'sandman' WHERE `weapon` = 'bat_wood';
|
||||||
|
UPDATE `hlstats_Events_Suicides` SET `weapon` = 'sandman' WHERE `weapon` = 'bat_wood';
|
||||||
|
UPDATE `hlstats_Events_Teamkills` SET `weapon` = 'sandman' WHERE `weapon` = 'bat_wood';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `value` = '1.5.6' WHERE `keyname` = 'version';
|
||||||
|
UPDATE `hlstats_Options` SET `value` = '6' WHERE `keyname` = 'dbversion';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE `hlstats_Weapons` SET `code` = 'sandman' WHERE `code` = 'bat_wood';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'force_a_nature', 'Force-A-Nature', 1 FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'ambassador', 'Ambassador', 1 FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'tf_projectile_arrow', 'Huntsman', 1 FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'taunt_spy', 'Spy Taunt', 3 FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'taunt_sniper', 'Sniper Taunt', 3 FROM hlstats_Games WHERE `realgame` = 'tf');
|
711
sql/Upgrade 1.5.6 - 1.6.0/upgrade_hlxcomm_156_160.sql
Normal file
|
@ -0,0 +1,711 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'medic_extinguish', 1, 0, '', 'Extinguished Teammate (Medic)', '1', '0', '0', '0' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'engineer_extinguish', 1, 0, '', 'Extinguished Teammate (Engineer)', '1', '0', '0', '0' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'teleport', 1, 0, '', 'Teleporter used', '1', '', '', '' FROM hlstats_Games where `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'teleport_self', 0, 0, '', 'Teleporter used (self)', '1', '', '', '' FROM hlstats_Games where `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`) VALUES
|
||||||
|
('W', 'nts', 'aa13', 'AA13', 'kills with AA13'),
|
||||||
|
('W', 'nts', 'grenade_projectile', 'Frag Grenade', 'kills with Frag Grenade'),
|
||||||
|
('W', 'nts', 'jitte', 'Jitte', 'kills with Jitte'),
|
||||||
|
('W', 'nts', 'jittescoped', 'Jitte (Scoped)', 'kills with Jitte (Scoped)'),
|
||||||
|
('W', 'nts', 'knife', 'Knife', 'kills with Knife'),
|
||||||
|
('W', 'nts', 'kyla', 'KYLA', 'kills with KYLA'),
|
||||||
|
('W', 'nts', 'm41', 'M41', 'kills with M41'),
|
||||||
|
('W', 'nts', 'm41l', 'M41L', 'kills with M41L'),
|
||||||
|
('W', 'nts', 'milso', 'MilSO', 'kills with MilSO'),
|
||||||
|
('W', 'nts', 'mp5', 'MP5', 'kills with MP5'),
|
||||||
|
('W', 'nts', 'mpn', 'MPN45', 'kills with MPN45'),
|
||||||
|
('W', 'nts', 'mx', 'MX', 'kills with MX'),
|
||||||
|
('W', 'nts', 'mx_silenced', 'MX Silenced', 'kills with MX Silenced'),
|
||||||
|
('W', 'nts', 'pz', 'PZ252', 'kills with PZ252'),
|
||||||
|
('W', 'nts', 'grenade_detapack', 'DetPac', 'kills with DetPac'),
|
||||||
|
('W', 'nts', 'smac', 'SMAC', 'kills with SMAC'),
|
||||||
|
('W', 'nts', 'srm', 'SRM', 'kills with SRM'),
|
||||||
|
('W', 'nts', 'srm_s', 'SRM-S', 'kills with SRM-S'),
|
||||||
|
('W', 'nts', 'srs', 'SRS', 'kills with SRS'),
|
||||||
|
('W', 'nts', 'supa7', 'MURATA SUPA 7', 'kills with MURATA SUPA 7'),
|
||||||
|
('W', 'nts', 'tachi', 'TACHI', 'kills with TACHI'),
|
||||||
|
('W', 'nts', 'zr68c', 'ZR68C', 'kills with ZR68C'),
|
||||||
|
('W', 'nts', 'zr68l', 'ZR68L', 'kills with ZR68L'),
|
||||||
|
('W', 'nts', 'zr68s', 'ZR68S', 'kills with ZR68S'),
|
||||||
|
('W', 'nts', 'mostkills', 'Most Kills', 'kills'),
|
||||||
|
('W', 'nts', 'latency', 'Best Latency', 'ms average connection'),
|
||||||
|
('W','hl2mp','mostkills','17. Most Kills','kills'),
|
||||||
|
('W','hl2mp','suicide','18. Most Suicides','suicides');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'P', code, 'shield_blocked', 'Razor Breakin', 'razorbacks broken' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'V', code, 'shield_blocked', 'Broken Back', 'razorbacks broken (sniper)' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'P', code, 'jarate', 'Urine'' For A Surprise', 'jarates' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'V', code, 'jarate', 'Yellow Bellied Spies', 'victims jarated' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Frags` SET `pos_x` = NULL WHERE `pos_x` = '';
|
||||||
|
UPDATE `hlstats_Events_Frags` SET `pos_y` = NULL WHERE `pos_y` = '';
|
||||||
|
UPDATE `hlstats_Events_Frags` SET `pos_z` = NULL WHERE `pos_z` = '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Frags`
|
||||||
|
CHANGE `pos_x` `pos_x` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_y` `pos_y` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_z` `pos_z` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_x` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_y` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_z` MEDIUMINT default NULL;
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_PlayerActions` SET `pos_x` = NULL WHERE `pos_x` = '';
|
||||||
|
UPDATE `hlstats_Events_PlayerActions` SET `pos_y` = NULL WHERE `pos_y` = '';
|
||||||
|
UPDATE `hlstats_Events_PlayerActions` SET `pos_z` = NULL WHERE `pos_z` = '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_PlayerActions`
|
||||||
|
CHANGE `pos_x` `pos_x` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_y` `pos_y` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_z` `pos_z` MEDIUMINT default NULL;
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_PlayerPlayerActions` SET `pos_x` = NULL WHERE `pos_x` = '';
|
||||||
|
UPDATE `hlstats_Events_PlayerPlayerActions` SET `pos_y` = NULL WHERE `pos_y` = '';
|
||||||
|
UPDATE `hlstats_Events_PlayerPlayerActions` SET `pos_z` = NULL WHERE `pos_z` = '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_PlayerPlayerActions`
|
||||||
|
ADD COLUMN `pos_victim_x` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_y` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_z` MEDIUMINT default NULL;
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Suicides` SET `pos_x` = NULL WHERE `pos_x` = '';
|
||||||
|
UPDATE `hlstats_Events_Suicides` SET `pos_y` = NULL WHERE `pos_y` = '';
|
||||||
|
UPDATE `hlstats_Events_Suicides` SET `pos_z` = NULL WHERE `pos_z` = '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Suicides`
|
||||||
|
CHANGE `pos_x` `pos_x` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_y` `pos_y` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_z` `pos_z` MEDIUMINT default NULL;
|
||||||
|
|
||||||
|
UPDATE `hlstats_Events_Teamkills` SET `pos_x` = NULL WHERE `pos_x` = '';
|
||||||
|
UPDATE `hlstats_Events_Teamkills` SET `pos_y` = NULL WHERE `pos_y` = '';
|
||||||
|
UPDATE `hlstats_Events_Teamkills` SET `pos_z` = NULL WHERE `pos_z` = '';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Teamkills`
|
||||||
|
CHANGE `pos_x` `pos_x` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_y` `pos_y` MEDIUMINT default NULL,
|
||||||
|
CHANGE `pos_z` `pos_z` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_x` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_y` MEDIUMINT default NULL,
|
||||||
|
ADD COLUMN `pos_victim_z` MEDIUMINT default NULL;
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games` (`code`, `name`, `realgame`, `hidden`) VALUES
|
||||||
|
('nts','NeoTokyo','nts','1');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Defaults` (`code`, `parameter`, `value`) VALUES
|
||||||
|
('nts', 'Admins', ''),
|
||||||
|
('nts', 'AutoBanRetry', '0'),
|
||||||
|
('nts', 'AutoTeamBalance', '0'),
|
||||||
|
('nts', 'BonusRoundIgnore', '0'),
|
||||||
|
('nts', 'BonusRoundTime', '0'),
|
||||||
|
('nts', 'BroadCastEvents', '1'),
|
||||||
|
('nts', 'BroadCastPlayerActions', '1'),
|
||||||
|
('nts', 'ConnectAnnounce', '1'),
|
||||||
|
('nts', 'DefaultDisplayEvents', '1'),
|
||||||
|
('nts', 'DisplayResultsInBrowser', '1'),
|
||||||
|
('nts', 'EnablePublicCommands', '1'),
|
||||||
|
('nts', 'GameEngine', '2'),
|
||||||
|
('nts', 'GameType', '0'),
|
||||||
|
('nts', 'HLStatsURL', 'http://yoursite.com/hlstats'),
|
||||||
|
('nts', 'IgnoreBots', '1'),
|
||||||
|
('nts', 'MinimumPlayersRank', '0'),
|
||||||
|
('nts', 'MinPlayers', '4'),
|
||||||
|
('nts', 'PlayerEvents', '1'),
|
||||||
|
('nts', 'ShowStats', '1'),
|
||||||
|
('nts', 'SkillMode', '0'),
|
||||||
|
('nts', 'SuicidePenalty', '5'),
|
||||||
|
('nts', 'SwitchAdmins', '0'),
|
||||||
|
('nts', 'TKPenalty', '25'),
|
||||||
|
('nts', 'TrackServerLoad', '1'),
|
||||||
|
('nts', 'UpdateHostname', '1');
|
||||||
|
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Games_Supported` (`code`, `name`) VALUES
|
||||||
|
('nts','NeoTokyo');
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `hlstats_Heatmap_Config` (
|
||||||
|
`id` int(255) NOT NULL auto_increment,
|
||||||
|
`map` varchar(64) NOT NULL,
|
||||||
|
`game` varchar(32) NOT NULL,
|
||||||
|
`xoffset` float NOT NULL,
|
||||||
|
`yoffset` float NOT NULL,
|
||||||
|
`flipx` tinyint(1) NOT NULL default '0',
|
||||||
|
`flipy` tinyint(1) NOT NULL default '1',
|
||||||
|
`days` tinyint(4) NOT NULL default '30',
|
||||||
|
`brush` varchar(5) NOT NULL default 'small',
|
||||||
|
`scale` float NOT NULL,
|
||||||
|
`font` tinyint(2) NOT NULL default '10',
|
||||||
|
`thumbw` float NOT NULL default '0.170312',
|
||||||
|
`thumbh` float NOT NULL default '0.170312',
|
||||||
|
`cropx1` int(11) NOT NULL default '0',
|
||||||
|
`cropy1` int(11) NOT NULL default '0',
|
||||||
|
`cropx2` int(11) NOT NULL default '0',
|
||||||
|
`cropy2` int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `gamemap` (`map`, `game`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Dumping data for table `hlstats_Heatmap_Config`
|
||||||
|
--
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Heatmap_Config` (`map`, `game`, `xoffset`, `yoffset`, `flipx`, `flipy`, `days`, `brush`, `scale`, `font`, `thumbw`, `thumbh`, `cropx1`, `cropy1`, `cropx2`, `cropy2`) VALUES
|
||||||
|
('de_dust2', 'css', 5290, 4259, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('plr_pipeline', 'tf', 8006, 9236, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_hoodoo_final', 'tf', 9564, 5592, 0, 1, 30, 'small', 14, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_dustbowl', 'tf', 5109, 4821, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ctf_2fort', 'tf', 5112, 4079, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_goldrush', 'tf', 10669, 4221, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_egypt_final', 'tf', 9844, 9241, 0, 1, 30, 'small', 16, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_junction_final', 'tf', 4077, 5145, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_fastlane', 'tf', 7692, 5622, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_badwater', 'tf', 4269, 3237, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_steel', 'tf', 4069, 2637, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_badlands', 'tf', 6205, 5059, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_granary', 'tf', 9274, 6088, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_gravelpit', 'tf', 5735, 5645, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_cashworks_b3a', 'tf', 5500, 4635, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_office', 'css', 2357, 1766, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_ambush', 'bg2', 5592, 1159, 0, 1, 30, 'small', 8.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_townguard', 'bg2', 4489, 2670, 0, 1, 30, 'small', 5.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_dust', 'css', 3425, 4022, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_anzio', 'dods', 4031, 3979, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_argentan', 'dods', 4773, 2963, 0, 1, 30, 'small', 6.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_avalanche', 'dods', 3204, 2885, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_colmar', 'dods', 5915, 5373, 0, 1, 30, 'small', 9.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_donner', 'dods', 4013, 1743, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_flash', 'dods', 3895, 2330, 0, 1, 30, 'small', 5.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_jagd', 'dods', 3592, 3082, 0, 1, 30, 'small', 6.6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_kalt', 'dods', 777, 6987, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_palermo', 'dods', 2494, 3797, 0, 1, 30, 'small', 6.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_abdallah', 'insmod', 7508, 2723, 0, 1, 30, 'small', 9.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_almaden', 'insmod', 2881, 3200, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_bagdad', 'insmod', 9166, 4578, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_buhriz', 'insmod', 11943, 8220, 0, 1, 30, 'small', 16, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_haditha', 'insmod', 5582, 2630, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_haditha_night', 'insmod', 5582, 2630, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_hillah', 'insmod', 6755, 3550, 0, 1, 30, 'small', 11.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_karkar', 'insmod', 10355, 1306, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_ramadi', 'insmod', 5069, 1430, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_samawah', 'insmod', 2947, 2112, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_sinjar', 'insmod', 7427, 6887, 0, 1, 30, 'small', 11, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ins_samawah_day', 'insmod', 2809, 2152, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_badlands', 'tf', 5125, 4119, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_granary', 'tf', 6759, 4013, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_lumberyard', 'tf', 6616, 5421, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_nucleus', 'tf', 2562, 1940, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_ravine', 'tf', 2647, 3547, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_sawmill', 'tf', 4551, 4259, 0, 1, 30, 'small', 8.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_watchtower', 'tf', 3789, 3075, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_well', 'tf', 5331, 3389, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ctf_turbine', 'tf', 4496, 3593, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ctf_well', 'tf', 6437, 5123, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('tc_hydro', 'tf', 6038, 4348, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_castle4', 'tf', 4120, 7826, 0, 1, 30, 'small', 11, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_follower', 'tf', 8871, 6631, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_labor', 'tf', 5788, 3873, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_stag', 'tf', 5099, 4021, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ctf_chaos', 'tf', 3899, 3214, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dom_canalzone', 'tf', 4044, 3664, 0, 1, 30, 'small', 6.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_frontier', 'tf', 6094, 4051, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_halfacre', 'tf', 5098, 5920, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport01_greenhouse', 'l4d', 979, 3935, 0, 0, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport03_garage', 'l4d', 11413, 6781, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport04_terminal', 'l4d', 2659, 6795, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport05_runway', 'l4d', 8197, 12894, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm01_hilltop', 'l4d', 14734, 5840, 1, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm02_traintunnel', 'l4d', 11001, 3377, 1, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm03_bridge', 'l4d', 1353, 7488, 1, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm04_barn', 'l4d', 3091, 186, 1, 0, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm05_cornfield', 'l4d', 4448, 5460, 0, 0, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital01_apartment', 'l4d', 662, 5571, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital02_subway', 'l4d', 1621, 8552, 0, 0, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital03_sewers', 'l4d', 7045, 14101, 0, 0, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital04_interior', 'l4d', 9513, 16235, 0, 0, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital05_rooftop', 'l4d', 4450, 10005, 0, 0, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_smalltown01_caves', 'l4d', 20542, 3156, 1, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_smalltown02_drainage', 'l4d', 12149, 4040, 1, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_smalltown05_houseboat', 'l4d', 6554, 5155, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_jungle_a1c', 'tf', 3024, 5391, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_strider_v1', 'tf', 7109, 4078, 0, 1, 30, 'small', 7.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_warpath_v3', 'tf', 3995, 3298, 0, 1, 30, 'small', 6.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('grubas_nabijacz!_v6', 'tf', 2004, 2478, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_boulder_v5', 'tf', 9562, 12307, 0, 1, 30, 'small', 16, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_broma', 'tf', 5261, 3192, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_busytown', 'tf', 6413, 5961, 0, 1, 30, 'small', 11, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_roswell', 'tf', 2809, 4448, 0, 1, 30, 'small', 6.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_vertigo_beta3', 'tf', 3584, 3108, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_wolf2_b1', 'tf', 2182, 3838, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ctf_convoy_v2', 'tf', 3732, 2694, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_well', 'tf', 10371, 7681, 0, 1, 30, 'small', 15, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_furnace_b2', 'tf', 4667, 4823, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('pl_borax_b2', 'tf', 5252, 593, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_jailbreak_b3', 'tf', 8570, -702, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_desertfortress', 'tf', 3675, 3269, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_train', 'css', 2616, 2619, 0, 1, 30, 'small', 4.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_tides', 'css', 2385, 1589, 0, 1, 30, 'small', 3.7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_prodigy', 'css', 1025, 2198, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_port', 'css', 4189, 4131, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_piranesi', 'css', 3082, 3239, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_nuke', 'css', 3541, 1856, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_inferno', 'css', 3336, 4252, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_chateau', 'css', 2121, 3074, 0, 1, 30, 'small', 4.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_cbble', 'css', 4704, 3587, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_aztec', 'css', 4235, 3430, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_militia', 'css', 2838, 2745, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_italy', 'css', 3071, 2920, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_havana', 'css', 2958, 2678, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_compound', 'css', 1734, 3943, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_assault', 'css', 2467, 8268, 0, 0, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_lockdown', 'hl2mp', 7301, 7172, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_overwatch', 'hl2mp', 1997, 8416, 0, 0, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_powerhouse', 'hl2mp', 2558, 762, 0, 1, 30, 'small', 3.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_resistance', 'hl2mp', 2606, 2129, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_runoff', 'hl2mp', 5116, 5210, 0, 0, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_steamlab', 'hl2mp', 3854, 3471, 0, 1, 30, 'small', 2.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dm_underpass', 'hl2mp', 1611, 364, 0, 1, 30, 'small', 2.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('coop_elpaso', 'fof', 7369, 4167, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('coop_peligro', 'fof', 10378, 4070, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('coop_revenge', 'fof', 1687, 2560, 0, 1, 30, 'small', 3.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('coop_sweetwater', 'fof', 2289, 1565, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_canyonland', 'fof', 6026, 6913, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_desert', 'fof', 5996, 2255, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_desperados', 'fof', 613, -645, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_eliminator', 'fof', 5944, 7040, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_eliminator_lite', 'fof', 3306, 4981, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_elpaso', 'fof', 7031, 4138, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_loothill', 'fof', 6196, 5624, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_monumentvalley', 'fof', 2563, 6738, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_nowhere', 'fof', 4977, 1796, 0, 1, 30, 'small', 5.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_peligro', 'fof', 4913, 4044, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_peligro_lite', 'fof', 3983, 3030, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_presidio', 'fof', 3149, 1539, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_revenge', 'fof', 1685, 2584, 0, 1, 30, 'small', 3.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_sweetwater', 'fof', 2289, 1565, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_tijuana', 'fof', 3692, 3638, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_tramonto', 'fof', 4743, 2026, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fof_tramonto_lite', 'fof', 3465, 1094, 0, 1, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('as_oilrig', 'cstrike', 588.81, -730.75, 0, 0, 30, 'small', 2.48, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_747', 'cstrike', 64, -608, 0, 1, 30, 'small', 1.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_assault', 'cstrike', 720, 1024, 0, 1, 30, 'small', 1.54, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_backalley', 'cstrike', 148, 1360, 0, 0, 30, 'small', 2.08, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_estate', 'cstrike', 144, -928, 0, 1, 30, 'small', 2.04, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_havana', 'cstrike', 256, 56, 0, 0, 30, 'small', 1.38, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_italy', 'cstrike', 248, 16, 0, 1, 30, 'small', 1.57, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_militia', 'cstrike', 621, -534, 0, 0, 30, 'small', 1.69, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_office', 'cstrike', 64, -260, 0, 1, 30, 'small', 1.47, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cs_siege', 'cstrike', 564, 1252, 0, 0, 30, 'small', 1.15, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_airstrip', 'cstrike', 1116, -368, 0, 1, 30, 'small', 1.21, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_aztec', 'cstrike', 447.31, -62.94, 0, 1, 30, 'small', 1.12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_cbble', 'cstrike', 832, 576, 0, 1, 30, 'small', 1.07, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_chateau', 'cstrike', 1032, 688.5, 0, 0, 30, 'small', 1.46, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_dust', 'cstrike', 96, 960, 0, 1, 30, 'small', 1.1, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_dust2', 'cstrike', 384, 1120, 0, 1, 30, 'small', 1.26, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_inferno', 'cstrike', 404, 1312, 0, 0, 30, 'small', 1.39, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_nuke', 'cstrike', 244, -936, 0, 0, 30, 'small', 1.14, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_piranesi', 'cstrike', 48, 864, 0, 0, 30, 'small', 1.37, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_prodigy', 'cstrike', 1476, -264, 0, 0, 30, 'small', 1.94, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_storm', 'cstrike', 191, -104, 0, 0, 30, 'small', 1.42, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_survivor', 'cstrike', 832, 880, 0, 0, 30, 'small', 1.38, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_torn', 'cstrike', 112, 664, 0, 0, 30, 'small', 1.24, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_train', 'cstrike', 49.19, 156, 0, 0, 30, 'small', 1.58, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_vertigo', 'cstrike', 1280, -256, 0, 1, 30, 'small', 2.13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_dusk_patrol', 'bg2', 6504, 4690, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_fall', 'bg2', 1198, 2503, 0, 1, 30, 'small', 4.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_foothills', 'bg2', 5440, 5115, 0, 1, 30, 'small', 8.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_freemans_farm', 'bg2', 6648, 5275, 0, 1, 30, 'small', 10.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_maricopa', 'bg2', 6398, 2313, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_pillage', 'bg2', 3746, 6363, 0, 1, 30, 'small', 9.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_pinebarrens', 'bg2', 257, 6121, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_plateau', 'bg2', 3840, 3085, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_road', 'bg2', 5149, 3755, 0, 1, 30, 'small', 8.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_snowlake', 'bg2', 6194, 7018, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_woodland', 'bg2', 4924, 3236, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('bg_harbourtown', 'bg2', 2123, 4443, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_battleground', 'aoc', 4969, 2889, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_darkforest', 'aoc', 5984, 9812, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_firecrag', 'aoc', 3585, 10952, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_helms_deep', 'aoc', 5672, 2522, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_invasion', 'aoc', 3979, 3593, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_monastery', 'aoc', 5549, 3561, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_overlook', 'aoc', 3711, 2781, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_siege', 'aoc', 3186, 4274, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_sorrow', 'aoc', 4128, 6654, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_stoneshill', 'aoc', 7175, 5685, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_theshore', 'aoc', 540, 7698, 0, 0, 30, 'small', 14, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_tombs', 'aoc', 1287, 995, 0, 1, 30, 'small', 2, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_tournament', 'aoc', 1353, 1750, 0, 1, 30, 'small', 2.2, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_valley', 'aoc', 4573, 3442, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('aoc_westerlyn', 'aoc', 7166, 6094, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_2fort', 'ff', 5582, 4318, 0, 1, 30, 'small', 8.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_2morforever', 'ff', 3458, 2582, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_aardvark', 'ff', 5725, 3384, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_anticitizen', 'ff', 9919, 5646, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_attrition', 'ff', 3086, 2571, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_bases', 'ff', 5084, 4099, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_cornfield', 'ff', 4987, 3476, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_crossover', 'ff', 5996, 4577, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_cz2', 'ff', 4672, 3836, 0, 1, 30, 'small', 7.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_destroy', 'ff', 4945, 4018, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_dm', 'ff', 1917, 1501, 0, 1, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_dropdown', 'ff', 4529, 3539, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_dustbowl', 'ff', 5457, 4520, 0, 1, 30, 'small', 8.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_epicenter', 'ff', 3781, 3037, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_hunted', 'ff', 6151, 5125, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_impact', 'ff', 4096, 2190, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_monkey', 'ff', 4989, 4082, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_openfire', 'ff', 3173, 2504, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_palermo', 'ff', 6191, 3333, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_pitfall', 'ff', 4485, 3633, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_push', 'ff', 4744, 3849, 0, 1, 30, 'small', 7.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_schtop', 'ff', 4802, 3837, 0, 1, 30, 'small', 7.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_shutdown2', 'ff', 4703, 3825, 0, 1, 30, 'small', 7.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_tiger', 'ff', 2686, 1858, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_vertigo', 'ff', 2010, 1500, 0, 1, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_waterpolo', 'ff', 3209, 2608, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ff_well', 'ff', 4482, 3423, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport01_greenhouse', 'l4d', 979, 3935, 0, 0, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport03_garage', 'l4d', 11413, 6781, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport04_terminal', 'l4d', 2659, 6795, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport05_runway', 'l4d', 8197, 12894, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm01_hilltop', 'l4d', 14734, 5840, 1, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm02_traintunnel', 'l4d', 11001, 3377, 1, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm03_bridge', 'l4d', 1353, 7488, 1, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm04_barn', 'l4d', 3091, 186, 1, 0, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm05_cornfield', 'l4d', 4448, 5460, 0, 0, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital01_apartment', 'l4d', 662, 5571, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital02_subway', 'l4d', 1621, 8552, 0, 0, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital03_sewers', 'l4d', 7045, 14101, 0, 0, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital04_interior', 'l4d', 9513, 16235, 0, 0, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital05_rooftop', 'l4d', 4450, 10005, 0, 0, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_smalltown01_caves', 'l4d', 20542, 3156, 1, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_smalltown02_drainage', 'l4d', 12149, 4040, 1, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_dawn_ctg', 'nts', 3447, 5426, 0, 1, 30, 'small', 5.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_engage_ctg', 'nts', 4112, 4024, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_ghost_ctg', 'nts', 4951, 6131, 0, 1, 30, 'small', 7.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_isolation_ctg', 'nts', 5357, 3549, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_rise_ctg', 'nts', 2205, 2044, 0, 1, 30, 'small', 3.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_shrine_ctg', 'nts', 4976, 6388, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_skyline_ctg', 'nts', 4516, 2141, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_subsurface_ctg', 'nts', 3319, 1552, 0, 1, 30, 'small', 6.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_tarmac_ctg', 'nts', 2359, 3388, 0, 1, 30, 'small', 5.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('nt_transit_ctg', 'nts', 2749, 1879, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
DROP TABLE `hlstats_Livestats`;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `hlstats_Livestats` (
|
||||||
|
`player_id` int(10) NOT NULL default '0',
|
||||||
|
`server_id` int(4) NOT NULL default '0',
|
||||||
|
`cli_address` varchar(32) NOT NULL default '',
|
||||||
|
`cli_city` varchar(64) NOT NULL default '',
|
||||||
|
`cli_country` varchar(64) NOT NULL default '',
|
||||||
|
`cli_flag` varchar(16) NOT NULL default '',
|
||||||
|
`cli_state` varchar(64) NOT NULL default '',
|
||||||
|
`cli_lat` FLOAT(7,4) NULL,
|
||||||
|
`cli_lng` FLOAT(7,4) NULL,
|
||||||
|
`steam_id` varchar(64) NOT NULL default '',
|
||||||
|
`name` varchar(64) NOT NULL,
|
||||||
|
`team` varchar(64) NOT NULL default '',
|
||||||
|
`kills` int(6) NOT NULL default '0',
|
||||||
|
`deaths` int(6) NOT NULL default '0',
|
||||||
|
`suicides` int(6) NOT NULL default '0',
|
||||||
|
`headshots` int(6) NOT NULL default '0',
|
||||||
|
`shots` int(11) NOT NULL default '0',
|
||||||
|
`hits` int(11) NOT NULL default '0',
|
||||||
|
`is_dead` tinyint(1) NOT NULL default '0',
|
||||||
|
`has_bomb` int(1) NOT NULL default '0',
|
||||||
|
`ping` int(6) NOT NULL default '0',
|
||||||
|
`connected` int(10) NOT NULL default '0',
|
||||||
|
`skill_change` int(10) NOT NULL default '0',
|
||||||
|
`skill` int(10) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`player_id`)
|
||||||
|
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `hlstats_Maps_Counts` (
|
||||||
|
`rowId` int(11) NOT NULL auto_increment,
|
||||||
|
`game` varchar(32) character set utf8 NOT NULL,
|
||||||
|
`map` varchar(64) character set utf8 NOT NULL,
|
||||||
|
`kills` int(11) NOT NULL,
|
||||||
|
`headshots` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`game`,`map`),
|
||||||
|
INDEX ( `rowId` )
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Maps_Counts` (`game`, `map`, `kills`, `headshots`)
|
||||||
|
SELECT `hlstats_Servers`.`game`, `hlstats_Events_Frags`.`map`, COUNT(`hlstats_Events_Frags`.`killerId`), SUM(`hlstats_Events_Frags`.`headshot`) FROM `hlstats_Events_Frags` INNER JOIN `hlstats_Servers` ON `hlstats_Events_Frags`.`serverId` = `hlstats_Servers`.`serverId` WHERE `hlstats_Events_Frags`.`map` <> '' GROUP BY `hlstats_Servers`.`game`, `hlstats_Events_Frags`.`map`;
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `opttype` = 2 WHERE `keyname` = 'MinActivity';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Players`
|
||||||
|
ADD `activity` int(11) NOT NULL default '100',
|
||||||
|
CHANGE `lat` `lat` FLOAT(7,4) NULL,
|
||||||
|
CHANGE `lng` `lng` FLOAT(7,4) NULL;
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ranks` (`game`, `image`, `minKills`, `maxKills`, `rankName`) VALUES
|
||||||
|
('nts', 'recruit', 0, 49, 'Recruit'),
|
||||||
|
('nts', 'private', 50, 99, 'Private'),
|
||||||
|
('nts', 'private-first-class', 100, 199, 'Private First Class'),
|
||||||
|
('nts', 'lance-corporal', 200, 299, 'Lance Corporal'),
|
||||||
|
('nts', 'corporal', 300, 399, 'Corporal'),
|
||||||
|
('nts', 'sergeant', 400, 499, 'Sergeant'),
|
||||||
|
('nts', 'staff-sergeant', 500, 599, 'Staff Sergeant'),
|
||||||
|
('nts', 'gunnery-sergeant', 600, 699, 'Gunnery Sergeant'),
|
||||||
|
('nts', 'master-sergeant', 700, 799, 'Master Sergeant'),
|
||||||
|
('nts', 'first-sergeant', 800, 899, 'First Sergeant'),
|
||||||
|
('nts', 'master-chief', 900, 999, 'Master Chief'),
|
||||||
|
('nts', 'sergeant-major', 1000, 1199, 'Sergeant Major'),
|
||||||
|
('nts', 'ensign', 1200, 1399, 'Ensign'),
|
||||||
|
('nts', 'third-lieutenant', 1400, 1599, 'Third Lieutenant'),
|
||||||
|
('nts', 'second-lieutenant', 1600, 1799, 'Second Lieutenant'),
|
||||||
|
('nts', 'first-lieutenant', 1800, 1999, 'First Lieutenant'),
|
||||||
|
('nts', 'captain', 2000, 2249, 'Captain'),
|
||||||
|
('nts', 'group-captain', 2250, 2499, 'Group Captain'),
|
||||||
|
('nts', 'senior-captain', 2500, 2749, 'Senior Captain'),
|
||||||
|
('nts', 'lieutenant-major', 2750, 2999, 'Lieutenant Major'),
|
||||||
|
('nts', 'major', 3000, 3499, 'Major'),
|
||||||
|
('nts', 'group-major', 3500, 3999, 'Group Major'),
|
||||||
|
('nts', 'lieutenant-commander', 4000, 4499, 'Lieutenant Commander'),
|
||||||
|
('nts', 'commander', 4500, 4999, 'Commander'),
|
||||||
|
('nts', 'group-commander', 5000, 5749, 'Group Commander'),
|
||||||
|
('nts', 'lieutenant-colonel', 5750, 6499, 'Lieutenant Colonel'),
|
||||||
|
('nts', 'colonel', 6500, 7249, 'Colonel'),
|
||||||
|
('nts', 'brigadier', 7250, 7999, 'Brigadier'),
|
||||||
|
('nts', 'brigadier-general', 8000, 8999, 'Brigadier General'),
|
||||||
|
('nts', 'major-general', 9000, 9999, 'Major General'),
|
||||||
|
('nts', 'lieutenant-general', 10000, 12499, 'Lieutenant General'),
|
||||||
|
('nts', 'general', 12500, 14999, 'General'),
|
||||||
|
('nts', 'commander-general', 15000, 17499, 'Commander General'),
|
||||||
|
('nts', 'field-vice-marshal', 17500, 19999, 'Field Vice Marshal'),
|
||||||
|
('nts', 'field-marshal', 20000, 22499, 'Field Marshal'),
|
||||||
|
('nts', 'vice-commander-of-the-army', 22500, 24999, 'Vice Commander of the Army'),
|
||||||
|
('nts', 'commander-of-the-army', 25000, 27499, 'Commander of the Army'),
|
||||||
|
('nts', 'high-commander', 27500, 29999, 'High Commander'),
|
||||||
|
('nts', 'supreme-commander', 30000, 34999, 'Supreme Commander'),
|
||||||
|
('nts', 'terminator', 35000, 9999999, 'Terminator');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`) VALUES
|
||||||
|
('ak47',1,0,'cstrike','1_ak47.png','Award of AK47'),
|
||||||
|
('awp',1,0,'cstrike','1_awp.png','Award of AWP Sniper'),
|
||||||
|
('deagle',1,0,'cstrike','1_deagle.png','Award of Desert Eagle'),
|
||||||
|
('elite',1,0,'cstrike','1_elite.png','Award of Dual Beretta Elites'),
|
||||||
|
('famas',1,0,'cstrike','1_famas.png','Award of Fusil Automatique'),
|
||||||
|
('galil',1,0,'cstrike','1_galil.png','Award of Galil'),
|
||||||
|
('glock18',1,0,'cstrike','1_glock.png','Award of Glock'),
|
||||||
|
('grenade',1,0,'cstrike','1_hegrenade.png','Award of Grenade'),
|
||||||
|
('knife',1,0,'cstrike','1_knife.png','Award of Combat Knife'),
|
||||||
|
('latency',1,0,'cstrike','1_latency.png','Award of Lowpinger'),
|
||||||
|
('m3',1,0,'cstrike','1_m3.png','Award of M3 Super'),
|
||||||
|
('m4a1',1,0,'cstrike','1_m4a1.png','Award of Colt M4A1'),
|
||||||
|
('p90',1,0,'cstrike','1_p90.png','Award of P90'),
|
||||||
|
('scout',1,0,'cstrike','1_scout.png','Award of Scout Elite'),
|
||||||
|
('usp',1,0,'cstrike','1_usp.png','Award of USP'),
|
||||||
|
('Defused_The_Bomb',1,0,'cstrike','1_defused_the_bomb.png','Award of Bomb Defuser'),
|
||||||
|
('Planted_The_Bomb',1,0,'cstrike','1_planted_the_bomb.png','Award of Bomb Planter'),
|
||||||
|
('Rescued_A_Hostage',1,0,'cstrike','1_rescued_a_hostage.png','Award of Hostage Rescuer'),
|
||||||
|
('Assassinated_The_VIP',1,0,'cstrike','1_killed_a_hostage.png','Award of Top Assassin'),
|
||||||
|
('ak47',5,0,'cstrike','2_ak47.png','Bronze AK47'),
|
||||||
|
('awp',5,0,'cstrike','2_awp.png','Bronze AWP Sniper'),
|
||||||
|
('deagle',5,0,'cstrike','2_deagle.png','Bronze Desert Eagle'),
|
||||||
|
('elite',5,0,'cstrike','2_elite.png','Bronze Dual Beretta Elites'),
|
||||||
|
('famas',5,0,'cstrike','2_famas.png','Bronze Fusil Automatique'),
|
||||||
|
('galil',5,0,'cstrike','2_galil.png','Bronze Galil'),
|
||||||
|
('glock18',5,0,'cstrike','2_glock.png','Bronze Glock'),
|
||||||
|
('grenade',5,0,'cstrike','2_hegrenade.png','Bronze Grenade'),
|
||||||
|
('knife',5,0,'cstrike','2_knife.png','Bronze Combat Knife'),
|
||||||
|
('latency',5,0,'cstrike','2_latency.png','Bronze Lowpinger'),
|
||||||
|
('m3',5,0,'cstrike','2_m3.png','Bronze Award M3 Super'),
|
||||||
|
('m4a1',5,0,'cstrike','2_m4a1.png','Bronze AColt M4A1'),
|
||||||
|
('p90',5,0,'cstrike','2_p90.png','Bronze P90'),
|
||||||
|
('scout',5,0,'cstrike','2_scout.png','Bronze Scout Elite'),
|
||||||
|
('usp',5,0,'cstrike','2_usp.png','Bronze USP'),
|
||||||
|
('Defused_The_Bomb',5,0,'cstrike','2_defused_the_bomb.png','Bronze Bomb Defuser'),
|
||||||
|
('Planted_The_Bomb',5,0,'cstrike','2_planted_the_bomb.png','Bronze Bomb Planter'),
|
||||||
|
('Rescued_A_Hostage',5,0,'cstrike','2_rescued_a_hostage.png','Bronze Hostage Rescuer'),
|
||||||
|
('Assassinated_The_VIP',5,0,'cstrike','2_killed_a_hostage.png','Bronze Top Assassin'),
|
||||||
|
('ak47',12,0,'cstrike','3_ak47.png','Silver AK47'),
|
||||||
|
('awp',12,0,'cstrike','3_awp.png','Silver Sniper'),
|
||||||
|
('deagle',12,0,'cstrike','3_deagle.png','Silver Desert Eagle'),
|
||||||
|
('elite',12,0,'cstrike','3_elite.png','Silver Dual Beretta Elites'),
|
||||||
|
('famas',12,0,'cstrike','3_famas.png','Silver Fusil Automatique'),
|
||||||
|
('galil',12,0,'cstrike','3_galil.png','Silver Galil'),
|
||||||
|
('glock18',12,0,'cstrike','3_glock.png','Silver Glock'),
|
||||||
|
('grenade',12,0,'cstrike','3_hegrenade.png','Silver Grenade'),
|
||||||
|
('knife',12,0,'cstrike','3_knife.png','Silver Combat Knife'),
|
||||||
|
('latency',12,0,'cstrike','3_latency.png','Silver Lowpinger'),
|
||||||
|
('m3',12,0,'cstrike','3_m3.png','Silver M3 Super'),
|
||||||
|
('m4a1',12,0,'cstrike','3_m4a1.png','Silver Colt M4A1'),
|
||||||
|
('p90',12,0,'cstrike','3_p90.png','Silver P90'),
|
||||||
|
('scout',12,0,'cstrike','3_scout.png','Silver Scout Elite'),
|
||||||
|
('usp',12,0,'cstrike','3_usp.png','Silver USP'),
|
||||||
|
('Defused_The_Bomb',12,0,'cstrike','3_defused_the_bomb.png','Silver Bomb Defuser'),
|
||||||
|
('Planted_The_Bomb',12,0,'cstrike','3_planted_the_bomb.png','Silver Bomb Planter'),
|
||||||
|
('Rescued_A_Hostage',12,0,'cstrike','3_rescued_a_hostage.png','Silver Hostage Rescuer'),
|
||||||
|
('Assassinated_The_VIP',12,0,'cstrike','3_killed_a_hostage.png','Silver Top Assassin'),
|
||||||
|
('ak47',20,0,'cstrike','4_ak47.png','Gold AK47'),
|
||||||
|
('awp',20,0,'cstrike','4_awp.png','Gold AWP Sniper'),
|
||||||
|
('deagle',20,0,'cstrike','4_deagle.png','Gold Desert Eagle'),
|
||||||
|
('elite',20,0,'cstrike','4_elite.png','Gold Dual Beretta Elites'),
|
||||||
|
('famas',20,0,'cstrike','4_famas.png','Gold Fusil Automatique'),
|
||||||
|
('galil',20,0,'cstrike','4_galil.png','GoldGalil'),
|
||||||
|
('glock18',20,0,'cstrike','4_glock.png','Gold Glock'),
|
||||||
|
('grenade',20,0,'cstrike','4_hegrenade.png','Gold Grenade'),
|
||||||
|
('knife',20,0,'cstrike','4_knife.png','Gold Combat Knife'),
|
||||||
|
('latency',20,0,'cstrike','4_latency.png','Gold Lowpinger'),
|
||||||
|
('m3',20,0,'cstrike','4_m3.png','Gold M3 Super'),
|
||||||
|
('m4a1',20,0,'cstrike','4_m4a1.png','Gold Colt M4A1'),
|
||||||
|
('p90',20,0,'cstrike','4_p90.png','Gold P90'),
|
||||||
|
('scout',20,0,'cstrike','4_scout.png','Gold Scout Elite'),
|
||||||
|
('usp',20,0,'cstrike','4_usp.png','Gold USP'),
|
||||||
|
('Defused_The_Bomb',20,0,'cstrike','4_defused_the_bomb.png','Gold Bomb Defuser'),
|
||||||
|
('Planted_The_Bomb',20,0,'cstrike','4_planted_the_bomb.png','Gold Bomb Planter'),
|
||||||
|
('Rescued_A_Hostage',20,0,'cstrike','4_rescued_a_hostage.png','Gold Hostage Rescuer'),
|
||||||
|
('Assassinated_The_VIP',20,0,'cstrike','4_killed_a_hostage.png','Gold Top Assassin'),
|
||||||
|
('ak47',30,0,'cstrike','5_ak47.png','Platinum AK47'),
|
||||||
|
('awp',30,0,'cstrike','5_awp.png','Platinum AWP Sniper'),
|
||||||
|
('deagle',30,0,'cstrike','5_deagle.png','Platinum Desert Eagle'),
|
||||||
|
('elite',30,0,'cstrike','5_elite.png','Platinum Dual Beretta Elites'),
|
||||||
|
('famas',30,0,'cstrike','5_famas.png','Platinum Fusil Automatique'),
|
||||||
|
('galil',30,0,'cstrike','5_galil.png','Platinum Galil'),
|
||||||
|
('glock18',30,0,'cstrike','5_glock.png','Platinum Glock'),
|
||||||
|
('grenade',30,0,'cstrike','5_hegrenade.png','Platinum Grenade'),
|
||||||
|
('knife',30,0,'cstrike','5_knife.png','PlatinumCombat Knife'),
|
||||||
|
('latency',30,0,'cstrike','5_latency.png','PlatinumLowpinger'),
|
||||||
|
('m3',30,0,'cstrike','5_m3.png','Platinum M3 Super'),
|
||||||
|
('m4a1',30,0,'cstrike','5_m4a1.png','Platinum Colt M4A1'),
|
||||||
|
('p90',30,0,'cstrike','5_p90.png','Platinum P90'),
|
||||||
|
('scout',30,0,'cstrike','5_scout.png','Platinum Scout Elite'),
|
||||||
|
('usp',30,0,'cstrike','5_usp.png','Platinum USP'),
|
||||||
|
('Defused_The_Bomb',30,0,'cstrike','5_defused_the_bomb.png','Platinum Bomb Defuser'),
|
||||||
|
('Planted_The_Bomb',30,0,'cstrike','5_planted_the_bomb.png','Platinum Bomb Planter'),
|
||||||
|
('Rescued_A_Hostage',30,0,'cstrike','5_rescued_a_hostage.png','Platinum Hostage Rescuer'),
|
||||||
|
('Assassinated_The_VIP',30,0,'cstrike','5_killed_a_hostage.png','Platinum Top Assassin'),
|
||||||
|
('ak47',50,0,'cstrike','6_ak47.png','Supreme AK47'),
|
||||||
|
('awp',50,0,'cstrike','6_awp.png','Supreme AWP Sniper'),
|
||||||
|
('deagle',50,0,'cstrike','6_deagle.png','Supremef Desert Eagle'),
|
||||||
|
('elite',50,0,'cstrike','6_elite.png','Supreme Dual Beretta Elites'),
|
||||||
|
('famas',50,0,'cstrike','6_famas.png','Supreme Fusil Automatique'),
|
||||||
|
('galil',50,0,'cstrike','6_galil.png','Supreme Galil'),
|
||||||
|
('glock18',50,0,'cstrike','6_glock.png','Supreme Glock'),
|
||||||
|
('grenade',50,0,'cstrike','6_hegrenade.png','Supreme Grenade'),
|
||||||
|
('knife',50,0,'cstrike','6_knife.png','Supreme Combat Knife'),
|
||||||
|
('latency',50,0,'cstrike','6_latency.png','Supreme Lowpinger'),
|
||||||
|
('m3',50,0,'cstrike','6_m3.png','Supreme M3 Super'),
|
||||||
|
('m4a1',50,0,'cstrike','6_m4a1.png','Supreme Colt M4A1'),
|
||||||
|
('p90',50,0,'cstrike','6_p90.png','Supremef P90'),
|
||||||
|
('scout',50,0,'cstrike','6_scout.png','Supreme Scout Elite'),
|
||||||
|
('usp',50,0,'cstrike','6_usp.png','Supreme USP'),
|
||||||
|
('Defused_The_Bomb',50,0,'cstrike','6_defused_the_bomb.png','Supreme Bomb Defuser'),
|
||||||
|
('Planted_The_Bomb',50,0,'cstrike','6_planted_the_bomb.png','Supreme Bomb Planter'),
|
||||||
|
('Rescued_A_Hostage',50,0,'cstrike','6_rescued_a_hostage.png','Supreme Hostage Rescuer'),
|
||||||
|
('Assassinated_The_VIP',50,0,'cstrike','6_killed_a_hostage.png','Supreme Top Assassin'),
|
||||||
|
('*total connection hours*',25,2,'css','1_connect.png','Connection Time 25 Hours'),
|
||||||
|
('*total connection hours*',50,2,'css','2_connect.png','Connection Time 50 Hours'),
|
||||||
|
('*total connection hours*',75,2,'css','3_connect.png','Connection Time 75 Hours'),
|
||||||
|
('*total connection hours*',100,2,'css','4_connect.png','Connection Time 100 Hours'),
|
||||||
|
('*total connection hours*',125,2,'css','5_connect.png','Connection Time 125 Hours'),
|
||||||
|
('*total connection hours*',150,2,'css','6_connect.png','Connection Time 150 Hours'),
|
||||||
|
('latency',3,0,'hl2mp','1_latency.png','Award of Lowpinger'),
|
||||||
|
('mostkills',3,0,'hl2mp','1_mostkills.png','Award of Most Kills'),
|
||||||
|
('suicide',3,0,'hl2mp','1_suicide.png','Award of Most Suicides'),
|
||||||
|
('latency',7,0,'hl2mp','2_latency.png','Bronze Lowpinger'),
|
||||||
|
('mostkills',7,0,'hl2mp','2_mostkills.png','Most Kills - Bronze'),
|
||||||
|
('suicide',7,0,'hl2mp','2_suicide.png','Most Suicides - Bronze'),
|
||||||
|
('latency',12,0,'hl2mp','3_latency.png','Silver Lowpinger'),
|
||||||
|
('mostkills',12,0,'hl2mp','3_mostkills.png','Most Kills - Silver'),
|
||||||
|
('suicide',12,0,'hl2mp','3_suicide.png','Most Suicides - Silver'),
|
||||||
|
('latency',17,0,'hl2mp','x_latency.png','Supreme Lowpinger'),
|
||||||
|
('mostkills',17,0,'hl2mp','x_mostkills.png','Most Kills - Supreme'),
|
||||||
|
('suicide',17,0,'hl2mp','x_suicide.png','Most Suicides - Supreme'),
|
||||||
|
('galil',1,0,'css','1_galil.png','Award of Galil'),
|
||||||
|
('galil',5,0,'css','2_galil.png','Bronze Galil'),
|
||||||
|
('galil',12,0,'css','3_galil.png','Silver Galil'),
|
||||||
|
('galil',20,0,'css','4_galil.png','Gold Galil'),
|
||||||
|
('galil',30,0,'css','5_galil.png','Platinum Galil'),
|
||||||
|
('galil',50,0,'css','6_galil.png','Supreme Galil');
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Ribbons` WHERE `ribbonName` = 'Army Service' AND `game` = 'css' AND `image` = 'ribbon_of_army_service.gif';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Roles` (`game`, `code`, `name`, `hidden`) VALUES
|
||||||
|
('aoc', 'Longbowman', 'Longbowman', '0'),
|
||||||
|
('aoc', 'Crossbowman', 'Crossbowman', '0'),
|
||||||
|
('aoc', 'Javelineer', 'Javelineer', '0'),
|
||||||
|
('aoc', 'Man at Arms', 'Man at Arms', '0'),
|
||||||
|
('aoc', 'Sergeant', 'Sergeant', '0'),
|
||||||
|
('aoc', 'Guardsman', 'Guardsman', '0'),
|
||||||
|
('aoc', 'Crusader', 'Crusader', '0'),
|
||||||
|
('aoc', 'Knight', 'Knight', '0'),
|
||||||
|
('aoc', 'Heavy Knight', 'Heavy Knight', '0');
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers`
|
||||||
|
ADD `last_event` int(10) unsigned NOT NULL default '0',
|
||||||
|
CHANGE `lat` `lat` FLOAT(7,4) NULL,
|
||||||
|
CHANGE `lng` `lng` FLOAT(7,4) NULL;
|
||||||
|
|
||||||
|
DELETE FROM `hlstats_Servers_Config` WHERE `parameter` = 'AddressPort';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers_Teamspeak` RENAME TO `hlstats_Servers_VoiceComm`;
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers_VoiceComm`
|
||||||
|
CHANGE `tsId` `serverId` int(11) unsigned NOT NULL auto_increment,
|
||||||
|
CHANGE `tsName` `name` varchar(128) NOT NULL,
|
||||||
|
CHANGE `tsAddr` `addr` varchar(128) NOT NULL,
|
||||||
|
CHANGE `tsPassword` `password` varchar(128) default NULL,
|
||||||
|
CHANGE `tsDesc` `descr` varchar(255) default NULL,
|
||||||
|
CHANGE `tsQueryPort` `queryPort` int(11) unsigned NOT NULL default '51234',
|
||||||
|
CHANGE `tsUDPPort` `UDPPort` int(11) unsigned NOT NULL default '8767',
|
||||||
|
ADD COLUMN `serverType` tinyint(4) NOT NULL default '0';
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_server_load` ADD KEY `timestamp` (`timestamp`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Teams` (`game`, `code`, `name`, `hidden`, `playerlist_bgcolor`, `playerlist_color`, `playerlist_index`) VALUES
|
||||||
|
('nts','Jinrai','Jinrai','0','#9AFF9A','#447044',1),
|
||||||
|
('nts','NSF','NSF','0','#7EA5CC','#4F677F',2);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Trend` ADD KEY `timestamp` (`timestamp`);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`) VALUES
|
||||||
|
('nts', 'aa13', 'AA13', 1.00),
|
||||||
|
('nts', 'grenade_projectile', 'Frag Grenade', 1.00),
|
||||||
|
('nts', 'jitte', 'Jitte', 1.00),
|
||||||
|
('nts', 'jittescoped', 'Jitte (Scoped)', 1.00),
|
||||||
|
('nts', 'knife', 'Knife', 1.50),
|
||||||
|
('nts', 'kyla', 'KYLA', 1.00),
|
||||||
|
('nts', 'm41', 'M41', 1.00),
|
||||||
|
('nts', 'm41l', 'M41L', 1.00),
|
||||||
|
('nts', 'milso', 'MilSO', 1.00),
|
||||||
|
('nts', 'mp5', 'MP5', 1.00),
|
||||||
|
('nts', 'mpn', 'MPN45', 1.00),
|
||||||
|
('nts', 'mx', 'MX', 1.00),
|
||||||
|
('nts', 'mx_silenced', 'MX Silenced', 1.00),
|
||||||
|
('nts', 'pz', 'PZ252', 1.00),
|
||||||
|
('nts', 'grenade_detapack', 'DetPac', 1.00),
|
||||||
|
('nts', 'smac', 'SMAC', 1.00),
|
||||||
|
('nts', 'srm', 'SRM', 1.00),
|
||||||
|
('nts', 'srm_s', 'SRM-S', 1.00),
|
||||||
|
('nts', 'srs', 'SRS', 1.00),
|
||||||
|
('nts', 'supa7', 'MURATA SUPA 7', 1.00),
|
||||||
|
('nts', 'tachi', 'TACHI', 1.00),
|
||||||
|
('nts', 'zr68c', 'ZR68C', 1.00),
|
||||||
|
('nts', 'zr68l', 'ZR68L', 1.00),
|
||||||
|
('nts', 'zr68s', 'ZR68S', 1.00);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT `code`, 'deflect_arrow', 'Deflected Arrow', 2 FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `value` = '1.6.0' WHERE `keyname` = 'version';
|
269
sql/Upgrade 1.6.0 - 1.6.1/upgrade_hlxcomm_160_161.sql
Normal file
|
@ -0,0 +1,269 @@
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'killed_charged_medic', 2, 0, '', 'Killed charged medic', '1', '0', '0', '0' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
UPDATE hlstats_Options SET opttype = 2 WHERE keyname = 'Proxy_Daemons';
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options` (`keyname`, `value`, `opttype`) VALUES
|
||||||
|
('Proxy_Key', '', 1),
|
||||||
|
('Proxy_Daemons', '', 2);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'O',code,'capblock','Capture Blocked','flags blocked' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'30cal','.30 Caliber Machine Gun','kills with .30 Caliber Machine Gun' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'c96','Pistol c96','kills with Pistol c96' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'k98','Mauser Kar 98k','kills with Mauser Kar 98k' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'k98_scoped','Mauser Karbiner k98 Sniper Rifle','kills with Mauser Karbiner k98 Sniper Rifle' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'m1carbine','M1 Carbine','kills with M1 Carbine' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'p38','Pistol 38','kills with Pistol 38' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'riflegren_ger','German Rifle Grenade','kills with German Rifle Grenade' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'riflegren_us','M1 Garand Rifle','kills with M1 Garand Rifle' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'smoke_us','U.S. Smoke Grenade','kills with the U.S. Smoke Grenade' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'smoke_ger','German Smoke Grenade','kills with the German Smoke Grenade' FROM hlstats_Games WHERE `realgame` = 'dods');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'backstab', 'Backstabber', 'backstab kills' FROM hlstats_Games WHERE `realgame` = 'ff');
|
||||||
|
|
||||||
|
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_airport01_greenhouse";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_airport01_greenhouse";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_airport03_offices";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_airport04_terminal";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_airport05_runway";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_farm01_hilltop";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_farm02_traintunnel";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_farm03_bridge";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_farm04_barn";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_farm05_cornfield";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_hospital01_apartment";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_hospital02_subway";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_hospital03_sewers";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_hospital04_interior";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_hospital05_rooftop";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_smalltown01_caves";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_smalltown02_drainage";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_smalltown03_ranchhouse";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_smalltown04_mainstreet";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_smalltown05_houseboat";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_airport01_greenhouse";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_airport01_greenhouse";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_airport03_offices";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_airport04_terminal";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_airport05_runway";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_farm01_hilltop";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_farm02_traintunnel";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_farm03_bridge";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_farm04_barn";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_farm05_cornfield";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_hospital01_apartment";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_hospital02_subway";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_hospital03_sewers";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_hospital04_interior";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_hospital05_rooftop";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_smalltown01_caves";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_smalltown02_drainage";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_smalltown03_ranchhouse";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_smalltown04_mainstreet";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_vs_smalltown05_houseboat";
|
||||||
|
DELETE IGNORE FROM `hlstats_Heatmap_Config` WHERE `game` = "l4d" AND `map` = "l4d_sv_lighthouse";
|
||||||
|
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Heatmap_Config` (`map`, `game`, `xoffset`, `yoffset`, `flipx`, `flipy`, `days`, `brush`, `scale`, `font`, `thumbw`, `thumbh`, `cropx1`, `cropy1`, `cropx2`, `cropy2`) VALUES
|
||||||
|
('koth_viaduct','tf', 7074, 3773, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('koth_sawmill','tf', 4604, 4094, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('koth_nucleus','tf', 3156, 2520, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ctf_sawmill','tf', 4603, 4073, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('arena_offblast_final','tf', 1920, 1536, 0, 1, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_yukon_final','tf', 6602, 5123, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('2tpl_mine_alpine','tf', 1238, 1462, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_blackmesa','tf', 4110, 1755, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_bloodstained','tf', 7182, 5447, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_corporation_b2','tf', 5272, 3113, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_frontline_a1','tf', 6534, 6439, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_furnace_b3','tf', 6114, 5236, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fy_twotowers','css',591,1561,1,1,30,'small',2.5,10,0.170312,0.170312,0,0,0,0),
|
||||||
|
('fy_twotowers32','css',591,1561,1,1,30,'small',2.5,10,0.170312,0.170312,0,0,0,0),
|
||||||
|
('fy_twotowers2009','css',591,1561,1,1,30,'small',2.5,10,0.170312,0.170312,0,0,0,0),
|
||||||
|
('de_alberta', 'css', 4187, 2071, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_alivemetal', 'css', 1158, 1221, 0, 1, 30, 'small', 2.9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_boston', 'css', 3116, 1189, 0, 1, 30, 'small', 4.4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_carpediem_arena', 'css', 1961, 1262, 0, 1, 30, 'small', 3.2, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_deltamill2', 'css', 2388, 652, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_gristmill', 'css', 1724, -72, 0, 1, 30, 'small', 2.7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_losttemple_pro', 'css', 2495, 1838, 0, 1, 30, 'small', 5.1, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_nightfever', 'css', 3262, 4871, 0, 1, 30, 'small', 6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_pira_legos', 'css', 2964, 3027, 0, 1, 30, 'small', 4.3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_rumpeldust2', 'css', 3678, 3925, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_sandland', 'css', 2795, 2344, 0, 1, 30, 'small', 4.6, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_snowcapped', 'css', 2248, 2633, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_toxin', 'css', 3394, 2023, 0, 1, 30, 'small', 5.4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('de_winery_final', 'css', 2911, 2014, 0, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_anzio', 'dod', 50.97, -82.75, 0, 1, 30, 'small', 1.01, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_avalanche', 'dod', 424, 160, 0, 1, 30, 'small', 1.58, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_charlie', 'dod', 32, 0, 1, 1, 30, 'small', 0.77, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_chemille', 'dod', 692, -568, 1, 1, 30, 'small', 1.19, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_donner', 'dod', 192, -1248, 1, 1, 30, 'small', 1.11, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_escape', 'dod', 176, 410, 1, 1, 30, 'small', 1.26, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_falaise', 'dod', 36.5, 227, 0, 1, 30, 'small', 0.82, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_flash', 'dod', 295.99, -504, 1, 1, 30, 'small', 1.19, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_flugplatz', 'dod', 199.5, -33, 0, 1, 30, 'small', 0.85, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_forest', 'dod', 492.5, 361, 1, 1, 30, 'small', 0.9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_glider', 'dod', 426, 308, 0, 1, 30, 'small', 1.14, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_jagd', 'dod', 64, 40, 0, 1, 30, 'small', 0.86, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_kalt', 'dod', 0, -504, 0, 1, 30, 'small', 1.22, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_kraftstoff', 'dod', 656, -308, 0, 1, 30, 'small', 1.1, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_merderet', 'dod', 532, 409, 1, 1, 30, 'small', 0.93, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_northbound', 'dod', 83.5, -10.5, 1, 1, 30, 'small', 1.01, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_saints', 'dod', 704, 196, 1, 1, 30, 'small', 1.25, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_sturm', 'dod', 210, 546, 1, 1, 30, 'small', 1.06, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_switch', 'dod', 1146, 582.5, 0, 1, 30, 'small', 1.19, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_vicenza', 'dod', 48, -48, 1, 1, 30, 'small', 1.05, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_zalec', 'dod', 8, -48, 1, 1, 30, 'small', 0.77, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dod_cean', 'dod', 540, 259, 0, 1, 30, 'small', 0.87, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_angst', 'ns', 828, 376, 1, 1, 30, 'small', 1.42, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_core', 'ns', 146, -472, 1, 1, 30, 'small', 2.25, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_daimos', 'ns', 968, -128, 1, 1, 30, 'small', 1.17, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_faceoff', 'ns', 1184, -368, 0, 1, 30, 'small', 1.48, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_kestrel', 'ns', 962, 1648, 1, 1, 30, 'small', 1.42, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_niveus', 'ns', 384, 1728, 0, 1, 30, 'small', 1.27, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_pulse', 'ns', 764, -268, 1, 1, 30, 'small', 1.83, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_sava', 'ns', 310, 974, 0, 1, 30, 'small', 1.09, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_ulysses', 'ns', 688, -1056, 1, 1, 30, 'small', 1.64, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('co_umbra', 'ns', 1760, 192, 0, 1, 30, 'small', 1.21, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_altair', 'ns', 360, 24, 1, 1, 30, 'small', 0.92, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_ayumi', 'ns', 260, -512, 0, 1, 30, 'small', 1.21, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_bast', 'ns', 152.5, 63, 1, 1, 30, 'small', 0.9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_caged', 'ns', 256, 456, 1, 1, 30, 'small', 0.95, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_eclipse', 'ns', 164, -40, 1, 1, 30, 'small', 0.91, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_eon', 'ns', 23, 91.5, 1, 1, 30, 'small', 0.92, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_hera', 'ns', 180, -24, 1, 1, 30, 'small', 0.83, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_lost', 'ns', 12, 256, 0, 1, 30, 'small', 1.28, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_lucid', 'ns', 380, -632, 1, 1, 30, 'small', 1.04, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_machina', 'ns', 112, -404, 0, 1, 30, 'small', 0.86, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_metal', 'ns', 164, 388, 0, 1, 30, 'small', 0.91, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_nancy', 'ns', 170, 0, 1, 1, 30, 'small', 0.84, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_nothing', 'ns', 212, 176, 1, 1, 30, 'small', 0.88, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_origin', 'ns', 20, -344, 0, 1, 30, 'small', 0.97, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_shiva', 'ns', 40, 480, 0, 1, 30, 'small', 0.88, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_tanith', 'ns', 44, -4, 0, 1, 30, 'small', 1.03, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ns_veil', 'ns', 160, 144, 0, 1, 30, 'small', 0.91, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('tls_abydos', 'sgtls', 13395, 7390, 1, 1, 30, 'small', 16, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('tls_erebus', 'sgtls', 17564, 11518, 1, 1, 30, 'small', 24, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('tls_lockdown', 'sgtls', 989, 1517, 1, 1, 30, 'small', 4, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('2fort', 'tfc', 90.63, 0, 0, 1, 30, 'small', 1.03, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('avanti', 'tfc', 304, 192, 0, 1, 30, 'small', 1.17, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('badlands', 'tfc', 8, 0, 1, 1, 30, 'small', 0.95, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('casbah', 'tfc', 552, -124, 0, 1, 30, 'small', 1.1, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('crossover2', 'tfc', 0, 0, 0, 1, 30, 'small', 1.11, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cz2', 'tfc', 144, 256, 0, 1, 30, 'small', 1.15, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('dustbowl', 'tfc', 448, 288, 1, 1, 30, 'small', 0.98, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('epicenter', 'tfc', 416, 0, 0, 1, 30, 'small', 1.32, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('flagrun', 'tfc', 0, 704, 0, 1, 30, 'small', 1.07, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('hunted', 'tfc', 432, 76, 1, 1, 30, 'small', 1.42, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('push', 'tfc', 0, 0, 0, 1, 30, 'small', 1.11, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('ravelin', 'tfc', 0, 0, 0, 1, 30, 'small', 1.04, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('rock2', 'tfc', 0, 0, 0, 1, 30, 'small', 0.98, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('warpath', 'tfc', 112, 0, 0, 1, 30, 'small', 1.02, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('well', 'tfc', 0, 0, 0, 1, 30, 'small', 0.94, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport01_greenhouse', 'l4d', 175, 5272, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport02_offices', 'l4d', -1723, 8693, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport03_garage', 'l4d', 11413, 6781, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport04_terminal', 'l4d', 2659, 6795, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_airport05_runway', 'l4d', 8197, 12894, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm01_hilltop', 'l4d', 16423, -3193, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm02_traintunnel', 'l4d', 12106, -2749, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm03_bridge', 'l4d', 2307, -5227, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm04_barn', 'l4d', 1584, 2778, 0, 1, 30, 'small', 17, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_farm05_cornfield', 'l4d', -1851, 7619, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital01_apartment', 'l4d', 662, 5571, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital02_subway', 'l4d', -1621, 8552, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital03_sewers', 'l4d', -7045, 14101, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital04_interior', 'l4d', -9513, 16235, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_hospital05_rooftop', 'l4d', -4450, 10005, 0, 1, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_smalltown01_caves', 'l4d', 20542, -3156, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_smalltown03_ranchhouse', 'l4d', 16026, 2930, 0, 1, 30, 'small', 14, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_smalltown05_houseboat', 'l4d', 6554, 5155, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_sv_lighthouse', 'l4d', 4681, 2143, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport01_greenhouse', 'l4d', 175, 5272, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport02_offices', 'l4d', -1723, 8693, 0, 1, 30, 'small', 9, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport03_garage', 'l4d', 11413, 6781, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport04_terminal', 'l4d', 2659, 6795, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_airport05_runway', 'l4d', 8197, 12894, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm01_hilltop', 'l4d', 16423, -3193, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm02_traintunnel', 'l4d', 12106, -2749, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm03_bridge', 'l4d', 2307, -5227, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm04_barn', 'l4d', 1584, 2778, 0, 1, 30, 'small', 17, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_farm05_cornfield', 'l4d', -1851, 7619, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital01_apartment', 'l4d', 662, 5571, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital02_subway', 'l4d', -1621, 8552, 0, 1, 30, 'small', 8, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital03_sewers', 'l4d', -7045, 14101, 0, 1, 30, 'small', 10, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital04_interior', 'l4d', -9513, 16235, 0, 1, 30, 'small', 5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_hospital05_rooftop', 'l4d', -4450, 10005, 0, 1, 30, 'small', 3, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_smalltown01_caves', 'l4d', 20542, -3156, 0, 1, 30, 'small', 13, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_smalltown03_ranchhouse', 'l4d', 16026, 2930, 0, 1, 30, 'small', 14, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('l4d_vs_smalltown05_houseboat', 'l4d', 6554, 5155, 0, 1, 30, 'small', 12, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_freight','tf', 4470, 3520, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_freight_final','tf', 4477, 3517, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('fy_iceworld','tf', 1600, 1279, 0, 1, 30, 'small', 2.5, 10, 0.170312, 0.170312, 0, 0, 0, 0),
|
||||||
|
('cp_orange_x3','tf', 5321, 7321, 0, 1, 30, 'small', 7, 10, 0.170312, 0.170312, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Players`
|
||||||
|
DROP INDEX `clan`,
|
||||||
|
ADD INDEX `skill` (`skill`),
|
||||||
|
ADD INDEX `game` (`game`),
|
||||||
|
ADD INDEX `kills` (`kills`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_Frags`
|
||||||
|
ADD INDEX `weapon16` (`weapon`(16)),
|
||||||
|
ADD INDEX `killerRole` (`killerRole`(8));
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Events_PlayerPlayerActions`
|
||||||
|
ADD INDEX `actionId` (`actionId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Players_History`
|
||||||
|
ADD INDEX `playerId` (`playerId`);
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Ranks`
|
||||||
|
ADD INDEX `game` (`game`(8));
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Servers_VoiceComm`
|
||||||
|
DROP INDEX `address`,
|
||||||
|
ADD UNIQUE `address` ( `addr` , `queryPort` );
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_PlayerNames`
|
||||||
|
ADD INDEX `name16` (`name`(16));
|
||||||
|
|
||||||
|
ALTER TABLE `hlstats_Heatmap_Config` ADD `rotate` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `flipy` ;
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Actions` (`game`, `code`, `reward_player`, `reward_team`, `team`, `description`, `for_PlayerActions`, `for_PlayerPlayerActions`, `for_TeamActions`, `for_WorldActions`)
|
||||||
|
(SELECT code, 'death_sawblade', 0, 0, '', 'LOL SAW''D', '1', '0', '0', '0' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`)
|
||||||
|
(SELECT 'deflect_arrow',1,0,code,'1_deflect_arrow.png','Bronze Deflected Arrow' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
INSERT IGNORE INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`)
|
||||||
|
(SELECT 'deflect_arrow',5,0,code,'2_deflect_arrow.png','Silver Deflected Arrow' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
INSERT IGNORE INTO `hlstats_Ribbons` (`awardCode`, `awardCount`, `special`, `game`, `image`, `ribbonName`)
|
||||||
|
(SELECT 'deflect_arrow',10,0,code,'3_deflect_arrow.png','Gold Deflected Arrow' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'backstab', 'Backstab', 1 FROM hlstats_Games WHERE realgame = 'ff');
|
||||||
|
|
||||||
|
INSERT INTO `hlstats_Weapons` (`game`, `code`, `name`, `modifier`)
|
||||||
|
(SELECT code, 'telefrag', 'Telefrag', 2 FROM hlstats_Games WHERE realgame = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Awards` (`awardType`, `game`, `code`, `name`, `verb`)
|
||||||
|
(SELECT 'W',code,'telefrag', 'Lucky Duck', 'kills by telefrag' FROM hlstats_Games WHERE `realgame` = 'tf');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `hlstats_Options_Choices` (`keyname`, `value`, `text`, `isDefault`) VALUES
|
||||||
|
('google_map_region', 'ROMANIA', 'Romania', 0);
|
||||||
|
|
||||||
|
UPDATE `hlstats_Options` SET `value` = '1.6.1' WHERE `keyname` = 'version';
|
13
sql/Upgrade 1.6.1 - 1.6.2/161 - 162 Upgrade Instructions.txt
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
HLstatsX: Community Edition
|
||||||
|
Version 1.6.2
|
||||||
|
|
||||||
|
IF YOU ARE CURRENTLY RUNNING 1.6.1 AND ARE UPGRADING TO 1.6.2:
|
||||||
|
Upload the web portion of the package to your web site and visit http://path_to_your/stats/updater/.
|
||||||
|
You will receive instructions to upgrade your database to the latest revision.
|
||||||
|
|
||||||
|
IF YOU ARE NOT RUNNING 1.6.1 AND WANT TO UPGRADE TO 1.6.2:
|
||||||
|
Run every upgrade SQL found in the "sql" folder through 1.6.1. Afterwards upload the "web" folder contents to your web server and go to http://path_to_your/stats/updater/.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
No upgrade.sql will be provided for future releases.
|
1574
sql/convert/convert_from_1.20rc2_hlxcomm12.sql
Normal file
1388
sql/convert/convert_from_elstatsneo2.41_hlxcomm12.sql
Normal file
1398
sql/convert/convert_from_elstatsneo2.45_hlxcomm12.sql
Normal file
2717
sql/convert/convert_from_elstatsneo2.45_hlxcomm15.sql
Normal file
3313
sql/convert/convert_from_hlstats140_hlxcomm15.sql
Normal file
1563
sql/convert/convert_from_larts_hlxcomm12.sql
Normal file
7599
sql/install.sql
Normal file
33
web/autocomplete.php
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
define('IN_HLSTATS', true);
|
||||||
|
|
||||||
|
// Load required files
|
||||||
|
require('config.php');
|
||||||
|
require(INCLUDE_PATH . '/class_db.php');
|
||||||
|
require(INCLUDE_PATH . '/functions.php');
|
||||||
|
|
||||||
|
$db_classname = 'DB_' . DB_TYPE;
|
||||||
|
if (class_exists($db_classname))
|
||||||
|
{
|
||||||
|
$db = new $db_classname(DB_ADDR, DB_USER, DB_PASS, DB_NAME, DB_PCONNECT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error('Database class does not exist. Please check your config.php file for DB_TYPE');
|
||||||
|
}
|
||||||
|
|
||||||
|
$game = valid_request($_GET['game']);
|
||||||
|
$search = valid_request($_POST['value']);
|
||||||
|
|
||||||
|
$game_escaped = $db->escape($game);
|
||||||
|
$search_escaped = $db->escape($search);
|
||||||
|
|
||||||
|
if (is_string($search) && strlen($search) >= 3 && strlen($search) < 64) {
|
||||||
|
// Building the query
|
||||||
|
$sql = "SELECT hlstats_PlayerNames.name FROM hlstats_PlayerNames INNER JOIN hlstats_Players ON hlstats_PlayerNames.playerId = hlstats_Players.playerId WHERE game = '{$game_escaped}' AND name LIKE '{$search_escaped}%'";
|
||||||
|
$result = $db->query($sql);
|
||||||
|
while($row=$db->fetch_row($result)) {
|
||||||
|
print "<li class=\"playersearch\">" . $row[0] . "</li>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
95
web/config.php
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
HLstatsX Community Edition is a continuation of
|
||||||
|
ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
http://ovrsized.neo-soft.org/
|
||||||
|
|
||||||
|
ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
http://www.hlstatsx.com/
|
||||||
|
Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
|
||||||
|
HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
http://sourceforge.net/projects/hlstats/
|
||||||
|
Copyright (C) 2001 Simon Garner
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( !defined('IN_HLSTATS') ) { die('Do not access this file directly'); }
|
||||||
|
|
||||||
|
// DB_ADDR - The address of the database server, in host:port format.
|
||||||
|
// (You might also try setting this to e.g. ":/tmp/mysql.sock" to
|
||||||
|
// use a Unix domain socket, if your mysqld is on the same box as
|
||||||
|
// your web server.)
|
||||||
|
define("DB_ADDR", "localhost");
|
||||||
|
|
||||||
|
// DB_USER - The username to connect to the database as
|
||||||
|
define("DB_USER", "");
|
||||||
|
|
||||||
|
// DB_PASS - The password for DB_USER
|
||||||
|
define("DB_PASS", "");
|
||||||
|
|
||||||
|
// DB_NAME - The name of the database
|
||||||
|
define("DB_NAME", "");
|
||||||
|
|
||||||
|
// DB_TYPE - The database server type. Only "mysql" is supported currently
|
||||||
|
define("DB_TYPE", "mysql");
|
||||||
|
|
||||||
|
// DB_PCONNECT - Set to 1 to use persistent database connections. Persistent
|
||||||
|
// connections can give better performance, but may overload
|
||||||
|
// the database server. Set to 0 to use non-persistent
|
||||||
|
// connections.
|
||||||
|
define("DB_PCONNECT", 0);
|
||||||
|
|
||||||
|
// INCLUDE_PATH - Filesystem path to the includes directory, relative to hlstats.php. This must be specified
|
||||||
|
// as a relative path.
|
||||||
|
//
|
||||||
|
// Under Windows, make sure you use forward slash (/) instead
|
||||||
|
// of back slash (\) and use absolute paths if you are having any issue.
|
||||||
|
define("INCLUDE_PATH", "./includes");
|
||||||
|
|
||||||
|
|
||||||
|
// PAGE_PATH - Filesystem path to the pages directory, relative to hlstats.php. This must be specified
|
||||||
|
// as a relative path.
|
||||||
|
//
|
||||||
|
// Under Windows, make sure you use forward slash (/) instead
|
||||||
|
// of back slash (\) and use absolute paths if you are having any issue.
|
||||||
|
define("PAGE_PATH", "./pages");
|
||||||
|
|
||||||
|
|
||||||
|
// PAGE_PATH - Filesystem path to the hlstatsimg directory, relative to hlstats.php. This must be specified
|
||||||
|
// as a relative path.
|
||||||
|
//
|
||||||
|
// Under Windows, make sure you use forward slash (/) instead
|
||||||
|
// of back slash (\) and use absolute paths if you are having any issue.
|
||||||
|
//
|
||||||
|
// Note: the progress directory under hlstatsimg must be writable!!
|
||||||
|
define("IMAGE_PATH", "./hlstatsimg");
|
||||||
|
|
||||||
|
// How often dynamicly generated images are updated (in seconds)
|
||||||
|
define("IMAGE_UPDATE_INTERVAL", 300);
|
||||||
|
|
||||||
|
//define("DB_DEBUG", true);
|
||||||
|
|
||||||
|
?>
|
61
web/css/Autocompleter.css
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
ul.autocompleter-choices
|
||||||
|
{
|
||||||
|
position: absolute;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
border: 1px solid #7c7c7c;
|
||||||
|
border-left-color: #c3c3c3;
|
||||||
|
border-right-color: #c3c3c3;
|
||||||
|
border-bottom-color: #ddd;
|
||||||
|
background-color: #fff;
|
||||||
|
text-align: left;
|
||||||
|
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||||
|
z-index: 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.autocompleter-choices li
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
margin: -2px 0 0 0;
|
||||||
|
padding: 0.2em 1.5em 0.2em 1em;
|
||||||
|
display: block;
|
||||||
|
float: none !important;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: normal;
|
||||||
|
white-space: nowrap;
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.autocompleter-choices li.autocompleter-selected
|
||||||
|
{
|
||||||
|
background-color: #444;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.autocompleter-choices span.autocompleter-queried
|
||||||
|
{
|
||||||
|
display: inline;
|
||||||
|
float: none;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.autocompleter-choices li.autocompleter-selected span.autocompleter-queried
|
||||||
|
{
|
||||||
|
color: #9FCFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.playersearch {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.autocompleter-loading
|
||||||
|
{
|
||||||
|
background-image: url(../css/spinner.gif);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right 50%;
|
||||||
|
}
|
||||||
|
|
141
web/css/SqueezeBox.css
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
/**
|
||||||
|
* SqueezeBox - Expandable Lightbox
|
||||||
|
*
|
||||||
|
* Allows to open various content as modal,
|
||||||
|
* centered and animated box.
|
||||||
|
*
|
||||||
|
* @version 1.1 rc4
|
||||||
|
*
|
||||||
|
* @license MIT-style license
|
||||||
|
* @author Harald Kirschner <mail [at] digitarald.de>
|
||||||
|
* @copyright Author
|
||||||
|
*/
|
||||||
|
|
||||||
|
#sbox-overlay {
|
||||||
|
position: absolute;
|
||||||
|
background-color: #000;
|
||||||
|
left: 0px;
|
||||||
|
top: 0px;
|
||||||
|
zoom: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sbox-window {
|
||||||
|
position: absolute;
|
||||||
|
background-color: #fff;
|
||||||
|
text-align: left;
|
||||||
|
overflow: visible;
|
||||||
|
padding: 10px;
|
||||||
|
/* invalid values, but looks smoother! */
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sbox-btn-close {
|
||||||
|
position: absolute;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
right: -15px;
|
||||||
|
top: -15px;
|
||||||
|
background: url(closebox.png) no-repeat center;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sbox-window-ie6 #sbox-btn-close {
|
||||||
|
background-image: url(closebox.gif);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sbox-loading #sbox-content {
|
||||||
|
background-image: url(spinner.gif);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sbox-content {
|
||||||
|
clear: both;
|
||||||
|
overflow: auto;
|
||||||
|
background-color: #fff;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sbox-content-image#sbox-content {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sbox-image {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sbox-content-image img {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sbox-content-iframe#sbox-content {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hides scrollbars */
|
||||||
|
.body-overlayed {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
/* Hides flash (Firefox problem) and selects (IE) */
|
||||||
|
.body-overlayed embed, .body-overlayed object, .body-overlayed select {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
#sbox-window embed, #sbox-window object, #sbox-window select {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Shadows */
|
||||||
|
.sbox-bg {
|
||||||
|
position: absolute;
|
||||||
|
width: 33px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sbox-bg-n {
|
||||||
|
left: 0;
|
||||||
|
top: -40px;
|
||||||
|
width: 100%;
|
||||||
|
background: url(bg_n.png) repeat-x;
|
||||||
|
}
|
||||||
|
.sbox-bg-ne {
|
||||||
|
right: -33px;
|
||||||
|
top: -40px;
|
||||||
|
background: url(bg_ne.png) no-repeat;
|
||||||
|
}
|
||||||
|
.sbox-bg-e {
|
||||||
|
right: -33px;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
background: url(bg_e.png) repeat-y;
|
||||||
|
}
|
||||||
|
.sbox-bg-se {
|
||||||
|
right: -33px;
|
||||||
|
bottom: -40px;
|
||||||
|
background: url(bg_se.png) no-repeat;
|
||||||
|
}
|
||||||
|
.sbox-bg-s {
|
||||||
|
left: 0;
|
||||||
|
bottom: -40px;
|
||||||
|
width: 100%;
|
||||||
|
background: url(bg_s.png) repeat-x;
|
||||||
|
}
|
||||||
|
.sbox-bg-sw {
|
||||||
|
left: -33px;
|
||||||
|
bottom: -40px;
|
||||||
|
background: url(bg_sw.png) no-repeat;
|
||||||
|
}
|
||||||
|
.sbox-bg-w {
|
||||||
|
left: -33px;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
background: url(bg_w.png) repeat-y;
|
||||||
|
}
|
||||||
|
.sbox-bg-nw {
|
||||||
|
left: -33px;
|
||||||
|
top: -40px;
|
||||||
|
background: url(bg_nw.png) no-repeat;
|
||||||
|
}
|
BIN
web/css/bg_e.png
Normal file
After Width: | Height: | Size: 990 B |
BIN
web/css/bg_n.png
Normal file
After Width: | Height: | Size: 986 B |
BIN
web/css/bg_ne.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
web/css/bg_nw.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
web/css/bg_s.png
Normal file
After Width: | Height: | Size: 985 B |
BIN
web/css/bg_se.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
web/css/bg_sw.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
web/css/bg_w.png
Normal file
After Width: | Height: | Size: 981 B |
BIN
web/css/closebox.gif
Normal file
After Width: | Height: | Size: 351 B |
BIN
web/css/closebox.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
web/css/spinner.gif
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
web/favicon.ico
Normal file
After Width: | Height: | Size: 1.4 KiB |
82
web/hlstats.css
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
.weapon {text-decoration: none;}
|
||||||
|
input, textarea, select {font-family: Verdana, Arial, sans-serif;font-size: 11px;}
|
||||||
|
input.textbox, input.checkbox {border-width: 1px;}
|
||||||
|
input.submit {height: 22px;}
|
||||||
|
input.smallsubmit {font-size: 9px;height: 20px;}
|
||||||
|
tt { font-family: Arial, Courier New, Courier, fixed; font-size: 12px;}
|
||||||
|
|
||||||
|
BODY {font: 10pt Arial; }
|
||||||
|
|
||||||
|
TD {font: 11pt Arial; }
|
||||||
|
h2 {font: 11px Arial; }
|
||||||
|
h1 {font: 11px Arial; }
|
||||||
|
h3 {font: 11px Arial; }
|
||||||
|
|
||||||
|
.helpwindow {
|
||||||
|
position:fixed;
|
||||||
|
top:10px;
|
||||||
|
left:10px;
|
||||||
|
width:95%;
|
||||||
|
visibility:hidden;
|
||||||
|
border:thin solid red;
|
||||||
|
background-color:#AAAAAA;
|
||||||
|
color:#FFFFFF;
|
||||||
|
font-family: Courier New, Courier, Arial, fixed;
|
||||||
|
font-size:10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table#accordion
|
||||||
|
{
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
table#accordion tr.toggler td
|
||||||
|
{
|
||||||
|
border-width: 0 0 0px 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.header_gameslist {
|
||||||
|
margin: 0 auto;
|
||||||
|
float: right;
|
||||||
|
position: absolute;
|
||||||
|
top:0;
|
||||||
|
right:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul#header_gameslist{
|
||||||
|
margin: auto;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul#header_gameslist li{
|
||||||
|
list-style: none;
|
||||||
|
float: left;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ingame .headerblock a:visited a:link {
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.location .arrow {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
border: thin solid red;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning .warning-heading {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning .warning-text {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
233
web/hlstats.php
Normal file
|
@ -0,0 +1,233 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||||||
|
Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||||||
|
http://www.hlxcommunity.com
|
||||||
|
|
||||||
|
HLstatsX Community Edition is a continuation of
|
||||||
|
ELstatsNEO - Real-time player and clan rankings and statistics
|
||||||
|
Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||||||
|
http://ovrsized.neo-soft.org/
|
||||||
|
|
||||||
|
ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||||||
|
HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||||||
|
http://www.hlstatsx.com/
|
||||||
|
Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||||||
|
|
||||||
|
HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||||||
|
HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||||||
|
http://sourceforge.net/projects/hlstats/
|
||||||
|
Copyright (C) 2001 Simon Garner
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
For support and installation notes visit http://www.hlxcommunity.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('IN_HLSTATS', true);
|
||||||
|
require('config.php');
|
||||||
|
$historical_cache=0;
|
||||||
|
if(defined('HISTORICAL_CACHE'))
|
||||||
|
{
|
||||||
|
$historical_cache=constant('HISTORICAL_CACHE');
|
||||||
|
}
|
||||||
|
|
||||||
|
if($historical_cache==1)
|
||||||
|
{
|
||||||
|
$rawmd5=md5(http_build_query($_REQUEST));
|
||||||
|
$dir1=substr($rawmd5,0,1);
|
||||||
|
$dir2=substr($rawmd5,1,1);
|
||||||
|
$cachetarget=sprintf("cache/%s/%s/%s", $dir1, $dir2, $rawmd5);
|
||||||
|
|
||||||
|
@mkdir("cache/$dir1");
|
||||||
|
@mkdir("cache/$dir1/$dir2");
|
||||||
|
|
||||||
|
if(file_exists($cachetarget))
|
||||||
|
{
|
||||||
|
file_put_contents("cache/cachehit",$cachetarget . "\n", FILE_APPEND);
|
||||||
|
echo file_get_contents($cachetarget);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
if((!empty($_GET['logout'])) && $_GET['logout'] == '1') {
|
||||||
|
unset($_SESSION['loggedin']);
|
||||||
|
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']);
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Several stuff added by Malte Bayer
|
||||||
|
global $scripttime, $siteurlneo;
|
||||||
|
$scripttime = microtime(true);
|
||||||
|
$siteurlneo='http://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'],0,strpos($_SERVER['PHP_SELF'],strrchr($_SERVER['PHP_SELF'],'/'))+1);
|
||||||
|
$siteurlneo=str_replace('\\','/',$siteurlneo);
|
||||||
|
|
||||||
|
// Several Stuff end
|
||||||
|
|
||||||
|
foreach ($_SERVER as $key => $entry) {
|
||||||
|
if ($key !== 'HTTP_COOKIE') {
|
||||||
|
$search_pattern = array('/<script>/', '/<\/script>/', '/[^A-Za-z0-9.\-\/=:;_?#&~]/');
|
||||||
|
$replace_pattern = array('', '', '');
|
||||||
|
$entry = preg_replace($search_pattern, $replace_pattern, $entry);
|
||||||
|
|
||||||
|
if ($key == "PHP_SELF") {
|
||||||
|
if ((strrchr($entry, '/') !== '/hlstats.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/ingame.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/show_graph.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/sig.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/sig2.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/index.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/status.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/top10.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/config.php') &&
|
||||||
|
(strrchr($entry, '/') !== '/') &&
|
||||||
|
($entry !== '')) {
|
||||||
|
header("Location: http://$siteurlneo/hlstats.php");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_SERVER[$key] = $entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@header('Content-Type: text/html; charset=utf-8');
|
||||||
|
|
||||||
|
// do not report NOTICE warnings
|
||||||
|
@error_reporting(E_ALL ^ E_NOTICE);
|
||||||
|
|
||||||
|
////
|
||||||
|
//// Initialisation
|
||||||
|
////
|
||||||
|
|
||||||
|
define('PAGE', 'HLSTATS');
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Classes
|
||||||
|
///
|
||||||
|
|
||||||
|
// Load required files
|
||||||
|
require(INCLUDE_PATH . '/class_db.php');
|
||||||
|
require(INCLUDE_PATH . '/class_table.php');
|
||||||
|
require(INCLUDE_PATH . '/functions.php');
|
||||||
|
|
||||||
|
$db_classname = 'DB_' . DB_TYPE;
|
||||||
|
if ( class_exists($db_classname) )
|
||||||
|
{
|
||||||
|
$db = new $db_classname(DB_ADDR, DB_USER, DB_PASS, DB_NAME, DB_PCONNECT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error('Database class does not exist. Please check your config.php file for DB_TYPE');
|
||||||
|
}
|
||||||
|
|
||||||
|
$g_options = getOptions();
|
||||||
|
|
||||||
|
if (!isset($g_options['scripturl'])) {
|
||||||
|
$g_options['scripturl'] = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
|
||||||
|
}
|
||||||
|
|
||||||
|
////
|
||||||
|
//// Main
|
||||||
|
////
|
||||||
|
|
||||||
|
$game = valid_request(isset($_GET['game'])?$_GET['game']:'', 0);
|
||||||
|
|
||||||
|
if (!$game)
|
||||||
|
{
|
||||||
|
$game = isset($_SESSION['game'])?$_SESSION['game']:'';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$_SESSION['game'] = $game;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$realgame && $game)
|
||||||
|
{
|
||||||
|
$realgame = getRealGame($game);
|
||||||
|
$_SESSION['realgame'] = $realgame;
|
||||||
|
}
|
||||||
|
|
||||||
|
$mode = isset($_GET['mode'])?$_GET['mode']:'';
|
||||||
|
|
||||||
|
$valid_modes = array(
|
||||||
|
'players',
|
||||||
|
'clans',
|
||||||
|
'weapons',
|
||||||
|
'roles',
|
||||||
|
'rolesinfo',
|
||||||
|
'maps',
|
||||||
|
'actions',
|
||||||
|
'claninfo',
|
||||||
|
'playerinfo',
|
||||||
|
'weaponinfo',
|
||||||
|
'mapinfo',
|
||||||
|
'actioninfo',
|
||||||
|
'playerhistory',
|
||||||
|
'playersessions',
|
||||||
|
'playerawards',
|
||||||
|
'search',
|
||||||
|
'admin',
|
||||||
|
'help',
|
||||||
|
'bans',
|
||||||
|
'servers',
|
||||||
|
'chathistory',
|
||||||
|
'ranks',
|
||||||
|
'rankinfo',
|
||||||
|
'ribbons',
|
||||||
|
'ribboninfo',
|
||||||
|
'chat',
|
||||||
|
'globalawards',
|
||||||
|
'awards',
|
||||||
|
'dailyawardinfo',
|
||||||
|
'countryclans',
|
||||||
|
'countryclansinfo',
|
||||||
|
'teamspeak',
|
||||||
|
'ventrilo',
|
||||||
|
'updater',
|
||||||
|
'profile'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (file_exists('./updater') && $mode != 'updater')
|
||||||
|
{
|
||||||
|
pageHeader(array('Update Notice'), array('Update Notice' => ''));
|
||||||
|
echo "<div class=\"warning\">\n" .
|
||||||
|
"<span class=\"warning-heading\"><img src=\"".IMAGE_PATH."/warning.gif\" alt=\"Warning\"> Warning:</span><br />\n" .
|
||||||
|
"<span class=\"warning-text\">The updater folder was detected in your web directory.<br />
|
||||||
|
To perform a Database Update, please go to <strong><a href=\"{$g_options['scripturl']}?mode=updater\">HLX:CE Database Updater</a></strong> to perform the database update.<br /><br />
|
||||||
|
<strong>If you have already performed the database update, <strong>you must delete the \"updater\" folder from your web folder.</span>\n</div>";
|
||||||
|
pageFooter();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !in_array($mode, $valid_modes) )
|
||||||
|
{
|
||||||
|
$mode = 'contents';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( file_exists(PAGE_PATH . "/$mode.php") )
|
||||||
|
{
|
||||||
|
@include(PAGE_PATH . "/$mode.php");
|
||||||
|
pageFooter();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
header('HTTP/1.1 404 File Not Found', false, 404);
|
||||||
|
error('Unable to find ' . PAGE_PATH . "/$mode.php");
|
||||||
|
pageFooter();
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
BIN
web/hlstatsimg/ajax.gif
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
web/hlstatsimg/allies.swf
Normal file
BIN
web/hlstatsimg/alyx.swf
Normal file
BIN
web/hlstatsimg/award.png
Normal file
After Width: | Height: | Size: 4.3 KiB |