Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ./addons/eventscripts/ctclasses/ctclasses.py
- import cfglib
- import cmdlib
- import es
- import playerlib
- import weaponlib
- from cheappopup import *
- from itertools import *
- from path import path
- from time import time
- info = es.AddonInfo()
- info.name = 'CTClasses'
- info.basename = 'ctclasses'
- info.author = 'SuperDave'
- popup = CheapPopup()
- addonpath = path(es.getAddonPath(info.basename))
- ###
- cfg = cfglib.AddonCFG(addonpath.joinpath(info.basename + '.cfg'))
- cfg.text(info.name + ' options')
- cfg.text('\n')
- cfg.text('*** Mercenary ***')
- cvar_mercenary_speed = cfg.cvar(info.basename + '_mercenary_speed', 1.1, 'Speed multiplier of mercenary class')
- cvar_mercenary_damage = cfg.cvar(info.basename + '_mercenary_damage', 1.2, 'Damage multiplier of mercenary class')
- cvar_mercenary_damage_weapons = cfg.cvar(info.basename + '_mercenary_damage', 'ak47,m4a1', 'Weapons affected by mercenary damage multiplier separated by a comma')
- cvar_mercenary_skin = cfg.cvar(info.basename + '_mercenary_skin', 'models/player/slow/hl2/combine_super_soldier/slow.mdl', 'Skin of mercenary class')
- cfg.text('\n')
- cfg.text('*** Medic ***')
- cvar_medic_speed = cfg.cvar(info.basename + '_medic_speed', 1.2, 'Speed multiplier of medic class')
- cvar_medic_heal = cfg.cvar(info.basename + '_medic_heal', 10, 'HP medics heal per !heal use')
- cvar_medic_heal_range = cfg.cvar(info.basename + '_medic_heal_range', 750, 'Range of !heal command')
- cvar_medic_heal_delay = cfg.cvar(info.basename + '_medic_heal_delay', 5, 'Number of seconds players must wait between !heal commands')
- cvar_medic_skin = cfg.cvar(info.basename + '_medic_skin', 'models/player/slow/hl2/medic_male/slow.mdl', 'Skin of medic class')
- cfg.text('\n')
- cfg.text('*** Sniper ***')
- cvar_sniper_health = cfg.cvar(info.basename + '_sniper_health', 125, 'Starting health of sniper class')
- cvar_sniper_damage = cfg.cvar(info.basename + '_sniper_damage', 1.4, 'Damage multiplier of sniper class')
- cvar_sniper_damage_weapons = cfg.cvar(info.basename + '_sniper_damage', 'awp,scout', 'Weapons affected by sniper damage multiplier separated by a comma')
- cvar_sniper_skin = cfg.cvar(info.basename + '_sniper_skin', 'models\player\csctm_stalker_exo\duty.mdl', 'Skin of sniper class')
- cfg.text('\n')
- cfg.text('*** Support ***')
- cvar_support_ammo_range = cfg.cvar(info.basename + '_support_ammo_range', 1250, 'Range of !ammo command')
- cvar_support_ammo_delay = cfg.cvar(info.basename + '_support_ammo_delay', 5, 'Number of seconds players must wait between !ammo commands')
- cvar_support_damage = cfg.cvar(info.basename + '_support_damage', 1.6, 'Damage multiplier of support class')
- cvar_support_damage_weapons = cfg.cvar(info.basename + '_support_damage', 'p90', 'Weapons affected by support damage multiplier separated by a comma')
- cvar_support_skin = cfg.cvar(info.basename + '_support_skin', 'models\player\csctm_stalker_exo\monolith.mdl', 'Skin of support class')
- cfg.write()
- cfg.execute()
- ###
- class PlayerClass(object):
- classweapons = ()
- classname = 'Default'
- newclass = None
- lastuse = 0
- def __init__(self, userid):
- self.userid = userid
- def playerSpawn(self):
- es.tell(self.userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a class')
- def playerDamage(self, weapon, victim, damage):
- pass
- def healCommand(self):
- userid = self.userid
- es.tell(userid, '#multi', '#defaultYou must be the #lightgreenmedic#default class to use the #lightgreen!heal#default command')
- es.tell(userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a class')
- def ammoCommand(self):
- userid = self.userid
- es.tell(userid, '#multi', '#defaultYou must be the #lightgreensupport#default class to use the #lightgreen!ammo#default command')
- es.tell(userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a class')
- def applyDamage(self, amount, weapon, victim):
- es.fire(victim, '!self', 'addoutput', 'targetname damagevictim')
- index = es.createentity('point_hurt') # Create the entity
- es.entitysetvalue(index, 'DamageTarget', 'damagevictim') # Damage our victim
- es.entitysetvalue(index, 'DamageType', 32) # Default (fall) damage
- es.entitysetvalue(index, 'Damage', int(amount)) # Damage to inflict
- es.entitysetvalue(index, 'targetname', 'ctclasses_hurt') # Give this entity a unique name
- es.entitysetvalue(index, 'classname', weapon) # Tell CS what type of weapon to credit
- es.spawnentity(index)
- es.fire(self.userid, 'ctclasses_hurt', 'hurt')
- es.fire(self.userid, 'ctclasses_hurt', 'kill')
- es.fire(victim, '!self', 'addoutput', 'targetname none')
- def playersInRange(self, range):
- def isCT(userid):
- return es.getplayerteam(userid) == 3
- def getDistance(pos1, pos2):
- return sum((x - y) ** 2 for x, y in izip(pos1, pos2)) ** 0.5
- locations = dict((userid, es.getplayerlocation(userid)) for userid in ifilter(isCT, es.getUseridList()))
- mylocation = locations[self.userid]
- del locations[self.userid]
- for userid, location in locations.iteritems():
- if getDistance(location, mylocation) <= range:
- yield userid
- @staticmethod
- def getNameList(userids):
- if len(userids) == 1:
- return es.getplayername(userids[0])
- names = sorted(map(es.getplayername, userids))
- return '#default,#lightgreen '.join(names[:len(names) - 1]) + ' #defaultand#lightgreen ' + names[~0]
- #
- class Mercenary(PlayerClass):
- classweapons = map(weaponlib.getWeapon, str(cvar_mercenary_damage_weapons).split(','))
- classname = 'Mercenary'
- def playerSpawn(self):
- userid = self.userid
- player = playerlib.getPlayer(userid)
- player.speed = cvar_mercenary_speed
- skin = str(cvar_mercenary_skin)
- if skin:
- player.model = skin
- es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
- es.tell(userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a new class')
- def playerDamage(self, weapon, victim, damage):
- if weapon in self.classweapons:
- amount = damage * (cvar_mercenary_damage - 1.)
- if amount > 0:
- self.applyDamage(amount, weapon, victim)
- #
- class Medic(PlayerClass):
- classname = 'Medic'
- def playerSpawn(self):
- userid = self.userid
- player = playerlib.getPlayer(userid)
- player.speed = cvar_medic_speed
- skin = str(cvar_medic_skin)
- if skin:
- player.model = skin
- es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
- es.tell(userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a new class')
- es.tell(userid, '#multi', '#defaultSay #lightgreen!heal #defaultto heal your surrounding teammates')
- self.lastuse = 0
- def healCommand(self):
- now = time()
- if now - self.lastuse <= cvar_medic_heal_delay:
- es.tell(self.userid, '#multi', '#defaultYou must wait #lightgreen' + str(cvar_medic_heal_delay) +
- ' seconds#default between uses of the #lightgreen!heal#default command')
- return
- toheal = list(self.playersInRange(cvar_medic_heal_range))
- for userid in toheal:
- player = playerlib.getPlayer(userid)
- player.health = min(100, player.health + 10)
- self.lastuse = now
- if toheal:
- es.tell(userid, '#multi', '#defaultYou healed: #lightgreen' + self.getNameList(toheal))
- #
- class Sniper(PlayerClass):
- classweapons = map(weaponlib.getWeapon, str(cvar_sniper_damage_weapons).split(','))
- classname = 'Sniper'
- def playerSpawn(self):
- userid = self.userid
- player = playerlib.getPlayer(userid)
- player.health = cvar_sniper_health
- skin = str(cvar_sniper_skin)
- if skin:
- player.model = skin
- es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
- es.tell(userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a new class')
- def playerDamage(self, weapon, victim, damage):
- if weapon in self.classweapons:
- amount = damage * (cvar_sniper_damage - 1.)
- if amount > 0:
- self.applyDamage(amount, weapon, victim)
- #
- class Support(PlayerClass):
- classweapons = map(weaponlib.getWeapon, str(cvar_support_damage_weapons).split(','))
- classname = 'Support'
- def playerSpawn(self):
- userid = self.userid
- skin = str(cvar_support_skin)
- if skin:
- playerlib.getPlayer(userid).model = skin
- es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
- es.tell(userid, '#multi', '#defaultSay #lightgreen!class #defaultto choose a new class')
- es.tell(userid, '#multi', '#defaultSay #lightgreen!ammo #defaultto give ammo to your surrounding teammates')
- self.lastuse = 0
- def playerDamage(self, weapon, victim, damage):
- if weapon in self.classweapons:
- amount = damage * (cvar_support_damage - 1.)
- if amount > 0:
- self.applyDamage(amount, weapon, victim)
- def ammoCommand(self):
- now = time()
- if now - self.lastuse <= cvar_support_ammo_delay:
- es.tell(self.userid, '#multi', '#defaultYou must wait #lightgreen' + str(cvar_support_ammo_delay) +
- ' seconds#default between uses of the #lightgreen!ammo#default command')
- return
- forammo = list(self.playersInRange(cvar_support_ammo_range))
- for userid in forammo:
- es.give(userid, 'info_null')
- self.lastuse = now
- if forammo:
- es.tell(userid, '#multi', '#defaultYou game ammo to: #lightgreen' + self.getNameList(forammo))
- ###
- class PlayerDict(dict):
- def __getitem__(self, userid):
- userid = int(userid)
- if userid in self:
- return super(PlayerDict, self).__getitem__(userid)
- x = self[userid] = PlayerClass(userid)
- return x
- def __delitem__(self, userid):
- userid = int(userid)
- if userid in self:
- super(PlayerDict, self).__delitem__(userid)
- players = PlayerDict()
- ###
- def classMenu(userid):
- newclass = players[userid].newclass
- if newclass is None:
- newclass = ''
- else:
- newclass = '\nClass next spawn: ' + newclass.classname
- popup.sendMenu(userid, 10,
- 'Pick a class:\n' +
- ' \n' +
- '->1. Mercenary\n' +
- ' \n' +
- '->3. Medic\n' +
- ' \n' +
- '->5. Sniper\n' +
- ' \n' +
- '->7. Support\n' +
- ' \n' +
- '->9. Default (no class)\n' +
- ' \n' +
- '0. Exit\n' +
- ' \n' +
- 'Current class: ' + players[userid].classname +
- newclass,
- classMenuSelection)
- def classMenuSelection(userid, item):
- newclass = None
- if item == 1:
- newclass = players[userid].newclass = Mercenary
- elif item == 3:
- newclass = players[userid].newclass = Medic
- elif item == 5:
- newclass = players[userid].newclass = Sniper
- elif item == 7:
- newclass = players[userid].newclass = Support
- elif item == 9:
- newclass = players[userid].newclass = PlayerClass
- if not newclass is None:
- popup.sendMenu(userid, 5, 'You will spawn as the ' + newclass.classname + ' class')
- #
- def classCommand(userid, args):
- if es.getplayerteam(userid) == 3:
- classMenu(userid)
- else:
- es.tell(userid, 'You must be a CT to choose a class')
- cmdlib.registerSayCommand('!class', classCommand, 'Say !class while a CT to pick a class')
- def healCommand(userid, args):
- players[userid].healCommand()
- cmdlib.registerSayCommand('!heal', healCommand, 'Say !heal while playing the medic class to heal your surrounding teammates')
- def ammoCommand(userid, args):
- players[userid].ammoCommand()
- cmdlib.registerSayCommand('!ammo', ammoCommand, 'Say !ammo while playing the support class to give ammo to your surrounding teammates')
- ###
- def es_map_start(event_var):
- players.clear()
- def player_spawn(event_var):
- userid = int(event_var['userid'])
- if event_var['es_userteam'] == '3':
- p = players[userid]
- if not p.newclass is None:
- del players[userid]
- p = players[userid] = p.newclass(userid)
- p.playerSpawn()
- else:
- del players[userid]
- def player_hurt(event_var):
- attacker = int(event_var['attacker'])
- if attacker:
- players[attacker].playerDamage(weaponlib.getWeapon(event_var['weapon']),
- event_var['userid'], int(event_var['dmg_health']))
- def unload():
- popup.unload()
- cmdlib.unregisterSayCommand('!class')
- cmdlib.unregisterSayCommand('!heal')
- cmdlib.unregisterSayCommand('!ammo')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement