| | |
| | | import ItemCommon
|
| | | import ReadChConfig
|
| | | import BuffSkill
|
| | | import PetControl
|
| | | import OperControlManager
|
| | | import PlayerFamily
|
| | | import ShareDefine
|
| | |
| | | import GameFuncComm
|
| | | import IpyGameDataPY
|
| | | import PyGameData
|
| | | import PlayerActTurntable
|
| | | import PlayerCostRebate
|
| | | import PlayerActLunhuidian
|
| | | import GY_Query_CrossRealmReg
|
| | | import OpenServerActivity
|
| | | import CrossRealmPlayer
|
| | | import CrossPlayerData
|
| | | import PlayerActLunhuidian
|
| | | import PlayerActivity
|
| | | import ChNetSendPack
|
| | | import PlayerState
|
| | |
| | | # curPlayer.SetIsConfronting(False)
|
| | | # #通知客户端 //0进入;其他退出
|
| | | # curPlayer.View_PlayerBattle(0, 0, 1)
|
| | | # |
| | | # #清除战宠仇恨
|
| | | # PetControl.ClearFightPetAngry(curPlayer)
|
| | | # |
| | | # #添加测试信息
|
| | | # GameWorld.GodLog(curPlayer, '退出战斗对峙成功')
|
| | | return
|
| | |
| | | PassiveBuffEffMng.OnPlayerLeaveMap(curPlayer)
|
| | | #杀死所有召唤的灵
|
| | | KillPlayerSummonNPC(curPlayer)
|
| | | #召唤回出战的宠物
|
| | | PetControl.ReCallFightPet(curPlayer)
|
| | | curPlayer.DeleteMirror()
|
| | | return
|
| | |
|
| | |
| | |
|
| | | PlayerSuccess.FinishDelayAddSuccessProgress(curPlayer, tick)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if not isDisconnect:
|
| | | CrossPlayerData.ClearCrossSyncDataCache(curPlayer)
|
| | | #清除地图玩家缓存
|
| | | PyGameData.g_playerReqEnterFBEx.pop(playerID, None)
|
| | | #移除地图缓存的境界难度玩家ID信息
|
| | |
| | |
|
| | |
|
| | | def OnPlayerLogin(curPlayer):
|
| | | DoGMForbidenTalkOnLogin(curPlayer)
|
| | | #DoGMForbidenTalkOnLogin(curPlayer)
|
| | | curPlayer.SetDict(ChConfig.Def_PDict_DayOnlineCalcTime, int(time.time()))
|
| | | return
|
| | |
|
| | |
| | | # @return 返回值无意义
|
| | | # @remarks 玩家离开服务器
|
| | | def PlayerLeaveServer(curPlayer, tick):
|
| | | #宠物下线逻辑, 这里要进行排行榜, 优先做, 避免玩家光环等属性影响宠物属性失效
|
| | | PetControl.DoLogic_PetInfo_OnLeaveServer(curPlayer, tick)
|
| | | |
| | | RecordTodayOnlineTime(curPlayer)
|
| | | #清除下线消失的buff, 在更新排行榜之前
|
| | | __DisconnectClearBuff(curPlayer, tick)
|
| | |
| | | playerControl.RefreshAllState()
|
| | |
|
| | | #玩家下线更新排行榜
|
| | | PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer) #排行榜已实时更新,故下线不再同步
|
| | | #PlayerBillboard.UpdatePlayerBillboardOnLeaveServer(curPlayer) #排行榜已实时更新,故下线不再同步
|
| | |
|
| | | #玩家下线通知gameserver记录缓存(放在下线更新排行榜之后,方便Gameserver判断是否需要存入数据库中)
|
| | | PlayerViewCache.OnPlayerLogout(curPlayer)
|
| | |
| | |
|
| | | FBLogic.DoPlayerChangeMapLogic(curPlayer, tick)
|
| | | #summonList = list()
|
| | | #召回宠物
|
| | | PetControl.ReCallFightPet(curPlayer)
|
| | | #1. 删除自己不需要的召唤兽(火焰之灵等)
|
| | | #必须用while, 因为在循环中要删除
|
| | | # 召唤兽切地图不带过去
|
| | |
| | |
|
| | | GameWorld.Log("PlayerLeaveFB...", curPlayer.GetPlayerID())
|
| | | if GameWorld.IsCrossServer():
|
| | | CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
|
| | | return
|
| | |
|
| | | funcLineID = 0
|
| | |
| | | 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())
|
| | | NotifyCode(curPlayer, "SingleEnterDefaul")
|
| | | return
|
| | | |
| | | # 需要动态分布线路的地图,发送到跨服服务器进行分配
|
| | | if mapID in ChConfig.Def_CrossDynamicLineMap:
|
| | | extendInfo = {}
|
| | | 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
|
| | |
| | | elif type_Price == IPY_GameWorld.TYPE_Price_Silver_Paper:
|
| | | __PayMoneyAfterBySilverPaper(curPlayer, price)
|
| | |
|
| | | #转盘活动
|
| | | #PlayerActTurntable.OnPlayerUseGold(curPlayer, type_Price, price)
|
| | | #轮回殿
|
| | | #PlayerActLunhuidian.AddLunhuidianValue(curPlayer, PlayerActLunhuidian.AwardType_PayMoney, type_Price, price)
|
| | | if type_Price == ShareDefine.TYPE_Price_Xiantao:
|
| | | # 仅算使用技能的
|
| | | if type_Price == ShareDefine.TYPE_Price_Xiantao and costType == "UseSkill":
|
| | | # 累加未结算战锤 - 经验
|
| | | unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp)
|
| | | NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp + price)
|
| | |
| | |
|
| | | TurnAttack.GetMainFightMgr(curPlayer).useZhanchui += price
|
| | |
|
| | | # 除GM扣除的以外
|
| | | if costType != ChConfig.Def_Cost_GM:
|
| | | #轮回殿
|
| | | PlayerActLunhuidian.AddLunhuidianValue(curPlayer, PlayerActLunhuidian.AwardType_PayMoney, type_Price, 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
|
| | |
| | | # @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)
|
| | | else:
|
| | | GameWorld.DebugLog("不计入消费活动的消费类型!costType=%s" % costType, curPlayer.GetPlayerID())
|
| | | |
| | | return
|
| | |
|
| | | ## 付款以后后续操作(金票)
|
| | |
| | | #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)
|
| | | ChPlayer.OnPlayerBaseInfoChange(curPlayer, IPY_PlayerDefine.CDBPlayerRefresh_LV) # 等级
|
| | |
|
| | |
| | |
|
| | | #杀死所有召唤的灵
|
| | | KillPlayerSummonNPC(curPlayer)
|
| | | |
| | | #召唤回出战的宠物
|
| | | PetControl.ReCallFightPet(curPlayer)
|
| | |
|
| | | #清空使用技能记录
|
| | | curPlayer.ClearUseSkillRec()
|
| | |
| | |
|
| | | if crossActName and crossActIDKey:
|
| | | playerActID = curPlayer.NomalDictGetProperty(crossActIDKey)
|
| | | actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, crossActName)
|
| | | actInfo = {}#GetPlayerCrossActInfo(curPlayer, crossActName)
|
| | | actID = actInfo.get(ShareDefine.ActKey_ID, 0)
|
| | | cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
| | | state = actInfo.get(ShareDefine.ActKey_State, 0)
|
| | |
| | | totalExpRate = GetPlayerExpRate(curPlayer)
|
| | | fightExpRate = curPlayer.GetFightExpRate() # 系统及功能累加
|
| | |
|
| | | 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) # 组队
|
| | |
|
| | |
| | | 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
|
| | | #GM命令支持离线玩家上线后处理,且 PlayerGMOper 也有上线触发逻辑处理,故暂屏蔽
|
| | | #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
|
| | |
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MainLevel)
|
| | | PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_MainLevel, lvID)
|
| | | PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAMainLevel, lvID)
|
| | | if OpenServerActivity.GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_MainLevel) == 1:
|
| | | PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_MainLevel, lvID)
|
| | | OpenServerActivity.UpdOSA_MainLevelBillboard(curPlayer, lvID)
|
| | | DataRecordPack.DR_MainLevelPass(curPlayer, lvID)
|
| | | return value
|
| | | def GetMainLevelPassInfo(curPlayer):
|
| | |
| | | def GetFBFuncLineID(curPlayer): return 0
|
| | |
|
| | | ## 跨服状态所在地图ID: 0-非跨服状态,非0-跨服状态对应的地图ID
|
| | | def GetCrossMapID(curPlayer): return curPlayer.GetExAttr5()
|
| | | def GetCrossMapID(curPlayer): return 0
|
| | | def SetCrossMapID(curPlayer, value):
|
| | | curPlayer.SetExAttr5(value, False, True)
|
| | | if not value:
|
| | | CrossPlayerData.ClearCrossSyncDataCache(curPlayer)
|
| | | return
|
| | |
|
| | | ## 铜钱点, 支持铜钱超20亿
|
| | |
| | | #if value < beforeFightPower:
|
| | | # DataRecordPack.DR_FightPowerChangeInfo(curPlayer, beforeFightPower)
|
| | | GameWorld.DebugLog("总战力: %s, beforeFightPower=%s" % (value, beforeFightPower), curPlayer.GetPlayerID())
|
| | | #PlayerBillboard.UpdatePlayerFPTotalBillboard(curPlayer)
|
| | | #if beforeFightPower != totalFightPower:
|
| | | # CrossPlayerData.OnPlayerFightPowerChange(curPlayer)
|
| | | ChPlayer.OnPlayerBaseInfoChange(curPlayer, IPY_PlayerDefine.CDBPlayerRefresh_FightPower) # 战力
|
| | | if beforeFightPower != value:
|
| | | ChPlayer.OnPlayerBaseInfoChange(curPlayer, IPY_PlayerDefine.CDBPlayerRefresh_FightPower) # 战力
|
| | | return
|
| | |
|
| | | ## 设置模块战斗力,支持超过20E = 模块公式战力 + 技能附加战力 + 其他附加战力
|
| | |
| | | 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 GetReduceSkillCDPer(curPlayer): return 0
|
| | | def SetReduceSkillCDPer(curPlayer, reducePer): return
|
| | |
|
| | | # 血瓶恢复效果
|
| | | def GetHPCureEnhance(curPlayer): return 0
|
| | |
|
| | | # 仙盟职位,使用 GetReceivedSalary,因为FamilyMemberLV没有入库
|
| | | def GetFamilyMemberLV(curPlayer): return curPlayer.GetReceivedSalary()
|
| | | def SetFamilyMemberLV(curPlayer, fmLV):
|
| | |
| | | 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 NomalDictSetProperty(curPlayer, key, value, dType=0):
|
| | | if CrossPlayerData.IsNeedProcessCrossPlayer(curPlayer) and key not in \
|
| | | [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 0
|