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  |