Beispiel #1
0
	def explode(self, position, force, damage, damageRadius, sourceEntity = None, damagingEntity = None):
		"""Triggers an explosion animation, which involves applying force to surrounding Entities, and damaging Entities where applicable.
		sourceEntity is excluded from damage and force, and damagingEntity gets the credit for any damage done.
		If damagingEntity is None, sourceEntity gets the credit. If both are None, no damage is done.
		"""
		
		particles.add(particles.SparkParticleGroup(position, numParticles = 500, speed = damageRadius * 2.5, lifeTime = 1.0, size = 6.0))
		particles.add(particles.ExplosionParticleGroup(position))
		
		for entity in (entity for entity in self.entities.values() if entity != sourceEntity and isinstance(entity, ObjectEntity)):
			vector = entity.getPosition() - position
			distance = vector.length()
			if distance >= damageRadius or distance == 0:
				continue
			force2 = force * max(1 - (distance / damageRadius), 0) * entity.radius * 0.5
			damage2 = damage * max(1 - (distance / damageRadius), 0)
			pos = entity.getPosition()
			vector = pos - position
			distance = vector.length()
			vector.normalize()

			if entity.active:
				vector = engine.impulseToForce(vector.getX() * force2, vector.getY() * force2, vector.getZ() * force2)
				pos = entity.getPosition()
				radius = entity.radius * 0.4
				pos += Vec3(uniform(-radius, radius), uniform(-radius, radius), uniform(-radius, radius))
				entity.addForceAtPosition(vector, pos)
				if damage2 > 0:
					if damagingEntity != None:
						entity.damage(damagingEntity, damage2, False) # Grenades don't count as ranged damage.
					elif sourceEntity != None:
						entity.damage(sourceEntity, damage2, False)
Beispiel #2
0
 def clientUpdate(self, aiWorld, entityGroup, iterator = None):
     Weapon.clientUpdate(self, aiWorld, entityGroup, iterator)
     if iterator != None:
         state = net.Uint8.getFrom(iterator)
         if state == 1: # We're impaling
             self.impaleStart = engine.clock.time
             # Show the claw and animate it.
             self.show()
             self.node.play("Impale")
             if net.Boolean.getFrom(iterator): # Impale was a success
                 self.clawSound.play(entity = self.actor)
             else: # Fail!
                 self.clawFailSound.play(entity = self.actor)
         elif state == 2: # We're damaging an entity
             enemy = entityGroup.getEntity(net.Uint8.getFrom(iterator))
             if enemy != None and enemy.active:
                 pos = (enemy.getPosition() + self.actor.getPosition()) * 0.5
                 particles.add(particles.HitRegisterParticleGroup(pos, enemy.getTeam().color, 2))
                 enemy.damage(self.actor, self.damage, False)
     
     # Animation code
     if self.selected and self.active:
         self.setPosition(self.actor.getPosition())
         self.node.lookAt(Point3(self.actor.controller.targetPos))
         if self.impaleStart != -1 and engine.clock.time - self.impaleStart > self.node.getDuration("Impale") and engine.clock.time - self.impaleStart < 0.75:
             self.node.pose("Impale", self.node.getNumFrames("Impale") - 1)
         elif self.impaleStart != -1 and engine.clock.time - self.impaleStart > 0.75 and engine.clock.time - self.impaleStart < 0.75 + self.node.getDuration("Retract"):
             if self.node.getCurrentAnim() != "Retract":
                 self.node.play("Retract")
                 self.clawRetractSound.play(entity = self.actor)
         elif engine.clock.time - self.impaleStart > 0.75 + self.node.getDuration("Retract"):
             self.impaleStart = -1
             self.hide()
