Skip to content

Instantly share code, notes, and snippets.

@cetteup
Last active September 5, 2024 19:13
Show Gist options
  • Save cetteup/bd1bc8f674eff40df66cf6f70c92067c to your computer and use it in GitHub Desktop.
Save cetteup/bd1bc8f674eff40df66cf6f70c92067c to your computer and use it in GitHub Desktop.
BF2Hub stats Python ("decompiled" source code)
# 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
# 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
# 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
# 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'
# 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
# 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'))))
# 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'))))
# 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)
# 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
# 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
# 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
# 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