Пример #1
0
 def __init__(self):
     self.uid = idtool.allocTmpId()
     self.name = ''  #唯一的名称
     self.appr = 0  #显示的外形
     self.mapname = ''  #地图
     self.script = ''  #使用的脚本
     self.x = 0
     self.y = 0
     self.direction = 0
     self.mapObj = None
     self.scriptMod = None
     self.cfg = None
Пример #2
0
 def forkFrom(self, srcPlayer, paramPropRate=100):
     paramPropRate = paramPropRate * 1.0 / 100
     self.uid = idtool.allocTmpId()
     self.name = srcPlayer.name + '的幻象'
     self.job = Base.Job.ZHANSHI
     self.gender = srcPlayer.gender
     self.level = srcPlayer.level
     self.hp = int(srcPlayer.hp * paramPropRate)
     self.mp = int(srcPlayer.mp * paramPropRate)
     self.hpMax = int(srcPlayer.hpMax * paramPropRate)
     self.mpMax = int(srcPlayer.mpMax * paramPropRate)
     self.physicAttackMin = int(srcPlayer.physicAttackMin *
                                paramPropRate)  # 最小物理攻击
     self.physicAttackMax = int(srcPlayer.physicAttackMax *
                                paramPropRate)  # 最大物理攻击
     # 法术攻击
     self.magicAttackMin = int(srcPlayer.magicAttackMin *
                               paramPropRate)  # 最小法术攻击
     self.magicAttackMax = int(srcPlayer.magicAttackMax *
                               paramPropRate)  # 最大法术攻击
     # 物理防御
     self.physicDefendMin = int(srcPlayer.physicDefendMin *
                                paramPropRate)  # 最小物理防御
     self.physicDefendMax = int(srcPlayer.physicDefendMax *
                                paramPropRate)  # 最大物理防御
     # 法术防御
     self.magicDefendMin = int(srcPlayer.magicDefendMin *
                               paramPropRate)  # 最小法术防御
     self.magicDefendMax = int(srcPlayer.magicDefendMax *
                               paramPropRate)  # 最大法术防御
     # 暴击
     self.crit = int(srcPlayer.crit * paramPropRate)  # 暴击 影响暴击的概率	浮点数
     self.crit = int(srcPlayer.crit * paramPropRate)  # 命中 影响攻击时的命中率	浮点数
     self.avoid = int(srcPlayer.avoid *
                      paramPropRate)  # 躲避 被攻击时,影响降低被命中的概率	浮点数
     self.attackSpeed = srcPlayer.attackSpeed  # 攻击速度
     self.attackSing = srcPlayer.attackSing  # 攻击吟唱时间 影响释放攻击动作前的吟唱时间 吟唱时间内被攻击,有50%概率被打断,打断后需要重新吟唱,单位:秒  精确到毫秒
     self.attackInterval = srcPlayer.attackInterval  # 两次攻击之间间隔时间,单位:秒  精确到毫秒
     self.attackDistance = 4  # 攻击距离	以单位为中心的圆内可以攻击,近战标准值:100,远程值:600
     self.moveSpeed = srcPlayer.moveSpeed  # 移动速度 影响地图上移动速度,标准值:100 精确到毫秒
     self.hurtAbsorb = int(srcPlayer.hurtAbsorb *
                           paramPropRate)  # 伤害吸收 受到伤害时,一定比例转换为生命值 百分比
     self.hpAbsorb = int(srcPlayer.hpAbsorb *
                         paramPropRate)  # 吸血 当对敌人造成伤害时,吸取血量恢复自身生命值 百分比
     self.modeAttack = srcPlayer.modeAttack  # 攻击模式
     # 战斗力
     self.fightPower = srcPlayer.fightPower
     self.skillCtrl.learnSkill(110, 1)  #自动获得普攻
     from model.monster import MonsterAI
     self.fsm = MonsterAI.FSM(self)
Пример #3
0
 def addCallBack(self, func, arg=None):
     callbackId = idtool.allocTmpId()
     self.callbackFuncs[callbackId] = (func, arg)
     #ffext.dump('doCallBack', callbackId, self.callbackFuncs)
     return callbackId
