| | |
| | | if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
|
| | | PlayerFB.DoExitCustomScene(curPlayer)
|
| | |
|
| | | PetControl.DoLogic_PetLoadMapOK(curPlayer)
|
| | | |
| | | msgInfo = ""
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetPlayerID(), 0, 0, "RefreshMainServerRole", msgInfo, len(msgInfo))
|
| | | return
|
| | |
| | | # 离线过久恢复为非跨服状态
|
| | | if PlayerControl.GetCrossMapID(curPlayer):
|
| | | PlayerControl.SetCrossMapID(curPlayer, 0)
|
| | | PyGameData.g_customFBPrizeInfo.pop(curPlayer.GetPlayerID(), None)
|
| | |
|
| | | SyncGuideState(curPlayer)
|
| | |
|
| | |
| | | __CheckClearBuffOnMapChange(curPlayer, tick)
|
| | |
|
| | | #刷新玩家的视野
|
| | | if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene)):
|
| | | if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or PlayerControl.GetCustomMapID(curPlayer)):
|
| | | GameWorld.DebugLog("===登录本服地图时,处于跨服或自定义场景状态,不刷新视野!", curPlayer.GetPlayerID())
|
| | | curPlayer.SetSight(0)
|
| | | elif curPlayer.GetLV() > 1:
|
| | | PlayerState.ChangePlayerSigh(curPlayer, tick)
|
| | | PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
|
| | | PlayerState.ChangePlayerSigh(curPlayer, tick)
|
| | |
|
| | | if GameWorld.IsCrossServer():
|
| | | curPlayer.SetForbiddenSyncClientState(False)
|
| | |
| | | #刷新自己的视野
|
| | | if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene)):
|
| | | GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服或自定义场景状态,不设置可见!", curPlayer.GetPlayerID())
|
| | | else:
|
| | | curPlayer.RefreshView()
|
| | | curPlayer.SetVisible(True)
|
| | | |
| | | PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
|
| | | curPlayer.RefreshView()
|
| | | curPlayer.SetVisible(True)
|
| | | |
| | | #如果玩家hp为0,设置玩家为死亡状态
|
| | | if curPlayer.GetHP() <= 0:
|
| | | curPlayer.SetPlayerAction(IPY_GameWorld.paDie)
|
| | |
| | | #把玩家设置为初始化成功状态
|
| | | curPlayer.SetInitOK(True)
|
| | |
|
| | | #bug:GM号反隐形在玩家切换地图之后,脚本未设置玩家属性之前,C++通知合并封包导致客户端死B
|
| | | #将反隐形开启转移到脚本
|
| | | if curPlayer.GetGMLevel():
|
| | | curPlayer.SetIsDefVisible(True)
|
| | | #===========================================================================
|
| | | # #bug:GM号反隐形在玩家切换地图之后,脚本未设置玩家属性之前,C++通知合并封包导致客户端死B
|
| | | # #将反隐形开启转移到脚本
|
| | | # if curPlayer.GetGMLevel():
|
| | | # curPlayer.SetIsDefVisible(True)
|
| | | #===========================================================================
|
| | |
|
| | | #有限无敌Buff
|
| | | if not __CheckLimitSuperBuff(curPlayer):
|
| | |
| | | NotifyPlayerBasePoint(curPlayer, pointAttrIDList)
|
| | | playerControl = PlayerControl.PlayerControl(curPlayer)
|
| | | playerControl.RefreshPlayerAttrState()
|
| | | EventShell.EventRespons_AddPoint(curPlayer)
|
| | | return
|
| | |
|
| | | #// B2 07 重置加点 #tagCMResetAttrPoint
|
| | |
| | | ItemCommon.ReduceItem(curPlayer, itemPack, itemList, 1, False, ChConfig.ItemDel_ResetAttrPoint)
|
| | |
|
| | | Item_ResetAttrPoint.DoResetAttrPoint(curPlayer, 0, 0, 0)
|
| | | |
| | | EventShell.EventRespons_LingGenReset(curPlayer)
|
| | | return
|
| | |
|
| | | def NotifyPlayerBasePoint(curPlayer, syncAttrIDList=[]):
|
| | |
| | | GameWorld.DebugLog("当前无跨服地图!")
|
| | | return
|
| | |
|
| | | if not __CheckCanReborn(curPlayer, rebornType):
|
| | | if not __CheckCanReborn(curPlayer, rebornType, checkHPState=False):
|
| | | return
|
| | |
|
| | | msgDict = {"PlayerID":curPlayer.GetPlayerID(), "RebornType":rebornType}
|
| | |
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | def __CheckCanReborn(curPlayer, rebornType, gameMap=None):
|
| | | def __CheckCanReborn(curPlayer, rebornType, gameMap=None, checkHPState=True):
|
| | | ''' 检查可否复活,为了逻辑统一,这里不适用玩家所在的地图,支持跨服状态下判断跨服地图
|
| | | 本函数不验证玩家死亡状态等,因为有可能前后端复活状态不一致,如果这里拦住可能导致前端躺尸复活不了
|
| | | '''
|
| | | |
| | | if checkHPState and curPlayer.GetHP() > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:
|
| | | # 当血量大于0收到复活请求时,一般是前后端复活状态不一致的情况下导致的
|
| | | # 由于前端需要根据复活状态判断复活界面相关逻辑,所以这里需要做一些特殊处理,防止某些情况下前后端复活状态不一致导致的一些异常问题
|
| | | # 后端非死亡状态的情况,补同步一次复活包给前端
|
| | | SyncPlayerReborn(curPlayer, rebornType)
|
| | | return
|
| | |
|
| | | if rebornType not in ChConfig.Def_RebornTypeList:
|
| | | return
|
| | |
| | |
|
| | | def __DoPlayerReborn(curPlayer, rebornType, tick, mapBornPlace=0, isAddSuperBuff=True):
|
| | | ## 执行玩家复活逻辑,该函数没有执行验证是否可复活等,不可直接调用
|
| | | |
| | | if curPlayer.GetHP() > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie:
|
| | | # 当血量大于0收到复活请求时,一般是前后端复活状态不一致的情况下导致的
|
| | | # 由于前端需要根据复活状态判断复活界面相关逻辑,所以这里需要做一些特殊处理,防止某些情况下前后端复活状态不一致导致的一些异常问题
|
| | | # 后端非死亡状态的情况,补同步一次复活包给前端
|
| | | SyncPlayerReborn(curPlayer, rebornType)
|
| | | return
|
| | |
|
| | | resetHpPercent = ChConfig.Def_MaxRateValue
|
| | | isFBReborn = False
|
| | |
| | | sendPack.NPCID = npcID
|
| | | NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | return
|
| | |
|
| | | #// B4 0E 设置玩家自身血量 #tagCMSetRoleHP
|
| | | #
|
| | | #struct tagCMSetRoleHP
|
| | | #{
|
| | | # tagHead Head;
|
| | | # DWORD HP;
|
| | | #};
|
| | | def OnSetRoleHP(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | if not curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
|
| | | GameWorld.DebugLog("玩家当前不是在自定义场景中,不允许设置自身血量!")
|
| | | return
|
| | | setHP = max(1, min(clientData.HP, curPlayer.GetMaxHP()))
|
| | | curPlayer.SetHP(setHP)
|
| | | return
|