#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- ##@package PlayerControl # @todo: Íæ¼Ò¿ØÖÆÆ÷ # # @author Alee # @date 2010-02-20 16:30 # @version 1.0 # #--------------------------------------------------------------------- #"""Version = 2017-07-17 15:00""" #--------------------------------------------------------------------- import GameWorld import SkillShell import ChConfig import PlayerHorse import PlayerTeam import SkillCommon import MirrorAttack import GameMap import FBLogic import GameWorldProcess import NPCCommon import ItemCommon import ReadChConfig import BuffSkill import PetControl import OperControlManager import PlayerFamily import ShareDefine import PlayerViewCache import PlayerBillboard import GameServerRefresh import IPY_GameWorld import PlayerGameWallow import ChPyNetSendPack import NetPackCommon import DataRecordPack import PlayerPrestigeSys import PlayerActivity import FBCommon import PassiveBuffEffMng import EventReport import PlayerSuccess import ItemControler import GameFuncComm import IpyGameDataPY import PyGameData import PlayerMagicWeapon import PlayerFeastTravel import PlayerActTurntable import GameLogic_SealDemon import GameLogic_ZhuXianBoss import GameLogic_CrossDemonKing import PlayerVip import PlayerCostRebate import PlayerActLunhuidian import PlayerActGarbageSorting import GY_Query_CrossRealmReg import PlayerTongTianLing import FunctionNPCCommon import PlayerGoldInvest import CrossRealmPlayer import CrossPlayerData import ChNetSendPack import PlayerAssist import PlayerState import PlayerGubao import PlayerOnline import PlayerTask import PlayerMail import ChPlayer import GameObj import random import types import math import time import json #--------------------------------------------------------------------- #ÐÅÏ¢ÌáʾÁбí NotifyCodeList = IPY_GameWorld.IPY_NotifyCodeList() #buff×Ö¶ÎDieContinueλ±íʾ±êʶ Def_Buff_Clear_Die = 0x1 # ËÀÍöÇå³ýbuff Def_Buff_Clear_Disconnect = 0x2 # ÏÂÏßÇå³ýbuff #--------------------------------------------------------------------- ##¿Í»§¶Ë·¢ËÍÒÆ¶¯·â°ü¼ì²é # @param curPlayer Íæ¼ÒʵÀý # @param clientWorldTick ÉÏ´ÎÒÆ¶¯Ê±¼ä´Á # @return ·µ»ØÖµÕæ, ¿ÉÒÔÒÆ¶¯ # @remarks ¿Í»§¶Ë·¢ËÍÒÆ¶¯·â°ü¼ì²é def PlayerMoveCheckClientWorldTick(curPlayer, clientWorldTick, sendPack_PosX, sendPack_PosY): gameWorldTick = GameWorld.GetGameWorld().GetTick() Def_Max_Move_Tick = 5000 if abs(gameWorldTick - clientWorldTick) >= Def_Max_Move_Tick: curPlayer.Sync_ClientTick() #ʱ¼äÏà²î¹ý´ó£¬¿ÉÄÜÒòÍøÂçÒýÆð£¬À­»Ø GameWorld.DebugLog("PlayerMoveCheckClientWorldTick -- ·þÎñÆ÷tick %s-¿Í»§¶Ë%sʱ¼äÏà²î¹ý´ó£¬¿ÉÄÜÒòÍøÂçÒýÆð£¬À­»Ø" % ( gameWorldTick, clientWorldTick), curPlayer.GetID()) return False if gameWorldTick - curPlayer.GetDictByKey("CheckTick") > 60000: # 1·ÖÖÓ¾ÀÕýÒ»´Îtick,ͬʱÓÃÓÚÕ½¶·ºÍÒÆ¶¯µÄ¼ì²é curPlayer.SetMoveCount(0) curPlayer.SetDict("CheckTick", gameWorldTick) lastMoveTick = curPlayer.GetClientMoveTick() if clientWorldTick < lastMoveTick: #and GameWorld.GetGameWorld().GetTick() - curPlayer.GetLoginTick() > 15000: #Íæ¼ÒµÇÈëʱ¼ä´óÓÚ15Ãë, ²Å»áÌß³öÍæ¼Ò #2009.4.16. bug: #Íæ¼ÒÇл»µØÍ¼, ·þÎñÆ÷»º´æ×ß··â°ü, µ½´ïеØÍ¼, »º´æÖеķâ°üÊÕµ½, ½á¹ûÌß³öÁËÍæ¼Ò GameWorld.DebugLog('---clientWorldTick < lastMoveTick: %s, TickÌ«Âý' % curPlayer.GetAccID()) #curPlayer.Kick(IPY_GameWorld.disTickError) errCnt = curPlayer.GetMoveCount() curPlayer.SetMoveCount(errCnt + 1) if errCnt > 5: return False # ÑéÖ¤Á½´Îtick¼ä¿ÉÄܲúÉúµÄ×ø±ê²î dist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), sendPack_PosX, sendPack_PosY) canMoveDist = math.ceil((clientWorldTick - lastMoveTick) / float(curPlayer.GetSpeed())) + 2 #if clientWorldTick - curPlayer.GetPlayerAttackTick() < GetAtkInterval(curPlayer): # # ¹¥»÷²úÉúµÄÎ»ÒÆ¿ÉÄÜÒòΪ¹¥»÷ËÙ¶È¸Ä±ä¶ø±ä¿ì£¬¹¥»÷ÆÚ¼äµÄÒÆ¶¯°üÔÊÐí¶àÒÆ¶¯1Ã×µÄËÙ¶È # canMoveDist += 2 if dist > canMoveDist: GameWorld.DebugLog("¾àÀë²î%s ×ø±êS/C:%s---ÑéÖ¤Á½´Îtick¼ä¿ÉÄܲúÉúµÄ×ø±ê²î%s %s - %s" % (dist, [curPlayer.GetPosX(), curPlayer.GetPosY(), sendPack_PosX, sendPack_PosY], canMoveDist, clientWorldTick, lastMoveTick)) errCnt = curPlayer.GetMoveCount() curPlayer.SetMoveCount(errCnt + 1) if errCnt > 5: return False #ʱ¼ä²î # curPlayer.UpdatePosByTick(gameWorldTick - clientWorldTick + gameWorldTick) #curPlayer.UpdatePos() return True # notifyCnt ´ú±í¹ã²¥ÖÜÎ§Íæ¼ÒµÄÊýÁ¿£¬0Ϊȫ²¿¹ã²¥ -1Ϊָ¶¨ÁбíËæ»ú£¬ ÆäËûÊý×ÖΪָ¶¨Ö¸ def PyNotifyAll(curPlayer, sendPack, notifySelf=True, notifyCnt=0): if notifyCnt == -1: notifyCnt = 8 #GameWorld.DebugLog("PyNotifyAll %s"%notifyCnt) curPlayer.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength(), notifySelf, notifyCnt) #--------------------------------------------------------------------- ##Ö´ÐÐÍæ¼ÒÔÚÕϰ­µãÂß¼­ # @param curPlayer Íæ¼ÒʵÀý # @return ²¼¶ûÖµ, FlaseÎªÍæ¼Ò²»ÔÚÕϰ­µãÖÐ # @remarks Ö´ÐÐÍæ¼ÒÔÚÕϰ­µãÂß¼­ def DoLogic_PlayerInBarrierPoint(curPlayer): curPlayerPosX = curPlayer.GetPosX() curPlayerPosY = curPlayer.GetPosY() curPlayerID = curPlayer.GetID() #---Íæ¼Ò²»ÔÚÕϰ­µãÖÐ--- if GameWorld.GetMap().CanMove(curPlayerPosX, curPlayerPosY): return False #---Íæ¼ÒÔÚÕϰ­µãÖÐ--- #ÔÚÕϰ­µã¸½¼þ2¸ñѰÕÒºÏÊÊλÖà curFindPos = GameMap.GetEmptyPlaceInArea(curPlayerPosX, curPlayerPosY, 3) curFindPosX = curFindPos.GetPosX() curFindPosY = curFindPos.GetPosY() #Íæ¼ÒÎÞ·¿É×ß if curFindPosX == curPlayerPosX and curFindPosY == curPlayerPosY: curPlayer.StopMove() #=============================================================================== # playerControl = PlayerControl(curPlayer) # playerControl.SetToBornPlace() #=============================================================================== GameWorld.Log("Íæ¼ÒÎÞ·¿É×ß, ´ò»ØÖØÉúµã!(%d,%d)" % (curPlayerPosX, curPlayerPosY), curPlayerID) #Õϰ­µãÖܱ߿ÉÒÔÒÆ¶¯, ½«Íæ¼ÒÖÃλ else: curPlayer.ResetPos(curFindPosX, curFindPosY) curPlayer.StopMove() GameWorld.Log("Íæ¼ÒÕ¾ÔÚÕϰ­µãÖÐ, Í£Ö¹ÒÆ¶¯ (%d,%d)" % (curPlayerPosX, curPlayerPosY), curPlayerID) return True #--------------------------------------------------------------------- ## ÏûÏ¢Ìáʾ # @param curPlayer ÌáʾµÄÍæ¼Ò # @param msgMark ÌáʾÐÅÏ¢Mark # @param msgParamList ÐÅÏ¢²ÎÊýÁбí # @return ÎÞ·µ»ØÖµ # @remarks def NotifyCode(curPlayer, msgMark, msgParamList=[]): if curPlayer == None: GameWorld.ErrLog('NotifyCode Player = None') return curPlayer.NotifyCode(msgMark, __GetNotifyCodeList(msgParamList)) return ## ÊÀ½ç¹ã²¥ # @param country ÌáʾµÄ¹ú¼Ò # @param msgMark ÌáʾÐÅÏ¢Mark # @param msgParamList ÐÅÏ¢²ÎÊýÁбí # @param lineID:Ïß·ID£¨Ä¬ÈÏ0£¬±íʾȫ·þ¹ã²¥£© # @param mergeMinOSD ¸ÃÌáʾÕë¶Ô¿ç·þ×Ó·þÓÐЧµÄ×îС¿ª·þÌì, >=0ʱÓÐÏÞÖÆ # @param mergeMaxOSD ¸ÃÌáʾÕë¶Ô¿ç·þ×Ó·þÓÐЧµÄ×î´ó¿ª·þÌì, >=0ʱÓÐÏÞÖÆ # @param mergeMapInfo ¸ÃÌáʾËùÊôµÄ¿ç·þ»î¶¯µØÍ¼ÐÅÏ¢, Ö÷ÒªÓÃÓÚ²»Í¬×Ó·þ¶ÔÓ¦Ëù¿çµÄ»î¶¯µØÍ¼ID # @return ÎÞ·µ»ØÖµ def WorldNotify(country, msgMark, msgParamList=[], lineID=0, mergeMinOSD=-1, mergeMaxOSD=-1, mergeMapInfo=[]): #GameWorld.GetPlayerManager().BroadcastCountry_NotifyCode(country, 0, msgMark, __GetNotifyCodeList(msgParamList), lineID) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.OnlineCount()): curPlayer = playerManager.OnlineAt(i) if not GameWorld.IsNormalPlayer(curPlayer): continue NotifyCode(curPlayer, msgMark, msgParamList) return def GetCrossWorldNotifyInfo(country, msgMark, msgParamList=[]): return {"Type":ShareDefine.CrossNotify_World, "Params":[country, msgMark, msgParamList]} def GetCrossFamilyNotifyInfo(familyID, msgMark, msgParamList=[]): return {"Type":ShareDefine.CrossNotify_Family, "Params":[familyID, msgMark, msgParamList]} def CrossNotify(serverGroupIDList, crossNotifyList): ''' ¿ç·þ¹ã²¥ÐÅÏ¢Ìáʾ£¬Ö§³Öͬ²½¶àÌõ£¬Í¬Ê±Ò²½¨Òé¶àÌõÒ»Æðͬ²½ @param serverGroupIDList: ÐèҪͬ²½µ½µÄÄ¿±ê·þÎñÆ÷×éIDÁбí @param crossNotifyList: ÐÅÏ¢ÌáʾÁÐ±í£¬Í¨¹ý GetCrossWorldNotifyInfo GetCrossFamilyNotifyInfo º¯Êý»ñµÃ·µ»ØÖµÌí¼Óµ½Áбí ''' sendMsg = str([serverGroupIDList, crossNotifyList]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CrossNotify", sendMsg, len(sendMsg)) return #--------------------------------------------------------------------- ## ¼Ò×å¹ã²¥ # @param familyID ÌáʾµÄ¼Ò×åID # @param msgMark ÌáʾÐÅÏ¢Mark # @param msgParamList ÐÅÏ¢²ÎÊýÁбí # @return ÎÞ·µ»ØÖµ # @remarks def FamilyNotify(familyID, msgMark, msgParamList=[]): #GameWorld.GetPlayerManager().BroadcastCountry_NotifyCode(0, familyID, msgMark, __GetNotifyCodeList(msgParamList)) PlayerFamily.NotifyAllFamilyMemberMsg(familyID, msgMark, msgParamList) return #--------------------------------------------------------------------- ##±¾µØÍ¼ÄÚµÄ֪ͨ # @param msgMark ÌáʾÐÅÏ¢Mark # @param msgParamList ÐÅÏ¢²ÎÊýÁбí # @return ÎÞ·µ»ØÖµ # @remarks def FBNotify(msgMark, msgParamList=[]): GameWorld.GetMapCopyPlayerManager().BroadcastFB_NotifyCode(msgMark, __GetNotifyCodeList(msgParamList)) return def FBFactionNotifySelf(faction, msgMark, msgParamList=[]): ## ¸±±¾×Ô¼ºÕóÓª¹ã²¥ copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in xrange(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue if curPlayer.GetFaction() == faction: NotifyCode(curPlayer, msgMark, msgParamList) return def FBFactionNotifyOther(faction, msgMark, msgParamList=[]): ## ¸±±¾ÆäËûÕóÓª¹ã²¥ copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in xrange(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue if curPlayer.GetFaction() != faction: NotifyCode(curPlayer, msgMark, msgParamList) return def FBFactionNotify(faction, selfMsgMark, selfMsgParamList, otherMsgMark, otherMsgParamList): ## ¸±±¾¹ã²¥×Ô¼º¼°ÆäËûÕóÓª£¬Çø·Ö¹ã²¥ÐÅÏ¢ copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in xrange(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue if curPlayer.GetFaction() == faction: NotifyCode(curPlayer, selfMsgMark, selfMsgParamList) else: NotifyCode(curPlayer, otherMsgMark, otherMsgParamList) return ## ¶ÓÎé¹ã²¥ # @param teamID ¶ÓÎéID # @param msgMark ÌáʾÐÅÏ¢Mark # @param msgParamList ÐÅÏ¢²ÎÊýÁбí # @return ÎÞ·µ»ØÖµ def TeamNotify(teamID, msgMark, msgParamList=[]): if teamID == 0: return sendMsg = '("%s", %s)' % (msgMark, msgParamList) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, teamID, 'TeamNotify', sendMsg, len(sendMsg)) return #--------------------------------------------------------------------- def SendMailBatch(mailTypeKey, batchPlayerIDList, batchAddItemList=[], batchParamList=[], batchGold=[], batchGoldPaper=[], batchSilver=[], batchDetail=[], moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False): ## ɾ³ý¾É°æ·¢ËÍÓʼþ£¬Èç¹û¹¦ÄÜ»¹ÓÐÐèÒª£¬¿ÉʹÓÃа汾·¢ËÍÓʼþ PlayerMail ## ÅúÁ¿·¢ËÍÓʼþµÄÒ»°ãÊǻÀàÐ͹¦ÄÜ£¬Ò»°ã¶¼ÐèÒªÓõ½GameServer ## ËùÒÔÔÝʱ²»¼æÈÝʹÓÃа汾·¢ËÍÓʼþ£¬µÈÏàÓ¦¹¦ÄÜÓÐÐèҪʱÔÙͬ²½ÐÞ¸Ä return def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False): ## º¯ÊýÏȱ£Áô£¬Ö®ºó¹¦ÄÜÖ±½ÓʹÓà PlayerMail.SendMailByKey for playerID in playerIDList: PlayerMail.SendMailByKey(mailTypeKey, playerID, addItemList, paramList) return ## ¹¹½¨ÏµÍ³Ìáʾ²ÎÊýÁбí # @param msgParamList ÐÅÏ¢²ÎÊýÁбí # @return ϵͳÌáʾ²ÎÊýÁбí IPY_NotifyCodeList # @remarks def __GetNotifyCodeList(msgParamList): #ÏûÏ¢ÌáʾÁбí, ÏÈÇåÔÚÌí¼Ó global NotifyCodeList NotifyCodeList.Clear() if not msgParamList: return NotifyCodeList for msg in msgParamList: itemPythonType = type(msg) if itemPythonType is types.IntType: #PythonÒªÑéÖ¤ÕûÐͺͳ¤ÕûÐÍ NotifyCodeList.AddInt(msg) elif itemPythonType is types.LongType: NotifyCodeList.AddStr(str(msg)) else: NotifyCodeList.AddStr(msg) return NotifyCodeList #--------------------------------------------------------------------- ##»ñµÃÍæ¼Òµ±Ç°ÀۼƵÄÀëÏß·ÖÖÓÊý # @param curPlayer Íæ¼ÒʵÀý # @return ÀۼƵķÖÖÓÊý # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ def GetPlayerLeaveServerMinute(curPlayer): #µ±Ç°ÀëÏßʱ¼ä×Ö·û´« logoffTimeStr = curPlayer.GetLogoffTime() if logoffTimeStr == "" or logoffTimeStr == '0': return 0 logoffTime = GameWorld.GetDateTimeByStr(logoffTimeStr) loginTime = GameWorld.GetDateTimeByStr(GameWorld.GetCurrentDataTimeStr()) return GameWorld.GetDiff_Minute(loginTime, logoffTime) ##»ñµÃÍæ¼Òµ±Ç°ÀۼƵÄÀëÏßÃëÊý # @param curPlayer Íæ¼ÒʵÀý # @return ÀۼƵÄÃëÊý # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ def GetPlayerLeaveServerSecond(curPlayer): #µ±Ç°ÀëÏßʱ¼ä×Ö·û´« logoffTimeStr = curPlayer.GetLogoffTime() if logoffTimeStr == "" or logoffTimeStr == '0': return 0 logoffTime = GameWorld.GetDateTimeByStr(logoffTimeStr) loginTime = GameWorld.GetDateTimeByStr(GameWorld.GetCurrentDataTimeStr()) diff_Time = loginTime - logoffTime #ÌìÊý * 24Сʱ * 60 ·ÖÖÓ + Ãë return diff_Time.days * 24 * 60 * 60 + diff_Time.seconds ##»ñµÃÍæ¼Òµ±Ç°Ê±¼ä¾àÀëÉÏ´ÎÀëÏßʱ¼äµÄÌìÊý # @param curPlayer Íæ¼ÒʵÀý # @return def GetPlayerLastLeaveServerPastDay(curPlayer): #µ±Ç°ÀëÏßʱ¼ä×Ö·û´« logoffTimeStr = curPlayer.GetLogoffTime() if logoffTimeStr == "" or logoffTimeStr == '0': return 0 logoffTimeStr = logoffTimeStr.split()[0] loginTimeStr = GameWorld.GetCurrentDataTimeStr().split()[0] logoffTime = GameWorld.GetDateTimeByStr(logoffTimeStr, ChConfig.TYPE_Time_Format_Day) loginTime = GameWorld.GetDateTimeByStr(loginTimeStr, ChConfig.TYPE_Time_Format_Day) diffTime = loginTime - logoffTime return diffTime.days #--------------------------------------------------------------------- ## ¼ì²éÍæ¼Ò״̬ÊÇ·ñ¿ÉÒÔ´«ËÍ # @param curPlayer µ±Ç°Íæ¼Ò # @return ²¼¶ûÖµ # @remarks ¼ì²éÍæ¼Ò״̬ÊÇ·ñ¿ÉÒÔ´«ËÍ def CheckPlayerTransport(curPlayer): #ËÀÍö²»¿ÉʹÓà if GameObj.GetHP(curPlayer) <= 0: return False #¼ì²éÍæ¼Ò״̬ if not CheckTransState(curPlayer): return False #¼ì²éÍæ¼ÒÊÇ·ñÔÚÆÕͨµØÍ¼ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: #²¿·Ö¸±±¾ÔÊÐí´«ËͳöÈ¥ if GameWorld.GetMap().GetMapID() not in IpyGameDataPY.GetFuncEvalCfg('DungeonDeliver', 1): NotifyCode(curPlayer, "Carry_lhs_844170") return False if not GameWorld.IsCrossServer() and GetCrossMapID(curPlayer): NotifyCode(curPlayer, "CrossMap10") return False if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene): GameWorld.Log("¿Í»§¶Ë×Ô¶¨Ò峡¾°ÏÂÎÞ·¨´«ËÍ!", curPlayer.GetPlayerID()) return False return True ##µØÍ¼ÌØÊâÏÞÖÆ¼ì²é, ×°±¸¼ì²é # @param curPlayer # @return bool def CheckEquipCanTrans(curPlayer, destMapID): if destMapID != 10060: return True #Óгá°ò¿ÉÒÔÉÏÌì¿Õ playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) curEquip = playerEquip.GetAt(IPY_GameWorld.retWing) if curEquip and not curEquip.IsEmpty(): return True #GeRen_lhs_861048 NotifyCode(curPlayer, "GeRen_lhs_861048", [destMapID]) return False #--------------------------------------------------------------------- ##֪ͨ¿Í»§¶Ë, Íæ¼ÒLoading¿ªÊ¼ # @param curPlayer Íæ¼ÒʵÀý # @param prepareTime Loadingʱ¼ä # @param prepareType LoadingÀàÐÍ # @param prepareID LoadingNPCID, ĬÈÏΪ0, ²»ÉèÖà # @return ·µ»ØÖµÎÞÒâÒå # @remarks ֪ͨ¿Í»§¶Ë, Íæ¼ÒLoading¿ªÊ¼ # ÌØÊâ˵Ã÷ChangePlayerAction -> SetPlayerAction ÖÐ ÔÚÀ­Ìõ״̬»á֪ͨ Sync_PrepareEnd£¬Ä¬ÈϽø¶ÈÌõÀàÐÍ # Sync_PrepareEnd ֪ͨ0²ÅËã½ø¶ÈÌõ³É¹¦£¬ÆäËûΪʧ°Ü£¬×Ôµ÷ÓÃÂß¼­Ê±Çë×¢Òâ def Sync_PrepareBegin(curPlayer, prepareTime, prepareType, prepareID=0): #ÖжÏÕ½¶·¶ÔÖÅ ExitPlayerConfronting(curPlayer) #´ò¶ÏÒÆ¶¯ curPlayer.StopMove() #ÉèÖü¤»îÍæ¼Ò SetIsNeedProcess(curPlayer, True) #¿ªÊ¼Í¨ÖªLoading curPlayer.SetPrepareTime(prepareTime) curPlayer.SetPrepareState(prepareType) curPlayer.SetPrepareID(prepareID) curPlayer.Sync_PrepareBegin() #¿ÕÏÐת±äΪÆäËû״̬Ôòɾ³ýÓÐÏÞÎÞµÐBUFF tick = GameWorld.GetGameWorld().GetTick() DelLimitSuperBuff(curPlayer, tick) return #--------------------------------------------------------------------- ##Íæ¼Ò״̬¸Ä±ä # @param curPlayer Íæ¼ÒʵÀý # @param changeAction Çл»µÄ״̬ # @param forceChange ÊÇ·ñÇ¿ÖÆ×ª»» # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Ò״̬¸Ä±ä def ChangePlayerAction(curPlayer, changeAction, forceChange=False): curPlayerAction = curPlayer.GetPlayerAction() if curPlayerAction == changeAction: return #״̬±ä¸üҪ֪ͨվÁ¢ DoPlayerStand(curPlayer) #ÖжÏÕ½¶·¶ÔÖÅ if changeAction in ChConfig.Def_PlayerCancelConfronting: ExitPlayerConfronting(curPlayer) #ʼþ״̬²»Çл», ±ÜÃâ¶Ô»°¿¨×¡ if curPlayerAction == IPY_GameWorld.paEvent and not forceChange: if changeAction in [IPY_GameWorld.paNull, IPY_GameWorld.paAttack]: GameWorld.DebugLog("²»Ç¿ÖÆ×ª»»×´Ì¬ %s" % changeAction, curPlayer.GetID()) return # ²É¼¯Çл» if curPlayerAction == IPY_GameWorld.paPreparing: DoExitPreparing(curPlayer) curPlayer.SetPlayerAction(changeAction) if changeAction == IPY_GameWorld.paNull: return #¿ÕÏÐת±äΪÆäËû״̬Ôòɾ³ýÓÐÏÞÎÞµÐBUFF tick = GameWorld.GetGameWorld().GetTick() DelLimitSuperBuff(curPlayer, tick) return ##Í˳ö²É¼¯ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå def DoExitPreparing(curPlayer): NPCCommon.ClearCollectNPC(curPlayer) tagObj = curPlayer.GetActionObj() if tagObj == None: #ûÓÐÄ¿±ê GameWorld.Log("DoExitPreparing -> ûÓÐÄ¿±ê", curPlayer.GetPlayerID()) return if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC: #̸»°¶ÔÏó²»¶Ô GameWorld.Log("DoExitPreparing -> ²É¼¯¶ÔÏó²»¶Ô", curPlayer.GetPlayerID()) return curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex()) if curNPC == None: #ûÓÐÕâ¸öNPC GameWorld.Log("DoExitPreparing ->ûÓÐÕâ¸öNPC", curPlayer.GetPlayerID()) return curNPC_HurtList = curNPC.GetPlayerHurtList() curNPC_HurtList.Clear() return ## Íæ¼Ò״̬¸Ä±ä(½Å±¾×Ô¶¨Òåö¾Ù) # @param curPlayer Íæ¼ÒʵÀý # @param changeAction Çл»µÄ״̬ # @return None def ChangePyPlayerAction(curPlayer, changeAction): if GetPyPlayerAction(curPlayer, changeAction): #ÒѾ­ÊÇÕâ¸ö״̬ return state = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PyPlayerAction) state = state | pow(2, changeAction) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PyPlayerAction, state) return ## »ñÈ¡ÊÇ·ñÓиÃ״̬ # @param curPlayer Íæ¼ÒʵÀý # @param changeAction Çл»µÄ״̬ # @return ÊÇ·ñÓиÃ״̬ def GetPyPlayerAction(curPlayer, action): receiveState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PyPlayerAction) state = receiveState & pow(2, action) #GameWorld.DebugLog("receiveState = %s, state = %s" % (receiveState, state)) return state != 0 ## Çå³ýpy×Ô¶¨Òå״̬ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå def ClearPyPlayerAction(curPlayer): #Çå³ýpy×Ô¶¨Òå״̬ NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PyPlayerAction, 0) return #--------------------------------------------------------------------- ##ÉèÖÃÍæ¼ÒÊÇ·ñ¼¤»î # @param curPlayer Íæ¼ÒʵÀý # @param isNeedProcess ÊÇ·ñ¼¤»î # @return ·µ»ØÖµÎÞÒâÒå # @remarks ÉèÖÃÍæ¼ÒÊÇ·ñ¼¤»î def SetIsNeedProcess(curPlayer, isNeedProcess): curPlayerIsNeedProcess = curPlayer.GetIsNeedProcess() if curPlayerIsNeedProcess == isNeedProcess: return curPlayer.SetIsNeedProcess(isNeedProcess) GameWorld.GodLog(curPlayer, 'ÉèÖÃÍæ¼ÒÊÇ·ñ¼¤»î:%s' % isNeedProcess) return #--------------------------------------------------------------------- ##Íæ¼ÒÊÇ·ñÔÚÕ½¶·×´Ì¬. # @param curPlayer Íæ¼ÒʵÀý # @return ²¼¶ûÖµ # @remarks Íæ¼ÒÊÇ·ñÔÚÕ½¶·×´Ì¬ def IsPlayerInFight(curPlayer): # #Ö÷¶¯¶ÔÖÅÖÐ # if curPlayer.GetIsConfronting(): # return True # ¹¥»÷ÖÐ if curPlayer.GetPlayerAction() == IPY_GameWorld.paAttack: return True # # ½øÈëÕ½¶·×´Ì¬ # if curPlayer.IsBattleState(): # return True return False #--------------------------------------------------------------------- ##×Ô¶¯½øÈëÕ½¶·¶ÔÖÅ //ÕâÀï²»¼ÓÏêϸÑéÖ¤ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ×Ô¶¯½øÈëÕ½¶·¶ÔÖÅ //ÕâÀï²»¼ÓÏêϸÑéÖ¤ def AutoEnterPlayerConfronting(curPlayer): # # if curPlayer.GetIsConfronting(): # return # # actObj = curPlayer.GetActionObj() # # if not actObj: # return # # curPlayer.SetIsConfronting(True) # #֪ͨ¿Í»§¶Ë //0½øÈë;ÆäËûÍ˳ö # curPlayer.View_PlayerBattle(actObj.GetID(), actObj.GetGameObjType(), 0) # # #Ìí¼Ó²âÊÔÐÅÏ¢ # GameWorld.GodLog(curPlayer, 'Server×Ô¶¯½øÈëÕ½¶·¶ÔÖųɹ¦') return #--------------------------------------------------------------------- ##//¶ÔÍâ½Ó¿Ú, Öж϶ÔÖÅ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks //¶ÔÍâ½Ó¿Ú, Öж϶ÔÖÅ def ExitPlayerConfronting(curPlayer): # if not curPlayer.GetIsConfronting(): # return # # #Í˳ö¶ÔÖÅ # curPlayer.SetIsConfronting(False) # #֪ͨ¿Í»§¶Ë //0½øÈë;ÆäËûÍ˳ö # curPlayer.View_PlayerBattle(0, 0, 1) # # #Çå³ýÕ½³è³ðºÞ # PetControl.ClearFightPetAngry(curPlayer) # # #Ìí¼Ó²âÊÔÐÅÏ¢ # GameWorld.GodLog(curPlayer, 'Í˳öÕ½¶·¶ÔÖųɹ¦') return #--------------------------------------------------------------------- ##²É¼¯´ò¶Ï # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ²É¼¯´ò¶Ï def BreakPlayerCollect(curPlayer): # #²É¼¯¶¼²»´ò¶Ï # return if curPlayer.GetPlayerAction() != IPY_GameWorld.paPreparing: return #GameWorld.Log(' ²É¼¯´ò¶Ï curPlayer.GetPrepareState()=%s'%curPlayer.GetPrepareState()) if curPlayer.GetPrepareState() not in [IPY_GameWorld.pstMissionCollecting, ShareDefine.Def_PstProduce]: #¼´²»ÊÇÈÎÎñ²É¼¯Ò²²»ÊÇÉú²ú²É¼¯ return #¸±±¾Öв»´ò¶Ï #if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: # return tagObj = curPlayer.GetActionObj() if tagObj == None: #ûÓÐÄ¿±ê #GameWorld.Log("BreakPlayerCollect -> ûÓÐÄ¿±ê", curPlayer.GetPlayerID()) return if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC: #²É¼¯¶ÔÏó²»¶Ô #GameWorld.Log("BreakPlayerCollect -> ²É¼¯¶ÔÏó²»¶Ô", curPlayer.GetPlayerID()) return curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex()) if curNPC == None: #ûÓÐÕâ¸öNPC #GameWorld.Log("BreakPlayerCollect ->ûÓÐÕâ¸öNPC", curPlayer.GetPlayerID()) return npcID = curNPC.GetNPCID() collectNPCIpyData = IpyGameDataPY.GetIpyGameDataNotLog("CollectNPC", npcID) if not collectNPCIpyData: return if not collectNPCIpyData.GetCanBreakCollect(): return #È¡Ïû²É¼¯×´Ì¬ ChangePlayerAction(curPlayer, IPY_GameWorld.paNull) if curPlayer.GetActionObj() != None: curPlayer.SetActionObj(None) return #--------------------------------------------------------------------- ##Íæ¼Ò´ò×ø # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Ò´ò×ø def DoPlayerSit(curPlayer, tick): #ÒѾ­ÔÚ´ò×ø×´Ì¬ÁË if curPlayer.GetPlayerAction() == IPY_GameWorld.paSit: return #Í¨ÖªÍ£Ö¹ÒÆ¶¯ curPlayer.StopMove() #¼¤»îÍæ¼Ò״̬, »Ø¸´CDÊÇ3Ãë, Íæ¼Ò´ôÖÍΪ5Ãë, Òª¼¤»îһϠSetIsNeedProcess(curPlayer, True) #Íæ¼Ò×øÏ curPlayer.Sit() #ÉèÖÃÕæÆø¿ªÊ¼»Ö¸´Ê±¼ä #curPlayer.SetDict(ChConfig.Def_PlayerKey_SitForZhenQi, tick) #ÉèÖøßЧÁ·¹¦¿ªÊ¼Ê±¼ä #curPlayer.SetDict(ChConfig.Def_PlayerKey_EfficientSit, tick) return #--------------------------------------------------------------------- ##Íæ¼ÒÕ¾Æð # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÕ¾Æð def DoPlayerStand(curPlayer): #²»ÔÚ´ò×ø×´Ì¬ if curPlayer.GetPlayerAction() != IPY_GameWorld.paSit: return curPlayer.Stand() return #--------------------------------------------------------------------- ##Íæ¼ÒËÀÍö # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒËÀÍö def DoPlayerDead(curPlayer): #Í¨ÖªÍ£Ö¹ÒÆ¶¯ curPlayer.StopMove() #Íæ¼ÒËÀÍö curPlayer.SetDead(curPlayer.GetDictByKey(ChConfig.Def_NPCDead_KillerID), curPlayer.GetDictByKey(ChConfig.Def_NPCDead_KillerType)) return #--------------------------------------------------------------------- ##Íæ¼ÒË¢ÐÂ×ø±ê # @param curPlayer Íæ¼ÒʵÀý # @param checkObj ¼ì²é¶ÔÏó # @param posX Æðµã×ø±êX # @param posY Æðµã×ø±êY # @param canChangeClientPos ÊÇ·ñÖØÖõ½¿Í»§¶Ë×ø±êµã # @return ·µ»ØÖµÕæ, ˢгɹ¦ # @remarks Íæ¼ÒË¢ÐÂ×ø±ê def PlayerRefreshPos(curPlayer, checkObj, posX, posY, canChangeClientPos=True): if not curPlayer.GetMapLoadOK(): #Ë¢ÐÂʧ°Ü #×¢Òâ: Ò»¶¨ÒªÅжÏ, ÒòΪÔÚÍæ¼ÒʹÓü¼ÄܵÄʱºò»áË¢ÐÂÕâÀï #Èç¹ûÍæ¼Ò¶ÁȡûÓгɹ¦, ¾Í²»´¦ÀíÕâ¸ö·â°ü GameWorld.Log('µØÍ¼Ã»ÓжÁÈ¡³É¹¦, Ë¢ÐÂʧ°Ü', curPlayer.GetPlayerID()) return False if not curPlayer.GetSpeed(): GameWorld.Log("ûÓÐËٶȲ»ÄÜË¢ÐÂ×ø±ê!", curPlayer.GetPlayerID()) return False curMap = GameWorld.GetMap() #¼ì²éÍæ¼ÒͣϵÄ×ø±êÊÇ·ñÕýÈ· needResetPos = False if curMap.CanMove(posX, posY) != True: #ÌßÍæ¼ÒÏÂÏß #curPlayer.Kick(IPY_GameWorld.disPlayerPosError) #°ÑÍæ¼Ò´ò»ØÖØÉúµã # playerControl = PlayerControl(curPlayer) # playerControl.SetToBornPlace() #ÒÔÉÏ´¦ÀíÌ«¹ýÑϸñ, Ŀǰ²»Åж¨ #----------------------------------------- #ÔÚÍæ¼ÒÖÜΧÕÒµ½Ò»¸ö¿É×ߵĵã, °ÑËû·Å¹ýÈ¥ resultPos = GameMap.GetEmptyPlaceInArea(posX, posY, ChConfig.Def_DropItemDist) if resultPos.GetPosX() == posX and resultPos.GetPosY() == posY: #Íæ¼ÒÖØÖÃλÖÃʧ°Ü GameWorld.Log('Íæ¼ÒÖØÖÃλÖÃʧ°Ü, °ÑÍæ¼Ò´ò»ØÖØÉúµã posX = %s posY = %s' \ % (posX, posY), curPlayer.GetPlayerID()) #=============================================================================== # playerControl = PlayerControl(curPlayer) # playerControl.SetToBornPlace() #=============================================================================== #ÔÝʱÍêÈ«ÐÅÈοͻ§¶Ë×ø±ê£¬±ÜÃâ±ßÔµ»¯ÎÞ·¨¹¥»÷ÎÊÌâ return False GameWorld.Log("×ø±ê´íÎ󣬼ì²éÍæ¼ÒͣϵÄ×ø±êÊÇ·ñÕýÈ· posX = %d, posY = %d, ÖØÖÃλÖÃ:posX = %d, posY = %d" \ % (posX, posY, resultPos.GetPosX(), resultPos.GetPosY()), curPlayer.GetPlayerID()) posX = resultPos.GetPosX() posY = resultPos.GetPosY() #±ßÔµÕϰ­µãÈÿͻ§¶ËÐÐ×ߣ¬·þÎñ¶Ë¸Ä±äλÖò»Í¨Öª #needResetPos = True #checkObj.ResetPos(posX, posY) #µ±Ç°¶ÔÏó×ø±ê objPosX = checkObj.GetPosX() objPosY = checkObj.GetPosY() # objDestPosX = checkObj.GetDestPosX() # objDestPosY = checkObj.GetDestPosY() # objStartX = checkObj.GetStartPosX() # objStartY = checkObj.GetStartPosY() #¼ÆËãÍæ¼Ò·¢¹ýÀ´µÄֹͣλÖúͷþÎñÆ÷ÒÑÓÐ×ø±êµÄ¾àÀë dist = GameWorld.GetDist(posX, posY, objPosX, objPosY) #ÒÆ¶¯µÄÌØµã£º¿Í»§¶ËÒÆ¶¯Îª1Ã×С¼ä¸ô·¢°ü£¬·þÎñ¶ËµÄUpdatePos ¾­³£ δִÐе¼ÖÂÎÞ·¨Òƶ¯£¬Òƶ¯ÐÐΪ±ä³É __FixPlayerPos-¡·ChangePos¿ØÖÆ #Íâ²ãÒÆ¶¯tick ¿ØÖƼä¸ô·ÀÖ¹Íâ¹Ò°ü if dist <= 3: #µÚÒ»ÖÖÇé¿ö:¿Í»§¶ËºÍ·þÎñÆ÷¶Ë¾àÀë²î¾à·ûºÏÒªÇó #λÖÿÉÒÔ½ÓÊÜ __FixPlayerPos(checkObj, posX, posY, needResetPos, canChangeClientPos) return True else: #¾àÀëÆ«²îÌ«´ó£¬À­»ØÎ»Öò»×öÌßÈËÂß¼­ needResetPos = True GameWorld.DebugLog('Client=(%s,%s), Server=(%s,%s), ²îÒì¾àÀë=%s' \ % (posX, posY, objPosX, objPosY, dist)) posX = objPosX posY = objPosY __FixPlayerPos(checkObj, posX, posY, needResetPos, canChangeClientPos) return False # ʵ¼Ê´Ëº¯ÊýÔÚ¶Ô»° ¹¥»÷ ÒÆ¶¯¶¼»á×ß½øÀ´Åж¨ #=========================================================================== # curPlayer.SetMoveCount(curPlayer.GetMoveCount() + 1) # if curPlayer.GetMoveCount() >= 10: # curPlayer.SetMoveCount(0) # curPlayer.SetMoveDistDiff(0) # needResetPos = True # # if curPlayer.GetMoveDistDiff() >= 30: # curPlayer.SetMoveCount(0) # curPlayer.SetMoveDistDiff(0) # needResetPos = True #=========================================================================== __FixPlayerPos(checkObj, posX, posY, needResetPos, canChangeClientPos) return True #--------------------------------------------------------------------- ##½ÃÕýÍæ¼Ò×ø±ê # @param checkObj ¼ì²éµÄ¶ÔÏó # @param changePosX ½ÃÕýµÄ×ø±êX # @param changePosY ½ÃÕýµÄ×ø±êY # @param needResetServerPos ÊÇ·ñ°´·þÎñÆ÷λÖÃÖØÖà # @param needChangeClientPos ÊÇ·ñ°´¿Í»§¶ËλÖÃÖØÖà # @return ·µ»ØÖµÎÞÒâÒå # @remarks ½ÃÕýÍæ¼Ò×ø±ê def __FixPlayerPos(checkObj, changePosX, changePosY, needResetServerPos, needChangeClientPos): #---°´·þÎñÆ÷λÖÃÖØÖÃ--- if needResetServerPos: checkObj.ResetPos(changePosX, changePosY) return #---°´¿Í»§¶ËλÖÃÖØÖÃ--- if needChangeClientPos: checkObj.ChangePos(changePosX, changePosY) return return #--------------------------------------------------------------------- def OnDelayDeleteMirror(curPlayer, tick): addTick = curPlayer.GetDictByKey("DelayDeleteMirror") if not addTick: return if tick - addTick < 10000: # 10sºó»ØÊÕ return DeleteMirror(curPlayer, False) return True def DeleteMirror(curPlayer, isDelay=False): ''' »ØÊÕ¾µÏñÍæ¼Ò ''' if not curPlayer.GetRealPlayerID(): return playerID = curPlayer.GetPlayerID() if isDelay: #ÓÉÓÚϵͳ³¡´Î¿ìËÙÕ½¶·Ô­Òò£¬Èç¹ûÁ¢Âí»ØÊÕ¿ÉÄܵ¼ÖÂij¸ö¹¦ÄܳöÏÖÎÊÌâ #Èç±»¶¯¼¼ÄÜЧ¹û£¬Ö´ÐÐ˳ÐòµÄÔ­Òò£¬Èç»÷ɱºó -> ½áËã -> »ØÊÕÍæ¼Ò -> ´¥·¢±»¶¯¼¼ÄÜ£¬µ¼ÖÂÒì³£ GameWorld.DebugLog("¾µÏñÍæ¼ÒÉèÖÃÑÓ³Ù»ØÊÕ!", playerID) SetPlayerSightLevel(curPlayer, playerID) tick = GameWorld.GetGameWorld().GetTick() curPlayer.SetDict("DelayDeleteMirror", tick) return GameWorld.DebugLog("¾µÏñÍæ¼Ò»ØÊÕ!", playerID) PassiveBuffEffMng.OnPlayerLeaveMap(curPlayer) #ɱËÀËùÓÐÕÙ»½µÄÁé KillPlayerSummonNPC(curPlayer) #ÕÙ»½»Ø³öÕ½µÄ³èÎï PetControl.ReCallFightPet(curPlayer) curPlayer.DeleteMirror() return ##ɱËÀÍæ¼ÒËùÓеÄÕÙ»½ÊÞËÀÍö # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ɱËÀÍæ¼ÒËùÓеÄÕÙ»½ÊÞËÀÍö def KillPlayerSummonNPC(curPlayer): #½«Éæ¼°µ½C++ÖÐÁбíɾ³ýµÄ¹¦ÄÜ,ͳһ¸Ä³É -> ¸´ÖÆPyÁбíºó,È»ºó½øÐÐɾ³ýÂß¼­ (ÒòWhileÓм¸Âʽ«µ¼ÖÂËÀËø) summon_List = [] for index in range(curPlayer.GetSummonCount()): curSummonNPC = curPlayer.GetSummonNPCAt(index) summon_List.append(curSummonNPC) for summonNPC in summon_List: NPCCommon.SetDeadEx(summonNPC) return #--------------------------------------------------------------------- ##¼ì²éÍæ¼ÒͨÓõÄ״̬ת»» # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÕæ, ÔÊÐíÇл»×´Ì¬ # @remarks ¼ì²éÍæ¼ÒͨÓõÄ״̬ת»» def PlayerCanStateTransfer(curPlayer): curPlayerAction = curPlayer.GetPlayerAction() #Èç¹ûÍæ¼ÒÊÇ×øÏÂ״̬, ×Ô¶¯×ª»»ÎªÕ¾Á¢×´Ì¬ #DoPlayerStand(curPlayer) return (curPlayerAction in ChConfig.Def_Player_Can_Transfer_State) #------------------------------Íæ¼ÒÀ뿪·þÎñÆ÷µÄÂß¼­------------------------------------ #--------------------------------------------------------------------- ##ÆïÂíÏÂÏßÂß¼­ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ÆïÂíÏÂÏßÂß¼­ def __RidingHorsePlayerDisconnect(curPlayer): #ÔÚÆïÂí if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse: #Ö´ÐÐÏÂÂíÂß¼­ PlayerHorse.PlayerRideHorseDown(curPlayer, False) return #--------------------------------------------------------------------- ##Íæ¼ÒÏÂÏß/Íæ¼ÒÇл»µØÍ¼¹«ÓÃÂß¼­ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÏÂÏß/Íæ¼ÒÇл»µØÍ¼¹«ÓÃÂß¼­ def __PlayerLeaveServerLogic(curPlayer, tick, isDisconnect): #¸øÓèÍæ¼Ò²¹³¥ #PlayerExpiation.GivePlayerExpiation(curPlayer, tick) #ˢм¼ÄÜÊ£Óàʱ¼ä SkillCommon.RefreshAllSkillRemainTime(curPlayer, tick) #¶ÓÎéÍæ¼ÒÍ˳öµØÍ¼ PlayerTeam.TeamPlayerLeaveMap(curPlayer, tick, isDisconnect) #Í˳ö²É¼¯ NPCCommon.ClearCollectNPC(curPlayer) #ÉèÖÃÍæ¼ÒµÄµØÍ¼Î»ÖÃ, Èç¹ûÊǸ±±¾, À뿪¸±±¾ # ¸±±¾¹æÔò: # 1. Ò»¸ö¶ÓÎéÖ»ÓÐÒ»¸ö¸±±¾, Èç¹ûÓжÓÔ±µÄ¸±±¾ºÍ¶ÓÎ鸱±¾²»Ò»ÖÂ, Ôò´Ó¸±±¾ÖÐÌß³ö´Ë¶ÓÔ± # 2. Íæ¼ÒÏÂÏßÔÙÉÏ, ¾ÍÀ뿪¸±±¾ # 3. Èç¹ûûÓÐÍæ¼Ò´æÔÚ, ¸±±¾»ØÊÕ if GameWorld.GetMap().GetMapFBType() != 0: #À뿪¸±±¾ fbIndex = GameWorld.GetGameWorld().GetCurGameWorldIndex() exitFBType = 1 if isDisconnect else 2 PyGameData.g_lastExitFBType[fbIndex] = [exitFBType, tick] #GameWorld.DebugLog("Íæ¼ÒÀ뿪¸±±¾£ºfbIndex=%s,exitFBType=%s, %s" % (fbIndex, exitFBType, PyGameData.g_lastExitFBType), curPlayer.GetPlayerID()) FBLogic.DoExitFBLogic(curPlayer, tick) #Çå¿ÕËùÓв»ÊôÓÚ×Ô¼ºµÄ¹â»· #__ClearNoMeAuraBuff(curPlayer) #Çå¿ÕËùÓÐÀ뿪µØÍ¼²»ÐèÒª±£´æµÄBuff __ClearLeaveNoSaveBuff(curPlayer) #---±£´æÍæ¼ÒÔÚÏßʱ¼ä(°´ÃëËã)--- UpdateOnLineTime(curPlayer, tick) PassiveBuffEffMng.OnPlayerLeaveMap(curPlayer) #À뿪µØÍ¼Çå¿Õ¶ñÒâ¹¥»÷×Ô¼ºÍæ¼ÒÐÅÏ¢ if curPlayer.GetPlayerID() in PyGameData.g_maliciousAttackDict: PyGameData.g_maliciousAttackDict.pop(curPlayer.GetPlayerID()) PyGameData.g_needRefreshMapServerState = True # ÓÐÍæ¼ÒÀ뿪µØÍ¼ÉèÖÃÐèҪˢРPlayerSuccess.FinishDelayAddSuccessProgress(curPlayer, tick) playerID = curPlayer.GetPlayerID() if not isDisconnect: CrossPlayerData.ClearCrossSyncDataCache(curPlayer) PyGameData.g_fbBuyBuffTimeDict.pop(playerID, None) #Çå³ýµØÍ¼Íæ¼Ò»º´æ PyGameData.g_playerReqEnterFBEx.pop(playerID, None) NPCCommon.ClearPriWoodPile(curPlayer) #ÒÆ³ýµØÍ¼»º´æµÄ¾³½çÄѶÈÍæ¼ÒIDÐÅÏ¢ for playerIDList in PyGameData.g_realmDiffPlayerDict.values(): if playerID in playerIDList: playerIDList.remove(playerID) return ##¸üб£´æÍæ¼ÒÔÚÏßʱ¼ä # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ätick # @return def UpdateOnLineTime(curPlayer, tick): #---±£´æÍæ¼ÒÔÚÏßʱ¼ä(°´ÃëËã)--- lastCalcTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcOLTimeTick) if lastCalcTick <= 0: curPlayer.SetDict(ChConfig.Def_PlayerKey_CalcOLTimeTick, tick) return curPlayer.SetDict(ChConfig.Def_PlayerKey_CalcOLTimeTick, tick) diffSec = (tick - lastCalcTick) / 1000 if diffSec > 0: curPlayer.SetWeekOnlineTime(curPlayer.GetWeekOnlineTime() + diffSec) curPlayer.SetOnlineTime(curPlayer.GetOnlineTime() + diffSec) SyncOnLineTimeTotal(curPlayer) return ##ͬ²½ÔÚÏßʱ¼ä # @param curPlayer Íæ¼ÒʵÀý # @return def SyncOnLineTimeTotal(curPlayer): sendPack = ChPyNetSendPack.tagMCOnLineTimeTotal() sendPack.Clear() sendPack.OnLineTimeTotal = curPlayer.GetOnlineTime() NetPackCommon.SendFakePack(curPlayer, sendPack) return ##ͬ²½×îºóÒ»´Î±³°ü¿ª¸ñÔÚÏßʱ¼ä # @param curPlayer Íæ¼ÒʵÀý # @param packType ±³°üÀàÐÍ # @return def SyncOnLineTimeLastOpenPack(curPlayer, packType): return sendPack = ChPyNetSendPack.tagMCOnlineTimeLastOpenPack() sendPack.Clear() sendPack.PackType = packType sendPack.LastOnLineTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_LastAutoOpenPackTick % packType) NetPackCommon.SendFakePack(curPlayer, sendPack) return ##À뿪µØÍ¼Çå¿Õ²»±£´æµÄBuff # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks À뿪µØÍ¼Çå¿Õ²»±£´æµÄBuff def __ClearLeaveNoSaveBuff(curPlayer): #×°±¸BuffºÍ±»¶¯BuffÕâÀï²»Çå, Çл»µØÍ¼ºó»áÖØÐ¼ÆËã #Çå¿ÕËùÓг¡¾°ÀàBuff curPlayer.GetMapBuff().Clear() #2011-01-28 ÐÞ¸ÄΪ¿É±£´æ£¬¹Ê´Ë´¦²»É¾³ý #Çå¿ÕËùÓпØÖÆÀàBUFF #BUG: ¿ØÖÆÀàBUFF²»´æÊý¾Ý¿â£¬ÇеØÍ¼ºó²»Í¨ÖªÏûʧ£¬¿Í»§¶ËÎÞ·¨É¾³ý #curPlayer.GetActionBuffManager().Clear() return ## Çå³ýÏÂÏßÏûʧµÄbuff, ÔÚ¸üÐÂÅÅÐаñ֮ǰ # @param curPlayer: Íæ¼ÒʵÀý # @return def __DisconnectClearBuff(curPlayer, tick): #ÐèÒª¿¼ÂÇbuff,deBuff,aura,incBuff,mapBuff,³ýÁËequipBuff²»¿¼ÂÇ PlayerClearBuff_Single(curPlayer, curPlayer.GetBuffState(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetDeBuffState(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetAura(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetIncBuff(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetMapBuff(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetActionBuffManager(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetProcessBuffState(), ClearBuffByDisconnect, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetProcessDeBuffState(), ClearBuffByDisconnect, tick) #BUFFЧ¹ûÔÚÍâ²ã¼ÆËã #SkillShell.RefreshPlayerBuffOnAttrAddEffect(curPlayer) return #--------------------------------------------------------------------- ##Íæ¼ÒÀ뿪·þÎñÆ÷ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÀ뿪·þÎñÆ÷ def PlayerLeaveServer(curPlayer, tick): #³èÎïÏÂÏßÂß¼­, ÕâÀïÒª½øÐÐÅÅÐаñ, ÓÅÏÈ×ö, ±ÜÃâÍæ¼Ò¹â»·µÈÊôÐÔÓ°Ïì³èÎïÊôÐÔʧЧ PetControl.DoLogic_PetInfo_OnLeaveServer(curPlayer, tick) #Çå³ýÏÂÏßÏûʧµÄbuff, ÔÚ¸üÐÂÅÅÐаñ֮ǰ __DisconnectClearBuff(curPlayer, tick) #Çå³ý»ØÊÕÕ½ #DelRecylcePack(curPlayer) #ÖØÐÂˢнÇÉ«ÊôÐÔ playerControl = PlayerControl(curPlayer) playerControl.RefreshAllState() #Íæ¼ÒÏÂÏ߸üÐÂÅÅÐаñ PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer) #ÅÅÐаñÒÑʵʱ¸üУ¬¹ÊÏÂÏß²»ÔÙͬ²½ #Íæ¼ÒÏÂÏß֪ͨgameserver¼Ç¼»º´æ£¨·ÅÔÚÏÂÏ߸üÐÂÅÅÐаñÖ®ºó£¬·½±ãGameserverÅжÏÊÇ·ñÐèÒª´æÈëÊý¾Ý¿âÖУ© PlayerViewCache.OnPlayerLogout(curPlayer) PlayerFamily.OnPlayerLogout(curPlayer) #Íæ¼ÒÏÂÏß/Íæ¼ÒÇл»µØÍ¼¹«ÓÃÂß¼­ __PlayerLeaveServerLogic(curPlayer, tick, True) #ÆïÂíÍæ¼ÒÏÂÏßÂß¼­ __RidingHorsePlayerDisconnect(curPlayer) #ÕÙ»½ÊÞËÀÍö KillPlayerSummonNPC(curPlayer) #¸üдӱ¾µØÍ¼ÀëÏßÐÅÏ¢ PyGameData.g_disconnectPlayer[curPlayer.GetPlayerID()] = [tick, curPlayer.GetPosX(), curPlayer.GetPosY()] GameWorld.DebugLog("Íæ¼Ò´Ó±¾µØÍ¼ÀëÏß: %s" % PyGameData.g_disconnectPlayer, curPlayer.GetPlayerID()) return def GetPlayerLeaveServerTick(playerID): # »ñÈ¡Íæ¼Ò´Ó±¾µØÍ¼ÖÐÀëÏßʱµÄtick, ×î´óÖ§³Ö1Сʱ, Èç¹ûÓÐÐèÒª´óÓÚ1СʱµÄÇëµ÷Õû³¬Ê±ÏÞÖÆ # ×¢: ·µ»ØÖµÎª0ʱ£¬Ö»ÄÜ´ú±íÍæ¼Ò²»ÊÇÔÚ±¾µØÍ¼ÀëÏß1СʱÄÚ£¬²¢²»ÄÜ´ú±íÍæ¼Òµ±Ç°ÊÇ·ñÔÚÏß״̬£¬¿ÉÄÜÔÚÆäËûµØÍ¼ if playerID not in PyGameData.g_disconnectPlayer: return 0 return PyGameData.g_disconnectPlayer[playerID][0] def GetPlayerLeaveServerPos(playerID): # »ñÈ¡Íæ¼Ò´Ó±¾µØÍ¼ÖÐÀëÏßʱµÄ×ø±ê # ×¢£ºÊ¹Óñ¾º¯Êýʱ£¬Ò»¶¨ÒªÏÈʹÓú¯Êý GetPlayerLeaveServerTick È·±£ÊÇ´Ó±¾µØÍ¼ÖÐÀëÏߵIJſÉʹÓà # @return: posX, posY if playerID not in PyGameData.g_disconnectPlayer: return 0, 0 return PyGameData.g_disconnectPlayer[playerID][1:3] def RemoveTimeoutLeaveServerPlayerInfo(tick): # Ôݶ¨Ã¿ÌìÁ賿5µãÖ´ÐÐÒ»´Î for playerID, leaveInfo in PyGameData.g_disconnectPlayer.items(): leaveTick = leaveInfo[0] if tick - leaveTick > 3600000: # Çå³ý³¬Ê±1СʱµÄ¼Ç¼ PyGameData.g_disconnectPlayer.pop(playerID) return def RemoveLeaveServerPlayerInfo(playerID): # ÉÏÏßÒÆ³ýÔÚ±¾µØÍ¼ÏÂÏߵļǼ if playerID in PyGameData.g_disconnectPlayer: PyGameData.g_disconnectPlayer.pop(playerID) GameWorld.DebugLog("½øÈë±¾µØÍ¼£¬ÒƳýÉÏ´ÎÔÚ±¾µØÍ¼ÀëÏ߼Ǽ!", playerID) return ##Çå³ý»ØÊÕÕ½ # @param None # @return None def DelRecylcePack(curPlayer): backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptRecycle) for i in range(backPack.GetCount()): curItem = backPack.GetAt(i) if not curItem or curItem.IsEmpty(): continue curItem.Clear() NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DelPackIndex, 0) return #--------------------------------------------------------------------- ##Íæ¼Ò¿ªÊ¼Çл»µØÍ¼ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Ò¿ªÊ¼Çл»µØÍ¼ def DoPlayerResetWorldPos(curPlayer, tick): NotifyStartChangeMap(curPlayer) # ֪ͨ¿ªÊ¼Çл»µØÍ¼ #À뿪µØÍ¼·þÎñÆ÷ __PlayerLeaveServerLogic(curPlayer, tick, False) FBLogic.DoPlayerChangeMapLogic(curPlayer, tick) #summonList = list() #ÕٻسèÎï PetControl.ReCallFightPet(curPlayer) #1. ɾ³ý×Ô¼º²»ÐèÒªµÄÕÙ»½ÊÞ(»ðÑæÖ®ÁéµÈ) #±ØÐëÓÃwhile, ÒòΪÔÚÑ­»·ÖÐҪɾ³ý # ÕÙ»½ÊÞÇеØÍ¼²»´ø¹ýÈ¥ while curPlayer.GetSummonCount(): summonNPC = curPlayer.GetSummonNPCAt(0) NPCCommon.SetDeadEx(summonNPC) changeMapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID) # ¸üÐÂ×îºóÒ»´ÎÀ뿪µÄ·ÇÖÐÁ¢³£¹æµØÍ¼, ´ÓÖÐÁ¢µØÍ¼Í˳öʱÐèÒª»Øµ½¸ÃµØ·½£¬±ØÐëÔÚ DoResetWorldPosAndClear ֮ǰ¸üРif GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull and curPlayer.GetMapID() not in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4): mapID = curPlayer.GetMapID() posX = curPlayer.GetPosX() posY = curPlayer.GetPosY() lineID = curPlayer.GetClientLineID() # ³£¹æµØÍ¼Ó÷ÖÏßID NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromMapID, mapID) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromPosX, posX) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromPosY, posY) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromLineID, lineID) GameWorld.DebugLog("×îºóÒ»´ÎÀ뿪µÄ·ÇÖÐÁ¢³£¹æµØÍ¼¸üÐÂ!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY)) # µ±Ç°Êǿɷµ»ØµÄ¸±±¾µØÍ¼ ÇÒ Ä¿±êµØÍ¼Îª¸±±¾ elif curPlayer.GetMapID() in ChConfig.Def_CanBackFBMap and curPlayer.GetMapID() != changeMapID \ and GameWorld.GetMap().GetMapFBTypeByMapID(changeMapID) != IPY_GameWorld.fbtNull: mapID = curPlayer.GetMapID() posX = curPlayer.GetPosX() posY = curPlayer.GetPosY() lineID = GetFBFuncLineID(curPlayer) # ¸±±¾Óù¦ÄÜÏß·ID NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBMapID, mapID) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBPosX, posX) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBPosY, posY) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBLineID, lineID) GameWorld.DebugLog("½øÈ븱±¾Ê±£¬×îºóÒ»´ÎÀ뿪µÄ¿É·µ»ØµÄ¸±±¾ID¸üÐÂ!mapID=%s,lineID=%s,Pos(%s,%s)" % (mapID, lineID, posX, posY)) # À뿪µØÍ¼ PlayerAssist.OnPlayerLeaveMap(curPlayer) # ´Ó¸±±¾ÖÐÇÐͼ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: #ĬÈÏ»ØÂúѪ if GameObj.GetHP(curPlayer) > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie and GameObj.GetHP(curPlayer) < GameObj.GetMaxHP(curPlayer): GameObj.SetHPFull(curPlayer) #2. µ÷ÓÃÇл»µØÍ¼½Ó¿Ú curPlayer.DoResetWorldPosAndClear() return #--------------------------------------------------------------------- ##Íæ¼ÒÀ뿪¸±±¾ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÀ뿪¸±±¾ def PlayerLeaveFB(curPlayer): if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RouteServerInitOK): #RouteServerδ³õʼ»¯²»ÔÊÐíÇл»µØÍ¼, »º´æ´¦Àí GameServerRefresh.Set_PlayerRouteServerInitOK_OnLeaveFB(curPlayer, 1) return GameWorld.Log("PlayerLeaveFB...", curPlayer.GetPlayerID()) if GameWorld.IsCrossServer(): CrossRealmPlayer.PlayerExitCrossServer(curPlayer) return funcLineID = 0 enterFBFree = False #ÖÐÁ¢µØÍ¼»Øµ½ÉÏÒ»´Î·ÇÖÐÁ¢³£¹æµØÍ¼ if curPlayer.GetMapID() in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4) or curPlayer.GetMapID() in ChConfig.Def_CanBackFBMap: mapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromMapID) posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosX) posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromPosY) lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromLineID) # ÖØÖà NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromMapID, 0) # ÀϺÅÖ§³Ö£¬±¾À´¾ÍÔÚÖÐÁ¢µØÍ¼µÄ£¬·µ»ØÐÂÊÖ´å if not mapID: # {Ö°Òµ:[dataMapID,posX,posY], ...} createRoleMapDict = IpyGameDataPY.GetFuncEvalCfg("CreateRoleMap", 1, {}) if not createRoleMapDict: return job = curPlayer.GetJob() lineID = 0 if job in createRoleMapDict: mapID, posX, posY = createRoleMapDict[job] else: mapInfoList = createRoleMapDict.values() mapID, posX, posY = mapInfoList[0] #À뿪¸±±¾ else: fromFBMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBMapID) # »Øµ½ÉÏÒ»´Î¿É·µ»ØµÄ¸±±¾Àï if fromFBMapID: mapID = fromFBMapID posX = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBPosX) posY = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBPosY) lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FromFBLineID) funcLineID = lineID # »Ø¸±±¾µÄÒªÖ¸¶¨¹¦ÄÜÏß·ID enterFBFree = True # ·µ»ØµÄÃâ·Ñ½øÈë # ÖØÖà NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FromFBMapID, 0) GameWorld.DebugLog("À뿪¸±±¾£¬·µ»Ø¿É֮ǰ¿É·µ»ØµÄ¸±±¾! fromFBMapID=%s,lineID=%s,posXY(%s,%s)" % (mapID, lineID, posX, posY)) else: mapID = curPlayer.GetFromMapID() posX = curPlayer.GetFromPosX() posY = curPlayer.GetFromPosY() lineID = curPlayer.GetFromLineID() if mapID == curPlayer.GetMapID(): # Èç¹ûÔÚͬһÕŵØÍ¼, È¡DBÖØÉúµã, ÆÕͨµØÍ¼ÏÂÏßÖØÉÏʱFromMapID»á±»ÉèÖÃΪ±¾µØÍ¼ gameMap = GameWorld.GetMap() mapID, posX, posY = gameMap.GetRebornMapID(), gameMap.GetRebornMapX(), gameMap.GetRebornMapY() #posX, posY = GameMap.GetNearbyPosByDis(posX, posY, ChConfig.Def_RebornPos_Area_Range) #copyMapID = curPlayer.GetCopyMapID() GameWorld.Log("PlayerLeaveFB MapID = %d, PosX = %d, PosY = %d" % (mapID, posX, posY), curPlayer.GetPlayerID()) if GameWorldProcess.IsNoPlayerNeedCloseFB() and GameWorld.GetGameWorld().GetMapCopyPlayerManager().GetPlayerCount() == 1: #Èç¹û¸±±¾ÖÐÖ»ÓÐÕâÒ»¸öÈË, ÄÇô°ÑÕâ¸ö¸±±¾ÉèÖÃÎªÍæ¼Ò°²È«ÏÂÏß, ¹Ø±Õ¸±±¾ gameFB = GameWorld.GetGameFB() gameFB.SetIsSafeClose(1) #=============================================================================================== # #Èç¹ûÍæ¼ÒÊÇËÀÍö״̬£¬ÔòÏȸ´»î£¬ÊÖÓβ߻®²»Ï븴»îÍ˳ö # if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie: # curPlayer.Reborn(ChConfig.rebornType_System) # GameObj.SetHPFull(curPlayer) # ChangePlayerAction(curPlayer, IPY_GameWorld.paNull) #=============================================================================================== PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, lineID, funcLineID=funcLineID, enterFBFree=enterFBFree) #ÔÚ¿ÕÏлòÕßÒÆ¶¯×´Ì¬ÏÂ,²ÅÄÜËøËÀÍæ¼Ò if curPlayer.GetPlayerAction() in [IPY_GameWorld.paNull] or curPlayer.IsMoving(): #°ÑÍæ¼ÒËøËÀ curPlayer.BeginEvent() return #--------------------------------------------------------------------- def PlayerEnterCrossServer(curPlayer, mapID, lineID): playerID = curPlayer.GetPlayerID() GameWorld.Log("Íæ¼ÒÇëÇó½øÈë¿ç·þµØÍ¼: mapID=%s,lineID=%s" % (mapID, lineID), playerID) if mapID not in ChConfig.Def_CrossMapIDList: return tick = GameWorld.GetGameWorld().GetTick() lastRequestTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_RequestEnterCrossServerTick) if lastRequestTick and tick - lastRequestTick < 5000: GameWorld.DebugLog(" ÇëÇó½øÈë¿ç·þCDÖÐ!", playerID) NotifyCode(curPlayer, "RequestEnterCrossServerCD") return crossRegisterMap = curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_CrossRegisterMap) if crossRegisterMap: GameWorld.ErrLog("¿ç·þÒѾ­ÔÚÉÏ´«Êý¾Ý£¬²»Öظ´Ìá½»!crossRegisterMap=%s,mapID=%s" % (crossRegisterMap, mapID), playerID) return if GameWorld.IsCrossServer(): GameWorld.DebugLog("¿ç·þ·þÎñÆ÷²»ÔÊÐí¸Ã²Ù×÷!") return if GetCrossMapID(curPlayer): GameWorld.ErrLog("Íæ¼Òµ±Ç°Îª¿ç·þ״̬£¬²»ÔÊÐíÔÙ´ÎÇëÇó½øÈë¿ç·þ!", curPlayer.GetPlayerID()) return if not CrossRealmPlayer.IsCrossServerOpen(): NotifyCode(curPlayer, "CrossMatching18") return if GameObj.GetHP(curPlayer) <= 0: NotifyCode(curPlayer, "CrossMap4") return if PlayerState.IsInPKState(curPlayer): NotifyCode(curPlayer, "SingleEnterPK", [mapID]) return fbIpyData = FBCommon.GetFBIpyData(mapID) if fbIpyData: fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID, False) if not fbLineIpyData: GameWorld.DebugLog("¸±±¾±íÕÒ²»µ½¸±±¾¶ÔÓ¦¹¦ÄÜÏß·!mapID=%s,lineID=%s" % (mapID, lineID)) return ret = FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData) if ret != ShareDefine.EntFBAskRet_OK: return if not FBLogic.OnEnterFBEvent(curPlayer, mapID, lineID, tick): GameWorld.DebugLog(" OnEnterFBEvent False!", curPlayer.GetPlayerID()) if mapID in [ChConfig.Def_FBMapID_CrossBattlefield]: NotifyCode(curPlayer, "GeRen_chenxin_268121") else: NotifyCode(curPlayer, "SingleEnterDefaul") return # ÐèÒª¶¯Ì¬·Ö²¼Ïß·µÄµØÍ¼£¬·¢Ë͵½¿ç·þ·þÎñÆ÷½øÐзÖÅä if mapID in ChConfig.Def_CrossDynamicLineMap: extendInfo = {} if mapID == ChConfig.Def_FBMapID_CrossDemonKing: bossID = GameLogic_CrossDemonKing.GetCurFBLineBOSSID(mapID, lineID) if not bossID: return extendInfo["BossID"] = bossID msgDict = {"PlayerID":curPlayer.GetPlayerID(), "MapID":mapID, "FuncLineID":lineID, "LV":curPlayer.GetLV()} if extendInfo: msgDict.update(extendInfo) GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_EnterFB, msgDict) else: isSend = GY_Query_CrossRealmReg.RegisterEnterCrossServer(curPlayer, mapID, lineID=lineID) if not isSend: return curPlayer.SetDict(ChConfig.Def_PlayerKey_RequestEnterCrossServerTick, tick) return ##Íæ¼Ò½øÈ븱±¾ # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param posX ×ø±êX # @param posY ×ø±êY # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Òµ¥¶À½øÈ븱±¾ def PlayerEnterFB(curPlayer, mapID, lineID, posX=0, posY=0, reqInfoEx=None): mapID = FBCommon.GetRecordMapID(mapID) playerID = curPlayer.GetPlayerID() GameWorld.Log("Íæ¼ÒÇëÇó½øÈ븱±¾! mapID=%s,lineID=%s,posX=%s,posY=%s,reqInfoEx=%s" % (mapID, lineID, posX, posY, reqInfoEx), playerID) #½øÈ븱±¾Í¨Óüì²é fbIpyData = FBCommon.GetFBIpyData(mapID) fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID) sceneMapID = mapID if not fbLineIpyData else fbLineIpyData.GetMapID() #¹ýÂË·â°üµØÍ¼ID if not GameWorld.GetMap().IsMapIDExist(sceneMapID): GameWorld.ErrLog('###·Ç·¨µØÍ¼Êý¾Ý£¬sceneMapID: %s' % (sceneMapID), curPlayer.GetID()) return tick = GameWorld.GetGameWorld().GetTick() if CheckMoveToFB(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, tick) != ShareDefine.EntFBAskRet_OK: return # if mapID == ChConfig.Def_FBMapID_XMZZ: # #ÏÉħ֮Õù # GameLogic_XMZZ.XMZZStartFight(curPlayer) # return if posX == 0 and posY == 0: ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(mapID, lineID, fbLineIpyData) retPos = FBLogic.OnGetFBEnterPos(curPlayer, mapID, lineID, ipyEnterPosInfo, tick) if not retPos: GameWorld.ErrLog("δÕÒµ½½øÈ븱±¾×ø±ê£¡mapID=%s,lineID=%s" % (mapID, lineID)) return posX, posY = retPos if curPlayer.IsMoving(): curPlayer.StopMove() fbID = 0 # ºó¶ËµÄÐéÄâÏß· isSendToGameServer = False mapFBType = GameWorld.GetMap().GetMapFBTypeByMapID(sceneMapID) # ÅжÏÊÇ·ñ×é¶Ó±¾ÐèÒªÒÔ³¡¾°µØÍ¼Åжϣ¬ÒòΪ²ß»®¿ÉÄÜÉ趨²»Í¬¹¦ÄÜÏß·IDµÄ¸±±¾ÀàÐͲ»Ò»Ñù£¬±ÈÈçС¾³½ç¡¢´ó¾³½ç if mapFBType == IPY_GameWorld.fbtTeam and curPlayer.GetTeamID(): if curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader: GameWorld.Log("·Ç¶Ó³¤£¬ÎÞ·¨·¢Æð½øÈë×é¶Ó¸±±¾ÇëÇó!", curPlayer.GetPlayerID()) return isSendToGameServer = True if isSendToGameServer or mapID in ChConfig.Def_MapID_SendToGameServer \ or mapID in ReadChConfig.GetEvalChConfig("MapID_SendToGameServer"): extendParamList = [] if mapID == ChConfig.Def_FBMapID_SealDemon: newbielineList = IpyGameDataPY.GetFuncEvalCfg('SealDemonNewbieLine', 1) # ÐÂÊÖÏßÂ·ÌØÊâ´¦Àí£¬Ö±½Ó½øÈë if lineID in newbielineList: GameWorld.DebugLog("·âħ̳ÐéÄâÏß·ֻÄÜͨ¹ý×Ô¶¨Ò峡¾°½øÈëÌôÕ½£¡") return else: bossID = GameLogic_SealDemon.CurFBLineBOSSID(lineID) extendParamList = [bossID] elif mapID == ChConfig.Def_FBMapID_ZhuXianBoss: bossID = GameLogic_ZhuXianBoss.CurFBLineBOSSID(lineID) extendParamList = [bossID, -1] enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss) if enterCnt >= FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss): if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhuXianBossHelpCnt): extendParamList = [bossID, curPlayer.GetFamilyID()] elif mapID == ChConfig.Def_FBMapID_DemonKing: bossID = GameLogic_CrossDemonKing.GetCurFBLineBOSSID(mapID, lineID) extendParamList = [bossID] elif mapID in ChConfig.Def_MapID_LineIDToPropertyID: enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID) extendParamList = [enterCnt] elif mapID in ChConfig.MirrorBattleMapIDList: reqInfoEx["sceneMapID"] = sceneMapID extendParamList = [reqInfoEx] SendToGameServerEnterFB(curPlayer, mapID, lineID, tick, extendParamList) return PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, fbID, funcLineID=lineID) return ##·¢Ë͵½GameServerÇëÇó½øÈ븱±¾ #@param curPlayer Íæ¼Ò #@param mapID µØÍ¼id #@param lineID Ïß·id #@param tick ʱ¼ä´Á #@return ·µ»ØÖµÎÞÒâÒå def SendToGameServerEnterFB(curPlayer, mapID, lineID, tick, extendParamList=[]): #lineID = FBLogic.GetPlayerFBLineID(curPlayer, mapID, tick) GameWorld.Log("SendToGameServerEnterFB mapID=%s,lineID=%s,extendParamList=%s" % (mapID, lineID, extendParamList), curPlayer.GetID()) # »ñÈ¡Íæ¼ÒËùÊô·ÖÏß if lineID == None: lineID = FBLogic.GetPlayerFBLineID(curPlayer, mapID, tick) #GameWorld.DebugLog("send GameServer_QueryPlayerByID") # ÇëÇóGameServerÄ¿±ê¸±±¾GameWorldË÷Òý sendMsg = [mapID, lineID] sendMsg += extendParamList sendMsg = "%s" % sendMsg curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_EnterFB, 0, 'EnterFB', sendMsg, len(sendMsg)) return ##¼ì²éÍæ¼Ò״̬ÊÇ·ñ¿ÉÒÔÒÆ¶¯µ½¸±±¾ #@param curPlayer Íæ¼ÒʵÀý #@return ·µ»ØÖµÎÞÒâÒå #@remarks ¼ì²éÍæ¼Ò״̬ÊÇ·ñ¿ÉÒÔÒÆ¶¯µ½¸±±¾ def CheckMoveToFB(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, tick, isNotify=True, isTeamAsk=False): '''ÅжϿɷñ½øÈ븱±¾£¬°üº¬ÊÖ¶¯¼°Æ¥Åä @param isTeamAsk: ÊÇ·ñÊǶÓÎé½øÈëÇëÇóµÄ£¬Ò»°ãÊǶÓÎé״̬Ï£¬¶Ó³¤·¢Æð½øÈ븱±¾£¬ÐèÒª¼ì²é¶ÓÔ±¿É·ñ½øÈ룬´ËʱΪTrue£¬¿É×öһЩ¸½¼Ó´¦Àí @note: ²ß»®ÒªÇóÌáʾ°´ÓÅÏȼ¶À´£¬¸±±¾×ÔÉíµÄÌõ¼þÏÞÖÆÓÅÏÈÌáʾ£¬ÆäËû¸½¼ÓÌáʾÓÅÏȼ¶½ÏµÍ ''' ret = FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, 1, isNotify, isTeamAsk) if ret != ShareDefine.EntFBAskRet_OK: return ret if GameObj.GetHP(curPlayer) <= 0: GameWorld.Log("Íæ¼ÒÒѾ­ËÀÍö, ÎÞ·¨½øÈ븱±¾!") return ShareDefine.EntFBAskRet_Dead ## ¶ÓÎé¼ì²éµÄÇé¿ö£¬¶Ó³¤²»´¦Àí£¬Ö»´¦Àí¶ÓÔ± if isTeamAsk and curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader: # ºó¶ËÖ»×öboss״̬Ï£¬±»¶¯½øÈ븱±¾ÏÞÖÆ£¬·ÀÖ¹´òbossÖб»À­½øÈ¥¸±±¾ # boss״̬µÄÆäËû´«ËÍÏÞÖÆÓÉǰ¶Ë¿ØÖÆ£¬ÒòΪ²ß»®Òª¸ù¾Ý½çÃæÀ´´¦Àí£¬ÓÐЩ½çÃæÔÊÐí´«ËÍ£¬ÓÐЩ²»ÔÊÐí if PlayerState.IsInBossState(curPlayer): return ShareDefine.EntFBAskRet_BossState ## PK״̬¼ì²é if PlayerState.IsInPKState(curPlayer): if isNotify: NotifyCode(curPlayer, "SingleEnterPK", [mapID]) return ShareDefine.EntFBAskRet_PKState ## ¿ç·þµØÍ¼ÖÐ if GetCrossMapID(curPlayer) and mapID not in ChConfig.Def_CrossMapIDList: if isNotify: NotifyCode(curPlayer, "CrossMap5", [mapID]) return ShareDefine.EntFBAskRet_InCrossMap #=============================================================================================== # # ÕâÀï²»×ö״̬ÏÞÖÆ£¬ÓÉǰ¶Ë´¦Àí£¬ÒòΪ²ß»®Òª¸ù¾Ý½çÃæÀ´´¦Àí£¬Í¬Ò»´«Ë͹¦ÄÜÓпÉÄÜÔÚ²»Í¬½çÃæ # # PK״̬¼ì²é # if PlayerState.IsInPKState(curPlayer): # if isNotify: # NotifyCode(curPlayer, "SingleEnterPK", [mapID]) # return ShareDefine.EntFBAskRet_PKState # # # ´òboss״̬¼ì²é # if PlayerState.IsInBossState(curPlayer): # if isNotify: # NotifyCode(curPlayer, "SingleEnterBoss", [mapID]) # return ShareDefine.EntFBAskRet_BossState #=============================================================================================== playerAction = curPlayer.GetPlayerAction() if playerAction == IPY_GameWorld.paPreparing: if isNotify: NotifyCode(curPlayer, "SingleEnterGather", [mapID]) return ShareDefine.EntFBAskRet_Preparing if playerAction == IPY_GameWorld.paSit: if isNotify: NotifyCode(curPlayer, "Carry_lhs_697674") return ShareDefine.EntFBAskRet_Sit if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene): if isNotify: NotifyCode(curPlayer, "Carry_lhs_697674") GameWorld.Log("¿Í»§¶Ë×Ô¶¨Ò峡¾°ÏÂÎÞ·¨½øÈ븱±¾!", curPlayer.GetPlayerID()) return ShareDefine.EntFBAskRet_Other if playerAction in ChConfig.Def_Player_Cannot_TransState: #Carry_lhs_697674£ºÄúµ±Ç°Ëù´¦µÄ״̬²»ÄܽøÐд«ËÍ! if isNotify: NotifyCode(curPlayer, "Carry_lhs_697674") return ShareDefine.EntFBAskRet_Other for index in ChConfig.Def_Player_NotCan_EnterFbPyGameEvenState: if GetPyPlayerAction(curPlayer, index): #Carry_lhs_697674£ºÄúµ±Ç°Ëù´¦µÄ״̬²»ÄܽøÐд«ËÍ! if isNotify: NotifyCode(curPlayer, "Carry_lhs_697674") return ShareDefine.EntFBAskRet_Other #µ±Ç°µØÍ¼²»ÊÇÆÕͨµØÍ¼ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: canFBMoveToOther = False fbEnableTransportMap = ReadChConfig.GetEvalChConfig("FBEnableTransportMap") curMapID = GameWorld.GetMap().GetMapID() if curMapID in fbEnableTransportMap and mapID in fbEnableTransportMap[curMapID]: canFBMoveToOther = True if curMapID in ChConfig.Def_CanBackFBMap: canFBMoveToOther = True toMapFBType = GameWorld.GetMap().GetMapFBTypeByMapID(mapID) if toMapFBType == IPY_GameWorld.fbtNull: if curMapID in IpyGameDataPY.GetFuncEvalCfg('DungeonDeliver', 1): canFBMoveToOther = True elif FBCommon.GetRecordMapID(curMapID) == FBCommon.GetRecordMapID(mapID): if FBLogic.CanChangeSameDataMapFB(curPlayer, mapID, lineID): canFBMoveToOther = True if not canFBMoveToOther: if isNotify: NotifyCode(curPlayer, "SingleEnterDungeon", [mapID]) return ShareDefine.EntFBAskRet_InFB if not FBLogic.OnEnterFBEvent(curPlayer, mapID, lineID, tick): GameWorld.DebugLog(" OnEnterFBEvent False!", curPlayer.GetPlayerID()) if isNotify: NotifyCode(curPlayer, "SingleEnterDefaul") return ShareDefine.EntFBAskRet_Other return ShareDefine.EntFBAskRet_OK #--------------------------------------------------------------------- ##Ë¢ÐÂÍæ¼ÒʱÖÓ£¬ÇеØÍ¼Íæ¼ÒʱÖӼǼÇå¿Õ£¬´¦ÀíÏàÓ¦Âß¼­ # @param curPlayer Íæ¼Ò # @return ÎÞÒâÒå # @remarks Ë¢ÐÂÍæ¼ÒʱÖÓ£¬ÇеØÍ¼Íæ¼ÒʱÖӼǼÇå¿Õ£¬´¦ÀíÏàÓ¦Âß¼­ def RefreshPlayerTick(curPlayer): tick = GameWorld.GetGameWorld().GetTick() #·À³ÁÃÔÇÐÏßʱ¼ä PlayerGameWallow.DoLogic_WallowOnlineTime(curPlayer, tick) return #--------------------------------------------------------------------- def PlayerResetWorldPosFBLineID(curPlayer, mapID, posX, posY, funcLineID): '''Íæ¼ÒÇл»µ½Ö¸¶¨¸±±¾¶ÔÓ¦µÄ¹¦ÄÜÏß·ID£¬ÊÊÓÃÓڶೡ¾°ºÏ²¢Ò»ÕŵØÍ¼µÄÇé¿ö£¬ºó¶ËÐèÔÚͬһÕÅÎïÀíµØÍ¼²ÅÄÜʹÓøú¯Êý ÓÉÓÚǰ¶ËµØÍ¼ºÏ²¢µÄ³¡¾°¼ÓÔØÊÇ·Ö¿ªµÄ£¬ËùÒÔÔÚÇг¡¾°µÄʱºò²»ÄÜÖ±½ÓÉèÖÃ×ø±ê£¬ÒòΪǰ¶Ëʵ¼ÊÉϲ»´æÔÚ¸Ã×ø±ê Íæ¼ÒÖ±½ÓÔÚµØÍ¼ÖÐÇл»¹¦ÄÜÏß·ID£¬´Ëʱǰ¶ËÐèÒª×ßÕý³£µÄÇÐͼÁ÷³Ì²ÅÄܼÓÔØÄ¿±ê¹¦ÄÜÏß·ID¶ÔÓ¦µÄ³¡¾° ¹ÊÕâÀï×ö¸öÐé¼ÙÇÐͼÁ÷³Ì ''' if curPlayer.GetMapID() != mapID: return reqMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBMapID) # ÓÉÓÚºó¶ËµØÍ¼²»±äËùÒÔ²»ÐÞ¸ÄÖ±½Ó¶Á NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqFBFuncLine, funcLineID) GameWorld.Log("Íæ¼Ò¸±±¾Öбä¸ü¹¦ÄÜÏß·ÐéÄâÇеØÍ¼: mapID=%s,posX=%s,posY=%s,funcLineID=%s" % (mapID, posX, posY, funcLineID), curPlayer.GetPlayerID()) curPlayer.SetDict(ChConfig.Def_PlayerKey_ChangeMapID, mapID) curPlayer.SetDict(ChConfig.Def_PlayerKey_ResetFBLinePosX, posX) curPlayer.SetDict(ChConfig.Def_PlayerKey_ResetFBLinePosY, posY) NotifyPrepareChangeMap(curPlayer) NotifyStartChangeMap(curPlayer) ## ·¢ËÍ 04 01 ÈËÎïËùÔڵij¡¾°³õʼ»¯#tagPlayerMapInit playerMapInit = ChNetSendPack.tagPlayerMapInit() playerMapInit.Clear() playerMapInit.MapID = mapID playerMapInit.PosX = posX playerMapInit.PosY = posY NetPackCommon.SendFakePack(curPlayer, playerMapInit) curPlayer.SetSight(0) # ÊÓÒ°ÖÃ0£¬Çгɹ¦ºó»Ö¸´ÊÓÒ°£¬·ÀÖ¹½ÓÏÂÀ´ÌáǰÉèÖÃ×ø±êµ¼ÖÂǰ¶ËÊÓÒ°Ë¢ÐÂÒì³£ curPlayer.ResetPos(posX, posY) # ÕâÀïÖ±½ÓÉèÖÃ×ø±ê£¬·Àֹǰ¶Ëδ¼ÓÔØ³¡¾°³É¹¦µôÏßµ¼ÖÂÖØµÇºó×ø±ê´íÎó SetFBFuncLineID(curPlayer, reqMapID, funcLineID) # ÕâÀïÖ±½ÓÉèÖóÉÄ¿±ê¹¦ÄÜÏß·ID£¬·Àֹǰ¶Ëδ¼ÓÔØ³¡¾°³É¹¦µôÏßµ¼ÖÂÖØµÇºó¼ÓÔØ³¡¾°Òì³£ ## ·¢ËÍ 01 09 ·þÎñÆ÷×¼±¸¾ÍÐ÷#tagServerPrepareOK prepareOK = ChNetSendPack.tagServerPrepareOK() prepareOK.Clear() NetPackCommon.SendFakePack(curPlayer, prepareOK) return ##Íæ¼ÒÇл»µ½Ö¸¶¨¸±±¾ID # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param posX ×ø±êX # @param posY ×ø±êY # @param FBID ¸±±¾ID, ÐéÄâÏß·ID # @param msg Я´ýÐÅÏ¢ # @param canLock ÊÇ·ñËø¶¨Íæ¼Ò # @param funcLineID ¸±±¾¹¦ÄÜÏß·ID£¬ÓÉǰ¶ËÇëÇó # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÇл»µ½Ö¸¶¨¸±±¾ID def PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, fbID=0, msg='', canLock=True, funcLineID=0, enterFBFree=False): ''' ²ÎÊý˵Ã÷: @param fbID: ´óÓÚ0µÄÕûÊý: Èç¹û²ÎÊýmapIDÖ¸¶¨µÄµØÍ¼´æÔÚfbIDÖ¸¶¨µÄ·ÖÏߣ¬ÔòÖ±½Ó´«Ë͵½²ÎÊýmapIDËùÖ¸¶¨µÄµØÍ¼µÄfbIDËùÖ¸¶¨µÄ·ÖÏߣ¬·ñÔòÔÚËùÓдæÔڵķÖÏßÖУ¬Ëæ»úѡһÌõ·ÖÏß´«Èë¡£fbIDµÄ¼ÆËã¼ûÏÂÃæfbID=-1µÄ˵Ã÷¡£ -1£º ½Ó¿ÚÄÚ²¿×Ô¶¯Ìæ»»³Éµ±Ç°fbID£¬´«Èë²ÎÊýmapIDËùÖ¸¶¨µÄµØÍ¼£¨ÕâÀï²ÎÊýmapIDÆäʵÊÇDataMapID£©µÄͬһfbIDµÄµØÍ¼(Èç¹ûÓУ¬Ã»ÓÐÔòËæ»ú)¡£ Ï־͵±Ç°fbIDµÄ¼ÆËã,¾ÙÀý˵Ã÷,¼ÙÉèµØÍ¼AºÍµØÍ¼BÔÚMapID.txtÅäÖÃÈçÏ£º MapName MapID DataMapID FBCount µØÍ¼A 101 101 3 µØÍ¼B 102 101 3 ¼´µØÍ¼AºÍµØÍ¼BÓй²Í¬µÄDataMapID,ÄÇôµØÍ¼B½ø³ÌÄÚ²¿µÄµÚÒ»Ìõ·ÖÏߵĿͻ§¶ËID¾ÍÊÇ3(ËùÓзÖÏߵĿͻ§¶Ë·ÖÏßID:0¡¢1¡¢2¡¢3¡¢4¡¢5) -2£º Ö±½ÓËæ»ú´«µ½²ÎÊýmapIDËùÖ¸¶¨µÄµØÍ¼µÄijһÄÚ²¿·ÖÏߣ¬ÕâÀïµÄijһÄÚ²¿·ÖÏßÏÞÓÚMapID.txtÖÐmapIDΪ´«Èë²ÎÊýmapIDµÄµØÍ¼½ø³ÌµÄ·ÖÏß¡£ @param funcLineID: ¹¦ÄÜÏß·ID ''' tick = GameWorld.GetGameWorld().GetTick() lastTransTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TransTick) #Ôݶ¨1Ãë if tick - lastTransTick < 1000: GameWorld.Log("Íæ¼ÒÇÐͼCDÖÐ: mapID=%s,posX=%s,posY=%s,fbID=%s,msg=%s,funcLineID=%s,tick=%s,lastTransTick=%s" % (mapID, posX, posY, fbID, msg, funcLineID, tick, lastTransTick), curPlayer.GetPlayerID()) NotifyCode(curPlayer, "MapMoveCD") return curPlayer.SetDict(ChConfig.Def_PlayerKey_TransTick, tick) mapID = FBCommon.GetRecordMapID(mapID) fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, funcLineID) sceneMapID = mapID if not fbLineIpyData else fbLineIpyData.GetMapID() # µØÍ¼·ÖÁ÷, ¼õÉÙµ¥µØÍ¼Ñ¹Á¦ FBMapShuntDict = ReadChConfig.GetEvalChConfig("FBMapShunt") if mapID in FBMapShuntDict: shuntList = FBMapShuntDict[mapID] if shuntList: sceneMapID = random.choice(shuntList) GameWorld.DebugLog("µ¥È˵ØÍ¼·ÖÁ÷ sceneMapID=%s" % sceneMapID) #´«ËÍʱ, Ëø¶¨Íæ¼Ò, ´«Ëͳɹ¦, ÔÚÄ¿±êµØÍ¼½âËø, ´«ËÍʧ°Ü, ÔÚ´«Ëͻص÷º¯ÊýPlayerChangeMapFailCallbackÖнâËø if canLock: curPlayer.BeginEvent() #GameWorld.Log(1, "SetXP=%s"%(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_RecordXPValue))) #curPlayer.SetXP(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_RecordXPValue)) #»ñÈ¡¸±±¾´«È븱±¾ÐèҪЯ´øµÄÐÅÏ¢ msg = FBLogic.GetPlayerResetWorldPosFBMsg(curPlayer, mapID, funcLineID) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqFBMapID, mapID) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqFBFuncLine, funcLineID) GameWorld.Log("Íæ¼ÒÇëÇó¿ªÊ¼ÇÐͼ: sceneMapID=%s,posX=%s,posY=%s,fbID=%s,msg=%s,funcLineID=%s,tick=%s,lastTransTick=%s" % (sceneMapID, posX, posY, fbID, msg, funcLineID, tick, lastTransTick), curPlayer.GetPlayerID()) if enterFBFree: NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_EnterFBFree, 1) GameWorld.DebugLog(" ±¾´ÎÃâ·Ñ½øÈ븱±¾!") curPlayer.ResetWorldPosReq(sceneMapID, posX, posY, False, fbID, msg) curPlayer.SetDict(ChConfig.Def_PlayerKey_ChangeMapID, sceneMapID) curPlayer.SetDict(ChConfig.Def_PlayerKey_ChangeLineID, max(0, fbID)) #ÇеØÍ¼´¦ÀíÍæ¼ÒʱÖÓ¾ÀÕýÎÊÌ⣨ÐèҪһֱͨ¹ýÍæ¼ÒʱÖÓ¼ÆËãµÄ£© RefreshPlayerTick(curPlayer) NotifyPrepareChangeMap(curPlayer) return # ֪ͨ׼±¸Çл»µØÍ¼ def NotifyPrepareChangeMap(curPlayer): curPlayer.SetVisible(False) sendPack = ChPyNetSendPack.tagMCPrepareChangeMap() sendPack.Clear() sendPack.MapID = GameWorld.GetMapDataMapID(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)) sendPack.FuncLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine) sendPack.FuncMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBMapID) NetPackCommon.SendFakePack(curPlayer, sendPack) GameWorld.Log("×¼±¸Çл»µØÍ¼", curPlayer.GetID()) return # ֪ͨ¿ªÊ¼Çл»µØÍ¼ def NotifyStartChangeMap(curPlayer): sendPack = ChPyNetSendPack.tagMCStartChangeMap() sendPack.Clear() sendPack.MapID = GameWorld.GetMapDataMapID(curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)) sendPack.FuncLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine) sendPack.FuncMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBMapID) NetPackCommon.SendFakePack(curPlayer, sendPack) GameWorld.Log("֪ͨ¿ªÊ¼Çл»µØÍ¼", curPlayer.GetID()) return #--------------------------------------------------------------------- ##Íæ¼Ò»»Ïß # @param curPlayer Íæ¼ÒʵÀý # @param changLineID Ïß·ID # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Ò»»Ïß def PlayerChangeLine(curPlayer, changLineID): #---µØÍ¼·ÖÏß¼ì²é--- if GameWorld.GetGameWorld().GetLineID() == changLineID: GameWorld.ErrLog('changLineID SameLine = %s' % (changLineID)) return #---µØÍ¼ÊôÐÔ¼ì²é--- gameMap = GameWorld.GetMap() #1. Ö»ÓÐÆÕͨµØÍ¼²ÅÄÜ»»Ïß if gameMap.GetMapFBType() != IPY_GameWorld.fbtNull: #GeRen_liubo_180377 ¶Ô²»Æð£¬Ä¿Ç°¸ÃµØÍ¼Ã»Óпª·Å·ÖÁ÷£¬ÎÞ·¨Çл»Ïß·! 256 - NotifyCode(curPlayer, "GeRen_liubo_180377") return #2. »»ÏßµÄÄ¿µÄµØ±ØÐë´æÔÚ if changLineID >= gameMap.GetMaxFbCount(): GameWorld.ErrLog("»»ÏßµÄÄ¿µÄµØ²»´æÔÚ = %s, %s" % (changLineID, gameMap.GetMaxFbCount()), curPlayer.GetID()) return NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PlayChangeLineID, changLineID + 1) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FuncChangeLineID, 0) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HighChangeLineID, 0) #---¿ªÊ¼Çл»Ïß·--- PlayerResetWorldPosFB(curPlayer, curPlayer.GetMapID(), curPlayer.GetPosX(), curPlayer.GetPosY(), changLineID) GameWorld.Log('Íæ¼Ò = %s Çл»·ÖÏß = %s, Ëø×¡' % (curPlayer.GetName(), changLineID), curPlayer.GetID()) return #--------------------------------------------------------------------- ##Íæ¼ÒÇл»µØÍ¼ # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param posX ×ø±êX # @param posY ×ø±êY # @param lineID Ïß·ID -1´ú±íµ±Ç°Ïß # @param msg Çл»µØÍ¼Ð¯´øµÄÐÅÏ¢ # @param canLock ÊÇ·ñ¿ÉÒÔËø¶¨Íæ¼Ò(´«Ë͵㲻¿ÉËø¶¨, ÒòΪҪ¿çµØÍ¼Ñ°Â·) # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÇл»µØÍ¼ def PlayerResetWorldPos(curPlayer, mapID, posX, posY, lineID=-1, msg='', canLock=True, exData1=0): #¸ü¸Ä: ËÀÍöÔÊÐíÇл»µØÍ¼, ÔÚ¸±±¾Öб»¹Ö´òËÀ, ¸±±¾Ê±¼äµ½, »ØÊÕ¸±±¾ # if GameObj.GetHP(curPlayer) <= 0 : # GameWorld.Log("ËÀÍöÎÞ·¨Çл»µØÍ¼") # return gameWorld = GameWorld.GetGameWorld() shuntLineID = GetResetWorldPosShuntLineID(curPlayer, gameWorld.GetMapID(), gameWorld.GetLineID(), mapID, lineID, exData1) # ·ÖÁ÷Ïß·ID GameWorld.DebugLog("·ÖÁ÷ mapID=%s,lineID=%s,shuntLineID=%s" % (mapID, lineID, shuntLineID), curPlayer.GetPlayerID()) #---ͬµØÍ¼ID, ͬ·ÖÏß, ½öÇл»×ø±ê--- #lingID = -1, ´ú±íĬÈϵ±Ç°Ïß, ÈçÖ÷³Ç2´«Ëͽ£×Ú, µ½´ï½£×Ú2 if gameWorld.GetMapID() == mapID and (shuntLineID == -1 or gameWorld.GetLineID() == shuntLineID): if exData1: #bossµÄÓÃmove£¬Í¨ÖªÇ°¶Ë£¬ÓÉǰ¶Ë·¢Æðmove ChPlayer.NotifyPlayerMove(curPlayer, posX, posY, exData1) else: #ÖØÖÃ×ø±ê GameWorld.ResetPlayerPos(curPlayer, posX, posY) #@bug: ÔÚ°ÚÌ¯Çø¿ìËÙ´«ËÍÖÁ·Ç°ÚÌ¯Çø, ¿ÉÒÔ°Ú̯, ÕâÀïË¢ÐÂһϳ¡¾°Buff SkillShell.ProcessMapBuff(curPlayer, GameWorld.GetGameWorld().GetTick()) return #---²»Í¬µØÍ¼IDÇл»µØÍ¼--- PlayerResetWorldPosFB(curPlayer, mapID, posX, posY, shuntLineID, msg, canLock) #Èç¹ûÊÇ·þÎñÆ÷ÖÐ×îºóÒ»¸öÈËÀ뿪, Ôò¹Øµô¸±±¾ GameWorldProcess.OnPlayerLeaveMapCloseFB() return def GetResetWorldPosShuntLineID(curPlayer, curMapID, curLineID, tagMapID, tagLineID, bossID=0): '''»ñÈ¡ÇÐͼÏß·ID ÇÐÏßÓÐÈýÖÖÇé¿ö 1. Íæ¼ÒÊÖ¶¯Çл»Ïß·£¬ÓÅÏȼ¶×î¸ß ¼Ç¼key Def_Player_Dict_PlayChangeLineID£¬ ÀëÏß³¬¹ý±£»¤Ê±¼äºóÖØÖã¬È·±£¶ÏÏßÖØÁ¬Õý³£¼´¿É 2. ¹¦ÄÜÇл»µ½Ö¸¶¨Ïß·£¬Èç´òboss¡¢´«Ë͵½Ä¿±êÍæ¼ÒÏß·£¨±»»÷ɱÇйýÈ¥°ï棩 ¼Ç¼key Def_Player_Dict_FuncChangeLineID£¬ ÀëÏß³¬¹ý±£»¤Ê±¼äºóÖØÖã¬È·±£¶ÏÏßÖØÁ¬Õý³£¼´¿É 3. ³£¹æÇÐͼ Ïß·ѡÔñÓÅÏȼ¶: ÊÖ¶¯ÇÐÏ߼Ǽ > ¹¦ÄÜÇÐÏ߼Ǽ > ¸ßµÍÇÐÏ߼Ǽ > ϵͳ·ÖÁ÷ÇÐÏß¹æÔò ϵͳ·ÖÁ÷ÇÐÏß¹æÔò: µ±Ç°µØÍ¼Ïß· ¶ÔÓ¦ Ä¿±êµØÍ¼Ïß·ÈËÊý Èç¹ûµ½´ï¶î¶¨Öµ²Å½øÐзÖÁ÷£¬·ÖÁ÷µ½ÈËÊý½ÏÉÙµÄÏß· ÌØÊâboss·ÖÁ÷: @param bossID: ·ÖÁ÷bossID ''' if GameWorld.IsCrossServer(): return tagLineID # ·Ç³£¹æµØÍ¼Ö®¼äµÄÇл»²»´¦Àí if curMapID not in PyGameData.g_commMapLinePlayerCountDict or tagMapID not in PyGameData.g_commMapLinePlayerCountDict: return tagLineID tagLinePlayerCountDict = PyGameData.g_commMapLinePlayerCountDict[tagMapID] # ´Ë·ÖÏß°üº¬ËùÓзÖÏߣ¬º¬Î´¿ª·ÅµÄ¼°»î¶¯·ÖÏß if bossID and tagMapID != ChConfig.Def_FBMapID_BossHome: tagLineID = 0 # BossµÄ»°Î´·ÖÁ÷ǰÏÈÇ¿ÖÆ1Ïߣ¬¼´Îª0 playerID = curPlayer.GetPlayerID() playChangeLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayChangeLineID) funcChangeLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FuncChangeLineID) highChangeLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_HighChangeLineID) GameWorld.DebugLog("´¦Àí·ÖÁ÷,curMapID=%s,curLineID=%s,tagMapID=%s,tagLineID=%s,bossID=%s" % (curMapID, curLineID, tagMapID, tagLineID, bossID), playerID) # ÓÐÖ¸¶¨Ïß·£¬Ö±½Ó·µ»Ø£¬²»·ÖÁ÷ if tagLineID != -1: # »¹Ã»Ö¸¶¨·ÖÏ߼ǼµÄÔòÒª¼Ç¼£¬ÒѾ­¼Ç¼¹ýµÄ²»Öظ´¼Ç¼£¬Ö±µ½Ï´λص½Ô­Ïß·ºó²ÅÖØÖÃ0 if not playChangeLineID and not funcChangeLineID and not highChangeLineID: NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FuncChangeLineID, curLineID + 1) GameWorld.DebugLog("¹¦ÄÜÖ¸¶¨Çл»Ä¿±êÏß·£¬¼Ç¼µ±Ç°Ïß·ºóÐøÇÐÏß±¸ÓÃ! curLineID=%s,tagLineID=%s" % (curLineID, tagLineID), playerID) if bossID and NPCCommon.IsMapNeedBossShunt(tagMapID): bossShuntLineID = __GetBossShuntLineID(curPlayer, curMapID, curLineID, tagMapID, bossID, tagLinePlayerCountDict.keys()) if bossShuntLineID != -1: tick = GameWorld.GetGameWorld().GetTick() GameWorld.DebugLog("·ÖÁ÷boss, bossID=%s,bossShuntLineID=%s" % (bossID, bossShuntLineID), playerID) NPCCommon.AddBossShuntRelatedPlayer(curPlayer, tagMapID, bossShuntLineID, bossID, tick) return bossShuntLineID return tagLineID if curMapID == tagMapID: GameWorld.DebugLog("ͬµØÍ¼Çл»×ø±ê²»´¦Àí·ÖÁ÷£¡", playerID) return tagLineID # ¿ÉÒÔÓÃÀ´³£¹æ·ÖÁ÷µÄÏß·ÈËÊý×ÖµäÐÅÏ¢, ²¢²»ÊÇËùÓÐÏß·¶¼¿ÉÒÔÓÃÀ´×öÈËÊý·ÖÁ÷µÄ£¬±ÈÈçÖÐÁ¢µØÍ¼ÓжàÌõÏßÓÃÀ´·ÖÁ÷boss£¬µ«ÊÇÖ»ÓÐ1ÌõÏß¿ÉÓÃÀ´×ö³£¹æµÄÈËÊý·ÖÁ÷ mapLineDict = IpyGameDataPY.GetFuncCfg("MapLine", 1) if tagMapID in mapLineDict: tagMapMaxLine = mapLineDict[tagMapID] tagLinePlayerCountShuntDict = {} for k, v in tagLinePlayerCountDict.items(): if k >= tagMapMaxLine: continue tagLinePlayerCountShuntDict[k] = v else: tagLinePlayerCountShuntDict = tagLinePlayerCountDict tagMapMaxLine = len(tagLinePlayerCountShuntDict) GameWorld.DebugLog("Ä¿±êµØÍ¼¿ÉÓ÷ÖÁ÷Ïß·ÈËÊýÐÅÏ¢: tagMapID=%s,%s" % (tagMapID, tagLinePlayerCountShuntDict)) # ÓÐÖ÷¶¯Çл»¹ý if playChangeLineID and playChangeLineID <= len(tagLinePlayerCountShuntDict): GameWorld.DebugLog("ÓÐÖ÷¶¯Çл»¹ýÏß·!playChangeLineID=%s" % playChangeLineID, playerID) return playChangeLineID - 1 # ¹¦ÄÜÓÐÖ¸¶¨Ïß·¹ý if funcChangeLineID and funcChangeLineID <= len(tagLinePlayerCountShuntDict): GameWorld.DebugLog("¹¦ÄÜÓÐÖ¸¶¨¹ýÏß·ÀúÊ·Ïß·,funcChangeLineID=%s" % funcChangeLineID, playerID) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FuncChangeLineID, 0) # ´¥·¢»ØÔ­Ïß·ºóÖØÖà return funcChangeLineID - 1 # ÓиßÏßÇеÍÏ߼Ǽ if highChangeLineID and highChangeLineID <= len(tagLinePlayerCountShuntDict): GameWorld.DebugLog("ÓиßÏßÇеÍÏßÀúÊ·Ïß·,highChangeLineID=%s" % highChangeLineID, playerID) NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HighChangeLineID, 0) # ´¥·¢»ØÔ­Ïß·ºóÖØÖà return highChangeLineID - 1 if curLineID not in tagLinePlayerCountShuntDict: GameWorld.DebugLog("Ä¿±êµØÍ¼²»´æÔÚ¸ÃÏß·,curLineID=%s" % curLineID, playerID) shuntLineID = __GetShuntLineID(curPlayer, tagMapID, tagLinePlayerCountShuntDict) # Èç¹ûûÓд¥·¢·ÖÁ÷£¬ÔòÐè¼ÇÂ¼Íæ¼Ò´Ó¸ßÏß·µØÍ¼Çл»µ½µÍÏß·µØÍ¼Ê±µÄ¸ßÏß·ID if shuntLineID == -1 and not playChangeLineID and not funcChangeLineID and not highChangeLineID: NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HighChangeLineID, curLineID + 1) GameWorld.DebugLog("¸ßÏßÇеÍÏߣ¬¼Ç¼µ±Ç°Ïß·ºóÐøÇÐÏß±¸ÓÃ! curLineID=%s,tagLineID=%s" % (curLineID, tagLineID), playerID) else: shuntLineID = __GetShuntLineID(curPlayer, tagMapID, tagLinePlayerCountShuntDict, curLineID) if shuntLineID == -1 and (curLineID + 1) > tagMapMaxLine: shuntLineID = tagMapMaxLine - 1 GameWorld.DebugLog("³£¹æ·ÖÁ÷ºóµÄlineIDΪ-1£¬µ«ÊÇÄ¿±êµØÍ¼µ±Ç°Ïß·²»¿ÉÓ㡲»¿É´«Ë͵½¸ÃÏß·£¡curLineID=%s + 1 > tagMapMaxLine(%s), Ç¿ÖÆ·ÖÁ÷µ½Ïß·(shuntLineID=%s)" % (curLineID, tagMapMaxLine, shuntLineID)) return shuntLineID def __GetShuntLineID(curPlayer, tagMapID, tagLinePlayerCountShuntDict, curLineID=None): # ÒÔÏÂ×ßϵͳ×Ô¶¯·ÖÁ÷Âß¼­ playerID = curPlayer.GetPlayerID() if curPlayer.GetLV() > IpyGameDataPY.GetFuncCfg("SetWorldPosShunt", 2): GameWorld.DebugLog("³¬¹ýÖ¸¶¨µÈ¼¶²»·ÖÁ÷", playerID) return -1 mapShuntDict = IpyGameDataPY.GetFuncEvalCfg("SetWorldPosShunt", 1) # {mapID:ÈËÊý, ...} if tagMapID not in mapShuntDict: GameWorld.DebugLog("Ä¿±êµØÍ¼²»ÐèÒª·ÖÁ÷", playerID) return -1 lineMaxPlayerCount = mapShuntDict[tagMapID] if curLineID != None: tagLinePlayerCount = tagLinePlayerCountShuntDict[curLineID] if tagLinePlayerCount < lineMaxPlayerCount: GameWorld.DebugLog("δ´ïµ½¶î¶¨ÈËÊýÖµ,²»Ó÷ÖÁ÷,curLineID=%s,Ä¿±êµØÍ¼µ±Ç°Ïß·ÈËÊý: %s/%s" % (curLineID, tagLinePlayerCount, lineMaxPlayerCount), playerID) return -1 # ·ÖÁ÷µ½ÈËÊý½ÏÉÙµÄÏß· linePlayerList = [[playerCount, lineID] for lineID, playerCount in tagLinePlayerCountShuntDict.items()] linePlayerList.sort() # ÉýÐòÅÅ, ÔòË÷Òý0µÄÏß·Ϊ×î¼ÑÑ¡Ôñ shuntLineID = linePlayerList[0][1] GameWorld.DebugLog("·ÖÁ÷µ½ÈËÊý½ÏÉÙµÄÏß·,tagMapID=%s,linePlayerList[count,lineID]=%s" % (tagMapID, linePlayerList), playerID) return shuntLineID def __GetBossShuntLineID(curPlayer, curMapID, curLineID, tagMapID, npcID, lineIDList): '''»ñȡĿ±êµØÍ¼boss·ÖÁ÷Ïß· ¸ù¾ÝÈËÊý·ÖÁ÷Íæ¼Ò£¬ÓÅÏÈ·ÖÅäµ½»î×ŵÄÏß· ¶ÓÎéĬÈÏ·ÖÅäµ½¶ÓÎé¶ÓÔ±¶àµÄÄÇÌõÏß Ð­ÖúĬÈÏ·ÖÅ䵽Ŀ±êÍæ¼ÒÏß·£¬ÓÅÏȼ¶×î¸ß ǰ¶Ë£º 1.ÔÚÖÐÁ¢µØÍ¼µÄʱºò£¬ÏÔʾµ±Ç°Ïß·BOSSµÄ״̬ 2.ÔÚ³£¹æµØÍ¼µÄʱºò£¬ÏÔÊ¾Íæ¼Ò»÷ɱBOSSµÄCDʱ¼ä 3.±¾µØÍ¼²»»»Ïߣ¬60Ãë¹æÔò±£³Ö²»±ä 4.½øÈëBOSSÇøÓòÀˢÐÂBOSS״̬ Íæ¼ÒÔÚ·ÇÖÐÁ¢µØÍ¼£º ±¾µØÍ¼²»»»Ïߣ¬60Ãë¹æÔò±£³Ö²»±ä£¨£© Íæ¼ÒÔÚÖÐÁ¢µØÍ¼ ûÓÐ60Ãë¹æÔò Ö±½Ó·¢´«ËͰü£¬Óɺó¶Ë¾ö¶¨£¨ÓжÓÔ±ÔÚ²»Í¬Ïß·´òͬһֻboss£¬Ôò´«ËÍ£¬·ñÔòmove£© ''' playerID = curPlayer.GetPlayerID() playerTeamID = curPlayer.GetTeamID() hurtTeamLineID = -1 hurtTeamMemCount = -1 bossLinePlayerDict = {1:[-1, []], 0:[-1, []]} # {ÊÇ·ñ±»»÷ɱ:[¸Ã״̬ÈËÊý¿ÕµÄÏß·, [[Íæ¼ÒÊý, Ïß·], ...]], ...} bossLineStateDict = PyGameData.g_bossShuntLineState.get(npcID, {}) haveAliveLine = False # ÊÇ·ñÓлî×ŵÄÏß· activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {}) GameWorld.DebugLog("Íæ¼Òboss·ÖÁ÷: playerTeamID=%s,tagMapID=%s,npcID=%s,lineIDList=%s,bossLineStateDict=%s,g_bossShuntPlayerInfo=%s" % (playerTeamID, tagMapID, npcID, lineIDList, bossLineStateDict, PyGameData.g_bossShuntPlayerInfo), playerID) if tagMapID in activityMapLineDict: activityLineID = max(0, activityMapLineDict[tagMapID] - 1) # ·Ç1ÏߵĻÏß·²»²ÎÓë·ÖÁ÷ if activityLineID != 0 and activityLineID in lineIDList: lineIDList.remove(activityLineID) GameWorld.DebugLog(" ·Ç1ÏߵĻÏß·²»²ÎÓë·ÖÁ÷: activityLineID=%s,lineIDList=%s" % (activityLineID, lineIDList), playerID) assistTagPlayerID = GetAssistTagPlayerID(curPlayer) for lineID in lineIDList: key = (tagMapID, lineID) # boss·ÖÁ÷Íæ¼ÒÐÅÏ¢{(mapID, lineID):{playerID:[bossID, teamID, relatedTick], ...}, ...} shuntPlayerDict = PyGameData.g_bossShuntPlayerInfo.get(key, {}) if assistTagPlayerID and assistTagPlayerID in shuntPlayerDict: GameWorld.DebugLog(" ·ÖÁ÷µ½Ð­ÖúÄ¿±êÍæ¼ÒÏß· assistTagPlayerID=%s,lineID=%s" % (assistTagPlayerID, lineID), playerID) return lineID playerCount = 0 teamPlayerCount = 0 for shuntPlayerID, shuntInfo in shuntPlayerDict.items(): bossID = shuntInfo[0] if npcID != bossID: continue playerCount += 1 shuntTeamID = shuntInfo[1] if playerTeamID and playerTeamID == shuntTeamID and shuntPlayerID != playerID: teamPlayerCount += 1 if teamPlayerCount and teamPlayerCount > hurtTeamMemCount: hurtTeamMemCount = teamPlayerCount hurtTeamLineID = lineID lineIsAlive = bossLineStateDict.get(lineID, 0) lineBossIsDead = 1 if not lineIsAlive else 0 # µ±Ç°Ïß·bossÊÇ·ñËÀÍö emptyLineID, linePlayerCountList = bossLinePlayerDict[lineBossIsDead] if not playerCount and emptyLineID == -1: emptyLineID = lineID linePlayerCountList.append([playerCount, lineID]) bossLinePlayerDict[lineBossIsDead] = [emptyLineID, linePlayerCountList] if not lineBossIsDead: haveAliveLine = True GameWorld.DebugLog(" lineID=%s,lineBossIsDead=%s,playerCount=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" % (lineID, lineBossIsDead, playerCount, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) if hurtTeamLineID >= 0: GameWorld.DebugLog(" ·ÖÁ÷µ½¶ÓÓÑÈËÊý¶àµÄÏß· hurtTeamLineID=%s" % hurtTeamLineID, playerID) return hurtTeamLineID if curMapID == tagMapID and curMapID in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4): GameWorld.DebugLog(" ÖÐÁ¢µØÍ¼ÔÚ±¾µØÍ¼ÖÐĬÈϵ±Ç°Ïß· curLineID=%s" % curLineID, playerID) return curLineID shuntBossIsDead = 0 if haveAliveLine else 1 # ÓÅÏÈ·ÖÁ÷µ½»î×ŵÄÏß· GameWorld.DebugLog(" boss״̬¶ÔÓ¦Ïß·ÈËÊý: haveAliveLine=%s, ״̬key0Ϊ»î×Å: %s" % (haveAliveLine, bossLinePlayerDict)) emptyLineID, linePlayerCountList = bossLinePlayerDict[shuntBossIsDead] linePlayerCountList.sort() # ÉýÐò playerCount, minPlayerCntLineID = linePlayerCountList[0] bossShuntPlayerCountMax = IpyGameDataPY.GetFuncCfg("BossShunt", 2) if playerCount >= bossShuntPlayerCountMax and emptyLineID >= 0: GameWorld.DebugLog(" ·ÖÁ÷µ½¿ÕÐÂÏß· shuntBossIsDead=%s,emptyLineID=%s" % (shuntBossIsDead, emptyLineID), playerID) return emptyLineID GameWorld.DebugLog(" ·ÖÁ÷µ½ÈËÊý×îÉÙµÄÏß· shuntBossIsDead=%s,minPlayerCntLineID=%s,linePlayerCountList=%s" % (shuntBossIsDead, minPlayerCntLineID, linePlayerCountList), playerID) return minPlayerCntLineID #--------------------------------------------------------------------- ##È¡ºÏ·¨ÖØÉúµã # @param curPlayer Íæ¼ÒʵÀý # @param posX ÖØÉúµãx×ø±ê # @param posy ÖØÉúµãy×ø±ê # @param round ÖØÉúµã·¶Î§ # @return ÖØÉúµã(×ø±êx£¬ ×ø±êy) # @remarks def __GetLegitRebornPoint(curPlayer, posX, posY, round): rebornPosX = 0 rebornPosY = 0 curMapID = curPlayer.GetMapID() gameMap = GameWorld.GetMap() #Ìí¼Ó×ø±êµãÒì³£¼ì²é(ÖØÉúµã×ø±ê³¬¹ýµØÍ¼±ß½ç) if not gameMap.IsValidPos(posX, posY): GameWorld.ErrLog('ÖØÉúµãÒì³££¬³¬¹ýµØÍ¼(%s)±ß½ç posX = %s, posY = %s, round = %s' \ % (curMapID, posX, posY, round)) else: # Ëæ»úÈ¡µ½·ÇÕϰ­µã rebornPosX, rebornPosY = GameMap.GetNearbyPosByDis(posX, posY, round) #²¼µÄÖØÉúµã·¶Î§ÄÚÕÒ²»µ½·ÇÕϰ­µã if rebornPosX <= 0 or rebornPosY <= 0: GameWorld.Log("ÖØÉúµã·¶Î§ÄÚÕÒ²»µ½¸ÃµØÍ¼(%s)µÄ·ÇÕϰ­ÖØÉúµã posX = %s, posY = %s, round = %s" % \ (curMapID, posX, posY, round), curPlayer.GetPlayerID()) return (rebornPosX, rebornPosY) #--------------------------------------------------------------------- ##Ë¢ÐÂÍæ¼ÒµÄÖØÉúµãÐÅÏ¢ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ë¢ÐÂÍæ¼ÒµÄÖØÉúµãÐÅÏ¢ def RefreshRebornPoint(curPlayer, tick): #---¸´»îµãË¢ÐÂÅжÏ˳Ðò1.µØÍ¼²¼¸´»îµã 2.tagChinMap.txtÄÚ¸´»îµã 3.´´½¨½ÇÉ«³õʼ³öÉúµã--- gameMap = GameWorld.GetMap() # ³õʼ»¯ÖØÉúµØÍ¼Îªµ±Ç°Íæ¼ÒËùÔÚµØÍ¼ rebornMapID = curPlayer.GetMapID() rebornPosX = curPlayer.GetRebornPosX() rebornPosY = curPlayer.GetRebornPosY() #---µØÍ¼Éϲ¼µÄÖØÉúµãÅжÏ--- # µØÍ¼ÉÏÊÇ·ñÓв¼¸´»îˢеã hasBornRefreshPoint = True gameData = GameWorld.GetGameData() bornRefreshCount = gameData.GetBornRefreshCount() #Ò»°ãµØÍ¼²¼µÄÖØÉúµãÁбí,¸ù¾Ý¹ú¼®É¸Ñ¡ bornList = [] #¸±±¾µØÍ¼²¼µÄÖØÉúµãÁбí,²»É¸Ñ¡ fbBornList = [] # ûÓв¼ÖØÉúµã if not bornRefreshCount: GameWorld.Log("´ËµØÍ¼Ã»ÓÐÖØÉúµã", curPlayer.GetPlayerID()) hasBornRefreshPoint = False else: #´´½¨ÖØÉúµãÁбí for i in range(0, bornRefreshCount): bornRefreshPoint = gameData.GetBornRefreshByIndex(i) fbBornList.append(i) if GameWorld.IsSameCountry(curPlayer, bornRefreshPoint): bornList.append(i) if not bornList: GameWorld.Log("´ËµØÍ¼Ã»ÓкÏÊÊÍæ¼ÒµÄÖØÉúµã", curPlayer.GetPlayerID()) hasBornRefreshPoint = False #---¸ÃµØÍ¼Óв¼ÖØÉúˢеã--- if hasBornRefreshPoint: # Ëæ»ú»ñÈ¡ÖØÉúˢеã bornIndex = random.choice(bornList) bornRefreshPoint = gameData.GetBornRefreshByIndex(bornIndex) bRP_PosX = bornRefreshPoint.GetPosX() bRP_PosY = bornRefreshPoint.GetPosY() bRP_RoundPos = bornRefreshPoint.GetRound() rebornPosX, rebornPosY = __GetLegitRebornPoint(curPlayer, bRP_PosX, bRP_PosY, bRP_RoundPos) #²¼µÄÖØÉúµã·¶Î§ÄÚÕÒ²»µ½ºÏ·¨ÖØÉúµã if rebornPosX <= 0 or rebornPosY <= 0 or rebornMapID <= 0: GameWorld.Log("µØÍ¼Éϲ¼µÄÖØÉúµã·¶Î§ÄÚÕÒ²»µ½¸ÃµØÍ¼(%s)µÄºÏ·¨ÖØÉúµã" \ % curPlayer.GetMapID(), curPlayer.GetPlayerID()) # Òì³££¬Éè±ê־ΪFalse,´ÓtagChinMap.txt±íÄÚÕÒ¸´»îµã hasBornRefreshPoint = False # ÔÚtagChinMap.txt±íÄÚÊÇ·ñÄÜÕÒµ½¸´»îµã hasBornPointInTxt = True #---¸ÃµØÍ¼Ã»ÓÐÖØÉúˢе㣬´ÓtagChinMap.txt±íÄÚÕÒ¸´»îµã--- if not hasBornRefreshPoint: rebornMapID = gameMap.GetRebornMapID() rebornPosX = gameMap.GetRebornMapX() rebornPosY = gameMap.GetRebornMapY() #ÑéÖ¤ÊÇ·ñ±¾µØÍ¼¸´»îµã ½øÐÐÂß¼­´¦Àí, ·Ç±¾µØÍ¼¸´»îµãÎÞ·¨Åжϣ¬ ÒªÇó²ß»®Ò»¶¨ÅäÖÃÕýÈ· if gameMap.GetMapID() == rebornMapID: # Ëæ»úÈ¡µ½·ÇÕϰ­µã rebornPosX, rebornPosY = __GetLegitRebornPoint(curPlayer, \ rebornPosX, rebornPosY, ChConfig.Def_RebornPos_Area_Range) #tagChinMap.txt±íÉÏÕÒ²»µ½ºÏ·¨ÖØÉúµã if rebornPosX <= 0 or rebornPosY <= 0 or rebornMapID <= 0: GameWorld.Log("tagChinMap.txtÄÚÕÒ²»µ½¸ÃµØÍ¼(%s)µÄºÏ·¨ÖØÉúµã" \ % curPlayer.GetMapID(), curPlayer.GetPlayerID()) hasBornPointInTxt = False #---ÔÚtagChinMap.txt±íÄÚÒ²ÕÒ²»µ½¸´»îµã,Ö±½ÓÖØÖõ½´´½¨½ÇɫʱµÄ³õʼµã--- if not hasBornPointInTxt: curPlayerJob = curPlayer.GetJob() #´´½¨Íæ¼ÒλÖöÁ±í{ Ö°Òµ:[(map,x,y),(map1,x1,y1)..] } posList = ReadChConfig.GetEvalChConfig('Player_Reborn_Place') pos = random.choice(posList[curPlayerJob]) rebornMapID = pos[0] bornRange = 1 rebornPosX = pos[2] + random.randint(-bornRange, bornRange) rebornPosY = pos[3] + random.randint(-bornRange, bornRange) GameWorld.Log("""tagBornRefresh.txtºÍtagChinMap.txtÄÚ¶¼ÕÒ²»µ½¸ÃµØÍ¼(%s) µÄºÏ·¨ÖØÉúµã£¬ÉèÖÃÍæ¼ÒÖØÉúµãΪ´´½¨½ÇɫʱµÄ³õʼµã%s-(%s,%s)""" % \ (curPlayer.GetMapID(), rebornMapID, rebornPosX, rebornPosY), curPlayer.GetPlayerID()) #Íæ¼Ò²»ÔÚ¸±±¾ÖÐ if gameMap.GetMapFBType() == IPY_GameWorld.fbtNull: # ÉèÖÃÒ»°ãµØÍ¼ÖØÉúµã curPlayer.SetRebornMapID(rebornMapID) curPlayer.SetRebornPosX(rebornPosX) curPlayer.SetRebornPosY(rebornPosY) GameWorld.Log("Íæ¼Ò%s,ÉèÖÃĬÈÏÖØÉúµãÍê±Ï mapID = %s-(%s,%s)" % (curPlayer.GetPlayerName(), rebornMapID, rebornPosX, rebornPosY), curPlayer.GetPlayerID()) return #=============================================================================== # #´å³¤¼ÒµÄµØÍ¼ID # cunZhangJiaMapID = 21 # # #ÓÐÖØÉúµã # #ÐÂÊÖ³¡ÅÂÍæ¼Ò¿¨ËÀÕϰ­µã£¬ÉèÖÃΪµ±Ç°×ø±ê # if curPlayerMapID == cunZhangJiaMapID: # curPlayer.SetRebornMapID( curPlayerMapID ) # curPlayer.SetRebornPosX( curPlayer.GetPosX() ) # curPlayer.SetRebornPosY( curPlayer.GetPosY() ) # return # # #À뿪ÐÂÊÖ³¡¾°ºó£¬ÖØÖÃÒ»´ÎÖØÉúµã£¬·ÀÖ¹Íæ¼ÒÔٻص½ÐÂÊÖ³¡¾° # if curPlayerRebornMapID == cunZhangJiaMapID: # curPlayer.SetRebornMapID( curPlayerMapID ) # curPlayer.SetRebornPosX( bornX ) # curPlayer.SetRebornPosY( bornY ) # return #=============================================================================== #ÏÈÉèÖÃĬÈϵĸ±±¾ÖØÉúµã curPlayer.SetFBRebornMapID(rebornMapID) curPlayer.SetFBRebornPosX(rebornPosX) curPlayer.SetFBRebornPosY(rebornPosY) GameWorld.Log("Íæ¼Ò%s,ÉèÖø±±¾Ä¬ÈÏÖØÉúµãÍê±Ï mapID = %s-(%s,%s)" % (curPlayer.GetPlayerName(), rebornMapID, rebornPosX, rebornPosY), curPlayer.GetPlayerID()) # ÌØÊ⸱±¾¸´»îµãÂß¼­ FBLogic.OnRebornPlace(curPlayer, fbBornList) return #--------------------------------------------------------------------- ##»ñÈ¡¾ôλ # @param curLV µÈ¼¶ # @return ·µ»ØÖµ, ¾ôλµÈ¼¶ # @remarks »ñÈ¡¾ôλ def GetRank(curLV): if curLV > 0 and curLV < 21: return 1 else: return (curLV - 1) / 10 #--------------------------------------------------------------------- ##»ñµÃÖ¸¶¨·½Î»ÄÚ¶ÓÎé³ÉÔ±Áбí # @param curTeam ¶ÓÎéʵÀý # @param centerX ÆðµãX # @param centerY ÆðµãY # @param area ·¶ # @return ·µ»ØÖµ, ³ÉÔ±Áбí # @remarks »ñµÃÖ¸¶¨·½Î»ÄÚ¶ÓÎé³ÉÔ±Áбí def GetAreaTeamMember(curTeam, centerX, centerY, area=ChConfig.Def_Team_GetExpScreenDist, isLog=False): playerlist = list() if curTeam == None: GameWorld.ErrLog("»ñÈ¡¶ÓÎéÇøÓò³ÉÔ±£¬¶ÓÎé²»´æÔÚ£¡") return playerlist playerIDList = [] #if isLog: # GameWorld.Log("GetAreaTeamMember,teamID=%s,centerX=%s,centerY=%s,area=%s" % (curTeam.GetTeamID(), centerX, centerY, area)) #±éÀú¶ÓÎé,°ë¾¶ÎªÒ»ÆÁ°ëµÄ¾àÀëÄÚµÄËùÓжÓÎé/ÍŶӳÉÔ±£¬¿ÉÒÔ»ñµÃ¾­Ñé for i in range(0, curTeam.GetMemberCount()): curTeamPlayer = curTeam.GetMember(i) if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0: #if isLog: # GameWorld.Log(" i=%s,³ÉÔ±²»´æÔÚ!" % (i)) continue if GameObj.GetHP(curTeamPlayer) <= 0: #if isLog: # GameWorld.Log(" i=%s,³ÉԱѪÁ¿Îª0!playerID=%s" % (i, curTeamPlayer.GetPlayerID())) continue #=========================================================================================== # # ¶ÓÎéÒÑÓÉÿÌõÐéÄâÏß·¶À×Ô¹ÜÀí£¬´Ë´¦¿É²»ÔÙÅÐ¶Ï # if curTeamPlayer.GetCopyMapID() != GameWorld.GetGameWorld().GetCopyMapID(): # if isLog: # GameWorld.Log(" i=%s,³ÉÔ±ÐéÄâÏß·²»Í¬!playerID=%s,copyMapID=%s,mapCopyMapID=%s" # % (i, curTeamPlayer.GetPlayerID(), curTeamPlayer.GetCopyMapID(), GameWorld.GetGameWorld().GetCopyMapID())) # #¸±±¾ID²»Í¬ # continue #=========================================================================================== if GameWorld.GetDist(centerX, centerY, curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY()) > area: #if isLog: # GameWorld.Log(" i=%s,³ÉÔ±²»ÔÚ·¶Î§ÄÚ!playerID=%s,centerPos(%s,%s),playerPos=(%s,%s),area=%s" # % (i, curTeamPlayer.GetPlayerID(), centerX, centerY, curTeamPlayer.GetPosX(), curTeamPlayer.GetPosY(), area)) continue playerlist.append(curTeamPlayer) playerIDList.append(curTeamPlayer.GetPlayerID()) #if isLog: # GameWorld.Log(" teamAreaPlayerIDList=%s" % (playerIDList)) return playerlist def GetMapTeamMember(curTeam): ''' »ñȡͬµØÍ¼ÖеĶÓÔ± ''' playerlist = list() if curTeam == None: return playerlist for i in xrange(curTeam.GetMemberCount()): curTeamPlayer = curTeam.GetMember(i) if curTeamPlayer == None or curTeamPlayer.GetPlayerID() == 0: continue playerlist.append(curTeamPlayer) return playerlist #--------------------------------------------------------------------- ##»ñÈ¡Íæ¼Ò»õ±ÒÊý # @param curPlayer Íæ¼ÒʵÀý # @param TYPE_Price ,»õ±ÒÀàÐÍ # @return def GetMoney(curPlayer, TYPE_Price): #½ð×Ó if TYPE_Price == IPY_GameWorld.TYPE_Price_Gold_Money: return curPlayer.GetGold() #½ðƱ elif TYPE_Price == IPY_GameWorld.TYPE_Price_Gold_Paper: return curPlayer.GetGoldPaper() #Òø×Ó elif TYPE_Price == IPY_GameWorld.TYPE_Price_Silver_Money: return GetSilver(curPlayer) #񿮱 elif TYPE_Price == IPY_GameWorld.TYPE_Price_Silver_Paper: return curPlayer.GetSilverPaper() #´ú±Ò elif TYPE_Price == ShareDefine.TYPE_Price_PayCoin: return GetPayCoin(curPlayer) #×Ô¶¨Òå»õ±Ò elif TYPE_Price in ShareDefine.TYPE_Price_CurrencyDict: return GetPlayerCurrency(curPlayer, TYPE_Price) return 0 def GetMoneyReal(curPlayer, moneyType): ## »ñÈ¡»õ±Òʵ¼ÊÖµ£¬Ö§³Ö¸ºÖµ moneyMinus = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MoneyMinus % moneyType) if moneyMinus != 0: return -moneyMinus return GetMoney(curPlayer, moneyType) def SetMoney(curPlayer, moneyType, value): ## ÉèÖûõ±ÒÖµ£¬Ö§³Ö¸ºÖµ if moneyType in ShareDefine.MoneyMinusRefreshDict: moneyMinus = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MoneyMinus % moneyType) if value < 0: if moneyMinus != value: SetMoneyMinus(curPlayer, moneyType, value) value = 0 else: if moneyMinus != 0: SetMoneyMinus(curPlayer, moneyType, 0) #½ð×Ó if moneyType == IPY_GameWorld.TYPE_Price_Gold_Money: curPlayer.SetGold(value) #½ðƱ elif moneyType == IPY_GameWorld.TYPE_Price_Gold_Paper: curPlayer.SetGoldPaper(value) #Òø×Ó elif moneyType == IPY_GameWorld.TYPE_Price_Silver_Money: SetSilver(curPlayer, value) #񿮱 elif moneyType == IPY_GameWorld.TYPE_Price_Silver_Paper: curPlayer.SetSilverPaper(value) #´ú±Ò elif moneyType == ShareDefine.TYPE_Price_PayCoin: SetPayCoin(curPlayer, value) #×Ô¶¨Òå»õ±Ò elif moneyType in ShareDefine.TYPE_Price_CurrencyDict: SetPlayerCurrency(curPlayer, moneyType, value) return def SetMoneyMinus(curPlayer, moneyType, value): value = abs(value) # ´æÖµ¼°Í¨ÖªÊ¹ÓÃÕýÊý NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MoneyMinus % moneyType, value) #֪ͨ¿Í»§¶Ë if moneyType not in ShareDefine.MoneyMinusRefreshDict: return refreshType = ShareDefine.MoneyMinusRefreshDict[moneyType] if refreshType != None: SendPropertyRefresh(curPlayer, refreshType, value) return ## »ñÈ¡Íæ¼Ò²Ö¿â½ðÇ®Êý # @param curPlayer: Íæ¼ÒʵÀý # @param moneyType: ½ðÇ®ÀàÐÍ # @return: Íæ¼ÒÉíÉϽðÇ®Êý def GetWarehouseMoney(curPlayer, moneyType): if moneyType == IPY_GameWorld.TYPE_Price_Gold_Money: return curPlayer.GetWarehouseGold() if moneyType == IPY_GameWorld.TYPE_Price_Gold_Paper: return curPlayer.GetWarehouseGoldPaper() if moneyType == IPY_GameWorld.TYPE_Price_Silver_Money: return curPlayer.GetWarehouseSilver() if moneyType == IPY_GameWorld.TYPE_Price_Silver_Paper: return curPlayer.GetWarehouseSilverPaper() GameWorld.ErrLog("GetWarehouseMoney, moneyType:%d Err" % (moneyType)) return 0 ## »ñµÃ×Ô¶¨Òå»õ±Ò£¨»ý·Ö£© # @param curPlayer Íæ¼ÒʵÀý # @return def GetPlayerCurrency(curPlayer, currencyType): return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Currency % currencyType) ## ÉèÖÃ×Ô¶¨Òå»õ±Ò£¨»ý·Ö£© # @param curPlayer Íæ¼ÒʵÀý # @return def SetPlayerCurrency(curPlayer, currencyType, value): NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Currency % currencyType, value) #֪ͨ¿Í»§¶Ë NotifyPlayerCurrency(curPlayer, currencyType, value) return def NotifyPlayerCurrency(curPlayer, currencyType, value=-1): if currencyType not in ShareDefine.TYPE_Price_CurrencyDict: return refreshType = ShareDefine.TYPE_Price_CurrencyDict[currencyType] if refreshType == None: # ²»ÐèҪ֪ͨ¿Í»§¶Ë return if value < 0: value = GetPlayerCurrency(curPlayer, currencyType) SendPropertyRefresh(curPlayer, refreshType, value) return # Í¨ÖªÍæ¼ÒËùÓÐ×Ô¶¨Òå»õ±Ò def NotifyPlayerAllCurrency(curPlayer): notifyList = [] for currencyType in ShareDefine.TYPE_Price_CurrencyDict: refreshType = ShareDefine.TYPE_Price_CurrencyDict[currencyType] if refreshType == None: # ²»ÐèҪ֪ͨ¿Í»§¶Ë continue #´Ë´¦¸ù¾ÝÐèÇóÈôValueΪ0 ¿É²»Í¨Öª¿Í»§¶Ë£¬¾ßÌ幦ÄÜÖÆ×÷Õß¾ö¶¨ value = GetPlayerCurrency(curPlayer, currencyType) notifyStruct = ChPyNetSendPack.tagRefreshType() notifyStruct.RefreshType = refreshType notifyStruct.Value = value notifyList.append(notifyStruct) # ¸ºÖµ»õ±Ò for moneyType, refreshType in ShareDefine.MoneyMinusRefreshDict.items(): if refreshType == None: # ²»ÐèҪ֪ͨ¿Í»§¶Ë continue value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MoneyMinus % moneyType) if not value: continue notifyStruct = ChPyNetSendPack.tagRefreshType() notifyStruct.RefreshType = refreshType notifyStruct.Value = value notifyList.append(notifyStruct) #ÊôÐÔ×éºÏ°ü ֪ͨ×Ô¼º sendPack = ChPyNetSendPack.tagObjInfoListRefresh() sendPack.Clear() sendPack.ObjID = curPlayer.GetID() sendPack.ObjType = curPlayer.GetGameObjType() sendPack.Count = len(notifyList) sendPack.RefreshType = notifyList NetPackCommon.SendFakePack(curPlayer, sendPack) return def NotifyUseMoneyTotal(curPlayer, moneyTypeList=None): if moneyTypeList: notifyMoneyTypeList = moneyTypeList else: notifyMoneyTypeList = ShareDefine.UseTotalPriceTypeList infoList = [] for moneyType in notifyMoneyTypeList: useTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UseMoneyTotal % moneyType) if not useTotal and moneyTypeList == None: continue info = ChPyNetSendPack.tagMCUseMoneyTotal() info.MoneyType = moneyType info.UseTotal = useTotal infoList.append(info) if not infoList: return clientPack = ChPyNetSendPack.tagMCUseMoneyTotalInfo() clientPack.Clear() clientPack.InfoList = infoList clientPack.Count = len(clientPack.InfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return ##Íæ¼ÒÊÇ·ñÓÐÇ®¿î # @param curPlayer Íæ¼ÒʵÀý # @param TYPE_Price ,»õ±ÒÀàÐÍ # @param Price ,»õ±Ò¼Û¸ñ # @return ·µ»ØÖµÕæ, ͨ¹ý # @remarks Íæ¼ÒÊÇ·ñÓÐÇ®¿î def HaveMoney(curPlayer, TYPE_Price, Price, needNotify=True): if Price < 0: return False needMoneyCount = 0 notifyCode = '' #½ð×ÓÖ§¸¶ if TYPE_Price == IPY_GameWorld.TYPE_Price_Gold_Money: needMoneyCount = curPlayer.GetGold() notifyCode = "GoldErr" #½ðƱ֧¸¶ elif TYPE_Price == IPY_GameWorld.TYPE_Price_Gold_Paper: needMoneyCount = curPlayer.GetGoldPaper() notifyCode = "GoldPaperErr" #Òø×ÓÖ§¸¶ elif TYPE_Price == IPY_GameWorld.TYPE_Price_Silver_Money: needMoneyCount = GetSilver(curPlayer) notifyCode = "SilverErr" #ÒøÆ±Ö§¸¶ elif TYPE_Price == IPY_GameWorld.TYPE_Price_Silver_Paper: needMoneyCount = curPlayer.GetSilverPaper() notifyCode = "SilverPaperErr" #´ú±ÒÖ§¸¶ elif TYPE_Price == ShareDefine.TYPE_Price_PayCoin: needMoneyCount = GetPayCoinTotal(curPlayer) #×Ô¶¨Òå»õ±Ò elif TYPE_Price in ShareDefine.TYPE_Price_CurrencyDict: needMoneyCount = GetPlayerCurrency(curPlayer, TYPE_Price) else: GameWorld.Log("¸¶·Ñ½ðÇ®Òì³£ TYPE_Price = %s" % (TYPE_Price), curPlayer.GetPlayerID()) return False if needMoneyCount < Price: lackPrice = Price - needMoneyCount # »¹È±¶àÉÙÇ® tagMoneyInfo = GetEqualMoneyInfo(TYPE_Price, lackPrice) if tagMoneyInfo: tagMoneyType, tagMoneyValue = tagMoneyInfo if HaveMoney(curPlayer, tagMoneyType, tagMoneyValue, False): GameWorld.DebugLog("HaveMoney¿ÉʹÓõȼۻõ±Ò²¹×ã¿Û³ý: TYPE_Price=%s, Price=%s, lackPrice=%s, tagMoneyType=%s, tagMoneyValue=%s" % (TYPE_Price, Price, lackPrice, tagMoneyType, tagMoneyValue), curPlayer.GetPlayerID()) return True #---Ç®²»¹» ·µ»Ø¼ÙÈç¹ûÐèÒªÌáʾµÄ»° ÌáʾÐÅÏ¢--- if needMoneyCount < Price: if needNotify and notifyCode: NotifyCode(curPlayer, notifyCode) GameWorld.DebugLog("»õ±Ò²»×ã: TYPE_Price=%s, Price=%s, curMoneyCount=%s" % (TYPE_Price, Price, needMoneyCount)) return False return True def GetEqualMoneyInfo(moneyType, needValue): equalMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("EqualValueMoney", 2, {}) if str(moneyType) not in equalMoneyInfo: return tagMoneyType = equalMoneyInfo[str(moneyType)] exchangeMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("EqualValueMoney", 1, {}) if str(tagMoneyType) not in exchangeMoneyInfo: return exchangeInfo = exchangeMoneyInfo[str(tagMoneyType)] if moneyType != exchangeInfo[0]: return multiple = exchangeInfo[1] tagMoneyValue = int(math.ceil(needValue / float(multiple))) #GameWorld.DebugLog("µÈ¼Û»õ±ÒÐÅÏ¢: moneyType=%s,needValue=%s,multiple=%s,tagMoneyType=%s,tagMoneyValue=%s" # % (moneyType, needValue, multiple, tagMoneyType, tagMoneyValue)) return tagMoneyType, tagMoneyValue #--------------------------------------------------------------------- ##Íæ¼ÒÊÇ·ñÓÐÇ®¿î # @param curPlayer Íæ¼ÒʵÀý # @param TYPE_Price ,»õ±ÒÀàÐÍ # @param Price ,»õ±Ò¼Û¸ñ # @return ·µ»ØÖµ[[type1,price1], [type2,price2]] # @remarks Íæ¼ÒÊÇ·ñÓÐÇ®¿î def HaveMoneyEx(curPlayer, TYPE_Price, Price, needNotify=True): if Price < 0: return [] if TYPE_Price == ShareDefine.TYPE_Price_Gold_Paper_Money: TYPE_Price = IPY_GameWorld.TYPE_Price_Gold_Money #аæÎÞ°óÓñ£¬Ô­ÏȰóÓñÔÙÏÉÓñµÄ¿Û·¨¸Ä³É ¿ÛÏÉÓñ 2019/3/26 #âýÓ¢°æ£º »Ö¸´°óÓñ£¬µ«ÊDz»Ê¹ÓÃÏȰóÓñÔÙÏÉÓñµÄ¹æÔò£¬Ô­À´ÏȰóÓñÔÙÏÉÓñµÄ¹æÔòÒ»ÑùΪĬÈÏ¿ÛÏÉÓñ 2019/10/8 if TYPE_Price in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper, IPY_GameWorld.TYPE_Price_Silver_Money, IPY_GameWorld.TYPE_Price_Silver_Paper]: if HaveMoney(curPlayer, TYPE_Price, Price, needNotify): return [[TYPE_Price, Price]] return [] #ÏÈÀñȯÔÙÔª±¦ elif TYPE_Price == ShareDefine.TYPE_Price_Gold_Paper_Money: goldPaper = curPlayer.GetGoldPaper() # Àñȯ gold = curPlayer.GetGold() # Ôª±¦ if goldPaper + gold < Price: # Ç®²»¹» if needNotify: NotifyCode(curPlayer, "GoldErr") return [] if goldPaper >= Price: # Ö»ÓÃÀñȯ¾Í¹»ÁË return [[IPY_GameWorld.TYPE_Price_Gold_Paper, Price]] needGold = Price - goldPaper # ÓÃÍêÀñȯ£¬»¹ÐèÒªÔª±¦ return [[IPY_GameWorld.TYPE_Price_Gold_Paper, goldPaper], [IPY_GameWorld.TYPE_Price_Gold_Money, needGold]] # #ÓÃÕ½Ã˹±Ï×¶È # elif TYPE_Price == ShareDefine.TYPE_Price_Family_Contribution: # return [] else: GameWorld.Log("¸¶·Ñ½ðÇ®Òì³£ TYPE_Price = %s" % (TYPE_Price), curPlayer.GetPlayerID()) return [] return [] #--------------------------------------------------------------------- ##Íæ¼Ò¸¶¿î # @param curPlayer Íæ¼ÒʵÀý # @param type_Price ,»õ±ÒÀàÐÍ # @param price ,»õ±Ò¼Û¸ñ # @param costType ,Ïû·ÑµãÀàÐÍ # @param infoDict ,À©Õ¹ÐÅÏ¢, ×ÓÏû·Ñ¶ÔÏó¿ÉÒÔͨ¹ýÉèÖÃChConfig.Def_Cost_Reason_SonKey keyÖµ # @param quantity ,ÊýÁ¿ # @param isMinus ,ÊÇ·ñÔÊÐí¿Û³É¸ºÖµ # @return ·µ»ØÖµÕæ, ¸¶¿î³É¹¦ # @remarks Íæ¼Ò¸¶¿î def PayMoney(curPlayer, type_Price, price, costType=ChConfig.Def_Cost_Unknown, infoDict={}, quantity=1, costVIPGold= -1, isNotify=True, isMinus=False): if price == 0: return True if price < 0: GameWorld.Log('###---¿ÛÇ®Òì³£ = %s' % (price), curPlayer.GetPlayerID()) return False lostMoney = price #20190917 »Ö¸´°óÓñ # if type_Price == IPY_GameWorld.TYPE_Price_Gold_Paper: # type_Price = IPY_GameWorld.TYPE_Price_Gold_Money #аæÎÞ°óÓñ£¬Ô­ÏȰóÓñÔÙÏÉÓñµÄ¿Û·¨¸Ä³É ¿ÛÏÉÓñ 2019/6/3 #½ð×ÓÖ§¸¶ if type_Price == IPY_GameWorld.TYPE_Price_Gold_Money: curPlayerGold = GetMoneyReal(curPlayer, type_Price) if curPlayerGold < price and not isMinus: NotifyCode(curPlayer, "GoldErr") return False updPlayerGold = curPlayerGold - price SetMoney(curPlayer, type_Price, updPlayerGold) curBourseMoney = GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney) updBourseMoney = curBourseMoney #µ±Êǽ»Ò×Ëù¿Û·Ñ¡¢×êʯºì°üʱ£¬Ôò±Ø¶¨¿Û³ý½»Ò×¶î¶È if costType in ChConfig.UnUseInner_CostType: updBourseMoney = max(0, curBourseMoney - price) #ÆäËûÈç¹ûµ±Ç°½ð×ӱȽ»Ò×¶î¶È»¹ÉÙ£¬ÔòÇ¿ÖÆµ÷Õû½»Ò×¶î¶ÈΪµ±Ç°½ð×ÓÊý(ÕâÖÖÇé¿öÒ»°ãÊǷǽ»Ò×ËùÏû·ÑµÄ£¬ÐèҪͬ²½¿Û³ý½»Ò×Ëù¿É¹ºÂò¶î¶È) elif updPlayerGold < updBourseMoney: updBourseMoney = updPlayerGold updBourseMoney = max(0, updBourseMoney) if updBourseMoney != curBourseMoney: SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_BourseMoney, updBourseMoney) infoDict["BourseMoney"] = updBourseMoney #½ðƱ֧¸¶ elif type_Price == IPY_GameWorld.TYPE_Price_Gold_Paper: curPlayerGoldPaper = GetMoneyReal(curPlayer, type_Price) if curPlayerGoldPaper < price and not isMinus: NotifyCode(curPlayer, "GoldPaperErr") return False updGoldPaper = curPlayerGoldPaper - price SetMoney(curPlayer, type_Price, updGoldPaper) #Òø×ÓÖ§¸¶ elif type_Price == IPY_GameWorld.TYPE_Price_Silver_Money: curPlayerSilver = GetSilver(curPlayer) if curPlayerSilver < price: NotifyCode(curPlayer, "SilverErr") return False #ÓÐ×ã¹»µÄǮ֧¸¶ SetSilver(curPlayer, curPlayerSilver - price) #ÒøÆ±Ö§¸¶ elif type_Price == IPY_GameWorld.TYPE_Price_Silver_Paper: curPlayerSilverPaper = curPlayer.GetSilverPaper() if curPlayerSilverPaper < price: NotifyCode(curPlayer, "SilverPaperErr") return False #ÓÐ×ã¹»µÄǮ֧¸¶ curPlayer.SetSilverPaper(curPlayerSilverPaper - price) #´ú±ÒÖ§¸¶ elif type_Price == ShareDefine.TYPE_Price_PayCoin: curPlayerPayCoin = GetPayCoin(curPlayer) curPayCoinDay = GetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_PayCoinDay) payCoinTotal = curPlayerPayCoin + curPayCoinDay if payCoinTotal < price: return False #ÓÐ×ã¹»µÄǮ֧¸¶ costPayCoinDay = price if (curPayCoinDay >= price) else curPayCoinDay costPayCoin = price if costPayCoinDay: GameWorld.DebugLog("Ïȿ۴ú±ÒʱЧ: curPayCoinDay=%s,price=%s,costPayCoinDay=%s" % (curPayCoinDay, price, costPayCoinDay)) SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_PayCoinDay, curPayCoinDay - costPayCoinDay) costPayCoin -= costPayCoinDay GameWorld.DebugLog("ÔÙ¿Û´ú±Ò: costPayCoin=%s" % (costPayCoin)) #ʱЧ²»¹»¿Û³ý£¬ÔÙ¿Û·ÇʱЧ if costPayCoin > 0: SetPayCoin(curPlayer, curPlayerPayCoin - costPayCoin) #×Ô¶¨Òå»õ±Ò elif type_Price in ShareDefine.TYPE_Price_CurrencyDict: curCurrency = GetPlayerCurrency(curPlayer, type_Price) if curCurrency < price: lostMoney = curCurrency lackPrice = price - curCurrency # »¹È±¶àÉÙÇ® tagMoneyInfo = GetEqualMoneyInfo(type_Price, lackPrice) if tagMoneyInfo: tagMoneyType, tagMoneyValue = tagMoneyInfo if not PayMoney(curPlayer, tagMoneyType, tagMoneyValue, costType, infoDict, quantity, costVIPGold, isNotify, isMinus): #GameWorld.Log("µÈ¼Û»õ±ÒÒ²²»×ã") return False GameWorld.Log("µÈ¼Û»õ±Ò²¹×ã¿Û³ý: type_Price%s, price=%s, curCurrency=%s, lackPrice=%s, tagMoneyType=%s, tagMoneyValue=%s" % (type_Price, price, curCurrency, lackPrice, tagMoneyType, tagMoneyValue), curPlayer.GetPlayerID()) else: GameWorld.DebugLog("»õ±Ò²»×ã! type_Price=%s,curCurrency=%s < %s" % (type_Price, curCurrency, price)) return False #ÓÐ×ã¹»µÄǮ֧¸¶ SetPlayerCurrency(curPlayer, type_Price, curCurrency - lostMoney) else: GameWorld.Log("¸¶·Ñ½ðÇ®Òì³£ type_Price = %s" % (type_Price), curPlayer.GetPlayerID()) return False #¸¶¿îÒÔºóºóÐø²Ù×÷ __PayMoneyAfter(curPlayer, type_Price, lostMoney, costType, infoDict, quantity, costVIPGold) #֪ͨ¿Í»§¶Ëʧȥ½ðÇ® if isNotify: if type_Price == ShareDefine.TYPE_Price_PayCoin: NotifyCode(curPlayer, "LostMoney", [type_Price, str(round(lostMoney/100.0, 2))]) else: NotifyCode(curPlayer, "LostMoney", [type_Price, lostMoney]) return True ## ¸¶¿îÒÔºóºóÐø²Ù×÷ # @param curPlayer Íæ¼ÒʵÀý # @param type_Price ,»õ±ÒÀàÐÍ # @param price ,»õ±Ò¼Û¸ñ # @param costType ,Ïû·ÑÀàÐÍ # @param infoDict ,À©Õ¹ÐÅÏ¢ # @param quantity Ïû·ÑÊýÁ¿ # @return None def __PayMoneyAfter(curPlayer, type_Price, price, costType, infoDict, quantity, costVIPGold): if type_Price in ShareDefine.UseTotalPriceTypeList: useTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UseMoneyTotal % type_Price) useTotal = min(useTotal + price, ChConfig.Def_UpperLimit_DWord) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UseMoneyTotal % type_Price, useTotal) NotifyUseMoneyTotal(curPlayer, [type_Price]) #½ð×ÓÖ§¸¶ if type_Price == IPY_GameWorld.TYPE_Price_Gold_Money: __PayMoneyAfterByGoldMoney(curPlayer, type_Price, price, costType, infoDict, costVIPGold) #½ðƱ֧¸¶ elif type_Price == IPY_GameWorld.TYPE_Price_Gold_Paper: __PayMoneyAfterByGoldPaper(curPlayer, price, costType, infoDict) #Òø×ÓÖ§¸¶ elif type_Price == IPY_GameWorld.TYPE_Price_Silver_Money: __PayMoneyAfterBySilverMoney(curPlayer, price) #ÒøÆ±Ö§¸¶ elif type_Price == IPY_GameWorld.TYPE_Price_Silver_Paper: __PayMoneyAfterBySilverPaper(curPlayer, price) #»îÔ¾¶È´¦Àí PlayerActivity.OnPayMoneyActivity(curPlayer, type_Price, price) #תÅ̻ PlayerActTurntable.OnPlayerUseGold(curPlayer, type_Price, price) #Âֻصî PlayerActLunhuidian.AddLunhuidianValue(curPlayer, PlayerActLunhuidian.AwardType_PayMoney, type_Price, price) if type_Price == ShareDefine.TYPE_Price_Xiantao: # ÀÛ¼Óδ½áËãÕ½´¸ - ¾­Ñé unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp + price) # ÀÛ¼Óδ½áËãÕ½´¸ - ×°±¸ unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip + price) # ÀÛ¼Óδ½áËãÕ½´¸ - Õ½ÀûÆ· chapterID = GetMainLevelNowInfo(curPlayer)[0] chapterIpyData = IpyGameDataPY.GetIpyGameData("MainChapter", chapterID) if chapterIpyData: DailyBootyUpperList = chapterIpyData.GetDailyBootyUpperList() for itemID, upperCnt in DailyBootyUpperList: if upperCnt <= 0: continue if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BootyDropToday % itemID) >= upperCnt: continue unXiantaoCntBooty = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntBooty % itemID) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntBooty % itemID, unXiantaoCntBooty + price) PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_UseXiantao, price) unitPrice = price if quantity == 1 else int(math.ceil(price * 1.0 / quantity)) # µ¥¼Û #reason_name = "Unknown" if not costType else costType reason_name = costType eventName = reason_name if costType in ChConfig.Def_CostType_Dict: eventName = ChConfig.Def_CostType_Dict[costType] #=========================================================================== # isDivSonKey = False # ÊÇ·ñÇø·ÖÏû·Ñ¶ÔÏó # if costType in ChConfig.Def_CostType_Dict: # eventName, reason_name, isDivSonKey = ChConfig.Def_CostType_Dict[costType] # if costType in ChConfig.CostGroupToGoldShop: # reason_name = ChConfig.Def_CostType_Dict[ChConfig.Def_Cost_BuyStoreItem][1] # # if isDivSonKey and isinstance(infoDict, dict) and ChConfig.Def_Cost_Reason_SonKey in infoDict: # reasonSon = infoDict[ChConfig.Def_Cost_Reason_SonKey] # else: # reasonSon = reason_name # # ͳһ¸ñʽ: ¡¸Ïû·Ñ×é:Ïû·Ñ¶ÔÏó¡¹ ; ûÓÐÉèÖÃÏû·Ñ¶ÔÏóµÄĬÈÏΪÏû·Ñ×é # reason_name = "%s:%s" % (reason_name, reasonSon) #=========================================================================== # ³ý×êʯ¼°°ó×êÍ⣬δָ¶¨²Ù×÷ÀàÐ͵IJ»¼Ç¼ if type_Price not in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper, ShareDefine.TYPE_Price_PayCoin] \ and costType == ChConfig.Def_Cost_Unknown: #GameWorld.DebugLog("¸Ã»õ±ÒûÓÐÖ¸¶¨Ïû·ÑÀàÐͲ»¼Ç¼!type_Price=%s,costType=%s" % (type_Price, costType)) return if type_Price == ShareDefine.TYPE_Price_PayCoin: playerID = curPlayer.GetPlayerID() nowMoney = GetMoneyReal(curPlayer, type_Price) payCoinDay = GetMoney(curPlayer, ShareDefine.TYPE_Price_PayCoinDay) infoDict["PlayerMoneyCount2"] = payCoinDay orderInfo = infoDict.get("orderInfo", "") GameWorld.Log("¼Ç¼ÏûºÄ´ú±Ò: eventName=%s,price=%s,nowMoney=%s,payCoinDay=%s,orderInfo=%s" % (eventName, price, nowMoney, payCoinDay, orderInfo), playerID) GameWorld.AddPlayerRec(playerID, ShareDefine.Def_PlayerRecType_PayCoin, [2, price, nowMoney, payCoinDay], orderInfo, 1) # Á÷ÏòÓà eventName #if eventName: if costType == ChConfig.Def_Cost_Treasure: GameWorld.DebugLog("BT°æ±¾Ñ°±¦ÏûºÄ»õ±ÒÔÝʱ²»¼Ç¼Á÷Ïò: %s,type_Price=%s,price=%s" % (eventName, type_Price, price)) else: DataRecordPack.DR_UseMoney(curPlayer, eventName, type_Price, price, infoDict) # Á÷Ïò EventReport.WriteEvent_virtual_resource(curPlayer, type_Price, reason_name, quantity, unitPrice, ShareDefine.Def_UserAction_Money_Use, infoDict) #=========================================================================== # if type_Price == IPY_GameWorld.TYPE_Price_Gold_Money: # EventReport.WriteEvent_virtual_cost(curPlayer, quantity, unitPrice, reason_name) # elif type_Price in [IPY_GameWorld.TYPE_Price_Gold_Paper, IPY_GameWorld.TYPE_Price_Silver_Money]: # # # ½ð±Òδָ¶¨Ïû·ÑÀàÐ͵IJ»¼Ç¼ # if type_Price == IPY_GameWorld.TYPE_Price_Silver_Money and costType == ChConfig.Def_Cost_Unknown: # return # EventReport.WriteEvent_virtual_resource(curPlayer, type_Price, reason_name, quantity, # unitPrice, ShareDefine.Def_UserAction_Money_Use) # # # ×Ô¶¨Òå¼Ç¼ # priceNameDict = {IPY_GameWorld.TYPE_Price_Gold_Money:["×êʯ", "GetGold", 0], # IPY_GameWorld.TYPE_Price_Gold_Paper:["°ó×ê", "GetGoldPaper", 0], # IPY_GameWorld.TYPE_Price_Silver_Money:["½ð±Ò", "GetSilver", ChConfig.Def_DRRecord_Min_Silver], # } # if type_Price in priceNameDict: # typeName, moneyFuncName, minPrice = priceNameDict[type_Price] # if minPrice <= 0 or price >= minPrice: # EventReport.WriteEvent_pay_money(curPlayer, reason_name, typeName, price, getattr(curPlayer, moneyFuncName)()) #=========================================================================== return ## ¸¶¿îÒÔºóºóÐø²Ù×÷(½ð×Ó) # @param curPlayer Íæ¼ÒʵÀý # @param price ,»õ±Ò¼Û¸ñ # @return None def __PayMoneyAfterByGoldMoney(curPlayer, type_Price, price, costType, infoDict, costVIPGold): # ³äÖµ»î¶¯Íæ¼ÒÏûºÄÔª±¦´¦Àí #PlayerGoldAction.PlayerUseGold(curPlayer, price) # Ïû·Ñ·µÀû if costType not in ChConfig.CostRebate_DisableType: PlayerCostRebate.AddCostRebateGold(curPlayer, costType, price, infoDict) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_UseGold, price) PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_UseGold, price) else: GameWorld.DebugLog("²»¼ÆÈëÏû·Ñ»î¶¯µÄÏû·ÑÀàÐÍ!costType=%s" % costType, curPlayer.GetPlayerID()) # ʼþ»ã±¨ #=========================================================================== # if costType == ChConfig.Def_Cost_BourseBuy: # # ½»Ò×Ëù¹ºÂòÎïÆ·£¬»ã±¨½»Ò××êʯ # playerName = curPlayer.GetPlayerName() # leftGold = curPlayer.GetGold() # eventParam = "RoleID=%s,Price=%s,TradeType=Lost,LeftGold=%s" \ # % (playerName, price, leftGold) # EventReport.EventReport(ShareDefine.Def_UserAction_TradeGold, eventParam, curPlayer) # else: # playerName = curPlayer.GetPlayerName() # leftGold = curPlayer.GetGold() # eventParam = "RoleID=%s,CostType=%s,ItemID=%s,Price=%s,LeftGold=%s" \ # % (playerName, costType, infoDict, price, leftGold) # EventReport.EventReport(ShareDefine.Def_UserAction_UseGold, eventParam, curPlayer) #=========================================================================== # ֪ͨԪ±¦Ïû·Ñ¼Ç¼ #__Sync_GoldCostReport(curPlayer, costType, price, expandValue) return ## ֪ͨԪ±¦Ïû·Ñ¼Ç¼ # @param curPlayer: Íæ¼ÒʵÀý # @param costType: Ïû·ÑµãÀàÐÍ # @param price: Ïû·Ñ¶î¶È # @param itemID: ÎïÆ·id£¬Ïû·ÑÀàÐÍΪÎïÆ·Ê±¿ÉÌî # @return None def __Sync_GoldCostReport(curPlayer, costType, price, itemID=0): sendPack = ChPyNetSendPack.tagMCGoldCostReport() sendPack.Clear() sendPack.CostType = costType sendPack.Price = price sendPack.ItemID = itemID NetPackCommon.SendFakePack(curPlayer, sendPack) return ## ¸¶¿îÒÔºóºóÐø²Ù×÷(½ðƱ) # @param curPlayer Íæ¼ÒʵÀý # @param price ,»õ±Ò¼Û¸ñ # @return None def __PayMoneyAfterByGoldPaper(curPlayer, price, costType, infoDict): # ʼþ»ã±¨ #=========================================================================== # playerName = curPlayer.GetPlayerName() # leftGoldPaper = curPlayer.GetGoldPaper() # eventParam = "RoleID=%s,CostType=%s,ItemID=%s,Price=%s,LeftGoldPaper=%s" \ # % (playerName, costType, infoDict, price, leftGoldPaper) # EventReport.EventReport(ShareDefine.Def_UserAction_UseGoldPaper, eventParam, curPlayer) #=========================================================================== return ## ¸¶¿îÒÔºóºóÐø²Ù×÷(½ðƱ) # @param curPlayer Íæ¼ÒʵÀý # @param price ,»õ±Ò¼Û¸ñ # @return None def __PayMoneyAfterBySilverMoney(curPlayer, price): return ## ¸¶¿îÒÔºóºóÐø²Ù×÷(½ðƱ) # @param curPlayer Íæ¼ÒʵÀý # @param price ,»õ±Ò¼Û¸ñ # @return None def __PayMoneyAfterBySilverPaper(curPlayer, price): return #--------------------------------------------------------------------- ##Íæ¼Ò»ñµÃ½ðÇ® # @param curPlayer Íæ¼ÒʵÀý # @param value ,»õ±Ò¼Û¸ñ # @param priceType ,»õ±ÒÀàÐÍ # @return ·µ»ØÖµÕæ, ¸øÇ®³É¹¦ # @param isSysHint ÊÇ·ñϵͳÌáʾ£¨Ä¬ÈÏÊÇ£© # @remarks Íæ¼Ò»ñµÃ½ðÇ® def GiveMoney(curPlayer, priceType, value, giveType=ChConfig.Def_GiveMoney_Unknown, addDataDict={}, isSysHint=True, isGiveBourseMoney=True): if value == 0: return True if value < 0: GameWorld.Log('Íæ¼Ò»ñµÃ½ðÇ®Òì³£ £¬ value = %s , priceType = %s ,' % (value, priceType)) return if GameWorld.IsCrossServer(): serverGroupID = GetPlayerServerGroupID(curPlayer) msgInfo = {"PlayerID":curPlayer.GetPlayerID(), "MoneyType":priceType, "Value":value, "GiveType":giveType, "AddDataDict":addDataDict} GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_GiveMoney, msgInfo, [serverGroupID]) return True befMoney = GetMoney(curPlayer, priceType) if priceType == IPY_GameWorld.TYPE_Price_Gold_Money: updPlayerGold = GetMoneyReal(curPlayer, priceType) + value if updPlayerGold > ChConfig.Def_PlayerTotalMoney_Gold: #³¬¹ý½ðÇ®ÉÏÏÞ NotifyCode(curPlayer, "MoneyIsFull", [priceType]) return SetMoney(curPlayer, priceType, updPlayerGold) if isGiveBourseMoney and updPlayerGold > 0: GiveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, min(value, updPlayerGold)) addDataDict["BourseMoney"] = GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney) elif priceType == IPY_GameWorld.TYPE_Price_Gold_Paper: updPlayerGoldPaper = GetMoneyReal(curPlayer, priceType) + value if updPlayerGoldPaper > ChConfig.Def_PlayerTotalMoney_Gold: #³¬¹ý½ðÇ®ÉÏÏÞ NotifyCode(curPlayer, "MoneyIsFull", [priceType]) return SetMoney(curPlayer, priceType, updPlayerGoldPaper) elif priceType == IPY_GameWorld.TYPE_Price_Silver_Money: # ½ðǮ֧³Ö³¬¹ý20ÒÚ, Ôݲ»×öÉÏÏÞ¿ØÖÆ # if curSilver + value > ChConfig.Def_PlayerTotalMoney_Silver: # #³¬¹ý½ðÇ®ÉÏÏÞ # NotifyCode(curPlayer, "MoneyIsFull", [priceType]) # return SetSilver(curPlayer, GetSilver(curPlayer) + value) elif priceType == IPY_GameWorld.TYPE_Price_Silver_Paper: if curPlayer.GetSilverPaper() + value > ChConfig.Def_PlayerTotalMoney_Silver: #³¬¹ý½ðÇ®ÉÏÏÞ NotifyCode(curPlayer, "MoneyIsFull", [priceType]) return curPlayer.SetSilverPaper(curPlayer.GetSilverPaper() + value) elif priceType == ShareDefine.TYPE_Price_PayCoin: SetPayCoin(curPlayer, GetPayCoin(curPlayer) + value) #×Ô¶¨Òå»õ±Ò elif priceType in ShareDefine.TYPE_Price_CurrencyDict: curCurrency = GetPlayerCurrency(curPlayer, priceType) if curCurrency >= ChConfig.Def_UpperLimit_DWord: return updValue = min(ChConfig.Def_UpperLimit_DWord, curCurrency + value) SetPlayerCurrency(curPlayer, priceType, updValue) if priceType == ShareDefine.TYPE_Price_RealmPoint: PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_GetRealmPoint, value) else: GameWorld.ErrLog("½ðÇ®ÀàÐÍ´íÎó, priceType=%s,value=%s,giveType=%s" % (priceType, value, giveType), curPlayer.GetPlayerID()) DataRecordPack.DR_GiveMoneyError(curPlayer, priceType, value, giveType, addDataDict) return # ʱЧ´ú±ÒºóÐø´¦Àí¾ùÊÓΪ´ú±Ò£¬°üº¬ÏµÍ³Ìáʾ¡¢¼Ç¼¡¢Á÷ÏòµÈ if priceType == ShareDefine.TYPE_Price_PayCoinDay: priceType = ShareDefine.TYPE_Price_PayCoin if isSysHint and priceType != ShareDefine.TYPE_Price_BourseMoney: #֪ͨ¿Í»§¶ËµÃµ½½ðÇ® if priceType == ShareDefine.TYPE_Price_PayCoin: NotifyCode(curPlayer, "GetMoney", [priceType, str(round(value/100.0, 2))]) else: NotifyCode(curPlayer, "GetMoney", [priceType, value]) __GiveMoneyAfter(curPlayer, priceType, value, giveType, addDataDict) if befMoney == 0: aftMoney = GetMoney(curPlayer, priceType) if aftMoney > 0: ItemControler.CheckGiveBindMoneyTypeItem(curPlayer, priceType) return True def __GiveMoneyAfter(curPlayer, priceType, value, giveType, addDataDict): # ³ý×êʯ¼°°ó×êÍ⣬δָ¶¨²Ù×÷ÀàÐ͵IJ»¼Ç¼ PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_GetMoney, value, [priceType]) if priceType not in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper, ShareDefine.TYPE_Price_PayCoin] \ and giveType == ChConfig.Def_GiveMoney_Unknown: #GameWorld.DebugLog("¸Ã»õ±ÒûÓÐÖ¸¶¨À´Ô´ÀàÐͲ»¼Ç¼!priceType=%s,giveType=%s" % (priceType, giveType)) return eventName = giveType if giveType in ChConfig.Def_GetType_Dict: eventName = ChConfig.Def_GetType_Dict[giveType] addDataDict["eventName"] = eventName if priceType == ShareDefine.TYPE_Price_PayCoin: playerID = curPlayer.GetPlayerID() nowMoney = GetMoneyReal(curPlayer, priceType) payCoinDay = GetMoney(curPlayer, ShareDefine.TYPE_Price_PayCoinDay) addDataDict["PlayerMoneyCount2"] = payCoinDay orderInfo = addDataDict.get("orderInfo", "") GameWorld.Log("¼Ç¼»ñµÃ´ú±Ò: eventName=%s,value=%s,nowMoney=%s,payCoinDay=%s,orderInfo=%s" % (eventName, value, nowMoney, payCoinDay, orderInfo), playerID) GameWorld.AddPlayerRec(playerID, ShareDefine.Def_PlayerRecType_PayCoin, [1, value, nowMoney, payCoinDay], orderInfo, 1) if addDataDict.get("GiveItemEvent") == "Treasure": GameWorld.DebugLog("BT°æ±¾Ñ°±¦¸ø»õ±ÒÔÝʱ²»¼Ç¼Á÷Ïò: %s,priceType=%s,price=%s" % (eventName, priceType, value)) else: DataRecordPack.DR_GiveMoney(curPlayer, eventName, priceType, value, addDataDict) EventReport.WriteEvent_virtual_resource(curPlayer, priceType, giveType, 1, value, ShareDefine.Def_UserAction_Money_Get, addDataDict) #=============================================================================== # reason_name = "Unknown" if not giveType else giveType # eventName = reason_name # if giveType in ChConfig.Def_GetType_Dict: # eventName, reason_name = ChConfig.Def_GetType_Dict[giveType][:2] # if isinstance(addDataDict, dict) and ChConfig.Def_Give_Reason_SonKey in addDataDict: # reasonSon = addDataDict[ChConfig.Def_Give_Reason_SonKey] # else: # reasonSon = reason_name # # ͳһ¸ñʽ: ¡¸»ñµÃ×é:»ñµÃÔ­Òò¡¹ # reason_name = "%s:%s" % (reason_name, reasonSon) # # # Á÷ÏòÓà eventName # if eventName: # DataRecordPack.DR_GiveMoney(curPlayer, eventName, priceType, value, addDataDict) # # if priceType == IPY_GameWorld.TYPE_Price_Gold_Money: # playerName = curPlayer.GetPlayerName() # eventParam = "RoleID=%s,AddGold=%s,LeftGold=%s,AddDataDict=%s" \ # % (playerName, value, curPlayer.GetGold(), addDataDict) # EventReport.EventReport(ShareDefine.Def_UserAction_GameMakeGold, eventParam, curPlayer) # # elif priceType == IPY_GameWorld.TYPE_Price_Gold_Paper: # playerName = curPlayer.GetPlayerName() # eventParam = "RoleID=%s,AddGoldPaper=%s,LeftGoldPaper=%s,AddDataDict=%s" \ # % (playerName, value, curPlayer.GetGoldPaper(), addDataDict) # EventReport.EventReport(ShareDefine.Def_UserAction_GameMakeGoldPaper, eventParam, curPlayer) # # # if priceType == IPY_GameWorld.TYPE_Price_Gold_Money: #and eventName != "CoinToGold": # EventReport.WriteEvent_virtual_reward(curPlayer, value, reason_name) # # ¶þ¼¶»õ±Ò²ú³ö¼Ç¼, ÔÝÖ»¼Ç¼°ó×ê¡¢½ð±Ò # elif priceType in [IPY_GameWorld.TYPE_Price_Gold_Paper, IPY_GameWorld.TYPE_Price_Silver_Money]: # EventReport.WriteEvent_virtual_resource(curPlayer, priceType, reason_name, 1, value, # ShareDefine.Def_UserAction_Money_Get) # # # ×Ô¶¨Òå¼Ç¼ # priceNameDict = {IPY_GameWorld.TYPE_Price_Gold_Money:["×êʯ", "GetGold", 0], # IPY_GameWorld.TYPE_Price_Gold_Paper:["°ó×ê", "GetGoldPaper", 0], # IPY_GameWorld.TYPE_Price_Silver_Money:["½ð±Ò", "GetSilver", ChConfig.Def_DRRecord_Min_Silver], # } # if priceType in priceNameDict: # typeName, moneyFuncName, minPrice = priceNameDict[priceType] # if minPrice <= 0 or value >= minPrice: # EventReport.WriteEvent_give_money(curPlayer, reason_name, typeName, value, getattr(curPlayer, moneyFuncName)()) #=============================================================================== return #--------------------------------------------------------------------- ##Íæ¼ÒÄÜ·ñ»ñµÃ½ðÇ® # @param curPlayer Íæ¼ÒʵÀý # @param value ,»õ±Ò¼Û¸ñ # @param type ,»õ±ÒÀàÐÍ # @return ·µ»ØÖµÕæ, ͨ¹ý # @remarks Íæ¼ÒÄÜ·ñ»ñµÃ½ðÇ® def CanGiveMoney(curPlayer, priceType, value): if value == 0: return True if priceType == IPY_GameWorld.TYPE_Price_Gold_Money: if curPlayer.GetGold() + value > ChConfig.Def_PlayerTotalMoney_Gold: #³¬¹ý½ðÇ®ÉÏÏÞ NotifyCode(curPlayer, "MoneyIsFull", [priceType]) return False elif priceType == IPY_GameWorld.TYPE_Price_Gold_Paper: if curPlayer.GetGoldPaper() + value > ChConfig.Def_PlayerTotalMoney_Gold: #³¬¹ý½ðÇ®ÉÏÏÞ NotifyCode(curPlayer, "MoneyIsFull", [priceType]) return False elif priceType == IPY_GameWorld.TYPE_Price_Silver_Money: #½ð±ÒÖ§³Ö³¬¹ý20ÒÚ£¬Ôݲ»×öÉÏÏÞ¿ØÖÆ pass # if GetSilver(curPlayer) + value > ChConfig.Def_PlayerTotalMoney_Silver: # #³¬¹ý½ðÇ®ÉÏÏÞ # NotifyCode(curPlayer, "MoneyIsFull", [priceType]) # return False elif priceType == IPY_GameWorld.TYPE_Price_Silver_Paper: if curPlayer.GetSilverPaper() + value > ChConfig.Def_PlayerTotalMoney_Silver: #³¬¹ý½ðÇ®ÉÏÏÞ NotifyCode(curPlayer, "MoneyIsFull", [priceType]) return False elif priceType == ShareDefine.TYPE_Price_PayCoin: pass elif priceType in ShareDefine.TYPE_Price_CurrencyDict: curCurrency = GetPlayerCurrency(curPlayer, priceType) if curCurrency + value > ChConfig.Def_UpperLimit_DWord: return False else: GameWorld.Log("½ðÇ®ÀàÐÍ = %sÌî´íÀ²" % (priceType), curPlayer.GetPlayerID()) return False return True #--------------------------------------------------------------------- ##Íæ¼Ò×Ô¶¯»ØÑª # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Ò×Ô¶¯»ØÑª def PlayerAutoRestoreHP(curPlayer, tick): return #--------------------------------------------------------------------- ##Íæ¼Ò×Ô¶¯»ØÄ§ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼Ò×Ô¶¯»ØÄ§ def PlayerAutoRestoreMP(curPlayer, tick): return ##»ñµÃµ±Ç°Íæ¼ÒµÄ²Î¿¼¾­Ñé # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµ, ²Î¿¼¾­Ñé # @remarks »ñµÃµ±Ç°Íæ¼ÒµÄ²Î¿¼¾­Ñé def GetPlayerReExp(curPlayer): return 0 #lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV()) #if not lvIpyData: # return 0 #return lvIpyData.GetReExp() #--------------------------------------------------------------------- ##Ôö¼ÓÍæ¼ÒµÄPKÖµ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ôö¼ÓÍæ¼ÒµÄPKÖµ def AddPlayerPKValue(curPlayer, tick): curPlayerPKValue = curPlayer.GetPKValue() maxPKValue = GetMaxPKValue() if curPlayerPKValue >= maxPKValue: #µ±Ç°PKÖµÒѵ½ÉÏÏÞ,²»Ìí¼Ó return #Ìí¼ÓµãÊý addPoint = 1 changePKValue = ChangePKValue(curPlayer, addPoint, tick) if changePKValue >= maxPKValue: #PK_wll_0: ÄúɱÄõ¹ýÖØ£¬ÔÚºìÃû״̬ÏûʧǰÄú½«²»ÄܼÌÐø¶øÒѹ¥»÷ËûÈË NotifyCode(curPlayer, "PK_lhs_202580") return def ChangePKValue(curPlayer, addValue, tick): '''¸ü¸ÄPKÖµ''' curPlayerPKValue = curPlayer.GetPKValue() maxPKValue = GetMaxPKValue() newPKValue = max(0, min(maxPKValue, curPlayerPKValue + addValue)) if newPKValue == curPlayerPKValue: return newPKValue GameWorld.DebugLog("¸üÐÂPKÖµ: curPlayerPKValue=%s,newPKValue=%s,addValue=%s" % (curPlayerPKValue, newPKValue, addValue), curPlayer.GetPlayerID()) if newPKValue == 0: ClearPKValue(curPlayer) else: addBuffID = ChConfig.Def_SkillID_Red curPlayer.SetPKValue(newPKValue) findBuffInfo = SkillCommon.FindBuffByID(curPlayer, addBuffID) redBuff = findBuffInfo[0] addTimeValue = newPKValue - curPlayerPKValue if not redBuff: SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, addBuffID, tick) if newPKValue > 1: findBuffInfo = SkillCommon.FindBuffByID(curPlayer, addBuffID) redBuff = findBuffInfo[0] addTimeValue = newPKValue - 1 if addTimeValue and redBuff: __AddPKValueRedBuffTime(curPlayer, redBuff, addTimeValue) return newPKValue def __AddPKValueRedBuffTime(curPlayer, redBuff, addTimeValue): '''Ôö¼ÓPKÖµ¶ÔÓ¦buffʱ³¤ @param addTimeValue: Ôö¼ÓµÄbuffµ¥Î»Ê±³¤´ÎÊý, Ö§³ÖÕý¸º ''' buffSkill = redBuff.GetSkill() if not buffSkill: return buffType = SkillCommon.GetBuffType(buffSkill) addTime = buffSkill.GetLastTime() * addTimeValue # ÓÐÕý¸º remainTime = redBuff.GetRemainTime() resultTime = min(max(0, remainTime + addTime), ChConfig.Def_Max_Buff_RemainTime) redBuff.SetRemainTime(resultTime) BuffSkill.PYSync_RefreshBuff(curPlayer, redBuff, buffType) GameWorld.DebugLog(" Ôö¼ÓºìÃûbuffʱ³¤: addTimeValue=%s,remainTime=%s,addTime=%s,resultTime=%s" % (addTimeValue, remainTime, addTime, resultTime), curPlayer.GetPlayerID()) return def RefreshPKValueByRedBuff(curPlayer): ## ˢкìÃû¶ÔÓ¦PKValue curPKValue = curPlayer.GetPKValue() if not curPKValue: return redBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_Red)[0] if not redBuff: curPlayer.SetPKValue(0) return buffSkill = redBuff.GetSkill() if not buffSkill: return remainTime = redBuff.GetRemainTime() perPKValueTime = buffSkill.GetLastTime() pkValue = int(math.ceil(remainTime / float(perPKValueTime))) if curPKValue != pkValue: curPlayer.SetPKValue(pkValue) GameWorld.DebugLog("¸üÐÂÍæ¼ÒPKÖµ: remainTime=%s,pkValue=%s" % (remainTime, pkValue), curPlayer.GetPlayerID()) return def ClearPKValue(curPlayer): '''Çå³ýPKÖµ''' curPlayer.SetPKValue(0) tick = GameWorld.GetGameWorld().GetTick() BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_Red, tick) return def GetMaxPKValue(): '''»ñÈ¡×î´óPKÖµ''' return IpyGameDataPY.GetFuncCfg("PKConfig", 2) #--------------------------------------------------------------------- ##»ñµÃÍæ¼ÒÉý¼¶, »ñµÃµÄÊôÐÔµã # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµ, »ñµÃµÄÊôÐÔµã # @remarks »ñµÃÍæ¼ÒÉý¼¶, »ñµÃµÄÊôÐÔµã def GetLvUp_AddPoint(curPlayer): curPlayerID = curPlayer.GetID() curLV = curPlayer.GetLV() # µ±Ç°µÈ¼¶ addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {}) addPoint = GameWorld.GetDictValueByRangeKey(addPointDict, curLV, 0) if addPoint == None: raise Exception('Íæ¼Ò»ñµÃÉý¼¶ÊôÐÔµãÒì³£, curLV = %s PlayerID = %s' % (curLV, curPlayerID)) return return int(addPoint+ GetFabaoAddPoint(curPlayer) + GetTitleAddExtraPoint(curPlayer)) def GetAllPointByLV(curPlayer): ##»ñÈ¡µ±Ç°µÈ¼¶¿ÉµÃµ½ÊôÐÔµãÊý openLV = GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_AddPoint) curLV = curPlayer.GetLV() if curLV < openLV: return 0 # ³õʼµã+(Éý¼¶µã+·¨±¦Ð§¹û)*³ÆºÅЧ¹û±¶Êý+¾³½çµã setFreePoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 2) fabaoAddPoint = GetFabaoAddPoint(curPlayer) titleAddPoint = GetTitleAddExtraPoint(curPlayer) addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {}) for rangLVs, point in addPointDict.items(): if curLV < rangLVs[0]: continue setFreePoint += (point + fabaoAddPoint + titleAddPoint) * (min(curLV, rangLVs[1]) - rangLVs[0] + 1) #¾³½çÌáÉýµãÊý setFreePoint += curPlayer.GetOfficialRank() * IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 3) return setFreePoint def GetTitleAddExtraPoint(curPlayer): # ³ÆºÅ¶îÍâÔö¼ÓÍæ¼Òÿ¼¶»ñµÃµÄÁé¸ùµã titleID = IpyGameDataPY.GetFuncCfg("TitleAddPoint") if titleID and curPlayer.GetDienstgradManager().GetDienstgrad(titleID): return IpyGameDataPY.GetFuncCfg("TitleAddPoint", 2) return 0 def GetFabaoAddPoint(curPlayer): #·¨±¦¶îÍâÔö¼ÓÍæ¼Òÿ¼¶»ñµÃµÄÁé¸ùµã mwID = IpyGameDataPY.GetFuncCfg('FabaoAddPoint', 1) if not PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwID, lv=1): return 0 return IpyGameDataPY.GetFuncCfg('FabaoAddPoint', 2) def DoAddPointOpen(curPlayer): '''¼Óµã¹¦ÄÜ¿ªÆô''' beforeFreePoint = curPlayer.GetFreePoint() setFreePoint = GetAllPointByLV(curPlayer) curLV = curPlayer.GetLV() addDataDict = {'beforeFreePoint':beforeFreePoint} curPlayer.SetFreePoint(setFreePoint) DataRecordPack.DR_Freepoint(curPlayer, "AddPointOpen", setFreePoint, addDataDict) GameWorld.DebugLog(' ¼Óµã¹¦ÄÜ¿ªÆô´¦Àí beforeFreePoint=%s,curLV=%s, setFreePoint=%s'%(beforeFreePoint, curLV, setFreePoint), curPlayer.GetID()) return #--------------------------------------------------------------------- ############################################################### #ÈËÎï¿ØÖÆÀà ## ÈËÎï¿ØÖÆÀà # # ÈËÎïËÀÍöµÈÂß¼­´¦Àí class PlayerControl: __Player = None #--------------------------------------------------------------------- ## ³õʼ»¯ # @param self ÀàʵÀý # @param iPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ³õʼ»¯ def __init__(self, iPlayer): self.__Player = iPlayer ## ¼Ó¾­ÑéÖµ # @param self ÀàʵÀý # @param addExp Ìí¼ÓµÄ¾­Ñé # @param exp_rate ¾­Ñé±¶ÂÊ # @param expViewType ¾­Ñé»ñµÃµÄÇþµÀ # @param isSysHint ÊÇ·ñϵͳÌáʾ£¨Ä¬ÈÏÊÇ£© # @return ²¼¶ûÖµ def AddExp(self, addExp, expViewType=ShareDefine.Def_ViewExpType_Mission, isSysHint=True, addSkillID=0, expRateEx=0): curPlayer = self.__Player finalAddExp, expNotifyType = self.__AddExp(curPlayer, addExp, expViewType, isSysHint, addSkillID, expRateEx) # ֪ͨ¿Í»§¶Ë¾­ÑéÀ´Ô´ if finalAddExp: sendPack = ChPyNetSendPack.tagMCAddExp() sendPack.ExpPoint = finalAddExp / ChConfig.Def_PerPointValue sendPack.Exp = finalAddExp % ChConfig.Def_PerPointValue sendPack.Source = expNotifyType # ¿Í»§¶ËչʾÓà NetPackCommon.SendFakePack(curPlayer, sendPack) #¸±±¾»ñµÃ¾­Ñé, ÎÞÂÛ»ñµÃ¶àÉÙ¾­Ñé¾ùÐè֪ͨ, ÓÐЩ¸±±¾Âß¼­ÐèҪͨ¹ý»ñµÃ¾­Ñéʱ»ú´¦Àí #if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull: # FBLogic.OnGetExp(curPlayer, finalAddExp, expViewType) return finalAddExp # ²ÎÊý addSkillID ±íʾÒòʲô¼¼ÄÜɱËÀNPC»ñµÃ¾­Ñé def __AddExp(self, curPlayer, addExp, expViewType, isSysHint, addSkillID=0, expRateEx=0): if addExp <= 0: # ²»½øÈë¼ÆËã return addExp, expViewType #È¡µÃÈËÎﵱǰ¾­Ñé curTotalExp = GetPlayerTotalExp(curPlayer) maxLV = GetPlayerMaxLV(curPlayer) maxLVExpStore = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 2) curLV = curPlayer.GetLV() # ¼ì²é×î´óµÈ¼¶£¬maxLVExpStore -1ʱ²»ÏÞÀۼƾ­ÑéÉÏÏÞ if curLV >= maxLV and curTotalExp >= maxLVExpStore and maxLVExpStore != -1: self.__NotifyExpFull(curPlayer, "GeRen_admin_825676") GameWorld.DebugLog("¾­ÑéÒÑÂú£¡ÒÑÂú¼¶£¡curLV=%s,maxLV=%s,curTotalExp=%s >= maxLVExpStore=%s" % (curLV, maxLV, curTotalExp, maxLVExpStore), curPlayer.GetPlayerID()) return 0, expViewType # ɱ¹Ö if expViewType == ShareDefine.Def_ViewExpType_KillNPC: #exp_rate = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TotalExpRate) exp_rate = 10000 elif expViewType in [ShareDefine.Def_ViewExpType_GameEvent, ShareDefine.Def_ViewExpType_Sit]: exp_rate = curPlayer.GetGameEventExpRate() #exp_rate += GetFamilySitExpPer(curPlayer) else: exp_rate = max(GameWorld.GetGameWorld().GetExpRate(), ChConfig.Def_MaxRateValue) exp_rate += expRateEx #ÊäÈëµÄ¾­ÑéÓпÉÄÜΪlongÐÍ addExp = int(addExp * exp_rate / float(ChConfig.Def_MaxRateValue)) # ²»¿ÉÔÙÉý¼¶Ê±£¬Ôö¼ÓºóµÄ¾­Ñé²»¿É³¬¹ý×î´ó¿É´æ´¢¾­Ñé if curLV >= maxLV and maxLVExpStore > 0: addExp = min(addExp, max(0, maxLVExpStore - curTotalExp)) if addExp <= 0: #ÎÞ·¨»ñµÃ¾­Ñé GameWorld.DebugLog("ÎÞ·¨»ñµÃ¾­Ñé") return 0, expViewType #¸øÈËÎï¾­Ñé ÏÈÉè¾­ÑéºóÉý¼¶ totalExp = curTotalExp + addExp curExp = totalExp % ChConfig.Def_PerPointValue expPoint = totalExp / ChConfig.Def_PerPointValue if curPlayer.GetExpPoint() != expPoint: curPlayer.SetExpPoint(expPoint) if curPlayer.GetTotalExp() != curExp: curPlayer.SetTotalExp(curExp) if curLV < maxLV: self.PlayerLvUp() #Ìí¼Ó¾­Ñé³É¹¦ return addExp, expViewType ## ¾­ÑéÂúÌáʾ def __NotifyExpFull(self, curPlayer, expFullNotifyMark): expFullNotifyState = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ExpFullNotify) if not expFullNotifyState: NotifyCode(curPlayer, expFullNotifyMark) curPlayer.SetDict(ChConfig.Def_PlayerKey_ExpFullNotify, 1) return ## ÈËÎïÉý¼¶ »ØÂúѪ »ØÂúħ£¬´¥·¢Ìí¼Ó¼¼ÄÜ£¬ÈÎÎñ£¬¼ÓÊôÐԵ㣨ԭÀ´²¿·Öº¯Êý²Ù×÷·ÅÔÚ¼Ó¾­ÑéÖÐ ÏÖÔÚÌá³öÀ´£© # @param handLvUp: ÊÇ·ñÊÇÊÖ¶¯Éý¼¶ # @return: None # @remarks: Èç¹ûÊÇ×Ô¶¯Éý¼¶²»¸ø²ÎÊý ¶øÈç¹ûÊÇÊÖ¶¯Éý¼¶ÐèÒª¸ø²ÎÊý ÊÇÊÖ¶¯Éý¼¶ True # 1-20¼¶×Ô¶¯Éý¼¶Ö±½Ó¼Óµã Ö®ºó±ØÐëÊÖ¶¯Éý¼¶ ¸ø×ÔÓÉÊôÐÔµã def PlayerLvUp(self, handLvUp=False): curPlayer = self.__Player #if GameObj.GetHP(curPlayer) <= 0: # #Íæ¼ÒËÀÍö²»¿ÉÉý¼¶ # return lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV()) if not lvIpyData: return lvUpNeedExp = GetLVUPTotalExpNeed(lvIpyData) if lvUpNeedExp <= 0: return #Ôö¼Ó¾­Ñé curTotalExp = GetPlayerTotalExp(curPlayer) #δ´ïµ½Éý¼¶¾­Ñé if curTotalExp < lvUpNeedExp: return playerNeedDoLVUp = False curLV = curPlayer.GetLV() maxLV = GetPlayerMaxLV(curPlayer) curPlayer.BeginRefreshState() #befXP = curPlayer.GetXP() befLV = curPlayer.GetLV() #befFreePoint = curPlayer.GetFreePoint() while curTotalExp >= lvUpNeedExp and curLV < maxLV: playerNeedDoLVUp = True #---ÈËÎïÉý¼¶³É¹¦--- curLV = curLV + 1 isNotifyServer = True if curLV < 50: # ¼õÉÙǰÆÚµÄ¹ã²¥£¬³ÌÐò¿ØÖÆ isNotifyServer = False curPlayer.SetLV(curLV, isNotifyServer) #EventReport.WriteEvent_level_up(curPlayer) # ¼ÇÂ¼Íæ¼ÒÉý¼¶ DataRecordPack.DR_PlayerUpgrade(curPlayer, curPlayer.GetLV(), GetPlayerTotalExp(curPlayer), lvUpNeedExp) DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_LVUP, {'lv':curLV}) self.__GiveLVMailAward(curLV) #self.__DoLVUPAddPoint() # Éý¼¶¼Óµã #self.__DoLvUpAddSkill() # Éý¼¶¼Ó¼¼ÄÜ lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV()) #---ÊÇ·ñ¼ÌÐøÑ­»·--- curTotalExp = curTotalExp - lvUpNeedExp #»ñµÃÏÂÒ»¼¶µÄ¾­Ñé±í lvUpNeedExp = GetLVUPTotalExpNeed(lvIpyData) if lvUpNeedExp <= 0: break curPlayer.EndRefreshState() # ½áÊøË¢Ðºó£¬Óбä¸üµÄÊôÐÔҪ֪ͨ¿Í»§¶ËµÄÐèÖØÐÂÉèÖÃÒ»´Î #--------------------------------------------------- #ÓÐÉý¼¶, תÉúʱ¸ÕºÃÊÇתÉúµÈ¼¶»áĬÈÏ+1¼¶ if playerNeedDoLVUp: aftLV = curPlayer.GetLV() #aftFreePoint = curPlayer.GetFreePoint() if aftLV > befLV: curPlayer.SetLV(aftLV, False) # ÕâÀï²»ÔÙ֪ͨGameServer PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_LVUp, aftLV - befLV) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV) PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HeroLV, aftLV) PlayerActivity.DoAddActivityByLV(curPlayer, befLV, aftLV) #if aftFreePoint > befFreePoint: # curPlayer.SetFreePoint(aftFreePoint) PlayerGubao.DoGubaoAddFreePoint(curPlayer) # Éý¼¶ÐèÒªÖ´ÐеÄÓÎÏ·¹¦ÄÜ´¦Àí GameFuncComm.DoFuncOpenLogic(curPlayer) PlayerOnline.CalcRoleBase(curPlayer) PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr() #½«ÑªÉèÖÃΪ×î´ó #GameObj.SetHPFull(curPlayer) #if curPlayer.GetMaxMP() > 0: # curPlayer.SetMP(curPlayer.GetMaxMP()) FBLogic.OnPlayerLVUp(curPlayer) # ¼Ç¼¿ª·þ»î¶¯³å¼¶Êý¾Ý #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_LV, curPlayer.GetLV()) #ÉñÃØÏÞ¹º FunctionNPCCommon.MysticalLimitShopOpen(curPlayer, befLV, aftLV) #²»ÐèÒª×öÉý¼¶ÈÎÎñ, ÉèÖÃÍæ¼Ò¾­Ñé SetPlayerTotalExp(curPlayer, curTotalExp) return def __GiveLVMailAward(self, curLV): # ¸øµÈ¼¶Óʼþ½±Àø mailLVAwardDict = IpyGameDataPY.GetFuncEvalCfg("MailLVAward", 1, {}) if curLV not in mailLVAwardDict: return mailTypeKey, mailItemList = mailLVAwardDict[curLV] curPlayer = self.__Player SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], mailItemList, [curLV]) return #--------------------------------------------------------------------- ## Ë¢ÐÂÍæ¼ÒËùÓÐ״̬ # @param self ÀàʵÀý # @param isForce ÊÇ·ñÇ¿ÖÆË¢Ð # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ë¢ÐÂÍæ¼ÒËùÓÐ״̬ def RefreshAllState(self, isSyncBuff=False, billboardFunc=None, isForce=False): return ## ÖØ¼ÆË㲢ˢÐÂÍæ¼ÒËùÓÐ״̬, ĿǰֻÓÃÓëÇл»µØÍ¼ # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ë¢ÐÂÍæ¼ÒËùÓÐ״̬ def ReCalcAllState(self): return # BUFF²ãµ¥¶ÀË¢ÐÂÊôÐÔ£¬¹¦ÄÜÊôÐÔÈ¡»º´æ--------------------------------------------- def RefreshPlayerAttrByBuff(self, isForce=False): curPlayer = self.__Player curPlayer.SetDict(ChConfig.Def_Player_RefreshAttrByBuff, 1) if isForce: self.RefreshPlayerAttrByBuffEx() return True # BUFF²ãµ¥¶ÀË¢ÐÂÊôÐÔ def RefreshPlayerAttrByBuffEx(self): return #=========================================================================== # #×°±¸ºÍBUFF Ч¹ûµÄ¼ÆËãÒÆµ½Íâ²ã # #RefreshPlayerBuffOnAttrAddEffect # #RefreshPlayerEquipAttribute(curPlayer) #=========================================================================== ## Ë¢ÐÂÍæ¼ÒÊôÐÔµ÷Óô˺¯Êý£¬Á¢¼´Ë¢Ð¸ÄΪ֪ͨˢУ¬ÓÉProcessStatueͳһˢÐÂÒ»´Î ## ÅÅÐаñÀàµÄË¢ÐÂisForceÐèҪΪTrue # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå def RefreshPlayerAttrState(self, billboardFunc=None, isForce=False): curPlayer = self.__Player curPlayer.SetDict(ChConfig.Def_Player_RefreshAttr, 1) if billboardFunc and billboardFunc not in PyGameData.g_refreshAttrBillboardFunc: PyGameData.g_refreshAttrBillboardFunc.append(billboardFunc) if isForce: self.RefreshPlayerAttrStateEx() return def RefreshPlayerAttrStateEx(self): ''' ±¾ÏîĿˢÊôÐÔ¹æÔò ÊôÐÔ£º 1.¹Ì¶¨ÊôÐÔ£ºÈç¹¥»÷+100 2.°Ù·Ö±ÈÊôÐÔ£º Èç¹¥»÷+5%£¬°Ù·Ö±È¼Ó³É»ùÖµ½öΪ¹Ì¶¨ÊôÐÔ£¬°Ù·Ö±È¼Ó³ÉÊôÐÔÖµ²»±»³ýbuff°Ù·Ö±ÈÍâµÄÈκΰٷֱÈÊôÐÔ¶þ´Î¼Ó³É ²ã¼¶£º 1.ÊôÐԲ㼶£ºËùÓй¦ÄÜͬһ²ã¼¶ 2.buff²ã¼¶£º°Ù·Ö±È¿É¶Ô¹¦ÄܰٷֱȼӳɵÄÊôÐÔ½øÐжþ´Î¼Ó³É ¹¦ÄÜÄ£¿é£º¶¨ÒåÒ»¸ö¹¦ÄÜ£¬±ÈÈçÁé¸ùÄ£¿é£¬Ò»¸öÄ£¿é¿ÉÄܰüº¬¶à¸ö¹¦Äܵ㠹¦Äܵ㣺ij¸öÄ£¿éϵĸ÷¸öÊôÐÔ¹¦Äܵ㣬ÈçÁé¸ùÄ£¿é¿ÉÄܰüº¬ Áé¸ù»ù´¡¡¢Áé¸ùÆ·ÖÊ Á½¸ö¹¦ÄܵãÊôÐÔ °Ù·Ö±È¼Ó³ÉÖµ£º°Ù·Ö±È¼Ó³ÉÊôÐÔÖµ²»±»³ýbuff°Ù·Ö±ÈÍâµÄÈκΰٷֱÈÊôÐÔ2´Î¼Ó³É 1.¹¦ÄÜÄÚ²¿ÊôÐ԰ٷֱȼӳɣº¹¦ÄܰٷֱÈÊôÐÔ¶Ô×Ô¼º¹¦Ä̶ܹ¨Öµ¼Ó³É 2.¹¦Äܽ»²æÊôÐ԰ٷֱȼӳɣº¹¦ÄܰٷֱÈÊôÐÔ¶ÔÆäËû¹¦Ä̶ܹ¨Öµ¼Ó³É 3.¹¦Ä̶ܹ¨ÊôÐ԰ٷֱȼӳɣº¹¦ÄܰٷֱÈÊôÐÔ¶ÔËùÓй¦Ä̶ܹ¨Öµ¼Ó³É 4.buff²ã¼¶°Ù·Ö±È£º¶ÔËùÓÐÊôÐÔ½øÐжþ´Î¼Ó³É ¼¼ÄÜÊôÐÔ£º¹Ì¶¨Öµ²»ÏíÊ̶ܹ¨°Ù·Ö±È¼Ó³É buff²ã¼¶£º 1.²»ËãÕ½Á¦ 2.ÏÈËã°Ù·Ö±È¼Ó³ÉÔټӹ̶¨Öµ ÊôÐÔËã·¨£º Ä£¿é¹Ì¶¨ÊôÐÔ = ¹¦ÄܵãA¹Ì¶¨Öµ + ¹¦ÄܵãB¹Ì¶¨Öµ + ... ¹Ì¶¨×ÜÊôÐÔ = Ä£¿éA¹Ì¶¨Öµ + Ä£¿éB¹Ì¶¨Öµ + ... ÎÞbuff×ÜÊôÐÔ = ¹Ì¶¨×ÜÊôÐÔ + ÄÚ²¿°Ù·Ö±È¼Ó³ÉÖµ + ½»²æ°Ù·Ö±È¼Ó³É + ¹Ì¶¨×ÜÊôÐÔ°Ù·Ö±È¼Ó³É + ¼¼ÄܰٷֱȶԹ̶¨ÊôÐÔ¼Ó³É + ¼¼Ä̶ܹ¨Öµ º¬buff×ÜÊôÐÔ = ÎÞbuff×ÜÊôÐÔ * buff°Ù·Ö±È¼Ó³É + buff¹Ì¶¨Öµ ''' return ## Ë¢ÐÂÍæ¼Ò¼¼ÄÜÕ½¶·Á¦ # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ë¢ÐÂÍæ¼Ò±»¶¯¼¼ÄÜBuff def RefreshAllSkill(self): return ## ¼¼ÄÜÉý¼¶Ë¢ÊôÐÔÕ½¶·Á¦´¦Àí def RefreshSkillFightPowerEx(self, skillID, beforeFightPower, isRefreshState=True): return def RefreshSkillFightPowerByDel(self, delSkillID, isRefreshState=True): return ## ¼ÆËã±»¶¯buffÊôÐÔ¼Ó³É # @param self ÀàʵÀý # @return def CalcPassiveBuffAttr(self): return ## Ë¢ÐÂÍæ¼ÒËùÓÐÐÐΪBUFF״̬ # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Ë¢ÐÂÍæ¼ÒËùÓÐÐÐΪBUFF״̬ def RefreshPlayerActionState(self): return #--------------------------------------------------------------------- ## ½«Íæ¼ÒÉèÖõ½ÖØÉúµã # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ½«Íæ¼ÒÉèÖõ½ÖØÉúµã def SetToBornPlace(self): curPlayer = self.__Player mapFBType = GameWorld.GetMap().GetMapFBType() #Íæ¼Ò²»ÔÚ¸±±¾ÖÐ if mapFBType == IPY_GameWorld.fbtNull: # gameMap = GameWorld.GetMap() # rebornMapID = gameMap.GetRebornMapID() # rebornPosX = gameMap.GetRebornMapX() # rebornPosY = gameMap.GetRebornMapY() # # #ÑéÖ¤ÊÇ·ñ±¾µØÍ¼¸´»îµã ½øÐÐÂß¼­´¦Àí # if gameMap.GetMapID() == rebornMapID: # posX, posY = GameMap.GetNearbyPosByDis(rebornPosX, rebornPosY, ChConfig.Def_RebornPos_Area_Range) # else: # posX, posY = rebornPosX, rebornPosY # # #ÕÒ²»µ½·ÇÕϰ­µã¸´»î£¬ÔòÉèÎªÍæ¼ÒµÄÖØÉúµã¸´»î # if posX <= 0 or posY <= 0 or rebornMapID <= 0: # rebornMapID = curPlayer.GetRebornMapID() # posX = curPlayer.GetRebornPosX() # posY = curPlayer.GetRebornPosY() rebornMapID = curPlayer.GetRebornMapID() rebornPosX = curPlayer.GetRebornPosX() rebornPosY = curPlayer.GetRebornPosY() #Íæ¼ÒÔÚ¸±±¾ÖÐ else: rebornMapID = curPlayer.GetFBRebornMapID() rebornPosX = curPlayer.GetFBRebornPosX() rebornPosY = curPlayer.GetFBRebornPosY() if rebornMapID == 0: NotifyCode(curPlayer, "ObjectMapNonentity") GameWorld.Log("ÈËÎïÖØÉúµØÍ¼ID = %sÒì³£!" % (rebornMapID) , curPlayer.GetPlayerID()) return if rebornMapID == curPlayer.GetMapID(): GameWorld.ResetPlayerPos(curPlayer, rebornPosX, rebornPosY) return #°ÑÈËÎïÉèÖûØÖØÉúµã PlayerResetWorldPos(curPlayer, rebornMapID, rebornPosX, rebornPosY) return #--------------------------------------------------------------------- ## Íæ¼ÒËÀÍöÂß¼­ # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒËÀÍöÂß¼­ def SetDead(self): #Ö÷½ÇÉèÖÃΪËÀÍö״̬ curPlayer = self.__Player #֪ͨ¸±±¾Íæ¼ÒËÀÍö FBLogic.DoPlayerDead(curPlayer) #Íæ¼Ò״̬´¦Àí ReSetPlayerState(curPlayer) #Çå¿ÕËùÓÐËÀÍö²»±£ÁôµÄbuff self.__PlayerDeadClearBuff() #ɱËÀËùÓÐÕÙ»½µÄÁé KillPlayerSummonNPC(curPlayer) #ÕÙ»½»Ø³öÕ½µÄ³èÎï PetControl.ReCallFightPet(curPlayer) #Çå¿ÕʹÓü¼ÄܼǼ curPlayer.ClearUseSkillRec() #¸ÄΪ¸´»îµÄʱºòË¢ÐÂ״̬ #=============================================================================== # #Ë¢ÐÂ״̬ # self.RefreshAllState() #=============================================================================== if GameObj.GetHP(curPlayer) != 0: GameObj.SetHP(curPlayer, 0) #Çå¿ÕÒÆ¶¯´íÎó¾àÀë GameWorld.ClearPlayerPosCount(curPlayer) #¼Ç¼Ö÷½ÇËÀÍö´ÎÊýºÍËÀÍöʱ¼ä self.SetPlayerDeadCnt(curPlayer) #ËÀÍö´¥·¢¼¼ÄÜ tick = GameWorld.GetGameWorld().GetTick() #֪ͨËÀÍö DoPlayerDead(curPlayer) GameObj.ClearPyPlayerState(curPlayer) MirrorAttack.OnPlayerDead(curPlayer) return ## ¼Ç¼Ö÷½ÇËÀÍö´ÎÊý # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå def SetPlayerDeadCnt(self, curPlayer): #playerLv = curPlayer.GetLV() #¼Ç¼ËÀÍöʱ¼ä NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DeadTime, int(time.time())) #ÉíÉÏÓÐ5²ã¸´»îÆ£ÀÍbuffʱÔټǼ findBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_ReviveTired)[0] if not (findBuff and findBuff.GetSkill().GetSkillLV() == findBuff.GetSkill().GetSkillMaxLV()): return # if playerLv < int(ReadChConfig.GetEvalChConfig('BeginRecordDeadCntLV')): # return #ÉϴμǼµÄÍæ¼ÒËÀÍö´ÎÊý # lastDeadCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerDeadCnt) # #GameWorld.Log("ÉÏ´ÎÍæ¼ÒËÀÍö´ÎÊý=%s"%lastDeadCnt) # # #ËÀÍö´ÎÊý×î´óÀÛ¼ÓÖµ # maxDeadCnt = int(ReadChConfig.GetEvalChConfig('PlayerDeadMaxCnt')) # # #»ñÈ¡ÉÏ´ÎËÀÍöʱ¼ä # lastDeadTimeTick = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime) # #GameWorld.Log("»ñÈ¡ÉÏ´ÎËÀÍöʱ¼ä=%s"%lastDeadTimeTick) # # #ÿ¸ô¼¸ºÁÃë¼õÒ»´ÎËÀÍö´ÎÊý # timeSpace = int(ReadChConfig.GetEvalChConfig('DelDeadCntTime')) # # #µ±Ç°Ê±¼ä # curGameWorldTick = int(time.time()) # delCnt = max(curGameWorldTick - lastDeadTimeTick, 0) / timeSpace # # #GameWorld.Log("###delCnt=%s"%delCnt) # #µ±Ç°ËÀÍö´ÎÊý(°üÀ¨Õâ´ÎËÀµÄ) # curDeadCnt = min(max(lastDeadCnt - delCnt, 0) + 1, maxDeadCnt) # # #GameWorld.Log("###curDeadCnt=%s"%curDeadCnt) # #GameWorld.Log("###curTimeTick=%s"%curGameWorldTick) # #¼Ç¼µ±Ç°ËÀÍö´ÎÊý # NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PlayerDeadCnt, curDeadCnt) #֪ͨËÀÍöʱ¼ä self.NotifyPlayerDeadTime(curPlayer) return ## ֪ͨÉÏ´ÎËÀÍöʱ¼ä # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒËÀÍöÂß¼­, ºìÃûµôÂä def NotifyPlayerDeadTime(self, curPlayer): #Èç¹ûÓÐ5²ã¸´»îÆ£ÀÍbuff ²¢ÇÒÊDZ»Íæ¼ÒɱËÀµÄÔò֪ͨ findBuff = SkillCommon.FindBuffByID(curPlayer, ChConfig.Def_SkillID_ReviveTired)[0] if findBuff and findBuff.GetSkill().GetSkillLV() == findBuff.GetSkill().GetSkillMaxLV(): if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_IsAddReviveTired): lastDeadTimeTick = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime) packData = ChPyNetSendPack.tagMCPlayerDeadTime() packData.DeadTime = lastDeadTimeTick NetPackCommon.SendFakePack(curPlayer, packData) return #--------------------------------------------------------------------- ## Çå¿ÕËùÓеĿÉÒÔɾ³ýµÄbuff # @param self ÀàʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Çå¿ÕËùÓеĿÉÒÔɾ³ýµÄbuff def __PlayerDeadClearBuff(self): curPlayer = self.__Player tick = GameWorld.GetGameWorld().GetTick() #ÐèÒª¿¼ÂÇbuff,deBuff,aura,incBuff,mapBuff,³ýÁËequipBuff²»¿¼ÂÇ PlayerClearBuff_Single(curPlayer, curPlayer.GetBuffState(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetDeBuffState(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetAura(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetIncBuff(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetMapBuff(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetActionBuffManager(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetProcessBuffState(), ClearBuffByDie, tick) PlayerClearBuff_Single(curPlayer, curPlayer.GetProcessDeBuffState(), ClearBuffByDie, tick) return #--------------------------------------------------------------------- ## Çå¿Õbuff(²ÎÊý -> buff¹ÜÀíÆ÷) # @param curPlayer Íæ¼ÒʵÀý # @param buffState buff¹ÜÀíÆ÷ # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Çå¿Õbuff(²ÎÊý -> buff¹ÜÀíÆ÷) def PlayerClearBuff_Single(curPlayer, buffState, funcClearBuff, tick): curPlayerID = curPlayer.GetPlayerID() index = 0 buffSkillIDList = [] passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(curPlayer) while index < buffState.GetBuffCount(): curBuff = buffState.GetBuff(index) #Òì³£ if not curBuff: GameWorld.Log("###Íæ¼ÒÇå¿Õbuffʧ°Ü,Ë÷Òý = %s" % (index), curPlayerID) index += 1 continue #buff²»Ïûʧ if funcClearBuff and funcClearBuff(curBuff): index += 1 continue #BuffSkill.DoBuffDisApper(curPlayer, curBuff, tick) #buffSkillIDList.append([curBuff.GetSkill().GetSkillID(), curBuff.GetOwnerID(), curBuff.GetOwnerType()]) buffSkillIDList.append(curBuff.GetSkill().GetSkillID()) #GameWorld.DebugLog("ËÀÍöÇåÀí-----%s"%curBuff.GetSkill().GetSkillID()) if passiveEff: passiveEff.DelBuffInfo(curBuff.GetSkill()) #ɾ³ýÕâ¸öbuff buffState.DeleteBuffByIndex(index) SkillShell.ClearBuffEffectBySkillIDList(curPlayer, buffState, buffSkillIDList) return ## ËÀÍöbuffÊÇ·ñÏûʧ # @param curBuff: buffʵÀý # @return: ËÀÍöbuffÊÇ·ñÏûʧ def ClearBuffByDie(curBuff): skill = curBuff.GetSkill() return skill.GetDieContinue() & Def_Buff_Clear_Die > 0 ## ÏÂÏßbuffÊÇ·ñÏûʧ # @param curBuff: buffʵÀý # @return: ËÀÍöbuffÊÇ·ñÏûʧ def ClearBuffByDisconnect(curBuff): skill = curBuff.GetSkill() return skill.GetDieContinue() & Def_Buff_Clear_Disconnect > 0 #--------------------------------------------------------------------- ##´«Ëͼì²é(ÊÇ·ñ·Ç·¨µØÍ¼) # @param curPlayer Íæ¼ÒʵÀý # @param destMapID Ä¿±êµØÍ¼ID # @return ·µ»ØÖµÕæ, ͨ¹ý # @remarks ´«Ëͼì²é def CheckTagCountry(curPlayer, destMapID): gameMap = GameWorld.GetMap() if not gameMap.IsMapIDExist(destMapID): GameWorld.ErrLog('###·Ç·¨µØÍ¼Êý¾Ý£¬mapID: %s' % (destMapID), curPlayer.GetPlayerID()) NotifyCode(curPlayer, "ObjectMapNonentity") return False #=============================================================================== # #ÐÂÊִ峡¾°²»ÔÊÐí½øÈëºÍ´«³ö # if GameWorld.GetMap().GetMapID() == 21 or destMapID == 21: # NotifyCode(curPlayer, "CS_VillageHead_Fail") # return #=============================================================================== #¼ì²éÍæ¼ÒÊÇ·ñ´«Ë͵йú×ø±ê mapCountry = gameMap.GetCountryByMapID(destMapID) if not GameWorld.IsSameCountry_Name(mapCountry, curPlayer.GetCountry()): NotifyCode(curPlayer, "Enemy_State_No_Trans") return False #¼ì²é´«ËÍÖÁµÄµØÍ¼ÊÇ·ñÊÇÆÕͨµØÍ¼ if gameMap.GetMapFBTypeByMapID(destMapID) != IPY_GameWorld.fbtNull: #¸±±¾ºÍ»î¶¯³¡¾°ÎÞ·¨´«ËÍ NotifyCode(curPlayer, "Carry_lhs_306641") return False #¼ì²éÍæ¼ÒµÈ¼¶ÊÇ·ñ×ã¹»½øÈë´ËµØÍ¼ if not CanEnterMap(curPlayer, destMapID): return False #¼ì²é´ËµØÍ¼ÊÇ·ñΪָ¶¨·ÖÁ÷ÓµÓÐµÄ mapLineID = GetPlayerLineID(curPlayer) mapLineCheckDict = ReadChConfig.GetEvalChConfig('TransportMapLineCheck') canEnterLineID = 0 for lineID, mapIDList in mapLineCheckDict.items(): if destMapID not in mapIDList: continue if mapLineID == lineID: #´Ë·ÖÁ÷¿ÉÒÔ½øÈë return True #¼Ç¼һÏ¿ÉÒÔ½øÈëµÄÏß· canEnterLineID = lineID if canEnterLineID > 0: #´Ë·ÖÁ÷²»¿É½øÈë NotifyCode(curPlayer, "Carry_yeqian_0", [destMapID, canEnterLineID]) return False #¿ÉÒÔ½øÈë return True #--------------------------------------------------------------------- ##²éÍæ¼ÒµÈ¼¶ÊÇ·ñ×ã¹»½øÈë´ËµØÍ¼ # @param curPlayer Íæ¼ÒʵÀý # @param destMapID Ä¿±êµØÍ¼ID # @return ·µ»ØÖµÕæ, ͨ¹ý # @remarks ²éÍæ¼ÒµÈ¼¶ÊÇ·ñ×ã¹»½øÈë´ËµØÍ¼ def CanEnterMap(curPlayer, destMapID, isShowSys=True): #µØÍ¼ÌØÊâ¼ì²é #if not CheckEquipCanTrans(curPlayer, destMapID): #return False if not CheckLVCanEnterMap(curPlayer, destMapID, isShowSys): return False return True ##²éÍæ¼ÒµÈ¼¶ÊÇ·ñ×ã¹»½øÈë´ËµØÍ¼ # @param curPlayer Íæ¼ÒʵÀý # @param destMapID Ä¿±êµØÍ¼ID # @return ·µ»ØÖµÕæ, ͨ¹ý def CheckLVCanEnterMap(curPlayer, destMapID, isShowSys=True): mapData = GameWorld.GetGameData().GetChinMap().GetMapByID(destMapID) if not mapData: return enterLV = mapData.GetLV() if curPlayer.GetLV() < enterLV: #¶Ô²»Æð£¬¸Ã³¡¾°ÐèÒªXX¼¶²ÅÄܽøÈë! if isShowSys: NotifyCode(curPlayer, "Carry_hwj35_0", [enterLV]) return False openMapStep = mapData.GetTreasureID() #ÐèÒªÍê³ÉµÄÖ÷ÏßÈÎÎñID if openMapStep and not IsMapOpen(curPlayer, openMapStep): #GameWorld.DebugLog('¶Ô²»Æð£¬¸Ã³¡¾°destMapID=%sÐèÒªÍê³ÉÖ÷ÏßÈÎÎñ%s²ÅÄܽøÈë!' % (destMapID, openMapStep)) return False return True def IsMapOpen(curPlayer, openMapStep): # Ö÷ÏßÈÎÎñÍê³Éʱ»áÉèÖñêÖ¾¿É½øµØÍ¼±êÖ¾ return False #--------------------------------------------------------------------- ##¹ØÓÚ´«ËÍ ÑéÖ¤Íæ¼Ò״̬ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÕæ, ͨ¹ý # @remarks ¹ØÓÚ´«ËÍ ÑéÖ¤Íæ¼Ò״̬ def CheckTransState(curPlayer): #¿ÉÒÔ½øÈë´«Ë͵Ä״̬ playerAction = curPlayer.GetPlayerAction() if playerAction in ChConfig.Def_Player_Cannot_TransState: #Carry_lhs_697674£ºÄúµ±Ç°Ëù´¦µÄ״̬²»ÄܽøÐд«ËÍ! NotifyCode(curPlayer, "Carry_lhs_697674") return False #ÒÆ¶¯Öв»Ö´Ðд˲Ù×÷ if curPlayer.IsMoving(): curPlayer.StopMove() if playerAction == IPY_GameWorld.paSit: DoPlayerStand(curPlayer) #ÇëÇó´«ËÍ״̬, ÅжϷþÎñ¶ËÏÞÖÆ if not OperControlManager.IsObjCanDoAction( curPlayer, ChConfig.Def_Obj_ActState_ServerAct, IPY_GameWorld.oalTransmit ): return False return True #--------------------------------------------------------------------- ##Çå³ýÓÐÏÞÎÞµÐBUF # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Çå³ýÓÐÏÞÎÞµÐBUF def DelLimitSuperBuff(curPlayer, tick): if curPlayer.GetCanAttack(): return if not tick: tick = GameWorld.GetGameWorld().GetTick() if BuffSkill.DelBuffBySkillID(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick): PlayerControl(curPlayer).RefreshPlayerAttrByBuff() #--------------------------------------------------------------------- ##ÌØÊâ״̬´¦Àí # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ÌØÊâ״̬´¦Àí def ReSetPlayerState(curPlayer): tick = GameWorld.GetGameWorld().GetTick() #---Íæ¼Ò״̬´¦Àí--- curPlayerAction = curPlayer.GetPlayerAction() #Íæ¼Ò½»Ò×ÖÐ, À뿪½»Ò× if curPlayerAction == IPY_GameWorld.paTrade: pass #Íæ¼Òʼþ״̬ÖÐ, Í˳öʼþ elif curPlayerAction == IPY_GameWorld.paEvent: pass elif curPlayerAction == IPY_GameWorld.paGameEvent: pass if curPlayerAction == IPY_GameWorld.paPreparing: DoExitPreparing(curPlayer) #---Íæ¼Ò½»Í¨¹¤¾ß´¦Àí--- curPlayerVehicle = curPlayer.GetPlayerVehicle() #Íæ¼ÒÆïÂíÖÐ, ÏÂÂí if curPlayerVehicle == IPY_GameWorld.pvHorse: #Ö´ÐÐÏÂÂíÂß¼­ PlayerHorse.PlayerRideHorseDown(curPlayer, False) #---ÆäËûϵͳ´¦Àí--- #ÖжÏÕ½¶·¶ÔÖÅ ExitPlayerConfronting(curPlayer) #Çå¿Õµ±Ç°¹¥»÷¶ÔÏó curPlayer.SetActionObj(None) return #--------------------------------------------------------------------- ##³õʼ»¯Öк͵ØÍ¼¶Áȡʱ²»À­»Ø # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks ³õʼ»¯Öк͵ØÍ¼¶Áȡʱ²»À­»Ø def __CanPullPlayer(curPlayer): if not curPlayer.GetInitOK(): return False if curPlayer.GetIsLoginOff(): return False return True #------------------------------------------------------------------------------------ ##·µ»ØÍæ¼Òµ±Ç°ÊÇ·ñÔÚ¿ÕÏÐ״̬ # @param curPlayer Íæ¼ÒʵÀý # @return ÊÇ·ñÔÚ¿ÕÏÐ״̬ # @remarks ·µ»ØÍæ¼Òµ±Ç°ÊÇ·ñÔÚ¿ÕÏÐ״̬£¨²ß»®²ãÃæÉϵĿÕÏУ© def IsPlanStateNull(curPlayer): #·Ç¿ÕÏÐ״̬ if curPlayer.GetPlayerAction() != IPY_GameWorld.paNull: return False #ÒÆ¶¯ÖÐ if curPlayer.IsMoving(): return False #Õ½¶·ÖÐ if curPlayer.IsBattleState(): return False # #¶ÔÖÅÖÐ # if curPlayer.GetIsConfronting(): # return False # #Ñ£ÔÎÖÐ # if curPlayer.GetAbnormalState() == IPY_GameWorld.sctFaint: # return False return True #------------------------------------------------------------------------------------ def Init_PackCount(curPlayer, packType, defaultMax=False, isSync=True): ## ³õʼ»¯Ë¢ÐÂÍæ¼Òij¸ö±³°ü¸ñ×ÓÊý curPack = curPlayer.GetItemManager().GetPack(packType) maxCount = curPack.GetMaxCount() if defaultMax: curPack.SetCount(maxCount) else: count = ItemCommon.GetPackInitCount(packType) + ItemCommon.GetPackOpenItemCnt(curPlayer, packType) curPack.SetCount(min(count, maxCount)) if isSync: curPack.Sync_PackCanUseCount() return def IsInOperationAction(curPlayer, actName, actIDKey, crossActName="", crossActIDKey=""): ## Íæ¼ÒÊÇ·ñÓÐÕýÔÚ½øÐÐÖÐÔËÓª»î¶¯£¬²»º¬²ÎÓë½áÊø½×¶Î if crossActName and crossActIDKey: playerActID = curPlayer.NomalDictGetProperty(crossActIDKey) actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, crossActName) actID = actInfo.get(ShareDefine.ActKey_ID, 0) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) stateJoin = actInfo.get(ShareDefine.ActKey_StateJoin, 0) if state and stateJoin != ShareDefine.ActStateJoin_End and actID == playerActID: GameWorld.DebugLog("%s»î¶¯Íæ¼ÒÕýÔÚ²ÎÓëÖÐ! cfgID=%s,actID=%s,stateJoin=%s" % (crossActName, cfgID, actID, stateJoin), curPlayer.GetPlayerID()) return True for actInfo in PyGameData.g_operationActionDict.get(actName, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) stateJoin = actInfo.get(ShareDefine.ActKey_StateJoin, 0) playerActID = curPlayer.NomalDictGetProperty(actIDKey % actNum) if state and stateJoin != ShareDefine.ActStateJoin_End and actID == playerActID: GameWorld.DebugLog("%sÍæ¼ÒÕýÔÚ²ÎÓëÖÐ! actNum=%s,actID=%s,stateJoin=%s" % (actName, actNum, actID, stateJoin), curPlayer.GetPlayerID()) return True return False def RefreshOperationAction_ExpRate(): playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue Sync_ExpRateChange(curPlayer) return ##Í¨ÖªÍæ¼Ò¾­Ñé±¶ÂÊ # @param curPlayer Íæ¼ÒʵÀý # @return ·µ»ØÖµÎÞÒâÒå # @remarks Í¨ÖªÍæ¼Ò¾­Ñé±¶ÂÊ def Sync_ExpRateChange(curPlayer): totalExpRate = GetPlayerExpRate(curPlayer) fightExpRate = curPlayer.GetFightExpRate() # ϵͳ¼°¹¦ÄÜÀÛ¼Ó fightExpRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FightExpRate) # VIP¼Ó³É fightExpRate += PlayerGoldInvest.GetAddFightExpRate(curPlayer) actExpRateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_ExpRate, {})# ¶à±¶¾­Ñé»î¶¯¼Ó³É if actExpRateInfo.get(ShareDefine.ActKey_State): actExpIpyData = IpyGameDataPY.GetIpyGameData("ActExpRate", actExpRateInfo.get(ShareDefine.ActKey_CfgID)) if actExpIpyData and curPlayer.GetLV() >= actExpIpyData.GetLVLimit(): fightExpRate += actExpIpyData.GetAddExpRate() if curPlayer.GetMapID() not in [ChConfig.Def_FBMapID_FamilyInvade]: #ÊØÎÀÈ˻ʲ»¼Ó×é¶Ó¼Ó³É fightExpRate += curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TeamExpRate) # ×é¶Ó #µØÍ¼¶à±¶¾­Ñé¼Ó³É£¬Ä¬ÈÏÊÇ1±¶²»¼Ó³É mapExpAddMultiple = max(0, FBCommon.GetAreaRewardMultiple(curPlayer) - 1) fightExpRate += mapExpAddMultiple * ChConfig.Def_MaxRateValue if totalExpRate != fightExpRate: curPlayer.SetDict(ChConfig.Def_PlayerKey_TotalExpRate, fightExpRate) curPlayer.Sync_CurExpRate(fightExpRate) return ##»ñÈ¡Íæ¼ÒµÄ¾­Ñé±¶ÂÊ def GetPlayerExpRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TotalExpRate) def GetLimitExpRate(curPlayer, limitType=None): ''' »ñÈ¡ÊÜÏÞ¹¦ÄÜ×ܾ­Ñé±¶ÂÊ @param limitType: ÊÜÏ޵ŦÄÜÀàÐÍ ''' totalExpRate = GetPlayerExpRate(curPlayer) if limitType == None: return totalExpRate # ¿Û³ýÔöÖµbuffÖжÔÓ¦ÏÞÖÆµÄ¼Ó³É buffState = curPlayer.GetIncBuff() for i in xrange(buffState.GetBuffCount()): curBuff = buffState.GetBuff(i) buffSkill = curBuff.GetSkill() for j in range(buffSkill.GetEffectCount()): curEffect = buffSkill.GetEffect(j) effectID = curEffect.GetEffectID() if effectID == 0: break if effectID != ChConfig.TYPE_Calc_AttrFightExpRate: continue effExpRate = curEffect.GetEffectValue(0) calcType = curEffect.GetEffectValue(1) limitTypeValue = curEffect.GetEffectValue(2) # °´Î»¼ÆËã if calcType != ChConfig.EffCalcType_LinePlus or not limitTypeValue: continue if limitTypeValue & pow(2, limitType): totalExpRate -= effExpRate return totalExpRate #=============================================================================== #---Íæ¼ÒÀ©Õ¹×Ö¶Î--- #---À©Õ¹×Ö¶Î2,3,5,9,12,13,14--- #---À©Õ¹×Ö¶Î1-Ö°Òµ½×¼¶£»4-µ±Ç°·À»¤Öµ£»6-Í­Ç®µã£»7-SPÕæÆøÖµ£»8-SPÕæÆøÖµÀ©Õ¹µã£»10-¿ç·þÔ¤ÈüÅÅλ£»11-¹Ù¾ôÐǼ¶£»--- # SetExAttr1 ~ SetExAttr14(DWORD uiExAttr10, bool bNotifyAll = false, bool bNotifyGameServer = false) # @param bNotifyAll: ÊÇ·ñ¹ã²¥ËùÖÜÎ§Íæ¼Ò£¬Ä¬ÈÏfalse£¬Ö»»á·¢¸ø×Ô¼º # @param bNotifyGameServer: ÊÇ·ñͬ²½GameServer£¬Ä¬ÈÏfalse # SetExAttr15 ~ SetExAttr20(DWORD uiExAttr15) # 15~20À©Õ¹ÊôÐÔͬ²½·â°ü£º0309 Ñ¡½ÇµÇ¼¼ò¶ÌÐÅÏ¢¡¢0434 ÖÜÎ§Íæ¼Ò³öÏÖ¡¢0102 µÇ¼µØÍ¼Íæ¼ÒÐÅÏ¢£» # ͬ²½Ç°¶Ë¼°GameServerÐèÒª×Ô¼ºÐ´Í¨Öª£¬ÉèÖú¯Êý×ÔÉí²»´øÍ¨Öª²ÎÊý # # ·¢ËÍ0418°ü # SendPropertyRefresh(int inputType, int inputValue, int inputValueEx, bool boardCast, bool includeSelf = true) # @param : boardCast-ÊÇ·ñ¹ã²¥ÖÜÎ§Íæ¼Ò£»includeSelf-ÊÇ·ñ°üº¬×Ô¼º # # ֪ͨGsmeServer; # SendGameServerRefreshState(int inputType, int inputValue, int inputValueEx) def SendPropertyRefresh(curPlayer, inputType, value, boardCast=False): ''' ·¢ËÍ0418°ü @param boardCast: ÊÇ·ñ¹ã²¥ÖÜÎ§Íæ¼Ò£¬Ò»¶¨»á·¢¸ø×Ô¼º ''' curPlayer.SendPropertyRefresh(inputType, value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue, boardCast) return def SendGameServerRefreshState(curPlayer, inputType, value): ## ͬ²½ÊôÐÔµ½GameServer IPY_GRefreshPlayerProperty curPlayer.SendGameServerRefreshState(inputType, value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue) return # ½ûÑÔ Í¨ÖªgameServer def SetGMForbidenTalk(curPlayer, value): ''' ÉèÖÃÊÇ·ñ½ûÑÔ @param value: 0-½â½û£»1-½ûÑÔ£»2-½ûÉ豸£»3-½âÉ豸 ½ûÉ豸Á÷³Ì 1.ÏÈÉèÖÃ2֪ͨǰ¶ËдÈë½ûÉ豸¼Ç¼£¨Ç°¶Ë´¦Àíµ±Îª2ʱ±¾µØÉ豸±ê¼ÇΪ½ûÉ豸£© 2.ÔÙÉèÖÃ1£¬´Ëʱǰºó¶Ë״̬¾ùΪ1£¬¼´½ÇÉ«½ûÑÔ ½â½ûÉ豸Á÷³Ì 1.ÏÈÉèÖÃ3֪ͨǰ¶Ëɾ³ý½ûÉ豸¼Ç¼ 2.ÔÙÉèÖÃ0£¬´Ëʱǰºó¶Ë״̬¾ùΪ1£¬¼´½ÇÉ«½â½û ''' __SetGMForbidenTalkValue(curPlayer, value) #ͬ²½ÉèÖÃÀëÏßDBÍæ¼ÒÕ˺Å״ֵ̬ accState = curPlayer.GetAccState() if value == 2: accState = accState | pow(2, ChConfig.Def_PysForbidTalkDevice) accState = accState | pow(2, ChConfig.Def_PysForbidTalk) elif value == 1: accState = accState | pow(2, ChConfig.Def_PysForbidTalk) elif value == 3: if (accState & pow(2, ChConfig.Def_PysForbidTalkDevice)): accState = accState ^ pow(2, ChConfig.Def_PysForbidTalkDevice) if (accState & pow(2, ChConfig.Def_PysForbidTalk)): accState = accState ^ pow(2, ChConfig.Def_PysForbidTalk) elif (accState & pow(2, ChConfig.Def_PysForbidTalk)) > 0: accState = accState ^ pow(2, ChConfig.Def_PysForbidTalk) SetPlayerAccState(curPlayer, accState) return def __SetGMForbidenTalkValue(curPlayer, value): curPlayer.SetGMForbidenTalk(value) SendGameServerRefreshState(curPlayer, ShareDefine.CDBPlayerRefresh_ForbidenTalk, value) SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ForbidenTalk, value) GameWorld.DebugLog("__SetGMForbidenTalkValue %s" % value, curPlayer.GetPlayerID()) return def SetPlayerAccState(curPlayer, accState): curPlayer.SetAccState(accState) curPlayer.SetExAttr17(accState) # ͬ²½ÉèÖøÃÖµ 0309 ·â°üµÇ¼ʱÐèÒªÓõ½ SendGameServerRefreshState(curPlayer, ShareDefine.CDBPlayerRefresh_ExAttr17, accState) SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ExAttr17, accState) GameWorld.DebugLog("SetPlayerAccState %s" % (accState), curPlayer.GetPlayerID()) return def DoGMForbidenTalkOnLogin(curPlayer): ## ÀëÏßʱ±»½ûÑÔ£¬´ËʱDBµÄÕ˺Å״ֵ̬Ϊ½ûÑÔ״̬£¬µ«ÊÇGMOperÔÝʱûÓнûÑÔ²Ù×÷ÃüÁ¹ÊÉÏÏßʱ¼ì²éÉèÖÃÏÂÀëÏß½ûÑÔ״̬ ## ĿǰÀëÏßʱ±»½ûÑԵģ¬ÔÝʱֻ´¦ÀíAccState ExAttr17, GMOperÃüÁîÔݲ»´¦Àí£¬ËùÒÔΪÓÀ¾Ã½ûÑÔ if curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalkDevice): GameWorld.Log("ÉÏÏßʱ½ÇɫΪ±»É豸½ûÑÔ״̬!", curPlayer.GetPlayerID()) __SetGMForbidenTalkValue(curPlayer, 2) __SetGMForbidenTalkValue(curPlayer, 1) elif curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalk): GameWorld.Log("ÉÏÏßʱ½ÇɫΪ±»½ûÑÔ״̬!", curPlayer.GetPlayerID()) __SetGMForbidenTalkValue(curPlayer, 1) else: SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ForbidenTalk, 0) return def IsMainLevelPass(curPlayer, lvID): ## ÅжÏÍæ¼ÒÊÇ·ñ¹ý¹ØÄ³¸öÖ÷Ï߹ؿ¨ID # @param lvID: ¹Ø¿¨Î¨Ò»ID£¬Óë²ß»®Ô¼¶¨ºÃ = Õ½Ú*100+¹Ø¿¨±àºÅ passChapterID, passLevelNum, _ = GetMainLevelPassInfo(curPlayer) passValue = passChapterID * 100 + passLevelNum # ÒòΪpassµÄ¼Ç¼ÊÇ´ø²¨ÊýµÄ£¬¼´µ±Ç°¹Ø¿¨boss»¹Ã»¹ý¹Ø£¬ËùÒÔÖ»ÓдóÓڸüǼֵµÄ²ÅËã¹ý¹Ø return passValue > lvID ## Ö÷Ï߹ؿ¨¹ý¹Ø½ø¶ÈÖµ = Õ½Ú*10000+¹Ø¿¨±àºÅ*100+µÚx²¨ def GetMainLevelPassValue(curPlayer): return curPlayer.GetExAttr1() def SetMainLevelPassValue(curPlayer, value): curPlayer.SetExAttr1(value, False, False) # ²»Í¨ÖªGameServer def SetMainLevelPassInfo(curPlayer, chapterID, levelNum, wave=0): ## ÉèÖÃÖ÷Ï߹ؿ¨¹ý¹Ø½ø¶È # @param chapterID: Õ½ÚID # @param levelNum: ¹Ø¿¨±àºÅ # @param wave: µÚx²¨ value = ComMainLevelValue(chapterID, levelNum, wave) SetMainLevelPassValue(curPlayer, value) return value def GetMainLevelPassInfo(curPlayer): ## »ñÈ¡Ö÷Ï߹ؿ¨¹ý¹Ø½ø¶ÈÐÅÏ¢ # @return: chapterID, levelNum, wave return GetMainLevelValue(GetMainLevelPassValue(curPlayer)) ## Ö÷Ï߹ؿ¨µ±Ç°½ø¶ÈÖµ = Õ½Ú*10000+¹Ø¿¨±àºÅ*100+µÚx²¨ def GetMainLevelNowValue(curPlayer): return curPlayer.GetExAttr2() def SetMainLevelNowValue(curPlayer, value): curPlayer.SetExAttr2(value, False, False) # ²»Í¨ÖªGameServer def SetMainLevelNowInfo(curPlayer, chapterID=1, levelNum=1, wave=1): ## ÉèÖÃÖ÷Ï߹ؿ¨µ±Ç°½ø¶È # @param chapterID: Õ½ÚID # @param levelNum: ¹Ø¿¨±àºÅ # @param wave: µÚx²¨ value = ComMainLevelValue(chapterID, levelNum, wave) SetMainLevelNowValue(curPlayer, value) return value def GetMainLevelNowInfo(curPlayer): ## »ñÈ¡Ö÷Ï߹ؿ¨µ±Ç°½ø¶ÈÐÅÏ¢ # @return: chapterID, levelNum, wave return GetMainLevelValue(GetMainLevelNowValue(curPlayer)) def ComMainLevelValue(chapterID, levelNum, wave=0): return chapterID * 10000 + levelNum * 100 + wave def GetMainLevelValue(value): chapterID = value / 10000 levelNum = value % 10000 / 100 wave = value % 100 return chapterID, levelNum, wave ## ЭÖúÄ¿±êÍæ¼ÒID def GetAssistTagPlayerID(curPlayer): return 0 ## ¶ÓÎéÏà¹ØÉóºË¿ª¹Ø×´Ì¬, joinReqCheck-Èë¶ÓÉêÇëÊÇ·ñÐèÒªÉóºË; inviteCheck-×é¶ÓÑûÇëÊÇ·ñÐèÒªÉóºË; def SetTeamCheckStateEx(curPlayer, joinReqCheck, inviteCheck): return SetTeamCheckState(curPlayer, joinReqCheck * 10 + inviteCheck) def SetTeamCheckState(curPlayer, checkState): return ## ¸±±¾¹¦ÄÜÏß·ID, ÕâÀï×ödb´æ´¢£¬·ÀÖ¹Ôںϲ¢µØÍ¼¸±±¾ÖеôÏßÖØÉÏʱǰ¶ËÎÞ·¨¼ÓÔØÕýÈ·µÄ³¡¾°×ÊÔ´£¬µÇ¼¼ÓÔØ³¡¾°Ê±»úΪ0102°ü def SetFBFuncLineID(curPlayer, mapID, funcLineID): value = mapID * 1000 + funcLineID if value != curPlayer.GetExAttr3(): curPlayer.SetExAttr3(value, False, True) return def GetFBFuncMapID(curPlayer): return curPlayer.GetExAttr3() / 1000 def GetFBFuncLineID(curPlayer): return curPlayer.GetExAttr3() % 1000 ## ¿ç·þ״̬ËùÔÚµØÍ¼ID: 0-·Ç¿ç·þ״̬£¬·Ç0-¿ç·þ״̬¶ÔÓ¦µÄµØÍ¼ID def GetCrossMapID(curPlayer): return curPlayer.GetExAttr5() def SetCrossMapID(curPlayer, value): curPlayer.SetExAttr5(value, False, True) if not value: CrossPlayerData.ClearCrossSyncDataCache(curPlayer) return ## ǰ¶Ë×Ô¶¨Ò峡¾° def GetCustomMapID(curPlayer): return curPlayer.GetExAttr14() / 1000 def GetCustomLineID(curPlayer): return curPlayer.GetExAttr14() % 1000 ## ×Ô¶¨Ò峡¾°ºó¶ËÅжÏÒѽáËãºóÐèÖ±½ÓÖØÖÃΪ0£¬·Àֹǰ¶ËûÓÐÍ˳ö³¡¾°Ö±½ÓÏÂÏßµ¼ÖÂÊý¾ÝûÓÐÖØÖ㬿ÉÄÜÒý·¢¿ÉÒÔÖØ¸´½ø def SetCustomMap(curPlayer, mapID, lineID): value = mapID * 1000 + lineID if value != curPlayer.GetExAttr14(): curPlayer.SetExAttr14(value, False, True) return ## Í­Ç®µã, Ö§³ÖÍ­Ç®³¬20ÒÚ def GetSilver(curPlayer): return curPlayer.GetExAttr6() * ChConfig.Def_PerPointValue + curPlayer.GetSilver() def SetSilver(curPlayer, totalSilver): silver = totalSilver % ChConfig.Def_PerPointValue silverPoint = min(totalSilver / ChConfig.Def_PerPointValue, ChConfig.Def_UpperLimit_DWord) if silver != curPlayer.GetSilver(): curPlayer.SetSilver(silver) if silverPoint != curPlayer.GetExAttr6(): curPlayer.SetExAttr6(silverPoint) return ##VIPµ½ÆÚʱ¼ä, ÐèҪͬ²½GameServer def GetVIPExpireTime(curPlayer): return 0 def SetVIPExpireTime(curPlayer, expireTime): return ##×î½üÒ»´ÎÌáÉýVIPµÈ¼¶Ê±¼ä def GetVIPLVUpTime(curPlayer): return 0 def SetVIPLVUpTime(curPlayer, lvUpTime): return ##ÁÄÌìÆøÅÝ¿ò def GetChatBubbleBox(curPlayer): return curPlayer.GetExAttr10() def SetChatBubbleBox(curPlayer, value): return curPlayer.SetExAttr10(value, False, True) ##ÓÎÏ·³äÖµÖ§¸¶´ú±Ò def GetPayCoinTotal(curPlayer): return GetPayCoin(curPlayer) + GetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_PayCoinDay) def GetPayCoin(curPlayer): return curPlayer.GetExAttr11() def SetPayCoin(curPlayer, value): return curPlayer.SetExAttr11(min(value, ChConfig.Def_UpperLimit_DWord), False, False) def PayCoinOnDay(curPlayer): # ÿÈÕ¹ýÌìÇå³ýʱЧ´ú±Ò payCoinDay = GetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_PayCoinDay) if payCoinDay > 0: PayMoney(curPlayer, ShareDefine.TYPE_Price_PayCoin, payCoinDay, "PayCoinOnDay") return ## »ñÈ¡Åå´÷µÄ³ÆºÅID def GetTitleID(curPlayer): curDienstgradMgr = curPlayer.GetDienstgradManager() return curDienstgradMgr.GetCurGradID() ##°é def GetCoupleID(curPlayer): coupleInfo = GetCoupleInfo(curPlayer.GetPlayerID()) return coupleInfo[0] if coupleInfo else 0 def GetCoupleName(curPlayer): coupleInfo = GetCoupleInfo(curPlayer.GetPlayerID()) return coupleInfo[1] if coupleInfo else "" def GetCoupleJob(curPlayer): coupleInfo = GetCoupleInfo(curPlayer.GetPlayerID()) return coupleInfo[2] if coupleInfo else 1 def GetBridePriceMaxID(curPlayer): coupleInfo = GetCoupleInfo(curPlayer.GetPlayerID()) return coupleInfo[3] if coupleInfo else 0 def GetCoupleInfo(playerID): if playerID not in PyGameData.g_coupleInfo: return return PyGameData.g_coupleInfo[playerID] def SetCoupleInfo(playerID, coupleInfo): if not coupleInfo: PyGameData.g_coupleInfo.pop(playerID, None) else: PyGameData.g_coupleInfo[playerID] = coupleInfo return ## Íæ¼ÒËùÊô·þÎñÆ÷×éID def GetPlayerServerGroupID(curPlayer): return curPlayer.GetExAttr13() def UpdPlayerServerGroupID(curPlayer): # ¸üÐÂ×Ô¼ºµÄ·þÎñÆ÷×éID, ¿ç·þ·þÎñÆ÷²»´¦Àí if GameWorld.IsCrossServer(): return serverGroupID = GameWorld.GetServerGroupID() if not serverGroupID: return playerServerGroupID = curPlayer.GetExAttr13() if playerServerGroupID != serverGroupID: curPlayer.SetExAttr13(serverGroupID, False, True) GameWorld.DebugLog("¸üÐÂÍæ¼ÒËùÊô·þÎñÆ÷×éID: serverGroupID=%s" % serverGroupID) return # ¾³½çÄѶȵȼ¶ def GetRealmDifficulty(curPlayer): return 0 def SetRealmDifficulty(curPlayer, realmDifficulty): ''' ÉèÖþ³½çÄѶȵȼ¶£¬ÈκεØÍ¼¾ù¿ÉÑ¡Ôñ ''' return def GetDifficultyRealmLV(realmDifficulty): return 0 def GetMapRealmDifficulty(curPlayer): ## »ñÈ¡Íæ¼ÒÔÚ±¾µØÍ¼Öеľ³½çÄѶȲ㼶£¬±ØÐëÔÚ¾³½çµØÍ¼ÇÒÓÐÑ¡Ôñ¾³½çÄѶȲÅË㣬·ñÔòΪĬÈÏ0£»¸ÃÄѶÈֵͬʱҲÊÇÊÓÒ°²ã¼¶ return 0 ##Íæ¼ÒÀ뿪ÏÉÃËʱ¼ä£¨Ö÷¶¯»ò±»Ìß¶¼Ë㣩 def GetLeaveFamilyTimeEx(curPlayer):return curPlayer.GetExAttr19() def SetLeaveFamilyTimeEx(curPlayer, value): curPlayer.SetExAttr19(value) #curPlayer.SendGameServerRefreshState(ShareDefine.CDBPlayerRefresh_ExAttr19, value, 0) curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ExAttr19, value, 0, False) return ##×ÜÕ½¶·Á¦£¬Ö§³Ö³¬¹ý20E = ¸÷Ä£¿éÕ½Á¦×ÜºÍ def GetFightPower(curPlayer): return curPlayer.GetFightPowerEx() * ChConfig.Def_PerPointValue + curPlayer.GetFightPower() def SetFightPower(curPlayer, value): beforeFightPower = GetFightPower(curPlayer) curPlayer.SetFightPower(value % ChConfig.Def_PerPointValue, value / ChConfig.Def_PerPointValue, False) # ²»Í¨ÖªGameServer bNotifyGameServer False if value < beforeFightPower: DataRecordPack.DR_FightPowerChangeInfo(curPlayer, beforeFightPower) highestFightPower = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FightPower_Highest) highestFightPower += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FightPower_HighestEx) * ChConfig.Def_PerPointValue if value > highestFightPower: highestFightPower = value NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FightPower_Highest, highestFightPower % ChConfig.Def_PerPointValue) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FightPower_HighestEx, highestFightPower / ChConfig.Def_PerPointValue) GameWorld.DebugLog("×ÜÕ½Á¦: %s, ÀúÊ·×î¸ßÕ½Á¦: %s, beforeFightPower=%s" % (value, highestFightPower, beforeFightPower), curPlayer.GetPlayerID()) PlayerBillboard.UpdatePlayerFPTotalBillboard(curPlayer) # ¼Ç¼¿ª·þ»î¶¯Êý¾Ý #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_FightPower, totalFightPower) #if beforeFightPower != totalFightPower: # CrossPlayerData.OnPlayerFightPowerChange(curPlayer) return ## ÉèÖÃÄ£¿éÕ½¶·Á¦£¬Ö§³Ö³¬¹ý20E = Ä£¿é¹«Ê½Õ½Á¦ + ¼¼Äܸ½¼ÓÕ½Á¦ + ÆäËû¸½¼ÓÕ½Á¦ def SetMFPFightPower(curPlayer, mfpType, fightPower): return ## »ñȡģ¿éÕ½¶·Á¦ def GetMFPFightPower(curPlayer, mfpType): return 0 ## ÉèÖÃÄ£¿é¸½¼ÓÕ½¶·Á¦£¬Ö§³Ö³¬¹ý20E def SetMFPExFightPower(curPlayer, mfpType, fightPower): return ## »ñȡģ¿é¸½¼ÓÕ½¶·Á¦ def GetMFPExFightPower(curPlayer, mfpType): return 0 ## ÉèÖÃÄ£¿é¼¼Äܸ½¼ÓÕ½¶·Á¦£¬Ö§³Ö³¬¹ý20E def SetMFPSkillFightPower(curPlayer, mfpType, fightPower): return ## »ñȡģ¿é¼¼Äܸ½¼ÓÕ½¶·Á¦ def GetMFPSkillFightPower(curPlayer, mfpType): return 0 #=============================================================================== ##»ñÈ¡Íæ¼Ò·ÖÏßÐÅÏ¢ # @param curPlayer Íæ¼ÒʵÀý # @return Íæ¼Òµ±Ç°·ÖÏßID # @remarks def GetPlayerLineID(curPlayer): return curPlayer.GetLineID() + 1 ##ÊÓÒ°ÑéÖ¤, Íâ¹ÒÊÓÒ°±äС²»»Ö¸´ # @param curPlayer Íæ¼ÒʵÀý # @param sight ÊÓÒ°·¶Î§ # @return ÎÞÒâÒå def SetSight(curPlayer, sight): #Íâ¹ÒºÅ ÊÓÒ°ÑéÖ¤ if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_AutoCheckHack_State) \ == ChConfig.Def_AutoCheck_State_Danger: if curPlayer.GetSight() > sight: curPlayer.SetSight(sight) return curPlayer.SetSight(sight) ##»ñÈ¡¹¥»÷¼ä¸ô # @param curPlayer Íæ¼ÒʵÀý # @return ¹¥»÷¼ä¸ô def GetAtkInterval(curPlayer): atkInterval = curPlayer.GetAtkInterval() #Íâ¹ÒºÅ ¹¥»÷¼ä¸ôÑéÖ¤ if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_AutoCheckHack_State) \ == ChConfig.Def_AutoCheck_State_Danger: atkInterval *= 100 return atkInterval ##Íæ¼ÒÔö¼ÓÕæÆø # @param curPlayer Íæ¼Ò # @param value Ôö¼ÓÊýÖµ # @param canOverbrim ¿É·ñÒç³ö(ĬÈϲ»ÐÐ) # @param isSysMsg ÊÇ·ñϵͳÌáʾ(ĬÈÏÐèÒª) # @return None def PlayerAddZhenQi(curPlayer, addValue, canOverbrim=False, isSysMsg=True, eventName="unknown", eventData=""): if addValue <= 0: return True curZhenQi = GetZhenQi(curPlayer) # µ±Ç°ÕæÆø value = curZhenQi + addValue if value == curZhenQi: #ÕæÆøÖµÃ»Óиıä return False #=============================================================================================== # if isSysMsg: # #GeRen_chenxin_254483:»ñµÃÕæÆøÖµXXµã # NotifyCode(curPlayer, "GeRen_chenxin_254483", [addValue]) #=============================================================================================== SetZhenQi(curPlayer, value) #EventReport.WriteEvent_add_zhenqi(curPlayer, eventName, eventData, addValue, value) return True ##Íæ¼Ò¼õÉÙÕæÆø # @param curPlayer Íæ¼Ò # @param lostValue ¼õÉÙÊýÖµ # @return None def PlayerLostZhenQi(curPlayer, lostValue, eventName="unknown", eventData=""): if lostValue <= 0: return True curZhenQi = GetZhenQi(curPlayer) # µ±Ç°ÕæÆø value = max(0, curZhenQi - lostValue) if value < 0: GameWorld.ErrLog("curZhenQi = %s, lostValue = %s" % (curZhenQi, lostValue)) return False #GeRen_chenxin_365899:ÏûºÄÕæÆøÖµXXµã. #NotifyCode(curPlayer, "GeRen_chenxin_365899", [lostValue]) SetZhenQi(curPlayer, value) #EventReport.WriteEvent_lost_zhenqi(curPlayer, eventName, eventData, lostValue, value) return True ## SPÕæÆøÖµ - ÔÝ·ÏÆú ExAttr7¡¢ExAttr8 ¸ÄΪר¾«Ñ¡Ôñ֪ͨ£¬ÓÃÓÚǰ¶Ë±íÏÖÆäËûÍæ¼ÒµÄ²»Í¬×¨¾«ÌØÐ§ def GetZhenQi(curPlayer): return 0 def SetZhenQi(curPlayer, totalZhenQi): return #=============================================================================== # #@warning: ExAttr6~ExAttr10, ÐÂÔö2¸ö²¼¶ûĬÈϲÎÊý, ÊÇ·ñ֪ͨ¿Í»§¶Ë, ÊÇ·ñ֪ͨGameServer, ĬÈÏֵΪFalse #=============================================================================== #--------------------------------------------------------------------------- ## »ñÈ¡Íæ¼Òµ±Ç°µÈ¼¶Éý¼¶ËùÐè×ܾ­Ñé # @param playerLv Íæ¼ÒµÈ¼¶ # @return ·µ»ØÖµ, Éý¼¶ÐèÒªµÄ×ܾ­Ñé def GetLVUPTotalNeedExp(curPlayer): curLV = curPlayer.GetLV() return GetTotalExpByPlayerLv(curLV) ## ¸ù¾ÝµÈ¼¶»ñµÃÉý¼¶ÐèÒªµÄ×ܾ­Ñé # @param playerLv Íæ¼ÒµÈ¼¶ # @return ·µ»ØÖµ, Éý¼¶ÐèÒªµÄ×ܾ­Ñé def GetTotalExpByPlayerLv(playerLV): lvIpyData = GetPlayerLVIpyData(playerLV) if not lvIpyData: return 0 return GetLVUPTotalExpNeed(lvIpyData) def GetPlayerLVIpyData(playerLV): lvIpyData = IpyGameDataPY.GetIpyGameData("PlayerLV", playerLV) if not lvIpyData: GameWorld.ErrLog("¾­Ñé±íÒì³£ lv= %s" % playerLV) return return lvIpyData def GetLVUPTotalExpNeed(lvIpyData): if not lvIpyData: return 0 return lvIpyData.GetExp() def GetPlayerMaxLV(curPlayer): ## »ñÈ¡Íæ¼Òʵ¼Ê¿ÉÉýµÄ×î´óµÈ¼¶ maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1) curRealmLV = curPlayer.GetOfficialRank() realmIpyData = PlayerPrestigeSys.GetRealmIpyData(curRealmLV) if not realmIpyData: return 0 playerMaxLV = min(maxLV, realmIpyData.GetLVMax()) return playerMaxLV ## »ñµÃÍæ¼Òʵ¼ÊµÈ¼¶ # @param curPlayer Íæ¼Ò # @return Íæ¼Òʵ¼ÊµÈ¼¶ def GetRealPlayerLv(curPlayer): #µ±Ç°µÈ¼¶ realPlayerLv = curPlayer.GetLV() #µ±Ç°Íæ¼Ò×ܾ­Ñé curTotalExp = GetPlayerTotalExp(curPlayer) return GetRealPlayerLvEx(realPlayerLv, curTotalExp) ## »ñµÃÍæ¼Òʵ¼ÊµÈ¼¶ # @param realPlayerLv µ±Ç°µÈ¼¶ # @param curTotalExp ×ܾ­Ñé # @return Íæ¼Òʵ¼ÊµÈ¼¶ def GetRealPlayerLvEx(realPlayerLv, curTotalExp): #Éý¼¶ËùÐè×ܾ­Ñé needTotalExp = GetTotalExpByPlayerLv(realPlayerLv) if not needTotalExp: return realPlayerLv #Ä£ÄâÉý¼¶,»ñµÃʵ¼ÊµÈ¼¶ while curTotalExp >= needTotalExp: realPlayerLv += 1 curTotalExp -= needTotalExp needTotalExp = GetTotalExpByPlayerLv(realPlayerLv) if not needTotalExp: break return realPlayerLv ## »ñÈ¡Íæ¼Òµ±Ç°×ܾ­Ñé def GetPlayerTotalExp(curPlayer): totalExp = curPlayer.GetTotalExp() # δÂúÒ»¸ö¾­ÑéµãµÄ¾­Ñ飬·ÇÍæ¼Òʵ¼Ê×ܾ­Ñé expPoint = curPlayer.GetExpPoint() totalMasterExp = expPoint * ChConfig.Def_PerPointValue + totalExp return totalMasterExp ## ÉèÖÃÍæ¼Òµ±Ç°×ܾ­Ñé, ת»¯Îª¾­Ñéµã¼°¾­Ñé def SetPlayerTotalExp(curPlayer, totalExp): curExp = totalExp % ChConfig.Def_PerPointValue expPoint = totalExp / ChConfig.Def_PerPointValue if curPlayer.GetExpPoint() != expPoint: curPlayer.SetExpPoint(expPoint) if curPlayer.GetTotalExp() != curExp: curPlayer.SetTotalExp(curExp) #GameWorld.DebugLog("SetPlayerTotalExp totalExp=%s,expPoint=%s,curExp=%s" # % (totalExp, expPoint, curExp), curPlayer.GetPlayerID()) return #------------------------------------------------------------------------------ ## ֪ͨѡÖÐÄ¿±ê # @param curPlayer: Íæ¼ÒʵÀý # @return None def Sync_SelectObj(curPlayer, objType, objID, isSelect): selectObj = ChPyNetSendPack.tagMCNotifySelectObj() selectObj.Clear() selectObj.Type = objType selectObj.ID = objID selectObj.isSelect = isSelect NetPackCommon.SendFakePack(curPlayer, selectObj) return ## ͳ¼ÆÍæ¼ÒÊôÐÔ£¬ÀÛ¼Ó # @param attrType ÊôÐÔÀàÐÍ£¬Ð§¹ûID»òÕß×Ö·û´® # @param value ÊôÐÔÖµ # @param allAttrList ÊôÐÔÁбí # @return None def CalcAttrDict_Type(attrType, value, allAttrList): return ## ÅàÑø¾³½çµÈ¼¶ def GetTrainRealmLVReal(curPlayer, funcType): trainRealmLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TrainRealmLV % funcType) return max(trainRealmLV, curPlayer.GetOfficialRank()) def SetTrainRealmLV(curPlayer, funcType, trainRealmLV): NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TrainRealmLV % funcType, trainRealmLV) SyncTrainRealmLV(curPlayer, funcType) return def SyncTrainRealmLV(curPlayer, funcType=None): if funcType == None: syncFuncTypeList = range(1, 1 + 10) else: syncFuncTypeList = [funcType] infoList = [] for fType in syncFuncTypeList: trainRealmLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TrainRealmLV % fType) if not trainRealmLV and funcType == None: continue lvInfo = ChPyNetSendPack.tagMCTrainRealmLV() lvInfo.FuncType = fType lvInfo.TrainRealmLV = trainRealmLV infoList.append(lvInfo) if not infoList: return clientPack = ChPyNetSendPack.tagMCTrainRealmLVInfo() clientPack.InfoList = infoList clientPack.Count = len(clientPack.InfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return ## ÷ÈÁ¦µÈ¼¶ def GetCharmLV(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CharmLV) def SetCharmLV(curPlayer, charmLV): NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CharmLV, charmLV) SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_CharmLV, charmLV) return def GetTotalLingGenPoint(curPlayer): # ×ÜÁé¸ùµãÊý(½ðľˮ»ðÍÁ+×ÔÓɵãÊý) return 0 # Áé¸ù - ½ðľˮ»ðÍÁ def GetMetal(curPlayer): return 0 def GetWood(curPlayer): return 0 def GetWater(curPlayer): return 0 def GetFire(curPlayer): return 0 def GetEarth(curPlayer): return 0 #---Íæ¼ÒÀ©Õ¹½Ó¿Ú, Õ½¶·ÊôÐÔ£¬²»´æÊý¾Ý¿â£¬Ö»Í¨Öª±¾ÈË--- ## Íæ¼Ò¼õ¼¼ÄÜCD±ÈÀý def GetReduceSkillCDPer(curPlayer): return 0 def SetReduceSkillCDPer(curPlayer, reducePer): return # Ѫƿ»Ö¸´Ð§¹û def GetHPCureEnhance(curPlayer): return 0 # ÏÉÃË»ÕÕÂID def GetFamilyEmblemID(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyEmblemID) def SetFamilyEmblemID(curPlayer, emblemID): NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyEmblemID, emblemID) # ÏÉÃËְλ£¬Ê¹Óà GetReceivedSalary£¬ÒòΪFamilyMemberLVûÓÐÈë¿â def GetFamilyMemberLV(curPlayer): return curPlayer.GetReceivedSalary() def SetFamilyMemberLV(curPlayer, fmLV): #ÒòΪÏÉÃËְλûÓдæDBPlayer£¬¶ø¿ç·þºóÓÖûÓÐFamilyÐÅÏ¢£¬ËùÒÔÕâÀï×ö¸ö´æ´¢£¬ÓÃÓÚ¿ç·þÓà curPlayer.SetReceivedSalary(fmLV) curPlayer.SetFamilyMemberLV(fmLV) # Ҳͬ²½ÉèÖøÃÖµ£¬·ÀÖ¹ÓÐЩµØ·½Ö±½Óµ÷Óà curPlayer.GetFamilyMemberLV() return #---µ±Ç°·À»¤Öµ£¬Ðè´æDB---- def GetProDef(curPlayer): return 0 def SetProDef(curPlayer, value): return #---×î´ó·À»¤Öµ---- def GetMaxProDef(curPlayer): return 0 def SetMaxProDef(curPlayer, value): return # ÿXÃë×Ô¶¯Ïûʧһ¸öÓ¡¼Ç£¬ ºÁÃë¼Ç¼ def GetLostYinjiTime(curPlayer): return 0 def SetLostYinjiTime(curPlayer, value): return # µ±Ç°Ó¡¼ÇÊý def GetYinjiCnt(curPlayer): return 0 def SetYinjiCnt(curPlayer, value): return # ¼õÉÙÖ¸¶¨¼¼ÄÜ×éCD XX% def GetTheFBSkillsCD(curPlayer): return 0 def SetTheFBSkillsCD(curPlayer, value): return # ׯÉչ̶¨É˺¦ def GetBurnValue(curPlayer): return 0 def SetBurnValue(curPlayer, value): return # ÑÓ³¤×ÆÉÕʱ¼ä°Ù·Ö±È def GetBurnTimePer(curPlayer): return 0 def SetBurnTimePer(curPlayer, value): return # ¼õÒÆ¶¯ËÙ¶È°Ù·Ö±È def GetSubSpeedPer(curPlayer): return 0 def SetSubSpeedPer(curPlayer, value): return #------------------------------------------------------------------------------- ## ÉèÖñ£´æ¹¦ÄÜÊÂÏȼÆËãºÃµÄÊôÐÔÖµ def SetCalcAttrListValue(curPlayer, funcIndex, allAttrList, insidePerAttrDict=None, customAttrDict=None): return def GetCalcAttrListValue(curPlayer, funcIndex): ## »ñÈ¡¹¦ÄܵãÔ¤ÏȼÆËãµÄËù¼ÓÊôÐÔÖµ attrList = [{} for _ in range(4)] insidePerAttrDict = {} customAttrDict = {} return attrList, insidePerAttrDict, customAttrDict #------------------------------------------------------------------------------- ## ÉèÖÃÍæ¼Ò×ÖµäÖµ, ´æ¿â def NomalDictSetProperty(curPlayer, key, value, dType=0): if CrossPlayerData.IsNeedProcessCrossPlayer(curPlayer) and key not in \ [ChConfig.Def_PDict_FightPower_Total, ChConfig.Def_PDict_FightPower_TotalEx, ChConfig.Def_PlayerKey_CrossRegisterMap]: playerID = curPlayer.GetPlayerID() changeDict = PyGameData.g_crossPlayerDictChangeInfo.get(playerID, {}) changeDict[(key, dType)] = value PyGameData.g_crossPlayerDictChangeInfo[playerID] = changeDict if value == 0: curPlayer.NomalDictDelProperty(key, dType) return # 2^31 - 1 curPlayer.NomalDictAddProperty(key, min(value, ChConfig.Def_UpperLimit_DWordEx), dType) return ## ֪ͨף¸£Öµ def Sync_BlessValue(curPlayer, blessType, value, multiple=0): itemList = [] valuePack = ChPyNetSendPack.tagMCSyncSingleBlessValue() valuePack.Clear() valuePack.Type = blessType valuePack.Value = value valuePack.Multiple = multiple itemList.append(valuePack) sendPack = ChPyNetSendPack.tagMCSyncBlessValue() sendPack.Clear() sendPack.TypeCnt = len(itemList) sendPack.BlessInfo = itemList #֪ͨ¿Í»§¶Ë NetPackCommon.SendFakePack(curPlayer, sendPack) return #ͬ²½ÉèÖÃ Íæ¼ÒºÍ³èÎï¼°ÒÑÕÙ»½µÄÕÙ»½ÊÞ ÊÓÒ°²ã def SetPlayerSightLevel(curPlayer, sightLevel): # µ±ÊÓÒ°ÉèÖÃ0ʱ£¬ÔÚ¾³½çµØÍ¼Ôò×Ô¶¯ÉèÖÃÒÑÑ¡ÔñµÄ¾³½çÄѶÈÊÓÒ° if sightLevel == 0: realmDifficulty = GetMapRealmDifficulty(curPlayer) if realmDifficulty: sightLevel = realmDifficulty GameWorld.DebugLog("¾³½çµØÍ¼×Ô¶¯ÉèÖÃÒÑÑ¡ÔñµÄ¾³½çÄѶÈÊÓÒ°: sightLevel=%s" % sightLevel) curPlayer.SetSightLevel(sightLevel) rolePet = curPlayer.GetPetMgr().GetFightPet() #ÎÞ³öÕ½³èÎï if rolePet: rolePet.SetSightLevel(sightLevel) for i in range(curPlayer.GetSummonCount()): curSummon = curPlayer.GetSummonNPCAt(i) if not curSummon: continue curSummon.SetSightLevel(sightLevel) return