Beispiel #3
0
    def explode(self, position, force, damage, damageRadius, sourceEntity = None, damagingEntity = None):
        """Triggers an explosion animation, which involves applying force to surrounding Entities, and damaging Entities where applicable.
        sourceEntity is excluded from damage and force, and damagingEntity gets the credit for any damage done.
        If damagingEntity is None, sourceEntity gets the credit. If both are None, no damage is done.
        """
        
        particles.add(particles.SparkParticleGroup(position, numParticles = 500, speed = damageRadius * 2.5, lifeTime = 1.0, size = 6.0))
        particles.add(particles.ExplosionParticleGroup(position))
        
        for entity in (entity for entity in self.entities.values() if entity != sourceEntity and isinstance(entity, ObjectEntity)):
            vector = entity.getPosition() - position
            distance = vector.length()
            if distance >= damageRadius or distance == 0:
                continue
            force2 = force * max(1 - (distance / damageRadius), 0) * entity.radius * 0.5
            damage2 = damage * max(1 - (distance / damageRadius), 0)
            pos = entity.getPosition()
            vector = pos - position
            distance = vector.length()
            vector.normalize()

            if entity.active:
                vector = engine.impulseToForce(vector.getX() * force2, vector.getY() * force2, vector.getZ() * force2)
                pos = entity.getPosition()
                radius = entity.radius * 0.4
                pos += Vec3(uniform(-radius, radius), uniform(-radius, radius), uniform(-radius, radius))
                entity.addForceAtPosition(vector, pos)
                if damage2 > 0:
                    if damagingEntity != None:
                        entity.damage(damagingEntity, damage2, False) # Grenades don't count as ranged damage.
                    elif sourceEntity != None:
                        entity.damage(sourceEntity, damage2, False)
Beispiel #4
0
    def clientUpdate(self, aiWorld, entityGroup, iterator=None):
        Gun.clientUpdate(self, aiWorld, entityGroup, iterator)

        if iterator != None:
            if net.Boolean.getFrom(iterator):  # We're firing
                self.lastFire = engine.clock.time

                if self.active:
                    self.shotGunSound.play(entity=self.actor)
                    self.light.add()

                direction = net2.StandardVec3.getFrom(iterator)

                if net.Boolean.getFrom(iterator):  # Bullet hit something
                    hitPos = net2.StandardVec3.getFrom(iterator)
                    if self.active:
                        radius = (hitPos - self.getPosition()).length() / 5
                        for _ in range(5):
                            particles.add(
                                particles.SparkParticleGroup(
                                    hitPos + Vec3(uniform(-radius, radius),
                                                  uniform(-radius, radius),
                                                  uniform(-radius, radius))))
                        origin = self.getPosition() + (direction * random() *
                                                       4)
                        pos = hitPos - (direction * random() * 4)
                        self.tracer.draw(origin, pos)

                    if net.Boolean.getFrom(iterator):
                        entityId = net.Uint8.getFrom(iterator)
                        entity = entityGroup.getEntity(entityId)
                        damage = net.Uint16.getFrom(iterator)
                        if entity != None:
                            entity.damage(self.actor, damage)
                            if isinstance(entity, entities.Actor):
                                particles.add(
                                    particles.HitRegisterParticleGroup(
                                        hitPos - direction,
                                        entity.getTeam().color,
                                        (damage * 3) / self.damage))
                    else:
                        self.ricochetSound.play(position=hitPos)
        if engine.clock.time - self.lastFire > 0.1:
            self.light.remove()
        elif self.active:
            self.light.setPos(self.getPosition())
            self.light.setAttenuation((0, 0, 0.005 + math.pow(
                (engine.clock.time - self.lastFire), 2) * 8))
