From c06d47322d2892a440dc11b94f06950da762e5bd Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 21 六月 2019 19:41:43 +0800
Subject: [PATCH] 7413 宗门试炼评级通知
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 199 ++++++++++++++++++++++---------------------------
1 files changed, 89 insertions(+), 110 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 8d0ac40..6cb5ca9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -118,6 +118,7 @@
import PlayerQuDaoDoubleBill
import PlayerFB
import SkillShell
+import PlayerYinji
import datetime
import time
@@ -228,64 +229,6 @@
return
-#// A2 31 前端开始自定义场景 #tagCMClientStartCustomScene
-#
-#struct tagCMClientStartCustomScene
-#{
-# tagHead Head;
-# DWORD MapID;
-# WORD FuncLineID;
-#};
-def OnClientStartCustomScene(index, clientData, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- DoEnterCustomScene(curPlayer, clientData.MapID, clientData.FuncLineID)
- return
-
-#// A2 33 前端退出自定义场景 #tagCMClientExitCustomScene
-#
-#struct tagCMClientExitCustomScene
-#{
-# tagHead Head;
-#};
-def OnClientExitCustomScene(index, clientData, tick):
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- DoExitCustomScene(curPlayer)
- return
-
-def DoEnterCustomScene(curPlayer, mapID, lineID):
- ## 进入自定义场景状态
- curPlayer.SetCanAttack(False)
- curPlayer.SetVisible(False)
- curPlayer.SetSight(0)
- curPet = curPlayer.GetPetMgr().GetFightPet()
- if curPet:
- curPet.SetVisible(False)
-
- curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 1) # 由于前端不一定有发mapID,所以这里额外记录这个状态,不能直接用mapID判断
- curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneMapID, mapID)
- curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneLineID, lineID)
- GameWorld.Log("玩家开始自定义场景!", curPlayer.GetPlayerID())
- if mapID:
- FBLogic.OnEnterCustomScene(curPlayer, mapID, lineID)
- return
-
-def DoExitCustomScene(curPlayer):
- ## 退出自定义场景状态
- curPlayer.SetCanAttack(True)
- curPlayer.SetVisible(True)
- curPlayer.SetSight(1)
- curPlayer.RefreshView()
- curPlayer.SetSight(ChConfig.Def_PlayerSight_Default)
- curPlayer.RefreshView()
- curPet = curPlayer.GetPetMgr().GetFightPet()
- if curPet:
- curPet.SetVisible(True)
- curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 0)
- curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneMapID, 0)
- curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneLineID, 0)
- GameWorld.Log("玩家退出自定义场景!", curPlayer.GetPlayerID())
- return
-
#// A1 08 刷新主服角色信息 #tagCMRefreshMainServerRole
#
#struct tagCMRefreshMainServerRole
@@ -315,8 +258,10 @@
CrossRealmPlayer.DoExitCrossRealm(curPlayer)
if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
- DoExitCustomScene(curPlayer)
+ PlayerFB.DoExitCustomScene(curPlayer)
+ PetControl.DoLogic_PetLoadMapOK(curPlayer)
+
msgInfo = ""
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetPlayerID(), 0, 0, "RefreshMainServerRole", msgInfo, len(msgInfo))
return
@@ -496,7 +441,6 @@
# 离线过久恢复为非跨服状态
if PlayerControl.GetCrossMapID(curPlayer):
PlayerControl.SetCrossMapID(curPlayer, 0)
- PyGameData.g_customFBPrizeInfo.pop(curPlayer.GetPlayerID(), None)
SyncGuideState(curPlayer)
@@ -550,14 +494,8 @@
#PK模式
SyncPKModel(curPlayer)
- #通用强化星级信息
- ChEquip.NotifyEquipPartPlusLV(curPlayer)
- ChEquip.NotifyEquipPartStar(curPlayer)
- Operate_EquipWash.OnEquipWashLogin(curPlayer)
- #通知套装信息
- #ChEquip.SyncAllEquipAttrActiveInfo(curPlayer)
- #装备位宝石镶嵌通知
- Operate_EquipStone.OnLogin(curPlayer)
+ #装备相关信息
+ ChEquip.OnPlayerEquipLoginLogic(curPlayer)
#大师
PlayerGreatMaster.MasterOnLogin(curPlayer)
@@ -1096,12 +1034,15 @@
#切地图要清除的buff
__CheckClearBuffOnMapChange(curPlayer, tick)
+ if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
+ #副本地图上线切换才加无敌buff
+ SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
+
#刷新玩家的视野
- if not GameWorld.IsCrossServer() and PlayerControl.GetCrossMapID(curPlayer):
- GameWorld.DebugLog("===登录本服地图时,处于跨服状态,不刷新视野!", curPlayer.GetPlayerID())
- curPlayer.SetSight(0)
- else:
- PlayerState.ChangePlayerSigh(curPlayer, tick)
+ if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or PlayerControl.GetCustomMapID(curPlayer)):
+ GameWorld.DebugLog("===登录本服地图时,处于跨服或自定义场景状态,不刷新视野!", curPlayer.GetPlayerID())
+ PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
+ PlayerState.ChangePlayerSigh(curPlayer, tick)
if GameWorld.IsCrossServer():
curPlayer.SetForbiddenSyncClientState(False)
@@ -1328,15 +1269,6 @@
curPack.SetCount(ChConfig.Def_PackCnt_DogzEquip)
curPack.Sync_PackCanUseCount()
- #初始化诛仙物品背包
- curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianItem)
- curPack.SetCount(ChConfig.Def_PackCnt_ZhuXianItem)
- curPack.Sync_PackCanUseCount()
- #初始化诛仙装备背包
- curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip)
- curPack.SetCount(ChConfig.Def_PackCnt_ZhuXianEquip)
- curPack.Sync_PackCanUseCount()
-
#初始化临时交换背包
curPack = itemManager.GetPack(ShareDefine.rptTempSwap)
curPack.SetCount(ChConfig.Def_PackCnt_TempSwap)
@@ -1445,10 +1377,6 @@
#if not __CheckGMCanLoadMapOK(curPlayer):
# return
- #上线和切地图加有限无敌Buff, 移到切换地图成功,太早发包客户端不显示
- if curPlayer.GetLV() > 50:
- SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
-
#检测账号是否锁定
if not __CheckForbidLogin(curPlayer):
@@ -1466,12 +1394,12 @@
firstMission = QuestCommon.GetCommonMission(curPlayer)
if not (firstMission and firstMission.GetProperty(QuestCommon.Def_NewGuyNoSight) == 1):
#刷新自己的视野
- if not GameWorld.IsCrossServer() and PlayerControl.GetCrossMapID(curPlayer):
- GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服状态,不设置可见!", curPlayer.GetPlayerID())
- else:
- curPlayer.RefreshView()
- curPlayer.SetVisible(True)
-
+ if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene)):
+ GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服或自定义场景状态,不设置可见!", curPlayer.GetPlayerID())
+ PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
+ curPlayer.RefreshView()
+ curPlayer.SetVisible(True)
+
#如果玩家hp为0,设置玩家为死亡状态
if curPlayer.GetHP() <= 0:
curPlayer.SetPlayerAction(IPY_GameWorld.paDie)
@@ -1480,10 +1408,12 @@
#把玩家设置为初始化成功状态
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):
@@ -1614,6 +1544,7 @@
GameWorld.DebugLog("进入地图强制切换PK模式: %s" % initAttackModel)
PassiveBuffEffMng.OnLoadMapGFPassive(curPlayer)
+ PlayerYinji.OnLoadMap(curPlayer)
ItemControler.PlayerItemControler(curPlayer).RefreshStartEquipCount() # 刷新装备珍品星级
#EndLoadMap需放在最后
@@ -1776,6 +1707,7 @@
NotifyPlayerBasePoint(curPlayer, pointAttrIDList)
playerControl = PlayerControl.PlayerControl(curPlayer)
playerControl.RefreshPlayerAttrState()
+ EventShell.EventRespons_AddPoint(curPlayer)
return
#// B2 07 重置加点 #tagCMResetAttrPoint
@@ -1798,15 +1730,41 @@
return
isFree = curPlayer.GetLV() < IpyGameDataPY.GetFuncCfg('LVUPAddPoint', 4)
if not isFree:
- needItemID = IpyGameDataPY.GetFuncCfg('LVUPAddPoint', 5)
+ #优先使用剩余时间最短的时效物品
+ needItemIDList = IpyGameDataPY.GetFuncEvalCfg('LVUPAddPoint', 5)
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
- hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, 1)
- if not hasEnough:
- GameWorld.DebugLog("重置加点 item(%s) isn't enough" % (needItemID))
+ delIndex = -1
+ expireTime = 0
+ for itemID in needItemIDList:
+ hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(itemID, itemPack, 10)
+ if not itemIndexList:
+ #GameWorld.DebugLog("重置加点 item(%s) isn't enough" % (needItemID))
+ continue
+
+ for itemIndex in itemIndexList:
+ curItem = itemPack.GetAt(itemIndex)
+ if not ItemCommon.CheckItemCanUse(curItem):
+ continue
+ isExpireItem, remainingTime = ItemCommon.GetItemRemainingTime(curItem)
+ if isExpireItem:
+ if remainingTime <= 0:
+ #过期
+ continue
+ if not expireTime or remainingTime < expireTime:
+ expireTime = remainingTime
+ delIndex = itemIndex
+ else:
+ delIndex = itemIndex
+ break
+ if delIndex != -1:
+ break
+ if delIndex is -1:
return
- ItemCommon.ReduceItem(curPlayer, itemPack, itemList, 1, False, ChConfig.ItemDel_ResetAttrPoint)
+ ItemCommon.ReduceItem(curPlayer, itemPack, [delIndex], 1, False, ChConfig.ItemDel_ResetAttrPoint)
Item_ResetAttrPoint.DoResetAttrPoint(curPlayer, 0, 0, 0)
+
+ EventShell.EventRespons_LingGenReset(curPlayer)
return
def NotifyPlayerBasePoint(curPlayer, syncAttrIDList=[]):
@@ -2512,7 +2470,7 @@
GameWorld.DebugLog("当前无跨服地图!")
return
- if not __CheckCanReborn(curPlayer, rebornType):
+ if not __CheckCanReborn(curPlayer, rebornType, checkHPState=False):
return
msgDict = {"PlayerID":curPlayer.GetPlayerID(), "RebornType":rebornType}
@@ -4147,10 +4105,17 @@
#---------------------------------------------------------------------
-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
@@ -4209,13 +4174,6 @@
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
@@ -5877,3 +5835,24 @@
sendPack.NPCID = npcID
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
+
+#// B4 0E 玩家掉血 #tagCMRoleLostHP
+#
+#struct tagCMRoleLostHP
+#{
+# tagHead Head;
+# DWORD LostHP;
+#};
+def OnRoleLostHP(index, clientData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ lostHP = clientData.LostHP
+ curHP = curPlayer.GetHP()
+ updHP = curHP - lostHP
+ if updHP <= 0:
+ #玩家已经死亡
+ playerControl = PlayerControl.PlayerControl(curPlayer)
+ playerControl.SetDead()
+ else:
+ curPlayer.SetHP(updHP)
+
+ return
--
Gitblit v1.8.0