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
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)
def addCallBack(self, func, arg=None): callbackId = idtool.allocTmpId() self.callbackFuncs[callbackId] = (func, arg) #ffext.dump('doCallBack', callbackId, self.callbackFuncs) return callbackId
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 = {} # 临时数据
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
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