Beispiel #5
0
 def clientUpdate(self, aiWorld, entityGroup, iterator = None):
     Gun.clientUpdate(self, aiWorld, entityGroup, iterator)
         
     if iterator != None:
         if net.Boolean.getFrom(iterator): # We're firing
             if self.active:
                 self.sniperSound.play(entity = self.actor)
                 self.light.add()
             
             direction = net2.StandardVec3.getFrom(iterator)
             
             if net.Boolean.getFrom(iterator): # Bullet hit something
                 hitPos = net2.StandardVec3.getFrom(iterator)
                 if self.active:
                     origin = self.getPosition() + (direction * random() * 4)
                     pos = hitPos - (direction * random() * 4)
                     self.tracer.draw(origin, pos)
                 if net.Boolean.getFrom(iterator):
                     entityId = net.Uint8.getFrom(iterator)
                     entity = entityGroup.getEntity(entityId)
                     damage = net.Uint16.getFrom(iterator)
                     if entity != None:
                         entity.damage(self.actor, damage)
                         if isinstance(entity, entities.Actor):
                             particles.add(particles.HitRegisterParticleGroup(hitPos - direction, entity.getTeam().color, damage / self.damage))
                         else:
                             particles.add(particles.SparkParticleGroup(hitPos))
                 else:
                     self.ricochetSound.play(position = hitPos)
                     particles.add(particles.SparkParticleGroup(hitPos))
     if engine.clock.time - self.lastFire > 0.1:
         self.light.remove()
     elif self.active:
         self.light.setPos(self.getPosition())
         self.light.setAttenuation((0, 0, 0.005 + math.pow((engine.clock.time - self.lastFire), 2) * 8))
Beispiel #6
0
    def clientUpdate(self, aiWorld, entityGroup, iterator=None):
        Weapon.clientUpdate(self, aiWorld, entityGroup, iterator)
        if iterator != None:
            state = net.Uint8.getFrom(iterator)
            if state == 1:  # We're impaling
                self.impaleStart = engine.clock.time
                # Show the claw and animate it.
                self.show()
                self.node.play("Impale")
                if net.Boolean.getFrom(iterator):  # Impale was a success
                    self.clawSound.play(entity=self.actor)
                else:  # Fail!
                    self.clawFailSound.play(entity=self.actor)
            elif state == 2:  # We're damaging an entity
                enemy = entityGroup.getEntity(net.Uint8.getFrom(iterator))
                if enemy != None and enemy.active:
                    pos = (enemy.getPosition() +
                           self.actor.getPosition()) * 0.5
                    particles.add(
                        particles.HitRegisterParticleGroup(
                            pos,
                            enemy.getTeam().color, 2))
                    enemy.damage(self.actor, self.damage, False)

        # Animation code
        if self.selected and self.active:
            self.setPosition(self.actor.getPosition())
            self.node.lookAt(Point3(self.actor.controller.targetPos))
            if self.impaleStart != -1 and engine.clock.time - self.impaleStart > self.node.getDuration(
                    "Impale") and engine.clock.time - self.impaleStart < 0.75:
                self.node.pose("Impale", self.node.getNumFrames("Impale") - 1)
            elif self.impaleStart != -1 and engine.clock.time - self.impaleStart > 0.75 and engine.clock.time - self.impaleStart < 0.75 + self.node.getDuration(
                    "Retract"):
                if self.node.getCurrentAnim() != "Retract":
                    self.node.play("Retract")
                    self.clawRetractSound.play(entity=self.actor)
            elif engine.clock.time - self.impaleStart > 0.75 + self.node.getDuration(
                    "Retract"):
                self.impaleStart = -1
                self.hide()
Beispiel #7
0
    def clientUpdate(self, aiWorld, entityGroup, iterator = None):
        Gun.clientUpdate(self, aiWorld, entityGroup, iterator)

        if iterator != None:
            if net.Boolean.getFrom(iterator): # We're firing
                self.lastFire = engine.clock.time
                
                if self.active:
                    self.pistolSound.play(entity = self.actor)
                    self.light.add()
                
                direction = net2.StandardVec3.getFrom(iterator)
                
                if net.Boolean.getFrom(iterator): # Bullet hit something
                    hitPos = net2.StandardVec3.getFrom(iterator)
                    if self.active:
                        origin = self.getPosition() + (direction * random() * 4)
                        pos = hitPos - (direction * random() * 4)
                        self.tracer.draw(origin, pos)
                    
                    if net.Boolean.getFrom(iterator):
                        entityId = net.Uint8.getFrom(iterator)
                        entity = entityGroup.getEntity(entityId)
                        damage = net.Uint16.getFrom(iterator)
                        pin = False
                        pin = net.Boolean.getFrom(iterator) # Whether we're pinning the entity against the wall
                        pinPos = net2.HighResVec3.getFrom(iterator)
                        if entity != None:
                            if pin:
                                self.pinSound.play(position = hitPos)
                                if not entity.pinned:
                                    entity.pin(hitPos - (direction * entity.radius))
                                
                            spike = entities.Spike(pinPos, direction)
                            spike.attachTo(entity)
                            entityGroup.addGraphicsObject(spike)
                                
                            entity.damage(self.actor, damage)
                            if isinstance(entity, entities.Actor):
                                particles.add(particles.HitRegisterParticleGroup(hitPos - direction, entity.getTeam().color, damage * 2 / self.damage))
                            else:
                                particles.add(particles.SparkParticleGroup(hitPos))
                    else:
                        particles.add(particles.SparkParticleGroup(hitPos))
                        entityGroup.addGraphicsObject(entities.Spike(hitPos, direction))
                        self.ricochetSound.play(position = hitPos)
        if engine.clock.time - self.lastFire > 0.1:
            self.light.remove()
        elif self.active:
            self.light.setPos(self.getPosition())
            self.light.setAttenuation((0, 0, 0.005 + math.pow((engine.clock.time - self.lastFire), 2) * 8))
Beispiel #8
0
    def clientUpdate(self, aiWorld, entityGroup, iterator=None):
        Gun.clientUpdate(self, aiWorld, entityGroup, iterator)

        if iterator != None:
            if net.Boolean.getFrom(iterator):  # We're firing
                self.lastFire = engine.clock.time

                if self.active:
                    self.pistolSound.play(entity=self.actor)
                    self.light.add()

                direction = net2.StandardVec3.getFrom(iterator)

                if net.Boolean.getFrom(iterator):  # Bullet hit something
                    hitPos = net2.StandardVec3.getFrom(iterator)
                    if self.active:
                        origin = self.getPosition() + (direction * random() *
                                                       4)
                        pos = hitPos - (direction * random() * 4)
                        self.tracer.draw(origin, pos)

                    if net.Boolean.getFrom(iterator):
                        entityId = net.Uint8.getFrom(iterator)
                        entity = entityGroup.getEntity(entityId)
                        damage = net.Uint16.getFrom(iterator)
                        pin = False
                        pin = net.Boolean.getFrom(
                            iterator
                        )  # Whether we're pinning the entity against the wall
                        pinPos = net2.HighResVec3.getFrom(iterator)
                        if entity != None:
                            if pin:
                                self.pinSound.play(position=hitPos)
                                if not entity.pinned:
                                    entity.pin(hitPos -
                                               (direction * entity.radius))

                            spike = entities.Spike(pinPos, direction)
                            spike.attachTo(entity)
                            entityGroup.addGraphicsObject(spike)

                            entity.damage(self.actor, damage)
                            if isinstance(entity, entities.Actor):
                                particles.add(
                                    particles.HitRegisterParticleGroup(
                                        hitPos - direction,
                                        entity.getTeam().color,
                                        damage * 2 / self.damage))
                            else:
                                particles.add(
                                    particles.SparkParticleGroup(hitPos))
                    else:
                        particles.add(particles.SparkParticleGroup(hitPos))
                        entityGroup.addGraphicsObject(
                            entities.Spike(hitPos, direction))
                        self.ricochetSound.play(position=hitPos)
        if engine.clock.time - self.lastFire > 0.1:
            self.light.remove()
        elif self.active:
            self.light.setPos(self.getPosition())
            self.light.setAttenuation((0, 0, 0.005 + math.pow(
                (engine.clock.time - self.lastFire), 2) * 8))