Пример #4
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 = {}  # 临时数据
Пример #5
0
    def addWarVsInfo(self, guild1, guild2):
        warInfo = GuildWarVSInfo()
        warId = idtool.allocTmpId()
        warInfo.warId = warId
        warInfo.guild1 = guild1
        warInfo.guild2 = guild2
        warInfo.tmWarStart = ffext.getTime() + WAR_SEC_START
        self.allGuildWarVSInfo[warInfo.warId] = warInfo

        def cbStart():
            retMsg = MsgDef.GuildWarOpsRet(MsgDef.GuildWarOpsCmd.WAR_START,
                                           warInfo.tmWarStart)
            retMsg.warApplyGuild = buildGuildInfoMsg(guild1)
            retMsg.warFightGuild = buildGuildInfoMsg(guild2)
            guild1.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)
            guild2.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)

            # 更新颜色
            def updatePlayerColor1(player):
                player.nameColor = MsgDef.ECOLOR.BLUE
                player.SendChangeApprMsg()
                return

            def updatePlayerColor2(player):
                player.nameColor = MsgDef.ECOLOR.YELLOW
                player.SendChangeApprMsg()
                return

            guild1.foreachOnlineMember(updatePlayerColor1)
            guild2.foreachOnlineMember(updatePlayerColor2)
            return

        def cbEnd():
            warInfo = self.allGuildWarVSInfo.pop(warId, None)
            if not warInfo:
                return
            warInfo.tmWarStart = 0
            retMsg = MsgDef.GuildWarOpsRet(MsgDef.GuildWarOpsCmd.WAR_END,
                                           warInfo.tmWarStart)
            retMsg.winGuildId = 0
            if warInfo.guildScore1 >= warInfo.guildScore2:
                retMsg.winGuildId = warInfo.guild1.guildID
            else:
                retMsg.winGuildId = warInfo.guild2.guildID
            retMsg.warApplyGuild = buildGuildInfoMsg(guild1)
            retMsg.warFightGuild = buildGuildInfoMsg(guild2)
            guild1.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)
            guild2.sendMsg2OnlineMember(MsgDef.ServerCmd.GUILD_WAR_OPS, retMsg)

            # 更新颜色
            def updatePlayerColor(player):
                player.nameColor = 0
                player.SendChangeApprMsg()
                return

            guild1.foreachOnlineMember(updatePlayerColor)
            guild2.foreachOnlineMember(updatePlayerColor)
            return

        ffext.timer(WAR_SEC_START * 1000, cbStart)
        ffext.timer((WAR_SEC_START + WAR_SEC_END) * 1000, cbEnd)
        return warInfo
Пример #6
0
    def addRankWarVsInfo(self, guildId1, guildId2, mapxy):
        rankWarInfo = GuildRankWarVSInfo()
        rankWarId = idtool.allocTmpId()
        rankWarInfo.warId = rankWarId
        rankWarInfo.guildId1 = guildId1
        rankWarInfo.guildId2 = guildId2
        rankWarInfo.guildTeam1 = {}
        rankWarInfo.guildTeam2 = {}
        rankWarInfo.tmRankWarStart = ffext.getTime() + RANK_WAR_SEC_START
        retMsg = MsgDef.GuildRankWarOpsRet()
        cmd = MsgDef.ClientCmd.GUILD_RANKWAR_OPS

        def cb(ret):
            for row in ret.result:
                memberUid = int(row[0])
                guildId = int(row[1])
                memberSession = ffext.getSessionMgr().findByUid(memberUid)
                if memberSession:
                    member = memberSession.player
                    #询问是否进入地图
                    retMsg.guildId = guildId
                    retMsg.mapname = mapxy[0]
                    retMsg.x = mapxy[1]
                    retMsg.y = mapxy[2]
                    memberSession.sendMsg(cmd, retMsg)
                import time
                time.sleep(10)
                if guildId == rankWarInfo.guildId1 and member.mapname == mapxy[
                        0]:
                    member.modeAttack = MsgDef.EATTACK_MODE.PEACE
                    rankWarInfo.guildTeam1[memberUid] = member
                elif guildId == rankWarInfo.guildId2 and member.mapname == mapxy[
                        0]:
                    member.modeAttack = MsgDef.EATTACK_MODE.PEACE
                    rankWarInfo.guildTeam2[memberUid] = member
            self.allGuildRankWarVSInfo[rankWarInfo.warId] = rankWarInfo

        DbService.getGuildService().queryRankWarTeamMember(
            1, rankWarInfo.guildId1, rankWarInfo.guildId2, cb)

        #self.allGuildWarVSInfo[rankWarInfo.warId] = rankWarInfo

        def cbStart():
            retMsg = MsgDef.GuildWarOpsRet(
                MsgDef.GuildRankWarOpsCmd.RANKWAR_START,
                rankWarInfo.tmRankWarStart)
            for k, v in rankWarInfo.guildTeam1.iteritems():
                v.modeAttack = MsgDef.EATTACK_MODE.GUILD
            for k, v in rankWarInfo.guildTeam2.iteritems():
                v.modeAttack = MsgDef.EATTACK_MODE.GUILD
            pass

        def cbEnd():
            rankWarInfo = self.allGuildRankWarVSInfo.pop(rankWarId, None)
            if not rankWarInfo:
                return
            rankWarInfo.tmRankWarStart = 0
            retMsg = MsgDef.GuildRankWarOpsRet(
                MsgDef.GuildRankWarOpsCmd.RANKWAR_END,
                rankWarInfo.tmRankWarStart)
            retMsg.winGuildId = 0
            if rankWarInfo.guildWin:
                retMsg.winGuildId = rankWarInfo.guildWin

            elif rankWarInfo.guildScore1 > rankWarInfo.guildScore2:
                rankWarInfo.guildWin = rankWarInfo.guild1.guildID
                retMsg.winGuildId = rankWarInfo.guild1.guildID
            elif rankWarInfo.guildScore1 < rankWarInfo.guildScore2:
                rankWarInfo.guildWin = rankWarInfo.guild2.guildID
                retMsg.winGuildId = rankWarInfo.guild2.guildID
            elif rankWarInfo.guildScore1 == rankWarInfo.guildScore2:
                allHp1 = 0
                allHp2 = 0
                for k, v in rankWarInfo.guildTeam1.iteritems():
                    memberSession = ffext.getSessionMgr().findByUid(k)
                    if memberSession:
                        member = memberSession.player
                        allHp1 += member.hp
                for k, v in rankWarInfo.guildTeam2.iteritems():
                    memberSession = ffext.getSessionMgr().findByUid(k)
                    if memberSession:
                        member = memberSession.player
                        allHp2 += member.hp
                if allHp1 > allHp2:
                    rankWarInfo.guildWin = rankWarInfo.guild1.guildID
                    retMsg.winGuildId = rankWarInfo.guild1.guildID
                elif allHp1 < allHp2:
                    rankWarInfo.guildWin = rankWarInfo.guild2.guildID
                    retMsg.winGuildId = rankWarInfo.guild2.guildID

            if not retMsg.winGuildId:
                DbService.getGuildService().updateRankWarWin(
                    0, rankWarInfo.guildId1, rankWarInfo.guildId2)
                for k, v in rankWarInfo.guildTeam1.iteritems():
                    memberSession = ffext.getSessionMgr().findByUid(k)
                    memberSession.sendMsg(cmd, retMsg)
                for k, v in rankWarInfo.guildTeam2.iteritems():
                    memberSession = ffext.getSessionMgr().findByUid(k)
                    memberSession.sendMsg(cmd, retMsg)
            else:
                DbService.getGuildService().updateRankWarWin(
                    0, rankWarInfo.getAnotherGuild(retMsg.winGuildId))

            if retMsg.winGuildId == rankWarInfo.guild1.guildID:
                for k, v in rankWarInfo.guildTeam1.iteritems():
                    memberSession = ffext.getSessionMgr().findByUid(k)
                    memberSession.sendMsg(cmd, retMsg)
            elif retMsg.winGuildId == rankWarInfo.guild2.guildID:
                for k, v in rankWarInfo.guildTeam1.iteritems():
                    memberSession = ffext.getSessionMgr().findByUid(k)
                    memberSession.sendMsg(cmd, retMsg)

        ffext.timer(WAR_SEC_START * 1000, cbStart)
        ffext.timer((WAR_SEC_START + WAR_SEC_END) * 1000, cbEnd)
        return rankWarInfo