Advertisement
Guest User

Untitled

a guest
Nov 25th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.37 KB | None | 0 0
  1. ##
  2. ## IMPORTS
  3. ##
  4.  
  5. from wcs.effects import models
  6. from wcs.entities import Race, Skill
  7. from wcs.items.enhancements import Swiftness
  8. from wcs.player import Player
  9. from wcs.tools import chance, chancef, cooldown, cooldownf
  10.  
  11. from effects import temp_entities
  12. from engines.trace import engine_trace
  13. from engines.trace import ContentMasks
  14. from engines.trace import GameTrace
  15. from engines.trace import MAX_TRACE_LENGTH
  16. from engines.trace import Ray
  17. from engines.trace import TraceFilterSimple
  18. from filters.recipients import RecipientFilter
  19. from filters.players import PlayerIter
  20. from listeners.tick import tick_delays
  21. from mathlib import Vector
  22.  
  23. ##
  24. ## RACE
  25. ##
  26.  
  27. class Scourge(Race):
  28.     name = 'Undead Scourge'
  29.     description = 'Redesigned Warcraft Scourge.'
  30.     max_level = 40
  31.     restricted_items = (Swiftness, )
  32.     category = 'DEFAULT RACES'
  33.  
  34.     def player_spawn(self, player, **eargs):
  35.         player.speed = 1.18
  36.  
  37. @Scourge.skill
  38. class Vampire(Skill):
  39.     name = 'Vampiric Aura'
  40.     description = 'You have an aura which causes you to steal life. Max HP (100+15*LEVEL)'
  41.     max_level = 8
  42.  
  43.     @property
  44.     def _max(self):
  45.         return 100 + 15*self.level
  46.  
  47.     @property
  48.     def _percent(self):
  49.         return 0.1 + 0.05*self.level
  50.  
  51.     def _chance(self, **eargs):
  52.         return 30 + 5*self.level
  53.  
  54.     @chancef(_chance)
  55.     def player_pre_attack(self, attacker, defender, info, weapon, **eargs):
  56.         damage = info.damage
  57.         life = int(damage*self._percent)
  58.         if attacker.health+life > self._max:
  59.             attacker.health = self._max
  60.         else:
  61.             attacker.health += life
  62.  
  63. @Scourge.skill
  64. class Unholy(Skill):
  65.     name = 'Unholy Aura'
  66.     description = 'Release an aura which increases allied speed.'
  67.     max_level = 8
  68.  
  69.     model = models['sprites/laser.vmt']
  70.  
  71.     @property
  72.     def _recipients(self):
  73.         return RecipientFilter()
  74.  
  75.     @property
  76.     def _speed(self):
  77.         return 0.02*self.level
  78.  
  79.     def player_spawn(self, player, **eargs):
  80.         if not player.playerinfo.is_fake_client():
  81.             team = ['t', 'ct'][player.team-2]
  82.             temp_entities.beam_ring_point(self._recipients, 0, player.origin,
  83.                 20, 800, self.model.index, self.model.index, 0, 255, 2, 8, 1, 1,
  84.                 255, 100, 100, 255, 1, 0)
  85.             for ally in PlayerIter(is_filters=team):
  86.                 if not ally.userid == player.userid:
  87.                     ally.speed += self._speed
  88.                     temp_entities.beam_ring_point(self._recipients, 2, ally.origin,
  89.                         200, 20, self.model.index, self.model.index, 0, 255, 0.3, 8, 1,
  90.                         1, 100, 100, 255, 255, 1, 0)
  91.             player.speed += self._speed
  92.  
  93. @Scourge.skill
  94. class Levitation(Skill):
  95.     name = 'Levitation'
  96.     description = 'Reduce your current gravity and damage taken when jumping.'
  97.     max_level = 8
  98.  
  99.     @property
  100.     def _gravity(self):
  101.         return 1 - 0.08*self.level
  102.  
  103.     @property
  104.     def _reduction(self):
  105.         return 1 - 0.06*self.level
  106.  
  107.     def _get_trace(self, start, end, mask, index, trace):
  108.         engine_trace.trace_ray(Ray(start, end),
  109.             ContentMasks.ALL, TraceFilterSimple((index, )), trace)
  110.         return trace
  111.  
  112.     def player_spawn(self, player, **eargs):
  113.         player.gravity = self._gravity
  114.  
  115.     def player_pre_defend(self, attacker, defender, info, **eargs):
  116.         start = defender.eye_location
  117.         end = defender.eye_location
  118.         end.z -= MAX_TRACE_LENGTH
  119.         trace = self._get_trace(start, end, ContentMasks.ALL, defender.index,
  120.             GameTrace())
  121.         if trace.did_hit():
  122.             floor = trace.end_position
  123.             if start.get_distance(floor) > 100:
  124.                 info.damage *= self._reduction
  125.                 self.message(defender.index,
  126.                     '\x03Reduced damage by {0}% to {1:0.0f}.'.format(
  127.                         100-self._reduction*100, info.damage))
  128.  
  129. @Scourge.skill
  130. class Explode(Skill):
  131.     name = 'Suicide Bomber'
  132.     description = 'Explode upon death or on ultimate causing enemies to bleed.'
  133.     max_level = 8
  134.  
  135.     _index = None
  136.  
  137.     @property
  138.     def _range(self):
  139.         return 300 + 50*self.level
  140.  
  141.     @property
  142.     def _magnitude(self):
  143.         return 50 + 5*self.level
  144.  
  145.     @property
  146.     def _recipients(self):
  147.         return RecipientFilter()
  148.  
  149.     def player_spawn(self, player, **eargs):
  150.         self._index = None
  151.  
  152.     def player_pre_defend(self, defender, **eargs):
  153.         if not self._index:
  154.             for index in defender.weapon_indexes():
  155.                 self._index = index
  156.                 break
  157.  
  158.     def player_death(self, defender, **eargs):
  159.         players_hit = []
  160.         team = ['ct', 't'][defender.team-2]
  161.  
  162.         for target in PlayerIter(is_filters=team):
  163.             if defender.origin.get_distance(target.origin) <= self._range:
  164.                 target.take_damage(self._magnitude,
  165.                     attacker_index=defender.index, weapon_index=self._index)
  166.                 players_hit.append(target.name)
  167.  
  168.         if len(players_hit) > 0:
  169.             self.message(defender.index,
  170.                 '\x02You exploded on {0}!'.format(', '.join(players_hit)))
  171.  
  172.         temp_entities.explosion(self._recipients, 0.0, defender.origin, 0,
  173.             1.0, 255, 0, 600, 2, Vector(), 67)
  174.  
  175.     def player_ultimate(self, player, **eargs):
  176.         if not player.isdead:
  177.             players_hit = []
  178.             team = ['ct', 't'][player.team-2]
  179.  
  180.             for index in player.weapon_indexes():
  181.                 break
  182.             else:
  183.                 index = None
  184.  
  185.             for target in PlayerIter(is_filters=team):
  186.                 if player.origin.get_distance(target.origin) <= self._range:
  187.                     target.take_damage(self._magnitude,
  188.                         attacker_index=player.index, weapon_index=index)
  189.                     players_hit.append(target.name)
  190.  
  191.             if len(players_hit) > 0:
  192.                 self.message(player.index,
  193.                     '\x02You exploded on \x04{0}!'.format(', '.join(players_hit)))
  194.            
  195.             player.client_command('kill', True)
  196.  
  197.             temp_entities.explosion(self._recipients, 0.0, player.origin, 0,
  198.                 1.0, 255, 0, 600, 2, Vector(), 67)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement