Last active
September 5, 2024 19:13
-
-
Save cetteup/bd1bc8f674eff40df66cf6f70c92067c to your computer and use it in GitHub Desktop.
BF2Hub stats Python ("decompiled" source code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/__init__.py | |
# Compiled at: 2014-11-13 20:33:26 | |
import host, bf2, sys | |
from bf2.bf2hub import HttpClient | |
from bf2 import fake_stream | |
import bf2hublib | |
wantsRanks = 0 | |
def canAwardRanks(): | |
try: | |
if bf2hublib.glsGetFlags() & 1: | |
return True | |
except: | |
pass | |
return False | |
def canAwardMedals(): | |
try: | |
if bf2hublib.glsGetFlags() & 16: | |
return True | |
except: | |
pass | |
return False | |
def canDisplayPromotions(): | |
try: | |
if bf2hublib.glsGetFlags() & 2: | |
return True | |
except: | |
pass | |
return False | |
def canDisplayMedals(): | |
try: | |
if bf2hublib.glsGetFlags() & 32: | |
return True | |
except: | |
pass | |
return False | |
def canSkipEmpty(): | |
try: | |
if bf2hublib.glsGetFlags() & 256: | |
return True | |
except: | |
pass | |
return False | |
def readConfigFile(filename): | |
global wantsRanks | |
try: | |
f = open(filename, 'r') | |
print '(BF2Hub) Parsing %s ...' % filename | |
for line in f: | |
line = line.strip() | |
if line.startswith('#'): | |
continue | |
if line.startswith('ranked '): | |
arg = line[7:] | |
if arg in ['0', '1']: | |
wantsRanks = int(arg) | |
f.close() | |
except: | |
pass | |
def authenticateGameProvider(): | |
auth = bf2hublib.gpaGetString() | |
resp = '' | |
try: | |
client = HttpClient.HttpClient() | |
client.connect(bf2hublib.netaddr(3), 80, 10) | |
resp = client.requestGet(bf2hublib.glsGetHostname(3), bf2hublib.glsGetDocument(3) + '?auth=' + auth) | |
except Exception, e: | |
print 'Exception:', e | |
if not resp.startswith('O\n'): | |
return False | |
return bf2hublib.gpaProcessResponse(resp[2:]) | |
def init(): | |
readConfigFile('python/bf2/bf2hub/bf2hub-provider-default.con') | |
modDir = host.sgl_getModDirectory() | |
if modDir.startswith('mods/'): | |
readConfigFile(modDir + '/settings/bf2hub.con') | |
readConfigFile('python/bf2/bf2hub/bf2hub-provider-final.con') | |
if wantsRanks and host.ss_getParam('globUnlocks'): | |
bf2hublib.gpaInit() | |
return authenticateGameProvider() | |
return False | |
def sendSnapshot(data): | |
try: | |
bf2hublib.glsSendSnapshot(data) | |
except Exception, e: | |
print 'Exception:', e | |
def log(s): | |
try: | |
bf2hublib.log(s) | |
print '(BF2Hub) ', s | |
except Exception, e: | |
print 'Exception:', e | |
def init_module(): | |
if init() is not True: | |
return org_init_module() | |
sys.stdout = fake_stream('stdout') | |
sys.stderr = fake_stream('stderr') | |
import game.scoringCommon | |
game.scoringCommon.init() | |
try: | |
import bf2.bf2hub.stats.stats | |
except ImportError: | |
print 'Official stats module not found.' | |
else: | |
bf2.bf2hub.stats.stats.init() | |
try: | |
import bf2.bf2hub.stats.endofround | |
except ImportError: | |
print 'Endofround module not found.' | |
else: | |
bf2.bf2hub.stats.endofround.init() | |
if not bf2.gameLogic.isAIGame(): | |
try: | |
import bf2.bf2hub.stats.snapshot | |
except ImportError: | |
print 'Snapshot module not found.' | |
raise | |
else: | |
bf2.bf2hub.stats.snapshot.init() | |
try: | |
import bf2.bf2hub.stats.rank | |
except ImportError: | |
print 'Rank awarding module not found.' | |
else: | |
bf2.bf2hub.stats.rank.init() | |
try: | |
import bf2.bf2hub.stats.medals | |
except ImportError: | |
print 'Medal awarding module not found.' | |
else: | |
bf2.bf2hub.stats.medals.init() | |
try: | |
import bf2.bf2hub.stats.unlocks | |
except ImportError: | |
print 'Unlock awarding module not found.' | |
else: | |
bf2.bf2hub.stats.unlocks.init() | |
try: | |
import bf2.bf2hub.development | |
except: | |
pass | |
org_init_module = bf2.init_module | |
bf2.init_module = init_module |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/HttpClient.py | |
# Compiled at: 2014-09-03 19:41:22 | |
import socket, string | |
from urlparse import urlparse | |
class HttpClient: | |
__module__ = __name__ | |
def __init__(self): | |
return | |
def connect(self, host=None, port=80, timeout=15): | |
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
self.sock.settimeout(timeout) | |
try: | |
self.sock.connect((host, port)) | |
self.file = self.sock.makefile('rb') | |
except socket.error, e: | |
raise Exception('HttpClient - socket error (' + str(e) + ')') | |
def writeLine(self, line): | |
try: | |
self.sock.sendall(line + '\r\n') | |
except socket.error: | |
self.close() | |
return | |
except socket.timeout: | |
self.close() | |
return | |
def readLine(self): | |
s = self.file.readline() | |
if not s: | |
return | |
if s[-2:] == '\r\n': | |
s = s[:-2] | |
elif s[-1:] in '\r\n': | |
s = s[:-1] | |
return s | |
def read(self, lenbytes=None): | |
if lenbytes is None: | |
return self.file.read() | |
else: | |
return self.file.read(lenbytes) | |
return | |
def shutdown(self): | |
if self.sock: | |
self.sock.shutdown(1) | |
def close(self): | |
if self.sock: | |
self.sock.close() | |
self.sock = None | |
return | |
def requestGet(self, host, doc): | |
self.writeLine('GET %s HTTP/1.1' % str(doc)) | |
self.writeLine('Host: %s' % str(host)) | |
self.writeLine('User-Agent: BF2HubHTTP/1.0') | |
self.writeLine('Connection: close') | |
self.writeLine('') | |
self.shutdown() | |
status = string.split(self.readLine()) | |
if not 'HTTP/1.0' in status[0] and not 'HTTP/1.1' in status[0]: | |
raise Exception('HttpClient - unknown server protocol: ' + str(status[0])) | |
status = int(status[1]) | |
if status != 200: | |
raise Exception('HttpClient - invalid status code: ' + str(status)) | |
headers = [] | |
while 1: | |
line = self.readLine() | |
if not line: | |
break | |
headers.append(line) | |
resp = self.read() | |
self.close() | |
return resp | |
def requestPost(self, host, doc, data=None, mimetype='application/x-www-form-urlencoded'): | |
self.writeLine('POST %s HTTP/1.1' % str(doc)) | |
self.writeLine('Host: %s' % host) | |
self.writeLine('User-Agent: BF2HubHTTP/1.0') | |
self.writeLine('Content-Type: ' + str(mimetype)) | |
self.writeLine('Content-Length: %s' % str(len(str(data)))) | |
self.writeLine('Connection: close') | |
self.writeLine('') | |
self.writeLine(str(data)) | |
self.writeLine('') | |
self.shutdown() | |
status = string.split(self.readLine()) | |
if not 'HTTP/1.0' in status[0] and not 'HTTP/1.1' in status[0]: | |
raise Exception('HttpClient - unknown server protocol: ' + str(status[0])) | |
status = int(status[1]) | |
if status != 200: | |
raise Exception('HttpClient - invalid status code: ' + str(status)) | |
headers = [] | |
while 1: | |
line = self.readLine() | |
if not line: | |
break | |
headers.append(line) | |
resp = self.read() | |
self.close() | |
return resp |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/__init__.py | |
# Compiled at: 2009-01-16 13:08:08 | |
pass |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/constants.py | |
# Compiled at: 2014-09-17 01:38:34 | |
import host, string | |
from bf2 import g_debug | |
VEHICLE_TYPE_ARMOR = 0 | |
VEHICLE_TYPE_AVIATOR = 1 | |
VEHICLE_TYPE_AIRDEFENSE = 2 | |
VEHICLE_TYPE_HELICOPTER = 3 | |
VEHICLE_TYPE_TRANSPORT = 4 | |
VEHICLE_TYPE_ARTILLERY = 5 | |
VEHICLE_TYPE_GRNDDEFENSE = 6 | |
VEHICLE_TYPE_PARACHUTE = 7 | |
VEHICLE_TYPE_SOLDIER = 8 | |
VEHICLE_TYPE_NIGHTVISION = 9 | |
VEHICLE_TYPE_GASMASK = 10 | |
NUM_VEHICLE_TYPES = 11 | |
VEHICLE_TYPE_UNKNOWN = NUM_VEHICLE_TYPES | |
WEAPON_TYPE_ASSAULT = 0 | |
WEAPON_TYPE_ASSAULTGRN = 1 | |
WEAPON_TYPE_CARBINE = 2 | |
WEAPON_TYPE_LMG = 3 | |
WEAPON_TYPE_SNIPER = 4 | |
WEAPON_TYPE_PISTOL = 5 | |
WEAPON_TYPE_ATAA = 6 | |
WEAPON_TYPE_SMG = 7 | |
WEAPON_TYPE_SHOTGUN = 8 | |
WEAPON_TYPE_KNIFE = 10 | |
WEAPON_TYPE_C4 = 11 | |
WEAPON_TYPE_CLAYMORE = 12 | |
WEAPON_TYPE_HANDGRENADE = 13 | |
WEAPON_TYPE_SHOCKPAD = 14 | |
WEAPON_TYPE_ATMINE = 15 | |
WEAPON_TYPE_TARGETING = 16 | |
WEAPON_TYPE_GRAPPLINGHOOK = 17 | |
WEAPON_TYPE_ZIPLINE = 18 | |
WEAPON_TYPE_TACTICAL = 19 | |
NUM_WEAPON_TYPES = 20 | |
WEAPON_TYPE_UNKNOWN = NUM_WEAPON_TYPES | |
KIT_TYPE_AT = 0 | |
KIT_TYPE_ASSAULT = 1 | |
KIT_TYPE_ENGINEER = 2 | |
KIT_TYPE_MEDIC = 3 | |
KIT_TYPE_SPECOPS = 4 | |
KIT_TYPE_SUPPORT = 5 | |
KIT_TYPE_SNIPER = 6 | |
NUM_KIT_TYPES = 7 | |
KIT_TYPE_UNKNOWN = NUM_KIT_TYPES | |
ARMY_USA = 0 | |
ARMY_MEC = 1 | |
ARMY_CHINESE = 2 | |
ARMY_SEALS = 3 | |
ARMY_SAS = 4 | |
ARMY_SPETZNAS = 5 | |
ARMY_MECSF = 6 | |
ARMY_REBELS = 7 | |
ARMY_INSURGENTS = 8 | |
ARMY_EURO = 9 | |
NUM_ARMIES = 10 | |
ARMY_UNKNOWN = NUM_ARMIES | |
vehicleTypeMap = {'usapc_lav25': VEHICLE_TYPE_ARMOR, 'apc_btr90': VEHICLE_TYPE_ARMOR, 'apc_wz551': VEHICLE_TYPE_ARMOR, 'ustnk_m1a2': VEHICLE_TYPE_ARMOR, 'rutnk_t90': VEHICLE_TYPE_ARMOR, 'tnk_type98': VEHICLE_TYPE_ARMOR, 'usair_f18': VEHICLE_TYPE_AVIATOR, 'ruair_mig29': VEHICLE_TYPE_AVIATOR, 'air_j10': VEHICLE_TYPE_AVIATOR, 'usair_f15': VEHICLE_TYPE_AVIATOR, 'ruair_su34': VEHICLE_TYPE_AVIATOR, 'air_su30mkk': VEHICLE_TYPE_AVIATOR, 'air_f35b': VEHICLE_TYPE_AVIATOR, 'usaav_m6': VEHICLE_TYPE_AIRDEFENSE, 'aav_tunguska': VEHICLE_TYPE_AIRDEFENSE, 'aav_type95': VEHICLE_TYPE_AIRDEFENSE, 'usaas_stinger': VEHICLE_TYPE_AIRDEFENSE, 'igla_djigit': VEHICLE_TYPE_AIRDEFENSE, 'wasp_defence_front': VEHICLE_TYPE_AIRDEFENSE, 'wasp_defence_back': VEHICLE_TYPE_AIRDEFENSE, 'usthe_uh60': VEHICLE_TYPE_HELICOPTER, 'the_mi17': VEHICLE_TYPE_HELICOPTER, 'chthe_z8': VEHICLE_TYPE_HELICOPTER, 'ahe_ah1z': VEHICLE_TYPE_HELICOPTER, 'ahe_havoc': VEHICLE_TYPE_HELICOPTER, 'ahe_z10': VEHICLE_TYPE_HELICOPTER, 'jeep_faav': VEHICLE_TYPE_TRANSPORT, 'usjep_hmmwv': VEHICLE_TYPE_TRANSPORT, 'jep_paratrooper': VEHICLE_TYPE_TRANSPORT, 'jep_mec_paratrooper': VEHICLE_TYPE_TRANSPORT, 'jep_vodnik': VEHICLE_TYPE_TRANSPORT, 'jep_nanjing': VEHICLE_TYPE_TRANSPORT, 'uslcr_lcac': VEHICLE_TYPE_TRANSPORT, 'boat_rib': VEHICLE_TYPE_TRANSPORT, 'usart_lw155': VEHICLE_TYPE_ARTILLERY, 'ars_d30': VEHICLE_TYPE_ARTILLERY, 'ats_tow': VEHICLE_TYPE_GRNDDEFENSE, 'ats_hj8': VEHICLE_TYPE_GRNDDEFENSE, 'hmg_m2hb': VEHICLE_TYPE_GRNDDEFENSE, 'chhmg_kord': VEHICLE_TYPE_GRNDDEFENSE, 'mec_bipod': VEHICLE_TYPE_GRNDDEFENSE, 'us_bipod': VEHICLE_TYPE_GRNDDEFENSE, 'ch_bipod': VEHICLE_TYPE_GRNDDEFENSE, 'us_soldier': VEHICLE_TYPE_SOLDIER, 'us_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'us_light_soldier': VEHICLE_TYPE_SOLDIER, 'mec_soldier': VEHICLE_TYPE_SOLDIER, 'mec_light_soldier': VEHICLE_TYPE_SOLDIER, 'mec_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'ch_soldier': VEHICLE_TYPE_SOLDIER, 'ch_light_soldier': VEHICLE_TYPE_SOLDIER, 'ch_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'parachute': VEHICLE_TYPE_PARACHUTE, 'seal_soldier': VEHICLE_TYPE_SOLDIER, 'seal_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'sas_soldier': VEHICLE_TYPE_SOLDIER, 'sas_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'spetz_soldier': VEHICLE_TYPE_SOLDIER, 'spetz_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'mecsf_soldier': VEHICLE_TYPE_SOLDIER, 'mecsf_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'chinsurgent_soldier': VEHICLE_TYPE_SOLDIER, 'chinsurgent_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'meinsurgent_soldier': VEHICLE_TYPE_SOLDIER, 'meinsurgent_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'xpak_bmp3': VEHICLE_TYPE_ARMOR, 'xpak_forklift': VEHICLE_TYPE_TRANSPORT, 'xpak_atv': VEHICLE_TYPE_TRANSPORT, 'xpak_civ1': VEHICLE_TYPE_TRANSPORT, 'xpak_civ2': VEHICLE_TYPE_TRANSPORT, 'xpak_jetski': VEHICLE_TYPE_TRANSPORT, 'xpak_ailraider': VEHICLE_TYPE_TRANSPORT, 'xpak_apache': VEHICLE_TYPE_HELICOPTER, 'xpak_hind': VEHICLE_TYPE_HELICOPTER, 'xpak_hummertow': VEHICLE_TYPE_TRANSPORT, 'xpak2_vbl': VEHICLE_TYPE_TRANSPORT, 'xpak2_tnkl2a6': VEHICLE_TYPE_ARMOR, 'xpak2_tnkc2': VEHICLE_TYPE_ARMOR, 'xpak2_tiger': VEHICLE_TYPE_HELICOPTER, 'xpak2_lynx': VEHICLE_TYPE_HELICOPTER, 'xpak2_eurofighter': VEHICLE_TYPE_AVIATOR, 'xpak2_harrier': VEHICLE_TYPE_AVIATOR, 'eu_soldier': VEHICLE_TYPE_SOLDIER, 'eu_heavy_soldier': VEHICLE_TYPE_SOLDIER, 'air_a10': VEHICLE_TYPE_AVIATOR, 'air_su39': VEHICLE_TYPE_AVIATOR, 'xpak2_fantan': VEHICLE_TYPE_AVIATOR, 'che_wz11': VEHICLE_TYPE_HELICOPTER, 'she_ec635': VEHICLE_TYPE_HELICOPTER, 'she_littlebird': VEHICLE_TYPE_HELICOPTER, 'xpak2_musclecar': VEHICLE_TYPE_TRANSPORT, 'xpak2_semi': VEHICLE_TYPE_TRANSPORT} | |
weaponTypeMap = {'usrif_m16a2': WEAPON_TYPE_ASSAULT, 'rurif_ak101': WEAPON_TYPE_ASSAULT, 'rurif_ak47': WEAPON_TYPE_ASSAULT, 'usrif_sa80': WEAPON_TYPE_ASSAULT, 'usrif_g3a3': WEAPON_TYPE_ASSAULT, 'usrif_m203': WEAPON_TYPE_ASSAULT, 'rurif_gp30': WEAPON_TYPE_ASSAULT, 'rurif_gp25': WEAPON_TYPE_ASSAULT, 'usrgl_m203': WEAPON_TYPE_ASSAULTGRN, 'rurgl_gp30': WEAPON_TYPE_ASSAULTGRN, 'rurgl_gp25': WEAPON_TYPE_ASSAULTGRN, 'rurrif_ak74u': WEAPON_TYPE_CARBINE, 'usrif_m4': WEAPON_TYPE_CARBINE, 'rurif_ak74u': WEAPON_TYPE_CARBINE, 'chrif_type95': WEAPON_TYPE_CARBINE, 'usrif_g36c': WEAPON_TYPE_CARBINE, 'uslmg_m249saw': WEAPON_TYPE_LMG, 'rulmg_rpk74': WEAPON_TYPE_LMG, 'chlmg_type95': WEAPON_TYPE_LMG, 'rulmg_pkm': WEAPON_TYPE_LMG, 'usrif_m24': WEAPON_TYPE_SNIPER, 'rurif_dragunov': WEAPON_TYPE_SNIPER, 'chsni_type88': WEAPON_TYPE_SNIPER, 'ussni_m82a1': WEAPON_TYPE_SNIPER, 'ussni_m95_barret': WEAPON_TYPE_SNIPER, 'uspis_92fs': WEAPON_TYPE_PISTOL, 'uspis_92fs_silencer': WEAPON_TYPE_PISTOL, 'rupis_baghira': WEAPON_TYPE_PISTOL, 'rupis_baghira_silencer': WEAPON_TYPE_PISTOL, 'chpis_qsz92': WEAPON_TYPE_PISTOL, 'chpis_qsz92_silencer': WEAPON_TYPE_PISTOL, 'usatp_predator': WEAPON_TYPE_ATAA, 'chat_eryx': WEAPON_TYPE_ATAA, 'usrif_mp5_a3': WEAPON_TYPE_SMG, 'rurif_bizon': WEAPON_TYPE_SMG, 'chrif_type85': WEAPON_TYPE_SMG, 'usrif_remington11-87': WEAPON_TYPE_SHOTGUN, 'rusht_saiga12': WEAPON_TYPE_SHOTGUN, 'chsht_norinco982': WEAPON_TYPE_SHOTGUN, 'chsht_protecta': WEAPON_TYPE_SHOTGUN, 'ussht_jackhammer': WEAPON_TYPE_SHOTGUN, 'kni_knife': WEAPON_TYPE_KNIFE, 'c4_explosives': WEAPON_TYPE_C4, 'ushgr_m67': WEAPON_TYPE_HANDGRENADE, 'usmin_claymore': WEAPON_TYPE_CLAYMORE, 'defibrillator': WEAPON_TYPE_SHOCKPAD, 'at_mine': WEAPON_TYPE_ATMINE, 'simrad': WEAPON_TYPE_TARGETING, 'nshgr_flashbang': WEAPON_TYPE_TACTICAL, 'sasrif_teargas': WEAPON_TYPE_TACTICAL, 'insgr_rpg': WEAPON_TYPE_ATAA, 'nsrif_crossbow': WEAPON_TYPE_ZIPLINE, 'rurif_oc14': WEAPON_TYPE_ASSAULT, 'sasrif_fn2000': WEAPON_TYPE_ASSAULT, 'sasgr_fn2000': WEAPON_TYPE_ASSAULTGRN, 'sasrif_g36e': WEAPON_TYPE_ASSAULT, 'sasrif_g36k': WEAPON_TYPE_ASSAULT, 'sasrif_mg36': WEAPON_TYPE_LMG, 'sasrif_mp7': WEAPON_TYPE_SMG, 'spzrif_aps': WEAPON_TYPE_ASSAULT, 'usrif_fnscarh': WEAPON_TYPE_ASSAULT, 'usrif_fnscarl': WEAPON_TYPE_CARBINE, 'insgr_rpg': WEAPON_TYPE_ATAA, 'rurif_oc14': WEAPON_TYPE_ASSAULT, 'sasrif_fn2000': WEAPON_TYPE_ASSAULT, 'sasgr_fn2000': WEAPON_TYPE_ASSAULTGRN, 'sasrif_g36e': WEAPON_TYPE_ASSAULT, 'sasrif_g36k': WEAPON_TYPE_ASSAULT, 'sasrif_mg36': WEAPON_TYPE_LMG, 'sasrif_mp7': WEAPON_TYPE_SMG, 'spzrif_aps': WEAPON_TYPE_ASSAULT, 'usrif_fnscarh': WEAPON_TYPE_ASSAULT, 'usrif_fnscarl': WEAPON_TYPE_CARBINE, 'eurif_fnp90': WEAPON_TYPE_SMG, 'eurif_hk53a3': WEAPON_TYPE_CARBINE, 'gbrif_benelli_m4': WEAPON_TYPE_SHOTGUN, 'gbrif_l96a1': WEAPON_TYPE_SNIPER, 'eurif_famas': WEAPON_TYPE_ASSAULT, 'gbrif_sa80a2_l85': WEAPON_TYPE_ASSAULT, 'gbgr_sa80a2_l85': WEAPON_TYPE_ASSAULTGRN, 'gbrif_hk21': WEAPON_TYPE_LMG} | |
kitTypeMap = {'us_at': KIT_TYPE_AT, 'us_assault': KIT_TYPE_ASSAULT, 'us_engineer': KIT_TYPE_ENGINEER, 'us_medic': KIT_TYPE_MEDIC, 'us_specops': KIT_TYPE_SPECOPS, 'us_support': KIT_TYPE_SUPPORT, 'us_sniper': KIT_TYPE_SNIPER, 'mec_at': KIT_TYPE_AT, 'mec_assault': KIT_TYPE_ASSAULT, 'mec_engineer': KIT_TYPE_ENGINEER, 'mec_medic': KIT_TYPE_MEDIC, 'mec_specops': KIT_TYPE_SPECOPS, 'mec_support': KIT_TYPE_SUPPORT, 'mec_sniper': KIT_TYPE_SNIPER, 'ch_at': KIT_TYPE_AT, 'ch_assault': KIT_TYPE_ASSAULT, 'ch_engineer': KIT_TYPE_ENGINEER, 'ch_medic': KIT_TYPE_MEDIC, 'ch_specops': KIT_TYPE_SPECOPS, 'ch_support': KIT_TYPE_SUPPORT, 'ch_sniper': KIT_TYPE_SNIPER, 'seal_at': KIT_TYPE_AT, 'seal_assault': KIT_TYPE_ASSAULT, 'seal_engineer': KIT_TYPE_ENGINEER, 'seal_medic': KIT_TYPE_MEDIC, 'seal_specops': KIT_TYPE_SPECOPS, 'seal_support': KIT_TYPE_SUPPORT, 'seal_sniper': KIT_TYPE_SNIPER, 'sas_at': KIT_TYPE_AT, 'sas_assault': KIT_TYPE_ASSAULT, 'sas_engineer': KIT_TYPE_ENGINEER, 'sas_medic': KIT_TYPE_MEDIC, 'sas_specops': KIT_TYPE_SPECOPS, 'sas_support': KIT_TYPE_SUPPORT, 'sas_sniper': KIT_TYPE_SNIPER, 'spetsnaz_at': KIT_TYPE_AT, 'spetsnaz_assault': KIT_TYPE_ASSAULT, 'spetsnaz_engineer': KIT_TYPE_ENGINEER, 'spetsnaz_medic': KIT_TYPE_MEDIC, 'spetsnaz_specops': KIT_TYPE_SPECOPS, 'spetsnaz_support': KIT_TYPE_SUPPORT, 'spetsnaz_sniper': KIT_TYPE_SNIPER, 'mecsf_at': KIT_TYPE_AT, 'mecsf_assault': KIT_TYPE_ASSAULT, 'mecsf_engineer': KIT_TYPE_ENGINEER, 'mecsf_medic': KIT_TYPE_MEDIC, 'mecsf_specops': KIT_TYPE_SPECOPS, 'mecsf_support': KIT_TYPE_SUPPORT, 'mecsf_sniper': KIT_TYPE_SNIPER, 'chinsurgent_at': KIT_TYPE_AT, 'chinsurgent_assault': KIT_TYPE_ASSAULT, 'chinsurgent_engineer': KIT_TYPE_ENGINEER, 'chinsurgent_medic': KIT_TYPE_MEDIC, 'chinsurgent_specops': KIT_TYPE_SPECOPS, 'chinsurgent_support': KIT_TYPE_SUPPORT, 'chinsurgent_sniper': KIT_TYPE_SNIPER, 'meinsurgent_at': KIT_TYPE_AT, 'meinsurgent_assault': KIT_TYPE_ASSAULT, 'meinsurgent_engineer': KIT_TYPE_ENGINEER, 'meinsurgent_medic': KIT_TYPE_MEDIC, 'meinsurgent_specops': KIT_TYPE_SPECOPS, 'meinsurgent_support': KIT_TYPE_SUPPORT, 'meinsurgent_sniper': KIT_TYPE_SNIPER, 'mecsf_at_special': KIT_TYPE_AT, 'mecsf_assault_special': KIT_TYPE_ASSAULT, 'mecsf_specops_special': KIT_TYPE_SPECOPS, 'mecsf_sniper_special': KIT_TYPE_SNIPER, 'sas_at_special': KIT_TYPE_AT, 'sas_assault_special': KIT_TYPE_ASSAULT, 'sas_specops_special': KIT_TYPE_SPECOPS, 'sas_sniper_special': KIT_TYPE_SNIPER, 'eu_at': KIT_TYPE_AT, 'eu_assault': KIT_TYPE_ASSAULT, 'eu_engineer': KIT_TYPE_ENGINEER, 'eu_medic': KIT_TYPE_MEDIC, 'eu_specops': KIT_TYPE_SPECOPS, 'eu_support': KIT_TYPE_SUPPORT, 'eu_sniper': KIT_TYPE_SNIPER} | |
armyMap = {'us': ARMY_USA, 'mec': ARMY_MEC, 'ch': ARMY_CHINESE, 'seal': ARMY_SEALS, 'sas': ARMY_SAS, 'spetz': ARMY_SPETZNAS, 'mecsf': ARMY_MECSF, 'chinsurgent': ARMY_REBELS, 'meinsurgent': ARMY_INSURGENTS, 'eu': ARMY_EURO} | |
mapMap = {'kubra_dam': '0', 'mashtuur_city': '1', 'operation_clean_sweep': '2', 'zatar_wetlands': '3', 'strike_at_karkand': '4', 'sharqi_peninsula': '5', 'gulf_of_oman': '6', 'operationsmokescreen': '10', 'taraba_quarry': '11', 'road_to_jalalabad': '12', 'daqing_oilfields': '100', 'dalian_plant': '101', 'dragon_valley': '102', 'fushe_pass': '103', 'hingan_hills': '104', 'songhua_stalemate': '105', 'greatwall': '110', 'operation_blue_pearl': '120', 'midnight_sun': '200', 'operationroadrage': '201', 'operationharvest': '202', 'devils_perch': '300', 'iron_gator': '301', 'night_flight': '302', 'warlord': '303', 'leviathan': '304', 'mass_destruction': '305', 'surge': '306', 'ghost_town': '307', 'wake_island_2007': '601', 'highway_tampa': '602'} | |
UNKNOWN_MAP = 99 | |
gameModeMap = {'gpm_cq': 0, 'gpm_sl': 1} | |
UNKNOWN_GAMEMODE = 99 | |
def getVehicleType(templateName): | |
try: | |
vehicleType = vehicleTypeMap[string.lower(templateName)] | |
except KeyError: | |
return VEHICLE_TYPE_UNKNOWN | |
return vehicleType | |
def getWeaponType(templateName): | |
try: | |
weaponType = weaponTypeMap[string.lower(templateName)] | |
except KeyError: | |
return WEAPON_TYPE_UNKNOWN | |
return weaponType | |
def getKitType(templateName): | |
try: | |
kitType = kitTypeMap[string.lower(templateName)] | |
except KeyError: | |
return KIT_TYPE_UNKNOWN | |
return kitType | |
def getArmy(templateName): | |
try: | |
army = armyMap[string.lower(templateName)] | |
except KeyError: | |
return ARMY_UNKNOWN | |
return army | |
def getMapId(mapName): | |
try: | |
mapId = mapMap[string.lower(mapName)] | |
except KeyError: | |
return UNKNOWN_MAP | |
return mapId | |
def getGameModeId(gameMode): | |
try: | |
gameModeId = gameModeMap[string.lower(gameMode)] | |
except KeyError: | |
return UNKNOWN_GAMEMODE | |
return gameModeId | |
def getRootParent(obj): | |
parent = obj.getParent() | |
if parent == None: | |
return obj | |
return getRootParent(parent) | |
return | |
if g_debug: | |
print '(BF2Hub) Stat constants loaded' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/endofround.py | |
# Compiled at: 2014-09-17 02:01:49 | |
import host, bf2.PlayerManager, bf2.GameLogic | |
from constants import * | |
from bf2 import g_debug, GameStatus | |
from stats import getStatsMap | |
def init(): | |
if g_debug: | |
print '(BF2Hub) End of round module initialized.' | |
host.registerGameStatusHandler(onGameStatusChanged) | |
def onGameStatusChanged(status): | |
if g_debug: | |
print 'Status changed to:', status | |
if GameStatus.EndGame == status: | |
for p in bf2.playerManager.getPlayers(): | |
bf2.bf2hub.stats.stats.finalizePlayer(p) | |
invoke() | |
def invoke(): | |
if g_debug: | |
print 'Invoked end-of-round data-send' | |
e = {} | |
statsMap = getStatsMap() | |
for sp in statsMap.itervalues(): | |
for k in range(0, NUM_KIT_TYPES + 1): | |
if k in sp.kits and sp.kits[k].timeInObject > 0: | |
findTop(e, 'sk' + str(k), 'skn' + str(k), sp.kits[k].score, sp.name) | |
for v in range(0, NUM_VEHICLE_TYPES + 1): | |
if v in sp.vehicles and sp.vehicles[v].timeInObject > 0: | |
findTop(e, 'sv' + str(v), 'svn' + str(v), sp.vehicles[v].score, sp.name) | |
findTop(e, 'ts', 'tsn', sp.teamScore, sp.name) | |
findTop(e, 'ss', 'ssn', sp.skillScore, sp.name) | |
findTop(e, 'cpc', 'cpcn', sp.localScore.cpCaptures, sp.name) | |
findTop(e, 'cpa', 'cpan', sp.localScore.cpAssists, sp.name) | |
findTop(e, 'cpd', 'cpdn', sp.localScore.cpDefends, sp.name) | |
findTop(e, 'ka', 'kan', sp.localScore.damageAssists + sp.localScore.targetAssists + sp.localScore.passengerAssists, sp.name) | |
findTop(e, 'he', 'hen', sp.localScore.heals, sp.name) | |
findTop(e, 'rev', 'revn', sp.localScore.revives, sp.name) | |
findTop(e, 'rsp', 'rspn', sp.localScore.ammos, sp.name) | |
findTop(e, 'rep', 'repn', sp.localScore.repairs, sp.name) | |
findTop(e, 'drs', 'drsn', sp.localScore.driverSpecials + sp.localScore.driverAssists, sp.name) | |
if len(statsMap) > 0: | |
sortedPlayers = [] | |
for sp in statsMap.itervalues(): | |
sortedPlayers += [((sp.score, sp.skillScore, -sp.deaths), sp)] | |
sortedPlayers.sort() | |
sortedPlayers.reverse() | |
for i in range(3): | |
if len(sortedPlayers) <= i: | |
break | |
sp = sortedPlayers[i][1] | |
e['np' + str(i)] = sp.name | |
e['tsp' + str(i)] = sp.teamScore | |
e['ssp' + str(i)] = sp.skillScore | |
e['csp' + str(i)] = sp.cmdScore | |
e['bfp' + str(i)] = sp.bulletsFired | |
e['bhp' + str(i)] = sp.bulletsHit | |
for k in range(0, NUM_KIT_TYPES + 1): | |
if sp.kits[k].timeInObject > 0: | |
e['tk' + str(k) + 'p' + str(i)] = int(sp.kits[k].timeInObject) | |
for v in range(0, NUM_VEHICLE_TYPES + 1): | |
if sp.vehicles[v].timeInObject > 0: | |
e['tv' + str(v) + 'p' + str(i)] = int(sp.vehicles[v].timeInObject) | |
keyvals = [] | |
for k in e: | |
keyvals.append(('\\').join((k, str(e[k])))) | |
dataString = '\\' + ('\\').join(keyvals) | |
if g_debug: | |
print dataString | |
host.gl_sendEndOfRoundData(dataString) | |
def findTop(e, vkey, nkey, value, name): | |
if not vkey in e or value > e[vkey]: | |
e[vkey] = value | |
e[nkey] = name |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/medal_data.py | |
# Compiled at: 2014-09-17 01:56:38 | |
from bf2.bf2hub.stats.constants import * | |
from bf2 import g_debug | |
globalKeysNeeded = {} | |
def player_score(player_attr, value=None): | |
if value == None: | |
def _player_score(player): | |
return getattr(player.score, player_attr) | |
else: | |
def _player_score(player): | |
return getattr(player.score, player_attr) >= value | |
return _player_score | |
return | |
def player_stat(player_attr, value): | |
def _player_stat(player): | |
return getattr(player.stats, player_attr) >= value | |
return _player_stat | |
def object_stat(object_type, item_attr, item_type, value=None): | |
if value == None: | |
def _object_stat(player): | |
return getattr(getattr(player.stats, object_type)[item_type], item_attr) | |
else: | |
def _object_stat(player): | |
return getattr(getattr(player.stats, object_type)[item_type], item_attr) >= value | |
return _object_stat | |
return | |
def has_medal(id, level=1): | |
def _has_medal(player): | |
return id in player.medals.roundMedals and player.medals.roundMedals[id] >= level | |
return _has_medal | |
def times_awarded(id, player): | |
if id in player.medals.roundMedals: | |
return player.medals.roundMedals[id] | |
else: | |
return 0 | |
def global_stat_multiple_times(stat_key, value, id): | |
globalKeysNeeded[stat_key] = 1 | |
def _global_stat_multiple_times(player): | |
new_time_value = value * (times_awarded(id, player) + 1) | |
return stat_key in player.medals.globalKeys and player.medals.globalKeys[stat_key] >= new_time_value | |
return _global_stat_multiple_times | |
def global_stat(stat_key, value=None): | |
globalKeysNeeded[stat_key] = 1 | |
if value == None: | |
def _global_stat(player): | |
if stat_key in player.medals.globalKeys: | |
return player.medals.globalKeys[stat_key] | |
else: | |
return 0 | |
else: | |
def _global_stat(player): | |
return stat_key in player.medals.globalKeys and player.medals.globalKeys[stat_key] >= value | |
return _global_stat | |
return | |
def has_rank(rank): | |
def _has_rank(player): | |
return player.score.rank == rank | |
return _has_rank | |
def f_and(*arg_list): | |
def _f_and(player): | |
res = True | |
for f in arg_list: | |
res = res and f(player) | |
return res | |
return _f_and | |
def f_or(*arg_list): | |
def _f_or(player): | |
res = True | |
for f in arg_list: | |
res = res or f(player) | |
return res | |
return _f_or | |
def f_not(f): | |
def _f_not(player): | |
return not f(player) | |
return _f_not | |
def f_plus(a, b, value=None): | |
if value == None: | |
def _f_plus(player): | |
return a(player) + b(player) | |
else: | |
def _f_plus(player): | |
return a(player) + b(player) >= value | |
return _f_plus | |
return | |
def f_div(a, b, value=None): | |
if value == None: | |
def _f_div(player): | |
denominator = b(player) | |
if denominator == 0: | |
return a(player) + 1 | |
else: | |
return a(player) / denominator | |
else: | |
def _f_div(player): | |
denominator = b(player) | |
if denominator == 0: | |
return a(player) + 1 | |
else: | |
return a(player) / denominator >= value | |
return _f_div | |
return | |
medal_data = ( | |
( | |
'1031406_1', 'kcb', 1, object_stat('weapons', 'kills', WEAPON_TYPE_KNIFE, 7)), | |
('1031406_2', 'kcb', 1, | |
f_and(has_medal('1031406_1'), f_plus(global_stat('wkl-9'), object_stat('weapons', 'kills', WEAPON_TYPE_KNIFE), 50))), | |
('1031406_3', 'kcb', 1, | |
f_and(has_medal('1031406_2'), f_plus(global_stat('wkl-9'), object_stat('weapons', 'kills', WEAPON_TYPE_KNIFE), 100))), ('1031619_1', 'pcb', 1, object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL, 5)), | |
('1031619_2', 'pcb', 1, | |
f_and(has_medal('1031619_1'), global_stat('wkl-5', 50), object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL, 7))), | |
('1031619_3', 'pcb', 1, | |
f_and(has_medal('1031619_2'), f_plus(global_stat('wkl-5'), object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL), 500), object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL, 18))), ('1031119_1', 'Acb', 1, object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 5)), | |
('1031119_2', 'Acb', 1, | |
f_and(has_medal('1031119_1'), global_stat('ktm-1', 54000), object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 20))), | |
('1031119_3', 'Acb', 1, | |
f_and(has_medal('1031119_2'), global_stat('ktm-1', 360000), object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 40))), ('1031120_1', 'Atcb', 1, object_stat('kits', 'kills', KIT_TYPE_AT, 10)), | |
('1031120_2', 'Atcb', 1, | |
f_and(has_medal('1031120_1'), global_stat('ktm-0', 54000), object_stat('kits', 'kills', KIT_TYPE_AT, 20))), | |
('1031120_3', 'Atcb', 1, | |
f_and(has_medal('1031120_2'), global_stat('ktm-0', 360000), object_stat('kits', 'kills', KIT_TYPE_AT, 40))), ('1031109_1', 'Sncb', 1, object_stat('kits', 'kills', KIT_TYPE_SNIPER, 10)), | |
('1031109_2', 'Sncb', 1, | |
f_and(has_medal('1031109_1'), global_stat('ktm-6', 54000), object_stat('kits', 'kills', KIT_TYPE_SNIPER, 15))), | |
('1031109_3', 'Sncb', 1, | |
f_and(has_medal('1031109_2'), global_stat('ktm-6', 360000), object_stat('kits', 'kills', KIT_TYPE_SNIPER, 35))), ('1031115_1', 'Socb', 1, object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 5)), | |
('1031115_2', 'Socb', 1, | |
f_and(has_medal('1031115_1'), global_stat('ktm-4', 54000), object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 20))), | |
('1031115_3', 'Socb', 1, | |
f_and(has_medal('1031115_2'), global_stat('ktm-4', 360000), object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 40))), ('1031121_1', 'Sucb', 1, object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 10)), | |
('1031121_2', 'Sucb', 1, | |
f_and(has_medal('1031121_1'), global_stat('ktm-5', 54000), object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 20))), | |
('1031121_3', 'Sucb', 1, | |
f_and(has_medal('1031121_2'), global_stat('ktm-5', 360000), object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 40))), ('1031105_1', 'Ecb', 1, object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 10)), | |
('1031105_2', 'Ecb', 1, | |
f_and(has_medal('1031105_1'), global_stat('ktm-2', 54000), object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 20))), | |
('1031105_3', 'Ecb', 1, | |
f_and(has_medal('1031105_2'), global_stat('ktm-2', 360000), object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 40))), ('1031113_1', 'Mcb', 1, object_stat('kits', 'kills', KIT_TYPE_MEDIC, 10)), | |
('1031113_2', 'Mcb', 1, | |
f_and(has_medal('1031113_1'), global_stat('ktm-3', 54000), object_stat('kits', 'kills', KIT_TYPE_MEDIC, 20))), | |
('1031113_3', 'Mcb', 1, | |
f_and(has_medal('1031113_2'), global_stat('ktm-3', 360000), object_stat('kits', 'kills', KIT_TYPE_MEDIC, 40))), | |
('1032415_1', 'Eob', 1, | |
f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_C4), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_ATMINE), object_stat('weapons', 'kills', WEAPON_TYPE_CLAYMORE)), 5)), | |
('1032415_2', 'Eob', 1, | |
f_and(has_medal('1032415_1'), global_stat('wkl-11', 50), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_C4), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_ATMINE), object_stat('weapons', 'kills', WEAPON_TYPE_CLAYMORE)), 20))), | |
('1032415_3', 'Eob', 1, | |
f_and(has_medal('1032415_2'), global_stat('wkl-11', 300), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_C4), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_ATMINE), object_stat('weapons', 'kills', WEAPON_TYPE_CLAYMORE)), 30))), ('1190601_1', 'Fab', 1, player_score('heals', 5)), | |
('1190601_2', 'Fab', 1, | |
f_and(has_medal('1190601_1'), global_stat('ktm-3', 54000), player_score('heals', 10))), | |
('1190601_3', 'Fab', 1, | |
f_and(has_medal('1190601_2'), global_stat('heal', 750), global_stat('ktm-3', 360000), player_score('heals', 20))), ('1190507_1', 'Eb', 1, player_score('repairs', 5)), | |
('1190507_2', 'Eb', 1, | |
f_and(has_medal('1190507_1'), global_stat('ktm-2', 54000), player_score('repairs', 10))), | |
('1190507_3', 'Eb', 1, | |
f_and(has_medal('1190507_2'), global_stat('rpar', 250), global_stat('ktm-2', 360000), player_score('repairs', 25))), ('1191819_1', 'Rb', 1, player_score('ammos', 5)), | |
('1191819_2', 'Rb', 1, | |
f_and(has_medal('1191819_1'), global_stat('ktm-5', 54000), player_score('ammos', 10))), | |
('1191819_3', 'Rb', 1, | |
f_and(has_medal('1191819_2'), global_stat('rsup', 500), global_stat('ktm-5', 360000), player_score('ammos', 25))), ('1190304_1', 'Cb', 1, player_score('cmdScore', 40)), | |
('1190304_2', 'Cb', 1, | |
f_and(has_medal('1190304_1'), global_stat('cdsc', 1000), player_stat('timeAsCmd', 1500))), | |
('1190304_3', 'Cb', 1, | |
f_and(has_medal('1190304_2'), global_stat('cdsc', 10000), player_stat('timeAsCmd', 1800))), ('1220118_1', 'Ab', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_ARMOR, 600)), | |
('1220118_2', 'Ab', 1, | |
f_and(has_medal('1220118_1'), global_stat('vtm-0', 360000), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 12))), | |
('1220118_3', 'Ab', 1, | |
f_and(has_medal('1220118_2'), global_stat('vtm-0', 1440000), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 24))), ('1222016_1', 'Tb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_TRANSPORT, 600)), | |
('1222016_2', 'Tb', 1, | |
f_and(has_medal('1222016_1'), global_stat('vtm-4', 90000), global_stat('dsab', 200), object_stat('vehicles', 'roadKills', VEHICLE_TYPE_TRANSPORT, 5))), | |
('1222016_3', 'Tb', 1, | |
f_and(has_medal('1222016_2'), global_stat('vtm-4', 270000), global_stat('dsab', 2000), object_stat('vehicles', 'roadKills', VEHICLE_TYPE_TRANSPORT, 11))), ('1220803_1', 'Hb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_HELICOPTER, 900)), | |
('1220803_2', 'Hb', 1, | |
f_and(has_medal('1220803_1'), global_stat('vtm-3', 180000), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 12))), | |
('1220803_3', 'Hb', 1, | |
f_and(has_medal('1220803_2'), global_stat('vtm-3', 540000), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 24))), ('1220122_1', 'Avb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_AVIATOR, 600)), | |
('1220122_2', 'Avb', 1, | |
f_and(has_medal('1220122_1'), global_stat('vtm-1', 180000), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 12))), | |
('1220122_3', 'Avb', 1, | |
f_and(has_medal('1220122_2'), global_stat('vtm-1', 540000), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 24))), ('1220104_1', 'adb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_AIRDEFENSE, 600)), | |
('1220104_2', 'adb', 1, | |
f_and(has_medal('1220104_1'), object_stat('vehicles', 'kills', VEHICLE_TYPE_AIRDEFENSE, 10))), | |
('1220104_3', 'adb', 1, | |
f_and(has_medal('1220104_2'), object_stat('vehicles', 'kills', VEHICLE_TYPE_AIRDEFENSE, 20))), ('1031923_1', 'Swb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_GRNDDEFENSE, 300)), | |
('1031923_2', 'Swb', 1, | |
f_and(has_medal('1031923_1'), object_stat('vehicles', 'kills', VEHICLE_TYPE_GRNDDEFENSE, 10))), | |
('1031923_3', 'Swb', 1, | |
f_and(has_medal('1031923_2'), object_stat('vehicles', 'kills', VEHICLE_TYPE_GRNDDEFENSE, 20))), | |
('3240301', 'Car', 1, | |
f_and(global_stat('bksk', 10), player_score('kills', 18))), | |
('3211305', 'Mur', 1, | |
f_and(player_stat('timeInSquad', 1560), player_score('rplScore', 40))), | |
('3150914', 'Ior', 1, | |
f_and(global_stat('twsc', 250), player_stat('timeAsSql', 1500))), | |
('3151920', 'Sor', 1, | |
f_and(player_stat('timeAsCmd', 1680), player_score('cmdScore', 50))), | |
('3190409', 'Dsr', 1, | |
f_and(global_stat('tsqm', 36000), global_stat('tsql', 36000), global_stat('tcdr', 36000), player_score('rplScore', 15))), | |
('3242303', 'Wcr', 1, | |
f_and(global_stat('tcdr', 360000), global_stat('wins', 200), global_stat('cdsc', 25000))), | |
('3212201', 'Vur', 1, | |
f_and(global_stat('tsqm', 90000), global_stat('tsql', 90000), player_score('rplScore', 45))), | |
('3241213', 'Lmr', 1, | |
f_and(global_stat('time', 720000), global_stat('bksk', 10), global_stat('wdsk', 8), player_score('rplScore', 50))), | |
('3190318', 'Csr', 1, | |
f_and(f_plus(player_score('driverSpecials'), player_score('driverAssists'), 13), player_score('kills', 5))), | |
('3190118', 'Arr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_ARMOR, 1200), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 19))), | |
('3190105', 'Aer', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_AVIATOR, 900), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 19))), | |
('3190803', 'Hsr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_HELICOPTER, 900), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 19))), | |
('3040109', 'Adr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_AIRDEFENSE, 180), object_stat('vehicles', 'kills', VEHICLE_TYPE_AIRDEFENSE, 11))), | |
('3040718', 'Gdr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_GRNDDEFENSE, 180), object_stat('vehicles', 'kills', VEHICLE_TYPE_GRNDDEFENSE, 5))), ('3240102', 'Ar', 1, f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_PARACHUTE, 10))), | |
('3240703', 'gcr', 1, | |
f_and(global_stat('time', 180000), player_score('kills', 14), f_not(f_plus(player_score('TKs'), f_plus(player_score('teamDamages'), player_score('teamVehicleDamages')), 1)))), | |
('2191608', 'ph', 0, | |
f_and(player_score('kills', 5), player_score('deaths', 20), f_div(player_score('deaths'), player_score('kills'), 4))), | |
('2191319', 'Msm', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2191319'), global_stat_multiple_times('heal', 1000, '2191319'), global_stat_multiple_times('rpar', 1000, '2191319'), global_stat_multiple_times('rsup', 1000, '2191319'))), | |
('2190303', 'Cam', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2190303'), global_stat_multiple_times('kill', 25000, '2190303'), global_stat('bksk', 25), player_stat('timePlayed', 1980))), | |
('2190309', 'Acm', 2, | |
f_and(global_stat_multiple_times('vtm-1', 360000, '2190309'), global_stat_multiple_times('vkl-1', 5000, '2190309'), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 25))), | |
('2190318', 'Arm', 2, | |
f_and(global_stat_multiple_times('vtm-0', 360000, '2190318'), global_stat_multiple_times('vkl-0', 5000, '2190318'), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 25))), | |
('2190308', 'Hcm', 2, | |
f_and(global_stat_multiple_times('vtm-3', 360000, '2190308'), global_stat_multiple_times('vkl-3', 5000, '2190308'), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 30))), | |
('2190703', 'gcm', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2190703'), player_score('kills', 27), f_not(f_plus(player_score('TKs'), f_plus(player_score('teamDamages'), player_score('teamVehicleDamages')), 1)))), | |
('2020903', 'Cim', 1, | |
f_and(global_stat('time', 720000), has_medal('1031406_1'), has_medal('1031619_1'), has_medal('1031119_1'), has_medal('1031120_1'), has_medal('1031109_1'), has_medal('1031115_1'), has_medal('1031121_1'), has_medal('1031105_1'), has_medal('1031113_1'))), | |
('2020913', 'Mim', 1, | |
f_and(global_stat('time', 1080000), has_medal('2020903'), has_medal('1031406_2'), has_medal('1031619_2'), has_medal('1031119_2'), has_medal('1031120_2'), has_medal('1031109_2'), has_medal('1031115_2'), has_medal('1031121_2'), has_medal('1031105_2'), has_medal('1031113_2'))), | |
('2020919', 'Sim', 1, | |
f_and(global_stat('time', 1440000), has_medal('2020913'), has_medal('1031406_3'), has_medal('1031619_3'), has_medal('1031119_3'), has_medal('1031120_3'), has_medal('1031109_3'), has_medal('1031115_3'), has_medal('1031121_3'), has_medal('1031105_3'), has_medal('1031113_3'))), | |
('2021322', 'Mvm', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2021322'), global_stat_multiple_times('dsab', 5000, '2021322'), global_stat_multiple_times('dfcp', 1000, '2021322'), global_stat_multiple_times('twsc', 30000, '2021322'))), | |
('2020419', 'Dsm', 2, | |
f_and(global_stat_multiple_times('tcdr', 360000, '2020419'), global_stat_multiple_times('tsql', 360000, '2020419'), global_stat_multiple_times('tsqm', 360000, '2020419'), player_score('rplScore', 45)))) | |
rank_data = ( | |
( | |
1, 'rank', f_plus(global_stat('scor'), player_score('score'), 150)), | |
(2, 'rank', | |
f_and(has_rank(1), f_plus(global_stat('scor'), player_score('score'), 500))), | |
(3, 'rank', | |
f_and(has_rank(2), f_plus(global_stat('scor'), player_score('score'), 800))), | |
(4, 'rank', | |
f_and(has_rank(3), f_plus(global_stat('scor'), player_score('score'), 2500))), | |
(5, 'rank', | |
f_and(has_rank(4), f_plus(global_stat('scor'), player_score('score'), 5000))), | |
(6, 'rank', | |
f_and(has_rank(5), f_plus(global_stat('scor'), player_score('score'), 8000))), | |
(7, 'rank', | |
f_and(has_rank(6), f_plus(global_stat('scor'), player_score('score'), 20000))), | |
(8, 'rank', | |
f_and(has_rank(6), f_plus(global_stat('scor'), player_score('score'), 20000), has_medal('1031406_1'), has_medal('1031619_1'), has_medal('1031119_1'), has_medal('1031120_1'), has_medal('1031109_1'), has_medal('1031115_1'), has_medal('1031121_1'), has_medal('1031105_1'), has_medal('1031113_1'))), | |
(9, 'rank', | |
f_and(f_or(has_rank(7), has_rank(8)), f_plus(global_stat('scor'), player_score('score'), 50000))), | |
(10, 'rank', | |
f_and(f_or(has_rank(7), has_rank(8)), f_plus(global_stat('scor'), player_score('score'), 50000), has_medal('1220118_1'), has_medal('1222016_1'), has_medal('1220803_1'), has_medal('1220122_1'), has_medal('1220104_1'), has_medal('1031923_1'))), | |
(11, 'rank', | |
f_and(f_plus(global_stat('scor'), player_score('score'), 50000), has_medal('6666666'))), | |
(12, 'rank', | |
f_and(f_or(f_or(has_rank(9), has_rank(10)), has_rank(11)), f_plus(global_stat('scor'), player_score('score'), 60000))), | |
(13, 'rank', | |
f_and(has_rank(12), f_plus(global_stat('scor'), player_score('score'), 75000))), | |
(14, 'rank', | |
f_and(has_rank(13), f_plus(global_stat('scor'), player_score('score'), 90000))), | |
(15, 'rank', | |
f_and(has_rank(14), f_plus(global_stat('scor'), player_score('score'), 115000))), | |
(16, 'rank', | |
f_and(has_rank(15), f_plus(global_stat('scor'), player_score('score'), 125000))), | |
(17, 'rank', | |
f_and(has_rank(16), f_plus(global_stat('scor'), player_score('score'), 150000))), | |
(18, 'rank', | |
f_and(has_rank(17), f_plus(global_stat('scor'), player_score('score'), 180000), has_medal('1220118_2'), has_medal('1222016_2'), has_medal('1220803_2'), has_medal('1220122_2'), has_medal('1220104_2'), has_medal('1031923_2'), global_stat('time', 3888000))), | |
(19, 'rank', | |
f_and(has_rank(18), f_plus(global_stat('scor'), player_score('score'), 180000), has_medal('1031406_2'), has_medal('1031619_2'), has_medal('1031119_2'), has_medal('1031120_2'), has_medal('1031109_2'), has_medal('1031115_2'), has_medal('1031121_2'), has_medal('1031105_2'), has_medal('1031113_2'), global_stat('time', 4500000))), | |
(20, 'rank', | |
f_and(has_rank(19), f_plus(global_stat('scor'), player_score('score'), 200000), global_stat('time', 5184000))), | |
(21, 'rank', | |
f_and(has_rank(20), f_plus(global_stat('scor'), player_score('score'), 200000), has_medal('6666666')))) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/medal_data_xpack.py | |
# Compiled at: 2014-09-17 00:59:26 | |
from bf2.bf2hub.stats.constants import * | |
from bf2 import g_debug | |
globalKeysNeeded = {} | |
def player_score(player_attr, value=None): | |
if value == None: | |
def _player_score(player): | |
return getattr(player.score, player_attr) | |
else: | |
def _player_score(player): | |
return getattr(player.score, player_attr) >= value | |
return _player_score | |
return | |
def player_stat(player_attr, value): | |
def _player_stat(player): | |
return getattr(player.stats, player_attr) >= value | |
return _player_stat | |
def object_stat(object_type, item_attr, item_type, value=None): | |
if value == None: | |
def _object_stat(player): | |
return getattr(getattr(player.stats, object_type)[item_type], item_attr) | |
else: | |
def _object_stat(player): | |
return getattr(getattr(player.stats, object_type)[item_type], item_attr) >= value | |
return _object_stat | |
return | |
def has_medal(id, level=1): | |
def _has_medal(player): | |
return id in player.medals.roundMedals and player.medals.roundMedals[id] >= level | |
return _has_medal | |
def times_awarded(id, player): | |
if id in player.medals.roundMedals: | |
return player.medals.roundMedals[id] | |
else: | |
return 0 | |
def global_stat_multiple_times(stat_key, value, id): | |
globalKeysNeeded[stat_key] = 1 | |
def _global_stat_multiple_times(player): | |
new_time_value = value * (times_awarded(id, player) + 1) | |
return stat_key in player.medals.globalKeys and player.medals.globalKeys[stat_key] >= new_time_value | |
return _global_stat_multiple_times | |
def global_stat(stat_key, value=None): | |
globalKeysNeeded[stat_key] = 1 | |
if value == None: | |
def _global_stat(player): | |
if stat_key in player.medals.globalKeys: | |
return player.medals.globalKeys[stat_key] | |
else: | |
return 0 | |
else: | |
def _global_stat(player): | |
return stat_key in player.medals.globalKeys and player.medals.globalKeys[stat_key] >= value | |
return _global_stat | |
return | |
def has_rank(rank): | |
def _has_rank(player): | |
return player.score.rank == rank | |
return _has_rank | |
def f_and(*arg_list): | |
def _f_and(player): | |
res = True | |
for f in arg_list: | |
res = res and f(player) | |
return res | |
return _f_and | |
def f_or(*arg_list): | |
def _f_or(player): | |
res = True | |
for f in arg_list: | |
res = res or f(player) | |
return res | |
return _f_or | |
def f_not(f): | |
def _f_not(player): | |
return not f(player) | |
return _f_not | |
def f_plus(a, b, value=None): | |
if value == None: | |
def _f_plus(player): | |
return a(player) + b(player) | |
else: | |
def _f_plus(player): | |
return a(player) + b(player) >= value | |
return _f_plus | |
return | |
def f_div(a, b, value=None): | |
if value == None: | |
def _f_div(player): | |
denominator = b(player) | |
if denominator == 0: | |
return a(player) + 1 | |
else: | |
return a(player) / denominator | |
else: | |
def _f_div(player): | |
denominator = b(player) | |
if denominator == 0: | |
return a(player) + 1 | |
else: | |
return a(player) / denominator >= value | |
return _f_div | |
return | |
medal_data = ( | |
( | |
'1031406_1', 'kcb', 1, object_stat('weapons', 'kills', WEAPON_TYPE_KNIFE, 7)), | |
('1031406_2', 'kcb', 1, | |
f_and(has_medal('1031406_1'), f_plus(global_stat('wkl-9'), object_stat('weapons', 'kills', WEAPON_TYPE_KNIFE), 50))), | |
('1031406_3', 'kcb', 1, | |
f_and(has_medal('1031406_2'), f_plus(global_stat('wkl-9'), object_stat('weapons', 'kills', WEAPON_TYPE_KNIFE), 100))), ('1031619_1', 'pcb', 1, object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL, 5)), | |
('1031619_2', 'pcb', 1, | |
f_and(has_medal('1031619_1'), global_stat('wkl-5', 50), object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL, 7))), | |
('1031619_3', 'pcb', 1, | |
f_and(has_medal('1031619_2'), f_plus(global_stat('wkl-5'), object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL), 500), object_stat('weapons', 'kills', WEAPON_TYPE_PISTOL, 18))), ('1031119_1', 'Acb', 1, object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 5)), | |
('1031119_2', 'Acb', 1, | |
f_and(has_medal('1031119_1'), global_stat('ktm-1', 54000), object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 20))), | |
('1031119_3', 'Acb', 1, | |
f_and(has_medal('1031119_2'), global_stat('ktm-1', 360000), object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 40))), ('1031120_1', 'Atcb', 1, object_stat('kits', 'kills', KIT_TYPE_AT, 10)), | |
('1031120_2', 'Atcb', 1, | |
f_and(has_medal('1031120_1'), global_stat('ktm-0', 54000), object_stat('kits', 'kills', KIT_TYPE_AT, 20))), | |
('1031120_3', 'Atcb', 1, | |
f_and(has_medal('1031120_2'), global_stat('ktm-0', 360000), object_stat('kits', 'kills', KIT_TYPE_AT, 40))), ('1031109_1', 'Sncb', 1, object_stat('kits', 'kills', KIT_TYPE_SNIPER, 10)), | |
('1031109_2', 'Sncb', 1, | |
f_and(has_medal('1031109_1'), global_stat('ktm-6', 54000), object_stat('kits', 'kills', KIT_TYPE_SNIPER, 15))), | |
('1031109_3', 'Sncb', 1, | |
f_and(has_medal('1031109_2'), global_stat('ktm-6', 360000), object_stat('kits', 'kills', KIT_TYPE_SNIPER, 35))), ('1031115_1', 'Socb', 1, object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 5)), | |
('1031115_2', 'Socb', 1, | |
f_and(has_medal('1031115_1'), global_stat('ktm-4', 54000), object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 20))), | |
('1031115_3', 'Socb', 1, | |
f_and(has_medal('1031115_2'), global_stat('ktm-4', 360000), object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 40))), ('1031121_1', 'Sucb', 1, object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 10)), | |
('1031121_2', 'Sucb', 1, | |
f_and(has_medal('1031121_1'), global_stat('ktm-5', 54000), object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 20))), | |
('1031121_3', 'Sucb', 1, | |
f_and(has_medal('1031121_2'), global_stat('ktm-5', 360000), object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 40))), ('1031105_1', 'Ecb', 1, object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 10)), | |
('1031105_2', 'Ecb', 1, | |
f_and(has_medal('1031105_1'), global_stat('ktm-2', 54000), object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 20))), | |
('1031105_3', 'Ecb', 1, | |
f_and(has_medal('1031105_2'), global_stat('ktm-2', 360000), object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 40))), ('1031113_1', 'Mcb', 1, object_stat('kits', 'kills', KIT_TYPE_MEDIC, 10)), | |
('1031113_2', 'Mcb', 1, | |
f_and(has_medal('1031113_1'), global_stat('ktm-3', 54000), object_stat('kits', 'kills', KIT_TYPE_MEDIC, 20))), | |
('1031113_3', 'Mcb', 1, | |
f_and(has_medal('1031113_2'), global_stat('ktm-3', 360000), object_stat('kits', 'kills', KIT_TYPE_MEDIC, 40))), | |
('1032415_1', 'Eob', 1, | |
f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_C4), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_ATMINE), object_stat('weapons', 'kills', WEAPON_TYPE_CLAYMORE)), 5)), | |
('1032415_2', 'Eob', 1, | |
f_and(has_medal('1032415_1'), global_stat('wkl-11', 50), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_C4), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_ATMINE), object_stat('weapons', 'kills', WEAPON_TYPE_CLAYMORE)), 20))), | |
('1032415_3', 'Eob', 1, | |
f_and(has_medal('1032415_2'), global_stat('wkl-11', 300), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_C4), f_plus(object_stat('weapons', 'kills', WEAPON_TYPE_ATMINE), object_stat('weapons', 'kills', WEAPON_TYPE_CLAYMORE)), 30))), ('1190601_1', 'Fab', 1, player_score('heals', 5)), | |
('1190601_2', 'Fab', 1, | |
f_and(has_medal('1190601_1'), global_stat('ktm-3', 54000), player_score('heals', 10))), | |
('1190601_3', 'Fab', 1, | |
f_and(has_medal('1190601_2'), global_stat('heal', 750), global_stat('ktm-3', 360000), player_score('heals', 20))), ('1190507_1', 'Eb', 1, player_score('repairs', 5)), | |
('1190507_2', 'Eb', 1, | |
f_and(has_medal('1190507_1'), global_stat('ktm-2', 54000), player_score('repairs', 10))), | |
('1190507_3', 'Eb', 1, | |
f_and(has_medal('1190507_2'), global_stat('rpar', 250), global_stat('ktm-2', 360000), player_score('repairs', 25))), ('1191819_1', 'Rb', 1, player_score('ammos', 5)), | |
('1191819_2', 'Rb', 1, | |
f_and(has_medal('1191819_1'), global_stat('ktm-5', 54000), player_score('ammos', 10))), | |
('1191819_3', 'Rb', 1, | |
f_and(has_medal('1191819_2'), global_stat('rsup', 500), global_stat('ktm-5', 360000), player_score('ammos', 25))), ('1190304_1', 'Cb', 1, player_score('cmdScore', 40)), | |
('1190304_2', 'Cb', 1, | |
f_and(has_medal('1190304_1'), global_stat('cdsc', 1000), player_stat('timeAsCmd', 1500))), | |
('1190304_3', 'Cb', 1, | |
f_and(has_medal('1190304_2'), global_stat('cdsc', 10000), player_stat('timeAsCmd', 1800))), ('1220118_1', 'Ab', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_ARMOR, 600)), | |
('1220118_2', 'Ab', 1, | |
f_and(has_medal('1220118_1'), global_stat('vtm-0', 360000), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 12))), | |
('1220118_3', 'Ab', 1, | |
f_and(has_medal('1220118_2'), global_stat('vtm-0', 1440000), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 24))), ('1222016_1', 'Tb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_TRANSPORT, 600)), | |
('1222016_2', 'Tb', 1, | |
f_and(has_medal('1222016_1'), global_stat('vtm-4', 90000), global_stat('dsab', 200), object_stat('vehicles', 'roadKills', VEHICLE_TYPE_TRANSPORT, 5))), | |
('1222016_3', 'Tb', 1, | |
f_and(has_medal('1222016_2'), global_stat('vtm-4', 270000), global_stat('dsab', 2000), object_stat('vehicles', 'roadKills', VEHICLE_TYPE_TRANSPORT, 11))), ('1220803_1', 'Hb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_HELICOPTER, 900)), | |
('1220803_2', 'Hb', 1, | |
f_and(has_medal('1220803_1'), global_stat('vtm-3', 180000), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 12))), | |
('1220803_3', 'Hb', 1, | |
f_and(has_medal('1220803_2'), global_stat('vtm-3', 540000), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 24))), ('1220122_1', 'Avb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_AVIATOR, 600)), | |
('1220122_2', 'Avb', 1, | |
f_and(has_medal('1220122_1'), global_stat('vtm-1', 180000), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 12))), | |
('1220122_3', 'Avb', 1, | |
f_and(has_medal('1220122_2'), global_stat('vtm-1', 540000), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 24))), ('1220104_1', 'adb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_AIRDEFENSE, 600)), | |
('1220104_2', 'adb', 1, | |
f_and(has_medal('1220104_1'), object_stat('vehicles', 'kills', VEHICLE_TYPE_AIRDEFENSE, 10))), | |
('1220104_3', 'adb', 1, | |
f_and(has_medal('1220104_2'), object_stat('vehicles', 'kills', VEHICLE_TYPE_AIRDEFENSE, 20))), ('1031923_1', 'Swb', 1, object_stat('vehicles', 'rtime', VEHICLE_TYPE_GRNDDEFENSE, 300)), | |
('1031923_2', 'Swb', 1, | |
f_and(has_medal('1031923_1'), object_stat('vehicles', 'kills', VEHICLE_TYPE_GRNDDEFENSE, 10))), | |
('1031923_3', 'Swb', 1, | |
f_and(has_medal('1031923_2'), object_stat('vehicles', 'kills', VEHICLE_TYPE_GRNDDEFENSE, 20))), | |
('3240301', 'Car', 1, | |
f_and(global_stat('bksk', 10), player_score('kills', 18))), | |
('3211305', 'Mur', 1, | |
f_and(player_stat('timeInSquad', 1560), player_score('rplScore', 40))), | |
('3150914', 'Ior', 1, | |
f_and(global_stat('twsc', 250), player_stat('timeAsSql', 1500))), | |
('3151920', 'Sor', 1, | |
f_and(player_stat('timeAsCmd', 1680), player_score('cmdScore', 50))), | |
('3190409', 'Dsr', 1, | |
f_and(global_stat('tsqm', 36000), global_stat('tsql', 36000), global_stat('tcdr', 36000), player_score('rplScore', 15))), | |
('3242303', 'Wcr', 1, | |
f_and(global_stat('tcdr', 360000), global_stat('wins', 200), global_stat('cdsc', 25000))), | |
('3212201', 'Vur', 1, | |
f_and(global_stat('tsqm', 90000), global_stat('tsql', 90000), player_score('rplScore', 45))), | |
('3241213', 'Lmr', 1, | |
f_and(global_stat('time', 720000), global_stat('bksk', 10), global_stat('wdsk', 8), player_score('rplScore', 50))), | |
('3190318', 'Csr', 1, | |
f_and(f_plus(player_score('driverSpecials'), player_score('driverAssists'), 13), player_score('kills', 5))), | |
('3190118', 'Arr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_ARMOR, 1200), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 19))), | |
('3190105', 'Aer', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_AVIATOR, 900), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 19))), | |
('3190803', 'Hsr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_HELICOPTER, 900), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 19))), | |
('3040109', 'Adr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_AIRDEFENSE, 180), object_stat('vehicles', 'kills', VEHICLE_TYPE_AIRDEFENSE, 11))), | |
('3040718', 'Gdr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_GRNDDEFENSE, 180), object_stat('vehicles', 'kills', VEHICLE_TYPE_GRNDDEFENSE, 5))), ('3240102', 'Ar', 1, f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_PARACHUTE, 10))), | |
('3240703', 'gcr', 1, | |
f_and(global_stat('time', 180000), player_score('kills', 14), f_not(f_plus(player_score('TKs'), f_plus(player_score('teamDamages'), player_score('teamVehicleDamages')), 1)))), | |
('2191608', 'ph', 0, | |
f_and(player_score('kills', 5), player_score('deaths', 20), f_div(player_score('deaths'), player_score('kills'), 4))), | |
('2191319', 'Msm', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2191319'), global_stat_multiple_times('heal', 1000, '2191319'), global_stat_multiple_times('rpar', 1000, '2191319'), global_stat_multiple_times('rsup', 1000, '2191319'))), | |
('2190303', 'Cam', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2190303'), global_stat_multiple_times('kill', 25000, '2190303'), global_stat('bksk', 25), player_stat('timePlayed', 1980))), | |
('2190309', 'Acm', 2, | |
f_and(global_stat_multiple_times('vtm-1', 360000, '2190309'), global_stat_multiple_times('vkl-1', 5000, '2190309'), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 25))), | |
('2190318', 'Arm', 2, | |
f_and(global_stat_multiple_times('vtm-0', 360000, '2190318'), global_stat_multiple_times('vkl-0', 5000, '2190318'), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 25))), | |
('2190308', 'Hcm', 2, | |
f_and(global_stat_multiple_times('vtm-3', 360000, '2190308'), global_stat_multiple_times('vkl-3', 5000, '2190308'), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 30))), | |
('2190703', 'gcm', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2190703'), player_score('kills', 27), f_not(f_plus(player_score('TKs'), f_plus(player_score('teamDamages'), player_score('teamVehicleDamages')), 1)))), | |
('2020903', 'Cim', 1, | |
f_and(global_stat('time', 720000), has_medal('1031406_1'), has_medal('1031619_1'), has_medal('1031119_1'), has_medal('1031120_1'), has_medal('1031109_1'), has_medal('1031115_1'), has_medal('1031121_1'), has_medal('1031105_1'), has_medal('1031113_1'))), | |
('2020913', 'Mim', 1, | |
f_and(global_stat('time', 1080000), has_medal('2020903'), has_medal('1031406_2'), has_medal('1031619_2'), has_medal('1031119_2'), has_medal('1031120_2'), has_medal('1031109_2'), has_medal('1031115_2'), has_medal('1031121_2'), has_medal('1031105_2'), has_medal('1031113_2'))), | |
('2020919', 'Sim', 1, | |
f_and(global_stat('time', 1440000), has_medal('2020913'), has_medal('1031406_3'), has_medal('1031619_3'), has_medal('1031119_3'), has_medal('1031120_3'), has_medal('1031109_3'), has_medal('1031115_3'), has_medal('1031121_3'), has_medal('1031105_3'), has_medal('1031113_3'))), | |
('2021322', 'Mvm', 2, | |
f_and(global_stat_multiple_times('time', 900000, '2021322'), global_stat_multiple_times('dsab', 5000, '2021322'), global_stat_multiple_times('dfcp', 1000, '2021322'), global_stat_multiple_times('twsc', 30000, '2021322'))), | |
('2020419', 'Dsm', 2, | |
f_and(global_stat_multiple_times('tcdr', 360000, '2020419'), global_stat_multiple_times('tsql', 360000, '2020419'), global_stat_multiple_times('tsqm', 360000, '2020419'), player_score('rplScore', 45))), ('1261119_1', 'X1Acb', 1, object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 6)), | |
('1261119_2', 'X1Acb', 1, | |
f_and(has_medal('1261119_1'), global_stat('ktm-1', 57600), object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 22))), | |
('1261119_3', 'X1Acb', 1, | |
f_and(has_medal('1261119_2'), global_stat('ktm-1', 360000), object_stat('kits', 'kills', KIT_TYPE_ASSAULT, 44))), ('1261120_1', 'X1Atcb', 1, object_stat('kits', 'kills', KIT_TYPE_AT, 11)), | |
('1261120_2', 'X1Atcb', 1, | |
f_and(has_medal('1261120_1'), global_stat('ktm-0', 57600), object_stat('kits', 'kills', KIT_TYPE_AT, 22))), | |
('1261120_3', 'X1Atcb', 1, | |
f_and(has_medal('1261120_2'), global_stat('ktm-0', 360000), object_stat('kits', 'kills', KIT_TYPE_AT, 44))), ('1261109_1', 'X1Sncb', 1, object_stat('kits', 'kills', KIT_TYPE_SNIPER, 11)), | |
('1261109_2', 'X1Sncb', 1, | |
f_and(has_medal('1261109_1'), global_stat('ktm-6', 57600), object_stat('kits', 'kills', KIT_TYPE_SNIPER, 17))), | |
('1261109_3', 'X1Sncb', 1, | |
f_and(has_medal('1261109_2'), global_stat('ktm-6', 360000), object_stat('kits', 'kills', KIT_TYPE_SNIPER, 38))), ('1261115_1', 'X1Socb', 1, object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 6)), | |
('1261115_2', 'X1Socb', 1, | |
f_and(has_medal('1261115_1'), global_stat('ktm-4', 57600), object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 22))), | |
('1261115_3', 'X1Socb', 1, | |
f_and(has_medal('1261115_2'), global_stat('ktm-4', 360000), object_stat('kits', 'kills', KIT_TYPE_SPECOPS, 44))), ('1261121_1', 'X1Sucb', 1, object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 11)), | |
('1261121_2', 'X1Sucb', 1, | |
f_and(has_medal('1261121_1'), global_stat('ktm-5', 57600), object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 22))), | |
('1261121_3', 'X1Sucb', 1, | |
f_and(has_medal('1261121_2'), global_stat('ktm-5', 360000), object_stat('kits', 'kills', KIT_TYPE_SUPPORT, 44))), ('1261105_1', 'X1Ecb', 1, object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 11)), | |
('1261105_2', 'X1Ecb', 1, | |
f_and(has_medal('1261105_1'), global_stat('ktm-2', 57600), object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 22))), | |
('1261105_3', 'X1Ecb', 1, | |
f_and(has_medal('1261105_2'), global_stat('ktm-2', 360000), object_stat('kits', 'kills', KIT_TYPE_ENGINEER, 44))), ('1261113_1', 'X1Mcb', 1, object_stat('kits', 'kills', KIT_TYPE_MEDIC, 11)), | |
('1261113_2', 'X1Mcb', 1, | |
f_and(has_medal('1261113_1'), global_stat('ktm-3', 57600), object_stat('kits', 'kills', KIT_TYPE_MEDIC, 22))), | |
('1261113_3', 'X1Mcb', 1, | |
f_and(has_medal('1261113_2'), global_stat('ktm-3', 360000), object_stat('kits', 'kills', KIT_TYPE_MEDIC, 44))), ('1260602_1', 'X1fbb', 1, object_stat('weapons', 'deployed', WEAPON_TYPE_TACTICAL, 10)), | |
('1260602_2', 'X1fbb', 1, | |
f_and(has_medal('1260602_1'), object_stat('weapons', 'deployed', WEAPON_TYPE_TACTICAL, 100))), | |
('1260602_3', 'X1fbb', 1, | |
f_and(has_medal('1260602_2'), object_stat('weapons', 'deployed', WEAPON_TYPE_TACTICAL, 500))), ('1260708_1', 'X1ghb', 1, object_stat('weapons', 'deployed', WEAPON_TYPE_GRAPPLINGHOOK, 10)), | |
('1260708_2', 'X1ghb', 1, | |
f_and(has_medal('1260708_1'), object_stat('weapons', 'deployed', WEAPON_TYPE_GRAPPLINGHOOK, 100))), | |
('1260708_3', 'X1ghb', 1, | |
f_and(has_medal('1260708_2'), object_stat('weapons', 'deployed', WEAPON_TYPE_GRAPPLINGHOOK, 500))), ('1262612_1', 'X1zlb', 1, object_stat('weapons', 'deployed', WEAPON_TYPE_ZIPLINE, 10)), | |
('1262612_2', 'X1zlb', 1, | |
f_and(has_medal('1262612_1'), object_stat('weapons', 'deployed', WEAPON_TYPE_ZIPLINE, 100))), | |
('1262612_3', 'X1zlb', 1, | |
f_and(has_medal('1262612_2'), object_stat('weapons', 'deployed', WEAPON_TYPE_ZIPLINE, 500))), | |
('3260318', 'X1Csr', 1, | |
f_and(player_score('driverSpecials', 1), player_score('driverAssists', 20), player_score('kills', 10))), | |
('3260118', 'X1Arr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_ARMOR, 1200), object_stat('vehicles', 'kills', VEHICLE_TYPE_ARMOR, 22))), | |
('3260105', 'X1Aer', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_AVIATOR, 900), object_stat('vehicles', 'kills', VEHICLE_TYPE_AVIATOR, 22))), | |
('3260803', 'X1Hsr', 1, | |
f_and(object_stat('vehicles', 'rtime', VEHICLE_TYPE_HELICOPTER, 900), object_stat('vehicles', 'kills', VEHICLE_TYPE_HELICOPTER, 22)))) | |
rank_data = ( | |
( | |
1, 'rank', f_plus(global_stat('scor'), player_score('score'), 150)), | |
(2, 'rank', | |
f_and(has_rank(1), f_plus(global_stat('scor'), player_score('score'), 500))), | |
(3, 'rank', | |
f_and(has_rank(2), f_plus(global_stat('scor'), player_score('score'), 800))), | |
(4, 'rank', | |
f_and(has_rank(3), f_plus(global_stat('scor'), player_score('score'), 2500))), | |
(5, 'rank', | |
f_and(has_rank(4), f_plus(global_stat('scor'), player_score('score'), 5000))), | |
(6, 'rank', | |
f_and(has_rank(5), f_plus(global_stat('scor'), player_score('score'), 8000))), | |
(7, 'rank', | |
f_and(has_rank(6), f_plus(global_stat('scor'), player_score('score'), 20000))), | |
(8, 'rank', | |
f_and(has_rank(6), f_plus(global_stat('scor'), player_score('score'), 20000), has_medal('1031406_1'), has_medal('1031619_1'), has_medal('1031119_1'), has_medal('1031120_1'), has_medal('1031109_1'), has_medal('1031115_1'), has_medal('1031121_1'), has_medal('1031105_1'), has_medal('1031113_1'))), | |
(9, 'rank', | |
f_and(f_or(has_rank(7), has_rank(8)), f_plus(global_stat('scor'), player_score('score'), 50000))), | |
(10, 'rank', | |
f_and(f_or(has_rank(7), has_rank(8)), f_plus(global_stat('scor'), player_score('score'), 50000), has_medal('1220118_1'), has_medal('1222016_1'), has_medal('1220803_1'), has_medal('1220122_1'), has_medal('1220104_1'), has_medal('1031923_1'))), | |
(11, 'rank', | |
f_and(f_plus(global_stat('scor'), player_score('score'), 50000), has_medal('6666666'))), | |
(12, 'rank', | |
f_and(f_or(f_or(has_rank(9), has_rank(10)), has_rank(11)), f_plus(global_stat('scor'), player_score('score'), 60000))), | |
(13, 'rank', | |
f_and(has_rank(12), f_plus(global_stat('scor'), player_score('score'), 75000))), | |
(14, 'rank', | |
f_and(has_rank(13), f_plus(global_stat('scor'), player_score('score'), 90000))), | |
(15, 'rank', | |
f_and(has_rank(14), f_plus(global_stat('scor'), player_score('score'), 115000))), | |
(16, 'rank', | |
f_and(has_rank(15), f_plus(global_stat('scor'), player_score('score'), 125000))), | |
(17, 'rank', | |
f_and(has_rank(16), f_plus(global_stat('scor'), player_score('score'), 150000))), | |
(18, 'rank', | |
f_and(has_rank(17), f_plus(global_stat('scor'), player_score('score'), 180000), has_medal('1220118_2'), has_medal('1222016_2'), has_medal('1220803_2'), has_medal('1220122_2'), has_medal('1220104_2'), has_medal('1031923_2'), global_stat('time', 3888000))), | |
(19, 'rank', | |
f_and(has_rank(18), f_plus(global_stat('scor'), player_score('score'), 180000), has_medal('1031406_2'), has_medal('1031619_2'), has_medal('1031119_2'), has_medal('1031120_2'), has_medal('1031109_2'), has_medal('1031115_2'), has_medal('1031121_2'), has_medal('1031105_2'), has_medal('1031113_2'), global_stat('time', 4500000))), | |
(20, 'rank', | |
f_and(has_rank(19), f_plus(global_stat('scor'), player_score('score'), 200000), global_stat('time', 5184000))), | |
(21, 'rank', | |
f_and(has_rank(20), f_plus(global_stat('scor'), player_score('score'), 200000), has_medal('6666666')))) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/medals.py | |
# Compiled at: 2014-09-24 19:09:01 | |
import host, bf2.PlayerManager, bf2.Timer, os | |
from bf2 import g_debug, bf2hub | |
from constants import * | |
running_mod = str(host.sgl_getModDirectory()) | |
if running_mod.lower() == 'mods/xpack': | |
from medal_data_xpack import * | |
else: | |
from medal_data import * | |
from stats import getStatsMap, getPlayerConnectionOrderIterator, setPlayerConnectionOrderIterator | |
import snapshot | |
sessionPlayerMedalMap = {} | |
def getMedalMap(): | |
global sessionPlayerMedalMap | |
return sessionPlayerMedalMap | |
def setMedalMap(map): | |
global sessionPlayerMedalMap | |
sessionPlayerMedalMap = map | |
globalKeyString = '' | |
globalKeyString = '&info=per*,cmb*,twsc,cpcp,cacp,dfcp,kila,heal,rviv,rsup,rpar,tgte,dkas,dsab,cdsc,rank,cmsc,kick,kill,deth,suic,ospm,klpm,klpr,dtpr,bksk,wdsk,bbrs,tcdr,ban,dtpm,lbtl,osaa,vrk,tsql,tsqm,tlwf,mvks,vmks,mvn*,vmr*,fkit,fmap,fveh,fwea,wtm-,wkl-,wdt-,wac-,wkd-,vtm-,vkl-,vdt-,vkd-,vkr-,atm-,awn-,alo-,abr-,ktm-,kkl-,kdt-,kkd-' | |
g_lastPlayerChecked = 0 | |
updateTimer = None | |
def init(): | |
if host.ss_getParam('ranked'): | |
host.registerHandler('PlayerConnect', onPlayerConnect, 1) | |
host.registerHandler('PlayerStatsResponse', onStatsResponse, 1) | |
host.registerHandler('PlayerAwardsResponse', onAwardsResponse, 1) | |
host.registerGameStatusHandler(onGameStatusChanged) | |
print '(BF2Hub) Medal awarding module initialized' | |
def createGlobalKeyString(keymap): | |
keystring = '&info=rank,' | |
usedKeys = {} | |
for k in keymap: | |
f = k.find('-') | |
if f != -1: | |
k = k[:f + 1] | |
if not k in usedKeys: | |
keystring = keystring + k + ',' | |
usedKeys[k] = 1 | |
if keystring.find('vac-'): | |
keystring = keystring.replace('vac-,', '') + 'vac-,' | |
if len(k) > 0: | |
keystring = keystring[:len(keystring) - 1] | |
return keystring | |
class MedalSet: | |
__module__ = __name__ | |
def __init__(self): | |
self.gsiMedals = {} | |
self.roundMedals = {} | |
self.globalKeys = {} | |
def playerConnect(self, reconnect): | |
if not reconnect: | |
self.placeMedals = [ | |
0, 0, 0] | |
else: | |
for medal in medal_data: | |
id = medal[0] | |
keep = medal[2] != 0 | |
if not keep and id in self.roundMedals: | |
del self.roundMedals[id] | |
self.placeMedalThisRound = 0 | |
def getSnapShot(self): | |
medalKeys = {} | |
prevKeys = {} | |
for medal in medal_data: | |
id = medal[0] | |
key = medal[1] | |
if '_' in medal[0]: | |
if id in self.roundMedals: | |
if not key in medalKeys: | |
medalKeys[key] = 1 | |
else: | |
medalKeys[key] = medalKeys[key] + 1 | |
if id in self.gsiMedals: | |
if not key in prevKeys: | |
prevKeys[key] = 1 | |
else: | |
prevKeys[key] = prevKeys[key] + 1 | |
else: | |
if id in self.roundMedals: | |
medalKeys[key] = self.roundMedals[id] | |
if id in self.gsiMedals: | |
prevKeys[key] = self.gsiMedals[id] | |
removeList = [] | |
for key in medalKeys: | |
if key in prevKeys: | |
if prevKeys[key] >= medalKeys[key]: | |
removeList += [key] | |
for key in removeList: | |
del medalKeys[key] | |
if self.placeMedalThisRound == 1: | |
medalKeys['erg'] = 1 | |
elif self.placeMedalThisRound == 2: | |
medalKeys['ers'] = 1 | |
elif self.placeMedalThisRound == 3: | |
medalKeys['erb'] = 1 | |
keyvals = [] | |
for k in medalKeys: | |
keyvals.append(('\\').join((k, str(medalKeys[k])))) | |
return ('\\').join(keyvals) | |
def givePositionalMedals(endOfRound, winningTeam): | |
if endOfRound: | |
sortedPlayers = [] | |
statsMap = getStatsMap() | |
for sp in statsMap.itervalues(): | |
sortedPlayers += [((sp.score, sp.skillScore, -sp.deaths), sp.connectionOrderNr)] | |
sortedPlayers.sort() | |
sortedPlayers.reverse() | |
if len(sortedPlayers) > 0 and sortedPlayers[0][1] in sessionPlayerMedalMap: | |
sessionPlayerMedalMap[sortedPlayers[0][1]].placeMedals[0] += 1 | |
sessionPlayerMedalMap[sortedPlayers[0][1]].placeMedalThisRound = 1 | |
if len(sortedPlayers) > 1 and sortedPlayers[1][1] in sessionPlayerMedalMap: | |
sessionPlayerMedalMap[sortedPlayers[1][1]].placeMedals[1] += 1 | |
sessionPlayerMedalMap[sortedPlayers[1][1]].placeMedalThisRound = 2 | |
if len(sortedPlayers) > 2 and sortedPlayers[2][1] in sessionPlayerMedalMap: | |
sessionPlayerMedalMap[sortedPlayers[2][1]].placeMedals[2] += 1 | |
sessionPlayerMedalMap[sortedPlayers[2][1]].placeMedalThisRound = 3 | |
def onGameStatusChanged(status): | |
global g_lastPlayerChecked | |
global updateTimer | |
if status == bf2.GameStatus.Playing: | |
if host.ss_getParam('ranked'): | |
host.registerHandler('PlayerKilled', onPlayerKilled) | |
host.registerHandler('ExitVehicle', onExitVehicle) | |
host.registerHandler('PlayerScore', onPlayerScore) | |
if updateTimer: | |
updateTimer.destroy() | |
updateTimer = bf2.Timer(onUpdate, 1, 0) | |
updateTimer.setRecurring(1) | |
for p in bf2.playerManager.getPlayers(): | |
onPlayerConnect(p) | |
g_lastPlayerChecked = 0 | |
elif status == bf2.GameStatus.EndGame: | |
givePositionalMedals(True, bf2.gameLogic.getWinner()) | |
if host.ss_getParam('ranked'): | |
bf2.bf2hub.stats.snapshot.invoke() | |
if updateTimer: | |
updateTimer.destroy() | |
def onPlayerConnect(player): | |
id = player.stats.connectionOrderNr | |
reconnect = id in sessionPlayerMedalMap | |
if id in sessionPlayerMedalMap: | |
pass | |
if not reconnect: | |
newMedalSet = MedalSet() | |
sessionPlayerMedalMap[id] = newMedalSet | |
player.medals = sessionPlayerMedalMap[id] | |
player.medals.playerConnect(reconnect) | |
if not reconnect: | |
player.score.rank = 0 | |
else: | |
player.score.rank = player.stats.rank | |
if player.getGlobalUpdateTime() > 30 and player.stats.wasHereAtStart == 1: | |
if player.stats.timeOnLine < 30: | |
reconnect = False | |
if player.getProfileId() > 2000 and not reconnect: | |
player.score.rank = player.stats.rank | |
success = False | |
if not player.isAIPlayer(): | |
success = host.pers_plrRequestStats(player.index, 1, globalKeyString) | |
success = False | |
if not player.isAIPlayer(): | |
success = host.pers_plrRequestAwards(player.index, 1, '') | |
player.setGlobalUpdateTime() | |
def onUpdate(data): | |
global g_lastPlayerChecked | |
for i in range(0, 2): | |
p = bf2.playerManager.getNextPlayer(g_lastPlayerChecked) | |
if not p: | |
break | |
if p.isAlive(): | |
checkMedals(p) | |
g_lastPlayerChecked = p.index | |
def onPlayerKilled(victim, attacker, weapon, assists, object): | |
if attacker != None: | |
checkMedals(attacker) | |
return | |
def onExitVehicle(player, vehicle): | |
checkMedals(player) | |
def onPlayerScore(player, difference): | |
if player != None and difference > 0: | |
checkRank(player) | |
return | |
def checkMedals(player): | |
if not player.isAlive(): | |
return | |
if not bf2hub.canAwardMedals(): | |
return | |
for medal in medal_data: | |
id = medal[0] | |
if id in player.medals.roundMedals: | |
if medal[2] != 2: | |
continue | |
checkCriteria = medal[3] | |
if not checkCriteria(player): | |
continue | |
idStr = medal[0] | |
newLevel = 1 | |
if '_' in medal[0]: | |
newLevel = int(idStr[idStr.find('_') + 1:]) | |
idStr = idStr[:idStr.find('_')] | |
awardMedal(player, int(idStr), newLevel) | |
elif id in player.medals.roundMedals: | |
newLevel = player.medals.roundMedals[id] + 1 | |
awardMedal(player, int(idStr), 0) | |
player.medals.roundMedals[id] = newLevel | |
def checkRank(player): | |
if not bf2hub.canAwardRanks(): | |
return | |
oldRank = player.score.rank | |
rankCriteria = None | |
highestRank = player.score.rank | |
for rankItem in rank_data: | |
rankCriteria = rankItem[2] | |
if rankItem[0] > highestRank and rankCriteria(player): | |
highestRank = rankItem[0] | |
if oldRank < highestRank: | |
awardRank(player, highestRank) | |
return | |
def awardMedal(player, id, level): | |
if g_debug: | |
print 'AWARD: %s -> %d (%d)' % (player.getName(), id, level) | |
if bf2hub.canDisplayMedals(): | |
bf2.gameLogic.sendMedalEvent(player, id, level) | |
def awardRank(player, rank): | |
if g_debug: | |
print 'PROMOTION: %s (%d -> %d)' % (player.getName(), player.score.rank, rank) | |
player.score.rank = rank | |
if bf2hub.canDisplayPromotions(): | |
bf2.gameLogic.sendRankEvent(player, rank, player.score.score) | |
medalDataKeyLookup = {} | |
for item in medal_data: | |
medalDataKeyLookup[item[0]] = item | |
def getMedalEntry(key): | |
if key in medalDataKeyLookup: | |
return medalDataKeyLookup[key] | |
return None | |
return | |
def onAwardsResponse(succeeded, player, awards): | |
if not succeeded: | |
return | |
if not player: | |
return | |
if g_debug: | |
print 'Award response received for player %d (pid %d), size %d' % (player.index, player.getProfileId(), len(awards)) | |
for a in awards: | |
medalKey = str(a[0]) | |
item = getMedalEntry(medalKey) | |
if item: | |
keep = item[2] != 0 | |
if keep: | |
player.medals.gsiMedals[medalKey] = int(a[1]) | |
player.medals.roundMedals[medalKey] = int(a[1]) | |
else: | |
if a[1] > 0: | |
medalKey += '_' + str(a[1]) | |
item = getMedalEntry(medalKey) | |
if item: | |
player.medals.gsiMedals[medalKey] = 1 | |
player.medals.roundMedals[medalKey] = 1 | |
def onStatsResponse(succeeded, player, stats): | |
if not succeeded: | |
return | |
if not player: | |
return | |
if g_debug: | |
print 'Stats response received for player %d (pid %d), size %d.' % (player.index, player.getProfileId(), len(stats)) | |
for key in globalKeysNeeded: | |
if not key in stats: | |
if g_debug: | |
print 'AWARDS: key %s not found' % key | |
else: | |
value = host.pers_getStatsKeyVal(key) | |
if value == '': | |
print "AWARDS: no value for '%s'" % key | |
else: | |
try: | |
player.medals.globalKeys[key] = int(value) | |
except: | |
pass | |
if not 'rank' in stats: | |
if g_debug: | |
print 'Rank not found in stats response' | |
else: | |
value = host.pers_getStatsKeyVal('rank') | |
if g_debug: | |
print 'Player', player.index, 'Rank:', value | |
player.score.rank = int(value) | |
player.stats.rank = int(value) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/rank.py | |
# Compiled at: 2014-10-31 13:35:56 | |
import host, bf2.PlayerManager, bf2.Timer | |
from constants import * | |
from bf2 import g_debug | |
def init(): | |
""" | |
if bf2.serverSettings.getUseGlobalRank(): | |
host.registerHandler('PlayerConnect', onPlayerConnect, 1) | |
host.registerHandler('PlayerStatsResponse', onStatsResponse, 1) | |
host.registerGameStatusHandler(onGameStatusChanged) | |
# Connect already connected players if reinitializing | |
for p in bf2.playerManager.getPlayers(): | |
onPlayerConnect(p) | |
""" | |
if g_debug: | |
print '(BF2Hub) Rank module initialized' | |
def onGameStatusChanged(status): | |
if status == bf2.GameStatus.Playing: | |
pass | |
elif g_debug: | |
print 'Destroyed timer' | |
def onUpdate(data): | |
for p in bf2.playerManager.getPlayers(): | |
if p.isAlive(): | |
checkRank(p) | |
def onPlayerConnect(player): | |
id = player.index | |
if player.score.rank == -1: | |
player.score.rank = 0 | |
if bf2.serverSettings.getUseGlobalRank(): | |
if player.getProfileId() > 2000: | |
success = host.pers_plrRequestStats(player.index, 1, '&info=rank') | |
elif g_debug: | |
print "Player %d had no profile id, can't request rank" % player.index | |
if g_debug: | |
print 'Added player %d to rank checking' % player.index | |
def onStatsResponse(succeeded, player, stats): | |
if player == None: | |
playerIndex = 'unknown' | |
else: | |
playerIndex = player.index | |
if not 'rank' in stats: | |
if g_debug: | |
print 'rank not found, aborting' | |
return | |
if g_debug: | |
print 'Rank received for player ', playerIndex, ':', host.pers_getStatsKeyVal('rank') | |
if not player: | |
return | |
if not player: | |
return | |
if not 'rank' in stats: | |
if g_debug: | |
print 'Rank not found in stats response' | |
else: | |
value = host.pers_getStatsKeyVal('rank') | |
if g_debug: | |
print 'Player', player.index, 'Rank:', value | |
player.score.rank = int(value) | |
player.stats.rank = int(value) | |
return |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/snapshot.py | |
# Compiled at: 2014-11-13 22:21:09 | |
import host, bf2.PlayerManager, fpformat | |
from bf2.bf2hub.stats.constants import * | |
from bf2 import g_debug, bf2hub | |
from bf2.bf2hub.stats.stats import getStatsMap, setStatsMap, getPlayerConnectionOrderIterator, setPlayerConnectionOrderIterator, roundArmies | |
from bf2.bf2hub.stats.medals import getMedalMap, setMedalMap | |
from time import time | |
import traceback | |
map_start = 0 | |
numPlayersWhenStarted = 0 | |
snapshot_prefix = 'BF2' | |
reduceData = False | |
def init(): | |
host.registerGameStatusHandler(onChangeGameStatus) | |
print '(BF2Hub) Snapshot module initialized' | |
def onChangeGameStatus(status): | |
global map_start | |
global numPlayersWhenStarted | |
if status == bf2.GameStatus.Playing: | |
map_start = time() | |
numPlayersWhenStarted = bf2.playerManager.getNumberOfPlayers() | |
if g_debug: | |
print '(BF2Hub) Num Players upon round start:', numPlayersWhenStarted | |
def invoke(): | |
global reduceData | |
bf2hub.log('snapshot - phase ' + '1 @ %f' % time()) | |
if not host.ss_getParam('ranked'): | |
print 'Server is not ranked, snapshot ignored' | |
else: | |
try: | |
reduceData = bf2hub.canSkipEmpty() | |
except: | |
reduceData = False | |
bf2hub.log('snapshot - phase ' + '2') | |
try: | |
snapShot = getSnapShot() | |
bf2hub.log('snapshot - phase ' + '%d (len = %d)' % (3, len(snapShot))) | |
if g_debug: | |
print snapShot | |
bf2hub.sendSnapshot(snapShot) | |
bf2hub.log('snapshot - phase ' + '%d' % 4) | |
except Exception, e: | |
print 'Exception in snapshot.invoke() ->', e | |
traceback.print_exc() | |
bf2hub.log('snapshot - exception: %s' % str(e)) | |
repackStatsVectors() | |
def repackStatsVectors(): | |
cleanoutStatsVector() | |
cleanoutMedalsVector() | |
medalMap = getMedalMap() | |
statsMap = getStatsMap() | |
playerOrderIt = getPlayerConnectionOrderIterator() | |
newOrderIterator = 0 | |
newStatsMap = {} | |
newMedalMap = {} | |
highestId = 0 | |
for (id, statsItem) in statsMap.iteritems(): | |
newStatsMap[newOrderIterator] = statsItem | |
if id in medalMap: | |
newMedalMap[newOrderIterator] = medalMap[id] | |
statsItem.connectionOrderNr = newOrderIterator | |
newOrderIterator += 1 | |
setPlayerConnectionOrderIterator(newOrderIterator) | |
setStatsMap(newStatsMap) | |
setMedalMap(newMedalMap) | |
def cleanoutStatsVector(): | |
statsMap = getStatsMap() | |
removeList = [] | |
for pid in statsMap: | |
foundPlayer = False | |
for p in bf2.playerManager.getPlayers(): | |
if p.stats == statsMap[pid]: | |
foundPlayer = True | |
break | |
if not foundPlayer: | |
removeList += [pid] | |
for pid in removeList: | |
del statsMap[pid] | |
def cleanoutMedalsVector(): | |
medalMap = getMedalMap() | |
removeList = [] | |
for pid in medalMap: | |
foundPlayer = False | |
for p in bf2.playerManager.getPlayers(): | |
if p.medals == medalMap[pid]: | |
foundPlayer = True | |
break | |
if not foundPlayer: | |
removeList += [pid] | |
for pid in removeList: | |
del medalMap[pid] | |
def getServerConfig(variableName): | |
return host.rcon_invoke(variableName).strip() | |
def getSnapShot(): | |
snapShot = snapshot_prefix + '\\' + bf2.gameLogic.getMapName() + '\\' | |
snapShot += 'gameport\\' + str(getServerConfig('sv.serverPort')) + '\\' | |
snapShot += 'queryport\\' + str(getServerConfig('sv.gameSpyPort')) + '\\' | |
snapShot += 'uptime\\' + str(host.timer_getWallTime()) + '\\' | |
snapShot += 'mapstart\\' + str(map_start) + '\\mapend\\' + str(time()) + '\\' | |
snapShot += 'win\\' + str(bf2.gameLogic.getWinner()) + '\\' | |
snapShot += 'BF2Hub_NumPlayersOnRoundStart\\' + str(numPlayersWhenStarted) + '\\' | |
statsMap = getStatsMap() | |
running_mod = str(host.sgl_getModDirectory()) | |
if running_mod.lower() == 'mods/bf2': | |
v_value = 'bf2' | |
elif running_mod.lower() == 'mods/bf2sp64': | |
v_value = 'bf2sp64' | |
elif running_mod.lower() == 'mods/xpack': | |
v_value = 'xpack' | |
else: | |
v_value = 'bf2' | |
standardKeys = [ | |
( | |
'gm', getGameModeId(bf2.serverSettings.getGameMode())), ('m', getMapId(bf2.serverSettings.getMapName())), ('v', str(v_value)), ('pc', len(statsMap))] | |
winner = bf2.gameLogic.getWinner() | |
if winner != 0: | |
standardKeys += [('rwa', roundArmies[winner])] | |
standardKeys += [('ra1', str(roundArmies[1])), ('rs1', str(bf2.gameLogic.getTickets(1))), ('ra2', str(roundArmies[2])), ('rs2', str(bf2.gameLogic.getTickets(2)))] | |
stdKeyVals = [] | |
for k in standardKeys: | |
stdKeyVals.append(('\\').join((k[0], str(k[1])))) | |
snapShot += ('\\').join(stdKeyVals) | |
playerSnapShots = '' | |
for sp in statsMap.itervalues(): | |
try: | |
playerSnapShot = getPlayerSnapshot(sp) | |
except: | |
psuffix = '_' + str(sp.connectionOrderNr) | |
playerSnapShot = '\\exc' + psuffix + '\\1' | |
playerSnapShot += '\\pid' + psuffix + '\\' + str(sp.profileId) | |
playerSnapShot += '\\name' + psuffix + '\\' + encodePlayerName(sp.name) | |
playerSnapShots += playerSnapShot | |
snapShot += playerSnapShots | |
snapShot += '\\EOF\\1' | |
return snapShot | |
def encodePlayerName(name): | |
name = name.replace('@', '@@') | |
name = name.replace('\\', '@b') | |
return name | |
def getPlayerSnapshot(playerStat): | |
playerKeys = [ | |
( | |
'pid', playerStat.profileId), ('name', encodePlayerName(playerStat.name)), ('t', playerStat.team), ('a', playerStat.army), ('ctime', int(playerStat.timePlayed)), ('c', playerStat.complete), ('ip', playerStat.ipaddr), ('rs', playerStat.score), ('cs', playerStat.cmdScore), ('ss', playerStat.skillScore), ('ts', playerStat.teamScore), ('kills', playerStat.kills), ('deaths', playerStat.deaths), ('cpc', playerStat.localScore.cpCaptures), ('cpn', playerStat.localScore.cpNeutralizes), ('cpa', playerStat.localScore.cpAssists), ('cpna', playerStat.localScore.cpNeutralizeAssists), ('cpd', playerStat.localScore.cpDefends), ('ka', playerStat.localScore.damageAssists), ('he', playerStat.localScore.heals), ('rev', playerStat.localScore.revives), ('rsp', playerStat.localScore.ammos), ('rep', playerStat.localScore.repairs), ('tre', playerStat.localScore.targetAssists), ('drs', playerStat.localScore.driverSpecials), ('dra', playerStat.localScore.driverAssists), ('pa', playerStat.localScore.passengerAssists), ('tmkl', playerStat.teamkills), ('tmdg', playerStat.localScore.teamDamages), ('tmvd', playerStat.localScore.teamVehicleDamages), ('su', playerStat.localScore.suicides), ('ks', playerStat.longestKillStreak), ('ds', playerStat.longestDeathStreak), ('rank', playerStat.rank), ('ban', playerStat.timesBanned), ('kck', playerStat.timesKicked), ('tco', int(playerStat.timeAsCmd)), ('tsl', int(playerStat.timeAsSql)), ('tsm', int(playerStat.timeInSquad - playerStat.timeAsSql)), ('tlw', int(playerStat.timePlayed - playerStat.timeAsCmd - playerStat.timeInSquad)), ('ta0', int(playerStat.timeAsArmy[ARMY_USA])), ('ta1', int(playerStat.timeAsArmy[ARMY_MEC])), ('ta2', int(playerStat.timeAsArmy[ARMY_CHINESE])), ('ta3', int(playerStat.timeAsArmy[ARMY_SEALS])), ('ta4', int(playerStat.timeAsArmy[ARMY_SAS])), ('ta5', int(playerStat.timeAsArmy[ARMY_SPETZNAS])), ('ta6', int(playerStat.timeAsArmy[ARMY_MECSF])), ('ta7', int(playerStat.timeAsArmy[ARMY_REBELS])), ('ta8', int(playerStat.timeAsArmy[ARMY_INSURGENTS])), ('ta9', int(playerStat.timeAsArmy[ARMY_EURO]))] | |
statsMap = getStatsMap() | |
for p in playerStat.killedPlayer: | |
if not p in statsMap: | |
pass | |
else: | |
playerKeys.append(('mvns', str(statsMap[p].profileId))) | |
playerKeys.append(('mvks', str(playerStat.killedPlayer[p]))) | |
keyvals = [] | |
for k in playerKeys: | |
keyvals.append(('\\').join((k[0], str(k[1])))) | |
playerSnapShot = ('\\').join(keyvals) | |
medalsSnapShot = '' | |
if playerStat.medals: | |
medalsSnapShot = playerStat.medals.getSnapShot() | |
vehicleKeys = [ | |
( | |
'tv0', int(playerStat.vehicles[VEHICLE_TYPE_ARMOR].timeInObject)), ('tv1', int(playerStat.vehicles[VEHICLE_TYPE_AVIATOR].timeInObject)), ('tv2', int(playerStat.vehicles[VEHICLE_TYPE_AIRDEFENSE].timeInObject)), ('tv3', int(playerStat.vehicles[VEHICLE_TYPE_HELICOPTER].timeInObject)), ('tv4', int(playerStat.vehicles[VEHICLE_TYPE_TRANSPORT].timeInObject)), ('tv5', int(playerStat.vehicles[VEHICLE_TYPE_ARTILLERY].timeInObject)), ('tv6', int(playerStat.vehicles[VEHICLE_TYPE_GRNDDEFENSE].timeInObject)), ('tvp', int(playerStat.vehicles[VEHICLE_TYPE_PARACHUTE].timeInObject)), ('kv0', playerStat.vehicles[VEHICLE_TYPE_ARMOR].kills), ('kv1', playerStat.vehicles[VEHICLE_TYPE_AVIATOR].kills), ('kv2', playerStat.vehicles[VEHICLE_TYPE_AIRDEFENSE].kills), ('kv3', playerStat.vehicles[VEHICLE_TYPE_HELICOPTER].kills), ('kv4', playerStat.vehicles[VEHICLE_TYPE_TRANSPORT].kills), ('kv5', playerStat.vehicles[VEHICLE_TYPE_ARTILLERY].kills), ('kv6', playerStat.vehicles[VEHICLE_TYPE_GRNDDEFENSE].kills), ('bv0', playerStat.vehicles[VEHICLE_TYPE_ARMOR].deaths), ('bv1', playerStat.vehicles[VEHICLE_TYPE_AVIATOR].deaths), ('bv2', playerStat.vehicles[VEHICLE_TYPE_AIRDEFENSE].deaths), ('bv3', playerStat.vehicles[VEHICLE_TYPE_HELICOPTER].deaths), ('bv4', playerStat.vehicles[VEHICLE_TYPE_TRANSPORT].deaths), ('bv5', playerStat.vehicles[VEHICLE_TYPE_ARTILLERY].deaths), ('bv6', playerStat.vehicles[VEHICLE_TYPE_GRNDDEFENSE].deaths), ('kvr0', playerStat.vehicles[VEHICLE_TYPE_ARMOR].roadKills), ('kvr1', playerStat.vehicles[VEHICLE_TYPE_AVIATOR].roadKills), ('kvr2', playerStat.vehicles[VEHICLE_TYPE_AIRDEFENSE].roadKills), ('kvr3', playerStat.vehicles[VEHICLE_TYPE_HELICOPTER].roadKills), ('kvr4', playerStat.vehicles[VEHICLE_TYPE_TRANSPORT].roadKills), ('kvr5', playerStat.vehicles[VEHICLE_TYPE_ARTILLERY].roadKills), ('kvr6', playerStat.vehicles[VEHICLE_TYPE_GRNDDEFENSE].roadKills), ('sv0', playerStat.vehicles[VEHICLE_TYPE_ARMOR].bulletsFired), ('sv1', playerStat.vehicles[VEHICLE_TYPE_AVIATOR].bulletsFired), ('sv2', playerStat.vehicles[VEHICLE_TYPE_AIRDEFENSE].bulletsFired), ('sv3', playerStat.vehicles[VEHICLE_TYPE_HELICOPTER].bulletsFired), ('sv4', playerStat.vehicles[VEHICLE_TYPE_TRANSPORT].bulletsFired), ('sv5', playerStat.vehicles[VEHICLE_TYPE_ARTILLERY].bulletsFired), ('sv6', playerStat.vehicles[VEHICLE_TYPE_GRNDDEFENSE].bulletsFired), ('hv0', playerStat.vehicles[VEHICLE_TYPE_ARMOR].bulletsHit), ('hv1', playerStat.vehicles[VEHICLE_TYPE_AVIATOR].bulletsHit), ('hv2', playerStat.vehicles[VEHICLE_TYPE_AIRDEFENSE].bulletsHit), ('hv3', playerStat.vehicles[VEHICLE_TYPE_HELICOPTER].bulletsHit), ('hv4', playerStat.vehicles[VEHICLE_TYPE_TRANSPORT].bulletsHit), ('hv5', playerStat.vehicles[VEHICLE_TYPE_ARTILLERY].bulletsHit), ('hv6', playerStat.vehicles[VEHICLE_TYPE_GRNDDEFENSE].bulletsHit)] | |
vehkeyvals = [] | |
for k in vehicleKeys: | |
if reduceData and k[1] == 0: | |
continue | |
vehkeyvals.append(('\\').join((k[0], str(k[1])))) | |
vehicleSnapShot = ('\\').join(vehkeyvals) | |
kitKeys = [ | |
( | |
'tk0', int(playerStat.kits[KIT_TYPE_AT].timeInObject)), ('tk1', int(playerStat.kits[KIT_TYPE_ASSAULT].timeInObject)), ('tk2', int(playerStat.kits[KIT_TYPE_ENGINEER].timeInObject)), ('tk3', int(playerStat.kits[KIT_TYPE_MEDIC].timeInObject)), ('tk4', int(playerStat.kits[KIT_TYPE_SPECOPS].timeInObject)), ('tk5', int(playerStat.kits[KIT_TYPE_SUPPORT].timeInObject)), ('tk6', int(playerStat.kits[KIT_TYPE_SNIPER].timeInObject)), ('kk0', playerStat.kits[KIT_TYPE_AT].kills), ('kk1', playerStat.kits[KIT_TYPE_ASSAULT].kills), ('kk2', playerStat.kits[KIT_TYPE_ENGINEER].kills), ('kk3', playerStat.kits[KIT_TYPE_MEDIC].kills), ('kk4', playerStat.kits[KIT_TYPE_SPECOPS].kills), ('kk5', playerStat.kits[KIT_TYPE_SUPPORT].kills), ('kk6', playerStat.kits[KIT_TYPE_SNIPER].kills), ('dk0', playerStat.kits[KIT_TYPE_AT].deaths), ('dk1', playerStat.kits[KIT_TYPE_ASSAULT].deaths), ('dk2', playerStat.kits[KIT_TYPE_ENGINEER].deaths), ('dk3', playerStat.kits[KIT_TYPE_MEDIC].deaths), ('dk4', playerStat.kits[KIT_TYPE_SPECOPS].deaths), ('dk5', playerStat.kits[KIT_TYPE_SUPPORT].deaths), ('dk6', playerStat.kits[KIT_TYPE_SNIPER].deaths)] | |
kitkeyvals = [] | |
for k in kitKeys: | |
kitkeyvals.append(('\\').join((k[0], str(k[1])))) | |
kitSnapShot = ('\\').join(kitkeyvals) | |
weaponKeys = [ | |
( | |
'tw0', int(playerStat.weapons[WEAPON_TYPE_ASSAULT].timeInObject)), ('tw1', int(playerStat.weapons[WEAPON_TYPE_ASSAULTGRN].timeInObject)), ('tw2', int(playerStat.weapons[WEAPON_TYPE_CARBINE].timeInObject)), ('tw3', int(playerStat.weapons[WEAPON_TYPE_LMG].timeInObject)), ('tw4', int(playerStat.weapons[WEAPON_TYPE_SNIPER].timeInObject)), ('tw5', int(playerStat.weapons[WEAPON_TYPE_PISTOL].timeInObject)), ('tw6', int(playerStat.weapons[WEAPON_TYPE_ATAA].timeInObject)), ('tw7', int(playerStat.weapons[WEAPON_TYPE_SMG].timeInObject)), ('tw8', int(playerStat.weapons[WEAPON_TYPE_SHOTGUN].timeInObject)), ('te0', int(playerStat.weapons[WEAPON_TYPE_KNIFE].timeInObject)), ('te1', int(playerStat.weapons[WEAPON_TYPE_C4].timeInObject)), ('te3', int(playerStat.weapons[WEAPON_TYPE_HANDGRENADE].timeInObject)), ('te2', int(playerStat.weapons[WEAPON_TYPE_CLAYMORE].timeInObject)), ('te4', int(playerStat.weapons[WEAPON_TYPE_SHOCKPAD].timeInObject)), ('te5', int(playerStat.weapons[WEAPON_TYPE_ATMINE].timeInObject)), ('te6', int(playerStat.weapons[WEAPON_TYPE_TACTICAL].timeInObject)), ('te7', int(playerStat.weapons[WEAPON_TYPE_GRAPPLINGHOOK].timeInObject)), ('te8', int(playerStat.weapons[WEAPON_TYPE_ZIPLINE].timeInObject)), ('kw0', playerStat.weapons[WEAPON_TYPE_ASSAULT].kills), ('kw1', playerStat.weapons[WEAPON_TYPE_ASSAULTGRN].kills), ('kw2', playerStat.weapons[WEAPON_TYPE_CARBINE].kills), ('kw3', playerStat.weapons[WEAPON_TYPE_LMG].kills), ('kw4', playerStat.weapons[WEAPON_TYPE_SNIPER].kills), ('kw5', playerStat.weapons[WEAPON_TYPE_PISTOL].kills), ('kw6', playerStat.weapons[WEAPON_TYPE_ATAA].kills), ('kw7', playerStat.weapons[WEAPON_TYPE_SMG].kills), ('kw8', playerStat.weapons[WEAPON_TYPE_SHOTGUN].kills), ('ke0', playerStat.weapons[WEAPON_TYPE_KNIFE].kills), ('ke1', playerStat.weapons[WEAPON_TYPE_C4].kills), ('ke3', playerStat.weapons[WEAPON_TYPE_HANDGRENADE].kills), ('ke2', playerStat.weapons[WEAPON_TYPE_CLAYMORE].kills), ('ke4', playerStat.weapons[WEAPON_TYPE_SHOCKPAD].kills), ('ke5', playerStat.weapons[WEAPON_TYPE_ATMINE].kills), ('bw0', playerStat.weapons[WEAPON_TYPE_ASSAULT].deaths), ('bw1', playerStat.weapons[WEAPON_TYPE_ASSAULTGRN].deaths), ('bw2', playerStat.weapons[WEAPON_TYPE_CARBINE].deaths), ('bw3', playerStat.weapons[WEAPON_TYPE_LMG].deaths), ('bw4', playerStat.weapons[WEAPON_TYPE_SNIPER].deaths), ('bw5', playerStat.weapons[WEAPON_TYPE_PISTOL].deaths), ('bw6', playerStat.weapons[WEAPON_TYPE_ATAA].deaths), ('bw7', playerStat.weapons[WEAPON_TYPE_SMG].deaths), ('bw8', playerStat.weapons[WEAPON_TYPE_SHOTGUN].deaths), ('be0', playerStat.weapons[WEAPON_TYPE_KNIFE].deaths), ('be1', playerStat.weapons[WEAPON_TYPE_C4].deaths), ('be3', playerStat.weapons[WEAPON_TYPE_HANDGRENADE].deaths), ('be2', playerStat.weapons[WEAPON_TYPE_CLAYMORE].deaths), ('be4', playerStat.weapons[WEAPON_TYPE_SHOCKPAD].deaths), ('be5', playerStat.weapons[WEAPON_TYPE_ATMINE].deaths), ('be8', playerStat.weapons[WEAPON_TYPE_ZIPLINE].deaths), ('be9', playerStat.weapons[WEAPON_TYPE_GRAPPLINGHOOK].deaths), ('de6', playerStat.weapons[WEAPON_TYPE_TACTICAL].deployed), ('de7', playerStat.weapons[WEAPON_TYPE_GRAPPLINGHOOK].deployed), ('de8', playerStat.weapons[WEAPON_TYPE_ZIPLINE].deployed), ('sw0', playerStat.weapons[WEAPON_TYPE_ASSAULT].bulletsFired), ('sw1', playerStat.weapons[WEAPON_TYPE_ASSAULTGRN].bulletsFired), ('sw2', playerStat.weapons[WEAPON_TYPE_CARBINE].bulletsFired), ('sw3', playerStat.weapons[WEAPON_TYPE_LMG].bulletsFired), ('sw4', playerStat.weapons[WEAPON_TYPE_SNIPER].bulletsFired), ('sw5', playerStat.weapons[WEAPON_TYPE_PISTOL].bulletsFired), ('sw6', playerStat.weapons[WEAPON_TYPE_ATAA].bulletsFired), ('sw7', playerStat.weapons[WEAPON_TYPE_SMG].bulletsFired), ('sw8', playerStat.weapons[WEAPON_TYPE_SHOTGUN].bulletsFired), ('se0', playerStat.weapons[WEAPON_TYPE_KNIFE].bulletsFired), ('se1', playerStat.weapons[WEAPON_TYPE_C4].bulletsFired), ('se2', playerStat.weapons[WEAPON_TYPE_CLAYMORE].bulletsFired), ('se3', playerStat.weapons[WEAPON_TYPE_HANDGRENADE].bulletsFired), ('se4', playerStat.weapons[WEAPON_TYPE_SHOCKPAD].bulletsFired), ('se5', playerStat.weapons[WEAPON_TYPE_ATMINE].bulletsFired), ('hw0', playerStat.weapons[WEAPON_TYPE_ASSAULT].bulletsHit), ('hw1', playerStat.weapons[WEAPON_TYPE_ASSAULTGRN].bulletsHit), ('hw2', playerStat.weapons[WEAPON_TYPE_CARBINE].bulletsHit), ('hw3', playerStat.weapons[WEAPON_TYPE_LMG].bulletsHit), ('hw4', playerStat.weapons[WEAPON_TYPE_SNIPER].bulletsHit), ('hw5', playerStat.weapons[WEAPON_TYPE_PISTOL].bulletsHit), ('hw6', playerStat.weapons[WEAPON_TYPE_ATAA].bulletsHit), ('hw7', playerStat.weapons[WEAPON_TYPE_SMG].bulletsHit), ('hw8', playerStat.weapons[WEAPON_TYPE_SHOTGUN].bulletsHit), ('he0', playerStat.weapons[WEAPON_TYPE_KNIFE].bulletsHit), ('he1', playerStat.weapons[WEAPON_TYPE_C4].bulletsHit), ('he2', playerStat.weapons[WEAPON_TYPE_CLAYMORE].bulletsHit), ('he3', playerStat.weapons[WEAPON_TYPE_HANDGRENADE].bulletsHit), ('he4', playerStat.weapons[WEAPON_TYPE_SHOCKPAD].bulletsHit), ('he5', playerStat.weapons[WEAPON_TYPE_ATMINE].bulletsHit)] | |
weapkeyvals = [] | |
for k in weaponKeys: | |
if reduceData and k[1] == 0: | |
continue | |
weapkeyvals.append(('\\').join((k[0], str(k[1])))) | |
weaponSnapShot = ('\\').join(weapkeyvals) | |
allSnapShots = [] | |
if len(playerSnapShot) > 0: | |
allSnapShots = allSnapShots + [playerSnapShot] | |
if len(medalsSnapShot) > 0: | |
allSnapShots = allSnapShots + [medalsSnapShot] | |
if len(vehicleSnapShot) > 0: | |
allSnapShots = allSnapShots + [vehicleSnapShot] | |
if len(kitSnapShot) > 0: | |
allSnapShots = allSnapShots + [kitSnapShot] | |
if len(weaponSnapShot) > 0: | |
allSnapShots = allSnapShots + [weaponSnapShot] | |
playerSnapShot = ('\\').join(allSnapShots) | |
transformedSnapShot = '' | |
i = 0 | |
idString = '_' + str(playerStat.connectionOrderNr) | |
while i < len(playerSnapShot): | |
key = '' | |
while playerSnapShot[i] != '\\': | |
key += playerSnapShot[i] | |
i += 1 | |
i += 1 | |
value = '' | |
while i < len(playerSnapShot) and playerSnapShot[i] != '\\': | |
value += playerSnapShot[i] | |
i += 1 | |
transformedKeyVal = key + idString + '\\' + value | |
if i != len(playerSnapShot): | |
transformedKeyVal += '\\' | |
transformedSnapShot += transformedKeyVal | |
i += 1 | |
return '\\' + transformedSnapShot |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/stats.py | |
# Compiled at: 2014-09-17 01:38:38 | |
import host, bf2.PlayerManager, fpformat | |
from constants import * | |
from bf2 import g_debug | |
roundArmies = [ | |
None, None, None] | |
sendEndOfRoundStats = False | |
def getSendEndOfRoundStats(): | |
global sendEndOfRoundStats | |
return sendEndOfRoundStats | |
def setSendEndOfRoundStats(value): | |
global sendEndOfRoundStats | |
sendEndOfRoundStats = value | |
playerConnectionOrderIterator = 0 | |
def getPlayerConnectionOrderIterator(): | |
global playerConnectionOrderIterator | |
return playerConnectionOrderIterator | |
def setPlayerConnectionOrderIterator(value): | |
global playerConnectionOrderIterator | |
playerConnectionOrderIterator = value | |
sessionPlayerStatsMap = {} | |
def getStatsMap(): | |
global sessionPlayerStatsMap | |
return sessionPlayerStatsMap | |
def setStatsMap(map): | |
global sessionPlayerStatsMap | |
sessionPlayerStatsMap = map | |
def init(): | |
host.registerHandler('PlayerConnect', onPlayerConnect, 1) | |
host.registerHandler('PlayerDisconnect', onPlayerDisconnect, 1) | |
host.registerHandler('Reset', onReset, 1) | |
host.registerGameStatusHandler(onGameStatusChanged) | |
if g_debug: | |
print '(BF2Hub) Persistant stats module initialized.' | |
def onGameStatusChanged(status): | |
global playerConnectionOrderIterator | |
if status == bf2.GameStatus.Playing: | |
highestPid = -1 | |
for pid in sessionPlayerStatsMap: | |
if pid > highestPid: | |
highestPid = pid | |
playerConnectionOrderIterator = highestPid + 1 | |
print 'Reset orderiterator to %d based on highest pid kept' % playerConnectionOrderIterator | |
for p in bf2.playerManager.getPlayers(): | |
onPlayerConnect(p) | |
roundArmies[1] = getArmy(bf2.gameLogic.getTeamName(1)) | |
roundArmies[2] = getArmy(bf2.gameLogic.getTeamName(2)) | |
host.registerHandler('PlayerKilled', onPlayerKilled) | |
host.registerHandler('PlayerDeath', onPlayerDeath) | |
host.registerHandler('EnterVehicle', onEnterVehicle) | |
host.registerHandler('ExitVehicle', onExitVehicle) | |
host.registerHandler('PickupKit', onPickupKit) | |
host.registerHandler('DropKit', onDropKit) | |
host.registerHandler('PlayerChangedSquad', onPlayerChangedSquad) | |
host.registerHandler('ChangedCommander', onChangedCommander) | |
host.registerHandler('ChangedSquadLeader', onChangedSquadLeader) | |
host.registerHandler('PlayerChangeWeapon', onPlayerChangeWeapon) | |
host.registerHandler('PlayerBanned', onPlayerBanned) | |
host.registerHandler('PlayerKicked', onPlayerKicked) | |
host.registerHandler('PlayerSpawn', onPlayerSpawn) | |
host.registerHandler('DeployGrapplingHook', onDeployGrapplingHook) | |
host.registerHandler('DeployZipLine', onDeployZipLine) | |
host.registerHandler('DeployTactical', onDeployTactical) | |
for s in sessionPlayerStatsMap.itervalues(): | |
s.reset() | |
for p in bf2.playerManager.getPlayers(): | |
p.stats.reinit(p) | |
p.stats.wasHereAtStart = 1 | |
bf2.playerManager.enableScoreEvents() | |
setSendEndOfRoundStats(True) | |
elif status == bf2.GameStatus.EndGame: | |
for p in bf2.playerManager.getPlayers(): | |
p.stats.wasHereAtEnd = 1 | |
finalizePlayer(p) | |
if getSendEndOfRoundStats(): | |
setSendEndOfRoundStats(False) | |
bf2.bf2hub.stats.endofround.invoke() | |
if not host.ss_getParam('ranked'): | |
playerConnectionOrderIterator = 0 | |
sessionPlayerStatsMap.clear() | |
if host.ss_getParam('gameMode') == 'gpm_coop' or host.ss_getParam('gameMode') == 'sp1': | |
for p in bf2.playerManager.getPlayers(): | |
if not p.isAIPlayer(): | |
onPlayerConnect(p) | |
def onReset(data): | |
for s in sessionPlayerStatsMap.itervalues(): | |
s.reset() | |
for p in bf2.playerManager.getPlayers(): | |
p.stats.reinit(p) | |
p.stats.wasHereAtStart = 1 | |
class PlayerStat: | |
__module__ = __name__ | |
def __init__(self, player): | |
self.profileId = player.getProfileId() | |
self.playerId = player.index | |
self.id = self.playerId | |
self.connectionOrderNr = 0 | |
self.rank = 0 | |
self.reinit(player) | |
self.reset() | |
def reinit(self, player): | |
self.name = player.getName() | |
self.ipaddr = player.getAddress() | |
self.localScore = player.score | |
def reset(self): | |
self.connectAt = date() | |
self.timeOnLine = 0 | |
self.score = 0 | |
self.cmdScore = 0 | |
self.teamScore = 0 | |
self.skillScore = 0 | |
self.kills = 0 | |
self.teamkills = 0 | |
self.deaths = 0 | |
self.vehicles = {} | |
for v in range(0, NUM_VEHICLE_TYPES + 1): | |
if not v in self.vehicles: | |
self.vehicles[v] = VehicleStat(v) | |
else: | |
self.vehicles[v].reset() | |
self.weapons = {} | |
for w in range(0, NUM_WEAPON_TYPES + 1): | |
if not w in self.weapons: | |
self.weapons[w] = WeaponStat(w) | |
else: | |
self.weapons[w].reset() | |
self.kits = {} | |
for k in range(0, NUM_KIT_TYPES + 1): | |
if not k in self.kits: | |
self.kits[k] = KitStat(k) | |
else: | |
self.kits[k].reset() | |
self.killedByPlayer = {} | |
self.killedPlayer = {} | |
self.team = 0 | |
self.localScore.reset() | |
self.bulletsFired = 0 | |
self.bulletsHit = 0 | |
self.currentKillStreak = 0 | |
self.longestKillStreak = 0 | |
self.currentDeathStreak = 0 | |
self.longestDeathStreak = 0 | |
self.wasHereAtStart = 0 | |
self.wasHereAtEnd = 0 | |
self.complete = 0 | |
self.medals = None | |
self.spawnedTeam = 3 | |
self.spawnedAt = 0 | |
self.becameCmdAt = 0 | |
self.becameSqlAt = 0 | |
self.joinedSquadAt = 0 | |
self.rawTimePlayed = 0 | |
self.rawTimeAsCmd = 0 | |
self.rawTimeAsSql = 0 | |
self.rawTimeInSquad = 0 | |
self.timesBanned = 0 | |
self.timesKicked = 0 | |
self.timeAsArmy = {} | |
for a in range(0, NUM_ARMIES + 1): | |
self.timeAsArmy[a] = 0 | |
self.currentWeaponType = NUM_WEAPON_TYPES | |
self.lastWeaponType = NUM_WEAPON_TYPES | |
self.lastVehicleType = NUM_VEHICLE_TYPES | |
return | |
def __getattr__(self, name): | |
if name in self.__dict__: | |
return self.__dict__[name] | |
elif name == 'timePlayed': | |
if self.spawnedAt: | |
timeDiff = date() - self.spawnedAt | |
self.rawTimePlayed += timeDiff | |
self.timeAsArmy[roundArmies[self.spawnedTeam]] += timeDiff | |
self.spawnedAt = date() | |
return self.rawTimePlayed | |
elif name == 'timeAsCmd': | |
if self.becameCmdAt: | |
self.rawTimeAsCmd += date() - self.becameCmdAt | |
self.becameCmdAt = date() | |
return self.rawTimeAsCmd | |
elif name == 'timeAsSql': | |
if self.becameSqlAt: | |
self.rawTimeAsSql += date() - self.becameSqlAt | |
self.becameSqlAt = date() | |
return self.rawTimeAsSql | |
elif name == 'timeInSquad': | |
if self.joinedSquadAt: | |
self.rawTimeInSquad += date() - self.joinedSquadAt | |
self.joinedSquadAt = date() | |
return self.rawTimeInSquad | |
elif name == 'accuracy': | |
if self.bulletsFired == 0: | |
return 0 | |
else: | |
return 1.0 * self.bulletsHit / self.bulletsFired | |
else: | |
raise AttributeError, name | |
def reconnect(self, player): | |
self.connectAt = date() | |
self.ipaddr = player.getAddress() | |
bf2.playerManager.disableScoreEvents() | |
print 'Reattaching score object from old dead player %d to new player %d' % (self.localScore.index, player.index) | |
player.score = self.localScore | |
player.score.index = player.index | |
player.score.score = self.score | |
player.score.cmdScore = self.cmdScore | |
player.score.rplScore = self.teamScore | |
player.score.skillScore = self.skillScore | |
player.score.kills = self.kills | |
player.score.TKs = self.teamkills | |
player.score.deaths = self.deaths | |
player.score.rank = self.rank | |
bf2.playerManager.enableScoreEvents() | |
def finalize(self, player): | |
self.copyPlayerData(player) | |
if self.currentWeaponType != NUM_WEAPON_TYPES: | |
self.weapons[self.currentWeaponType].exit(player) | |
self.currentWeaponType = NUM_WEAPON_TYPES | |
stopSpawned(player) | |
stopInSquad(player) | |
stopAsSql(player) | |
stopAsCmd(player) | |
if self.wasHereAtStart == 1 and self.wasHereAtEnd == 1: | |
self.complete = 1 | |
collectBulletsFired(player) | |
finalizeBulletsFired(player) | |
for v in player.stats.vehicles.itervalues(): | |
if v.enterAt != 0: | |
v.exit(player) | |
for v in player.stats.kits.itervalues(): | |
if v.enterAt != 0: | |
v.exit(player) | |
for v in player.stats.weapons.itervalues(): | |
if v.enterAt != 0: | |
v.exit(player) | |
def copyPlayerData(self, player): | |
self.timeOnLine += date() - self.connectAt | |
self.localScore = player.score | |
self.score = player.score.score | |
self.cmdScore = player.score.cmdScore | |
self.teamScore = player.score.rplScore | |
self.skillScore = player.score.skillScore | |
if self.score < 0: | |
self.score = 0 | |
if self.cmdScore < 0: | |
self.cmdScore = 0 | |
if self.teamScore < 0: | |
self.teamScore = 0 | |
if self.skillScore < 0: | |
self.skillScore = 0 | |
self.kills = player.score.kills | |
self.teamkills = player.score.TKs | |
self.deaths = player.score.deaths | |
self.rank = player.score.rank | |
self.army = roundArmies[player.getTeam()] | |
self.team = player.getTeam() | |
if host.ss_getParam('ranked'): | |
if hasattr(player, 'medals'): | |
self.medals = player.medals | |
elif g_debug: | |
print 'Player had no medal stats. pid=', player.index | |
class ObjectStat: | |
__module__ = __name__ | |
def __init__(self, type): | |
self.reset() | |
self.type = type | |
def reset(self): | |
self.kills = 0 | |
self.killedBy = 0 | |
self.rawTimeInObject = 0 | |
self.deaths = 0 | |
self.score = 0 | |
self.bulletsFired = 0 | |
self.bulletsFiredTemp = 0 | |
self.bulletsHit = 0 | |
self.bulletsHitTemp = 0 | |
self.enterAt = 0 | |
self.enterScore = 0 | |
self.deployed = 0 | |
def enter(self, player): | |
self.enterAt = date() | |
self.enterScore = player.score.score | |
def exit(self, player): | |
if self.enterAt == 0: | |
return | |
time = self.timeInObject | |
self.enterAt = 0 | |
self.score += player.score.score - self.enterScore | |
self.enterScore = 0 | |
def __getattr__(self, name): | |
if name in self.__dict__: | |
return self.__dict__[name] | |
elif name == 'timeInObject' or name == 'rtime': | |
if self.enterAt: | |
self.rawTimeInObject += date() - self.enterAt | |
self.enterAt = date() | |
return self.rawTimeInObject | |
elif name == 'accuracy': | |
if self.bulletsFired == 0: | |
return 0 | |
else: | |
return 1.0 * self.bulletsHit / self.bulletsFired | |
else: | |
raise AttributeError, name | |
class VehicleStat(ObjectStat): | |
__module__ = __name__ | |
def __init__(self, type): | |
ObjectStat.__init__(self, type) | |
self.reset() | |
def reset(self): | |
ObjectStat.reset(self) | |
self.roadKills = 0 | |
class KitStat(ObjectStat): | |
__module__ = __name__ | |
def __init__(self, type): | |
ObjectStat.__init__(self, type) | |
self.reset() | |
def reset(self): | |
ObjectStat.reset(self) | |
class WeaponStat(ObjectStat): | |
__module__ = __name__ | |
def __init__(self, type): | |
ObjectStat.__init__(self, type) | |
self.reset() | |
def reset(self): | |
ObjectStat.reset(self) | |
def enter(self, player): | |
if player.stats.currentWeaponType != NUM_WEAPON_TYPES: | |
player.stats.weapons[player.stats.currentWeaponType].exit(player) | |
player.stats.currentWeaponType = self.type | |
ObjectStat.enter(self, player) | |
def exit(self, player): | |
time = date() - self.enterAt | |
ObjectStat.exit(self, player) | |
def date(): | |
return host.timer_getWallTime() | |
def finalizePlayer(player): | |
player.stats.finalize(player) | |
def onPlayerConnect(player): | |
global playerConnectionOrderIterator | |
player.stats = None | |
connectingProfileId = player.getProfileId() | |
for stats in sessionPlayerStatsMap.itervalues(): | |
if connectingProfileId > 0 and connectingProfileId == stats.profileId: | |
print 'Found old player record, profileId ', stats.profileId | |
player.stats = stats | |
player.stats.reconnect(player) | |
if not player.stats: | |
print 'Creating new record for player profileId ', connectingProfileId | |
id = playerConnectionOrderIterator | |
newPlayerStats = PlayerStat(player) | |
sessionPlayerStatsMap[id] = newPlayerStats | |
player.stats = sessionPlayerStatsMap[id] | |
player.stats.connectionOrderNr = playerConnectionOrderIterator | |
playerConnectionOrderIterator += 1 | |
player.score.rank = player.stats.rank | |
return | |
def onPlayerDisconnect(player): | |
finalizePlayer(player) | |
def onDeployGrapplingHook(player): | |
if player == None: | |
return | |
if g_debug: | |
print 'PYTHONSCRIPT: Deployed Grappling hook' | |
player.stats.weapons[WEAPON_TYPE_GRAPPLINGHOOK].deployed += 1 | |
return | |
return | |
def onDeployZipLine(player): | |
if player == None: | |
return | |
if g_debug: | |
print 'PYTHONSCRIPT: Deployed Zipline' | |
player.stats.weapons[WEAPON_TYPE_ZIPLINE].deployed += 1 | |
return | |
return | |
def onDeployTactical(player): | |
if player == None: | |
return | |
if g_debug: | |
print 'PYTHONSCRIPT: Deployed Tactical' | |
player.stats.weapons[WEAPON_TYPE_TACTICAL].deployed += 1 | |
return | |
return | |
def onEnterVehicle(player, vehicle, freeSoldier=False): | |
if player == None: | |
return | |
vehicleType = getVehicleType(vehicle.templateName) | |
if vehicleType != VEHICLE_TYPE_SOLDIER: | |
rootVehicle = bf2.objectManager.getRootParent(vehicle) | |
vehicleType = getVehicleType(rootVehicle.templateName) | |
else: | |
rootVehicle = vehicle | |
if vehicleType != VEHICLE_TYPE_SOLDIER: | |
for w in player.stats.weapons.itervalues(): | |
w.exit(player) | |
weapon = player.getPrimaryWeapon() | |
if weapon: | |
weaponType = getWeaponType(weapon.templateName) | |
player.stats.weapons[weaponType].enter(player) | |
if not vehicleType in player.stats.vehicles: | |
player.stats.vehicles[vehicleType] = VehicleStat() | |
player.stats.vehicles[vehicleType].enter(player) | |
if vehicleType != VEHICLE_TYPE_UNKNOWN: | |
player.stats.lastVehicleType = vehicleType | |
weapon = player.getPrimaryWeapon() | |
if weapon: | |
player.stats.lastWeaponType = getWeaponType(weapon.templateName) | |
collectBulletsFired(player) | |
return | |
def onExitVehicle(player, vehicle): | |
vehicleType = getVehicleType(vehicle.templateName) | |
if vehicleType != VEHICLE_TYPE_SOLDIER: | |
rootVehicle = bf2.objectManager.getRootParent(vehicle) | |
vehicleType = getVehicleType(rootVehicle.templateName) | |
if rootVehicle == vehicle: | |
vehicle.lastDrivingPlayerIndex = player.index | |
else: | |
rootVehicle = vehicle | |
weapon = player.getPrimaryWeapon() | |
if weapon: | |
weaponType = getWeaponType(weapon.templateName) | |
player.stats.weapons[weaponType].enter(player) | |
player.stats.vehicles[vehicleType].exit(player) | |
weapon = player.getPrimaryWeapon() | |
if weapon: | |
player.stats.lastWeaponType = getWeaponType(weapon.templateName) | |
collectBulletsFired(player) | |
def onPlayerSpawn(player, soldier): | |
startSpawned(player) | |
if player.getSquadId() != 0: | |
startInSquad(player) | |
if player.isSquadLeader(): | |
startAsSql(player) | |
if player.isCommander(): | |
startAsCmd(player) | |
onEnterVehicle(player, soldier) | |
player.soldier = soldier | |
def onPickupKit(player, kit): | |
kitType = getKitType(kit.templateName) | |
if not kitType in player.stats.kits: | |
player.stats.kits[kitType] = KitStat() | |
player.stats.kits[kitType].enter(player) | |
player.stats.lastKitType = kitType | |
weapon = player.getPrimaryWeapon() | |
if weapon: | |
player.stats.lastWeaponType = getWeaponType(weapon.templateName) | |
def onDropKit(player, kit): | |
kitType = getKitType(kit.templateName) | |
player.stats.kits[kitType].exit(player) | |
for w in player.stats.weapons.itervalues(): | |
w.exit(player) | |
collectBulletsFired(player) | |
def onPlayerChangeWeapon(player, oldWeapon, newWeapon): | |
if oldWeapon: | |
oldWeaponType = getWeaponType(oldWeapon.templateName) | |
player.stats.weapons[oldWeaponType].exit(player) | |
if newWeapon: | |
newWeaponType = getWeaponType(newWeapon.templateName) | |
player.stats.weapons[newWeaponType].enter(player) | |
player.stats.lastWeaponType = newWeaponType | |
def onPlayerKilled(victim, attacker, weapon, assists, object): | |
killedByEmptyVehicle = False | |
if attacker == None and weapon == None and object != None: | |
if hasattr(object, 'lastDrivingPlayerIndex'): | |
attacker = bf2.playerManager.getPlayerByIndex(object.lastDrivingPlayerIndex) | |
killedByEmptyVehicle = True | |
if attacker != None: | |
if attacker.getTeam() != victim.getTeam(): | |
attacker.stats.currentKillStreak += 1 | |
if attacker.stats.currentKillStreak > attacker.stats.longestKillStreak: | |
attacker.stats.longestKillStreak = attacker.stats.currentKillStreak | |
attacker.stats.currentDeathStreak = 0 | |
if attacker != None: | |
if not victim.stats.connectionOrderNr in attacker.stats.killedPlayer: | |
attacker.stats.killedPlayer[victim.stats.connectionOrderNr] = 0 | |
attacker.stats.killedPlayer[victim.stats.connectionOrderNr] += 1 | |
if not attacker.stats.connectionOrderNr in victim.stats.killedByPlayer: | |
victim.stats.killedByPlayer[attacker.stats.connectionOrderNr] = 0 | |
victim.stats.killedByPlayer[attacker.stats.connectionOrderNr] += 1 | |
if weapon != None: | |
weaponType = getWeaponType(weapon.templateName) | |
if attacker != None: | |
attacker.stats.weapons[weaponType].kills += 1 | |
if victim != None: | |
victim.stats.weapons[weaponType].killedBy += 1 | |
vehicleType = None | |
if killedByEmptyVehicle: | |
vehicleType = getVehicleType(object.templateName) | |
else: | |
vehicle = attacker.getVehicle() | |
vehicleType = getVehicleType(vehicle.templateName) | |
if vehicleType != VEHICLE_TYPE_SOLDIER: | |
rootVehicle = bf2.objectManager.getRootParent(vehicle) | |
if rootVehicle != None: | |
vehicleType = getVehicleType(rootVehicle.templateName) | |
if vehicleType != None: | |
if attacker != None: | |
attacker.stats.vehicles[vehicleType].kills += 1 | |
if victim != None: | |
victim.stats.vehicles[vehicleType].killedBy += 1 | |
if weapon == None and object != None: | |
attacker.stats.vehicles[vehicleType].roadKills += 1 | |
if attacker != None: | |
kit = attacker.getKit() | |
if kit != None: | |
kitTemplateName = kit.templateName | |
kitType = getKitType(kitTemplateName) | |
elif hasattr(attacker, 'lastKitType'): | |
kitType = attacker.lastKitType | |
else: | |
return | |
attacker.stats.kits[kitType].kills += 1 | |
collectBulletsFired(attacker) | |
return | |
def onPlayerDeath(victim, vehicle): | |
rootVehicle = bf2.objectManager.getRootParent(vehicle) | |
vehicleType = getVehicleType(rootVehicle.templateName) | |
stopSpawned(victim) | |
stopInSquad(victim) | |
stopAsSql(victim) | |
stopAsCmd(victim) | |
onExitVehicle(victim, victim.soldier) | |
finalizeBulletsFired(victim) | |
clearBulletsFired(victim) | |
victim.stats.currentDeathStreak += 1 | |
if victim.stats.currentDeathStreak > victim.stats.longestDeathStreak: | |
victim.stats.longestDeathStreak = victim.stats.currentDeathStreak | |
victim.stats.currentKillStreak = 0 | |
victim.stats.vehicles[vehicleType].deaths += 1 | |
victim.stats.kits[victim.stats.lastKitType].deaths += 1 | |
victim.stats.weapons[victim.stats.lastWeaponType].deaths += 1 | |
def collectBulletsFired(player): | |
if player == None: | |
return | |
bulletsFired = player.score.bulletsFired | |
totBulletsFired = 0 | |
kitBulletsFired = 0 | |
for b in bulletsFired: | |
templateName = b[0] | |
nr = b[1] | |
weaponType = getWeaponType(templateName) | |
player.stats.weapons[weaponType].bulletsFiredTemp = nr | |
totBulletsFired += nr | |
if weaponType != WEAPON_TYPE_UNKNOWN: | |
kitBulletsFired += nr | |
bulletsHit = player.score.bulletsGivingDamage | |
totBulletsHit = 0 | |
kitBulletsHit = 0 | |
for b in bulletsHit: | |
templateName = b[0] | |
nr = b[1] | |
weaponType = getWeaponType(templateName) | |
player.stats.weapons[weaponType].bulletsHitTemp = nr | |
totBulletsHit += nr | |
if weaponType != WEAPON_TYPE_UNKNOWN: | |
kitBulletsHit += nr | |
kit = player.getKit() | |
if kit != None: | |
kitType = getKitType(kit.templateName) | |
player.stats.kits[kitType].bulletsFiredTemp = kitBulletsFired | |
player.stats.kits[kitType].bulletsHitTemp = kitBulletsHit | |
vehicle = player.getVehicle() | |
if vehicle != None: | |
rootVehicle = bf2.objectManager.getRootParent(vehicle) | |
vehicleType = getVehicleType(rootVehicle.templateName) | |
player.stats.vehicles[vehicleType].bulletsFiredTemp = totBulletsFired | |
player.stats.vehicles[vehicleType].bulletsHitTemp = totBulletsHit | |
return | |
def clearBulletsFired(player): | |
bulletsFired = player.score.bulletsFiredAndClear | |
bulletsHit = player.score.bulletsGivingDamageAndClear | |
def finalizeBulletsFired(player): | |
for v in player.stats.vehicles.itervalues(): | |
v.bulletsFired += v.bulletsFiredTemp | |
v.bulletsHit += v.bulletsHitTemp | |
v.bulletsFiredTemp = 0 | |
v.bulletsHitTemp = 0 | |
for w in player.stats.weapons.itervalues(): | |
w.bulletsFired += w.bulletsFiredTemp | |
w.bulletsHit += w.bulletsHitTemp | |
player.stats.bulletsFired += w.bulletsFiredTemp | |
player.stats.bulletsHit += w.bulletsHitTemp | |
w.bulletsFiredTemp = 0 | |
w.bulletsHitTemp = 0 | |
for k in player.stats.kits.itervalues(): | |
k.bulletsFired += k.bulletsFiredTemp | |
k.bulletsHit += k.bulletsHitTemp | |
k.bulletsFiredTemp = 0 | |
k.bulletsHitTemp = 0 | |
def startSpawned(player): | |
player.stats.spawnedAt = date() | |
player.stats.spawnedTeam = player.getTeam() | |
def startInSquad(player): | |
player.stats.joinedSquadAt = date() | |
def startAsSql(player): | |
player.stats.becameSqlAt = date() | |
def startAsCmd(player): | |
player.stats.becameCmdAt = date() | |
def stopSpawned(player): | |
time = player.stats.timePlayed | |
player.stats.spawnedAt = 0 | |
player.stats.spawnedTeam = 3 | |
def stopInSquad(player): | |
time = player.stats.timeInSquad | |
player.stats.joinedSquadAt = 0 | |
def stopAsSql(player): | |
time = player.stats.timeAsSql | |
player.stats.becameSqlAt = 0 | |
def stopAsCmd(player): | |
time = player.stats.timeAsCmd | |
player.stats.becameCmdAt = 0 | |
def onChangedCommander(team, oldCmd, newCmd): | |
if newCmd and newCmd.stats.spawnedAt != 0: | |
startAsCmd(newCmd) | |
if oldCmd: | |
stopAsCmd(oldCmd) | |
def onChangedSquadLeader(squad, oldSql, newSql): | |
if newSql and newSql.stats.spawnedAt != 0: | |
startAsSql(newSql) | |
if oldSql: | |
stopAsSql(oldSql) | |
def onPlayerChangedSquad(player, oldSquad, newSquad): | |
if oldSquad == newSquad: | |
return | |
if player.stats.spawnedAt == 0: | |
return | |
if oldSquad == 0: | |
startInSquad(player) | |
if newSquad == 0: | |
stopAsSql(player) | |
stopInSquad(player) | |
def onPlayerBanned(player, time, type): | |
if type == 2: | |
return | |
player.stats.timesBanned += 1 | |
def onPlayerKicked(player): | |
player.stats.timesKicked += 1 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# uncompyle6 version 3.9.3.dev0 | |
# Python bytecode version base 2.3 (62011) | |
# Decompiled from: Python 3.8.10 (default, Jul 29 2024, 17:02:10) | |
# [GCC 9.4.0] | |
# Embedded file name: /tmp/bf2c/bf2hub/stats/unlocks.py | |
# Compiled at: 2014-09-17 23:37:34 | |
import host, bf2.PlayerManager | |
from bf2.bf2hub.stats.constants import * | |
from bf2 import g_debug | |
unlockItemMap = {11: 0, 22: 1, 33: 2, 44: 3, 55: 4, 66: 5, 77: 6, 88: 1, 99: 2, 111: 3, 222: 4, 333: 5, 444: 0, 555: 6} | |
sessionPlayerUnlockMap = {} | |
def init(): | |
host.registerHandler('PlayerConnect', onPlayerConnect, 1) | |
if bf2.serverSettings.getUseGlobalUnlocks(): | |
host.registerHandler('PlayerUnlocksResponse', onUnlocksResponse, 1) | |
for p in bf2.playerManager.getPlayers(): | |
onPlayerConnect(p) | |
if g_debug: | |
print '(BF2Hub) Unlock module initialized' | |
class UnlockSet: | |
__module__ = __name__ | |
def onPlayerConnect(player): | |
defaultUnlocks = [ | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] | |
host.pers_plrSetUnlocks(player.index, defaultUnlocks, defaultUnlocks) | |
if not player.isAIPlayer(): | |
id = player.index | |
reconnect = id in sessionPlayerUnlockMap | |
if reconnect: | |
del sessionPlayerUnlockMap[id] | |
newUnlockSet = UnlockSet() | |
newUnlockSet.unlockLevel = {} | |
for i in range(0, NUM_KIT_TYPES): | |
newUnlockSet.unlockLevel[i] = 0 | |
sessionPlayerUnlockMap[id] = newUnlockSet | |
player.unlocks = sessionPlayerUnlockMap[id] | |
if bf2.serverSettings.getUseGlobalUnlocks(): | |
if player.getProfileId() > 2000: | |
success = host.pers_plrRequestUnlocks(player.index, 1) | |
if not success: | |
if g_debug: | |
print 'Failed requesting unlocks' | |
elif g_debug: | |
print "Player %d had no profile id, can't request unlocks" % player.index | |
if g_debug: | |
print 'Added player %d to unlock checking' % player.index | |
def onUnlocksResponse(succeeded, player, unlocks): | |
if not succeeded: | |
print 'Unlocks request failed for player %d %d: %s' % (player.index, player.getName(), unlocks) | |
return | |
kitUnlocks = [ | |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] | |
for item in unlocks: | |
if item in unlockItemMap: | |
kitUnlocks[unlockItemMap[item]] = 1 | |
if g_debug: | |
print 'Kit unlocks: ', kitUnlocks | |
host.pers_plrSetUnlocks(player.index, kitUnlocks, kitUnlocks) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment