Go to the documentation of this file.00001 '''
00002 Anoria (c) Gsk 2010
00003 '''
00004
00005 import BigWorld
00006 import random
00007 import time
00008
00009 import Avatar
00010 from Actor import Actor
00011
00012 from config import state
00013 from config import event
00014 from config import consts
00015
00016 from Resources import ResourceDB as RDB
00017
00018 class Mob(BigWorld.Entity, Actor):
00019
00020 def __init__(self):
00021 BigWorld.Entity.__init__(self)
00022 Actor.__init__(self)
00023 self.combatStartTick = None
00024
00025
00026 spawnDef = RDB.spawns[self.spawnDefId]
00027 weaponId = spawnDef.weaponId
00028 if weaponId != None:
00029 print "Mob_%d equiping weapon, weapondef=%s" % (self.id, weaponId)
00030 weapon = RDB.items[weaponId]
00031 self.combatResolver.equipWeapon(weapon, 0)
00032
00033
00034 self.addEventProc(event.UNDER_ATTACK, self.eventUnderAttack)
00035
00036
00037
00038
00039
00040
00041
00042 def onTimer(self, timerId, userData):
00043 Actor.onTimer(self, timerId, userData)
00044 if userData != 0: return
00045 if self.states[state.STATE_COMBAT] == state.S_COMBAT_ON:
00046
00047 if self.targetId != None:
00048 target = self.getTargetEntity()
00049 if target == None:
00050 self.targetLost()
00051 else:
00052 dist = self.position.distTo(target.position)
00053 inRange = consts.MELEE_MAX_DISTANCE - dist > 0.0
00054 if not inRange:
00055 if self.states[state.STATE_ATTACK] == state.S_ATTACK_ON:
00056 self.pauseAutoattack()
00057
00058 elif self.states[state.STATE_ATTACK] == state.S_ATTACK_PAUSED:
00059 self.pauseAutoattack(restart=True)
00060
00061
00062
00063 inAggroHoldRange = consts.DROP_AGGRO_DISTANCE - dist > 0.0
00064 if not inAggroHoldRange:
00065 print 'Mob_%d: distance to target=%.3f, out off aggro hold range; canceling combat mode' % (self.id, dist)
00066
00067 self.exitCombat()
00068 else:
00069
00070
00071 if not self.haveAggroOn():
00072 self.exitCombat()
00073
00074 else:
00075
00076 self.doHealthRegen()
00077
00078
00079
00080 self.combatResolver.update()
00081
00082
00083
00084
00085
00086 def die(self, sourceId):
00087 xp = 0
00088 if not self.isPlayer:
00089 xp = RDB.spawns[self.spawnDefId].Xp
00090 try:
00091 killer = BigWorld.entities[sourceId]
00092 except:
00093 print "Mob_%d.die(): ERROR no entity found for my killer:%d" % (self.id, sourceId)
00094 finally:
00095 killer.base.rpcProcessEvent(self.id, event.ENTITY_KILL, xp)
00096
00097 Actor.die(self, sourceId)
00098
00099
00100
00101
00102
00103
00104
00105 def eventUnderAttack(self, attackerId, eventValue):
00106 ''' eventUnderAttack is received when ever anything hostile is done to this Actor.
00107 @param attackerId is the entity id of the hostile entity
00108 @param eventValue is the type of hostile activity '''
00109
00110 print "Mob_%d.eventUnderAttack(): attackerId=%d, eventValue=[%d]%s" \
00111 % (self.id, attackerId, eventValue, event.ATTACK_EVENTS[eventValue])
00112
00113 self.aggroFromEntity(attackerId)
00114 self.aggroOn(attackerId)
00115
00116 if not self.states[state.STATE_COMBAT] == state.S_COMBAT_ON:
00117 self.enterCombat(attackerId)
00118
00119
00120 target = self.getTargetEntity()
00121 self.facePosition(target.position)