def addInstance_record_id(characterid,instanceid,score=-1): '''添加角色通关记录 @param characterid:int 角色id @param instanceid: int 副本id ''' player=PlayersManager().getPlayerByID(characterid) #当前角色实例 tag=player.baseInfo.getInstancetag() instance=InstanceManager().getInstanceByIdTag(tag) sid=dbInstance_record_id.getisInstanceRecord(characterid, instanceid) if not sid: #如果通关记录里面没有,加入通关副本 if not player.instance.addClean(instanceid):#如果添加通关副本成功 # if not dbInstance_record_id.insertInstanceRecord(characterid, instanceid):#如果添加通关副本成功 log.err(u"instance_app/addInstance_record_id 添加通关记录失败") else: if instance.islq: player.finance.updateAddMorale(20,True) instance.islq=False player.schedule.noticeSchedule(19,goal = 1) else: if instance.islq: player.finance.updateAddMorale(2,True) instance.islq=False player.daily.noticeDaily(6,instanceid,1)
def iteranceInstance(characterId): '''重打副本''' player= PlayersManager().getPlayerByID(characterId) #获取角色 if not player: return {'result':False,'message':Lg().g(18)} instanceId=player.baseInfo.getInstanceid() #获取角色所在副本Id tag=player.baseInfo.getInstancetag() #副本动态Id Instance=InstanceManager().getInstanceByIdTag(tag) #获取 副本 if not Instance: log.err(u"不存在副本动态id %s"%tag) Instance.initInstance() #初始化副本 #start角色有队伍境况下组队进入副本 loaduser=[]#记录需要推送消息的角色对象 if player.teamcom.amisteam(): #如果角色有队伍 if player.teamcom.amITeamLeader(): #判断是否是队长 sceneid=player.baseInfo.getLocation() #获取队长当前场景Id members=player.teamcom.getMyTeamMember() #获取队伍成员列表 if members: if len(members)>1: for py1 in members: #遍历所有队员 if py1.baseInfo.getLocation()==sceneid:#判断当前角色是否和队长在同一个场景中 enterplay(py1,instanceId,Instance) #角色进入副本操作 else:#若该成员和队长不在同一场景,推送是否进入副本提示框消息 loaduser.append(py1.getDynamicId()) pushObjectNetInterface.pushLeaderInstance(loaduser,player.baseInfo.getId()) else:#如果请求的人有队伍并且不是队长 return {'result':False,'message':u'在队伍中的成员中只有队长才能开启副本'} #end 角色有队伍境况下组队进入副本 else: enterplay(player,instanceId,Instance) #角色进入副本操作 data = {'placeId':Instance.getSceneResourceidByid(Instance._inSceneid)} return {'result':True,'message':u'进入副本','data':data}
def dropInstanceAllplayer(did,tag): '''如果副本内没有角色那么销毁该副本 @param did: int 副本id @param tag: int 副本动态id ''' Instan1=InstanceManager().getInstanceByIdTag(tag)#获取副本实例 if not Instan1.ishavingplayer():#如果副本内没有角色的话 InstanceManager().dropInstanceById(tag)
def moveInScene(dynamicId, characterId, sceneId, x, y): '''在场景中移动 @param dynamicId: int 客户端的id @param characterId: int 角色的id @param x: int 移动到的x坐标 @param y: int 移动到的y坐标 ''' player = PlayersManager().getPlayerByID(characterId) if not player: return if x == -1 and y == -1: if player.baseInfo.getState() == 1: #如果角色在副本 sceneId = player.baseInfo.getLocation() #获取角色所在场景Id # id=player.baseInfo.getInstanceid() #副本模板Id dtid = player.baseInfo.getInstancetag() #副本动态Id instance = InstanceManager().getInstanceByIdTag(dtid) #获取副本实例 sceneId = instance._Scenes.keys()[0] nowScene = instance._Scenes[sceneId] #获取场景实例 nowScene.pushNowScenePosition(dynamicId, characterId) else: scene = MapManager().getMapId(sceneId) scene.pushNowScenePosition(dynamicId, characterId) return if not player: return {'result': False, 'message': Lg().g(18)} if player.baseInfo.getStatus() != 1: return { 'result': False, 'message': u'您正处于%s状态' % player.baseInfo.getStatusName() } player.baseInfo.updateDestination((x, y))
def FightInScene(dynamicId, characterId, monsterId): '''副本战斗 @param dynamicId: int 客户端的动态id @param characterId: int 角色的id @param monsterId: int 碰撞的怪物在场景中的id ''' res = CanDoServer(characterId) if not res['result']: return res player = PlayersManager().getPlayerByID(characterId) if not player.CheckClient(dynamicId): return {'result': False, 'message': Lg().g(18)} if not player.status.getLifeStatus(): return {'result': False, 'message': Lg().g(97)} if player.baseInfo.getState() == 1: #如果角色在副本 dtid = player.baseInfo.getInstancetag() #副本动态Id instance = InstanceManager().getInstanceByIdTag(dtid) #获取副本实例 sceneId = player.baseInfo.getLocation() nowScene = instance._Scenes[sceneId] #获取场景实例 else: town = player.baseInfo.getTown() nowScene = MapManager().getMapId(town) # return {'result':False,'message':Lg().g(64)} data = nowScene.FightInScene(monsterId, int(player.baseInfo.getPosition()[0]), characterId) if data.get('result'): player.baseInfo.setStatus(4) #角色状态设置为战斗状态 return data
def NetConnLost_2(dynamicId): '''loginout''' player = PlayersManager().getPlayerBydynamicId(dynamicId) if not player: return True try: tag = player.baseInfo.getInstancetag() #副本动态Id InstanceManager().dropInstanceById(tag) #如果角色下线的时候在副本中,就清空副本 player.afk.stopMeditation() #在线挂机结算 player.updatePlayerDBInfo() # player.qhtime.dbupdate()#记录角色强化冷却时间 player.nobility.dbupdate() #记录爵位限制信息 player.petShop.dbupdate() #记录宠物商店信息 # publicnoderemote.callRemote('dropPCharacter',player.baseInfo.id) PlayersManager().dropPlayer(player) state = player.baseInfo.getState() if state == 0: sceneId = player.baseInfo.getTown() scene = MapManager().getMapId(sceneId) scene.dropPlayer(player.baseInfo.id) if player.baseInfo.getState() == 0: scene.dropPlayer(player.baseInfo.id) for petId, pet in player.pet._pets.items(): if pet.getFlowFlag(): scene.dropPet(petId) except Exception as ex: log.err(ex) finally: return True
def initMemory(characterId, argument): ''''刷新从数据库读取的数据''' from app.scense.serverconfig.confighandle import initDBData from app.scense.core.instance.InstanceManager import InstanceManager from app.scense.core.shop.shopmanager import ShopManager SceneManager_new().__init__() InstanceManager().__init__() ShopManager().__init__() Mall().__init__() initDBData() log.msg(u"刷新从数据库读取的数据")
def GetCopySceneInfo(pid): '''返回副本怪物数量,角色信息以及国信息''' from app.scense.core.instance.ColonizeManage import ColonizeManage player=PlayersManager().getPlayerByID(pid) if not player: log.err(u"角色不存在%s"%pid) return None if player.baseInfo.getState()==1: #如果角色在副本中 tag=player.baseInfo.getInstancetag()#副本动态id sceneid=player.baseInfo.getLocation() #角色所在副本的场景id instanceinfo= InstanceManager().getInstanceByIdTag(tag)#副本实例 sceneinfo=instanceinfo.getScene(sceneid)#副本场景实例 count=len(sceneinfo._monsters)#怪物数量 instanceid=instanceinfo.getId()#获取副本id data=ColonizeManage().getInstanceInfoByinstanceid(instanceid) if data['gid']==0: data['gname']=Lg().g(143) if data: return {'count':count,'pid':data['pid'],'pname':data['pname'],'gid':data['gid'],'gname':data['gname']} return None return None
def _pushSceneInfo(dynamicId, characterId): '''推送场景信息''' player = PlayersManager().getPlayerByID(characterId) if player.baseInfo.getState() == 1: #如果角色在副本 # id=player.baseInfo.getInstanceid() #副本模板Id dtid = player.baseInfo.getInstancetag() #副本动态Id instance = InstanceManager().getInstanceByIdTag(dtid) #获取副本实例 sceneId = player.baseInfo.getLocation() oldscene = instance._Scenes[sceneId] #获取场景实例 else: sceneId = player.baseInfo.getTown() oldscene = SceneManager_new().getSceneById(sceneId) if oldscene: oldscene.pushEnterPlace([dynamicId])
def enterInstance1(player,dynamicId,characterId,instanceId,famId): '''进入副本 @param dynamicId: int 角色动态Id @param characterId: int 角色Id @param instanceId: int 副本Id ''' player=PlayersManager().getPlayerByID(characterId) if not player: return {'result':False,'message':Lg().g(18)} if player.baseInfo.getState==1: #角色在副本中 return {'result':False,'message':Lg().g(114)} player.startAllTimer() Instan1= InstanceManager().addInstance(instanceId,famId) #把副本添加到副本管理器中,返回副本管理器中的这个副本实例 scenename = Instan1._name chatnoderemote.callRemote('JoinRoom',characterId,famId,scenename) # Instan1.setTag(famId) if not Instan1: return {'result':False,'message':u'没有id为%d的副本'%instanceId} activationInstance(Instan1, player) #激活副本 enterplay(player,instanceId,Instan1) #角色进入副本操作 data = {'placeId':Instan1.getSceneResourceidByid(Instan1._inSceneid)} player.baseInfo.setInstanceid(instanceId) return {'result':True,'message':u'进入副本成功','data':data} #返回副本初始Id
def getAllCardInfo(dynamicId, characterId): '''获取所有卡片的信息 @param dynamicId: int 客户端的动态id @param characterId: int 角色的id ''' player = PlayersManager().getPlayerByID(characterId) if not player or not player.CheckClient(dynamicId): return {'result': False, 'message': Lg().g(18)} if player.baseInfo.getState() == 1: #如果角色在副本 # id=player.baseInfo.getInstanceid() #副本模板Id dtid = player.baseInfo.getInstancetag() #副本动态Id instance = InstanceManager().getInstanceByIdTag(dtid) #获取副本实例 data = instance.cards.getAllCardInfo(characterId) else: data = {'result': False} return data
def playerBackRevive(dynamicId,characterId): '''角色回城复活 @param dynamicId: int 客户端的id @param characterId: int 角色的id ''' player = PlayersManager().getPlayerByID(characterId) if not player or not player.CheckClient(dynamicId): return {'result':False,'message':Lg().g(18)} if player.status.getLifeStatus(): return {'result':False,'message':Lg().g(185)} # player.baseInfo.setState(0) # data = enterPlace(dynamicId,characterId,1000) # if not data.get('result',False): # return data state = player.baseInfo.getState() if state==0: lastscene = SceneManager_new().getSceneById(player.baseInfo.getLocation()) lastscene.dropPlayer(player.baseInfo.id) else: # id=player.baseInfo.getInstanceid() #副本id tag=player.baseInfo.getInstancetag() #副本动态Id instance=InstanceManager().getInstanceByIdTag(tag) #获取副本实例 old=instance._Scenes[player.baseInfo.getLocation()] #获取当前角色所在副本中的场景 old.dropPlayer(player.baseInfo.id) #从当前场景中移除角色 gotoSence = SceneManager_new().getSceneById(1000) if not gotoSence: scene = PublicScene(1000) SceneManager_new().addScene(scene) # else: # areaid = gotoSence.getAreaid() gotoSence.addPlayer(player) # player.baseInfo.setAreaid(areaid) player.baseInfo.setPosition(gotoSence.baseInfo.getInitiaPosition()) player.baseInfo.setLocation(1000) player.baseInfo.setState(0) player.status.updateLifeStatus(1) player.attribute.updateHp(int(player.attribute.getMaxHp()*0.01)+1) player.attribute.updateMp(int(player.attribute.getMaxMp()*0.01)+1) pushEnterPlace(1000,dynamicId) player.teamcom.pushTeamMemberInfo() return {'result':True,'message':Lg().g(186)}
def updateInstanceInfo(rate): '''更新副本场景角色的信息''' try: InstanceManager().pushAllInstanceInfo(rate) finally: reactor.callLater(rate, updateInstanceInfo, rate)
def pushAllSceneInfo(delta): '''推送所有场景中的玩家位置''' try: InstanceManager().pushAllInstanceInfo(delta) except Exception, e: log.err(e)