| | |
| | | import PlayerRefineStove
|
| | | import PlayerFamilyTech
|
| | | import PlayerCostRebate
|
| | | import GY_Query_CrossRealmReg
|
| | | import PlayerFairyCeremony
|
| | | import PlayerCrossRealmPK
|
| | | import FunctionNPCCommon
|
| | | import CrossRealmPlayer
|
| | | import ChNetSendPack
|
| | | import PlayerCoat
|
| | | import PlayerState
|
| | | import QuestCommon
|
| | | import PlayerDogz
|
| | |
| | | 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())
|
| | |
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | def PlayerEnterCrossServer(curPlayer, mapID):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | GameWorld.Log("玩家请求进入跨服地图: mapID=%s" % (mapID), playerID)
|
| | | if GameWorld.IsCrossServer():
|
| | | GameWorld.DebugLog("跨服服务器不允许该操作!")
|
| | | return
|
| | | |
| | | if GetCrossMapID(curPlayer):
|
| | | GameWorld.ErrLog("玩家当前为跨服状态,不允许再次请求进入跨服!", curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | if not CrossRealmPlayer.IsCrossServerOpen():
|
| | | NotifyCode(curPlayer, "CrossMatching18")
|
| | | return
|
| | | |
| | | if curPlayer.GetHP() <= 0:
|
| | | return
|
| | | |
| | | if PlayerCrossRealmPK.GetIsCrossPKMatching(curPlayer):
|
| | | return
|
| | | |
| | | GY_Query_CrossRealmReg.RegisterEnterCrossServer(curPlayer, mapID)
|
| | | return
|
| | |
|
| | | ##玩家进入副本
|
| | | # @param curPlayer 玩家实例
|
| | | # @param mapID 地图ID
|
| | |
| | | if isNotify:
|
| | | NotifyCode(curPlayer, "SingleEnterPK", [mapID])
|
| | | return ShareDefine.EntFBAskRet_PKState
|
| | | |
| | | ## 跨服PK匹配中
|
| | | if PlayerCrossRealmPK.GetIsCrossPKMatching(curPlayer):
|
| | | if isNotify:
|
| | | NotifyCode(curPlayer, "CrossMatching8", [mapID]) |
| | | return ShareDefine.EntFBAskRet_CrossPKMatching
|
| | |
|
| | | #===============================================================================================
|
| | | # # 这里不做状态限制,由前端处理,因为策划要根据界面来处理,同一传送功能有可能在不同界面
|
| | |
| | | sendPack.FuncLineID = funcLineID
|
| | |
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | GameWorld.Log("准备切换地图", curPlayer.GetID())
|
| | | return
|
| | |
|
| | | # 通知开始切换地图
|
| | | def NotifyStartChangeMap(curPlayer):
|
| | | GameWorld.DebugLog("通知开始切换地图, NotifyStartChangeMap")
|
| | | sendPack = ChPyNetSendPack.tagMCStartChangeMap()
|
| | | sendPack.Clear()
|
| | | sendPack.MapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)
|
| | | sendPack.FuncLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine)
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | |
| | | GameWorld.Log("通知开始切换地图", curPlayer.GetID())
|
| | | return
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | if PlayerTJG.GetIsTJG(curPlayer):
|
| | | GameWorld.DebugLog("脱机的玩家不处理分流!", curPlayer.GetPlayerID())
|
| | | return tagLineID
|
| | | |
| | | if GameWorld.IsCrossServer():
|
| | | return tagLineID
|
| | | # 非常规地图之间的切换不处理
|
| | | if curMapID not in PyGameData.g_commMapLinePlayerCountDict or tagMapID not in PyGameData.g_commMapLinePlayerCountDict:
|
| | | return tagLineID
|
| | |
| | | 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
|
| | | |
| | | if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
|
| | | if curPlayer.GetGold() + value > ChConfig.Def_PlayerTotalMoney_Gold:
|
| | | #超过金钱上限
|
| | |
| | |
|
| | | return int(addPoint)
|
| | |
|
| | | def GetAllPointByLV(curPlayer):
|
| | | ##获取当前等级可得到属性点数
|
| | | openLV = GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_AddPoint)
|
| | | curLV = curPlayer.GetLV()
|
| | | if curLV < openLV:
|
| | | return 0
|
| | | addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {})
|
| | | initFreePoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 2)
|
| | | setFreePoint = initFreePoint
|
| | | for lv in xrange(openLV, curLV+1):
|
| | | setFreePoint += GameWorld.GetDictValueByRangeKey(addPointDict, lv, 0)
|
| | | return setFreePoint
|
| | |
|
| | | def DoAddPointOpen(curPlayer):
|
| | | '''加点功能开启 处理给自由属性点及老号处理
|
| | | 清除老服玩家未加点的点数(清零),以前加的加点属性不清除,属性不变,战力不减, 根据最新的加点开启等级和老服玩家的当前等级,相差的差值给予玩家对应的加点点数'''
|
| | | beforeFreePoint = curPlayer.GetFreePoint()
|
| | | addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {})
|
| | | initFreePoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 2)
|
| | | openLV = GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_AddPoint)
|
| | | setFreePoint = initFreePoint
|
| | |
|
| | | setFreePoint = GetAllPointByLV(curPlayer)
|
| | | curLV = curPlayer.GetLV()
|
| | | for lv in xrange(openLV, curLV+1):
|
| | | setFreePoint += GameWorld.GetDictValueByRangeKey(addPointDict, lv, 0)
|
| | | addDataDict = {'beforeFreePoint':beforeFreePoint}
|
| | | DataRecordPack.DR_Freepoint(curPlayer, "AddPointOpen", setFreePoint, addDataDict)
|
| | | curPlayer.SetFreePoint(setFreePoint)
|
| | | DataRecordPack.DR_Freepoint(curPlayer, "AddPointOpen", setFreePoint, addDataDict)
|
| | | GameWorld.DebugLog(' 加点功能开启处理 beforeFreePoint=%s,curLV=%s, setFreePoint=%s'%(beforeFreePoint, curLV, setFreePoint), curPlayer.GetID())
|
| | | return
|
| | |
|
| | | def FixOldAddPoint(curPlayer):
|
| | | ##老号加点处理 重置已加点数,
|
| | | if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_AddPoint):
|
| | | return
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_AddPoint, 1)
|
| | | baseSTR, basePNE, basePHY, baseCON = GetPlayerBasePoint(curPlayer.GetJob())
|
| | | addPoint = curPlayer.GetFreePoint()
|
| | | attrInfoDict = {'BaseSTR':baseSTR,'BasePNE':basePNE,'BasePHY':basePHY,'BaseCON':baseCON}
|
| | | for attrKey, basePoint in attrInfoDict.items():
|
| | | addPoint += (getattr(curPlayer, 'Get%s'%attrKey)() - basePoint)
|
| | | fixFreePoint = GetAllPointByLV(curPlayer)
|
| | | if addPoint != fixFreePoint:
|
| | | for attrKey, basePoint in attrInfoDict.items():
|
| | | getattr(curPlayer, 'Set%s'%attrKey)(basePoint)
|
| | | curPlayer.SetFreePoint(fixFreePoint)
|
| | | #重置天赋
|
| | | PlayerGreatMaster.DoResetMasterSkillPoint(curPlayer)
|
| | | #邮件补偿
|
| | | SendMailByKey('PointCompensation', [curPlayer.GetID()], [], goldPaper=200)
|
| | | |
| | | addDataDict = {'beforeTotalPoint':addPoint}
|
| | | DataRecordPack.DR_Freepoint(curPlayer, "FixOldAddPoint", fixFreePoint, addDataDict)
|
| | | GameWorld.Log('老号加点处理 重置已加点数 addPoint=%s, fixFreePoint=%s' % (addPoint, fixFreePoint))
|
| | | return
|
| | | |
| | | #---------------------------------------------------------------------
|
| | |
|
| | | ## 功能模块战斗力类
|
| | |
| | | PlayerEquipDecompose.RefreshEDAttr(curPlayer)
|
| | | PlayerDogz.RefreshDogzAttr(curPlayer)
|
| | | PlayerGatherSoul.RefreshGatherSoulAttr(curPlayer)
|
| | | PlayerCoat.CalcClothesCoatSkinAttr(curPlayer)
|
| | | self.RefreshAllState(isForce=True)
|
| | | GameWorld.DebugLog("End ReCalcAllState!!!")
|
| | | return
|
| | |
| | | def SetFBFuncLineID(curPlayer, funcLineID): return curPlayer.SetExAttr3(funcLineID, False, False)
|
| | | def GetFBFuncLineID(curPlayer): return curPlayer.GetExAttr3()
|
| | |
|
| | | ## 跨服状态: 0-非跨服状态,1-跨服状态
|
| | | def GetCrossRealmState(curPlayer): return curPlayer.GetExAttr5()
|
| | | def SetCrossRealmState(curPlayer, value): curPlayer.SetExAttr5(value, False, True)
|
| | | ## 跨服状态所在地图ID: 0-非跨服状态,非0-跨服状态对应的地图ID
|
| | | def GetCrossMapID(curPlayer): return curPlayer.GetExAttr5()
|
| | | def SetCrossMapID(curPlayer, value):
|
| | | curPlayer.SetExAttr5(value, False, True)
|
| | | return
|
| | |
|
| | | ## 铜钱点, 支持铜钱超20亿
|
| | | def GetSilver(curPlayer): return curPlayer.GetExAttr6() * ChConfig.Def_PerPointValue + curPlayer.GetSilver()
|
| | |
| | | ##聊天气泡框
|
| | | def GetChatBubbleBox(curPlayer): return curPlayer.GetExAttr10()
|
| | | def SetChatBubbleBox(curPlayer, value): return curPlayer.SetExAttr10(value, False, True)
|
| | |
|
| | | ## 玩家所属服务器组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 GetPrestige(curPlayer): return 0
|
| | |
| | |
|
| | | #---当前防护值,需存DB----
|
| | | def GetProDef(curPlayer): return curPlayer.GetExAttr4()
|
| | | def SetProDef(curPlayer, value): curPlayer.SetExAttr4(value)
|
| | | def SetProDef(curPlayer, value):
|
| | | if GameWorld.IsCrossServer():
|
| | | curPlayer.SetExAttr4(value, True) # 跨服服务器需要广播周围玩家
|
| | | else:
|
| | | curPlayer.SetExAttr4(value)
|
| | | |
| | | #---最大防护值----
|
| | | def GetMaxProDef(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrMaxProDef)
|
| | | def SetMaxProDef(curPlayer, value):
|