added csx module
This commit is contained in:
		
							
								
								
									
										61
									
								
								dlls/csx/plugins/include/csstats.inc
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										61
									
								
								dlls/csx/plugins/include/csstats.inc
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,61 @@ | |||||||
|  |  | ||||||
|  | #if defined _csstats_included | ||||||
|  |   #endinput | ||||||
|  | #endif | ||||||
|  | #define _csstats_included | ||||||
|  |  | ||||||
|  | /* Gets stats from given weapon index. If wpnindex is 0 | ||||||
|  | * then the stats are from all weapons. If weapon has not been used function | ||||||
|  | * returns 0 in other case 1. Fields in stats are: | ||||||
|  | * 0 - kills | ||||||
|  | * 1 - deaths | ||||||
|  | * 2 - headshots | ||||||
|  | * 3 - teamkilling | ||||||
|  | * 4 - shots | ||||||
|  | * 5 - hits | ||||||
|  | * 6 - damage | ||||||
|  |  | ||||||
|  | * For body hits fields see amxconst.inc. */ | ||||||
|  | native get_user_wstats(index,wpnindex,stats[8],bodyhits[8]); | ||||||
|  |  | ||||||
|  | /* Gets round stats from given weapon index.*/ | ||||||
|  | native get_user_wrstats(index,wpnindex,stats[8],bodyhits[8]); | ||||||
|  |  | ||||||
|  | /* Gets overall stats which are stored in file on server | ||||||
|  | * and updated on every respawn or user disconnect. | ||||||
|  | * Function returns the position in stats by diff. kills to deaths. */ | ||||||
|  | native get_user_stats(index,stats[8],bodyhits[8]); | ||||||
|  |  | ||||||
|  | /* Gets round stats of player. */ | ||||||
|  | native get_user_rstats(index,stats[8],bodyhits[8]); | ||||||
|  |  | ||||||
|  | /* Gets stats with which user have killed/hurt his victim. If victim is 0 | ||||||
|  | * then stats are from all victims. If victim has not been hurt, function | ||||||
|  | * returns 0 in other case 1. User stats are reset on his respawn. */ | ||||||
|  | native get_user_vstats(index,victim,stats[8],bodyhits[8],wpnname[]="",len=0); | ||||||
|  |  | ||||||
|  | /* Gets stats with which user have been killed/hurt. If killer is 0 | ||||||
|  | * then stats are from all attacks. If killer has not hurt user, function | ||||||
|  | * returns 0 in other case 1. User stats are reset on his respawn. */ | ||||||
|  | native get_user_astats(index,wpnindex,stats[8],bodyhits[8],wpnname[]="",len=0); | ||||||
|  |  | ||||||
|  | /* Resets life, weapon, victims and attackers user stats. */ | ||||||
|  | native reset_user_wstats(index); | ||||||
|  |  | ||||||
|  | /* Gets overall stats which stored in stats.dat file in amx folder | ||||||
|  | * and updated on every mapchange or user disconnect. | ||||||
|  | * Function returns next index of stats entry or 0 if no more exists. */ | ||||||
|  | native get_stats(index,stats[8],bodyhits[8],name[],len); | ||||||
|  |  | ||||||
|  | /* Returns number of all entries in stats. */ | ||||||
|  | native get_statsnum(); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | * new stats: | ||||||
|  | * 0 - total defusions | ||||||
|  | * 1 - bomb defused | ||||||
|  | * 2 - bomb plants | ||||||
|  | * 3 - bomb explosions | ||||||
|  | */ | ||||||
|  | native get_user_stats2(index,stats[4]); | ||||||
|  | native get_stats2(index,stats[4]); | ||||||
							
								
								
									
										59
									
								
								dlls/csx/plugins/include/csx.inc
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										59
									
								
								dlls/csx/plugins/include/csx.inc
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | /* CSX functions | ||||||
|  |  * | ||||||
|  |  * (c) 2004, SidLuke | ||||||
|  |  * This file is provided as is (no warranties). | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #if defined _csx_included | ||||||
|  |   #endinput | ||||||
|  | #endif | ||||||
|  | #define _csx_included | ||||||
|  |  | ||||||
|  | #include <csstats> | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | * Forwards | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | /* Function is called after player to player attacks , | ||||||
|  | * if players were damaged by teammate TA is set to 1 */ | ||||||
|  | forward client_damage(attacker,victim,damage,wpnindex,hitplace,TA); | ||||||
|  |  | ||||||
|  | /* Function is called after player death , | ||||||
|  | * if player was killed by teammate TK is set to 1 */ | ||||||
|  | forward client_death(killer,victim,wpnindex,hitplace,TK); | ||||||
|  |  | ||||||
|  | forward grenade_throw( index,greindex,wId ); | ||||||
|  |  | ||||||
|  | forward bomb_planting(planter); | ||||||
|  | forward bomb_planted(planter); | ||||||
|  | forward bomb_explode(planter,defuser); | ||||||
|  | forward bomb_defusing(defuser); | ||||||
|  | forward bomb_defused(defuser); | ||||||
|  |  | ||||||
|  | /************* Shared Natives Start ********************************/ | ||||||
|  |  | ||||||
|  | /* Custom Weapon Support */ | ||||||
|  | /* function will return index of new weapon */ | ||||||
|  | native custom_weapon_add( wpnname[],melee = 0,logname[]="" );  | ||||||
|  | /* Function will pass damage done by this custom weapon to stats module and other plugins */ | ||||||
|  | native custom_weapon_dmg( weapon, att, vic, damage, hitplace=0 );  | ||||||
|  | /* Function will pass info about custom weapon shot to stats module */ | ||||||
|  | native custom_weapon_shot( weapon,index ); // weapon id , player id | ||||||
|  |  | ||||||
|  | /* function will return 1 if true */ | ||||||
|  | native xmod_is_melee_wpn(wpnindex); | ||||||
|  |  | ||||||
|  | /* Returns weapon name. */ | ||||||
|  | native xmod_get_wpnname(wpnindex,name[],len); | ||||||
|  |  | ||||||
|  | /* Returns weapon logname. */ | ||||||
|  | native xmod_get_wpnlogname(wpnindex,name[],len); | ||||||
|  |  | ||||||
|  | /* Returns weapons array size */ | ||||||
|  | native xmod_get_maxweapons(); | ||||||
|  |  | ||||||
|  | /* Returns stats array size */ | ||||||
|  | native xmod_get_stats_size(); | ||||||
|  |  | ||||||
|  | /************* Shared Natives End ********************************/ | ||||||
							
								
								
									
										515
									
								
								dlls/csx/plugins/miscstats.sma
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										515
									
								
								dlls/csx/plugins/miscstats.sma
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,515 @@ | |||||||
|  | /* AMX Mod X | ||||||
|  | *   Misc. Stats Plugin | ||||||
|  | * | ||||||
|  | * by the AMX Mod X Development Team | ||||||
|  | *  originally developed by OLO | ||||||
|  | * | ||||||
|  | * This file is part of AMX Mod X. | ||||||
|  | * | ||||||
|  | * | ||||||
|  | *  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 | ||||||
|  | * | ||||||
|  | *  In addition, as a special exception, the author gives permission to | ||||||
|  | *  link the code of this program with the Half-Life Game Engine ("HL | ||||||
|  | *  Engine") and Modified Game Libraries ("MODs") developed by Valve, | ||||||
|  | *  L.L.C ("Valve"). You must obey the GNU General Public License in all | ||||||
|  | *  respects for all of the code used other than the HL Engine and MODs | ||||||
|  | *  from Valve. If you modify this file, you may extend this exception | ||||||
|  | *  to your version of the file, but you are not obligated to do so. If | ||||||
|  | *  you do not wish to do so, delete this exception statement from your | ||||||
|  | *  version. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #include <amxmodx> | ||||||
|  |  | ||||||
|  | public MultiKill | ||||||
|  | public MultiKillSound | ||||||
|  | public BombPlanting | ||||||
|  | public BombDefusing | ||||||
|  | public BombPlanted | ||||||
|  | public BombDefused | ||||||
|  | public BombFailed | ||||||
|  | public BombPickUp | ||||||
|  | public BombDrop | ||||||
|  | public BombCountVoice | ||||||
|  | public BombCountDef | ||||||
|  | public BombReached | ||||||
|  | public ItalyBonusKill | ||||||
|  | public EnemyRemaining | ||||||
|  | public LastMan | ||||||
|  | public KnifeKill | ||||||
|  | public KnifeKillSound | ||||||
|  | public GrenadeKill | ||||||
|  | public GrenadeSuicide | ||||||
|  | public HeadShotKill | ||||||
|  | public HeadShotKillSound | ||||||
|  | public RoundCounterSound | ||||||
|  | public RoundCounter | ||||||
|  | public KillingStreak | ||||||
|  | public KillingStreakSound | ||||||
|  | public DoubleKill | ||||||
|  | public DoubleKillSound | ||||||
|  | public PlayerName | ||||||
|  | public FirstBloodSound | ||||||
|  |  | ||||||
|  | new g_streakKills[33][2] | ||||||
|  | new g_multiKills[33][2] | ||||||
|  | new g_C4Timer | ||||||
|  | new g_Defusing | ||||||
|  | new g_Planter  | ||||||
|  | new Float:g_LastOmg | ||||||
|  | new g_LastAnnounce | ||||||
|  | new g_roundCount | ||||||
|  | new Float:g_doubleKill | ||||||
|  | new g_doubleKillId | ||||||
|  | new g_friend[33] | ||||||
|  | new g_firstBlood | ||||||
|  |  | ||||||
|  | new g_MultiKillMsg[7][] = { | ||||||
|  |   "Multi-Kill! %s^n%L %d kills (%d hs)", | ||||||
|  |   "Ultra-Kill!!! %s^n%L %d kills (%d hs)", | ||||||
|  |   "%s IS ON A KILLING SPREE!!!^n%L %d kills (%d hs)", | ||||||
|  |   "RAMPAGE!!! %s^n%L %d kills (%d hs)" , | ||||||
|  |   "%s IS UNSTOPPABLE!!!^n%L %d kills (%d hs)", | ||||||
|  |   "%s IS A MONSTER!^n%L %d kills (%d hs)", | ||||||
|  |   "%s IS GODLIKE!!!!^n%L %d kills (%d hs)" | ||||||
|  | } | ||||||
|  | new g_Sounds[7][] = { | ||||||
|  |   "multikill", | ||||||
|  |   "ultrakill", | ||||||
|  |   "killingspree", | ||||||
|  |   "rampage", | ||||||
|  |   "unstoppable", | ||||||
|  |   "monsterkill", | ||||||
|  |   "godlike" | ||||||
|  | } | ||||||
|  | new g_KillingMsg[7][] = { | ||||||
|  |   "%s: Multi-Kill!", | ||||||
|  |   "%s: Ultra-Kill!!!", | ||||||
|  |   "%s IS ON A KILLING SPREE!!!", | ||||||
|  |   "%s: RAMPAGE!!!", | ||||||
|  |   "%s IS UNSTOPPABLE!!!", | ||||||
|  |   "%s IS A MONSTER!", | ||||||
|  |   "%s IS GODLIKE!!!" | ||||||
|  | } | ||||||
|  | new g_KinfeMsg[4][] = { | ||||||
|  |   "KNIFE_MSG_1", | ||||||
|  |   "KNIFE_MSG_2", | ||||||
|  |   "KNIFE_MSG_3", | ||||||
|  |   "KNIFE_MSG_4" | ||||||
|  | } | ||||||
|  | new g_LastMessages[4][] = { | ||||||
|  |   "LAST_MSG_1", | ||||||
|  |   "LAST_MSG_2", | ||||||
|  |   "LAST_MSG_3", | ||||||
|  |   "LAST_MSG_4" | ||||||
|  | } | ||||||
|  | new g_HeMessages[4][] = { | ||||||
|  |   "HE_MSG_1", | ||||||
|  |   "HE_MSG_2", | ||||||
|  |   "HE_MSG_3", | ||||||
|  |   "HE_MSG_4" | ||||||
|  | } | ||||||
|  | new g_SHeMessages[4][] = { | ||||||
|  |   "SHE_MSG_1", | ||||||
|  |   "SHE_MSG_2", | ||||||
|  |   "SHE_MSG_3", | ||||||
|  |   "SHE_MSG_4" | ||||||
|  | } | ||||||
|  | new g_HeadShots[7][] = {  | ||||||
|  |   "HS_MSG_1", | ||||||
|  |   "HS_MSG_2", | ||||||
|  |   "HS_MSG_3", | ||||||
|  |   "HS_MSG_4", | ||||||
|  |   "HS_MSG_5", | ||||||
|  |   "HS_MSG_6", | ||||||
|  |   "HS_MSG_7" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | new g_teamsNames[2][] = { | ||||||
|  |   "TERRORIST", | ||||||
|  |   "CT" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public plugin_init() { | ||||||
|  |   register_plugin("CS Misc. Stats",AMXX_VERSION_STR,"AMXX Dev Team")  | ||||||
|  |   register_dictionary("miscstats.txt") | ||||||
|  |   register_event("TextMsg","eRestart","a","2&#Game_C","2&#Game_w") | ||||||
|  |   register_event("SendAudio", "eEndRound", "a", "2&%!MRAD_terwin","2&%!MRAD_ctwin","2&%!MRAD_rounddraw")  | ||||||
|  |   register_event("RoundTime", "eNewRound", "bc")  | ||||||
|  |   register_event("StatusValue","setTeam","be","1=1")  | ||||||
|  |   register_event("StatusValue","showStatus","be","1=2","2!0") | ||||||
|  |   register_event("StatusValue","hideStatus","be","1=1","2=0")   | ||||||
|  |   new mapname[32] | ||||||
|  |   get_mapname(mapname,31) | ||||||
|  |   if (equali(mapname,"de_",3)||equali(mapname,"csde_",5)) { | ||||||
|  |     register_event("StatusIcon", "eGotBomb", "be", "1=1", "1=2", "2=c4") | ||||||
|  |     register_event("TextMsg", "eBombPickUp", "bc", "2&#Got_bomb") | ||||||
|  |     register_event("TextMsg", "eBombDrop", "bc", "2&#Game_bomb_d") | ||||||
|  |   } | ||||||
|  |   else if ( equali( mapname ,  "cs_italy"  ) ) { | ||||||
|  |     register_event( "23" , "chickenKill", "a" , "1=108" , /*"12=106",*/ "15=4" ) | ||||||
|  |     register_event( "23" , "radioKill", "a" , "1=108" , /*"12=294",*/ "15=2" ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public plugin_cfg() { | ||||||
|  |   new g_addStast[] = "amx_statscfg add ^"%s^" %s" | ||||||
|  |   server_cmd(g_addStast,"MultiKill","MultiKill") | ||||||
|  |   server_cmd(g_addStast,"MultiKillSound","MultiKillSound") | ||||||
|  |   server_cmd(g_addStast,"Bomb Planting","BombPlanting") | ||||||
|  |   server_cmd(g_addStast,"Bomb Defusing","BombDefusing") | ||||||
|  |   server_cmd(g_addStast,"Bomb Planted","BombPlanted") | ||||||
|  |   server_cmd(g_addStast,"Bomb Defuse Succ.","BombDefused") | ||||||
|  |   server_cmd(g_addStast,"Bomb Def. Failure","BombFailed") | ||||||
|  |   server_cmd(g_addStast,"Bomb PickUp","BombPickUp") | ||||||
|  |   server_cmd(g_addStast,"Bomb Drop","BombDrop") | ||||||
|  |   server_cmd(g_addStast,"Bomb Count Down","BombCountVoice") | ||||||
|  |   server_cmd(g_addStast,"Bomb Count Down (def)","BombCountDef") | ||||||
|  |   server_cmd(g_addStast,"Bomb Site Reached","BombReached") | ||||||
|  |   server_cmd(g_addStast,"Italy Bonus Kill","ItalyBonusKill") | ||||||
|  |   server_cmd(g_addStast,"Last Man","LastMan") | ||||||
|  |   server_cmd(g_addStast,"Knife Kill","KnifeKill") | ||||||
|  |   server_cmd(g_addStast,"Knife Kill Sound","KnifeKillSound") | ||||||
|  |   server_cmd(g_addStast,"Grenade Kill","GrenadeKill") | ||||||
|  |   server_cmd(g_addStast,"Grenade Suicide","GrenadeSuicide") | ||||||
|  |   server_cmd(g_addStast,"HeadShot Kill","HeadShotKill") | ||||||
|  |   server_cmd(g_addStast,"HeadShot Kill Sound","HeadShotKillSound") | ||||||
|  |   server_cmd(g_addStast,"Round Counter","RoundCounter") | ||||||
|  |   server_cmd(g_addStast,"Round Counter Sound","RoundCounterSound") | ||||||
|  |   server_cmd(g_addStast,"Killing Streak","KillingStreak") | ||||||
|  |   server_cmd(g_addStast,"Killing Streak Sound","KillingStreakSound") | ||||||
|  |   server_cmd(g_addStast,"Enemy Remaining","EnemyRemaining") | ||||||
|  |   server_cmd(g_addStast,"Double Kill","DoubleKill") | ||||||
|  |   server_cmd(g_addStast,"Double Kill Sound","DoubleKillSound") | ||||||
|  |   server_cmd(g_addStast,"Player Name","PlayerName") | ||||||
|  |   server_cmd(g_addStast,"First Blood Sound","FirstBloodSound") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public client_putinserver(id) | ||||||
|  |   g_multiKills[id] = g_streakKills[ id ] = { 0 , 0 } | ||||||
|  |  | ||||||
|  | public client_death(killer,victim,wpnindex,hitplace,TK) { | ||||||
|  |  | ||||||
|  |   new headshot = ( hitplace == HIT_HEAD ) ? 1:0 | ||||||
|  |  | ||||||
|  |   if ( g_firstBlood ) { | ||||||
|  |   	g_firstBlood = 0 | ||||||
|  |   	if ( FirstBloodSound ) client_cmd(0,"spk misc/firstblood") | ||||||
|  |   } | ||||||
|  |   if ( (KillingStreak || KillingStreakSound) && !TK ) {     | ||||||
|  |     g_streakKills[ killer ][ 0 ]++ | ||||||
|  |     g_streakKills[ killer ][ 1 ] = 0 | ||||||
|  |     g_streakKills[ victim ][ 1 ]++ | ||||||
|  |     g_streakKills[ victim ][ 0 ] = 0 | ||||||
|  |     new a = g_streakKills[ killer ][ 0 ] - 3 | ||||||
|  |     if ( (a > -1) && !( a % 2 ) ) { | ||||||
|  |       new name[32] | ||||||
|  |       get_user_name( killer , name , 31 ) | ||||||
|  |       if ( (a >>= 1) > 6 ) a = 6 | ||||||
|  |       if ( KillingStreak ){ | ||||||
|  |         set_hudmessage(0, 100, 255, 0.05, 0.55, 2, 0.02, 6.0, 0.01, 0.1, 3) | ||||||
|  |         show_hudmessage(0,g_KillingMsg[ a ], name )         | ||||||
|  |       } | ||||||
|  |       if (  KillingStreakSound )  client_cmd( 0, "spk misc/%s", g_Sounds[ a ] ) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   if ( MultiKill || MultiKillSound ) { | ||||||
|  |     if (killer && !TK ) {  | ||||||
|  |       g_multiKills[killer][0]++  | ||||||
|  |       g_multiKills[killer][1] += headshot | ||||||
|  |       new param[2] | ||||||
|  |       param[0] = killer  | ||||||
|  |       param[1] = g_multiKills[killer][0]  | ||||||
|  |       set_task( 4.0 + float( param[1] ) ,"checkKills",0,param,2) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   if ( EnemyRemaining ) { | ||||||
|  |     new ppl[32], pplnum | ||||||
|  |     new team = get_user_team( victim ) - 1 | ||||||
|  |     get_players(ppl,pplnum,"e", g_teamsNames[1 - team] )  | ||||||
|  |     if (pplnum) { | ||||||
|  |       new eppl[32], epplnum  | ||||||
|  |       get_players(eppl,epplnum,"ae",g_teamsNames[team])  | ||||||
|  |       if (epplnum) {  | ||||||
|  |         new message[128] | ||||||
|  |         format(message,127,"%d %s%s Remaining...",epplnum,g_teamsNames[team],(epplnum==1)?"":"S" )  | ||||||
|  |         set_hudmessage(255,255,255,0.02,0.85,2, 0.05, 0.1, 0.02, 3.0, 3)  | ||||||
|  |         for(new a=0; a<pplnum; ++a) show_hudmessage(ppl[a],message) | ||||||
|  |         //client_print(ppl[a],print_chat,message) | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   if ( LastMan ) { | ||||||
|  |     new cts[32], ts[32], ctsnum, tsnum  | ||||||
|  |     get_players(cts,ctsnum,"ae", g_teamsNames[1] )     | ||||||
|  |     get_players(ts,tsnum,"ae", g_teamsNames[0] )  | ||||||
|  |     if ( ctsnum == 1 && tsnum == 1 ) {  | ||||||
|  |         new ctname[32], tname[32]  | ||||||
|  |         get_user_name(cts[0],ctname,31)  | ||||||
|  |         get_user_name(ts[0],tname,31)  | ||||||
|  |         set_hudmessage(0, 255, 255, -1.0, 0.35, 0, 6.0, 6.0, 0.5, 0.15, 3)  | ||||||
|  |         show_hudmessage(0,"%s vs. %s",ctname,tname)  | ||||||
|  |         client_cmd(0,"spk misc/maytheforce")  | ||||||
|  |     } | ||||||
|  |     else if ( !g_LastAnnounce  ) { | ||||||
|  |       new oposite = 0, team = 0 | ||||||
|  |       if ( ctsnum == 1 && tsnum > 1 ) { | ||||||
|  |         g_LastAnnounce = cts[0]  | ||||||
|  |         oposite = tsnum | ||||||
|  |         team = 0 | ||||||
|  |       } | ||||||
|  |       else if ( tsnum == 1 && ctsnum > 1 ) { | ||||||
|  |         g_LastAnnounce = ts[0] | ||||||
|  |         oposite = ctsnum | ||||||
|  |         team = 1 | ||||||
|  |       } | ||||||
|  |       if (g_LastAnnounce) {  | ||||||
|  |         new name[32]  | ||||||
|  |         get_user_name(g_LastAnnounce,name,31)  | ||||||
|  |         set_hudmessage(0, 255, 255, -1.0, 0.35, 0, 6.0, 6.0, 0.5, 0.15, 3)  | ||||||
|  |         show_hudmessage(0,"%s (%d HP) vs. %d %s%s: %L",name,  | ||||||
|  |           get_user_health(g_LastAnnounce),oposite,  | ||||||
|  |           g_teamsNames[team],(oposite==1)?"":"S",LANG_PLAYER,g_LastMessages[ random_num(0,3) ] )      | ||||||
|  |         client_cmd(g_LastAnnounce,"spk misc/oneandonly")  | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( wpnindex == 29 && ( KnifeKill || KnifeKillSound ) ) { | ||||||
|  |     if ( KnifeKill ) { | ||||||
|  |       new killer_name[32],victim_name[32]  | ||||||
|  |       get_user_name(killer,killer_name,31)  | ||||||
|  |       get_user_name(victim,victim_name,31)  | ||||||
|  |       set_hudmessage(255, 100, 100, -1.0, 0.25, 1, 6.0, 6.0, 0.5, 0.15, 1)  | ||||||
|  |       show_hudmessage(0,"%L",LANG_PLAYER,g_KinfeMsg[ random_num(0,3) ],killer_name,victim_name)  | ||||||
|  |     } | ||||||
|  |     if ( KnifeKillSound ) client_cmd(0,"spk misc/humiliation")  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( wpnindex == 4 && (GrenadeKill || GrenadeSuicide) ) { | ||||||
|  |     new killer_name[32],victim_name[32]  | ||||||
|  |     get_user_name(killer,killer_name,32)  | ||||||
|  |     get_user_name(victim,victim_name,32)  | ||||||
|  |     set_hudmessage(255, 100, 100, -1.0, 0.25, 1, 6.0, 6.0, 0.5, 0.15, 1)     | ||||||
|  |     if ( killer != victim ) { | ||||||
|  |       if ( GrenadeKill ) show_hudmessage(0,"%L",LANG_PLAYER,g_HeMessages[ random_num(0,3)],killer_name,victim_name)  | ||||||
|  |     } | ||||||
|  |     else if ( GrenadeSuicide ) show_hudmessage(0,"%L",LANG_PLAYER,g_SHeMessages[ random_num(0,3) ],victim_name)  | ||||||
|  |   } | ||||||
|  |   if ( headshot && (HeadShotKill || HeadShotKillSound) ) { | ||||||
|  |     if ( HeadShotKill ) { | ||||||
|  |       new killer_name[32], victim_name[32], weapon_name[32], message[128], players[32], pnum | ||||||
|  |       get_weaponname(wpnindex,weapon_name,31) | ||||||
|  |       get_user_name(killer,killer_name,31)  | ||||||
|  |       get_user_name(victim,victim_name,31) | ||||||
|  |  | ||||||
|  |       get_players(players,pnum,"c") | ||||||
|  |       for (new i=0;i<pnum;i++) { | ||||||
|  |         format( message, 127, "%L",players[i],g_HeadShots[ random_num(0,6) ] ) | ||||||
|  |         replace( message, 127 , "$vn", victim_name ) | ||||||
|  |         replace( message, 127 , "$wn", weapon_name )     | ||||||
|  |         replace( message, 127 , "$kn", killer_name ) | ||||||
|  |         set_hudmessage(100, 100, 255, -1.0, 0.29, 0, 6.0, 6.0, 0.5, 0.15, 1)     | ||||||
|  |         show_hudmessage(players[i],message )  | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if ( HeadShotKillSound ) { | ||||||
|  |     	client_cmd(killer,"spk misc/headshot")  | ||||||
|  |     	client_cmd(victim,"spk misc/headshot") | ||||||
|  |    	} | ||||||
|  |   } | ||||||
|  |   if ( DoubleKill || DoubleKillSound ) { | ||||||
|  |     new Float:nowtime = get_gametime() | ||||||
|  |     if ( g_doubleKill == nowtime && g_doubleKillId == killer ) { | ||||||
|  |       if ( DoubleKill ) { | ||||||
|  |         new name[32] | ||||||
|  |         get_user_name( killer , name , 31  ) | ||||||
|  |         set_hudmessage(255, 0, 255, -1.0, 0.35, 0, 6.0, 6.0, 0.5, 0.15, 3) | ||||||
|  |         show_hudmessage(0,"%L",LANG_PLAYER,"DOUBLE_KILL",name ) | ||||||
|  |       } | ||||||
|  |       if ( DoubleKillSound ) client_cmd(0,"spk misc/doublekill")  | ||||||
|  |     } | ||||||
|  |     g_doubleKill = nowtime | ||||||
|  |     g_doubleKillId = killer | ||||||
|  |   } | ||||||
|  | }  | ||||||
|  |  | ||||||
|  | public hideStatus(id) { | ||||||
|  |   if ( PlayerName ) { | ||||||
|  |     set_hudmessage(0,0,0,0.0,0.0,0, 0.0, 0.01, 0.0, 0.0, 4)  | ||||||
|  |     show_hudmessage(id,"") | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public setTeam(id)  | ||||||
|  |   g_friend[id] = read_data(2) | ||||||
|  |  | ||||||
|  | public showStatus(id) { | ||||||
|  |   if ( PlayerName ) { | ||||||
|  |     new name[32],pid = read_data(2)  | ||||||
|  |     get_user_name(pid,name,31) | ||||||
|  |     new color1 = 0,color2 = 0 | ||||||
|  |     if ( get_user_team(pid)==1 ) | ||||||
|  |       color1 = 255 | ||||||
|  |     else | ||||||
|  |       color2 = 255 | ||||||
|  |     if (g_friend[id]==1) { // friend | ||||||
|  |       new clip, ammo, wpnid = get_user_weapon(pid,clip,ammo)  | ||||||
|  |       new wpnname[32]  | ||||||
|  |       get_weaponname(wpnid,wpnname,31)  | ||||||
|  |       set_hudmessage(color1,50,color2,-1.0,0.60,1, 0.01, 3.0, 0.01, 0.01, 4) | ||||||
|  |       show_hudmessage(id,"%s -- %d HP / %d AP / %s",name,  | ||||||
|  |         get_user_health(pid),get_user_armor(pid),wpnname[7]) | ||||||
|  |     }  | ||||||
|  |     else {  | ||||||
|  |       set_hudmessage(color1,50,color2,-1.0,0.60,1, 0.01, 3.0, 0.01, 0.01, 4)  | ||||||
|  |       show_hudmessage(id,name)  | ||||||
|  |     }  | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public eNewRound() | ||||||
|  |   if ( read_data(1) == floatround(get_cvar_float("mp_roundtime") * 60.0) ) { | ||||||
|  |     g_firstBlood = 1 | ||||||
|  |     g_C4Timer = 0 | ||||||
|  |     ++g_roundCount | ||||||
|  |     if ( RoundCounter ) { | ||||||
|  |       set_hudmessage(200, 0, 0, -1.0, 0.30, 0, 6.0, 6.0, 0.5, 0.15, 1)  | ||||||
|  |       show_hudmessage(0,  "%L", LANG_PLAYER, "PREPARE_FIGHT", g_roundCount ) | ||||||
|  |     } | ||||||
|  |     if ( RoundCounterSound )  client_cmd( 0 , "spk misc/prepare" ) | ||||||
|  |     if ( KillingStreak ) { | ||||||
|  |       new appl[32],ppl, i | ||||||
|  |       get_players(appl,ppl, "ac" ) | ||||||
|  |       for (new a = 0; a < ppl; ++a) { | ||||||
|  |         i = appl[ a ] | ||||||
|  |         if ( g_streakKills[ i ][ 0 ] >= 2 ) | ||||||
|  |           client_print( i , print_chat , "* %L", i, "KILLED_ROW", g_streakKills[ i ][ 0 ] ) | ||||||
|  |         else if ( g_streakKills[ i ][ 1 ] >= 2 ) | ||||||
|  |           client_print( i , print_chat , "* %L", i, "DIED_ROUNDS", g_streakKills[ i ][ 1 ] )      | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | public eRestart() { | ||||||
|  |   eEndRound() | ||||||
|  |   g_roundCount = 0 | ||||||
|  |   g_firstBlood = 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public eEndRound() { | ||||||
|  |   g_C4Timer = -2 | ||||||
|  |   g_LastOmg = 0.0 | ||||||
|  |   remove_task(8038) | ||||||
|  |   g_LastAnnounce = 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public checkKills(param[]) {  | ||||||
|  |   new id = param[0] | ||||||
|  |   new a = param[1] | ||||||
|  |   if (a == g_multiKills[id][0]) { | ||||||
|  |     a -= 3  | ||||||
|  |     if ( a > -1 ) { | ||||||
|  |       if ( MultiKill ) { | ||||||
|  |         new name[32] | ||||||
|  |         get_user_name(id,name,31) | ||||||
|  |         set_hudmessage(255, 0, 100, 0.05, 0.65, 2, 0.02, 6.0, 0.01, 0.1, 2) | ||||||
|  |         if ( a > 6 ) a = 6 | ||||||
|  |         show_hudmessage(0,g_MultiKillMsg[a],name,LANG_PLAYER,"WITH",g_multiKills[id][0],g_multiKills[id][1])           | ||||||
|  |       } | ||||||
|  |       if ( MultiKillSound ) client_cmd(0,"spk misc/%s",g_Sounds[a]) | ||||||
|  |     } | ||||||
|  |     g_multiKills[id] = { 0,0 } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public chickenKill() | ||||||
|  |   if ( ItalyBonusKill ) announceEvent( 0 , "KILLED_CHICKEN"  ) | ||||||
|  |  | ||||||
|  | public radioKill() { | ||||||
|  |   if ( ItalyBonusKill ) announceEvent( 0 , "BLEW_RADIO" ) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | announceEvent( id, message[] ) { | ||||||
|  |   new name[32] | ||||||
|  |   get_user_name(id, name , 31)  | ||||||
|  |   set_hudmessage(255, 100, 50, -1.0, 0.30, 0, 6.0, 6.0, 0.5, 0.15, 1) | ||||||
|  |   show_hudmessage(0,"%L",LANG_PLAYER,message,name) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public eGotBomb(id) {  | ||||||
|  |   if ( BombReached && read_data(1)==2 && g_LastOmg<get_gametime()) {  | ||||||
|  |     g_LastOmg = get_gametime() + 15.0 | ||||||
|  |     announceEvent(g_Planter, "REACHED_TARGET" ) | ||||||
|  |   }  | ||||||
|  | }  | ||||||
|  |  | ||||||
|  | public bombTimer() {  | ||||||
|  |   if (--g_C4Timer > 0) {  | ||||||
|  |     if (BombCountVoice) {  | ||||||
|  |       if (g_C4Timer == 30 || g_C4Timer == 20) {  | ||||||
|  |         new temp[48]  | ||||||
|  |         num_to_word(g_C4Timer,temp,47)  | ||||||
|  |         client_cmd(0,"spk ^"vox/%s seconds until explosion^"",temp)  | ||||||
|  |       }  | ||||||
|  |       else if (g_C4Timer < 11) {  | ||||||
|  |         new temp[48]  | ||||||
|  |         num_to_word(g_C4Timer,temp,47)  | ||||||
|  |         client_cmd(0,"spk ^"vox/%s^"",temp)  | ||||||
|  |       }  | ||||||
|  |     }  | ||||||
|  |     if (BombCountDef && g_Defusing) client_print(g_Defusing,print_center,"%d",g_C4Timer) | ||||||
|  |   }  | ||||||
|  |   else remove_task(8038) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public bomb_planted(planter){ | ||||||
|  |   g_Defusing = 0 | ||||||
|  |   if ( g_C4Timer != -2 ) { | ||||||
|  |     if (BombPlanted) announceEvent(planter, "SET_UP_BOMB" ) | ||||||
|  |     g_C4Timer = get_cvar_num("mp_c4timer") - 2  | ||||||
|  |     set_task(1.0,"bombTimer",8038,"",0,"b")  | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public bomb_planting(planter) | ||||||
|  | 	if (BombPlanting)	announceEvent(planter, "PLANT_BOMB" ) | ||||||
|  |  | ||||||
|  | public bomb_defusing(defuser){ | ||||||
|  | 	if (BombDefusing) announceEvent(defuser, "DEFUSING_BOMB" ) | ||||||
|  | 	g_Defusing = defuser | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public bomb_defused(defuser){ | ||||||
|  | 	if (BombDefused) announceEvent(defuser, "DEFUSED_BOMB" ) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public bomb_explode(planter,defuser){ | ||||||
|  | 	if (BombFailed && defuser) announceEvent(defuser ,  "FAILED_DEFU" ) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public eBombPickUp(id){ | ||||||
|  | 	if (BombPickUp) announceEvent(id , "PICKED_BOMB") | ||||||
|  | 	g_Planter = id | ||||||
|  | } | ||||||
|  |  | ||||||
|  | public eBombDrop() | ||||||
|  |   if (BombDrop) announceEvent(g_Planter , "DROPPED_BOMB") | ||||||
|  |  | ||||||
|  | public plugin_modules() | ||||||
|  | { | ||||||
|  | 	require_module("csx") | ||||||
|  | } | ||||||
							
								
								
									
										1561
									
								
								dlls/csx/plugins/statsx.sma
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1561
									
								
								dlls/csx/plugins/statsx.sma
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										299
									
								
								dlls/csx/source/CMisc.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										299
									
								
								dlls/csx/source/CMisc.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,299 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | #include "CMisc.h" | ||||||
|  | #include "rank.h" | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class Grenades | ||||||
|  | // ***************************************************** | ||||||
|  | void Grenades::put( edict_t* grenade, float time, int type, CPlayer* player  ) | ||||||
|  | { | ||||||
|  |   Obj* a = new Obj; | ||||||
|  |   if ( a == 0 ) return; | ||||||
|  |   a->player = player; | ||||||
|  |   a->grenade = grenade; | ||||||
|  |   a->time = gpGlobals->time + time; | ||||||
|  |   a->type = type; | ||||||
|  |   a->prev = 0; | ||||||
|  |   a->next = head; | ||||||
|  |   if ( head ) head->prev = a; | ||||||
|  |   head = a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool Grenades::find( edict_t* enemy, CPlayer** p, int* type ) | ||||||
|  | { | ||||||
|  |   bool found = false; | ||||||
|  |   Obj* a = head; | ||||||
|  |   while ( a ){ | ||||||
|  |     if ( a->time > gpGlobals->time ) { | ||||||
|  |       if ( a->grenade == enemy ) { | ||||||
|  |         found = true; | ||||||
|  |         *p = a->player; | ||||||
|  |         *type = a->type; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       Obj* next = a->next; | ||||||
|  |       if (a->prev)  a->prev->next = next; | ||||||
|  |       else  head = next; | ||||||
|  |       if (next) next->prev = a->prev; | ||||||
|  |       delete a; | ||||||
|  |       a = next; | ||||||
|  |       continue; | ||||||
|  |     } | ||||||
|  |     a = a->next; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return found; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void Grenades::clear() | ||||||
|  | { | ||||||
|  |   while(head){ | ||||||
|  |     Obj* a = head->next; | ||||||
|  |     delete head; | ||||||
|  |     head = a; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class CPlayer | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | void CPlayer::Disconnect(){ | ||||||
|  |  | ||||||
|  | 	if ( ignoreBots(pEdict) || !isModuleActive() ) // ignore if he is bot and bots rank is disabled or module is paused | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	rank->updatePosition( &life ); | ||||||
|  | 	rank = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::PutInServer(){ | ||||||
|  |  | ||||||
|  | 	if ( ignoreBots(pEdict) ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	restartStats(); | ||||||
|  | 	const char* name = STRING(pEdict->v.netname); | ||||||
|  | 	const char* unique = name; | ||||||
|  | 	switch((int)csstats_rank->value) { | ||||||
|  | 	case 1:  | ||||||
|  | 		if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 ) | ||||||
|  | 			unique = name; // failed to get authid | ||||||
|  | 		break; | ||||||
|  | 	case 2: | ||||||
|  | 		unique = ip; | ||||||
|  | 	} | ||||||
|  | 	rank = g_rank.findEntryInRank( unique , name ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::Connect(const char* address ){ | ||||||
|  | 	bot = IsBot(); | ||||||
|  | 	strcpy(ip,address); | ||||||
|  | 	rank = 0; | ||||||
|  | 	clearStats = 0.0f; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::restartStats(bool all) | ||||||
|  | { | ||||||
|  | 	if ( all ) memset(weapons,0,sizeof(weapons)); | ||||||
|  | 	memset(weaponsRnd,0,sizeof(weaponsRnd));   //DEC-Weapon (Round) stats | ||||||
|  | 	memset(attackers,0,sizeof(attackers)); | ||||||
|  | 	memset(victims,0,sizeof(victims)); | ||||||
|  | 	memset(&life,0,sizeof(life)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::Init( int pi, edict_t* pe ) | ||||||
|  | { | ||||||
|  |     pEdict = pe; | ||||||
|  |     index = pi; | ||||||
|  | 	current = 0; | ||||||
|  | 	clearStats = 0.0f; | ||||||
|  | 	rank = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::saveKill(CPlayer* pVictim, int wweapon, int hhs, int ttk){ | ||||||
|  |  | ||||||
|  | 	if ( ignoreBots(pEdict,pVictim->pEdict) ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if ( pVictim->index == index ){ // killed self | ||||||
|  | 		pVictim->weapons[0].deaths++; | ||||||
|  | 		pVictim->life.deaths++; | ||||||
|  | 		pVictim->weaponsRnd[0].deaths++;       // DEC-Weapon (round) stats | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	pVictim->attackers[index].name = weaponData[wweapon].name; | ||||||
|  | 	pVictim->attackers[index].kills++; | ||||||
|  | 	pVictim->attackers[index].hs += hhs; | ||||||
|  | 	pVictim->attackers[index].tks += ttk; | ||||||
|  | 	pVictim->attackers[0].kills++; | ||||||
|  | 	pVictim->attackers[0].hs += hhs; | ||||||
|  | 	pVictim->attackers[0].tks += ttk; | ||||||
|  | 	pVictim->weapons[pVictim->current].deaths++; | ||||||
|  | 	pVictim->weapons[0].deaths++; | ||||||
|  | 	pVictim->life.deaths++; | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	pVictim->weaponsRnd[pVictim->current].deaths++; // DEC-Weapon (round) stats | ||||||
|  | 	pVictim->weaponsRnd[0].deaths++;                   // DEC-Weapon (round) stats | ||||||
|  | 	 | ||||||
|  | 	int vi = pVictim->index; | ||||||
|  | 	victims[vi].name = weaponData[wweapon].name; | ||||||
|  | 	victims[vi].deaths++; | ||||||
|  | 	victims[vi].hs += hhs; | ||||||
|  | 	victims[vi].tks += ttk; | ||||||
|  | 	victims[0].deaths++; | ||||||
|  | 	victims[0].hs += hhs; | ||||||
|  | 	victims[0].tks += ttk; | ||||||
|  | 	 | ||||||
|  | 	weaponsRnd[wweapon].kills++;                // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[wweapon].hs += hhs;         // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[wweapon].tks += ttk;     // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].kills++;                     // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].hs += hhs;              // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].tks += ttk;          // DEC-Weapon (round) stats | ||||||
|  | 	 | ||||||
|  | 	weapons[wweapon].kills++; | ||||||
|  | 	weapons[wweapon].hs += hhs; | ||||||
|  | 	weapons[wweapon].tks += ttk; | ||||||
|  | 	weapons[0].kills++; | ||||||
|  | 	weapons[0].hs += hhs; | ||||||
|  | 	weapons[0].tks += ttk; | ||||||
|  | 	life.kills++; | ||||||
|  | 	life.hs += hhs; | ||||||
|  | 	life.tks += ttk; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::saveHit(CPlayer* pVictim, int wweapon, int ddamage, int bbody){ | ||||||
|  |  | ||||||
|  | 	if ( ignoreBots(pEdict,pVictim->pEdict) ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if ( index == pVictim->index ) return; | ||||||
|  |  | ||||||
|  | 	pVictim->attackers[index].hits++; | ||||||
|  | 	pVictim->attackers[index].damage += ddamage; | ||||||
|  | 	pVictim->attackers[index].bodyHits[bbody]++; | ||||||
|  | 	pVictim->attackers[0].hits++; | ||||||
|  | 	pVictim->attackers[0].damage += ddamage; | ||||||
|  | 	pVictim->attackers[0].bodyHits[bbody]++; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	int vi = pVictim->index; | ||||||
|  | 	victims[vi].hits++; | ||||||
|  | 	victims[vi].damage += ddamage; | ||||||
|  | 	victims[vi].bodyHits[bbody]++; | ||||||
|  | 	victims[0].hits++; | ||||||
|  | 	victims[0].damage += ddamage; | ||||||
|  | 	victims[0].bodyHits[bbody]++; | ||||||
|  |  | ||||||
|  | 	weaponsRnd[wweapon].hits++;              // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[wweapon].damage += ddamage;    // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[wweapon].bodyHits[bbody]++;   // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].hits++;                   // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].damage += ddamage;         // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].bodyHits[bbody]++;        // DEC-Weapon (round) stats | ||||||
|  |  | ||||||
|  | 	weapons[wweapon].hits++; | ||||||
|  | 	weapons[wweapon].damage += ddamage; | ||||||
|  | 	weapons[wweapon].bodyHits[bbody]++; | ||||||
|  | 	weapons[0].hits++; | ||||||
|  | 	weapons[0].damage += ddamage; | ||||||
|  | 	weapons[0].bodyHits[bbody]++; | ||||||
|  |  | ||||||
|  | 	life.hits++; | ||||||
|  | 	life.damage += ddamage; | ||||||
|  | 	life.bodyHits[bbody]++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void CPlayer::saveShot(int weapon){ | ||||||
|  |  | ||||||
|  | 	if ( ignoreBots(pEdict) ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	victims[0].shots++; | ||||||
|  | 	weapons[weapon].shots++; | ||||||
|  | 	weapons[0].shots++; | ||||||
|  | 	life.shots++; | ||||||
|  | 	weaponsRnd[weapon].shots++;       // DEC-Weapon (round) stats | ||||||
|  | 	weaponsRnd[0].shots++;            // DEC-Weapon (round) stats | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void CPlayer::saveBPlant(){ | ||||||
|  | 	life.bPlants++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::saveBExplode(){ | ||||||
|  | 	life.bExplosions++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::saveBDefusing(){ | ||||||
|  | 	life.bDefusions++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void CPlayer::saveBDefused(){ | ||||||
|  | 	life.bDefused++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class Forward | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | void Forward::put( AMX *a , int i ){ | ||||||
|  | 	head = new AmxCall( a, i , head ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void Forward::clear(){ | ||||||
|  | 	while ( head )  { | ||||||
|  | 		AmxCall* a = head->next; | ||||||
|  | 		delete head; | ||||||
|  | 		head = a; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Forward::exec(int p1,int p2,int p3,int p4,int p5,int p6){ | ||||||
|  | 	AmxCall* a = head; | ||||||
|  | 	while ( a ){ | ||||||
|  | 		MF_AmxExec(a->amx, NULL, a->iFunctionIdx, 6,p1, p2, p3, p4, p5, p6); | ||||||
|  | 		a = a->next; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Forward::exec(int p1,int p2,int p3,int p4,int p5){ | ||||||
|  | 	AmxCall* a = head; | ||||||
|  | 	while ( a ){ | ||||||
|  | 		MF_AmxExec(a->amx, NULL, a->iFunctionIdx, 5,p1, p2, p3, p4, p5); | ||||||
|  | 		a = a->next; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Forward::exec(int p1,int p2){ | ||||||
|  | 	AmxCall* a = head; | ||||||
|  | 	while ( a ){ | ||||||
|  | 		MF_AmxExec(a->amx, NULL, a->iFunctionIdx, 2,p1, p2); | ||||||
|  | 		a = a->next; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | bool ignoreBots (edict_t *pEnt, edict_t *pOther){ | ||||||
|  | 	if ( !rankBots && ( pEnt->v.flags & FL_FAKECLIENT || ( pOther && pOther->v.flags & FL_FAKECLIENT ) ) ) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool isModuleActive(){ | ||||||
|  | 	if ( !(int)CVAR_GET_FLOAT("csstats_pause") ) | ||||||
|  | 		return true; | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
							
								
								
									
										115
									
								
								dlls/csx/source/CMisc.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										115
									
								
								dlls/csx/source/CMisc.h
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,115 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef CMISC_H | ||||||
|  | #define CMISC_H | ||||||
|  |  | ||||||
|  | #include "amxxmodule.h" | ||||||
|  | #include "CRank.h" | ||||||
|  |  | ||||||
|  | #define MAX_CWEAPONS		6 | ||||||
|  |  | ||||||
|  | #define CSW_HEGRENADE      4 | ||||||
|  | #define CSW_SMOKEGRENADE   9 | ||||||
|  | #define CSW_FLASHBANG     25 | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class CPlayer | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | struct CPlayer { | ||||||
|  | 	edict_t* pEdict; | ||||||
|  | 	char ip[32]; | ||||||
|  | 	int index; | ||||||
|  | 	int aiming; | ||||||
|  | 	int current; | ||||||
|  | 	bool bot; | ||||||
|  | 	float clearStats; | ||||||
|  | 	RankSystem::RankStats*	rank; | ||||||
|  |  | ||||||
|  | 	struct PlayerWeapon : Stats { | ||||||
|  | 		const char* name; | ||||||
|  | 		int	ammo; | ||||||
|  | 		int	clip; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	PlayerWeapon	weapons[MAX_WEAPONS+MAX_CWEAPONS]; | ||||||
|  | 	PlayerWeapon	attackers[33]; | ||||||
|  | 	PlayerWeapon	victims[33]; | ||||||
|  | 	Stats			weaponsRnd[MAX_WEAPONS+MAX_CWEAPONS]; // DEC-Weapon (Round) stats | ||||||
|  | 	Stats			life; | ||||||
|  |  | ||||||
|  | 	int teamId; | ||||||
|  |  | ||||||
|  | 	void Init(  int pi, edict_t* pe ); | ||||||
|  | 	void Connect(const char* ip ); | ||||||
|  | 	void PutInServer(); | ||||||
|  | 	void Disconnect(); | ||||||
|  | 	void saveKill(CPlayer* pVictim, int weapon, int hs, int tk); | ||||||
|  | 	void saveHit(CPlayer* pVictim, int weapon, int damage, int aiming); | ||||||
|  | 	void saveShot(int weapon); | ||||||
|  |  | ||||||
|  | 	void saveBPlant(); | ||||||
|  | 	void saveBExplode(); | ||||||
|  | 	void saveBDefusing(); | ||||||
|  | 	void saveBDefused(); | ||||||
|  |  | ||||||
|  | 	void restartStats(bool all = true); | ||||||
|  | 	inline bool IsBot(){ | ||||||
|  | 		const char* auth= (*g_engfuncs.pfnGetPlayerAuthId)(pEdict); | ||||||
|  | 		return ( auth && !strcmp( auth , "BOT" ) ); | ||||||
|  | 	} | ||||||
|  | 	inline bool IsAlive(){ | ||||||
|  | 		return ((pEdict->v.deadflag==DEAD_NO)&&(pEdict->v.health>0)); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class Grenades | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | class Grenades | ||||||
|  | { | ||||||
|  |   struct Obj  | ||||||
|  |   { | ||||||
|  |     CPlayer* player; | ||||||
|  |     edict_t* grenade; | ||||||
|  |     float time; | ||||||
|  |     int type; | ||||||
|  |     Obj* next; | ||||||
|  |     Obj* prev; | ||||||
|  |   } *head; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   Grenades() { head = 0; } | ||||||
|  |   ~Grenades() { clear(); } | ||||||
|  |   void put( edict_t* grenade, float time, int type, CPlayer* player  ); | ||||||
|  |   bool find( edict_t* enemy, CPlayer** p, int* type ); | ||||||
|  |   void clear(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class Forward | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | class Forward | ||||||
|  | { | ||||||
|  | 	struct AmxCall { | ||||||
|  | 		AMX *amx; | ||||||
|  | 		int iFunctionIdx; | ||||||
|  | 		AmxCall* next; | ||||||
|  | 		AmxCall( AMX *a , int i, AmxCall* n ): amx(a), iFunctionIdx(i), next(n) {} | ||||||
|  | 	} *head; | ||||||
|  | public: | ||||||
|  | 	Forward() { head = 0; } | ||||||
|  | 	~Forward() { clear(); } | ||||||
|  | 	void clear(); | ||||||
|  | 	void put( AMX *a , int i ); | ||||||
|  | 	void exec(int p1,int p2,int p3,int p4,int p5,int p6); | ||||||
|  | 	void exec(int p1,int p2,int p3,int p4,int p5); | ||||||
|  | 	void exec(int p1,int p2); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif // CMISC_H | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										308
									
								
								dlls/csx/source/CRank.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										308
									
								
								dlls/csx/source/CRank.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,308 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | #include "amxxmodule.h" | ||||||
|  | #include "CRank.h" | ||||||
|  | #include "rank.h" | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class Stats | ||||||
|  | // ***************************************************** | ||||||
|  | Stats::Stats(){ | ||||||
|  | 	hits = shots = damage = hs = tks = kills = deaths = bDefusions = bDefused = bPlants = bExplosions = 0; | ||||||
|  | 	memset( bodyHits , 0 ,sizeof( bodyHits ) ); | ||||||
|  | } | ||||||
|  | void Stats::commit(Stats* a){ | ||||||
|  | 	hits += a->hits; | ||||||
|  | 	shots += a->shots; | ||||||
|  | 	damage += a->damage; | ||||||
|  | 	hs += a->hs; | ||||||
|  | 	tks += a->tks; | ||||||
|  | 	kills += a->kills; | ||||||
|  | 	deaths += a->deaths; | ||||||
|  |  | ||||||
|  | 	bDefusions += a->bDefusions; | ||||||
|  | 	bDefused += a->bDefused; | ||||||
|  | 	bPlants += a->bPlants; | ||||||
|  | 	bExplosions += a->bExplosions; | ||||||
|  |  | ||||||
|  | 	for(int i = 1; i < 8; ++i) | ||||||
|  | 		bodyHits[i] += a->bodyHits[i]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class RankSystem | ||||||
|  | // ***************************************************** | ||||||
|  | RankSystem::RankStats::RankStats( const char* uu, const char* nn, RankSystem* pp ) { | ||||||
|  | 	name = 0; | ||||||
|  | 	namelen = 0; | ||||||
|  | 	unique = 0; | ||||||
|  | 	uniquelen = 0; | ||||||
|  | 	score = 0; | ||||||
|  | 	parent = pp; | ||||||
|  | 	id = ++parent->rankNum; | ||||||
|  | 	next = prev = 0; | ||||||
|  | 	setName( nn ); | ||||||
|  | 	setUnique( uu ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | RankSystem::RankStats::~RankStats() { | ||||||
|  | 	delete[] name; | ||||||
|  | 	delete[] unique; | ||||||
|  | 	--parent->rankNum; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::RankStats::setName( const char* nn  )	{ | ||||||
|  | 	delete[] name; | ||||||
|  | 	namelen = strlen(nn) + 1; | ||||||
|  | 	name = new char[namelen]; | ||||||
|  | 	if ( name ) | ||||||
|  | 		strcpy( name , nn ); | ||||||
|  | 	else | ||||||
|  | 		namelen = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::RankStats::setUnique( const char* nn  )	{ | ||||||
|  | 	delete[] unique; | ||||||
|  | 	uniquelen = strlen(nn) + 1; | ||||||
|  | 	unique = new char[uniquelen]; | ||||||
|  | 	if ( unique ) | ||||||
|  | 		strcpy( unique , nn );	 | ||||||
|  | 	else | ||||||
|  | 		uniquelen = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | RankSystem::RankSystem() {  | ||||||
|  | 	head = 0;  | ||||||
|  | 	tail = 0;  | ||||||
|  | 	rankNum = 0; | ||||||
|  | 	calc.code = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | RankSystem::~RankSystem() { | ||||||
|  | 	clear(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::put_before( RankStats* a, RankStats* ptr ){ | ||||||
|  | 	a->next = ptr; | ||||||
|  | 	if ( ptr ){ | ||||||
|  | 		a->prev = ptr->prev; | ||||||
|  | 		ptr->prev = a; | ||||||
|  | 	} | ||||||
|  | 	else{ | ||||||
|  | 		a->prev = head; | ||||||
|  | 		head = a; | ||||||
|  | 	} | ||||||
|  | 	if ( a->prev )	a->prev->next = a; | ||||||
|  | 	else tail = a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void  RankSystem::put_after( RankStats* a, RankStats* ptr ) { | ||||||
|  | 	a->prev = ptr; | ||||||
|  | 	if ( ptr ){ | ||||||
|  | 		a->next = ptr->next; | ||||||
|  | 		ptr->next = a; | ||||||
|  | 	} | ||||||
|  | 	else{ | ||||||
|  | 		a->next = tail; | ||||||
|  | 		tail = a; | ||||||
|  | 	} | ||||||
|  | 	if ( a->next )	a->next->prev = a; | ||||||
|  | 	else head = a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::unlink( RankStats* ptr ){ | ||||||
|  | 	if (ptr->prev) ptr->prev->next = ptr->next; | ||||||
|  | 	else tail = ptr->next; | ||||||
|  | 	if (ptr->next) ptr->next->prev = ptr->prev; | ||||||
|  | 	else head = ptr->prev; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::clear(){ | ||||||
|  | 	while( tail ){ | ||||||
|  | 		head = tail->next; | ||||||
|  | 		delete tail; | ||||||
|  | 		tail = head; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | bool RankSystem::loadCalc(const char* filename, char* error) | ||||||
|  | { | ||||||
|  | 	if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)|| | ||||||
|  | 		(MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)|| | ||||||
|  | 		(MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)|| | ||||||
|  | 		(MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){ | ||||||
|  | 		LOG_CONSOLE( PLID, "Couldn't load plugin (file \"%s\")",filename); | ||||||
|  | 		MF_UnloadAmxScript(&calc.amx, &calc.code); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::unloadCalc() | ||||||
|  | { | ||||||
|  | 	MF_UnloadAmxScript(&calc.amx , &calc.code); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | RankSystem::RankStats* RankSystem::findEntryInRank(const char* unique, const char* name ) | ||||||
|  | { | ||||||
|  | 	RankStats* a = head; | ||||||
|  | 	 | ||||||
|  | 	while ( a ) | ||||||
|  | 	{ | ||||||
|  | 		if (  strcmp( a->getUnique() ,unique ) == 0 ) | ||||||
|  | 			return a; | ||||||
|  |  | ||||||
|  | 		a = a->prev; | ||||||
|  | 	} | ||||||
|  | 	a = new RankStats( unique ,name,this ); | ||||||
|  | 	if ( a == 0 ) return 0; | ||||||
|  | 	put_after( a  , 0 ); | ||||||
|  | 	return a; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::updatePos(  RankStats* rr ,  Stats* s ) | ||||||
|  | { | ||||||
|  | 	rr->addStats( s ); | ||||||
|  | 	if ( calc.code ) { | ||||||
|  | 		calc.physAddr1[0] = rr->kills; | ||||||
|  | 		calc.physAddr1[1] = rr->deaths; | ||||||
|  | 		calc.physAddr1[2] = rr->hs; | ||||||
|  | 		calc.physAddr1[3] = rr->tks; | ||||||
|  | 		calc.physAddr1[4] = rr->shots; | ||||||
|  | 		calc.physAddr1[5] = rr->hits; | ||||||
|  | 		calc.physAddr1[6] = rr->damage; | ||||||
|  |  | ||||||
|  | 		calc.physAddr1[7] = rr->bDefusions; | ||||||
|  | 		calc.physAddr1[8] = rr->bDefused; | ||||||
|  | 		calc.physAddr1[9] = rr->bPlants; | ||||||
|  | 		calc.physAddr1[10] = rr->bExplosions; | ||||||
|  |  | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			calc.physAddr2[i] = rr->bodyHits[i]; | ||||||
|  | 		cell result = 0; | ||||||
|  | 		int err; | ||||||
|  | 		if ((err = MF_AmxExec(&calc.amx,&result, calc.func ,2,calc.amxAddr1,calc.amxAddr2 )) != AMX_ERR_NONE) | ||||||
|  | 			LOG_CONSOLE( PLID, "Run time error %d on line %ld (plugin \"%s\")",	err,calc.amx.curline,LOCALINFO("csstats_score")); | ||||||
|  | 		rr->score = result; | ||||||
|  | 	} | ||||||
|  | 	else rr->score = rr->kills - rr->deaths; | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | 	RankStats* aa = rr->next; | ||||||
|  | 	while ( aa && (aa->score <= rr->score) ) { // try to nominate | ||||||
|  | 		rr->goUp(); | ||||||
|  | 		aa->goDown(); | ||||||
|  | 		aa = aa->next;		// go to next rank | ||||||
|  | 	} | ||||||
|  | 	if ( aa != rr->next ) | ||||||
|  | 	{ | ||||||
|  | 		unlink( rr ); | ||||||
|  | 		put_before( rr, aa ); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		aa = rr->prev; | ||||||
|  | 		while ( aa && (aa->score > rr->score) ) { // go down | ||||||
|  | 			rr->goDown(); | ||||||
|  | 			aa->goUp(); | ||||||
|  | 			aa = aa->prev;	// go to prev rank | ||||||
|  | 		} | ||||||
|  | 		if ( aa != rr->prev ){ | ||||||
|  | 			unlink( rr ); | ||||||
|  | 			put_after( rr, aa ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::loadRank( const char* filename ) | ||||||
|  | { | ||||||
|  | 	FILE *bfp = fopen( filename , "rb" ); | ||||||
|  | 	 | ||||||
|  | 	if ( !bfp ) return; | ||||||
|  | 	 | ||||||
|  | 	short int i = 0; | ||||||
|  | 	fread(&i, 1 , sizeof(short int) , bfp); | ||||||
|  | 	 | ||||||
|  | 	if (i == RANK_VERSION) | ||||||
|  | 	{ | ||||||
|  | 		Stats d; | ||||||
|  | 		char unique[64], name[64]; | ||||||
|  | 		fread(&i , 1, sizeof(short int), bfp); | ||||||
|  |  | ||||||
|  | 		while( i ) | ||||||
|  | 		{ | ||||||
|  | 			fread(name , i,sizeof(char) , bfp); | ||||||
|  | 			fread(&i , 1, sizeof(short int), bfp); | ||||||
|  | 			fread(unique , i,sizeof(char) , bfp); | ||||||
|  | 			fread(&d.tks, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.damage, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.deaths, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.kills, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.shots, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.hits, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.hs, 1,sizeof(int), bfp); | ||||||
|  |  | ||||||
|  | 			fread(&d.bDefusions, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.bDefused, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.bPlants, 1,sizeof(int), bfp); | ||||||
|  | 			fread(&d.bExplosions, 1,sizeof(int), bfp); | ||||||
|  |  | ||||||
|  | 			fread(d.bodyHits, 1,sizeof(d.bodyHits), bfp); | ||||||
|  | 			fread(&i , 1, sizeof(short int), bfp); | ||||||
|  |  | ||||||
|  | 			RankSystem::RankStats* a = findEntryInRank( unique , name ); | ||||||
|  |  | ||||||
|  | 			if ( a ) a->updatePosition( &d ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	fclose(bfp); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void RankSystem::saveRank( const char* filename ) | ||||||
|  | { | ||||||
|  | 	FILE *bfp = fopen(filename, "wb"); | ||||||
|  | 	 | ||||||
|  | 	if ( !bfp ) return; | ||||||
|  |  | ||||||
|  | 	short int i = RANK_VERSION; | ||||||
|  | 	 | ||||||
|  | 	fwrite(&i, 1, sizeof(short int) , bfp); | ||||||
|  | 	 | ||||||
|  | 	RankSystem::iterator a = front(); | ||||||
|  | 	 | ||||||
|  | 	while ( a ) | ||||||
|  | 	{ | ||||||
|  | 		if ( (*a).score != (1<<31) ) // score must be different than mincell | ||||||
|  | 		{ | ||||||
|  | 			fwrite( &(*a).namelen , 1, sizeof(short int), bfp); | ||||||
|  | 			fwrite( (*a).name , (*a).namelen , sizeof(char) , bfp); | ||||||
|  | 			fwrite( &(*a).uniquelen , 1, sizeof(short int), bfp); | ||||||
|  | 			fwrite( (*a).unique ,  (*a).uniquelen , sizeof(char) , bfp); | ||||||
|  | 			fwrite( &(*a).tks, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).damage, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).deaths, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).kills, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).shots, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).hits, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).hs, 1, sizeof(int), bfp); | ||||||
|  |  | ||||||
|  | 			fwrite( &(*a).bDefusions, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).bDefused, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).bPlants, 1, sizeof(int), bfp); | ||||||
|  | 			fwrite( &(*a).bExplosions, 1, sizeof(int), bfp); | ||||||
|  |  | ||||||
|  | 			fwrite( (*a).bodyHits, 1, sizeof((*a).bodyHits), bfp); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		--a; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	i = 0; | ||||||
|  | 	fwrite( &i , 1, sizeof(short int), bfp); // null terminator | ||||||
|  | 	 | ||||||
|  | 	fclose(bfp); | ||||||
|  | } | ||||||
							
								
								
									
										122
									
								
								dlls/csx/source/CRank.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										122
									
								
								dlls/csx/source/CRank.h
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef CRANK_H | ||||||
|  | #define CRANK_H | ||||||
|  |  | ||||||
|  | #define RANK_VERSION 11 | ||||||
|  |  | ||||||
|  | #include "amxxmodule.h" | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class Stats | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | struct Stats { | ||||||
|  | 	int hits; | ||||||
|  | 	int shots; | ||||||
|  | 	int damage; | ||||||
|  | 	int hs; | ||||||
|  | 	int tks; | ||||||
|  | 	int kills; | ||||||
|  | 	int deaths; | ||||||
|  | 	int bodyHits[9]; //////////////////// | ||||||
|  | 	 | ||||||
|  | 	// SiDLuke start | ||||||
|  | 	int bPlants; | ||||||
|  | 	int bExplosions; | ||||||
|  | 	int bDefusions; | ||||||
|  | 	int bDefused; | ||||||
|  | 	// SiDLuke end :D | ||||||
|  |  | ||||||
|  | 	Stats(); | ||||||
|  | 	void commit(Stats* a); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // ***************************************************** | ||||||
|  | // class RankSystem | ||||||
|  | // ***************************************************** | ||||||
|  |  | ||||||
|  | class RankSystem | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	class RankStats; | ||||||
|  | 	friend class RankStats; | ||||||
|  | 	class iterator; | ||||||
|  |  | ||||||
|  | 	class RankStats : public Stats { | ||||||
|  | 		friend class RankSystem; | ||||||
|  | 		friend class iterator; | ||||||
|  | 		RankSystem*	parent; | ||||||
|  | 		RankStats*	next; | ||||||
|  | 		RankStats*	prev; | ||||||
|  | 		char*		unique; | ||||||
|  | 		short int	uniquelen; | ||||||
|  | 		char*		name; | ||||||
|  | 		short int	namelen; | ||||||
|  | 		int			score; | ||||||
|  | 		int			id; | ||||||
|  | 		RankStats( const char* uu, const char* nn,  RankSystem* pp ); | ||||||
|  | 		~RankStats(); | ||||||
|  | 		void setUnique( const char* nn  ); | ||||||
|  | 		inline void goDown() {++id;} | ||||||
|  | 		inline void goUp() {--id;} | ||||||
|  | 		inline void addStats(Stats* a) { commit( a ); } | ||||||
|  | 	public: | ||||||
|  | 		void setName( const char* nn  ); | ||||||
|  | 		inline const char* getName() const { return name ? name : ""; } | ||||||
|  | 		inline const char* getUnique() const { return unique ? unique : ""; } | ||||||
|  | 		inline int getPosition() const { return id; } | ||||||
|  | 		inline void updatePosition( Stats* points ) { | ||||||
|  | 			parent->updatePos( this , points ); | ||||||
|  | 		} | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	RankStats* head; | ||||||
|  | 	RankStats* tail; | ||||||
|  | 	int rankNum; | ||||||
|  |  | ||||||
|  | 	struct scoreCalc{ | ||||||
|  | 		AMX amx; | ||||||
|  | 		void* code; | ||||||
|  | 		int func; | ||||||
|  | 		cell amxAddr1; | ||||||
|  | 		cell amxAddr2; | ||||||
|  | 		cell *physAddr1; | ||||||
|  | 		cell *physAddr2; | ||||||
|  | 	} calc; | ||||||
|  |  | ||||||
|  | 	void put_before( RankStats* a, RankStats* ptr ); | ||||||
|  | 	void put_after( RankStats* a, RankStats* ptr ); | ||||||
|  | 	void unlink( RankStats* ptr ); | ||||||
|  | 	void updatePos( RankStats* r ,  Stats* s ); | ||||||
|  | 	 | ||||||
|  | public: | ||||||
|  |  | ||||||
|  | 	RankSystem(); | ||||||
|  | 	~RankSystem(); | ||||||
|  |  | ||||||
|  | 	void saveRank( const char* filename ); | ||||||
|  | 	void loadRank( const char* filename ); | ||||||
|  | 	RankStats* findEntryInRank(const char* unique, const char* name ); | ||||||
|  | 	bool loadCalc(const char* filename, char* error); | ||||||
|  | 	inline int getRankNum( ) const { return rankNum; } | ||||||
|  | 	void clear(); | ||||||
|  | 	void unloadCalc(); | ||||||
|  |  | ||||||
|  | 	class iterator { | ||||||
|  | 		RankStats* ptr; | ||||||
|  | 	public: | ||||||
|  | 		iterator(RankStats* a): ptr(a){} | ||||||
|  | 		inline iterator& operator--() { ptr = ptr->prev; return *this;} | ||||||
|  | 		inline iterator& operator++() {	ptr = ptr->next; return *this; } | ||||||
|  | 		inline RankStats& operator*() {	return *ptr;} | ||||||
|  | 		operator bool () { return (ptr != 0); } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	inline iterator front() {  return iterator(head);  } | ||||||
|  | 	inline iterator begin() {  return iterator(tail);  } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										102
									
								
								dlls/csx/source/Makefile
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										102
									
								
								dlls/csx/source/Makefile
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,102 @@ | |||||||
|  | MODNAME = csx_amxx | ||||||
|  | SRCFILES = amxxmodule.cpp CMisc.cpp CRank.cpp meta_api.cpp rank.cpp usermsg.cpp | ||||||
|  |  | ||||||
|  | EXTRA_LIBS_LINUX = | ||||||
|  | EXTRA_LIBS_WIN32 = | ||||||
|  | EXTRA_LIBDIRS_LINUX = -Lextra/lib_linux | ||||||
|  | EXTRA_LIBDIRS_WIN32 = -Lextra/lib_win32 | ||||||
|  |  | ||||||
|  | EXTRA_INCLUDEDIRS = -Iextra/include -I../amx | ||||||
|  |  | ||||||
|  | EXTRA_FLAGS = -Dstrcmpi=strcasecmp | ||||||
|  |  | ||||||
|  | AMXDIR=../amx | ||||||
|  | SDKSRC=../sdk | ||||||
|  | METADIR=../metamod | ||||||
|  |  | ||||||
|  | OBJDIR_LINUX=obj.linux | ||||||
|  | OBJDIR_WIN32=obj.win32 | ||||||
|  | SRCDIR=. | ||||||
|  |  | ||||||
|  | ifdef windir | ||||||
|  | 	OS=WIN32 | ||||||
|  | else | ||||||
|  | 	OS=LINUX | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | CC_LINUX=gcc | ||||||
|  | ifeq "$(OS)" "WIN32" | ||||||
|  | 	CC_WIN32=gcc | ||||||
|  | 	LD_WINDLL=dllwrap | ||||||
|  | 	DEFAULT=win32 | ||||||
|  | 	CLEAN=clean_win32 | ||||||
|  | else | ||||||
|  | 	CC_WIN32=/usr/local/cross-tools/i386-mingw32msvc/bin/gcc | ||||||
|  | 	LD_WINDLL=/usr/local/cross-tools/bin/i386-mingw32msvc-dllwrap | ||||||
|  | 	DEFAULT=linux win32 | ||||||
|  | 	CLEAN=clean_both | ||||||
|  | endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LIBFILE_LINUX = $(MODNAME)_i386.so | ||||||
|  | LIBFILE_WIN32 = $(MODNAME).dll | ||||||
|  | TARGET_LINUX = $(OBJDIR_LINUX)/$(LIBFILE_LINUX) | ||||||
|  | TARGET_WIN32 = $(OBJDIR_WIN32)/$(LIBFILE_WIN32) | ||||||
|  |  | ||||||
|  | FILES_ALL = *.cpp *.h [A-Z]* *.rc | ||||||
|  | ifeq "$(OS)" "LINUX" | ||||||
|  | 	ASRCFILES := $(shell ls -t $(SRCFILES)) | ||||||
|  | else | ||||||
|  | 	ASRCFILES := $(shell dir /b) | ||||||
|  | endif | ||||||
|  | OBJ_LINUX := $(SRCFILES:%.cpp=$(OBJDIR_LINUX)/%.o) | ||||||
|  | OBJ_WIN32 := $(SRCFILES:%.cpp=$(OBJDIR_WIN32)/%.o) | ||||||
|  |  | ||||||
|  | CCOPT = -march=i586 -O6 -ffast-math -funroll-loops \ | ||||||
|  | 	-fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \ | ||||||
|  | 	-malign-jumps=2 -malign-functions=2 -s -DNDEBUG | ||||||
|  |  | ||||||
|  | INCLUDEDIRS=-I../curl/include -I$(SRCDIR) -I$(AMXDIR) -I$(METADIR) -I$(SDKSRC)/engine -I$(SDKSRC)/common -I$(SDKSRC)/dlls -I$(SDKSRC) $(EXTRA_INCLUDEDIRS) | ||||||
|  | CFLAGS=-Wall -Wno-unknown-pragmas | ||||||
|  | ODEF = -DOPT_TYPE=\"optimized\" | ||||||
|  | CFLAGS:=$(CCOPT) $(CFLAGS) $(ODEF) $(EXTRA_FLAGS) | ||||||
|  |  | ||||||
|  | DO_CC_LINUX=$(CC_LINUX) $(CFLAGS) -fPIC $(INCLUDEDIRS) -o $@ -c $< | ||||||
|  | DO_CC_WIN32=$(CC_WIN32) $(CFLAGS) $(INCLUDEDIRS) -o $@ -c $< | ||||||
|  | LINK_LINUX=$(CC_LINUX) $(CFLAGS) -shared -ldl -lm $(OBJ_LINUX) $(EXTRA_LIBDIRS_LINUX) $(EXTRA_LIBS_LINUX) -o $@ | ||||||
|  | LINK_WIN32=$(LD_WINDLL) -mwindows --add-stdcall-alias $(OBJ_WIN32) $(EXTRA_LIBDIRS_WIN32) $(EXTRA_LIBS_WIN32) -o $@ | ||||||
|  |  | ||||||
|  | $(OBJDIR_LINUX)/%.o: $(SRCDIR)/%.cpp | ||||||
|  | 	$(DO_CC_LINUX) | ||||||
|  |  | ||||||
|  | $(OBJDIR_WIN32)/%.o: $(SRCDIR)/%.cpp | ||||||
|  | 	$(DO_CC_WIN32) | ||||||
|  |  | ||||||
|  | default: $(DEFAULT) | ||||||
|  |  | ||||||
|  | $(TARGET_LINUX): $(OBJDIR_LINUX) $(OBJ_LINUX) | ||||||
|  | 	$(LINK_LINUX) | ||||||
|  |  | ||||||
|  | $(TARGET_WIN32): $(OBJDIR_WIN32) $(OBJ_WIN32) | ||||||
|  | 	$(LINK_WIN32) | ||||||
|  |  | ||||||
|  | $(OBJDIR_LINUX): | ||||||
|  | 	mkdir $@ | ||||||
|  |  | ||||||
|  | $(OBJDIR_WIN32): | ||||||
|  | 	mkdir $@ | ||||||
|  |  | ||||||
|  | win32: $(TARGET_WIN32) | ||||||
|  |  | ||||||
|  | linux: $(TARGET_LINUX) | ||||||
|  |  | ||||||
|  | clean: $(CLEAN) | ||||||
|  |  | ||||||
|  | clean_both: | ||||||
|  | 	-rm -f $(OBJDIR_LINUX)/* | ||||||
|  | 	-rm -f $(OBJDIR_WIN32)/* | ||||||
|  |  | ||||||
|  | clean_win32: | ||||||
|  | 	del /q $(OBJDIR_WIN32) | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										3004
									
								
								dlls/csx/source/amxxmodule.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3004
									
								
								dlls/csx/source/amxxmodule.cpp
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2181
									
								
								dlls/csx/source/amxxmodule.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2181
									
								
								dlls/csx/source/amxxmodule.h
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										6
									
								
								dlls/csx/source/compile.bat
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								dlls/csx/source/compile.bat
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | @echo off | ||||||
|  | PATH=D:\gcc\bin;%PATH% | ||||||
|  |  | ||||||
|  | make | ||||||
|  |  | ||||||
|  | pause | ||||||
							
								
								
									
										368
									
								
								dlls/csx/source/meta_api.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										368
									
								
								dlls/csx/source/meta_api.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,368 @@ | |||||||
|  | #include "amxxmodule.h" | ||||||
|  | #include "rank.h" | ||||||
|  |  | ||||||
|  | funEventCall modMsgsEnd[MAX_REG_MSGS]; | ||||||
|  | funEventCall modMsgs[MAX_REG_MSGS]; | ||||||
|  |  | ||||||
|  | void (*function)(void*); | ||||||
|  | void (*endfunction)(void*); | ||||||
|  |  | ||||||
|  | CPlayer players[33]; | ||||||
|  |  | ||||||
|  | CPlayer* mPlayer; | ||||||
|  |  | ||||||
|  | int mPlayerIndex; | ||||||
|  | int mState; | ||||||
|  |  | ||||||
|  | RankSystem g_rank; | ||||||
|  |  | ||||||
|  | Grenades g_grenades; | ||||||
|  |  | ||||||
|  | int iFGrenade; | ||||||
|  | int iFDeath; | ||||||
|  | int iFDamage; | ||||||
|  |  | ||||||
|  | int iFBPlanted; | ||||||
|  | int iFBDefused; | ||||||
|  | int iFBPlanting; | ||||||
|  | int iFBDefusing; | ||||||
|  | int iFBExplode; | ||||||
|  |  | ||||||
|  | int g_bombAnnounce; | ||||||
|  | int g_Planter; | ||||||
|  | int g_Defuser; | ||||||
|  |  | ||||||
|  | bool rankBots; | ||||||
|  |  | ||||||
|  | int gmsgCurWeapon; | ||||||
|  | int gmsgDeathMsg; | ||||||
|  | int gmsgDamage; | ||||||
|  | int gmsgDamageEnd; | ||||||
|  | int gmsgWeaponList; | ||||||
|  | int gmsgResetHUD; | ||||||
|  | int gmsgAmmoX; | ||||||
|  | int gmsgScoreInfo; | ||||||
|  | int gmsgAmmoPickup; | ||||||
|  |  | ||||||
|  | int gmsgSendAudio; | ||||||
|  | int gmsgTextMsg; | ||||||
|  | int gmsgBarTime; | ||||||
|  |  | ||||||
|  | cvar_t init_csstats_maxsize ={"csstats_maxsize","3500", 0 , 3500.0 }; | ||||||
|  | cvar_t init_csstats_reset ={"csstats_reset","0"}; | ||||||
|  | cvar_t init_csstats_rank ={"csstats_rank","0"}; | ||||||
|  | cvar_t *csstats_maxsize; | ||||||
|  | cvar_t *csstats_reset; | ||||||
|  | cvar_t *csstats_rank; | ||||||
|  |  | ||||||
|  | cvar_t* csstats_rankbots; | ||||||
|  | cvar_t* csstats_pause; | ||||||
|  | cvar_t init_csstats_rankbots ={"csstats_rankbots","1"}; | ||||||
|  | cvar_t init_csstats_pause = {"csstats_pause","0"}; | ||||||
|  |  | ||||||
|  | struct sUserMsg { | ||||||
|  | 	const char* name; | ||||||
|  | 	int* id; | ||||||
|  | 	funEventCall func; | ||||||
|  | 	bool endmsg; | ||||||
|  | } g_user_msg[] = { | ||||||
|  | 	{ "CurWeapon" , &gmsgCurWeapon , Client_CurWeapon, false }, | ||||||
|  | 	{ "Damage" , &gmsgDamage,Client_Damage, false  },	 | ||||||
|  | 	{ "Damage" , &gmsgDamageEnd, Client_Damage_End, true }, | ||||||
|  | 	{ "WeaponList" , &gmsgWeaponList, Client_WeaponList, false }, | ||||||
|  | 	{ "ResetHUD" , &gmsgResetHUD,Client_ResetHUD, true }, | ||||||
|  | 	{ "AmmoX" , &gmsgAmmoX, Client_AmmoX , false }, | ||||||
|  | 	{ "ScoreInfo" , &gmsgScoreInfo, Client_ScoreInfo, false }, | ||||||
|  | 	{ "AmmoPickup" , &gmsgAmmoPickup, Client_AmmoPickup , false }, | ||||||
|  |  | ||||||
|  | 	{ "SendAudio" , &gmsgSendAudio , Client_SendAudio , false }, | ||||||
|  | 	{ "TextMsg" , &gmsgTextMsg , Client_TextMsg , false }, | ||||||
|  | 	{ "BarTime" , &gmsgBarTime , Client_BarTime , false }, | ||||||
|  |  | ||||||
|  | 	{ 0 , 0,0,false } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int RegUserMsg_Post(const char *pszName, int iSize) | ||||||
|  | { | ||||||
|  | 	for (int i = 0; g_user_msg[ i ].name; ++i ) | ||||||
|  | 	{ | ||||||
|  | 		if ( !*g_user_msg[i].id && strcmp( g_user_msg[ i ].name , pszName  ) == 0 ) | ||||||
|  | 		{ | ||||||
|  | 			int id = META_RESULT_ORIG_RET( int ); | ||||||
|  |  | ||||||
|  | 			*g_user_msg[ i ].id = id; | ||||||
|  | 		 | ||||||
|  | 			if ( g_user_msg[ i ].endmsg ) | ||||||
|  | 				modMsgsEnd[ id  ] = g_user_msg[ i ].func; | ||||||
|  | 			else | ||||||
|  | 				modMsgs[ id  ] = g_user_msg[ i ].func; | ||||||
|  | 			//break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	RETURN_META_VALUE(MRES_IGNORED, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const char* get_localinfo( const char* name , const char* def = 0 ) | ||||||
|  | { | ||||||
|  | 	const char* b = LOCALINFO( (char*)name ); | ||||||
|  | 	if (((b==0)||(*b==0)) && def ) | ||||||
|  | 		SET_LOCALINFO((char*)name,(char*)(b = def) ); | ||||||
|  | 	return b; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ServerActivate_Post( edict_t *pEdictList, int edictCount, int clientMax ){ | ||||||
|  |  | ||||||
|  | 	rankBots = (int)csstats_rankbots->value ? true:false; | ||||||
|  |  | ||||||
|  | 	for( int i = 1; i <= gpGlobals->maxClients; ++i) | ||||||
|  | 		GET_PLAYER_POINTER_I(i)->Init( i , pEdictList + i ); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void PlayerPreThink_Post( edict_t *pEntity ) { | ||||||
|  |     if ( !isModuleActive() ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); | ||||||
|  | 	if (pPlayer->clearStats && pPlayer->clearStats < gpGlobals->time ){ | ||||||
|  |  | ||||||
|  | 		if ( !ignoreBots(pEntity) ){ | ||||||
|  | 			pPlayer->clearStats = 0.0f; | ||||||
|  | 			if (pPlayer->rank) | ||||||
|  | 				pPlayer->rank->updatePosition( &pPlayer->life ); | ||||||
|  | 			pPlayer->restartStats(false); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ServerDeactivate() { | ||||||
|  | 	int i; | ||||||
|  | 	for( i = 1;i<=gpGlobals->maxClients; ++i){ | ||||||
|  | 		CPlayer *pPlayer = GET_PLAYER_POINTER_I(i); | ||||||
|  | 		if (pPlayer->rank) pPlayer->Disconnect(); | ||||||
|  | 	} | ||||||
|  | 	if ( (g_rank.getRankNum() >= (int)csstats_maxsize->value) || ((int)csstats_reset->value == 1 ) ) { | ||||||
|  | 		CVAR_SET_FLOAT("csstats_reset",0.0); | ||||||
|  | 		g_rank.clear(); // clear before save to file | ||||||
|  | 	} | ||||||
|  | 	g_rank.saveRank( MF_BuildPathname("%s",get_localinfo("csstats")) );	 | ||||||
|  |  | ||||||
|  | 	// clear custom weapons info | ||||||
|  | 	for ( i=MAX_WEAPONS;i<MAX_WEAPONS+MAX_CWEAPONS;i++) | ||||||
|  | 		weaponData[i].ammoSlot = 0; | ||||||
|  |  | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | BOOL ClientConnect_Post( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ]  ){ | ||||||
|  | 	GET_PLAYER_POINTER(pEntity)->Connect(pszAddress); | ||||||
|  | 	RETURN_META_VALUE(MRES_IGNORED, TRUE); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ClientDisconnect( edict_t *pEntity ) { | ||||||
|  | 	CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); | ||||||
|  | 	if (pPlayer->rank) pPlayer->Disconnect(); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ClientPutInServer_Post( edict_t *pEntity ) { | ||||||
|  | 	GET_PLAYER_POINTER(pEntity)->PutInServer(); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ClientUserInfoChanged_Post( edict_t *pEntity, char *infobuffer ) { | ||||||
|  | 	CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); | ||||||
|  | 	const char* name = INFOKEY_VALUE(infobuffer,"name"); | ||||||
|  | 	const char* oldname = STRING(pEntity->v.netname); | ||||||
|  |  | ||||||
|  | 	if ( pPlayer->rank ){ | ||||||
|  | 		if ( strcmp(oldname,name) != 0 ) { | ||||||
|  | 			if ((int)csstats_rank->value == 0) | ||||||
|  | 				pPlayer->rank = g_rank.findEntryInRank( name, name ); | ||||||
|  | 			else | ||||||
|  | 				pPlayer->rank->setName( name ); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else if ( pPlayer->IsBot() ) { | ||||||
|  | 		pPlayer->Connect( "127.0.0.1" ); | ||||||
|  | 		pPlayer->PutInServer(); | ||||||
|  | 	} | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed) { | ||||||
|  | 	if (ed){ | ||||||
|  | 		mPlayerIndex = ENTINDEX(ed); | ||||||
|  | 		mPlayer = GET_PLAYER_POINTER_I(mPlayerIndex); | ||||||
|  | 	} else { | ||||||
|  | 		mPlayerIndex = 0; | ||||||
|  | 		mPlayer = 0; | ||||||
|  | 	} | ||||||
|  | 	mState = 0;	 | ||||||
|  | 	if ( msg_type < 0 || msg_type >= MAX_REG_MSGS ) | ||||||
|  | 		msg_type = 0; | ||||||
|  | 	function=modMsgs[msg_type]; | ||||||
|  | 	endfunction=modMsgsEnd[msg_type]; | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void MessageEnd_Post(void) { | ||||||
|  | 	if (endfunction) (*endfunction)(NULL); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteByte_Post(int iValue) { | ||||||
|  | 	if (function) (*function)((void *)&iValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteChar_Post(int iValue) { | ||||||
|  | 	if (function) (*function)((void *)&iValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteShort_Post(int iValue) { | ||||||
|  | 	if (function) (*function)((void *)&iValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteLong_Post(int iValue) { | ||||||
|  | 	if (function) (*function)((void *)&iValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteAngle_Post(float flValue) { | ||||||
|  | 	if (function) (*function)((void *)&flValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteCoord_Post(float flValue) { | ||||||
|  | 	if (function) (*function)((void *)&flValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteString_Post(const char *sz) { | ||||||
|  | 	if (function) (*function)((void *)sz); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void WriteEntity_Post(int iValue) { | ||||||
|  | 	if (function) (*function)((void *)&iValue); | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void StartFrame_Post(){ | ||||||
|  | 	if (g_bombAnnounce){ | ||||||
|  | 		switch (g_bombAnnounce){ | ||||||
|  | 		case BOMB_PLANTING: | ||||||
|  | 			MF_ExecuteForward( iFBPlanting,g_Planter ); | ||||||
|  | 			break; | ||||||
|  | 		case BOMB_PLANTED: | ||||||
|  | 			MF_ExecuteForward( iFBPlanted,g_Planter ); | ||||||
|  | 			break; | ||||||
|  | 		case BOMB_EXPLODE: | ||||||
|  | 			MF_ExecuteForward( iFBExplode,g_Planter,g_Defuser ); | ||||||
|  | 			break; | ||||||
|  | 		case BOMB_DEFUSING: | ||||||
|  | 			MF_ExecuteForward( iFBDefusing,g_Defuser ); | ||||||
|  | 			break; | ||||||
|  | 		case BOMB_DEFUSED: | ||||||
|  | 			MF_ExecuteForward( iFBDefused,g_Defuser ); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		g_bombAnnounce = 0; | ||||||
|  | 	} | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void SetModel_Post(edict_t *e, const char *m){ | ||||||
|  |  | ||||||
|  | 	if ( !isModuleActive() ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if ( e->v.owner && m[7]=='w' && m[8]=='_' ){ | ||||||
|  | 		int w_id = 0; | ||||||
|  | 		CPlayer *pPlayer = GET_PLAYER_POINTER(e->v.owner); | ||||||
|  | 		switch(m[9]){ | ||||||
|  | 		case 'h': | ||||||
|  | 			w_id = CSW_HEGRENADE; | ||||||
|  | 			g_grenades.put(e, 1.75, 4, pPlayer); | ||||||
|  | 			pPlayer->saveShot(4); | ||||||
|  | 			break; | ||||||
|  | 		case 'f': | ||||||
|  | 			if (m[10]=='l') w_id = CSW_FLASHBANG; | ||||||
|  | 			break; | ||||||
|  | 		case 's': | ||||||
|  | 			if (m[10]=='m') w_id = CSW_SMOKEGRENADE; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		if ( w_id )	 | ||||||
|  | 			MF_ExecuteForward( iFGrenade, pPlayer->index, ENTINDEX(e) ,w_id ); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void EmitSound_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch) { | ||||||
|  | 	if (sample[0]=='w'&&sample[1]=='e'&&sample[8]=='k'&&sample[9]=='n'&&sample[14]!='d'){ | ||||||
|  | 		CPlayer*pPlayer = GET_PLAYER_POINTER(entity); | ||||||
|  | 		pPlayer->saveShot(pPlayer->current); | ||||||
|  | 	} | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *e, TraceResult *ptr) { | ||||||
|  | 	if (ptr->pHit&&(ptr->pHit->v.flags& (FL_CLIENT | FL_FAKECLIENT) )&& | ||||||
|  | 		e&&(e->v.flags& (FL_CLIENT | FL_FAKECLIENT) )&&ptr->iHitgroup) | ||||||
|  | 		GET_PLAYER_POINTER(e)->aiming = ptr->iHitgroup; | ||||||
|  | 	RETURN_META(MRES_IGNORED); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OnMetaAttach() { | ||||||
|  |  | ||||||
|  | 	CVAR_REGISTER (&init_csstats_maxsize); | ||||||
|  | 	CVAR_REGISTER (&init_csstats_reset); | ||||||
|  | 	CVAR_REGISTER (&init_csstats_rank); | ||||||
|  | 	csstats_maxsize=CVAR_GET_POINTER(init_csstats_maxsize.name); | ||||||
|  | 	csstats_reset=CVAR_GET_POINTER(init_csstats_reset.name); | ||||||
|  | 	csstats_rank=CVAR_GET_POINTER(init_csstats_rank.name); | ||||||
|  |  | ||||||
|  | 	CVAR_REGISTER (&init_csstats_rankbots); | ||||||
|  | 	CVAR_REGISTER (&init_csstats_pause); | ||||||
|  | 	csstats_rankbots = CVAR_GET_POINTER(init_csstats_rankbots.name); | ||||||
|  | 	csstats_pause = CVAR_GET_POINTER(init_csstats_pause.name); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OnAmxxAttach(){ | ||||||
|  | 	MF_AddNatives(stats_Natives); | ||||||
|  | 	const char* path =  get_localinfo("csstats_score"); | ||||||
|  | 	if ( path && *path )  | ||||||
|  | 	{ | ||||||
|  | 		char error[128]; | ||||||
|  | 		g_rank.loadCalc( MF_BuildPathname("%s",path) , error  ); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if ( !g_rank.begin() ) | ||||||
|  | 	{		 | ||||||
|  | 		g_rank.loadRank( MF_BuildPathname("%s", | ||||||
|  | 			get_localinfo("csstats") ) ); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OnAmxxDetach() { | ||||||
|  | 	g_grenades.clear(); | ||||||
|  | 	g_rank.clear(); | ||||||
|  | 	g_rank.unloadCalc(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OnPluginsLoaded(){ | ||||||
|  | 	iFDeath = MF_RegisterForward("client_death",ET_IGNORE,FP_CELL,FP_CELL,FP_CELL,FP_CELL,FP_CELL,FP_DONE); | ||||||
|  | 	iFDamage = MF_RegisterForward("client_damage",ET_IGNORE,FP_CELL,FP_CELL,FP_CELL,FP_CELL,FP_CELL,FP_CELL,FP_DONE); | ||||||
|  | 	iFBPlanted = MF_RegisterForward("bomb_planted",ET_IGNORE,FP_CELL,FP_DONE); | ||||||
|  | 	iFBDefused = MF_RegisterForward("bomb_defused",ET_IGNORE,FP_CELL,FP_DONE); | ||||||
|  | 	iFBPlanting = MF_RegisterForward("bomb_planting",ET_IGNORE,FP_CELL,FP_DONE); | ||||||
|  | 	iFBDefusing = MF_RegisterForward("bomb_defusing",ET_IGNORE,FP_CELL,FP_DONE); | ||||||
|  | 	iFBExplode = MF_RegisterForward("bomb_explode",ET_IGNORE,FP_CELL,FP_CELL,FP_DONE); | ||||||
|  | 	iFGrenade = MF_RegisterForward("grenade_throw",ET_IGNORE,FP_CELL,FP_CELL,FP_CELL,FP_DONE); | ||||||
|  | } | ||||||
							
								
								
									
										462
									
								
								dlls/csx/source/moduleconfig.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										462
									
								
								dlls/csx/source/moduleconfig.h
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,462 @@ | |||||||
|  | // Configuration | ||||||
|  |  | ||||||
|  | #ifndef __MODULECONFIG_H__ | ||||||
|  | #define __MODULECONFIG_H__ | ||||||
|  |  | ||||||
|  | // Module info | ||||||
|  | #define MODULE_NAME "CSX" | ||||||
|  | #define MODULE_VERSION "0.20" | ||||||
|  | #define MODULE_AUTHOR "AMXx Dev Team" | ||||||
|  | #define MODULE_URL "http://www.amxmodx.org/" | ||||||
|  | #define MODULE_LOGTAG "CSX" | ||||||
|  | // If you want the module not to be reloaded on mapchange, remove / comment out the next line | ||||||
|  | #define MODULE_RELOAD_ON_MAPCHANGE | ||||||
|  |  | ||||||
|  | #ifdef __DATE__ | ||||||
|  | #define MODULE_DATE __DATE__ | ||||||
|  | #else // __DATE__ | ||||||
|  | #define MODULE_DATE "Unknown" | ||||||
|  | #endif // __DATE__ | ||||||
|  |  | ||||||
|  | // metamod plugin? | ||||||
|  | #define USE_METAMOD | ||||||
|  |  | ||||||
|  | // - AMXX Init functions | ||||||
|  | // Also consider using FN_META_* | ||||||
|  | // AMXX query | ||||||
|  | //#define FN_AMXX_QUERY OnAmxxQuery | ||||||
|  | // AMXX attach | ||||||
|  | //   Do native functions init here (MF_AddNatives) | ||||||
|  | #define FN_AMXX_ATTACH OnAmxxAttach | ||||||
|  | // AMXX detach | ||||||
|  | #define FN_AMXX_DETACH OnAmxxDetach | ||||||
|  | // All plugins loaded | ||||||
|  | //   Do forward functions init here (MF_RegisterForward) | ||||||
|  | #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded | ||||||
|  |  | ||||||
|  | /**** METAMOD ****/ | ||||||
|  | // If your module doesn't use metamod, you may close the file now :) | ||||||
|  | #ifdef USE_METAMOD | ||||||
|  | // ---- | ||||||
|  | // Hook Functions | ||||||
|  | // Uncomment these to be called | ||||||
|  | // You can also change the function name | ||||||
|  |  | ||||||
|  | // - Metamod init functions | ||||||
|  | // Also consider using FN_AMXX_* | ||||||
|  | // Meta query | ||||||
|  | //#define FN_META_QUERY OnMetaQuery | ||||||
|  | // Meta attach | ||||||
|  | #define FN_META_ATTACH OnMetaAttach | ||||||
|  | // Meta detach | ||||||
|  | //#define FN_META_DETACH OnMetaDetach | ||||||
|  |  | ||||||
|  | // (wd) are Will Day's notes | ||||||
|  | // - GetEntityAPI2 functions | ||||||
|  | // #define FN_GameDLLInit				GameDLLInit					/* pfnGameInit() */ | ||||||
|  | // #define FN_DispatchSpawn				DispatchSpawn				/* pfnSpawn() */ | ||||||
|  | // #define FN_DispatchThink				DispatchThink				/* pfnThink() */ | ||||||
|  | // #define FN_DispatchUse				DispatchUse					/* pfnUse() */ | ||||||
|  | // #define FN_DispatchTouch				DispatchTouch				/* pfnTouch() */ | ||||||
|  | // #define FN_DispatchBlocked			DispatchBlocked				/* pfnBlocked() */ | ||||||
|  | // #define FN_DispatchKeyValue			DispatchKeyValue			/* pfnKeyValue() */ | ||||||
|  | // #define FN_DispatchSave				DispatchSave				/* pfnSave() */ | ||||||
|  | // #define FN_DispatchRestore			DispatchRestore				/* pfnRestore() */ | ||||||
|  | // #define FN_DispatchObjectCollsionBox	DispatchObjectCollsionBox	/* pfnSetAbsBox() */ | ||||||
|  | // #define FN_SaveWriteFields			SaveWriteFields				/* pfnSaveWriteFields() */ | ||||||
|  | // #define FN_SaveReadFields			SaveReadFields				/* pfnSaveReadFields() */ | ||||||
|  | // #define FN_SaveGlobalState			SaveGlobalState				/* pfnSaveGlobalState() */ | ||||||
|  | // #define FN_RestoreGlobalState		RestoreGlobalState			/* pfnRestoreGlobalState() */ | ||||||
|  | // #define FN_ResetGlobalState			ResetGlobalState			/* pfnResetGlobalState() */ | ||||||
|  | // #define FN_ClientConnect				ClientConnect				/* pfnClientConnect()			(wd) Client has connected */ | ||||||
|  | #define FN_ClientDisconnect			ClientDisconnect			/* pfnClientDisconnect()		(wd) Player has left the game */ | ||||||
|  | // #define FN_ClientKill				ClientKill					/* pfnClientKill()				(wd) Player has typed "kill" */ | ||||||
|  | // #define FN_ClientPutInServer			ClientPutInServer			/* pfnClientPutInServer()		(wd) Client is entering the game */ | ||||||
|  | // #define FN_ClientCommand				ClientCommand				/* pfnClientCommand()			(wd) Player has sent a command (typed or from a bind) */ | ||||||
|  | // #define FN_ClientUserInfoChanged		ClientUserInfoChanged		/* pfnClientUserInfoChanged()	(wd) Client has updated their setinfo structure */ | ||||||
|  | // #define FN_ServerActivate			ServerActivate				/* pfnServerActivate()			(wd) Server is starting a new map */ | ||||||
|  | #define FN_ServerDeactivate			ServerDeactivate			/* pfnServerDeactivate()		(wd) Server is leaving the map (shutdown or changelevel); SDK2 */ | ||||||
|  | // #define FN_PlayerPreThink			PlayerPreThink				/* pfnPlayerPreThink() */ | ||||||
|  | // #define FN_PlayerPostThink			PlayerPostThink				/* pfnPlayerPostThink() */ | ||||||
|  | // #define FN_StartFrame				StartFrame					/* pfnStartFrame() */ | ||||||
|  | // #define FN_ParmsNewLevel				ParmsNewLevel				/* pfnParmsNewLevel() */ | ||||||
|  | // #define FN_ParmsChangeLevel			ParmsChangeLevel			/* pfnParmsChangeLevel() */ | ||||||
|  | // #define FN_GetGameDescription		GetGameDescription			/* pfnGetGameDescription()		Returns string describing current .dll.  E.g. "TeamFotrress 2" "Half-Life" */ | ||||||
|  | // #define FN_PlayerCustomization		PlayerCustomization			/* pfnPlayerCustomization()	Notifies .dll of new customization for player. */ | ||||||
|  | // #define FN_SpectatorConnect			SpectatorConnect			/* pfnSpectatorConnect()		Called when spectator joins server */ | ||||||
|  | // #define FN_SpectatorDisconnect		SpectatorDisconnect			/* pfnSpectatorDisconnect()	Called when spectator leaves the server */ | ||||||
|  | // #define FN_SpectatorThink			SpectatorThink				/* pfnSpectatorThink()			Called when spectator sends a command packet (usercmd_t) */ | ||||||
|  | // #define FN_Sys_Error					Sys_Error					/* pfnSys_Error()				Notify game .dll that engine is going to shut down.  Allows mod authors to set a breakpoint.  SDK2 */ | ||||||
|  | // #define FN_PM_Move					PM_Move						/* pfnPM_Move()				(wd) SDK2 */ | ||||||
|  | // #define FN_PM_Init					PM_Init						/* pfnPM_Init()				Server version of player movement initialization; (wd) SDK2 */ | ||||||
|  | // #define FN_PM_FindTextureType		PM_FindTextureType			/* pfnPM_FindTextureType()		(wd) SDK2 */ | ||||||
|  | // #define FN_SetupVisibility			SetupVisibility				/* pfnSetupVisibility()		Set up PVS and PAS for networking for this client; (wd) SDK2 */ | ||||||
|  | // #define FN_UpdateClientData			UpdateClientData			/* pfnUpdateClientData()		Set up data sent only to specific client; (wd) SDK2 */ | ||||||
|  | // #define FN_AddToFullPack				AddToFullPack				/* pfnAddToFullPack()			(wd) SDK2 */ | ||||||
|  | // #define FN_CreateBaseline			CreateBaseline				/* pfnCreateBaseline()			Tweak entity baseline for network encoding allows setup of player baselines too.; (wd) SDK2 */ | ||||||
|  | // #define FN_RegisterEncoders			RegisterEncoders			/* pfnRegisterEncoders()		Callbacks for network encoding; (wd) SDK2 */ | ||||||
|  | // #define FN_GetWeaponData				GetWeaponData				/* pfnGetWeaponData()			(wd) SDK2 */ | ||||||
|  | // #define FN_CmdStart					CmdStart					/* pfnCmdStart()				(wd) SDK2 */ | ||||||
|  | // #define FN_CmdEnd					CmdEnd						/* pfnCmdEnd()					(wd) SDK2 */ | ||||||
|  | // #define FN_ConnectionlessPacket		ConnectionlessPacket		/* pfnConnectionlessPacket()	(wd) SDK2 */ | ||||||
|  | // #define FN_GetHullBounds				GetHullBounds				/* pfnGetHullBounds()			(wd) SDK2 */ | ||||||
|  | // #define FN_CreateInstancedBaselines	CreateInstancedBaselines	/* pfnCreateInstancedBaselines()	(wd) SDK2 */ | ||||||
|  | // #define FN_InconsistentFile			InconsistentFile			/* pfnInconsistentFile()		(wd) SDK2 */ | ||||||
|  | // #define FN_AllowLagCompensation		AllowLagCompensation		/* pfnAllowLagCompensation()	(wd) SDK2 */ | ||||||
|  |  | ||||||
|  | // - GetEntityAPI2_Post functions | ||||||
|  | // #define FN_GameDLLInit_Post					GameDLLInit_Post | ||||||
|  | // #define FN_DispatchSpawn_Post				DispatchSpawn_Post | ||||||
|  | // #define FN_DispatchThink_Post				DispatchThink_Post | ||||||
|  | // #define FN_DispatchUse_Post					DispatchUse_Post | ||||||
|  | // #define FN_DispatchTouch_Post				DispatchTouch_Post | ||||||
|  | // #define FN_DispatchBlocked_Post				DispatchBlocked_Post | ||||||
|  | // #define FN_DispatchKeyValue_Post				DispatchKeyValue_Post | ||||||
|  | // #define FN_DispatchSave_Post					DispatchSave_Post | ||||||
|  | // #define FN_DispatchRestore_Post				DispatchRestore_Post | ||||||
|  | // #define FN_DispatchObjectCollsionBox_Post	DispatchObjectCollsionBox_Post | ||||||
|  | // #define FN_SaveWriteFields_Post				SaveWriteFields_Post | ||||||
|  | // #define FN_SaveReadFields_Post				SaveReadFields_Post | ||||||
|  | // #define FN_SaveGlobalState_Post				SaveGlobalState_Post | ||||||
|  | // #define FN_RestoreGlobalState_Post			RestoreGlobalState_Post | ||||||
|  | // #define FN_ResetGlobalState_Post				ResetGlobalState_Post | ||||||
|  | #define FN_ClientConnect_Post				ClientConnect_Post | ||||||
|  | // #define FN_ClientDisconnect_Post				ClientDisconnect_Post | ||||||
|  | // #define FN_ClientKill_Post					ClientKill_Post | ||||||
|  | #define FN_ClientPutInServer_Post			ClientPutInServer_Post | ||||||
|  | // #define FN_ClientCommand_Post				ClientCommand_Post | ||||||
|  | #define FN_ClientUserInfoChanged_Post		ClientUserInfoChanged_Post | ||||||
|  | #define FN_ServerActivate_Post				ServerActivate_Post | ||||||
|  | // #define FN_ServerDeactivate_Post				ServerDeactivate_Post | ||||||
|  | #define FN_PlayerPreThink_Post				PlayerPreThink_Post | ||||||
|  | // #define FN_PlayerPostThink_Post				PlayerPostThink_Post | ||||||
|  | #define FN_StartFrame_Post					StartFrame_Post | ||||||
|  | // #define FN_ParmsNewLevel_Post				ParmsNewLevel_Post | ||||||
|  | // #define FN_ParmsChangeLevel_Post				ParmsChangeLevel_Post | ||||||
|  | // #define FN_GetGameDescription_Post			GetGameDescription_Post | ||||||
|  | // #define FN_PlayerCustomization_Post			PlayerCustomization_Post | ||||||
|  | // #define FN_SpectatorConnect_Post				SpectatorConnect_Post | ||||||
|  | // #define FN_SpectatorDisconnect_Post			SpectatorDisconnect_Post | ||||||
|  | // #define FN_SpectatorThink_Post				SpectatorThink_Post | ||||||
|  | // #define FN_Sys_Error_Post					Sys_Error_Post | ||||||
|  | // #define FN_PM_Move_Post						PM_Move_Post | ||||||
|  | // #define FN_PM_Init_Post						PM_Init_Post | ||||||
|  | // #define FN_PM_FindTextureType_Post			PM_FindTextureType_Post | ||||||
|  | // #define FN_SetupVisibility_Post				SetupVisibility_Post | ||||||
|  | // #define FN_UpdateClientData_Post				UpdateClientData_Post | ||||||
|  | // #define FN_AddToFullPack_Post				AddToFullPack_Post | ||||||
|  | // #define FN_CreateBaseline_Post				CreateBaseline_Post | ||||||
|  | // #define FN_RegisterEncoders_Post				RegisterEncoders_Post | ||||||
|  | // #define FN_GetWeaponData_Post				GetWeaponData_Post | ||||||
|  | // #define FN_CmdStart_Post						CmdStart_Post | ||||||
|  | // #define FN_CmdEnd_Post						CmdEnd_Post | ||||||
|  | // #define FN_ConnectionlessPacket_Post			ConnectionlessPacket_Post | ||||||
|  | // #define FN_GetHullBounds_Post				GetHullBounds_Post | ||||||
|  | // #define FN_CreateInstancedBaselines_Post		CreateInstancedBaselines_Post | ||||||
|  | // #define FN_InconsistentFile_Post				InconsistentFile_Post | ||||||
|  | // #define FN_AllowLagCompensation_Post			AllowLagCompensation_Post | ||||||
|  |  | ||||||
|  | // - GetEngineAPI functions | ||||||
|  | // #define FN_PrecacheModel						PrecacheModel | ||||||
|  | // #define FN_PrecacheSound						PrecacheSound | ||||||
|  | // #define FN_SetModel							SetModel | ||||||
|  | // #define FN_ModelIndex						ModelIndex | ||||||
|  | // #define FN_ModelFrames						ModelFrames | ||||||
|  | // #define FN_SetSize							SetSize | ||||||
|  | // #define FN_ChangeLevel						ChangeLevel | ||||||
|  | // #define FN_GetSpawnParms						GetSpawnParms | ||||||
|  | // #define FN_SaveSpawnParms					SaveSpawnParms | ||||||
|  | // #define FN_VecToYaw							VecToYaw | ||||||
|  | // #define FN_VecToAngles						VecToAngles | ||||||
|  | // #define FN_MoveToOrigin						MoveToOrigin | ||||||
|  | // #define FN_ChangeYaw							ChangeYaw | ||||||
|  | // #define FN_ChangePitch						ChangePitch | ||||||
|  | // #define FN_FindEntityByString				FindEntityByString | ||||||
|  | // #define FN_GetEntityIllum					GetEntityIllum | ||||||
|  | // #define FN_FindEntityInSphere				FindEntityInSphere | ||||||
|  | // #define FN_FindClientInPVS					FindClientInPVS | ||||||
|  | // #define FN_EntitiesInPVS						EntitiesInPVS | ||||||
|  | // #define FN_MakeVectors						MakeVectors | ||||||
|  | // #define FN_AngleVectors						AngleVectors | ||||||
|  | // #define FN_CreateEntity						CreateEntity | ||||||
|  | // #define FN_RemoveEntity						RemoveEntity | ||||||
|  | // #define FN_CreateNamedEntity					CreateNamedEntity | ||||||
|  | // #define FN_MakeStatic						MakeStatic | ||||||
|  | // #define FN_EntIsOnFloor						EntIsOnFloor | ||||||
|  | // #define FN_DropToFloor						DropToFloor | ||||||
|  | // #define FN_WalkMove							WalkMove | ||||||
|  | // #define FN_SetOrigin							SetOrigin | ||||||
|  | // #define FN_EmitSound							EmitSound | ||||||
|  | // #define FN_EmitAmbientSound					EmitAmbientSound | ||||||
|  | // #define FN_TraceLine							TraceLine | ||||||
|  | // #define FN_TraceToss							TraceToss | ||||||
|  | // #define FN_TraceMonsterHull					TraceMonsterHull | ||||||
|  | // #define FN_TraceHull							TraceHull | ||||||
|  | // #define FN_TraceModel						TraceModel | ||||||
|  | // #define FN_TraceTexture						TraceTexture | ||||||
|  | // #define FN_TraceSphere						TraceSphere | ||||||
|  | // #define FN_GetAimVector						GetAimVector | ||||||
|  | // #define FN_ServerCommand						ServerCommand | ||||||
|  | // #define FN_ServerExecute						ServerExecute | ||||||
|  | // #define FN_engClientCommand					engClientCommand | ||||||
|  | // #define FN_ParticleEffect					ParticleEffect | ||||||
|  | // #define FN_LightStyle						LightStyle | ||||||
|  | // #define FN_DecalIndex						DecalIndex | ||||||
|  | // #define FN_PointContents						PointContents | ||||||
|  | // #define FN_MessageBegin						MessageBegin | ||||||
|  | // #define FN_MessageEnd						MessageEnd | ||||||
|  | // #define FN_WriteByte							WriteByte | ||||||
|  | // #define FN_WriteChar							WriteChar | ||||||
|  | // #define FN_WriteShort						WriteShort | ||||||
|  | // #define FN_WriteLong							WriteLong | ||||||
|  | // #define FN_WriteAngle						WriteAngle | ||||||
|  | // #define FN_WriteCoord						WriteCoord | ||||||
|  | // #define FN_WriteString						WriteString | ||||||
|  | // #define FN_WriteEntity						WriteEntity | ||||||
|  | // #define FN_CVarRegister						CVarRegister | ||||||
|  | // #define FN_CVarGetFloat						CVarGetFloat | ||||||
|  | // #define FN_CVarGetString						CVarGetString | ||||||
|  | // #define FN_CVarSetFloat						CVarSetFloat | ||||||
|  | // #define FN_CVarSetString						CVarSetString | ||||||
|  | // #define FN_AlertMessage						AlertMessage | ||||||
|  | // #define FN_EngineFprintf						EngineFprintf | ||||||
|  | // #define FN_PvAllocEntPrivateData				PvAllocEntPrivateData | ||||||
|  | // #define FN_PvEntPrivateData					PvEntPrivateData | ||||||
|  | // #define FN_FreeEntPrivateData				FreeEntPrivateData | ||||||
|  | // #define FN_SzFromIndex						SzFromIndex | ||||||
|  | // #define FN_AllocString						AllocString | ||||||
|  | // #define FN_GetVarsOfEnt						GetVarsOfEnt | ||||||
|  | // #define FN_PEntityOfEntOffset				PEntityOfEntOffset | ||||||
|  | // #define FN_EntOffsetOfPEntity				EntOffsetOfPEntity | ||||||
|  | // #define FN_IndexOfEdict						IndexOfEdict | ||||||
|  | // #define FN_PEntityOfEntIndex					PEntityOfEntIndex | ||||||
|  | // #define FN_FindEntityByVars					FindEntityByVars | ||||||
|  | // #define FN_GetModelPtr						GetModelPtr | ||||||
|  | // #define FN_RegUserMsg						RegUserMsg | ||||||
|  | // #define FN_AnimationAutomove					AnimationAutomove | ||||||
|  | // #define FN_GetBonePosition					GetBonePosition | ||||||
|  | // #define FN_FunctionFromName					FunctionFromName | ||||||
|  | // #define FN_NameForFunction					NameForFunction | ||||||
|  | // #define FN_ClientPrintf						ClientPrintf | ||||||
|  | // #define FN_ServerPrint						ServerPrint | ||||||
|  | // #define FN_Cmd_Args							Cmd_Args | ||||||
|  | // #define FN_Cmd_Argv							Cmd_Argv | ||||||
|  | // #define FN_Cmd_Argc							Cmd_Argc | ||||||
|  | // #define FN_GetAttachment						GetAttachment | ||||||
|  | // #define FN_CRC32_Init						CRC32_Init | ||||||
|  | // #define FN_CRC32_ProcessBuffer				CRC32_ProcessBuffer | ||||||
|  | // #define FN_CRC32_ProcessByte					CRC32_ProcessByte | ||||||
|  | // #define FN_CRC32_Final						CRC32_Final | ||||||
|  | // #define FN_RandomLong						RandomLong | ||||||
|  | // #define FN_RandomFloat						RandomFloat | ||||||
|  | // #define FN_SetView							SetView | ||||||
|  | // #define FN_Time								Time | ||||||
|  | // #define FN_CrosshairAngle					CrosshairAngle | ||||||
|  | // #define FN_LoadFileForMe						LoadFileForMe | ||||||
|  | // #define FN_FreeFile							FreeFile | ||||||
|  | // #define FN_EndSection						EndSection | ||||||
|  | // #define FN_CompareFileTime					CompareFileTime | ||||||
|  | // #define FN_GetGameDir						GetGameDir | ||||||
|  | // #define FN_Cvar_RegisterVariable				Cvar_RegisterVariable | ||||||
|  | // #define FN_FadeClientVolume					FadeClientVolume | ||||||
|  | // #define FN_SetClientMaxspeed					SetClientMaxspeed | ||||||
|  | // #define FN_CreateFakeClient					CreateFakeClient | ||||||
|  | // #define FN_RunPlayerMove						RunPlayerMove | ||||||
|  | // #define FN_NumberOfEntities					NumberOfEntities | ||||||
|  | // #define FN_GetInfoKeyBuffer					GetInfoKeyBuffer | ||||||
|  | // #define FN_InfoKeyValue						InfoKeyValue | ||||||
|  | // #define FN_SetKeyValue						SetKeyValue | ||||||
|  | // #define FN_SetClientKeyValue					SetClientKeyValue | ||||||
|  | // #define FN_IsMapValid						IsMapValid | ||||||
|  | // #define FN_StaticDecal						StaticDecal | ||||||
|  | // #define FN_PrecacheGeneric					PrecacheGeneric | ||||||
|  | // #define FN_GetPlayerUserId					GetPlayerUserId | ||||||
|  | // #define FN_BuildSoundMsg						BuildSoundMsg | ||||||
|  | // #define FN_IsDedicatedServer					IsDedicatedServer | ||||||
|  | // #define FN_CVarGetPointer					CVarGetPointer | ||||||
|  | // #define FN_GetPlayerWONId					GetPlayerWONId | ||||||
|  | // #define FN_Info_RemoveKey					Info_RemoveKey | ||||||
|  | // #define FN_GetPhysicsKeyValue				GetPhysicsKeyValue | ||||||
|  | // #define FN_SetPhysicsKeyValue				SetPhysicsKeyValue | ||||||
|  | // #define FN_GetPhysicsInfoString				GetPhysicsInfoString | ||||||
|  | // #define FN_PrecacheEvent						PrecacheEvent | ||||||
|  | // #define FN_PlaybackEvent						PlaybackEvent | ||||||
|  | // #define FN_SetFatPVS							SetFatPVS | ||||||
|  | // #define FN_SetFatPAS							SetFatPAS | ||||||
|  | // #define FN_CheckVisibility					CheckVisibility | ||||||
|  | // #define FN_DeltaSetField						DeltaSetField | ||||||
|  | // #define FN_DeltaUnsetField					DeltaUnsetField | ||||||
|  | // #define FN_DeltaAddEncoder					DeltaAddEncoder | ||||||
|  | // #define FN_GetCurrentPlayer					GetCurrentPlayer | ||||||
|  | // #define FN_CanSkipPlayer						CanSkipPlayer | ||||||
|  | // #define FN_DeltaFindField					DeltaFindField | ||||||
|  | // #define FN_DeltaSetFieldByIndex				DeltaSetFieldByIndex | ||||||
|  | // #define FN_DeltaUnsetFieldByIndex			DeltaUnsetFieldByIndex | ||||||
|  | // #define FN_SetGroupMask						SetGroupMask | ||||||
|  | // #define FN_engCreateInstancedBaseline		engCreateInstancedBaseline | ||||||
|  | // #define FN_Cvar_DirectSet					Cvar_DirectSet | ||||||
|  | // #define FN_ForceUnmodified					ForceUnmodified | ||||||
|  | // #define FN_GetPlayerStats					GetPlayerStats | ||||||
|  | // #define FN_AddServerCommand					AddServerCommand | ||||||
|  | // #define FN_Voice_GetClientListening			Voice_GetClientListening | ||||||
|  | // #define FN_Voice_SetClientListening			Voice_SetClientListening | ||||||
|  | // #define FN_GetPlayerAuthId					GetPlayerAuthId | ||||||
|  |  | ||||||
|  | // - GetEngineAPI_Post functions | ||||||
|  | // #define FN_PrecacheModel_Post				PrecacheModel_Post | ||||||
|  | // #define FN_PrecacheSound_Post				PrecacheSound_Post | ||||||
|  | #define FN_SetModel_Post						SetModel_Post | ||||||
|  | // #define FN_ModelIndex_Post					ModelIndex_Post | ||||||
|  | // #define FN_ModelFrames_Post					ModelFrames_Post | ||||||
|  | // #define FN_SetSize_Post						SetSize_Post | ||||||
|  | // #define FN_ChangeLevel_Post					ChangeLevel_Post | ||||||
|  | // #define FN_GetSpawnParms_Post				GetSpawnParms_Post | ||||||
|  | // #define FN_SaveSpawnParms_Post				SaveSpawnParms_Post | ||||||
|  | // #define FN_VecToYaw_Post						VecToYaw_Post | ||||||
|  | // #define FN_VecToAngles_Post					VecToAngles_Post | ||||||
|  | // #define FN_MoveToOrigin_Post					MoveToOrigin_Post | ||||||
|  | // #define FN_ChangeYaw_Post					ChangeYaw_Post | ||||||
|  | // #define FN_ChangePitch_Post					ChangePitch_Post | ||||||
|  | // #define FN_FindEntityByString_Post			FindEntityByString_Post | ||||||
|  | // #define FN_GetEntityIllum_Post				GetEntityIllum_Post | ||||||
|  | // #define FN_FindEntityInSphere_Post			FindEntityInSphere_Post | ||||||
|  | // #define FN_FindClientInPVS_Post				FindClientInPVS_Post | ||||||
|  | // #define FN_EntitiesInPVS_Post				EntitiesInPVS_Post | ||||||
|  | // #define FN_MakeVectors_Post					MakeVectors_Post | ||||||
|  | // #define FN_AngleVectors_Post					AngleVectors_Post | ||||||
|  | // #define FN_CreateEntity_Post					CreateEntity_Post | ||||||
|  | // #define FN_RemoveEntity_Post					RemoveEntity_Post | ||||||
|  | // #define FN_CreateNamedEntity_Post			CreateNamedEntity_Post | ||||||
|  | // #define FN_MakeStatic_Post					MakeStatic_Post | ||||||
|  | // #define FN_EntIsOnFloor_Post					EntIsOnFloor_Post | ||||||
|  | // #define FN_DropToFloor_Post					DropToFloor_Post | ||||||
|  | // #define FN_WalkMove_Post						WalkMove_Post | ||||||
|  | // #define FN_SetOrigin_Post					SetOrigin_Post | ||||||
|  | // #define FN_EmitSound_Post					EmitSound_Post | ||||||
|  | // #define FN_EmitAmbientSound_Post				EmitAmbientSound_Post | ||||||
|  | #define FN_TraceLine_Post					TraceLine_Post | ||||||
|  | // #define FN_TraceToss_Post					TraceToss_Post | ||||||
|  | // #define FN_TraceMonsterHull_Post				TraceMonsterHull_Post | ||||||
|  | // #define FN_TraceHull_Post					TraceHull_Post | ||||||
|  | // #define FN_TraceModel_Post					TraceModel_Post | ||||||
|  | // #define FN_TraceTexture_Post					TraceTexture_Post | ||||||
|  | // #define FN_TraceSphere_Post					TraceSphere_Post | ||||||
|  | // #define FN_GetAimVector_Post					GetAimVector_Post | ||||||
|  | // #define FN_ServerCommand_Post				ServerCommand_Post | ||||||
|  | // #define FN_ServerExecute_Post				ServerExecute_Post | ||||||
|  | // #define FN_engClientCommand_Post				engClientCommand_Post | ||||||
|  | // #define FN_ParticleEffect_Post				ParticleEffect_Post | ||||||
|  | // #define FN_LightStyle_Post					LightStyle_Post | ||||||
|  | // #define FN_DecalIndex_Post					DecalIndex_Post | ||||||
|  | // #define FN_PointContents_Post				PointContents_Post | ||||||
|  | #define FN_MessageBegin_Post					MessageBegin_Post | ||||||
|  | #define FN_MessageEnd_Post					MessageEnd_Post | ||||||
|  | #define FN_WriteByte_Post					WriteByte_Post | ||||||
|  | #define FN_WriteChar_Post					WriteChar_Post | ||||||
|  | #define FN_WriteShort_Post					WriteShort_Post | ||||||
|  | #define FN_WriteLong_Post					WriteLong_Post | ||||||
|  | #define FN_WriteAngle_Post					WriteAngle_Post | ||||||
|  | #define FN_WriteCoord_Post					WriteCoord_Post | ||||||
|  | #define FN_WriteString_Post					WriteString_Post | ||||||
|  | #define FN_WriteEntity_Post					WriteEntity_Post | ||||||
|  | // #define FN_CVarRegister_Post					CVarRegister_Post | ||||||
|  | // #define FN_CVarGetFloat_Post					CVarGetFloat_Post | ||||||
|  | // #define FN_CVarGetString_Post				CVarGetString_Post | ||||||
|  | // #define FN_CVarSetFloat_Post					CVarSetFloat_Post | ||||||
|  | // #define FN_CVarSetString_Post				CVarSetString_Post | ||||||
|  | // #define FN_AlertMessage_Post					AlertMessage_Post | ||||||
|  | // #define FN_EngineFprintf_Post				EngineFprintf_Post | ||||||
|  | // #define FN_PvAllocEntPrivateData_Post		PvAllocEntPrivateData_Post | ||||||
|  | // #define FN_PvEntPrivateData_Post				PvEntPrivateData_Post | ||||||
|  | // #define FN_FreeEntPrivateData_Post			FreeEntPrivateData_Post | ||||||
|  | // #define FN_SzFromIndex_Post					SzFromIndex_Post | ||||||
|  | // #define FN_AllocString_Post					AllocString_Post | ||||||
|  | // #define FN_GetVarsOfEnt_Post					GetVarsOfEnt_Post | ||||||
|  | // #define FN_PEntityOfEntOffset_Post			PEntityOfEntOffset_Post | ||||||
|  | // #define FN_EntOffsetOfPEntity_Post			EntOffsetOfPEntity_Post | ||||||
|  | // #define FN_IndexOfEdict_Post					IndexOfEdict_Post | ||||||
|  | // #define FN_PEntityOfEntIndex_Post			PEntityOfEntIndex_Post | ||||||
|  | // #define FN_FindEntityByVars_Post				FindEntityByVars_Post | ||||||
|  | // #define FN_GetModelPtr_Post					GetModelPtr_Post | ||||||
|  | #define FN_RegUserMsg_Post					RegUserMsg_Post | ||||||
|  | // #define FN_AnimationAutomove_Post			AnimationAutomove_Post | ||||||
|  | // #define FN_GetBonePosition_Post				GetBonePosition_Post | ||||||
|  | // #define FN_FunctionFromName_Post				FunctionFromName_Post | ||||||
|  | // #define FN_NameForFunction_Post				NameForFunction_Post | ||||||
|  | // #define FN_ClientPrintf_Post					ClientPrintf_Post | ||||||
|  | // #define FN_ServerPrint_Post					ServerPrint_Post | ||||||
|  | // #define FN_Cmd_Args_Post						Cmd_Args_Post | ||||||
|  | // #define FN_Cmd_Argv_Post						Cmd_Argv_Post | ||||||
|  | // #define FN_Cmd_Argc_Post						Cmd_Argc_Post | ||||||
|  | // #define FN_GetAttachment_Post				GetAttachment_Post | ||||||
|  | // #define FN_CRC32_Init_Post					CRC32_Init_Post | ||||||
|  | // #define FN_CRC32_ProcessBuffer_Post			CRC32_ProcessBuffer_Post | ||||||
|  | // #define FN_CRC32_ProcessByte_Post			CRC32_ProcessByte_Post | ||||||
|  | // #define FN_CRC32_Final_Post					CRC32_Final_Post | ||||||
|  | // #define FN_RandomLong_Post					RandomLong_Post | ||||||
|  | // #define FN_RandomFloat_Post					RandomFloat_Post | ||||||
|  | // #define FN_SetView_Post						SetView_Post | ||||||
|  | // #define FN_Time_Post							Time_Post | ||||||
|  | // #define FN_CrosshairAngle_Post				CrosshairAngle_Post | ||||||
|  | // #define FN_LoadFileForMe_Post				LoadFileForMe_Post | ||||||
|  | // #define FN_FreeFile_Post						FreeFile_Post | ||||||
|  | // #define FN_EndSection_Post					EndSection_Post | ||||||
|  | // #define FN_CompareFileTime_Post				CompareFileTime_Post | ||||||
|  | // #define FN_GetGameDir_Post					GetGameDir_Post | ||||||
|  | // #define FN_Cvar_RegisterVariable_Post		Cvar_RegisterVariable_Post | ||||||
|  | // #define FN_FadeClientVolume_Post				FadeClientVolume_Post | ||||||
|  | // #define FN_SetClientMaxspeed_Post			SetClientMaxspeed_Post | ||||||
|  | // #define FN_CreateFakeClient_Post				CreateFakeClient_Post | ||||||
|  | // #define FN_RunPlayerMove_Post				RunPlayerMove_Post | ||||||
|  | // #define FN_NumberOfEntities_Post				NumberOfEntities_Post | ||||||
|  | // #define FN_GetInfoKeyBuffer_Post				GetInfoKeyBuffer_Post | ||||||
|  | // #define FN_InfoKeyValue_Post					InfoKeyValue_Post | ||||||
|  | // #define FN_SetKeyValue_Post					SetKeyValue_Post | ||||||
|  | // #define FN_SetClientKeyValue_Post			SetClientKeyValue_Post | ||||||
|  | // #define FN_IsMapValid_Post					IsMapValid_Post | ||||||
|  | // #define FN_StaticDecal_Post					StaticDecal_Post | ||||||
|  | // #define FN_PrecacheGeneric_Post				PrecacheGeneric_Post | ||||||
|  | // #define FN_GetPlayerUserId_Post				GetPlayerUserId_Post | ||||||
|  | // #define FN_BuildSoundMsg_Post				BuildSoundMsg_Post | ||||||
|  | // #define FN_IsDedicatedServer_Post			IsDedicatedServer_Post | ||||||
|  | // #define FN_CVarGetPointer_Post				CVarGetPointer_Post | ||||||
|  | // #define FN_GetPlayerWONId_Post				GetPlayerWONId_Post | ||||||
|  | // #define FN_Info_RemoveKey_Post				Info_RemoveKey_Post | ||||||
|  | // #define FN_GetPhysicsKeyValue_Post			GetPhysicsKeyValue_Post | ||||||
|  | // #define FN_SetPhysicsKeyValue_Post			SetPhysicsKeyValue_Post | ||||||
|  | // #define FN_GetPhysicsInfoString_Post			GetPhysicsInfoString_Post | ||||||
|  | // #define FN_PrecacheEvent_Post				PrecacheEvent_Post | ||||||
|  | // #define FN_PlaybackEvent_Post				PlaybackEvent_Post | ||||||
|  | // #define FN_SetFatPVS_Post					SetFatPVS_Post | ||||||
|  | // #define FN_SetFatPAS_Post					SetFatPAS_Post | ||||||
|  | // #define FN_CheckVisibility_Post				CheckVisibility_Post | ||||||
|  | // #define FN_DeltaSetField_Post				DeltaSetField_Post | ||||||
|  | // #define FN_DeltaUnsetField_Post				DeltaUnsetField_Post | ||||||
|  | // #define FN_DeltaAddEncoder_Post				DeltaAddEncoder_Post | ||||||
|  | // #define FN_GetCurrentPlayer_Post				GetCurrentPlayer_Post | ||||||
|  | // #define FN_CanSkipPlayer_Post				CanSkipPlayer_Post | ||||||
|  | // #define FN_DeltaFindField_Post				DeltaFindField_Post | ||||||
|  | // #define FN_DeltaSetFieldByIndex_Post			DeltaSetFieldByIndex_Post | ||||||
|  | // #define FN_DeltaUnsetFieldByIndex_Post		DeltaUnsetFieldByIndex_Post | ||||||
|  | // #define FN_SetGroupMask_Post					SetGroupMask_Post | ||||||
|  | // #define FN_engCreateInstancedBaseline_Post	engCreateInstancedBaseline_Post | ||||||
|  | // #define FN_Cvar_DirectSet_Post				Cvar_DirectSet_Post | ||||||
|  | // #define FN_ForceUnmodified_Post				ForceUnmodified_Post | ||||||
|  | // #define FN_GetPlayerStats_Post				GetPlayerStats_Post | ||||||
|  | // #define FN_AddServerCommand_Post				AddServerCommand_Post | ||||||
|  | // #define FN_Voice_GetClientListening_Post		Voice_GetClientListening_Post | ||||||
|  | // #define FN_Voice_SetClientListening_Post		Voice_SetClientListening_Post | ||||||
|  | // #define FN_GetPlayerAuthId_Post				GetPlayerAuthId_Post | ||||||
|  |  | ||||||
|  | // #define FN_OnFreeEntPrivateData				OnFreeEntPrivateData				 | ||||||
|  | // #define FN_GameShutdown						GameShutdown | ||||||
|  | // #define FN_ShouldCollide						ShouldCollide | ||||||
|  |  | ||||||
|  | // #define FN_OnFreeEntPrivateData_Post			OnFreeEntPrivateData_Post | ||||||
|  | // #define FN_GameShutdown_Post					GameShutdown_Post | ||||||
|  | // #define FN_ShouldCollide_Post				ShouldCollide_Post | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // USE_METAMOD | ||||||
|  |  | ||||||
|  | #endif // __MODULECONFIG_H__ | ||||||
							
								
								
									
										149
									
								
								dlls/csx/source/msvc/csx.dsp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										149
									
								
								dlls/csx/source/msvc/csx.dsp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,149 @@ | |||||||
|  | # Microsoft Developer Studio Project File - Name="csx" - Package Owner=<4> | ||||||
|  | # Microsoft Developer Studio Generated Build File, Format Version 6.00 | ||||||
|  | # ** DO NOT EDIT ** | ||||||
|  |  | ||||||
|  | # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 | ||||||
|  |  | ||||||
|  | CFG=csx - Win32 Debug | ||||||
|  | !MESSAGE This is not a valid makefile. To build this project using NMAKE, | ||||||
|  | !MESSAGE use the Export Makefile command and run | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE NMAKE /f "csx.mak". | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE You can specify a configuration when running NMAKE | ||||||
|  | !MESSAGE by defining the macro CFG on the command line. For example: | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE NMAKE /f "csx.mak" CFG="csx - Win32 Debug" | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE Possible choices for configuration are: | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE "csx - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") | ||||||
|  | !MESSAGE "csx - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") | ||||||
|  | !MESSAGE  | ||||||
|  |  | ||||||
|  | # Begin Project | ||||||
|  | # PROP AllowPerConfigDependencies 0 | ||||||
|  | # PROP Scc_ProjName "" | ||||||
|  | # PROP Scc_LocalPath "" | ||||||
|  | CPP=cl.exe | ||||||
|  | MTL=midl.exe | ||||||
|  | RSC=rc.exe | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "csx - Win32 Release" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 0 | ||||||
|  | # PROP BASE Output_Dir "Release" | ||||||
|  | # PROP BASE Intermediate_Dir "Release" | ||||||
|  | # PROP BASE Target_Dir "" | ||||||
|  | # PROP Use_MFC 0 | ||||||
|  | # PROP Use_Debug_Libraries 0 | ||||||
|  | # PROP Output_Dir "release" | ||||||
|  | # PROP Intermediate_Dir "release" | ||||||
|  | # PROP Ignore_Export_Lib 0 | ||||||
|  | # PROP Target_Dir "" | ||||||
|  | # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "csx_EXPORTS" /YX /FD /c | ||||||
|  | # ADD CPP /nologo /Zp4 /MT /W3 /GX /O2 /I "..\..\metamod" /I "..\..\sdk\common" /I "..\..\sdk\engine" /I "..\..\sdk\dlls" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "csx_EXPORTS" /D "JIT" /FR /YX /FD /c | ||||||
|  | # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | ||||||
|  | # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | ||||||
|  | # ADD BASE RSC /l 0x409 /d "NDEBUG" | ||||||
|  | # ADD RSC /l 0x409 /d "NDEBUG" | ||||||
|  | BSC32=bscmake.exe | ||||||
|  | # ADD BASE BSC32 /nologo | ||||||
|  | # ADD BSC32 /nologo | ||||||
|  | LINK32=link.exe | ||||||
|  | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 | ||||||
|  | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"release/csx_amxx.dll" | ||||||
|  | # SUBTRACT LINK32 /pdb:none | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "csx - Win32 Debug" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 1 | ||||||
|  | # PROP BASE Output_Dir "Debug" | ||||||
|  | # PROP BASE Intermediate_Dir "Debug" | ||||||
|  | # PROP BASE Target_Dir "" | ||||||
|  | # PROP Use_MFC 0 | ||||||
|  | # PROP Use_Debug_Libraries 1 | ||||||
|  | # PROP Output_Dir "debug" | ||||||
|  | # PROP Intermediate_Dir "debug" | ||||||
|  | # PROP Ignore_Export_Lib 0 | ||||||
|  | # PROP Target_Dir "" | ||||||
|  | # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "csx_EXPORTS" /YX /FD /GZ /c | ||||||
|  | # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\metamod" /I "..\..\sdk\common" /I "..\..\sdk\engine" /I "..\..\sdk\dlls" /I "..\..\hlsdk\sourcecode\pm_shared" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "csx_EXPORTS" /FR /YX /FD /GZ /c | ||||||
|  | # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | ||||||
|  | # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | ||||||
|  | # ADD BASE RSC /l 0x409 /d "_DEBUG" | ||||||
|  | # ADD RSC /l 0x409 /d "_DEBUG" | ||||||
|  | BSC32=bscmake.exe | ||||||
|  | # ADD BASE BSC32 /nologo | ||||||
|  | # ADD BSC32 /nologo | ||||||
|  | LINK32=link.exe | ||||||
|  | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept | ||||||
|  | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"debug/csx_amxx.dll" /pdbtype:sept | ||||||
|  | # SUBTRACT LINK32 /pdb:none | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # Begin Target | ||||||
|  |  | ||||||
|  | # Name "csx - Win32 Release" | ||||||
|  | # Name "csx - Win32 Debug" | ||||||
|  | # Begin Group "Source Files" | ||||||
|  |  | ||||||
|  | # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\amxxmodule.cpp | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\CMisc.cpp | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\CRank.cpp | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\meta_api.cpp | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\rank.cpp | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\usermsg.cpp | ||||||
|  | # End Source File | ||||||
|  | # End Group | ||||||
|  | # Begin Group "Header Files" | ||||||
|  |  | ||||||
|  | # PROP Default_Filter "h;hpp;hxx;hm;inl" | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\amxxmodule.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\CMisc.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\CRank.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\moduleconfig.h | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\rank.h | ||||||
|  | # End Source File | ||||||
|  | # End Group | ||||||
|  | # Begin Group "Resource Files" | ||||||
|  |  | ||||||
|  | # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||||
|  | # End Group | ||||||
|  | # End Target | ||||||
|  | # End Project | ||||||
							
								
								
									
										29
									
								
								dlls/csx/source/msvc/csx.dsw
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								dlls/csx/source/msvc/csx.dsw
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | Microsoft Developer Studio Workspace File, Format Version 6.00 | ||||||
|  | # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | Project: "csx"=.\csx.dsp - Package Owner=<4> | ||||||
|  |  | ||||||
|  | Package=<5> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | Package=<4> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | Global: | ||||||
|  |  | ||||||
|  | Package=<5> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | Package=<3> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
							
								
								
									
										447
									
								
								dlls/csx/source/rank.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										447
									
								
								dlls/csx/source/rank.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,447 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | #include "amxxmodule.h" | ||||||
|  | #include "rank.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_astats(AMX *amx, cell *params) /* 6 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	int attacker = params[2]; | ||||||
|  | 	if (attacker<0||attacker>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if (pPlayer->attackers[attacker].hits){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 		cell *cpBodyHits = MF_GetAmxAddr(amx,params[4]); | ||||||
|  | 		CPlayer::PlayerWeapon* stats = &pPlayer->attackers[attacker]; | ||||||
|  | 		cpStats[0] = stats->kills; | ||||||
|  | 		cpStats[1] = stats->deaths; | ||||||
|  | 		cpStats[2] = stats->hs; | ||||||
|  | 		cpStats[3] = stats->tks; | ||||||
|  | 		cpStats[4] = stats->shots; | ||||||
|  | 		cpStats[5] = stats->hits; | ||||||
|  | 		cpStats[6] = stats->damage; | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			cpBodyHits[i] = stats->bodyHits[i]; | ||||||
|  | 		if (params[6] && attacker && stats->name ) | ||||||
|  | 			MF_SetAmxString(amx,params[5],stats->name,params[6]); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_vstats(AMX *amx, cell *params) /* 6 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	int victim = params[2]; | ||||||
|  | 	if (victim<0||victim>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if (pPlayer->victims[victim].hits){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 		cell *cpBodyHits = MF_GetAmxAddr(amx,params[4]); | ||||||
|  | 		CPlayer::PlayerWeapon* stats = &pPlayer->victims[victim]; | ||||||
|  | 		cpStats[0] = stats->kills; | ||||||
|  | 		cpStats[1] = stats->deaths; | ||||||
|  | 		cpStats[2] = stats->hs; | ||||||
|  | 		cpStats[3] = stats->tks; | ||||||
|  | 		cpStats[4] = stats->shots; | ||||||
|  | 		cpStats[5] = stats->hits; | ||||||
|  | 		cpStats[6] = stats->damage; | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			cpBodyHits[i] = stats->bodyHits[i]; | ||||||
|  | 		if (params[6] && victim && stats->name) | ||||||
|  | 			MF_SetAmxString(amx,params[5],stats->name,params[6]); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_wrstats(AMX *amx, cell *params) /* 4 param */ // DEC-Weapon (round) stats (end) | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	int weapon = params[2]; | ||||||
|  | 	if (weapon<0||weapon>=MAX_WEAPONS){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if (pPlayer->weaponsRnd[weapon].shots){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 		cell *cpBodyHits = MF_GetAmxAddr(amx,params[4]); | ||||||
|  | 		Stats* stats = &pPlayer->weaponsRnd[weapon]; | ||||||
|  | 		cpStats[0] = stats->kills; | ||||||
|  | 		cpStats[1] = stats->deaths; | ||||||
|  | 		cpStats[2] = stats->hs; | ||||||
|  | 		cpStats[3] = stats->tks; | ||||||
|  | 		cpStats[4] = stats->shots; | ||||||
|  | 		cpStats[5] = stats->hits; | ||||||
|  | 		cpStats[6] = stats->damage; | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			cpBodyHits[i] = stats->bodyHits[i]; | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_wstats(AMX *amx, cell *params) /* 4 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	int weapon = params[2]; | ||||||
|  | 	if (weapon<0||weapon>=MAX_WEAPONS){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if (pPlayer->weapons[weapon].shots){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 		cell *cpBodyHits = MF_GetAmxAddr(amx,params[4]); | ||||||
|  | 		CPlayer::PlayerWeapon* stats = &pPlayer->weapons[weapon]; | ||||||
|  | 		cpStats[0] = stats->kills; | ||||||
|  | 		cpStats[1] = stats->deaths; | ||||||
|  | 		cpStats[2] = stats->hs; | ||||||
|  | 		cpStats[3] = stats->tks; | ||||||
|  | 		cpStats[4] = stats->shots; | ||||||
|  | 		cpStats[5] = stats->hits; | ||||||
|  | 		cpStats[6] = stats->damage; | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			cpBodyHits[i] = stats->bodyHits[i]; | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL reset_user_wstats(AMX *amx, cell *params) /* 6 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	GET_PLAYER_POINTER_I(index)->restartStats(); | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_rstats(AMX *amx, cell *params) /* 3 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if (pPlayer->rank){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[2]); | ||||||
|  | 		cell *cpBodyHits = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 		cpStats[0] = pPlayer->life.kills; | ||||||
|  | 		cpStats[1] = pPlayer->life.deaths; | ||||||
|  | 		cpStats[2] = pPlayer->life.hs; | ||||||
|  | 		cpStats[3] = pPlayer->life.tks; | ||||||
|  | 		cpStats[4] = pPlayer->life.shots; | ||||||
|  | 		cpStats[5] = pPlayer->life.hits; | ||||||
|  | 		cpStats[6] = pPlayer->life.damage; | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			cpBodyHits[i] = pPlayer->life.bodyHits[i]; | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_stats(AMX *amx, cell *params) /* 3 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if ( pPlayer->rank ){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[2]); | ||||||
|  | 		cell *cpBodyHits = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 		cpStats[0] = pPlayer->rank->kills; | ||||||
|  | 		cpStats[1] = pPlayer->rank->deaths; | ||||||
|  | 		cpStats[2] = pPlayer->rank->hs; | ||||||
|  | 		cpStats[3] = pPlayer->rank->tks; | ||||||
|  | 		cpStats[4] = pPlayer->rank->shots; | ||||||
|  | 		cpStats[5] = pPlayer->rank->hits; | ||||||
|  | 		cpStats[6] = pPlayer->rank->damage; | ||||||
|  |  | ||||||
|  | 		cpStats[7] = pPlayer->rank->getPosition(); | ||||||
|  |  | ||||||
|  | 		for(int i = 1; i < 8; ++i) | ||||||
|  | 			cpBodyHits[i] = pPlayer->rank->bodyHits[i]; | ||||||
|  | 		return pPlayer->rank->getPosition(); | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_user_stats2(AMX *amx, cell *params) /* 3 param */ | ||||||
|  | { | ||||||
|  | 	int index = params[1]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	if ( pPlayer->rank ){ | ||||||
|  | 		cell *cpStats = MF_GetAmxAddr(amx,params[2]); | ||||||
|  |  | ||||||
|  | 		cpStats[0] = pPlayer->rank->bDefusions; | ||||||
|  | 		cpStats[1] = pPlayer->rank->bDefused; | ||||||
|  | 		cpStats[2] = pPlayer->rank->bPlants; | ||||||
|  | 		cpStats[3] = pPlayer->rank->bExplosions; | ||||||
|  |  | ||||||
|  | 		return pPlayer->rank->getPosition(); | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_stats(AMX *amx, cell *params) /* 3 param */ | ||||||
|  | { | ||||||
|  | 	 | ||||||
|  | 	int index = params[1] + 1; | ||||||
|  |  | ||||||
|  | 	for(RankSystem::iterator a = g_rank.front(); a ;--a){ | ||||||
|  | 		if ((*a).getPosition() == index)  { | ||||||
|  | 			cell *cpStats = MF_GetAmxAddr(amx,params[2]); | ||||||
|  | 			cell *cpBodyHits = MF_GetAmxAddr(amx,params[3]); | ||||||
|  | 			cpStats[0] = (*a).kills; | ||||||
|  | 			cpStats[1] = (*a).deaths; | ||||||
|  | 			cpStats[2] = (*a).hs; | ||||||
|  | 			cpStats[3] = (*a).tks; | ||||||
|  | 			cpStats[4] = (*a).shots; | ||||||
|  | 			cpStats[5] = (*a).hits; | ||||||
|  | 			cpStats[6] = (*a).damage; | ||||||
|  |  | ||||||
|  | 			cpStats[7] = (*a).getPosition(); | ||||||
|  |  | ||||||
|  | 			MF_SetAmxString(amx,params[4],(*a).getName(),params[5]); | ||||||
|  | 			for(int i = 1; i < 8; ++i) | ||||||
|  | 				cpBodyHits[i] = (*a).bodyHits[i]; | ||||||
|  | 			return --a ? index : 0; | ||||||
|  | 		}	 | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_stats2(AMX *amx, cell *params) /* 3 param */ | ||||||
|  | { | ||||||
|  | 	 | ||||||
|  | 	int index = params[1] + 1; | ||||||
|  |  | ||||||
|  | 	for(RankSystem::iterator a = g_rank.front(); a ;--a){ | ||||||
|  | 		if ((*a).getPosition() == index)  { | ||||||
|  | 			cell *cpStats = MF_GetAmxAddr(amx,params[2]); | ||||||
|  |  | ||||||
|  | 			cpStats[0] = (*a).bDefusions; | ||||||
|  | 			cpStats[1] = (*a).bDefused; | ||||||
|  | 			cpStats[2] = (*a).bPlants; | ||||||
|  | 			cpStats[3] = (*a).bExplosions; | ||||||
|  |  | ||||||
|  | 			return --a ? index : 0; | ||||||
|  | 		}	 | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_statsnum(AMX *amx, cell *params) | ||||||
|  | { | ||||||
|  | 	return g_rank.getRankNum(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL register_cwpn(AMX *amx, cell *params){ // name,logname,melee=0  | ||||||
|  | 	int i; | ||||||
|  | 	bool bFree = false; | ||||||
|  | 	for ( i=MAX_WEAPONS;i<MAX_WEAPONS+MAX_CWEAPONS;i++){ | ||||||
|  | 		if ( !weaponData[i].ammoSlot ){ | ||||||
|  | 			bFree = true; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if ( !bFree ){ | ||||||
|  | 		MF_PrintSrvConsole("No More Custom Weapon Slots!\n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int iLen; | ||||||
|  | 	char *szName = MF_GetAmxString(amx, params[1], 0, &iLen); | ||||||
|  | 	char *szLogName = MF_GetAmxString(amx, params[3], 0, &iLen); | ||||||
|  |  | ||||||
|  | 	strcpy(weaponData[i].name,szName); | ||||||
|  | 	strcpy(weaponData[i].logname,szLogName); | ||||||
|  | 	weaponData[i].ammoSlot = 1; | ||||||
|  | 	weaponData[i].melee = params[2] ? true:false; | ||||||
|  |  | ||||||
|  | 	return i; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL custom_wpn_dmg(AMX *amx, cell *params){ // wid,att,vic,dmg,hp=0 | ||||||
|  | 	int weapon = params[1]; | ||||||
|  | 	if (  weapon < MAX_WEAPONS || weapon >= MAX_WEAPONS+MAX_CWEAPONS ||  !weaponData[weapon].ammoSlot ){ // only for custom weapons | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int att = params[2]; | ||||||
|  | 	if (att<1||att>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int vic = params[3]; | ||||||
|  | 	if (vic<1||vic>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	int dmg = params[4]; | ||||||
|  | 	if ( dmg<1 ){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	int aim = params[5]; | ||||||
|  | 	if ( aim < 0 || aim > 7 ){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	CPlayer* pAtt = GET_PLAYER_POINTER_I(att); | ||||||
|  | 	CPlayer* pVic = GET_PLAYER_POINTER_I(vic); | ||||||
|  |  | ||||||
|  | 	pVic->pEdict->v.dmg_inflictor = NULL; | ||||||
|  | 	pAtt->saveHit( pVic , weapon , dmg, aim ); | ||||||
|  |  | ||||||
|  | 	if ( !pAtt ) pAtt = pVic; | ||||||
|  | 	int TA = 0; | ||||||
|  | 	if ( (pVic->teamId == pAtt->teamId) && ( pVic != pAtt) ) | ||||||
|  | 		TA = 1; | ||||||
|  | 	MF_ExecuteForward( iFDamage,pAtt->index, pVic->index, dmg, weapon, aim, TA ); | ||||||
|  | 	 | ||||||
|  | 	if ( pVic->IsAlive() ) | ||||||
|  | 		return 1; | ||||||
|  |  | ||||||
|  | 	pAtt->saveKill(pVic,weapon,( aim == 1 ) ? 1:0 ,TA); | ||||||
|  | 	MF_ExecuteForward( iFDeath,pAtt->index, pVic->index, weapon, aim, TA ); | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL custom_wpn_shot(AMX *amx, cell *params){ // player,wid | ||||||
|  | 	int index = params[2]; | ||||||
|  | 	if (index<1||index>gpGlobals->maxClients){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int weapon = params[1]; | ||||||
|  | 	if (  weapon < MAX_WEAPONS  || weapon >= MAX_WEAPONS+MAX_CWEAPONS ||  !weaponData[weapon].ammoSlot ){ | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); | ||||||
|  | 	pPlayer->saveShot(weapon); | ||||||
|  |  | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_wpnname(AMX *amx, cell *params){  | ||||||
|  | 	int id = params[1]; | ||||||
|  | 	if (id<0 || id>=MAX_WEAPONS+MAX_CWEAPONS ){  | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	return MF_SetAmxString(amx,params[2],weaponData[id].name,params[3]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_wpnlogname(AMX *amx, cell *params){  | ||||||
|  | 	int id = params[1]; | ||||||
|  | 	if (id<0 || id>=MAX_WEAPONS+MAX_CWEAPONS ){  | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	return MF_SetAmxString(amx,params[2],weaponData[id].logname,params[3]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL is_melee(AMX *amx, cell *params){  | ||||||
|  | 	int id = params[1]; | ||||||
|  | 	if (id<0 || id>=MAX_WEAPONS+MAX_CWEAPONS ){  | ||||||
|  | 		MF_RaiseAmxError(amx,AMX_ERR_NATIVE); | ||||||
|  | 		MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	if ( id == 29 ) | ||||||
|  | 		return 1; | ||||||
|  | 	return weaponData[id].melee ? 1:0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_maxweapons(AMX *amx, cell *params){ | ||||||
|  | 	return MAX_WEAPONS+MAX_CWEAPONS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static cell AMX_NATIVE_CALL get_stats_size(AMX *amx, cell *params){ | ||||||
|  | 	return 8; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | AMX_NATIVE_INFO stats_Natives[] = { | ||||||
|  | 	{ "get_stats",      get_stats}, | ||||||
|  | 	{ "get_stats2",      get_stats2}, | ||||||
|  | 	{ "get_statsnum",   get_statsnum}, | ||||||
|  | 	{ "get_user_astats",  get_user_astats }, | ||||||
|  | 	{ "get_user_rstats",  get_user_rstats }, | ||||||
|  | 	{ "get_user_lstats",  get_user_rstats }, // for backward compatibility | ||||||
|  | 	{ "get_user_stats",   get_user_stats }, | ||||||
|  | 	{ "get_user_stats2",   get_user_stats2 }, | ||||||
|  | 	{ "get_user_vstats",  get_user_vstats }, | ||||||
|  | 	{ "get_user_wrstats",  get_user_wrstats},             // DEC-Weapon(Round) Stats | ||||||
|  | 	{ "get_user_wstats",  get_user_wstats}, | ||||||
|  | 	{ "reset_user_wstats",  reset_user_wstats }, | ||||||
|  |  | ||||||
|  | 	// Custom Weapon Support | ||||||
|  | 	{ "custom_weapon_add", register_cwpn }, | ||||||
|  | 	{ "custom_weapon_dmg", custom_wpn_dmg }, | ||||||
|  | 	{ "custom_weapon_shot", custom_wpn_shot }, | ||||||
|  |  | ||||||
|  | 	{ "xmod_get_wpnname", get_wpnname }, | ||||||
|  | 	{ "xmod_get_wpnlogname", get_wpnlogname }, | ||||||
|  | 	{ "xmod_is_melee_wpn", is_melee }, | ||||||
|  | 	{ "xmod_get_maxweapons", get_maxweapons }, | ||||||
|  | 	{ "xmod_get_stats_size", get_stats_size }, | ||||||
|  |  | ||||||
|  | 	//*************************************** | ||||||
|  | 	{ "get_weaponname", get_wpnname }, | ||||||
|  |  | ||||||
|  | 	///******************* | ||||||
|  | 	{ NULL, NULL } | ||||||
|  | }; | ||||||
|  |  | ||||||
							
								
								
									
										104
									
								
								dlls/csx/source/rank.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										104
									
								
								dlls/csx/source/rank.h
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,104 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef RANK_H | ||||||
|  | #define RANK_H | ||||||
|  |  | ||||||
|  | #include "amxxmodule.h" | ||||||
|  | #include "CMisc.h" | ||||||
|  | #include "CRank.h" | ||||||
|  |  | ||||||
|  | #define GET_PLAYER_POINTER(e)   (&players[ENTINDEX(e)]) | ||||||
|  | #define GET_PLAYER_POINTER_I(i) (&players[i]) | ||||||
|  |  | ||||||
|  | extern AMX_NATIVE_INFO stats_Natives[]; | ||||||
|  |  | ||||||
|  | struct weaponsVault { | ||||||
|  |   char* name; | ||||||
|  |   char* logname; | ||||||
|  |   short int ammoSlot; | ||||||
|  |   bool melee; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | extern bool rankBots; | ||||||
|  | extern cvar_t* csstats_rankbots; | ||||||
|  | extern cvar_t* csstats_pause; | ||||||
|  |  | ||||||
|  | extern int iFGrenade; | ||||||
|  | extern int iFDeath; | ||||||
|  | extern int iFDamage; | ||||||
|  |  | ||||||
|  | extern int iFBPlanted; | ||||||
|  | extern int iFBDefused; | ||||||
|  | extern int iFBPlanting; | ||||||
|  | extern int iFBDefusing; | ||||||
|  | extern int iFBExplode; | ||||||
|  |  | ||||||
|  | extern int g_bombAnnounce; | ||||||
|  | extern int g_Planter; | ||||||
|  | extern int g_Defuser; | ||||||
|  |  | ||||||
|  | #define BOMB_PLANTING	1 | ||||||
|  | #define BOMB_PLANTED	2 | ||||||
|  | #define BOMB_EXPLODE	3 | ||||||
|  | #define BOMB_DEFUSING	4 | ||||||
|  | #define BOMB_DEFUSED	5 | ||||||
|  |  | ||||||
|  | extern weaponsVault weaponData[MAX_WEAPONS+MAX_CWEAPONS]; | ||||||
|  |  | ||||||
|  | typedef void (*funEventCall)(void*); | ||||||
|  | extern funEventCall modMsgsEnd[MAX_REG_MSGS]; | ||||||
|  | extern funEventCall modMsgs[MAX_REG_MSGS]; | ||||||
|  |  | ||||||
|  | extern void (*function)(void*); | ||||||
|  | extern void (*endfunction)(void*); | ||||||
|  |  | ||||||
|  | extern cvar_t *csstats_maxsize; | ||||||
|  | extern cvar_t* csstats_rank; | ||||||
|  | extern cvar_t* csstats_reset; | ||||||
|  |  | ||||||
|  | extern Grenades g_grenades; | ||||||
|  |  | ||||||
|  | extern RankSystem g_rank; | ||||||
|  |  | ||||||
|  | extern CPlayer players[33]; | ||||||
|  |  | ||||||
|  | extern CPlayer* mPlayer; | ||||||
|  |  | ||||||
|  | extern int mPlayerIndex; | ||||||
|  |  | ||||||
|  | extern int mState; | ||||||
|  |  | ||||||
|  | extern int gmsgCurWeapon; | ||||||
|  | extern int gmsgDamageEnd; | ||||||
|  | extern int gmsgDamage; | ||||||
|  | extern int gmsgWeaponList; | ||||||
|  | extern int gmsgResetHUD; | ||||||
|  | extern int gmsgAmmoX; | ||||||
|  | extern int gmsgScoreInfo; | ||||||
|  | extern int gmsgAmmoPickup; | ||||||
|  |  | ||||||
|  | extern int gmsgSendAudio; | ||||||
|  | extern int gmsgTextMsg; | ||||||
|  | extern int gmsgBarTime; | ||||||
|  |  | ||||||
|  | void Client_AmmoX(void*); | ||||||
|  | void Client_CurWeapon(void*); | ||||||
|  | void Client_Damage(void*); | ||||||
|  | void Client_WeaponList(void*); | ||||||
|  | void Client_AmmoPickup(void*); | ||||||
|  | void Client_Damage_End(void*); | ||||||
|  | void Client_ScoreInfo(void*); | ||||||
|  | void Client_ResetHUD(void*); | ||||||
|  |  | ||||||
|  | void Client_SendAudio(void*); | ||||||
|  | void Client_TextMsg(void*); | ||||||
|  | void Client_BarTime(void*); | ||||||
|  |  | ||||||
|  | bool ignoreBots (edict_t *pEnt, edict_t *pOther = NULL ); | ||||||
|  | bool isModuleActive(); | ||||||
|  |  | ||||||
|  | #endif // RANK_H | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										203
									
								
								dlls/csx/source/usermsg.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										203
									
								
								dlls/csx/source/usermsg.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,203 @@ | |||||||
|  | #include "amxxmodule.h" | ||||||
|  | #include "rank.h" | ||||||
|  |  | ||||||
|  | weaponsVault weaponData[MAX_WEAPONS+MAX_CWEAPONS]; | ||||||
|  |  | ||||||
|  | int damage; | ||||||
|  | int TA; | ||||||
|  | int weapon; | ||||||
|  | int aim; | ||||||
|  | CPlayer *pAttacker; | ||||||
|  |  | ||||||
|  | void Client_ResetHUD(void* mValue){ | ||||||
|  | 	if ( mPlayer && mPlayer->IsAlive() )  | ||||||
|  | 		mPlayer->clearStats = gpGlobals->time + 0.25f; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_WeaponList(void* mValue){ | ||||||
|  |   static int wpnList; | ||||||
|  |   static int iSlot; | ||||||
|  |   static const char* wpnName; | ||||||
|  |  | ||||||
|  |   switch (mState++) { | ||||||
|  |   case 0: | ||||||
|  |     wpnName = (const char*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 1: | ||||||
|  |     iSlot = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 7: | ||||||
|  |     int iId = *(int*)mValue; | ||||||
|  |     if ( (iId < 0 || iId >= MAX_WEAPONS ) || ( wpnList & (1<<iId) ) ) | ||||||
|  |       break; | ||||||
|  |  | ||||||
|  |     wpnList |= (1<<iId); | ||||||
|  |     weaponData[iId].ammoSlot = iSlot; | ||||||
|  |  | ||||||
|  | 	char* wpnPrefix = strstr( wpnName,"weapon_"); | ||||||
|  |  | ||||||
|  | 	if ( wpnPrefix ) | ||||||
|  | 	{ | ||||||
|  | 		weaponData[iId].name = wpnPrefix + 7; | ||||||
|  | 		if ( strcmp( weaponData[iId].name, "hegrenade" ) == 0 ) | ||||||
|  | 			weaponData[iId].name += 2; | ||||||
|  | 		weaponData[iId].logname = weaponData[iId].name; | ||||||
|  | 	} | ||||||
|  |   }  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_Damage(void* mValue){ | ||||||
|  |   static int bits; | ||||||
|  |   switch (mState++) { | ||||||
|  |   case 1:  | ||||||
|  |     damage = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 2: | ||||||
|  |     bits = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 3: | ||||||
|  |     if (!mPlayer || !damage || !*(float*)mValue || bits)  break; | ||||||
|  |     edict_t *enemy; | ||||||
|  | 	enemy = mPlayer->pEdict->v.dmg_inflictor; | ||||||
|  |      | ||||||
|  | 	if ( FNullEnt( enemy ) ) | ||||||
|  | 		break; | ||||||
|  | 	aim = 0; | ||||||
|  | 	weapon = 0; | ||||||
|  | 	pAttacker = NULL; | ||||||
|  |      | ||||||
|  | 	if (enemy->v.flags & (FL_CLIENT | FL_FAKECLIENT) ) { | ||||||
|  | 		pAttacker = GET_PLAYER_POINTER(enemy); | ||||||
|  | 		aim = pAttacker->aiming; | ||||||
|  | 		weapon = pAttacker->current; | ||||||
|  | 		pAttacker->saveHit( mPlayer , weapon , damage, aim); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  |     if( g_grenades.find(enemy , &pAttacker , &weapon ) ) | ||||||
|  |         pAttacker->saveHit( mPlayer , weapon , damage, aim ); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_Damage_End(void* mValue){ | ||||||
|  | 	if ( !mPlayer || !damage ) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if ( !pAttacker ) pAttacker = mPlayer; | ||||||
|  | 		TA = 0; | ||||||
|  | 	if ( (mPlayer->teamId == pAttacker->teamId) && (mPlayer != pAttacker) ) | ||||||
|  | 		TA = 1; | ||||||
|  |  | ||||||
|  | 	MF_ExecuteForward( iFDamage,pAttacker->index , mPlayer->index , damage, weapon, aim, TA ); | ||||||
|  | 	  | ||||||
|  | 	if ( !mPlayer->IsAlive() ){ | ||||||
|  | 		pAttacker->saveKill(mPlayer,weapon,( aim == 1 ) ? 1:0 ,TA); | ||||||
|  | 		MF_ExecuteForward( iFDeath,pAttacker->index, mPlayer->index, weapon, aim, TA ); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_CurWeapon(void* mValue){ | ||||||
|  |   static int iState; | ||||||
|  |   static int iId; | ||||||
|  |   switch (mState++){ | ||||||
|  |   case 0:  | ||||||
|  |     iState = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 1: | ||||||
|  |     if (!iState) break;  | ||||||
|  |     iId = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 2: | ||||||
|  | 	if (!mPlayer || !iState ) break; | ||||||
|  |     int iClip = *(int*)mValue; | ||||||
|  |     if ((iClip > -1) && (iClip < mPlayer->weapons[iId].clip))  | ||||||
|  |       mPlayer->saveShot(iId); | ||||||
|  |     mPlayer->weapons[iId].clip = iClip; | ||||||
|  | 	mPlayer->current = iId; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_AmmoX(void* mValue){ | ||||||
|  |   static int iAmmo; | ||||||
|  |   switch (mState++){ | ||||||
|  |   case 0: | ||||||
|  |     iAmmo = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 1: | ||||||
|  | 	if (!mPlayer ) break; | ||||||
|  |     for(int i = 1; i < MAX_WEAPONS ; ++i)  | ||||||
|  |       if (iAmmo == weaponData[i].ammoSlot) | ||||||
|  |         mPlayer->weapons[i].ammo = *(int*)mValue; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_AmmoPickup(void* mValue){ | ||||||
|  |   static int iSlot; | ||||||
|  |   switch (mState++){ | ||||||
|  |   case 0: | ||||||
|  |     iSlot = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 1: | ||||||
|  | 	if (!mPlayer ) break; | ||||||
|  |     for(int i = 1; i < MAX_WEAPONS ; ++i) | ||||||
|  |       if (weaponData[i].ammoSlot == iSlot) | ||||||
|  |         mPlayer->weapons[i].ammo += *(int*)mValue; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_ScoreInfo(void* mValue){ | ||||||
|  |   static int index; | ||||||
|  |   switch (mState++){ | ||||||
|  |   case 0: | ||||||
|  |     index = *(int*)mValue; | ||||||
|  |     break; | ||||||
|  |   case 4: | ||||||
|  | 	if ( index > 0 && index <= gpGlobals->maxClients ) | ||||||
|  | 		GET_PLAYER_POINTER_I( index )->teamId = *(int*)mValue; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_SendAudio(void* mValue){ | ||||||
|  | 	static const char* szText; | ||||||
|  | 	if ( mState == 1 ){ | ||||||
|  | 		szText = (const char*)mValue; | ||||||
|  | 		if ( !mPlayer && szText[7]=='B' ) { | ||||||
|  | 			if ( szText[11]=='P' && g_Planter ){ | ||||||
|  | 				GET_PLAYER_POINTER_I(g_Planter)->saveBPlant(); | ||||||
|  | 				g_bombAnnounce = BOMB_PLANTED; | ||||||
|  | 			} | ||||||
|  | 			else if ( szText[11]=='D' && g_Defuser ){ | ||||||
|  | 				GET_PLAYER_POINTER_I(g_Defuser)->saveBDefused(); | ||||||
|  | 				g_bombAnnounce = BOMB_DEFUSED; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	mState++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_TextMsg(void* mValue){ | ||||||
|  | 	static const char* szText; | ||||||
|  | 	if ( !mPlayer && mState==1 ){ | ||||||
|  | 		szText = (const char*)mValue; | ||||||
|  | 		if ( szText[1]=='T' && szText[8]=='B' && g_Planter ){ | ||||||
|  | 			GET_PLAYER_POINTER_I(g_Planter)->saveBExplode(); | ||||||
|  | 			g_bombAnnounce = BOMB_EXPLODE; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	mState++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Client_BarTime(void* mValue){ | ||||||
|  | 	int iTime = *(int*)mValue; | ||||||
|  | 	if ( !iTime || !mPlayer->IsAlive() ) return; | ||||||
|  | 	if ( iTime == 3 ){ | ||||||
|  | 		g_Planter = mPlayerIndex; | ||||||
|  | 		g_bombAnnounce = BOMB_PLANTING; | ||||||
|  | 		g_Defuser = 0; | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		mPlayer->saveBDefusing(); | ||||||
|  | 		g_Defuser = mPlayerIndex; | ||||||
|  | 		g_bombAnnounce = BOMB_DEFUSING; | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user