from es import AddonInfo, ServerVar, addons, getplayerhandle, getplayerprop, getplayersteamid, getplayername, getplayerlocation, getuserid, doblock
from repeat import create as repeat_create
from usermsg import keyhint
from playerlib import getUseridList
from cfglib import AddonCFG
class PlayerInfo(object):
def __init__(self, userid):
self.userid = int(userid)
self.name = getplayername(self.userid)
self.steamid = getplayersteamid(self.userid)
self.resetAttributes()
def resetAttributes(self):
self.kills = 0
self.shots = 0
self.headshots = 0
self.knife_kills = 0
self.jumps = 0
self.max_speed = 0
self.walked_distance = 0
self._old_location = None
def calculateDistance(self):
new_location = getplayerlocation(self.userid)
if not self._old_location:
self._old_location = new_location
return
if new_location == self._old_location:
return
self.walked_distance += getDistance(self._old_location, new_location)
self._old_location = new_location
def getSpeed(self):
self._x = getplayerprop(self.userid,'CBasePlayer.localdata.m_vecVelocity[0]')
self._y = getplayerprop(self.userid,'CBasePlayer.localdata.m_vecVelocity[1]')
self._z = getplayerprop(self.userid,'CBasePlayer.localdata.m_vecVelocity[2]')
self._speed = int(round((self._x*self._x + self._y*self._y + self._z*self._z)**0.5, 2) / float(37) * 1.6)
if self._speed > self.max_speed:
self.max_speed = self._speed
return "%s Km/h" %self._speed
def getSpecs(self):
return getSpecs(self.userid)
def getPlayerInfo(self):
self._player_info_dict = {
"player" : self.name,
"steamid" : self.steamid,
"userid" : self.userid,
"speed" : self.speed,
"max_speed" : "%s Km/h" %self.max_speed,
"walked_distance" : "%s Meters" %round(self.walked_distance, 2),
"specs" : self.specs,
"kills" : self.kills,
"shots" : self.shots,
"headshots" : self.headshots,
"knife_kills" : self.knife_kills,
"jumps" : self.jumps
}
return self._player_info_dict
specs = property(getSpecs)
speed = property(getSpeed)
player_info_dict = property(getPlayerInfo)
info = AddonInfo()
info.name = 'Info Display'
info.version = 1.3
info.basename = 'info_display'
info.url = 'http://addons.eventscripts.com/addons/view/info_display'
info.author = 'Dead Man Walker'
player_info = {}
PLAYER_INFO_ITEMS = [
"player",
"steamid",
"userid",
"speed",
"max_speed",
"walked_distance",
"specs",
"kills",
"shots",
"headshots",
"knife_kills",
"jumps"
]
def load():
global loop_players
createCfg()
doblock('corelib/noisy_on')
loop_players = repeat_create('loop_players', loopPlayers)
loop_players.start(LOOP_INTERVAL, 0)
for userid in getUseridList('#alive'):
player_info[userid] = PlayerInfo(userid)
def unload():
if DISPLAYED_ITEMS:
if "walked_distance" in DISPLAYED_ITEMS:
addons.unregisterTickListener(loopDistance)
loop_players.delete()
doblock('corelib/noisy_off')
def es_map_start(event_var):
if DISPLAYED_ITEMS:
if "walked_distance" in DISPLAYED_ITEMS:
addons.unregisterTickListener(loopDistance)
createCfg()
player_info.clear()
def player_spawn(event_var):
userid = int(event_var['userid'])
player_info[userid] = PlayerInfo(userid)
def round_start(event_var):
for inst in player_info.values():
inst.resetAttributes()
def weapon_fire(event_var):
if event_var['weapon'] != "knife":
userid = int(event_var['userid'])
player_info[userid].shots += 1
def player_hurt(event_var):
victim = int(event_var['userid'])
attacker = int(event_var['attacker'])
from es import msg
if attacker not in (victim, 0) and getplayerprop(victim, "CCSPlayer.baseclass.pl.deadflag"):
player_info[attacker].kills += 1
if event_var['hitgroup'] == '1':
player_info[attacker].headshots += 1
if event_var['weapon'] == 'knife':
player_info[attacker].knife_kills += 1
def player_jump(event_var):
userid = int(event_var['userid'])
player_info[userid].jumps += 1
def player_changename(event_var):
player_info[int(event_var['userid'])].name = event_var['newname']
def getDistance(loc1, loc2):
return (sum((loc1[x] - loc2[x]) ** 2 for x in xrange(3)) ** 0.5)* 0.0254
def getSpec(index):
for userid in filter(lambda temp: not getplayerprop(temp, "CCSPlayer.baseclass.pl.deadflag"), getUseridList('#all')):
if getplayerhandle(userid) == index:
return userid
return -1
def getSpecs(player):
specs = set()
for userid in getUseridList('#human,#dead'):
if getplayerprop(userid, 'CBasePlayer.m_hObserverTarget'):
speced_userid = getuserid(getplayerprop(userid, 'CBasePlayer.m_hObserverTarget'))
if player == speced_userid:
specs.add(getplayername(userid))
specs_str = ""
for name in specs:
specs_str += "\n - " + name
if not specs_str:
specs_str = 0
return specs_str
def display(display_player, player):
if not DISPLAYED_ITEMS:
return
if player not in player_info:
return
player_info_string = ""
for item in DISPLAYED_ITEMS:
player_info_string += '\n%s: %s' %(item.replace('_', ' ').capitalize(), player_info[player].player_info_dict[item])
keyhint(display_player, player_info_string)
def loopPlayers():
userid_list = getUseridList('#all')
if not userid_list:
return
for player in userid_list:
if getplayerprop(player, "CCSPlayer.baseclass.pl.deadflag"):
target = getSpec(getplayerprop(player, 'CBasePlayer.m_hObserverTarget'))
if target == -1:
continue
display(player, target)
else:
display(player, player)
def loopDistance():
for inst in player_info.values():
inst.calculateDistance()
def createCfg():
global LOOP_INTERVAL, DISPLAYED_ITEMS
LOOP_INTERVAL = 0.1
cfg = AddonCFG(ServerVar('eventscripts_gamedir') + "/cfg/" + info.basename + ".cfg")
cfg.text("*****************************************************************")
cfg.text("*** Info Display Config")
cfg.text("*****************************************************************")
cfg.text(' ')
CFG_DISPLAYED_ITEMS = str(cfg.cvar('displayed_items', "", 'Type in the chosen items of the list below in the order at which they will be displayed. Seperate with a semicolon (;)'))
LOOP_INTERVAL = float(cfg.cvar('loop_interval', 0.2, 'Interval to refresh the display'))
cfg.text(' ')
cfg.text('List of items:')
for item in PLAYER_INFO_ITEMS:
cfg.text('-' + item)
cfg.write()
cfg.execute()
if CFG_DISPLAYED_ITEMS.strip():
DISPLAYED_ITEMS = CFG_DISPLAYED_ITEMS.strip().split(';')
for item in DISPLAYED_ITEMS:
if not item:
DISPLAYED_ITEMS.remove(item)
continue
if item not in PLAYER_INFO_ITEMS:
DISPLAYED_ITEMS.remove(item)
if "walked_distance" in DISPLAYED_ITEMS:
addons.registerTickListener(loopDistance)
else:
DISPLAYED_ITEMS = False