Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.60 KB | None | 0 0
  1. # ./addons/eventscripts/ctclasses/ctclasses.py
  2.  
  3. import cfglib
  4. import cmdlib
  5. import es
  6. import playerlib
  7. import weaponlib
  8.  
  9. from cheappopup import *
  10. from itertools import *
  11. from path import path
  12. from time import time
  13.  
  14.  
  15. info = es.AddonInfo()
  16. info.name     = 'CTClasses'
  17. info.basename = 'ctclasses'
  18. info.author   = 'SuperDave'
  19.  
  20. popup = CheapPopup()
  21.  
  22. addonpath = path(es.getAddonPath(info.basename))
  23.  
  24. ###
  25.  
  26. cfg = cfglib.AddonCFG(addonpath.joinpath(info.basename + '.cfg'))
  27.  
  28. cfg.text(info.name + ' options')
  29. cfg.text('\n')
  30.  
  31. cfg.text('*** Mercenary ***')
  32. cvar_mercenary_speed = cfg.cvar(info.basename + '_mercenary_speed', 1.1, 'Speed multiplier of mercenary class')
  33. cvar_mercenary_damage = cfg.cvar(info.basename + '_mercenary_damage', 1.2, 'Damage multiplier of mercenary class')
  34. cvar_mercenary_damage_weapons = cfg.cvar(info.basename + '_mercenary_damage', 'ak47,m4a1', 'Weapons affected by mercenary damage multiplier separated by a comma')
  35. cvar_mercenary_skin = cfg.cvar(info.basename + '_mercenary_skin', 'models/player/slow/hl2/combine_super_soldier/slow.mdl', 'Skin of mercenary class')
  36. cfg.text('\n')
  37.  
  38. cfg.text('*** Medic ***')
  39. cvar_medic_speed = cfg.cvar(info.basename + '_medic_speed', 1.2, 'Speed multiplier of medic class')
  40. cvar_medic_heal = cfg.cvar(info.basename + '_medic_heal', 10, 'HP medics heal per !heal use')
  41. cvar_medic_heal_range = cfg.cvar(info.basename + '_medic_heal_range', 750, 'Range of !heal command')
  42. cvar_medic_heal_delay = cfg.cvar(info.basename + '_medic_heal_delay', 5, 'Number of seconds players must wait between !heal commands')
  43. cvar_medic_skin = cfg.cvar(info.basename + '_medic_skin', 'models/player/slow/hl2/medic_male/slow.mdl', 'Skin of medic class')
  44. cfg.text('\n')
  45.  
  46. cfg.text('*** Sniper ***')
  47. cvar_sniper_health = cfg.cvar(info.basename + '_sniper_health', 125, 'Starting health of sniper class')
  48. cvar_sniper_damage = cfg.cvar(info.basename + '_sniper_damage', 1.4, 'Damage multiplier of sniper class')
  49. cvar_sniper_damage_weapons = cfg.cvar(info.basename + '_sniper_damage', 'awp,scout', 'Weapons affected by sniper damage multiplier separated by a comma')
  50. cvar_sniper_skin = cfg.cvar(info.basename + '_sniper_skin', 'models\player\csctm_stalker_exo\duty.mdl', 'Skin of sniper class')
  51. cfg.text('\n')
  52.  
  53. cfg.text('*** Support ***')
  54. cvar_support_ammo_range = cfg.cvar(info.basename + '_support_ammo_range', 1250, 'Range of !ammo command')
  55. cvar_support_ammo_delay = cfg.cvar(info.basename + '_support_ammo_delay', 5, 'Number of seconds players must wait between !ammo commands')
  56. cvar_support_damage = cfg.cvar(info.basename + '_support_damage', 1.6, 'Damage multiplier of support class')
  57. cvar_support_damage_weapons = cfg.cvar(info.basename + '_support_damage', 'p90', 'Weapons affected by support damage multiplier separated by a comma')
  58. cvar_support_skin = cfg.cvar(info.basename + '_support_skin', 'models\player\csctm_stalker_exo\monolith.mdl', 'Skin of support class')
  59.  
  60. cfg.write()
  61.  
  62. cfg.execute()
  63.  
  64. ###
  65.  
  66. class PlayerClass(object):
  67.    classweapons = ()
  68.    classname = 'Default'
  69.    newclass = None
  70.    lastuse = 0
  71.  
  72.    def __init__(self, userid):
  73.       self.userid = userid
  74.  
  75.    def playerSpawn(self):
  76.       es.tell(self.userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a class')
  77.  
  78.    def playerDamage(self, weapon, victim, damage):
  79.       pass
  80.  
  81.    def healCommand(self):
  82.       userid = self.userid
  83.       es.tell(userid, '#multi', '#defaultYou must be the #lightgreenmedic#default class to use the #lightgreen!heal#default command')
  84.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a class')
  85.  
  86.    def ammoCommand(self):
  87.       userid = self.userid
  88.       es.tell(userid, '#multi', '#defaultYou must be the #lightgreensupport#default class to use the #lightgreen!ammo#default command')
  89.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a class')
  90.  
  91.    def applyDamage(self, amount, weapon, victim):
  92.       es.fire(victim, '!self', 'addoutput', 'targetname damagevictim')
  93.  
  94.       index = es.createentity('point_hurt') # Create the entity
  95.       es.entitysetvalue(index, 'DamageTarget', 'damagevictim') # Damage our victim
  96.       es.entitysetvalue(index, 'DamageType', 32) # Default (fall) damage
  97.       es.entitysetvalue(index, 'Damage', int(amount)) # Damage to inflict
  98.       es.entitysetvalue(index, 'targetname', 'ctclasses_hurt') # Give this entity a unique name
  99.       es.entitysetvalue(index, 'classname', weapon) # Tell CS what type of weapon to credit
  100.       es.spawnentity(index)
  101.  
  102.       es.fire(self.userid, 'ctclasses_hurt', 'hurt')
  103.       es.fire(self.userid, 'ctclasses_hurt', 'kill')
  104.       es.fire(victim, '!self', 'addoutput', 'targetname none')
  105.  
  106.    def playersInRange(self, range):
  107.       def isCT(userid):
  108.          return es.getplayerteam(userid) == 3
  109.       def getDistance(pos1, pos2):
  110.          return sum((x - y) ** 2 for x, y in izip(pos1, pos2)) ** 0.5
  111.       locations = dict((userid, es.getplayerlocation(userid)) for userid in ifilter(isCT, es.getUseridList()))
  112.       mylocation = locations[self.userid]
  113.       del locations[self.userid]
  114.       for userid, location in locations.iteritems():
  115.          if getDistance(location, mylocation) <= range:
  116.             yield userid
  117.  
  118.    @staticmethod
  119.    def getNameList(userids):
  120.       if len(userids) == 1:
  121.          return es.getplayername(userids[0])
  122.       names = sorted(map(es.getplayername, userids))
  123.       return '#default,#lightgreen '.join(names[:len(names) - 1]) + ' #defaultand#lightgreen ' + names[~0]
  124.  
  125. #
  126.  
  127. class Mercenary(PlayerClass):
  128.    classweapons = map(weaponlib.getWeapon, str(cvar_mercenary_damage_weapons).split(','))
  129.    classname = 'Mercenary'
  130.  
  131.    def playerSpawn(self):
  132.       userid = self.userid
  133.       player = playerlib.getPlayer(userid)
  134.       player.speed = cvar_mercenary_speed
  135.       skin = str(cvar_mercenary_skin)
  136.       if skin:
  137.          player.model = skin
  138.       es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
  139.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a new class')
  140.  
  141.    def playerDamage(self, weapon, victim, damage):
  142.       if weapon in self.classweapons:
  143.          amount = damage * (cvar_mercenary_damage - 1.)
  144.          if amount > 0:
  145.             self.applyDamage(amount, weapon, victim)
  146.  
  147. #
  148.  
  149. class Medic(PlayerClass):
  150.    classname = 'Medic'
  151.  
  152.    def playerSpawn(self):
  153.       userid = self.userid
  154.       player = playerlib.getPlayer(userid)
  155.       player.speed = cvar_medic_speed
  156.       skin = str(cvar_medic_skin)
  157.       if skin:
  158.          player.model = skin
  159.       es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
  160.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a new class')
  161.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!heal  #defaultto heal your surrounding teammates')
  162.       self.lastuse = 0
  163.  
  164.    def healCommand(self):
  165.       now = time()
  166.       if now - self.lastuse <= cvar_medic_heal_delay:
  167.          es.tell(self.userid, '#multi', '#defaultYou must wait #lightgreen' + str(cvar_medic_heal_delay) +
  168.           ' seconds#default between uses of the #lightgreen!heal#default command')
  169.          return
  170.       toheal = list(self.playersInRange(cvar_medic_heal_range))
  171.       for userid in toheal:
  172.          player = playerlib.getPlayer(userid)
  173.          player.health = min(100, player.health + 10)
  174.       self.lastuse = now
  175.  
  176.       if toheal:
  177.          es.tell(userid, '#multi', '#defaultYou healed: #lightgreen' + self.getNameList(toheal))
  178.  
  179. #
  180.  
  181. class Sniper(PlayerClass):
  182.    classweapons = map(weaponlib.getWeapon, str(cvar_sniper_damage_weapons).split(','))
  183.    classname = 'Sniper'
  184.  
  185.    def playerSpawn(self):
  186.       userid = self.userid
  187.       player = playerlib.getPlayer(userid)
  188.       player.health = cvar_sniper_health
  189.       skin = str(cvar_sniper_skin)
  190.       if skin:
  191.          player.model = skin
  192.       es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
  193.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a new class')
  194.  
  195.    def playerDamage(self, weapon, victim, damage):
  196.       if weapon in self.classweapons:
  197.          amount = damage * (cvar_sniper_damage - 1.)
  198.          if amount > 0:
  199.             self.applyDamage(amount, weapon, victim)
  200.  
  201. #
  202.  
  203. class Support(PlayerClass):
  204.    classweapons = map(weaponlib.getWeapon, str(cvar_support_damage_weapons).split(','))
  205.    classname = 'Support'
  206.  
  207.    def playerSpawn(self):
  208.       userid = self.userid
  209.       skin = str(cvar_support_skin)
  210.       if skin:
  211.          playerlib.getPlayer(userid).model = skin
  212.       es.tell(userid, '#multi', '#defaultCurrent class: #lightgreen' + self.classname)
  213.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!class  #defaultto choose a new class')
  214.       es.tell(userid, '#multi', '#defaultSay  #lightgreen!ammo  #defaultto give ammo to your surrounding teammates')
  215.       self.lastuse = 0
  216.  
  217.    def playerDamage(self, weapon, victim, damage):
  218.       if weapon in self.classweapons:
  219.          amount = damage * (cvar_support_damage - 1.)
  220.          if amount > 0:
  221.             self.applyDamage(amount, weapon, victim)
  222.  
  223.    def ammoCommand(self):
  224.       now = time()
  225.       if now - self.lastuse <= cvar_support_ammo_delay:
  226.          es.tell(self.userid, '#multi', '#defaultYou must wait #lightgreen' + str(cvar_support_ammo_delay) +
  227.           ' seconds#default between uses of the #lightgreen!ammo#default command')
  228.          return
  229.       forammo = list(self.playersInRange(cvar_support_ammo_range))
  230.       for userid in forammo:
  231.          es.give(userid, 'info_null')
  232.       self.lastuse = now
  233.  
  234.       if forammo:
  235.          es.tell(userid, '#multi', '#defaultYou game ammo to: #lightgreen' + self.getNameList(forammo))
  236.  
  237. ###
  238.  
  239. class PlayerDict(dict):
  240.    def __getitem__(self, userid):
  241.       userid = int(userid)
  242.       if userid in self:
  243.          return super(PlayerDict, self).__getitem__(userid)
  244.       x = self[userid] = PlayerClass(userid)
  245.       return x
  246.  
  247.    def __delitem__(self, userid):
  248.       userid = int(userid)
  249.       if userid in self:
  250.          super(PlayerDict, self).__delitem__(userid)
  251.  
  252. players = PlayerDict()
  253.  
  254. ###
  255.  
  256. def classMenu(userid):
  257.    newclass = players[userid].newclass
  258.    if newclass is None:
  259.       newclass = ''
  260.    else:
  261.       newclass = '\nClass next spawn: ' + newclass.classname
  262.  
  263.    popup.sendMenu(userid, 10,
  264.     'Pick a class:\n' +
  265.     ' \n' +
  266.     '->1. Mercenary\n' +
  267.     ' \n' +
  268.     '->3. Medic\n' +
  269.     ' \n' +
  270.     '->5. Sniper\n' +
  271.     ' \n' +
  272.     '->7. Support\n' +
  273.     ' \n' +
  274.     '->9. Default (no class)\n' +
  275.     ' \n' +
  276.     '0. Exit\n' +
  277.     ' \n' +
  278.     'Current class: ' + players[userid].classname +
  279.     newclass,
  280.     classMenuSelection)
  281.  
  282.  
  283. def classMenuSelection(userid, item):
  284.    newclass = None
  285.    if item == 1:
  286.       newclass = players[userid].newclass = Mercenary
  287.    elif item == 3:
  288.       newclass = players[userid].newclass = Medic
  289.    elif item == 5:
  290.       newclass = players[userid].newclass = Sniper
  291.    elif item == 7:
  292.       newclass = players[userid].newclass = Support
  293.    elif item == 9:
  294.       newclass = players[userid].newclass = PlayerClass
  295.  
  296.    if not newclass is None:
  297.       popup.sendMenu(userid, 5, 'You will spawn as the ' + newclass.classname + ' class')
  298.  
  299. #
  300.  
  301. def classCommand(userid, args):
  302.    if es.getplayerteam(userid) == 3:
  303.       classMenu(userid)
  304.    else:
  305.       es.tell(userid, 'You must be a CT to choose a class')
  306.  
  307. cmdlib.registerSayCommand('!class', classCommand, 'Say  !class  while a CT to pick a class')
  308.  
  309.  
  310. def healCommand(userid, args):
  311.    players[userid].healCommand()
  312.  
  313. cmdlib.registerSayCommand('!heal', healCommand, 'Say  !heal  while playing the medic class to heal your surrounding teammates')
  314.  
  315.  
  316. def ammoCommand(userid, args):
  317.    players[userid].ammoCommand()
  318.  
  319. cmdlib.registerSayCommand('!ammo', ammoCommand, 'Say  !ammo  while playing the support class to give ammo to your surrounding teammates')
  320.  
  321. ###
  322.  
  323. def es_map_start(event_var):
  324.    players.clear()
  325.  
  326.  
  327. def player_spawn(event_var):
  328.    userid = int(event_var['userid'])
  329.    if event_var['es_userteam'] == '3':
  330.       p = players[userid]
  331.       if not p.newclass is None:
  332.          del players[userid]
  333.          p = players[userid] = p.newclass(userid)
  334.       p.playerSpawn()
  335.    else:
  336.       del players[userid]
  337.  
  338.  
  339. def player_hurt(event_var):
  340.    attacker = int(event_var['attacker'])
  341.    if attacker:
  342.       players[attacker].playerDamage(weaponlib.getWeapon(event_var['weapon']),
  343.        event_var['userid'], int(event_var['dmg_health']))
  344.  
  345.  
  346. def unload():
  347.    popup.unload()
  348.  
  349.    cmdlib.unregisterSayCommand('!class')
  350.    cmdlib.unregisterSayCommand('!heal')
  351.    cmdlib.unregisterSayCommand('!ammo')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement