def changeState(self, state): owner = self.owner() if self.state: self.state.onExit(owner) self.state = state self.state.onEnter(owner) self.state.update(owner, ffext.getTimeMs()) return True
def cb(): if ffext.getTime() - beginTm >= 20 or player.isDeath(): player.mapObj.playerLeaveMap(player) player.session = None else: try: player.fsm.update(player, ffext.getTimeMs()) except: pass ffext.timer(1000, cb)
def handleTimer(self, mapObj): #ffext.dump('CopyMapHandler handleTimer', len(mapObj.allPlayer)) n = ffext.getTime() if n - self.createTime >= LIMIT_SEC: self.onEnd() if self.autoPlayerRef != None: player = self.autoPlayerRef() if player and player.mapObj: nowMs = ffext.getTimeMs() player.fsm.update(player, nowMs) else: self.autoPlayerRef = None return True
def onTimer(self): #print ('Ontimer', __name__) nowMs = ffext.getTimeMs() allMap = MapMgr.getMapMgr().allMap for mapName, mapObj in allMap.iteritems(): if mapObj.getPlayerNum() <= 0: if nowMs - mapObj.lastMonsterUpdateMs >= 10 * 1000: continue else: mapObj.lastMonsterUpdateMs = nowMs allMonster = [v for k, v in mapObj.allMonter.iteritems()] for monster in allMonster: monster.fsm.update(monster, nowMs) return True
def selectEnemy(self): lastAttackObj = None self.lastSelectTargetMS = ffext.getTimeMs() if self.lastAttackObjRef != None: lastAttackObj = self.lastAttackObjRef() if lastAttackObj == None: self.lastAttackObjRef = None maxN = self.calMaxReachEnemyDistance() if lastAttackObj and lastAttackObj.isDeath( ) == False and Base.distance(self.x, self.y, lastAttackObj.x, lastAttackObj.y) < maxN: return lastAttackObj objTargetList = self.mapObj.getPlayerInRange(self.x, self.y, maxN) #ffext.dump('select enemy', objTargetList) if objTargetList: obj = objTargetList[random.randint(0, len(objTargetList) - 1)] return obj return None
def whenDie(self, objAttack): #怪物被击杀,给对方加经验 self.tmpInfo['_killedtm_'] = ffext.getTimeMs() if not objAttack or objAttack.getType() != Base.PLAYER: return if self.mapObj and self.mapObj.copyMapHandler: try: self.mapObj.copyMapHandler.handleObjDie(self.mapObj, self) except: ffext.error( 'mapObj.copyMapHandler.handleObjDie failed mapname=%s player=%s' % (self.mapObj.mapname, self.name)) self.handleTaskTrigger(objAttack) self.handleDrop(objAttack) #测试方便,每次被击杀,掉落一个大补丸 #item = ItemModel.createItemByName('大补丸(小)') #try: #except: # ffext.error('mosnter burst exception %s'%(self.name)) return
def onEnter(self, monster): monster.nextMoveTm = ffext.getTimeMs() - 2000 monster.lastAttackObjRef = None #ffext.dump('ai StateIdle enter', monster.name, monster.x, monster.y) return True
def __init__(self, owner): self.owner = weakref.ref(owner) self.state= None self.lastUpdateMS = ffext.getTimeMs() return
def onEnter(self, monster): monster.nextMoveTm = ffext.getTimeMs() - 2000 monster.lastAttackObjRef = None ffext.dump('ai attack StateBackBornPoint enter', monster.name, monster.x, monster.y) return True
def __init__(self, propCfg): #通过类型,出生点,地图,可以知道这个怪从哪里复活 self.bornX = 0 self.bornY = 0 #怪物数据 self.uid = idtool.allocTmpId() self.mapObj = None self.x = 0 self.y = 0 self.direction = Base.Direction.DIRECTION4[random.randint( 0, len(Base.Direction.DIRECTION4) - 1)] #下次移动时间 self.nextMoveTm = ffext.getTimeMs() #状态机 self.fsm = MonsterAI.FSM(self) #怪物配置 self.propCfg = propCfg self.hpMax = propCfg.hp self.hp = propCfg.hp self.mpMax = propCfg.mp self.mp = propCfg.mp #怪物等级 self.level = propCfg.level self.aiFlag = 0 #1表示主动攻击 #暴击 self.crit = propCfg.crit #暴击 影响暴击的概率 浮点数 self.hit = propCfg.hit #命中 影响攻击时的命中率 浮点数 self.avoid = propCfg.avoid #躲避 被攻击时,影响降低被命中的概率 浮点数 self.attackSpeed = propCfg.attackSpeed #攻击速度 self.attackSing = propCfg.attackSing #攻击吟唱时间 影响释放攻击动作前的吟唱时间 吟唱时间内被攻击,有50%概率被打断,打断后需要重新吟唱,单位:秒 精确到毫秒 self.attackInterval = propCfg.attackInterval #两次攻击之间间隔时间,单位:秒 精确到毫秒 self.attackDistance = propCfg.attackDistance #攻击距离 以单位为中心的圆内可以攻击,近战标准值:100,远程值:600 self.moveSpeed = propCfg.moveSpeed #移动速度 影响地图上移动速度,标准值:100 精确到毫秒 self.hurtAbsorb = propCfg.hurtAbsorb #伤害吸收 受到伤害时,一定比例转换为生命值 百分比 self.hpAbsorb = propCfg.hpAbsorb #吸血 当对敌人造成伤害时,吸取血量恢复自身生命值 百分比 #物理攻击 self.physicAttackMin = propCfg.physicAttackMin #最小物理攻击 self.physicAttackMax = propCfg.physicAttackMax #最大物理攻击 #法术攻击 self.magicAttackMin = propCfg.magicAttackMin #最小法术攻击 self.magicAttackMax = propCfg.magicAttackMax #最大法术攻击f #物理防御 self.physicDefendMin = propCfg.physicDefendMin #最小物理防御 self.physicDefendMax = propCfg.physicDefendMax #最大物理防御 #法术防御 self.magicDefendMin = propCfg.magicDefendMin #最小法术防御 self.magicDefendMax = propCfg.magicDefendMax #最大法术防御 #攻击目标 self.objTarget = None #仇恨系统 self.allHurtCount = {} #uid -> MonsterEnemy self.allTeamHurtCount = {} # teamid -> MonsterEnemy 组队的伤害统计 self.lastAttackObjRef = None #最后一次攻击者的弱引用 self.lastSelectTargetMS = 0 #上次选择攻击目标的时间 self.buffCtrl = BuffCtrl(self) #buff 控制 #怪物的技能系统 self.skillCtrl = SkillModel.SkillCtrl(self) self.skillCtrl.learnMonsterSkill(4151) #怪物的默认技能 #怪物重生时间 self.rebornSec = 30 #默认10秒 #上次回血时间 self.lastRecoverHPTM = 0 self.tmpInfo = {} # 临时数据