Пример #1
0
 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
Пример #2
0
 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)
Пример #3
0
 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
Пример #4
0
    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
Пример #5
0
 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
Пример #6
0
    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
Пример #7
0
 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
Пример #8
0
 def __init__(self, owner):
     self.owner = weakref.ref(owner)
     self.state= None
     self.lastUpdateMS = ffext.getTimeMs()
     return
Пример #9
0
 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
Пример #10
0
    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 = {}  # 临时数据