hxp
2 天以前 7bf88131759c20d54e175010d5b80da5d8148713
16 卡牌服务端(删除资源找回;前端自定义副本,公共扫荡;)
20个文件已修改
4个文件已删除
3451 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 676 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 534 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFBCD.py 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ExitFB.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 576 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_GeneralTrain.py 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/自定义场景说明.txt 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRecover.py 523 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/MapBuff_3017.py 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -459,33 +459,33 @@
PacketSubCMD_1=0x08
PacketCallFunc_1=OnDoFBAction
PacketCMD_2=0xA2
PacketSubCMD_2=0x10
PacketCallFunc_2=OnClearFBCD
PacketCMD_2=
PacketSubCMD_2=
PacketCallFunc_2=
PacketCMD_3=0xA5
PacketSubCMD_3=0x05
PacketCallFunc_3=OnPlayerFBWipeOut
PacketCMD_4=0xA5
PacketSubCMD_4=0x1B
PacketCallFunc_4=OnPlayerBuyFBEnergy
PacketCMD_4=
PacketSubCMD_4=
PacketCallFunc_4=
PacketCMD_5=0xB1
PacketSubCMD_5=0x02
PacketCallFunc_5=OnPlayerGetMultiFBPrize
PacketCMD_5=
PacketSubCMD_5=
PacketCallFunc_5=
PacketCMD_6=0xA5
PacketSubCMD_6=0x60
PacketCallFunc_6=OnPlayerResetFBJoinCnt
PacketCMD_6=
PacketSubCMD_6=
PacketCallFunc_6=
PacketCMD_7=0xB1
PacketSubCMD_7=0x01
PacketCallFunc_7=OnClientEndFB
PacketCMD_7=
PacketSubCMD_7=
PacketCallFunc_7=
PacketCMD_8=0xB1
PacketSubCMD_8=0x04
PacketCallFunc_8=OnClientStartFB
PacketCMD_8=
PacketSubCMD_8=
PacketCallFunc_8=
PacketCMD_9=0xB1
PacketSubCMD_9=0x08
@@ -499,13 +499,13 @@
PacketSubCMD_11=
PacketCallFunc_11=
PacketCMD_12=0xA2
PacketSubCMD_12=0x31
PacketCallFunc_12=OnClientStartCustomScene
PacketCMD_12=
PacketSubCMD_12=
PacketCallFunc_12=
PacketCMD_13=0xA2
PacketSubCMD_13=0x33
PacketCallFunc_13=OnClientExitCustomScene
PacketCMD_13=
PacketSubCMD_13=
PacketCallFunc_13=
;玩家相关
[ChPlayer]
@@ -873,9 +873,9 @@
PacketSubCMD_1=0x52
PacketCallFunc_1=OnBuyCollectionCnt
PacketCMD_2=A2
PacketSubCMD_2=34
PacketCallFunc_2=OnGetCustomSceneCollectAward
PacketCMD_2=
PacketSubCMD_2=
PacketCallFunc_2=
PacketCMD_3=0xA5
PacketSubCMD_3=0x0A
@@ -885,25 +885,13 @@
PacketSubCMD_4=0x23
PacketCallFunc_4=OnNPCShowEnd
PacketCMD_5=0xB4
PacketSubCMD_5=0x0C
PacketCallFunc_5=OnSummonPriWoodPile
PacketCMD_5=
PacketSubCMD_5=
PacketCallFunc_5=
PacketCMD_6=0xB4
PacketSubCMD_6=0x0F
PacketCallFunc_6=OnRecyclePriWoodPile
;资源找回
[PlayerRecover]
ScriptName = Player\PlayerRecover.py
Writer = ljd
Releaser = ljd
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xA5
PacketSubCMD_1=0x53
PacketCallFunc_1=OnRecoverGain
PacketCMD_6=
PacketSubCMD_6=
PacketCallFunc_6=
;神器
[PlayerGodWeapon]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -984,22 +984,20 @@
        if not curTag:
            continue
        
        #非自定义场景才需要判断
        if not attacker.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
            if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackNPC:
                if NPCCommon.GetNpcObjOwnerIsPlayer(curTag):
                    #npc主人是玩家不能攻击
                    continue
            if GameWorld.GetDist(curTag.GetPosX(), curTag.GetPosY(), attacker.GetPosX(), attacker.GetPosY()) > attacker.GetSight():
                # æœ€è¿œè·ç¦»é˜²èŒƒ
                GameWorld.DebugLog("#--- æœ€è¿œè·ç¦»é˜²èŒƒ[%s-%s]"%(attacker.GetID(), curTag.GetID()))
        if curSkillUseTag == ChConfig.Def_UseSkillTag_CanAttackNPC:
            if NPCCommon.GetNpcObjOwnerIsPlayer(curTag):
                #npc主人是玩家不能攻击
                continue
            if CheckFunc != None:
                #检查是否受影响
                if not CheckFunc(attacker, curTag, curSkill, tick):
                    continue
        if GameWorld.GetDist(curTag.GetPosX(), curTag.GetPosY(), attacker.GetPosX(), attacker.GetPosY()) > attacker.GetSight():
            # æœ€è¿œè·ç¦»é˜²èŒƒ
            GameWorld.DebugLog("#--- æœ€è¿œè·ç¦»é˜²èŒƒ[%s-%s]"%(attacker.GetID(), curTag.GetID()))
            continue
        if CheckFunc != None:
            #检查是否受影响
            if not CheckFunc(attacker, curTag, curSkill, tick):
                continue
        
        resultList.append(curTag)
            
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -2023,9 +2023,6 @@
#镜像切磋
Def_FBMapID_MirrorBattle = 100
#前端自定义场景地图
ClientCustomSceneList = []
#镜像PK的地图ID列表
MirrorBattleMapIDList = []
@@ -2094,12 +2091,6 @@
# ä»Žå‰¯æœ¬é€€å‡ºæ—¶ï¼Œå¯ä»¥è¿”回进入前的副本ID
Def_CanBackFBMap = []
#答题触发地图
Def_Subject_Map = [
                   ]
#没通关过不可资源找回的地图
Def_UnRecoverNoPassMap = [Def_FBMapID_KirinHome, Def_FBMapID_MunekadoTrial, Def_FBMapID_QueenRelics]
#副本延时踢出玩家的时间
Def_FBKickPlayerTime = 5000 #5秒
@@ -3220,9 +3211,6 @@
Def_PlayerKey_SomersaultTime = "Somersault"     # ç¿»æ»šä¸€å®šæ—¶é—´å†…无敌,表现为MISS
Def_Player_RefreshAttrByBuff = "PlayerAttrByBuff"   # çŽ©å®¶å±žæ€§åˆ·æ–°åŠŸèƒ½å±žæ€§ç¼“å­˜ï¼Œä¾¿äºŽbuff刷新计算, é—´éš”刷新
Def_Player_HadRefreshAttr = "HadRefreshAttr"   # çŽ©å®¶åœ¨æœ¬åœ°å›¾æ˜¯å¦åˆ·æ–°è¿‡å±žæ€§
Def_PlayerKey_ClientCustomScene = "ClientCustomScene"     # å®¢æˆ·ç«¯è‡ªå®šä¹‰åœºæ™¯çŠ¶æ€
Def_PlayerKey_ClientCustomSceneStepTick = "ClientCustomSceneStepTick"     # å®¢æˆ·ç«¯è‡ªå®šä¹‰åœºæ™¯tick
Def_PlayerKey_ClientCustomSceneGrade = "ClientCustomSceneGrade"     # å®¢æˆ·ç«¯è‡ªå®šä¹‰åœºæ™¯è¯„级
Def_PlayerKey_ChangeMapID = "ChangeMapID"     # è¯·æ±‚切换的地图ID
Def_PlayerKey_ChangeLineID = "ChangeLineID"     # è¯·æ±‚切换的线路ID
Def_PlayerKey_ResetFBLinePosX = "ResetFBLinePosX"     # è¯·æ±‚切换副本多合一地图功能线路ID
@@ -3415,17 +3403,12 @@
Def_Player_Dict_ReqFBMissionID = "ReqFBMissionID" # è¯·æ±‚进入副本的任务ID
Def_Player_Dict_ReqFBMissionType = "ReqFBMissionType" # è¯·æ±‚进入副本的任务类型
Def_Player_Dict_PlayerFBStar_MapId = "FBStar_%s_%s"  # å‰¯æœ¬æ˜Ÿçº§æ˜Ÿçº§ä¿¡æ¯, å‚数为[mapID, key编号], æŒ‰ä½å­˜å‚¨æ¯ä¸ªlineID对应的星级
Def_Player_Dict_CustomMapStep = "CustomMapStep_%s_%s"  # å‰ç«¯è‡ªå®šä¹‰åœºæ™¯é˜¶æ®µ, å‚æ•°(mapID, lineID),对应 CustomMapStep_Fight ...
Def_Player_Dict_FBPassLineID = "FBPassLineID_%s"  # å‰¯æœ¬å·²è¿‡å…³åˆ°çš„lineID, å‚数为副本ID
Def_Player_Dict_EnterFbCntTotal = "EnterFbCntTotal_%s"  # è¿›å…¥å‰¯æœ¬æ€»ç´¯è®¡æ¬¡æ•°, å‚数为副本ID
Def_Player_Dict_EnterFbCntDay = "EnterFbCntDay_%s"  # ä»Šæ—¥è¿›å…¥å‰¯æœ¬æ¬¡æ•°, å‚数为副本ID
Def_Player_Dict_BuyFbCntDay = "BuyFbCntDay_%s" # ä»Šæ—¥è´­ä¹°å‰¯æœ¬è¿›å…¥æ¬¡æ•°, å‚数为副本ID
Def_Player_Dict_RecoverFbCnt = "RecoverFbCnt_%s"  # ä»Šæ—¥æ‰¾å›žçš„副本次数, å‚数为副本ID
Def_Player_Dict_ItemAddFbCnt = "ItemAddFbCnt_%s"  # ä½¿ç”¨ç‰©å“å¢žåŠ çš„å‰¯æœ¬æ¬¡æ•°, å‚数为副本ID
Def_Player_Dict_RegainFbCnt = "RegainFbCnt_%s"  # æ—¶é—´æ¢å¤å¢žåŠ çš„å‰¯æœ¬æ¬¡æ•°, å‚数为副本ID
Def_Player_Dict_EnterFbCntWeek = "EnterFbCntWeek_%s"  # æœ¬å‘¨è¿›å…¥å‰¯æœ¬æ¬¡æ•°, å‚数为副本ID
Def_Player_Dict_FbCntRegainStartTime = "FbCntRegainStartTime_%s" # å‰¯æœ¬æ¬¡æ•°æ¢å¤å¼€å§‹æ—¶é—´, å‚数为副本ID
Def_Player_Dict_FbCntRegainTotalTime = "FbCntRegainTotalTime_%s" # å‰¯æœ¬æ¬¡æ•°æ¢å¤è¿˜éœ€æ—¶é—´, å‚数为副本ID
Def_Player_Dict_FBHistoryMaxLine = "FBHistoryMaxLine_%s"  # å‰¯æœ¬åŽ†å²æœ€é«˜é€šå…³, å‚数为副本ID
Def_Player_Dict_IceLoadLineID = "IceLoadLineID_%s"  # å‰¯æœ¬æ˜Ÿçº§æ˜Ÿçº§ä¿¡æ¯, å‚数为[key编号], æŒ‰ä½å­˜å‚¨æ¯ä¸ªlineID是否选中
Def_Player_Dict_RefurbishGoodBookPlayerLv = "RefurbishGoodBookPlayerLv_97"  # åˆ·æ–°å¤©ä¹¦ä»»åŠ¡æ—¶çš„çŽ©å®¶ç­‰çº§
@@ -3555,17 +3538,6 @@
Def_PDict_NobleEndTime = "NobleEndTime_%s" # è´µæ—åˆ°æœŸç»“束时间<单位s>, å‚数为贵族等级, ä»Ž1开始
Def_PDict_NobleExperState = "NobleExperState" # ä½“验贵族状态; 0-无效;1-有效; 2-可体验
Def_PDict_RecoverFBCommonCnt = "RecoverFBCommonCnt_%s" # èµ„源找回副本普通次数  <%s-找回项索引>
Def_PDict_RecoverFBRegainCnt = "RecoverFBRegainCnt_%s" # èµ„源找回副本时间恢复次数  <%s-找回项索引>
Def_PDict_RecoverFBExtraCnt = "RecoverFBExtraCnt_%s" # èµ„源找回副本VIP额外次数  <%s-找回项索引>
Def_PDict_RecoverFBBuyCnt = "RecoverFBBuyCnt_%s" # èµ„源找回副本购买次数  <%s-找回项索引>
Def_PDict_RecoverFBItemAddCnt = "RecoverFBItemAddCnt_%s" # èµ„源找回副本物品增加次数  <%s-找回项索引>
Def_PDict_RecoverFBNoBuyCnt = "RecoverFBNoBuyCnt_%s" # èµ„源找回副本未购买次数  <%s-找回项索引>
Def_PDict_RecoverGainData = "RecoverGainData_%s" # èµ„源找回额外数据<%s-找回项索引>
Def_PDict_RecoverGainDataEx = "RecoverGainDataEx_%s" # èµ„源找回额外数据<%s-找回项索引>
Def_PDict_HaveRecover = "HaveRecover_%s" # èµ„源找回今日是否已找回<%s-找回项索引> 1:找回了普通  2:找回了vip  3:2个都有找回
Def_PDict_RecoverGainLastTime = "RecoverGainLastTime" # ä¸Šä¸€æ¬¡èµ„源找回时的时间
Def_PDict_NPCKillCount = "NPCKillCount_%s"   # NPC已击杀次数, å‚æ•°(NPCID) CCBBAA, AA存储公共装备次数,BB存储公共ID次数,CC存储私有次数
Def_PDict_NPCAttackCount = "NPCAttackCount_%s"   # NPC已攻击次数, å‚æ•°(NPCID)
@@ -3627,13 +3599,6 @@
# çµå™¨åŸ¹å…»
Def_PDict_LingQiTrainLV = "LingQiTrainLV_%s_%s" # åŸ¹å…»ç­‰é˜¶ï¼Œå‚数为(place, åŸ¹å…»ç±»åž‹)
Def_PDict_LingQiTrainItemCount = "LingQiTrainItemCount_%s_%s" # åŸ¹å…»å½“前阶已吃培养丹个数,参数为(place, åŸ¹å…»ç±»åž‹)
# å…¬å…±CD副本扫荡
Def_PDict_PubCDFBS_Time = "PCDFBS_%s_Time" # å¼€å§‹æ‰«è¡æ—¶é—´, å‚æ•°(公共组编号)
Def_PDict_PubCDFBS_MapID = "PCDFBS_%s_MID" # æ‰«è¡çš„地图, å‚æ•°(公共组编号)
Def_PDict_PubCDFBS_LineID = "PCDFBS_%s_LID" # æ‰«è¡çš„线路, å‚æ•°(公共组编号)
Def_PDict_PubCDFBS_Cnt = "PCDFBS_%s_Cnt" # æ‰«è¡æ¬¡æ•°, å‚æ•°(公共组编号)
Def_PDict_PubCDFBS_DataEx = "PCDFBS_%s_DEx" # æ‰«è¡æ¬¡æ•°, å‚æ•°(公共组编号)
# å® ç‰©
Def_PDict_FightPetIndex = "FightPetIndex" # å‡ºæˆ˜çš„宠物索引
@@ -4499,7 +4464,7 @@
Def_Cost_5, # å‰¯æœ¬é¼“舞 5
Def_Cost_GoldInvest, # ç†è´¢æŠ•资
Def_Cost_Pray, # ç¥ˆç¥·
Def_Cost_RecoverGain, # èµ„源找回
Def_Cost_8, # èµ„源找回
Def_Cost_BuyVIPItem, # è´­ä¹°VIP礼包
Def_Cost_GM, # GM 10
Def_Cost_BourseBuy, # äº¤æ˜“所购买
@@ -4586,7 +4551,6 @@
Def_Cost_Pray:"Pray",
Def_Cost_Treasure:"Treasure",
Def_Cost_OpenNoble:"OpenNoble",
Def_Cost_RecoverGain:"RecoverGain",
Def_Cost_EnterFB:"EnterFB",
# æ— æ¶ˆè´¹å¯¹è±¡å­ç±»çš„
@@ -4663,7 +4627,7 @@
Def_GiveMoney_Pickup, # Ê°È¡
Def_GiveMoney_Bourse, # äº¤æ˜“所 10
Def_GiveMoney_GoldInvest, # ç»‘钻投资
Def_GiveMoney_Recover, # èµ„源找回
Def_GiveMoney_12, # èµ„源找回
Def_GiveMoney_RedPacket, # çº¢åŒ…
Def_GiveMoney_RefineGift, # ç‚¼åˆ¶å¥–励
Def_GiveMoney_Mail, # é‚®ä»¶ï¼ˆè¡¥å¿ï¼‰ 15
@@ -4701,7 +4665,6 @@
Def_GiveMoney_Pickup:"Pickup",
Def_GiveMoney_Bourse:"Bourse",
Def_GiveMoney_GoldInvest:"GoldInvest",
Def_GiveMoney_Recover:"Recover",
Def_GiveMoney_RedPacket:"RedPacket",
Def_GiveMoney_RefineGift:"RefineGift",
Def_GiveMoney_Mail:"Mail",
@@ -4878,10 +4841,6 @@
                   }
##==================================================================================================
# å‰ç«¯è‡ªå®šä¹‰åœºæ™¯çŠ¶æ€
CustomMapStep_Over = 0 # æ²¡æœ‰æˆ–已结束
CustomMapStep_Fight = 1 # æˆ˜æ–—进行中
# å‰¯æœ¬å‚与类型
FB_JoinType = (
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -1083,162 +1083,6 @@
#------------------------------------------------------
# A2 10 æ¸…除副本CD#tagCMClearFBCD
class  tagCMClearFBCD(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA2
        self.SubCmd = 0x10
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA2
        self.SubCmd = 0x10
        self.MapID = 0
        return
    def GetLength(self):
        return sizeof(tagCMClearFBCD)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A2 10 æ¸…除副本CD//tagCMClearFBCD:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID
                                )
        return DumpString
m_NAtagCMClearFBCD=tagCMClearFBCD()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMClearFBCD.Cmd,m_NAtagCMClearFBCD.SubCmd))] = m_NAtagCMClearFBCD
#------------------------------------------------------
# A2 33 å‰ç«¯é€€å‡ºè‡ªå®šä¹‰åœºæ™¯ #tagCMClientExitCustomScene
class  tagCMClientExitCustomScene(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA2
        self.SubCmd = 0x33
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA2
        self.SubCmd = 0x33
        return
    def GetLength(self):
        return sizeof(tagCMClientExitCustomScene)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A2 33 å‰ç«¯é€€å‡ºè‡ªå®šä¹‰åœºæ™¯ //tagCMClientExitCustomScene:
                                Cmd:%s,
                                SubCmd:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd
                                )
        return DumpString
m_NAtagCMClientExitCustomScene=tagCMClientExitCustomScene()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMClientExitCustomScene.Cmd,m_NAtagCMClientExitCustomScene.SubCmd))] = m_NAtagCMClientExitCustomScene
#------------------------------------------------------
# A2 31 å‰ç«¯å¼€å§‹è‡ªå®šä¹‰åœºæ™¯ #tagCMClientStartCustomScene
class  tagCMClientStartCustomScene(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ("FuncLineID", c_ushort),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA2
        self.SubCmd = 0x31
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA2
        self.SubCmd = 0x31
        self.MapID = 0
        self.FuncLineID = 0
        return
    def GetLength(self):
        return sizeof(tagCMClientStartCustomScene)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A2 31 å‰ç«¯å¼€å§‹è‡ªå®šä¹‰åœºæ™¯ //tagCMClientStartCustomScene:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d,
                                FuncLineID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID,
                                self.FuncLineID
                                )
        return DumpString
m_NAtagCMClientStartCustomScene=tagCMClientStartCustomScene()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMClientStartCustomScene.Cmd,m_NAtagCMClientStartCustomScene.SubCmd))] = m_NAtagCMClientStartCustomScene
#------------------------------------------------------
# A2 24 è§¦ç¢°NPC #tagCMTouchNPC
class  tagCMTouchNPC(Structure):
@@ -1288,58 +1132,6 @@
m_NAtagCMTouchNPC=tagCMTouchNPC()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTouchNPC.Cmd,m_NAtagCMTouchNPC.SubCmd))] = m_NAtagCMTouchNPC
#------------------------------------------------------
# A2 34 è‡ªå®šä¹‰åœºæ™¯ä¸­èŽ·å–é‡‡é›†å¥–åŠ± #tagCMGetCustomSceneCollectAward
class  tagCMGetCustomSceneCollectAward(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("NPCID", c_int),    #采集的NPCID
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA2
        self.SubCmd = 0x34
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA2
        self.SubCmd = 0x34
        self.NPCID = 0
        return
    def GetLength(self):
        return sizeof(tagCMGetCustomSceneCollectAward)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A2 34 è‡ªå®šä¹‰åœºæ™¯ä¸­èŽ·å–é‡‡é›†å¥–åŠ± //tagCMGetCustomSceneCollectAward:
                                Cmd:%s,
                                SubCmd:%s,
                                NPCID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.NPCID
                                )
        return DumpString
m_NAtagCMGetCustomSceneCollectAward=tagCMGetCustomSceneCollectAward()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMGetCustomSceneCollectAward.Cmd,m_NAtagCMGetCustomSceneCollectAward.SubCmd))] = m_NAtagCMGetCustomSceneCollectAward
#------------------------------------------------------
@@ -5775,54 +5567,6 @@
#------------------------------------------------------
# A5 1B è´­ä¹°æŒ‘战副本精力 #tagCMBuyFBEnergy
class  tagCMBuyFBEnergy(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x1B
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x1B
        return
    def GetLength(self):
        return sizeof(tagCMBuyFBEnergy)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 1B è´­ä¹°æŒ‘战副本精力 //tagCMBuyFBEnergy:
                                Cmd:%s,
                                SubCmd:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd
                                )
        return DumpString
m_NAtagCMBuyFBEnergy=tagCMBuyFBEnergy()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMBuyFBEnergy.Cmd,m_NAtagCMBuyFBEnergy.SubCmd))] = m_NAtagCMBuyFBEnergy
#------------------------------------------------------
# A5 0A è´­ä¹°å¯å‡»æ€boss次数 #tagCMBuyKillBossCnt
class  tagCMBuyKillBossCnt(Structure):
@@ -8123,90 +7867,6 @@
#------------------------------------------------------
# A5 53 èµ„源找回 #tagCMRecoverGain
class  tagCMRecoverGain(Structure):
    Head = tagHead()
    Type = 0    #(BYTE Type)// æ‰¾å›žæ–¹å¼ 0 ä»™çމ 1铜钱
    Cnt = 0    #(BYTE Cnt)
    IndexList = list()    #(vector<BYTE> IndexList)// æ‰¾å›žç´¢å¼•列表
    RecoverCntList = list()    #(vector<BYTE> RecoverCntList)// ç´¢å¼•对应找回次数列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x53
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Cnt):
            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
            self.IndexList.append(value)
        for i in range(self.Cnt):
            value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
            self.RecoverCntList.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA5
        self.Head.SubCmd = 0x53
        self.Type = 0
        self.Cnt = 0
        self.IndexList = list()
        self.RecoverCntList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 1 * self.Cnt
        length += 1 * self.Cnt
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Type)
        data = CommFunc.WriteBYTE(data, self.Cnt)
        for i in range(self.Cnt):
            data = CommFunc.WriteBYTE(data, self.IndexList[i])
        for i in range(self.Cnt):
            data = CommFunc.WriteBYTE(data, self.RecoverCntList[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Type:%d,
                                Cnt:%d,
                                IndexList:%s,
                                RecoverCntList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Type,
                                self.Cnt,
                                "...",
                                "..."
                                )
        return DumpString
m_NAtagCMRecoverGain=tagCMRecoverGain()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRecoverGain.Head.Cmd,m_NAtagCMRecoverGain.Head.SubCmd))] = m_NAtagCMRecoverGain
#------------------------------------------------------
# A5 74 åˆ·æ–°æ‚¬èµä»»åŠ¡ #tagCMRefreshArrestTask
class  tagCMRefreshArrestTask(Structure):
@@ -8428,54 +8088,6 @@
m_NAtagCMRequestTreasure=tagCMRequestTreasure()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRequestTreasure.Cmd,m_NAtagCMRequestTreasure.SubCmd))] = m_NAtagCMRequestTreasure
#------------------------------------------------------
#A5 60 é‡ç½®å‰¯æœ¬æŒ‘战次数 #tagCMResetFBJoinCnt
class  tagCMResetFBJoinCnt(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x60
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x60
        return
    def GetLength(self):
        return sizeof(tagCMResetFBJoinCnt)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''//A5 60 é‡ç½®å‰¯æœ¬æŒ‘战次数 //tagCMResetFBJoinCnt:
                                Cmd:%s,
                                SubCmd:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd
                                )
        return DumpString
m_NAtagCMResetFBJoinCnt=tagCMResetFBJoinCnt()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMResetFBJoinCnt.Cmd,m_NAtagCMResetFBJoinCnt.SubCmd))] = m_NAtagCMResetFBJoinCnt
#------------------------------------------------------
@@ -13543,118 +13155,6 @@
#------------------------------------------------------
# B1 01 å®¢æˆ·ç«¯å‰¯æœ¬å‘送结束 #tagCMClientEndFB
class  tagCMClientEndFB(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ("LineID", c_ushort),
                  ("Data1", c_int),    #副本数据
                  ("Data2", c_int),    #副本数据
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x01
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x01
        self.MapID = 0
        self.LineID = 0
        self.Data1 = 0
        self.Data2 = 0
        return
    def GetLength(self):
        return sizeof(tagCMClientEndFB)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 01 å®¢æˆ·ç«¯å‰¯æœ¬å‘送结束 //tagCMClientEndFB:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d,
                                LineID:%d,
                                Data1:%d,
                                Data2:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID,
                                self.LineID,
                                self.Data1,
                                self.Data2
                                )
        return DumpString
m_NAtagCMClientEndFB=tagCMClientEndFB()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMClientEndFB.Cmd,m_NAtagCMClientEndFB.SubCmd))] = m_NAtagCMClientEndFB
#------------------------------------------------------
# B1 04 å®¢æˆ·ç«¯å‘送开始副本 #tagCMClientStartFB
class  tagCMClientStartFB(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x04
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x04
        return
    def GetLength(self):
        return sizeof(tagCMClientStartFB)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 04 å®¢æˆ·ç«¯å‘送开始副本 //tagCMClientStartFB:
                                Cmd:%s,
                                SubCmd:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd
                                )
        return DumpString
m_NAtagCMClientStartFB=tagCMClientStartFB()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMClientStartFB.Cmd,m_NAtagCMClientStartFB.SubCmd))] = m_NAtagCMClientStartFB
#------------------------------------------------------
# B1 08 å¿«é€Ÿä¸€é”®è¿‡å…³å‰¯æœ¬ #tagCMFBQuickPass
class  tagCMFBQuickPass(Structure):
@@ -13708,66 +13208,6 @@
m_NAtagCMFBQuickPass=tagCMFBQuickPass()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
#------------------------------------------------------
# B1 02 é¢†å–多倍副本奖励 #tagCMGetMultiFBPrize
class  tagCMGetMultiFBPrize(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ("LineID", c_ushort),
                  ("Percent", c_ushort),    # é¢å¤–奖励百分比, å¦‚50代表额外50%奖励
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB1
        self.SubCmd = 0x02
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB1
        self.SubCmd = 0x02
        self.MapID = 0
        self.LineID = 0
        self.Percent = 0
        return
    def GetLength(self):
        return sizeof(tagCMGetMultiFBPrize)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 02 é¢†å–多倍副本奖励 //tagCMGetMultiFBPrize:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d,
                                LineID:%d,
                                Percent:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID,
                                self.LineID,
                                self.Percent
                                )
        return DumpString
m_NAtagCMGetMultiFBPrize=tagCMGetMultiFBPrize()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMGetMultiFBPrize.Cmd,m_NAtagCMGetMultiFBPrize.SubCmd))] = m_NAtagCMGetMultiFBPrize
#------------------------------------------------------
@@ -16616,58 +16056,6 @@
#------------------------------------------------------
# B4 0F å›žæ”¶ç§æœ‰ä¸“属木桩怪 #tagCMRecyclePriWoodPile
class  tagCMRecyclePriWoodPile(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ObjID", c_int),
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB4
        self.SubCmd = 0x0F
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB4
        self.SubCmd = 0x0F
        self.ObjID = 0
        return
    def GetLength(self):
        return sizeof(tagCMRecyclePriWoodPile)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B4 0F å›žæ”¶ç§æœ‰ä¸“属木桩怪 //tagCMRecyclePriWoodPile:
                                Cmd:%s,
                                SubCmd:%s,
                                ObjID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ObjID
                                )
        return DumpString
m_NAtagCMRecyclePriWoodPile=tagCMRecyclePriWoodPile()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRecyclePriWoodPile.Cmd,m_NAtagCMRecyclePriWoodPile.SubCmd))] = m_NAtagCMRecyclePriWoodPile
#------------------------------------------------------
# B4 0E çŽ©å®¶æŽ‰è¡€ #tagCMRoleLostHP
class  tagCMRoleLostHP(Structure):
@@ -16721,70 +16109,6 @@
m_NAtagCMRoleLostHP=tagCMRoleLostHP()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRoleLostHP.Cmd,m_NAtagCMRoleLostHP.SubCmd))] = m_NAtagCMRoleLostHP
#------------------------------------------------------
# B4 0C å¬å”¤ç§æœ‰ä¸“属木桩怪 #tagCMSummonPriWoodPile
class  tagCMSummonPriWoodPile(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("NPCID", c_int),
                  ("Count", c_ubyte),    #默认1个,最多5个
                  ("HP", c_int),    #默认0取最大值,其中一个血量数值大于0则用指定血量
                  ("HPEx", c_int),    #默认0取最大值,其中一个血量数值大于0则用指定血量
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB4
        self.SubCmd = 0x0C
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB4
        self.SubCmd = 0x0C
        self.NPCID = 0
        self.Count = 0
        self.HP = 0
        self.HPEx = 0
        return
    def GetLength(self):
        return sizeof(tagCMSummonPriWoodPile)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B4 0C å¬å”¤ç§æœ‰ä¸“属木桩怪 //tagCMSummonPriWoodPile:
                                Cmd:%s,
                                SubCmd:%s,
                                NPCID:%d,
                                Count:%d,
                                HP:%d,
                                HPEx:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.NPCID,
                                self.Count,
                                self.HP,
                                self.HPEx
                                )
        return DumpString
m_NAtagCMSummonPriWoodPile=tagCMSummonPriWoodPile()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMSummonPriWoodPile.Cmd,m_NAtagCMSummonPriWoodPile.SubCmd))] = m_NAtagCMSummonPriWoodPile
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -8863,130 +8863,6 @@
#------------------------------------------------------
# A3 49 èµ„源找回次数 #tagMCRecoverNum
class  tagMCRecoverNumInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Index", c_ubyte),    # æ‰¾å›žé¡¹ç´¢å¼•
                  ("RecoverCnt", c_ubyte),    # å¯æ‰¾å›žæ¬¡æ•°
                  ("ExtraCnt", c_ubyte),    # VIP额外次数
                  ("ExtraData", c_ubyte),    # é¢å¤–参数1
                  ("ExtraData2", c_ubyte),    # é¢å¤–参数2
                  ("HaveRecover", c_ubyte),    # å·²æ‰¾å›ž 1-全部已找回 2-非VIP已找回
                  ]
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Index = 0
        self.RecoverCnt = 0
        self.ExtraCnt = 0
        self.ExtraData = 0
        self.ExtraData2 = 0
        self.HaveRecover = 0
        return
    def GetLength(self):
        return sizeof(tagMCRecoverNumInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 49 èµ„源找回次数 //tagMCRecoverNum:
                                Index:%d,
                                RecoverCnt:%d,
                                ExtraCnt:%d,
                                ExtraData:%d,
                                ExtraData2:%d,
                                HaveRecover:%d
                                '''\
                                %(
                                self.Index,
                                self.RecoverCnt,
                                self.ExtraCnt,
                                self.ExtraData,
                                self.ExtraData2,
                                self.HaveRecover
                                )
        return DumpString
class  tagMCRecoverNum(Structure):
    Head = tagHead()
    Num = 0    #(BYTE Num)// æ‰¾å›žä¿¡æ¯æ•°
    NumInfo = list()    #(vector<tagMCRecoverNumInfo> NumInfo)// æ‰¾å›žä¿¡æ¯åˆ—表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x49
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Num,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Num):
            temNumInfo = tagMCRecoverNumInfo()
            _pos = temNumInfo.ReadData(_lpData, _pos)
            self.NumInfo.append(temNumInfo)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x49
        self.Num = 0
        self.NumInfo = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Num):
            length += self.NumInfo[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Num)
        for i in range(self.Num):
            data = CommFunc.WriteString(data, self.NumInfo[i].GetLength(), self.NumInfo[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Num:%d,
                                NumInfo:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Num,
                                "..."
                                )
        return DumpString
m_NAtagMCRecoverNum=tagMCRecoverNum()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRecoverNum.Head.Cmd,m_NAtagMCRecoverNum.Head.SubCmd))] = m_NAtagMCRecoverNum
#------------------------------------------------------
# A3 1F çŽ©å®¶ç¬¦å°ä¿¡æ¯ #tagMCRuneInfo
class  tagMCRuneInfo(Structure):
@@ -16135,114 +16011,6 @@
m_NAtagMCEmojiPackInfo=tagMCEmojiPackInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEmojiPackInfo.Head.Cmd,m_NAtagMCEmojiPackInfo.Head.SubCmd))] = m_NAtagMCEmojiPackInfo
#------------------------------------------------------
# A7 03 é€šçŸ¥è¿›å…¥å‰¯æœ¬æ—¶é—´ #tagMCFBEnterTickList
class  tagMCFBEnterTick(Structure):
    _pack_ = 1
    _fields_ = [
                  ("MapID", c_int),    # å‰¯æœ¬åœ°å›¾id
                  ("LastEnterTick", c_int),    # ä¸Šæ¬¡è¿›å…¥å‰¯æœ¬æ—¶é—´
                  ]
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.MapID = 0
        self.LastEnterTick = 0
        return
    def GetLength(self):
        return sizeof(tagMCFBEnterTick)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A7 03 é€šçŸ¥è¿›å…¥å‰¯æœ¬æ—¶é—´ //tagMCFBEnterTickList:
                                MapID:%d,
                                LastEnterTick:%d
                                '''\
                                %(
                                self.MapID,
                                self.LastEnterTick
                                )
        return DumpString
class  tagMCFBEnterTickList(Structure):
    Head = tagHead()
    Cnt = 0    #(BYTE Cnt)// ä¿¡æ¯ä¸ªæ•°
    EnterTickList = list()    #(vector<tagMCFBEnterTick> EnterTickList)// ä¿¡æ¯åˆ—表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA7
        self.Head.SubCmd = 0x03
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Cnt):
            temEnterTickList = tagMCFBEnterTick()
            _pos = temEnterTickList.ReadData(_lpData, _pos)
            self.EnterTickList.append(temEnterTickList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA7
        self.Head.SubCmd = 0x03
        self.Cnt = 0
        self.EnterTickList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Cnt):
            length += self.EnterTickList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Cnt)
        for i in range(self.Cnt):
            data = CommFunc.WriteString(data, self.EnterTickList[i].GetLength(), self.EnterTickList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Cnt:%d,
                                EnterTickList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Cnt,
                                "..."
                                )
        return DumpString
m_NAtagMCFBEnterTickList=tagMCFBEnterTickList()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFBEnterTickList.Head.Cmd,m_NAtagMCFBEnterTickList.Head.SubCmd))] = m_NAtagMCFBEnterTickList
#------------------------------------------------------
@@ -39062,118 +38830,6 @@
#------------------------------------------------------
# B2 09 å‰¯æœ¬æ¬¡æ•°æ¢å¤å‰©ä½™æ—¶é—´ #tagMCFBCntRegainRemainTime
class  tagMCFBCntRegain(Structure):
    _pack_ = 1
    _fields_ = [
                  ("DataMapID", c_int),    # åœ°å›¾ID
                  ("RemainTime", c_int),    # å‰©ä½™æ—¶é—´ç§’
                  ("RegainCnt", c_ubyte),    # ä»Šæ—¥å·²æ¢å¤æ¬¡æ•°
                  ]
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.DataMapID = 0
        self.RemainTime = 0
        self.RegainCnt = 0
        return
    def GetLength(self):
        return sizeof(tagMCFBCntRegain)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B2 09 å‰¯æœ¬æ¬¡æ•°æ¢å¤å‰©ä½™æ—¶é—´ //tagMCFBCntRegainRemainTime:
                                DataMapID:%d,
                                RemainTime:%d,
                                RegainCnt:%d
                                '''\
                                %(
                                self.DataMapID,
                                self.RemainTime,
                                self.RegainCnt
                                )
        return DumpString
class  tagMCFBCntRegainRemainTime(Structure):
    Head = tagHead()
    Cnt = 0    #(BYTE Cnt)// ä¿¡æ¯æ•°
    InfoList = list()    #(vector<tagMCFBCntRegain> InfoList)// ä¿¡æ¯åˆ—表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xB2
        self.Head.SubCmd = 0x09
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Cnt):
            temInfoList = tagMCFBCntRegain()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB2
        self.Head.SubCmd = 0x09
        self.Cnt = 0
        self.InfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Cnt):
            length += self.InfoList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Cnt)
        for i in range(self.Cnt):
            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Cnt:%d,
                                InfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Cnt,
                                "..."
                                )
        return DumpString
m_NAtagMCFBCntRegainRemainTime=tagMCFBCntRegainRemainTime()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFBCntRegainRemainTime.Head.Cmd,m_NAtagMCFBCntRegainRemainTime.Head.SubCmd))] = m_NAtagMCFBCntRegainRemainTime
#------------------------------------------------------
# B2 01 é€šçŸ¥å°é­”坛双倍击杀状态 #tagMCFMTDoubleState
class  tagMCFMTDoubleState(Structure):
@@ -39227,196 +38883,6 @@
m_NAtagMCFMTDoubleState=tagMCFMTDoubleState()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFMTDoubleState.Cmd,m_NAtagMCFMTDoubleState.SubCmd))] = m_NAtagMCFMTDoubleState
#------------------------------------------------------
# B2 03 å…¬å…±å‰¯æœ¬æ‰«è¡ä¿¡æ¯ #tagMCPubFBSweepData
class  tagMCPubFBSweep(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("PubNum", c_ubyte),    # å…¬å…±ç»„编号
                  ("FBMapID", c_int),    # å½“前扫荡的副本地图ID
                  ("LineID", c_ushort),    # lineID
                  ("SweepTime", c_int),    # å¼€å§‹æ‰«è¡çš„æ—¶é—´
                  ("SweepCnt", c_ubyte),    # æ‰«è¡æ¬¡æ•°
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB2
        self.SubCmd = 0x03
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB2
        self.SubCmd = 0x03
        self.PubNum = 0
        self.FBMapID = 0
        self.LineID = 0
        self.SweepTime = 0
        self.SweepCnt = 0
        return
    def GetLength(self):
        return sizeof(tagMCPubFBSweep)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B2 03 å…¬å…±å‰¯æœ¬æ‰«è¡ä¿¡æ¯ //tagMCPubFBSweepData:
                                Cmd:%s,
                                SubCmd:%s,
                                PubNum:%d,
                                FBMapID:%d,
                                LineID:%d,
                                SweepTime:%d,
                                SweepCnt:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.PubNum,
                                self.FBMapID,
                                self.LineID,
                                self.SweepTime,
                                self.SweepCnt
                                )
        return DumpString
class  tagMCPubFBSweepData(Structure):
    Head = tagHead()
    Cnt = 0    #(BYTE Cnt)// ä¿¡æ¯æ•°
    SweepDatList = list()    #(vector<tagMCPubFBSweep> SweepDatList)// ä¿¡æ¯åˆ—表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xB2
        self.Head.SubCmd = 0x03
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Cnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Cnt):
            temSweepDatList = tagMCPubFBSweep()
            _pos = temSweepDatList.ReadData(_lpData, _pos)
            self.SweepDatList.append(temSweepDatList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB2
        self.Head.SubCmd = 0x03
        self.Cnt = 0
        self.SweepDatList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        for i in range(self.Cnt):
            length += self.SweepDatList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Cnt)
        for i in range(self.Cnt):
            data = CommFunc.WriteString(data, self.SweepDatList[i].GetLength(), self.SweepDatList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Cnt:%d,
                                SweepDatList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Cnt,
                                "..."
                                )
        return DumpString
m_NAtagMCPubFBSweepData=tagMCPubFBSweepData()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPubFBSweepData.Head.Cmd,m_NAtagMCPubFBSweepData.Head.SubCmd))] = m_NAtagMCPubFBSweepData
#------------------------------------------------------
# B2 16 å¼€å§‹è‡ªå®šä¹‰åœºæ™¯ç»“æžœ #tagMCStartCustomSceneResult
class  tagMCStartCustomSceneResult(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("MapID", c_int),
                  ("FuncLineID", c_ushort),
                  ("Result", c_ubyte),    #是否允许
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xB2
        self.SubCmd = 0x16
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.Cmd = 0xB2
        self.SubCmd = 0x16
        self.MapID = 0
        self.FuncLineID = 0
        self.Result = 0
        return
    def GetLength(self):
        return sizeof(tagMCStartCustomSceneResult)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B2 16 å¼€å§‹è‡ªå®šä¹‰åœºæ™¯ç»“æžœ //tagMCStartCustomSceneResult:
                                Cmd:%s,
                                SubCmd:%s,
                                MapID:%d,
                                FuncLineID:%d,
                                Result:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.MapID,
                                self.FuncLineID,
                                self.Result
                                )
        return DumpString
m_NAtagMCStartCustomSceneResult=tagMCStartCustomSceneResult()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCStartCustomSceneResult.Cmd,m_NAtagMCStartCustomSceneResult.SubCmd))] = m_NAtagMCStartCustomSceneResult
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
@@ -1292,19 +1292,6 @@
    SendEventPack("PlayerSubmit_%s" % eventName, dataDict, curPlayer)
    return
## èµ„源找回记录
#  @param curPlayer
#  @return: None
def DR_PlayerRecover(curPlayer, recoverWay, recoverCntDict, totalExp, totalMoney, totalSP, totalItemDict):
    dataDict = {'PlayerID':curPlayer.GetPlayerID(), 'PlayerName':curPlayer.GetPlayerName(),
                'AccID':curPlayer.GetAccID(), 'recoverWay':recoverWay, 'recoverCntDict':recoverCntDict,
                'totalExp':totalExp, 'totalMoney':totalMoney, 'totalSP':totalSP, 'totalItemDict':totalItemDict}
    #发送封包
    SendEventPack("PlayerRecover", dataDict, curPlayer)
    return
def DR_GlobalDropCD(curPlayer, npcID, itemID):
    # å…¨å±€æŽ‰è½CD掉落记录
    dataDict = {'PlayerID':curPlayer.GetPlayerID(), 'PlayerName':curPlayer.GetPlayerName(), 
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFBCD.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/EnterFB.py
@@ -39,10 +39,7 @@
    if FBCommon.GetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID):
        FBCommon.SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, 0)
        
    tick = GameWorld.GetGameWorld().GetTick()
    if mapID in FBCommon.GetClientCustomScene():
        PlayerFB.DoEnterCustomScene(curPlayer, mapID, lineID, tick)
    elif mapID in ChConfig.Def_CrossMapIDList:
    if mapID in ChConfig.Def_CrossMapIDList:
        PlayerControl.PlayerEnterCrossServer(curPlayer, mapID, lineID)
    else:
        PlayerControl.PlayerEnterFB(curPlayer, mapID, lineID, posX, posY)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ExitFB.py
@@ -33,10 +33,6 @@
        CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
        return
    
    if PlayerControl.GetCustomMapID(curPlayer):
        PlayerFB.DoExitCustomScene(curPlayer)
        return
    isAll = paramList[0] if paramList else 0
    if isAll:
        copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -274,12 +274,6 @@
#  @return None
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Ž.
def DoFB_Player_KillNPC(curPlayer , curNPC , tick):
    mapID = PlayerControl.GetCustomMapID(curPlayer)
    lineID = PlayerControl.GetCustomLineID(curPlayer)
    if mapID:
        DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID)
        return
    do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
    
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "DoFB_Player_KillNPC"))
@@ -367,9 +361,7 @@
#  @return None
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Ž.
def DoFBOnKill_Player(curPlayer, defender, tick):
    mapID = PlayerControl.GetCustomMapID(curPlayer)
    if not mapID:
        mapID = GameWorld.GetMap().GetMapID()
    mapID = GameWorld.GetMap().GetMapID()
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "DoFBOnKill_Player"))
@@ -945,18 +937,6 @@
    #GameWorld.Log("副本逻辑不可使用   GameLogic_%d"%(mapID))
    callFunc(tick)
    return
def OnCustomSceneProcess(curPlayer, tick):
    customMapID = PlayerControl.GetCustomMapID(curPlayer)
    if not customMapID:
        return
    customLineID = PlayerControl.GetCustomLineID(curPlayer)
    do_FBLogic_ID = __GetFBLogic_MapID(customMapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnCustomSceneProcess"))
    if callFunc:
        callFunc(curPlayer, customMapID, customLineID, tick)
    return
## å¼€å§‹é‡‡é›†
@@ -1549,22 +1529,6 @@
        return False
    
    return callFunc(curPlayer, addExp, expViewType)
## èŽ·å¾—å¤šå€å‰¯æœ¬å¥–åŠ±
#  @param curPlayer å½“前玩家
#  @param mapID
#  @param lineID
#  @param prizeExLV é¢å¤–奖励百分比等级
#  @return
def OnGetMultiFBPrize(curPlayer, mapID, lineID, prizeExLV):
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnGetMultiFBPrize"))
    if callFunc == None:
        return
    return callFunc(curPlayer, mapID, lineID, prizeExLV)
## å‰¯æœ¬æ‰«è¡è¯¢é—®
def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, isFinish, dataEx):
@@ -2253,72 +2217,6 @@
    
    if callFunc:
        callFunc(curPlayer, curNPC, tick)
    return
## å®¢æˆ·ç«¯å‘送结束副本
def OnClientEndFB(curPlayer, mapID, lineID, dataList):
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnClientEndFB"))
    if callFunc == None:
        return False
    return callFunc(curPlayer, mapID, lineID, dataList)
## å®¢æˆ·ç«¯å‘送开始副本
def OnClientStartFB(curPlayer, tick):
    do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnClientStartFB"))
    if callFunc == None:
        return False
    return callFunc(curPlayer, tick)
## å®¢æˆ·ç«¯è¿›å…¥è‡ªå®šä¹‰åœºæ™¯
def OnEnterCustomScene(curPlayer, mapID, lineID):
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnEnterCustomScene"))
    if callFunc == None:
        return
    return callFunc(curPlayer, mapID, lineID)
## åˆ¤æ–­å¯å¦å¬å”¤æœ¨æ¡©æ€ª
def OnCanSummonPriWoodPile(curPlayer, mapID, lineID, npcID, count):
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnCanSummonPriWoodPile"))
    if callFunc == None:
        return True
    return callFunc(curPlayer, mapID, lineID, npcID, count)
## è‡ªå®šä¹‰åœºæ™¯å‰¯æœ¬å‡»æ€NPC
def DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID):
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "DoCustomScene_Player_KillNPC"))
    if callFunc:
        callFunc(curPlayer, curNPC, mapID, lineID)
    return
## è‡ªå®šä¹‰åœºæ™¯é‡‡é›†OK,需自带是否允许采集的判断
def OnCustomSceneCollectOK(curPlayer, mapID, lineID, npcID):
    do_FBLogic_ID = __GetFBLogic_MapID(mapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnCustomSceneCollectOK"))
    if callFunc:
        return callFunc(curPlayer, mapID, lineID, npcID)
    return
## è¿›å…¥è·¨æœå‰¯æœ¬æ³¨å†Œæ•°æ®å‰é€»è¾‘
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -205,11 +205,6 @@
                PlayerControl.NotifyCode(curPlayer, notifyMark, [mapID])
            return ShareDefine.EntFBAskRet_NoEnterCnt
        
        #进入CD判断
        if CheckIsEnterCD(curPlayer, mapID):
            if isNotify:
                PlayerControl.NotifyCode(curPlayer, "SingleEnterCD", [mapID])
            return ShareDefine.EntFBAskRet_EnterCD
    # åŠŸèƒ½çº¿è·¯é€šç”¨æ£€æŸ¥
    if fbLineIpyData:
        #等级判断
@@ -482,15 +477,6 @@
    GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), ChConfig.FBPlayerDict_IsDelTicket, delSign)
    return
## è‡ªå®šä¹‰åœºæ™¯é˜¶æ®µ
def GetCustomMapStep(curPlayer, mapID, lineID):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_CustomMapStep % (mapID, lineID))
def SetCustomMapStep(curPlayer, mapID, lineID, step):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_CustomMapStep % (mapID, lineID), step)
    if step == ChConfig.CustomMapStep_Over:
        PlayerControl.SetCustomMap(curPlayer, 0, 0)
    return
def GetCurSingleFBPlayer():
    ''' èŽ·å–å½“å‰å•äººå‰¯æœ¬çŽ©å®¶ '''
    curPlayer = None
@@ -564,44 +550,6 @@
            FBLogic.DoFBHelp(curPlayer, tick)
            if updGrade != lowest:
                curPlayer.Sync_TimeTick(timeType, 0, diffSecond * 1000, True)
    return updGrade
def UpdateCustomFBGrade(curPlayer, tick, gradeTimeList, timeType=IPY_GameWorld.tttFlagTake):
    '''更新当前副本星级、评级
    @param gradeTimeList: è¯„级分段时间列表,单位秒 [最高评级可用时间, ä¸‹çº§å¯ç”¨æ—¶é—´, ..., æœ€ä½Žçº§å¯ç”¨æ—¶é—´]
    @param curPlayer: è§¦å‘的玩家,一般是DoEnter时调用,会同步更新一次副本评级并将信息通知该玩家
    @note: æ˜Ÿçº§ï¼š1-1星;2-2星 ...            [60, 20, 10]
            è¯„级:1-D;2-C;3-B;4-A;5-S;    [60, 30, 30, 20, 10]
    '''
    lowest = 1
    curGrade = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneGrade)
    #最后一个评级了,不再处理
    if curGrade == lowest:
        return curGrade
    fbStepTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick)
    useSecond = int((tick - fbStepTick) / 1000.0) # æˆ˜æ–—阶段已耗总秒数
    diffSecond = 0
    updGrade = len(gradeTimeList)
    gSecondTotal = 0
    for gSecond in gradeTimeList:
        gSecondTotal += gSecond
        diffSecond = gSecondTotal - useSecond
        # è¿˜åœ¨å½“前评级段
        if diffSecond > 0:
            break
        updGrade -= 1 # ç”¨æ—¶è¶…过当前评级段,降级
    updGrade = max(lowest, updGrade) # ä¿åº•最低级
    if curGrade == updGrade:
        return curGrade
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneGrade, updGrade)
    GameWorld.DebugLog("UpdateCustomFBGrade useSecond=%s,gradeTimeList=%s,curGrade=%s,updGrade=%s,diffSecond=%s"
                       % (useSecond, gradeTimeList, curGrade, updGrade, diffSecond))
    Notify_FBHelp(curPlayer, {Help_grade:updGrade})
    if updGrade != lowest:
        curPlayer.Sync_TimeTick(timeType, 0, diffSecond * 1000, True)
    return updGrade
def NotifyFBOver(curPlayer, dataMapID, lineID, isPass, overDict={}):
@@ -1579,54 +1527,15 @@
    if not fbIpyData:
        return 0
    maxTimes = fbIpyData.GetDayTimes()
    MWPrivilegeID = fbIpyData.GetExtraTimesMWPriID()
    
    mwAddCnt = 0#wmpIpyData.GetEffectValue() if wmpIpyData else 0
    extraTimesVIPPriID = fbIpyData.GetExtraTimesVIPPriID()
    extraCnt = 0
    buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_BuyFbCntDay % mapID)
    recoverFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mapID)
    itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID)
    regainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID)
    regainFbCnt = 0
    investFBCnt = PlayerGoldInvest.GetAddFBCnt(curPlayer, mapID)
    maxCnt = maxTimes + regainFbCnt + extraCnt + buyCnt + recoverFbCnt + mwAddCnt + itemAddCnt + investFBCnt
    maxCnt = maxTimes + regainFbCnt + extraCnt + buyCnt + mwAddCnt + itemAddCnt + investFBCnt
    return maxCnt
def GetFBDetailCntInfo(curPlayer, mapID):
    #返回FB剩余正常次数、时间恢复次数、vip额外次数、已买次数、道具增加次数、未买次数
    fbIpyData = GetFBIpyData(mapID)
    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
    maxTimes = fbIpyData.GetDayTimes()
    maxRegainFbCnt = 0
    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
    if str(mapID) in recoverIntervalDict:
        maxRegainFbCnt = recoverIntervalDict[str(mapID)][0]
    MWPrivilegeID = fbIpyData.GetExtraTimesMWPriID()
    mwAddCnt = 0#wmpIpyData.GetEffectValue() if wmpIpyData else 0
    maxTimes += mwAddCnt #法宝增加的次数加到基础次数里
    extraTimesVIPPriID = fbIpyData.GetExtraTimesVIPPriID()
    extraCnt = 0
    buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_BuyFbCntDay % mapID)
    recoverFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mapID)
    itemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID)
    #先用找回来的次数,再用Vip额外次数,再用每日刷新次数、时间恢复次数、和Vip买回来的次数,最后用卷轴加的次数
    cntList = [recoverFbCnt, extraCnt, maxTimes, maxRegainFbCnt, buyCnt, itemAddCnt]
    rCntList = copy.deepcopy(cntList)
    sumCnt = 0
    for i, cnt in enumerate(cntList):
        sumCnt += cnt
        rCntList[i] = max(0, sumCnt - enterCnt)
        if enterCnt <= sumCnt:
            break
    rRecoverFbCnt, rExtraCnt, rCommonCnt, rRegainFbCnt, rBuyCnt, rItemAddCnt = rCntList
    #未买次数
    buyTimesVIPPriID = fbIpyData.GetBuyTimesVIPPriID()
    canBuyCnt = 0
    noBuyCnt = max(0, canBuyCnt - buyCnt)
    return [[rCommonCnt, rRegainFbCnt, rExtraCnt, rBuyCnt, rItemAddCnt, noBuyCnt], [maxTimes, maxRegainFbCnt, extraCnt, canBuyCnt, 10000, canBuyCnt]]
## çŽ©å®¶è¿›å…¥å‰¯æœ¬æ¬¡æ•°
#  @param curPlayer çŽ©å®¶å®žä¾‹
@@ -1646,7 +1555,6 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID, itemAddCnt + addCnt)
    Sync_FBPlayerFBInfoData(curPlayer, mapID)
    PlayerControl.NotifyCode(curPlayer, 'AddActivityCount_1', [itemID, mapID, addCnt])
    OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
    return
## å¢žåŠ çŽ©å®¶è¿›å…¥å‰¯æœ¬æ¬¡æ•°
@@ -1683,139 +1591,7 @@
    GameWorld.DebugLog("    AddEnterFBCount fbID=%s, addCount=%s, lineBit=%s, enterCnt=%s,updValue=%s,enterCntTotal=%s" 
                       % (fbID, addCount, lineBit, enterCnt, updValue, enterCntTotal), curPlayer.GetPlayerID())
    Sync_FBPlayerFBInfoData(curPlayer, fbID)
    OnFBCountChangeEffectRecoverCount(curPlayer, fbID)
    return True
def OnFBCountChangeEffectRecoverCount(curPlayer, mapID):
    ## å‰¯æœ¬ç›¸å…³æ¬¡æ•°å˜æ›´ï¼ŒåŒ…含增加、扣除等影响副本按时间恢复次数相关逻辑处理
    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
    if str(mapID) not in recoverIntervalDict:
        return
    maxCanRecoverCnt, recoverInterval = recoverIntervalDict[str(mapID)]
    curRegainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID) # å½“前已恢复次数
    if curRegainFbCnt >= maxCanRecoverCnt:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
        GameWorld.DebugLog("副本时间恢复次数已达当日上限!")
    else:
        curTime = int(time.time())
        fbIpyData = GetFBIpyData(mapID)
        maxFreeTimes = fbIpyData.GetDayTimes() # å¸¸è§„封顶次数
        enterCnt = GetEnterFBCount(curPlayer, mapID) # å·²ç»è¿›å…¥æ¬¡æ•°
        maxCnt = GetEnterFBMaxCnt(curPlayer, mapID) # å½“前可用最大次数
        remainCanEnterCnt = maxCnt - enterCnt # å‰©ä½™å¯è¿›å…¥æ¬¡æ•°
        regainStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
        passTime = curTime - regainStartTime
        # åˆ°è¾¾å¸¸è§„次数上限,暂时恢复时间
        if remainCanEnterCnt >= maxFreeTimes:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
            GameWorld.DebugLog("副本时间恢复次数已达常规次数!")
        elif passTime < recoverInterval:
            pass
            #GameWorld.DebugLog("副本时间恢复次数还未到达恢复CD!")
        else:
            if not regainStartTime:
                updRegainTotalTime = recoverInterval
            else:
                updRegainTotalTime = recoverInterval - passTime % recoverInterval
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, curTime)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, updRegainTotalTime)
            GameWorld.DebugLog("副本还可按时间恢复次数!curTime=%s,regainStartTime=%s,passTime=%s,updRegainTotalTime=%s"
                               % (curTime, regainStartTime, passTime, updRegainTotalTime))
    NotifyFBCntRegainInfo(curPlayer, [mapID])
    return
def RegainFBCntProcess(curPlayer):
    ## æŒ‰æ—¶é—´æ¢å¤å‰¯æœ¬æ¬¡æ•°
    curTime = int(time.time())
    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1)
    for mapIDStr, recoverInfo in recoverIntervalDict.items():
        mapID = int(mapIDStr)
        maxCanRecoverCnt, recoverInterval = recoverInfo
        curRegainFbCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID) # å½“前已恢复次数
        if maxCanRecoverCnt and curRegainFbCnt >= maxCanRecoverCnt:
            #GameWorld.DebugLog("已到达副本恢复次数上限!mapID=%s,curRegainFbCnt(%s) >= maxCanRecoverCnt(%s)" % (mapID, curRegainFbCnt, maxCanRecoverCnt))
            continue
        fbIpyData = GetFBIpyData(mapID)
        maxFreeTimes = fbIpyData.GetDayTimes() # å¸¸è§„封顶次数
        enterCnt = GetEnterFBCount(curPlayer, mapID) # å·²ç»è¿›å…¥æ¬¡æ•°
        maxCnt = GetEnterFBMaxCnt(curPlayer, mapID) # å½“前可用最大次数
        remainCanEnterCnt = maxCnt - enterCnt # å‰©ä½™å¯è¿›å…¥æ¬¡æ•°
        if remainCanEnterCnt >= maxFreeTimes:
            #GameWorld.DebugLog("可进入次数已经到达常规封顶次数!mapID=%s,remainCanEnterCnt=%s" % (mapID, remainCanEnterCnt))
            continue
        regainStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
        if not regainStartTime:
            #GameWorld.DebugLog("还未设置副本恢复次数倒计时!mapID=%s" % mapID)
            continue
        needTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID)
        passTime = curTime - regainStartTime
        if passTime < needTime:
            continue
        remainTime = passTime - needTime # æ‰£é™¤æ¢å¤å•次后剩余的时间,离线上线后可能一次性恢复多次
        recoverCnt = 1 + remainTime / recoverInterval # å€’计时时间可恢复总次数
        realRecoverCnt = min(maxFreeTimes - remainCanEnterCnt, recoverCnt) # å®žé™…最大可恢复总次数
        if maxCanRecoverCnt:
            realRecoverCnt = min(realRecoverCnt, maxCanRecoverCnt - curRegainFbCnt)
        if realRecoverCnt <= 0:
            continue
        # æ›´æ–°æ—¶é—´å€’计时已恢复次数
        updRegainFbCnt = curRegainFbCnt + realRecoverCnt
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RegainFbCnt % mapID, updRegainFbCnt)
        OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
    return
def NotifyFBCntRegainInfo(curPlayer, syncMapIDList=[]):
    ##通知副本次数恢复剩余时间
    recoverIntervalDict = IpyGameDataPY.GetFuncEvalCfg('FBCntRegainInterval', 1) # {mapID:[次数, æ¯æ¬¡é—´éš”], ...}
    if not recoverIntervalDict:
        return
    if not syncMapIDList:
        syncMapIDList = [int(mapIDStr) for mapIDStr in recoverIntervalDict.keys()]
    infoList = []
    curTime = int(time.time())
    for mapID in syncMapIDList:
        if str(mapID) not in recoverIntervalDict:
            continue
        mapInfo = ChPyNetSendPack.tagMCFBCntRegain()
        mapInfo.Clear()
        mapInfo.DataMapID = mapID
        lastRegainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID)
        needTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID)
        passTime = curTime - lastRegainTime
        mapInfo.RemainTime = max(0, needTime - passTime)
        mapInfo.RegainCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RegainFbCnt % mapID)
        infoList.append(mapInfo)
    if not infoList:
        return
    regainData = ChPyNetSendPack.tagMCFBCntRegainRemainTime()
    regainData.Clear()
    regainData.InfoList = infoList
    regainData.Cnt = len(regainData.InfoList)
    NetPackCommon.SendFakePack(curPlayer, regainData)
    return
def SetIsHelpFight(curPlayer):
    ##设置是否助战 æ³¨æ„!需要在增加副本次数之前设置
    mapID = GameWorld.GetMap().GetMapID()
    mapID = GetRecordMapID(mapID)
    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
    maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
    if enterCnt >= maxCnt:
        GameWorld.GetGameFB().SetPlayerGameFBDict(curPlayer.GetID(), ChConfig.FBPlayerDict_IsHelpFight, 1)
        return True
    return False
def GetIsHelpFight(curPlayer):
    ##获取是否助战
    return GameWorld.GetGameFB().GetPlayerGameFBDictByKey(curPlayer.GetID(), ChConfig.FBPlayerDict_IsHelpFight)
def FBOnWeek(curPlayer, onWeekType):
    
@@ -1880,32 +1656,19 @@
        buyCnt = curPlayer.NomalDictGetProperty(buyCntKey)
        PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)
        
        # æ‰¾å›žæ¬¡æ•°
        recoverCntKey = ChConfig.Def_Player_Dict_RecoverFbCnt % mapID
        recoverCnt = curPlayer.NomalDictGetProperty(recoverCntKey)
        PlayerControl.NomalDictSetProperty(curPlayer, recoverCntKey, 0)
        # ç‰©å“å¢žåŠ æ¬¡æ•°
        itemAddCntKey = ChConfig.Def_Player_Dict_ItemAddFbCnt % mapID
        itemAddCnt = curPlayer.NomalDictGetProperty(itemAddCntKey)
        PlayerControl.NomalDictSetProperty(curPlayer, itemAddCntKey, 0)
        
        # æ—¶é—´æ¢å¤æ¬¡æ•°
        regainFBCntKey = ChConfig.Def_Player_Dict_RegainFbCnt % mapID
        regainFBCnt = curPlayer.NomalDictGetProperty(regainFBCntKey)
        PlayerControl.NomalDictSetProperty(curPlayer, regainFBCntKey, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainStartTime % mapID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FbCntRegainTotalTime % mapID, 0)
        GameWorld.DebugLog("    é‡ç½®:mapID=%s,dayTimes=%s,buyCnt=%s,recoverCnt=%s,itemAddCnt=%s,regainFBCnt=%s,maxCnt=%s,enterCnt=%s"
                           % (mapID, dayTimes, buyCnt, recoverCnt, itemAddCnt, regainFBCnt, maxCnt, enterCnt))
        GameWorld.DebugLog("    é‡ç½®:mapID=%s,dayTimes=%s,buyCnt=%s,itemAddCnt=%s,maxCnt=%s,enterCnt=%s"
                           % (mapID, dayTimes, buyCnt, itemAddCnt, maxCnt, enterCnt))
        
        mapIDInfo.append(mapID)
        
    if mapIDInfo:
        Sync_FBPlayerFBInfoData(curPlayer, mapIDInfo)
        Sync_FBPlayerFBBuyCount(curPlayer, mapIDInfo)
        NotifyFBCntRegainInfo(curPlayer, mapIDInfo)
    
    return
@@ -1915,27 +1678,7 @@
def FBOnLogin(curPlayer):
    FBLogic.OnFBPlayerOnLogin(curPlayer)
    Sync_FBPlayerFBInfoData(curPlayer)
    SyncFBEnterTick(curPlayer)
    Sync_FBPlayerFBBuyCount(curPlayer)
    #PlayerFB.Sync_PubFBSweepData(curPlayer)
    NotifyFBCntRegainInfo(curPlayer)
    #判断副本里离线超过一定时间则退出副本
    CheckFBPlayerOffine(curPlayer)
    return
def CheckFBPlayerOffine(curPlayer):
    mapid = curPlayer.GetMapID()
    ipyData = GetFBIpyData(mapid)
    if not ipyData:
        return
    OfflineTime = ipyData.GetOfflineTime()
    if not OfflineTime:
        return
    leaveServerSecond = PlayerControl.GetPlayerLeaveServerSecond(curPlayer) #离线时间秒
    if leaveServerSecond >= OfflineTime:
        GameWorld.DebugLog('判断副本里离线超过一定时间则退出副本 leaveServerSecond=%s'%leaveServerSecond)
        PlayerControl.PlayerLeaveFB(curPlayer)
    return
#//A5 75 è´­ä¹°å‰¯æœ¬è¿›å…¥æ¬¡æ•°#tagCMBuyEnterCount
@@ -1996,183 +1739,12 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_BuyFbCntDay % mapID, hasBuyCnt + 1)
    Sync_FBPlayerFBBuyCount(curPlayer, [mapID])
    PlayerControl.NotifyCode(curPlayer, 'FBEnterTimeBuy', [mapID])
    OnFBCountChangeEffectRecoverCount(curPlayer, mapID)
    if mapID == ChConfig.Def_FBMapID_Love:
        coupleID = PlayerControl.GetCoupleID(curPlayer)
        if coupleID:
            addItemList = IpyGameDataPY.GetFuncEvalCfg("LoveFB", 3)
            paramList = [curPlayer.GetPlayerName()]
            PlayerControl.SendMailByKey("BuyLoveFBCntCoupleMail", [coupleID], addItemList, paramList)
    return
#---------------------------------------------------------------------
## å‰¯æœ¬å¼€å¯æç¤º(几分钟)
#  @param openTimeList å¼€å¯æ—¶é—´åˆ—表[(开启时钟,开启分钟), ]
#  @param notifyMsg æç¤ºmark
#  @param notifyTimeList æç¤ºæ—¶é—´åˆ—表
#  @param mergeMinOSD è¯¥æç¤ºé’ˆå¯¹è·¨æœå­æœæœ‰æ•ˆçš„æœ€å°å¼€æœå¤©, >=0时有限制
#  @param mergeMaxOSD è¯¥æç¤ºé’ˆå¯¹è·¨æœå­æœæœ‰æ•ˆçš„æœ€å¤§å¼€æœå¤©, >=0时有限制
#  @param mergeMapInfo è¯¥æç¤ºæ‰€å±žçš„跨服活动地图信息, ä¸»è¦ç”¨äºŽä¸åŒå­æœå¯¹åº”所跨的活动地图ID
#  @return None
def FBOpenNotify(openTimeList, notifyMsg, notifyTimeList, mapID = 0, mergeMinOSD=-1,
                 mergeMaxOSD=-1, mergeMapInfo=[]):
    # åªåœ¨ç¬¬ä¸€çº¿ä¸­æç¤º
    if GameWorld.GetGameWorld().GetCurGameWorldIndex() != 0 or not notifyTimeList:
        return
    curTime = datetime.datetime.today()
    nextTime = curTime + datetime.timedelta(hours=1)
    curYear, curMonth, curDay, curHour = curTime.year, curTime.month, curTime.day, curTime.hour
    nextYear, nextMonth, nextDay, nextHour = nextTime.year, nextTime.month, nextTime.day, nextTime.hour
    startTimeStrFormat = "%s-%s-%s %s:%s:%s"
    # éœ€è¦æç¤ºçš„æœ€å¤§åˆ†é’Ÿ
    maxNotifyMinute = max(notifyTimeList)
    remaindMinute = -1
    for hour, minute in openTimeList:
        # å½“前小时的和下一个小时才有可能需要提示
        if hour not in [curHour, nextHour]:
            continue
        # èŽ·å–æœ¬æ¬¡æ¯”è¾ƒçš„å¼€å¯æ—¶é—´
        if hour == curHour:
            startTimeStr = startTimeStrFormat % (curYear, curMonth, curDay, hour, minute, "00")
        else:
            startTimeStr = startTimeStrFormat % (nextYear, nextMonth, nextDay, hour, minute, "00")
        # å­—符串转化为datetime
        startTime = datetime.datetime.strptime(startTimeStr, ChConfig.TYPE_Time_Format)
        # è¿˜å‰©å¤šå°‘时间开启
        remainTime = startTime - curTime
        # è®¡ç®—剩余秒数
        seconds = remainTime.seconds
        # è®¡ç®—剩余分钟,提前一秒通知
        remaindMinute = (seconds - 1) / 60 + 1
        if 0 < remaindMinute <= maxNotifyMinute:
            break
    # åœ¨é…ç½®ä¸­éœ€è¦æç¤ºï¼Œä¸”未提示过
    if remaindMinute in notifyTimeList \
    and remaindMinute != GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Map_FBDict_NotifyOpen):
        if mapID > 0:
            msgParamList = [remaindMinute, mapID]
        else:
            msgParamList = [remaindMinute]
        PlayerControl.WorldNotify(0, notifyMsg, msgParamList, 0, mergeMinOSD, mergeMaxOSD, mergeMapInfo)
        GameWorld.GetGameFB().SetGameFBDict(ChConfig.Map_FBDict_NotifyOpen, remaindMinute)
    return
## åˆ¤æ–­å½“前是否时副本进场时间(准备时间)
#  @param openTimeList å¼€å¯æ—¶é—´åˆ—表[(开启时钟,开启分钟), ]
#  @param prepareSeconds å‡†å¤‡æ—¶é—´ï¼ˆç§’)
#  @return bool
def CheckIsFBPrepareTime(openTimeList, prepareSeconds):
    curTime = GameWorld.GetCurrentTime()
    prevTime = curTime - datetime.timedelta(hours=1)
    curYear, curMonth, curDay, curHour = curTime.year, curTime.month, curTime.day, curTime.hour
    prevYear, prevMonth, prevDay, prevHour = prevTime.year, prevTime.month, prevTime.day, prevTime.hour
    startTimeStrFormat = "%s-%s-%s %s:%s:%s"
    for hour, minute in openTimeList:
        # å½“前小时的和上一小时才有可能时进入时间
        if hour not in [curHour, prevHour]:
            continue
        # èŽ·å–æœ¬æ¬¡æ¯”è¾ƒçš„å¼€å¯æ—¶é—´
        if hour == curHour:
            startTimeStr = startTimeStrFormat % (curYear, curMonth, curDay, hour, minute, "00")
        else:
            startTimeStr = startTimeStrFormat % (prevYear, prevMonth, prevDay, hour, minute, "00")
        # å­—符串转化为datetime
        startTime = datetime.datetime.strptime(startTimeStr, ChConfig.TYPE_Time_Format)
        # è·å¼€å§‹æ—¶é—´çš„æ—¶é—´å·®
        pastTime = curTime - startTime
        # æ¢ç®—成秒数
        pastSeconds = pastTime.seconds
        # å¦‚果在规定准备秒数内,则返回True
        if 0 <= pastSeconds <= prepareSeconds:
            return True
    return False
## èŽ·å–çŽ©å®¶æ‰€åœ¨å‰¯æœ¬åŒºåŸŸç¦åˆ©å€å€¼
#  @param curPlayer çީ家
#  @return å€å€¼-默认为1
def GetAreaRewardMultiple(curPlayer):
    return max(1, curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AreaRewardMultiple))
## è®¾ç½®çŽ©å®¶æ‰€åœ¨å‰¯æœ¬åŒºåŸŸç¦åˆ©å€å€¼
#  @param curPlayer çީ家
#  @param value æ›´æ–°å€å€¼
#  @return
def SetAreaRewardMultiple(curPlayer, value):
    curPlayer.SetDict(ChConfig.Def_PlayerKey_AreaRewardMultiple, value)
    return
## æ£€æŸ¥æ˜¯å¦è¿›å…¥å‰¯æœ¬CD中
#  @param curPlayer çީ家
#  @param mapID
#  @return True-CD中,不可进入;False-非CD中,可进入
def CheckIsEnterCD(curPlayer, mapID):
    return GetFBEnterCD(curPlayer, mapID) > 0
## èŽ·å–è¿›å…¥å‰¯æœ¬CD时间
#  @param curPlayer çީ家
#  @param mapID
#  @return <=0 ä»£è¡¨æ²¡æœ‰CD, >0表示还剩下的CD tick
def GetFBEnterCD(curPlayer, mapID):
    mapID = GetRecordMapID(mapID)
    enterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 1)
    if mapID not in enterCDDict:
        return 0
    lvLimitDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 3)
    if mapID in lvLimitDict:
        if curPlayer.GetLV() >= lvLimitDict[mapID]:
            return 0
    cdTick = enterCDDict[mapID]
    lastEnterTick = GetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID)
    if not lastEnterTick:
        return 0
    timeNum = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
    passTick = max(0, timeNum - lastEnterTick)
    curCDTick = max(0, cdTick - passTick)
    if curCDTick > 0:
        GameWorld.DebugLog("副本进入CD中!mapID=%s,timeNum=%s,lastEnterTick=%s,passTick=%s,剩余=%s"
                           % (mapID, timeNum, lastEnterTick, passTick, curCDTick))
    return curCDTick
## æ›´æ–°çŽ©å®¶è¿›å…¥å‰¯æœ¬æ—¶é—´
#  @param curPlayer çީ家
#  @param tick æ›´æ–°å€¼
#  @return
def UpdateFBEnterTick(curPlayer):
    mapID = GameWorld.GetMap().GetMapID()
    mapID = GetRecordMapID(mapID)
    enterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 1)
    if mapID not in enterCDDict:
        return
    timeNum = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
    SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, timeNum)
    GameWorld.DebugLog("UpdateFBEnterTick mapID=%s,timeNum=%s" % (mapID, timeNum))
    SyncFBEnterTick(curPlayer, mapID)
    return
## èŽ·å–è®°å½•å€¼çš„mapID
@@ -2234,48 +1806,6 @@
        
    return GeneralTrainMapIDList
def GetClientCustomScene():
    ## èŽ·å–å‰ç«¯è‡ªå®šä¹‰å‰¯æœ¬åœºæ™¯
    mapIDList = GetGeneralTrainMapIDList()
    return mapIDList + ChConfig.ClientCustomSceneList
## åŒæ­¥è¿›å…¥å‰¯æœ¬æ—¶é—´
#  @param curPlayer çީ家
#  @param syncMapID åŒæ­¥çš„地图,默认0为全部
#  @return None
def SyncFBEnterTick(curPlayer, syncMapID=0):
    enterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 1)
    if not enterCDDict:
        return
    timeNum = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
    enterList = ChPyNetSendPack.tagMCFBEnterTickList()
    enterList.Clear()
    enterList.EnterTickList = []
    for mapID in enterCDDict.keys():
        if syncMapID not in [0, mapID]:
            continue
        lastEnterTick = GetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID)
        # ä¿®æ­£å‰¯æœ¬CD时间
        if timeNum < lastEnterTick:
            SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, timeNum)
            lastEnterTick = timeNum
            GameWorld.DebugLog("修正玩家副本CD时间 mapID=%s,timeNum=%s" % (mapID, timeNum), curPlayer.GetPlayerID())
        enterTickObj = ChPyNetSendPack.tagMCFBEnterTick()
        enterTickObj.Clear()
        enterTickObj.MapID = mapID
        enterTickObj.LastEnterTick = lastEnterTick#max(enterCDDict.get(mapID) - (timeNum - lastEnterTick), 0)
        enterList.EnterTickList.append(enterTickObj)
    enterList.Cnt = len(enterList.EnterTickList)
    NetPackCommon.SendFakePack(curPlayer, enterList)
    return
## é€šçŸ¥ä¸ªäººé€šç”¨å‰¯æœ¬ä¿¡æ¯
#  @param curPlayer: çŽ©å®¶å®žä¾‹
#  @param runTime: å·²ç»è¿›è¡Œæ—¶é—´
@@ -2300,7 +1830,7 @@
        mapInfo.FBID = mID
        mapInfo.EnterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mID)
        mapInfo.EnterCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % mID)
        mapInfo.RecoverCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mID)
        mapInfo.RecoverCnt = 0
        mapInfo.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mID)
        mapInfo.PassLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mID)
        
@@ -2313,8 +1843,6 @@
        
    NetPackCommon.SendFakePack(curPlayer, fbInfoData)
    return
#// A3 BD é€šçŸ¥çŽ©å®¶è´­ä¹°å‰¯æœ¬è¿›å…¥æ¬¡æ•° #tagMCBuyEnterInfo
#
@@ -2394,100 +1922,6 @@
            group.extend(tmpList[gi])
            
    return groupList
def ClearAreaRewardRecord(playerID):
    ##清除战场区域福利记录
    gameWorld = GameWorld.GetGameWorld()
    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetCnt%playerID, 0)
    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExp%playerID, 0)
    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExpPoint%playerID, 0)
    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID, 0)
    gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetTechPoint%playerID, 0)
    return
##战场区域福利逻辑
# @param tick æ—¶é—´æˆ³
# @return æ— æ„ä¹‰
def DoLogicAreaReward(cfgKeyName, tick, needAlive=False):
    gameFB = GameWorld.GetGameFB()
    gameWorld = GameWorld.GetGameWorld()
    rewardInterval = IpyGameDataPY.GetFuncCfg(cfgKeyName, 2)
    rewardFormatDict = IpyGameDataPY.GetFuncEvalCfg(cfgKeyName)
    getCntLimit = IpyGameDataPY.GetFuncCfg(cfgKeyName, 3)
    lastAwardTick = gameFB.GetGameFBDictByKey(ChConfig.Map_FBDict_LastAreaRewardTick)
    if tick - lastAwardTick < rewardInterval:
        return
    gameFB.SetGameFBDict(ChConfig.Map_FBDict_LastAreaRewardTick, tick)
    GameWorld.DebugLog("给战场福利 tick=%s,needAlive=%s" % (tick, needAlive))
    # æ›´æ–°çŽ©å®¶æˆ˜åœºæŒç»­æ—¶é—´
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if not curPlayer:
            continue
        if needAlive and GameObj.GetHP(curPlayer) <= 0:
            continue
        playerID = curPlayer.GetPlayerID()
        if getCntLimit:
            getCnt = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetCnt%playerID)
            if getCnt >= getCntLimit:
                continue
            gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetCnt%playerID, getCnt + 1)
        multiple = GetAreaRewardMultiple(curPlayer) # ç¦åˆ©å€æ•°
        reLV = curPlayer.GetLV()
        reExp = PlayerControl.GetPlayerReExp(curPlayer)
        playerControl = PlayerControl.PlayerControl(curPlayer)
        if "Exp" in rewardFormatDict:
            addExp = eval(rewardFormatDict["Exp"])
            addExp = playerControl.AddExp(addExp)
            if addExp > 0:
                totalExp = GetFBAreaRewardExp(gameWorld, playerID) + addExp
                gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExp%playerID, totalExp % ChConfig.Def_PerPointValue)
                gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetExpPoint%playerID, totalExp / ChConfig.Def_PerPointValue)
        if "ZhenQi" in rewardFormatDict:
            addZhenQi = eval(rewardFormatDict["ZhenQi"])
            PlayerControl.PlayerAddZhenQi(curPlayer, addZhenQi, True, True, "FB")
            totalZhenQi = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID)
            totalZhenQi += addZhenQi
            gameWorld.SetGameWorldDict(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID, totalZhenQi)
        #GameWorld.DebugLog("    æˆ˜åœºç¦åˆ© å€åŒº=%s,reLV=%s,reExp=%s,addExp=%s,addZQ=%s,totalExp=%s,totalZQ=%s"
        #                   % (multiple, reLV, reExp, addExp, addZhenQi, totalExp, totalZhenQi), playerID)
    return
def GetFBAreaRewardExp(gameWorld, playerID):
    exp = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetExp%playerID)
    expPoint = gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetExpPoint%playerID)
    return expPoint * ChConfig.Def_PerPointValue + exp
def GetFBAreaRewardZhenQi(gameWorld, playerID):
    return gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetZhenQiTotal%playerID)
def GetFBAreaRewardTechPoint(gameWorld, playerID):
    return gameWorld.GetGameWorldDictByKey(ChConfig.Map_Player_AreaReward_GetTechPoint%playerID)
def NotifyCopyMapPlayerFBHelp(tick, fbHelpFunc, interval=10000, befLogicFunc=None):
    gameFB = GameWorld.GetGameFB()
    lastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NotifyFBHelpTick)
    if tick - lastTick < interval:
        return
    gameFB.SetGameFBDict(ChConfig.Def_FB_NotifyFBHelpTick, tick)
    if befLogicFunc:
        befLogicFunc(tick)
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if not curPlayer:
            continue
        fbHelpFunc(curPlayer, tick)
    return
def GetCrossDynamicLineMapZoneID():
    ## èŽ·å–è·¨æœåŠ¨æ€çº¿è·¯åœ°å›¾æœ¬çº¿è·¯è·¨æœåˆ†åŒº
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_GeneralTrain.py
@@ -17,10 +17,8 @@
import FBCommon
import GameWorld
import PlayerControl
import IpyGameDataPY
import ItemControler
import NPCCommon
import ChConfig
## æ˜¯å¦èƒ½å¤Ÿé€šè¿‡æ´»åŠ¨æŸ¥è¯¢è¿›å…¥
@@ -49,30 +47,7 @@
## æ˜¯å¦éœ€è¦åšè¿›å…¥å‰¯æœ¬é€šç”¨æ£€æŸ¥æ¡ä»¶é€»è¾‘,默认需要检查
def OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID):
    ## è¿›è¡Œä¸­çš„不需要重复检查,防止断线重连被禁止进入
    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) == ChConfig.CustomMapStep_Fight:
        GameWorld.DebugLog("通用养成副本已经在进行中,本次进入不需要重新检查! mapID=%s,lineID=%s" % (mapID, lineID))
        return False
    return True
## å®¢æˆ·ç«¯è¿›å…¥è‡ªå®šä¹‰åœºæ™¯
def OnEnterCustomScene(curPlayer, mapID, lineID):
    return
## åˆ¤æ–­å¯å¦å¬å”¤æœ¨æ¡©æ€ª
def OnCanSummonPriWoodPile(curPlayer, mapID, lineID, npcID, count):
    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
        FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Fight)
    npcIDList = GetGeneralTrainNPCIDList(mapID, lineID)
    if not npcIDList or npcID not in npcIDList:
        GameWorld.DebugLog("通用养成副本该NPC不能召唤! mapID=%s,lineID=%s,npcID=%s not in %s" % (mapID, lineID, npcID, npcIDList))
        return False
    return True
def OnCustomSceneProcess(curPlayer, mapID, lineID, tick):
    return
    
def GetGeneralTrainNPCIDList(mapID, lineID):
    npcIDList = []
@@ -89,41 +64,6 @@
    if not ipyData:
        return 0
    return ipyData.GetBossNPCID()
## è‡ªå®šä¹‰åœºæ™¯å‰¯æœ¬å‡»æ€NPC
def DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID):
    npcID = curNPC.GetNPCID()
    bossID = GetGeneralTrainBossID(mapID, lineID)
    GameWorld.DebugLog("击杀副本NPC: mapID=%s,lineID=%s,npcID=%s,bossID=%s" % (mapID, lineID, npcID, bossID), curPlayer.GetPlayerID())
    if npcID != bossID:
        return
    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
        return
    ipyData = IpyGameDataPY.GetIpyGameData('FBGeneralTrain', mapID, lineID)
    if not ipyData:
        return
    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
    if lineID > passLineID:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, lineID)
    #增加进入次数
    FBCommon.AddEnterFBCount(curPlayer, mapID)
    giveItemList = ipyData.GetPassAwardItemList()
    GameWorld.DebugLog("通用养成副本过关! mapID=%s,lineID=%s,giveItemList=%s" % (mapID, lineID, giveItemList))
    NPCCommon.DoGiveItemByVirtualDrop(curPlayer, giveItemList, bossID)
    FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over)
    isPass = 1
    overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
    return
## å¯å¦æ‰«è¡
def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/×Ô¶¨Ò峡¾°ËµÃ÷.txt
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -794,115 +794,6 @@
        
    return
#// B4 0F å›žæ”¶ç§æœ‰ä¸“属木桩怪 #tagCMRecyclePriWoodPile
#
#struct    tagCMRecyclePriWoodPile
#{
#    tagHead        Head;
#    DWORD        ObjID;
#};
def OnRecyclePriWoodPile(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    objID = clientData.ObjID
    curNPC = GameWorld.FindNPCByID(objID)
    if not curNPC:
        return
    if curNPC.GetType() not in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
        return
    summonPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_PriWoodPilePlayerID)
    if curPlayer.GetPlayerID() != summonPlayerID:
        #GameWorld.DebugLog("非玩家私有木桩...")
        return
    SetDeadEx(curNPC)
    return
#// B4 0C å¬å”¤ç§æœ‰ä¸“属木桩怪 #tagCMSummonPriWoodPile
#
#struct    tagCMSummonPriWoodPile
#{
#    tagHead        Head;
#    DWORD        NPCID;
#    BYTE        Count;    //默认1个,最多5个
#    DWORD        HP;    //默认0取最大值,其中一个血量数值大于0则用指定血量
#    DWORD        HPEx;    //默认0取最大值,其中一个血量数值大于0则用指定血量
#};
def OnSummonPriWoodPile(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    npcID = clientData.NPCID
    count = clientData.Count
    hp = clientData.HP
    hpEx = clientData.HPEx
    SummonPriWoodPile(curPlayer, npcID, count, hp, hpEx)
    return
def SummonPriWoodPile(curPlayer, npcID, count, hp=0, hpEx=0):
    ''' å¬å”¤ç§æœ‰ä¸“属木桩怪
    '''
    mapID = PlayerControl.GetCustomMapID(curPlayer)
    lineID = PlayerControl.GetCustomLineID(curPlayer)
    if mapID:
        if not FBLogic.OnCanSummonPriWoodPile(curPlayer, mapID, lineID, npcID, count):
            GameWorld.ErrLog("无法召唤木桩怪!mapID=%s,lineID=%s,npcID=%s,count=%s" % (mapID, lineID, npcID, count))
            return
    if count != 1:
        hp, hpEx = 0, 0 # æŒ‡å®šè¡€é‡çš„æš‚仅适用于单只的
    playerID = curPlayer.GetPlayerID()
    if playerID not in PyGameData.g_playerPriWoodPileNPCDict:
        PyGameData.g_playerPriWoodPileNPCDict[playerID] = []
    playerPriWoodNPCList = PyGameData.g_playerPriWoodPileNPCDict[playerID]
    maxCount = 3
    nowCount = len(playerPriWoodNPCList)
    summonCount = min(count, maxCount - nowCount)
    GameWorld.DebugLog("召唤木桩: npcID=%s,count=%s,maxCount=%s,nowCount=%s,summonCount=%s,hp=%s,hpEx=%s"
                       % (npcID, count, maxCount, nowCount, summonCount, hp, hpEx))
    if summonCount <= 0:
        return
    npcManager = GameWorld.GetNPCManager()
    for _ in xrange(summonCount):
        #summonNPC = curPlayer.SummonNewNPC()
        summonNPC = npcManager.AddPlayerSummonNPC()
        #设置召唤兽基础信息
        summonNPC.SetNPCTypeID(npcID)
        summonNPC.SetSightLevel(curPlayer.GetSightLevel())
        #初始化
        InitNPC(summonNPC)
        #玩家召唤兽列表添加召唤兽,召唤兽添加主人
        #summonNPC.SetOwner(curPlayer)
        summonNPC.SetDict(ChConfig.Def_NPC_Dict_PriWoodPilePlayerID, playerID)
        #将召唤兽召唤出来
        #玩家周围随机出生点
        #技能召唤坐标 ChConfig.Def_SummonAppearDist
        summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), 3)
        summonNPC.Reborn(summonPos.GetPosX(), summonPos.GetPosY(), False)
        NPCControl(summonNPC).ResetNPC_Init(isReborn=True)
        if hp or hpEx:
            hpTotal = hpEx * ShareDefine.Def_PerPointValue + hp
            GameObj.SetHP(summonNPC, hpTotal)
            GameObj.SetMaxHP(summonNPC, hpTotal)
        summonNPC.NotifyAppear() # æœ€ç»ˆç»Ÿä¸€é€šçŸ¥NPC出现
        playerPriWoodNPCList.append(summonNPC)
    return
def ClearPriWoodPile(curPlayer):
    ## æ¸…除私有木桩
    playerID = curPlayer.GetPlayerID()
    if playerID not in PyGameData.g_playerPriWoodPileNPCDict:
        return
    playerPriWoodNPCList = PyGameData.g_playerPriWoodPileNPCDict.pop(playerID)
    for summonNPC in playerPriWoodNPCList:
        if not summonNPC:
            continue
        SetDeadEx(summonNPC)
    return
## è®¾ç½®npc死亡及自身处理(请不要将游戏逻辑加在此函数中)
#  @param curNPC:npc实例
#  @return 
@@ -4049,44 +3940,8 @@
        DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData, crossCollectOK=True)
    return
#// A2 34 è‡ªå®šä¹‰åœºæ™¯ä¸­èŽ·å–é‡‡é›†å¥–åŠ± #tagCMGetCustomSceneCollectAward
#
#struct    tagCMGetCustomSceneCollectAward
#{
#    tagHead        Head;
#    DWORD        NPCID;    //采集的NPCID
#};
def OnGetCustomSceneCollectAward(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    npcID = clientData.NPCID
    if not curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        GameWorld.ErrLog("非自定义场景中,无法获取定义采集奖励!", playerID)
        return
    mapID = PlayerControl.GetCustomMapID(curPlayer)
    lineID = PlayerControl.GetCustomLineID(curPlayer)
    GameWorld.Log("前端场景采集: mapID=%s,lineID=%s,npcID=%s" % (mapID, lineID, npcID), playerID)
    if not mapID:
        GameWorld.ErrLog("无自定义场景地图ID,不允许采集!", playerID)
        return
    if not FBLogic.OnCustomSceneCollectOK(curPlayer, mapID, lineID, npcID):
        GameWorld.ErrLog("自定义场景地图不允许采集! mapID=%s,lineID=%s,npcID=%s" % (mapID, lineID, npcID), playerID)
        return
    collectNPCIpyData = IpyGameDataPY.GetIpyGameDataNotLog("CollectNPC", npcID)
    if collectNPCIpyData:
        DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData)
    return
def DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData, collectCnt=1, crossCollectOK=False, isSweep=False):
    return
## é‡‡é›†ç»“果同步
#  @param None
#  @param None
def SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, syncItemInfoList, collectNPCID=0):
    return #暂不同步
def SyncCollNPCTime(curPlayer, npcIDList=None):
    ## åŒæ­¥é‡‡é›†NPC功能号采集次数
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -52,7 +52,6 @@
import PlayerSuccess
import PlayerDienstgrad
import PlayerFreeGoods
import PlayerRecover
import PlayerCrossRealmPK
import PlayerCrossChampionship
import GameFuncComm
@@ -257,9 +256,6 @@
    
    if PlayerControl.GetCrossMapID(curPlayer):
        CrossRealmPlayer.DoExitCrossRealm(curPlayer)
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        PlayerFB.DoExitCustomScene(curPlayer)
        
    PetControl.DoLogic_PetLoadMapOK(curPlayer)
    
@@ -585,8 +581,6 @@
    #PlayerDienstgrad.RefreshBillBoardDienstgrad(curPlayer)
    # ç§°å·
    PlayerDienstgrad.Sync_AllDienstgradOnLogin(curPlayer)
    # èµ„源找回OnLogin
    PlayerRecover.RecoverOnLogin(curPlayer)
    
    # Ê±×°
    PlayerCoat.OnLogin_Coat(curPlayer)
@@ -1027,16 +1021,7 @@
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    if curPlayer.GetSight() != 0:
        PlayerControl.SetSight(curPlayer, 0)
    #刷新玩家的视野
    #if not GameWorld.IsCrossServer() and (PlayerControl.GetCrossMapID(curPlayer) or PlayerControl.GetCustomMapID(curPlayer)):
    #    GameWorld.DebugLog("===登录本服地图时,处于跨服或自定义场景状态,不刷新视野!", curPlayer.GetPlayerID())
    #    PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    #elif not GameWorld.IsCrossServer():
    #    realmDifficulty = PlayerControl.GetMapRealmDifficulty(curPlayer)
    #    if realmDifficulty:
    #        GameWorld.DebugLog("===登录本服地图时,处于境界难度地图,自动设置难度! realmDifficulty=%s" % realmDifficulty, curPlayer.GetPlayerID())
    #        PlayerControl.SetRealmDifficulty(curPlayer, realmDifficulty)
    PlayerState.ChangePlayerSigh(curPlayer, tick)
    
    if GameWorld.IsCrossServer():
@@ -1379,16 +1364,7 @@
        PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    if curPlayer.GetSight() != 0:
        PlayerControl.SetSight(curPlayer, 0)
    #刷新自己的视野
    #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())
    #elif not GameWorld.IsCrossServer():
    #    realmDifficulty = PlayerControl.GetMapRealmDifficulty(curPlayer)
    #    if realmDifficulty:
    #        GameWorld.DebugLog("===本服LoadMapOK时玩家处于境界难度地图,自动设置难度!realmDifficulty=%s" % realmDifficulty, curPlayer.GetPlayerID())
    #        PlayerControl.SetRealmDifficulty(curPlayer, realmDifficulty)
    curPlayer.RefreshView()
    curPlayer.SetVisible(True)
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
@@ -620,13 +620,8 @@
    return
def GetMapCanOutPet(curPlayer):
    ## æ£€æŸ¥æœ¬åœ°å›¾å¯å¦å‡ºæˆ˜å® ç‰©ï¼Œæ”¯æŒå‰ç«¯è‡ªå®šä¹‰åœºæ™¯
    customMapID = PlayerControl.GetCustomMapID(curPlayer)
    if customMapID:
        ipyMapData = IpyGameDataPY.GetIpyGameData("ChinMap", customMapID)
        canOutPet = True if ipyMapData and ipyMapData.GetCanOutPet() else False
    else:
        canOutPet = GameWorld.GetMap().GetMapCanOutPet()
    ## æ£€æŸ¥æœ¬åœ°å›¾å¯å¦å‡ºæˆ˜å® ç‰©
    canOutPet = GameWorld.GetMap().GetMapCanOutPet()
    return canOutPet
#---------------------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -416,10 +416,6 @@
        NotifyCode(curPlayer, "CrossMap10") 
        return False
    
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        GameWorld.Log("客户端自定义场景下无法传送!", curPlayer.GetPlayerID())
        return False
    return True
@@ -1002,7 +998,6 @@
        CrossPlayerData.ClearCrossSyncDataCache(curPlayer)
    #清除地图玩家缓存
    PyGameData.g_playerReqEnterFBEx.pop(playerID, None)
    NPCCommon.ClearPriWoodPile(curPlayer)
    #移除地图缓存的境界难度玩家ID信息
    for playerIDList in PyGameData.g_realmDiffPlayerDict.values():
        if playerID in playerIDList:
@@ -1535,12 +1530,6 @@
        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:您当前所处的状态不能进行传送!
@@ -4217,7 +4206,7 @@
        fightExpRate += curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TeamExpRate) # ç»„队
    
    #地图多倍经验加成,默认是1倍不加成
    mapExpAddMultiple = max(0, FBCommon.GetAreaRewardMultiple(curPlayer) - 1)
    mapExpAddMultiple = 0
    fightExpRate += mapExpAddMultiple * ChConfig.Def_MaxRateValue
    
    if totalExpRate != fightExpRate:
@@ -4436,16 +4425,6 @@
    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亿
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -42,7 +42,6 @@
import PlayerCrossRealmPK
import PlayerCrossChampionship
import PlayerPet
import PlayerRecover
import PlayerFamilyRedPacket
import OpenServerCampaign
import PlayerCostRebate
@@ -312,8 +311,6 @@
    # ç‰¹æ®Šæ—¶é—´ç‚¹X点过天
    elif onEventType == ShareDefine.Def_OnEventTypeEx:
        PlayerHero.PlayerOnDay(curPlayer)
        # èµ„源找回
        PlayerRecover.RecoverOnDay(curPlayer)
        # ä»™ç›Ÿè¿‡å¤©
        PlayerFamily.PlayerOnDay(curPlayer)
        # é‡ç½®ç‰©å“æ¯æ—¥ä½¿ç”¨æ¬¡æ•°
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
@@ -23,28 +23,19 @@
#------------------------------------------------------------------------------ 
#"""Version = 2016-12-02 11:00"""
#------------------------------------------------------------------------------ 
import ReadChConfig
import IPY_GameWorld
import PlayerControl
import GameWorld
import FBCommon
import ChConfig
import FBLogic
import ChPyNetSendPack
import NetPackCommon
import PlayerSuccess
import ItemCommon
import IpyGameDataPY
import ShareDefine
import GameFuncComm
import SkillShell
import PyGameData
import PetControl
import NPCCommon
import GameObj
import time
import math
#---------------------------------------------------------------------
def OnLogin(curPlayer):
    return
@@ -59,180 +50,6 @@
    actionType = clientData.ActionType # è¡Œä¸ºç±»åž‹
    actionInfo = clientData.ActionInfo # è¡Œä¸ºä¿¡æ¯
    FBLogic.DoFBAction(curPlayer, actionType, actionInfo, tick)
    return
## A2 10 æ¸…除副本CD#tagCMClearFBCD
#  @param playerIndex çŽ©å®¶ç´¢å¼•
#  @param clientData å®¢æˆ·ç«¯å°åŒ…
#  @param tick æ—¶é—´
#  @return None
def OnClearFBCD(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    mapID = clientData.MapID # mapID
    GameWorld.DebugLog("OnClearFBCD mapID=%s" % mapID)
    if not mapID:
        return
    enterCDTick = FBCommon.GetFBEnterCD(curPlayer, mapID)
    if enterCDTick <= 0:
        GameWorld.DebugLog("    CD时间已过,不需要清除, cdTick=%s" % enterCDTick)
        return
    clearEnterCDDict = IpyGameDataPY.GetFuncEvalCfg('FBEnterCD', 2)
    if mapID not in clearEnterCDDict:
        return
    costMoney = clearEnterCDDict[mapID]
    costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costMoney)
    if not costMoneyList:
        return
    second = enterCDTick # å‚æ•°ç§’
    # æ‰£é™¤æ¶ˆè€—
    infoDict = {"MapID":mapID, "CDSecond":second}
    for moneyType, moneyCnt in costMoneyList:
        if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_ClearFBCD, infoDict):
            return
    GameWorld.DebugLog("   mapID=%s æ¸…除副本CD second=%s,costMoneyList=%s"
                         % (mapID, second, costMoneyList), curPlayer.GetPlayerID())
    FBCommon.SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % mapID, 0)
    FBCommon.SyncFBEnterTick(curPlayer)
    return
#---封包开始扫荡-------------------------------------
(
PCDFB_MapIDList, # å‰¯æœ¬åœ°å›¾ID列表
PCDFB_NeedTime, # æ‰«è¡æ—¶é—´, ç§’
PCDFB_FinishTimeGold, # ç«‹å³å®Œæˆæ¶ˆè€—钻石公式
) = range(3)
## åˆ¤æ–­æ˜¯å¦å½“前公共CD副本扫荡中
def IsCurPubCDFBSweeping(curPlayer, mapID):
    sweepCfg = GetPubCDFBSweepCfg(curPlayer, mapID)
    if not sweepCfg:
        return False
    groupNum = sweepCfg[0]
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % groupNum) == mapID
## èŽ·å–å…¬å…±CD副本扫荡配置信息
def GetPubCDFBSweepCfg(curPlayer, mapID):
    PubCDFBSweepDict = ReadChConfig.GetEvalChConfig("PubCDFBSweep")
    for groupNum, sweepInfo in PubCDFBSweepDict.items():
        mapIDGroup = sweepInfo[0]
        if mapID not in mapIDGroup:
            continue
        return groupNum, sweepInfo
    return
## å¼€å§‹å…¬å…±CD副本扫荡
def __DoStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, isFinish, dataEx, groupNum, sweepInfo):
    curSweepMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % groupNum)
    if curSweepMapID > 0:
        GameWorld.DebugLog("公共CD副本扫荡中, æ— æ³•扫荡!groupNum=%s,curSweepMapID=%s"
                           % (groupNum, curSweepMapID), curPlayer.GetPlayerID())
        return
    if not FBLogic.OnStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, dataEx):
        return
    curTime = int(time.time())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_MapID % groupNum, mapID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_LineID % groupNum, lineID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Cnt % groupNum, cnt)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_DataEx % groupNum, dataEx)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Time % groupNum, curTime)
    GameWorld.DebugLog("公共CD副本开始扫荡 mapID=%s,lineID=%s,cnt=%s,dataEx=%s,groupNum=%s,curTime=%s"
                       % (mapID, lineID, cnt, dataEx, groupNum, curTime), curPlayer.GetPlayerID())
    Sync_PubFBSweepData(curPlayer, groupNum)
    return
## å®Œæˆå…¬å…±CD副本扫荡
def __DoFinishPubCDFB(curPlayer, mapID, isFinish, groupNum, sweepInfo):
    playerID = curPlayer.GetPlayerID()
    curSweepMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % groupNum)
    if curSweepMapID <= 0 or curSweepMapID != mapID:
        GameWorld.DebugLog("未扫荡 æˆ– ä¸æ˜¯å½“前正在扫荡的公共CD副本, æ— æ³•完成!curSweepMapID=%s,mapID=%s"
                           % (curSweepMapID, mapID), playerID)
        return
    sweepTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Time % groupNum)
    lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_LineID % groupNum)
    sweepCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Cnt % groupNum)
    dataEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_DataEx % groupNum)
    sweepNeedTime = sweepInfo[PCDFB_NeedTime] # å•次耗时
    finishCostGoldFormat = sweepInfo[PCDFB_FinishTimeGold]
    needTotalTime = sweepNeedTime * sweepCnt
    curTime = int(time.time())
    passTime = max(0, curTime - sweepTime)
    second = max(0, needTotalTime - passTime)
    # æ­£å¸¸å®Œæˆ
    if isFinish == 2 and second > 0:
        GameWorld.DebugLog("扫荡时间未到,无法完成,剩余%s秒, mapID=%s" % (second, mapID), playerID)
        return
    addDataDict = {"curTime":curTime, "startSweepTime":sweepTime, "sweepCnt":sweepCnt,
                   "needTotalTime":needTotalTime, "passTime":passTime, "remainSecond":second,
                   "costGold":0, "mapID":mapID, "lineID":lineID, "dataEx":dataEx, ChConfig.Def_Cost_Reason_SonKey:mapID}
    # é’»çŸ³ç«‹å³å®Œæˆ
    if isFinish == 1:
        costGold = eval(finishCostGoldFormat)
        if costGold > 0:
            addDataDict["costGold"] = costGold
            if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold,
                                          ChConfig.Def_Cost_FinishFBSweep, addDataDict):
                return
    GameWorld.DebugLog("公共CD副本扫荡完成: %s" % str(addDataDict), playerID)
    # ç»™å¥–励
    FBLogic.OnGivePubCDFBSweepPrize(curPlayer, mapID, lineID, sweepCnt, dataEx)
    # é‡ç½®æ‰«è¡æ•°æ®
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_MapID % groupNum, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_LineID % groupNum, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Cnt % groupNum, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_DataEx % groupNum, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PubCDFBS_Time % groupNum, 0)
    Sync_PubFBSweepData(curPlayer, groupNum)
    return
## åŒæ­¥å…¬å…±CD副本扫荡信息
def Sync_PubFBSweepData(curPlayer, groupNum=-1):
    PubCDFBSweepDict = ReadChConfig.GetEvalChConfig("PubCDFBSweep")
    allGroupNumList = PubCDFBSweepDict.keys()
    if groupNum == -1:
        groupNumList = allGroupNumList
    else:
        if groupNum not in allGroupNumList:
            return
        groupNumList = [groupNum]
    pubSweepData = ChPyNetSendPack.tagMCPubFBSweepData()
    pubSweepData.Clear()
    pubSweepData.SweepDatList = []
    for gNum in groupNumList:
        sweepInfo = ChPyNetSendPack.tagMCPubFBSweep()
        sweepInfo.Clear()
        sweepInfo.PubNum = gNum
        sweepInfo.FBMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_MapID % gNum)
        sweepInfo.LineID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_LineID % gNum)
        sweepInfo.SweepTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Time % gNum)
        sweepInfo.SweepCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PubCDFBS_Cnt % gNum)
        pubSweepData.SweepDatList.append(sweepInfo)
    pubSweepData.Cnt = len(pubSweepData.SweepDatList)
    NetPackCommon.SendFakePack(curPlayer, pubSweepData)
    return
#//A5 05 çŽ©å®¶å¼€å§‹å‰¯æœ¬æ‰«è¡ #tagCMBeginFBWipeOut
@@ -312,28 +129,6 @@
                    GameWorld.DebugLog("扫荡消耗道具不足, mapID=%s,lineID=%s,sweepItemID=%s,sweepCostCnt=%s" 
                                   % (mapID, lineID, sweepItemID, sweepCostCnt), curPlayer.GetPlayerID())
                    return
    #公共CD扫荡模式暂屏蔽,有需要再修改
    #===============================================================================================
    # groupNum = -1
    # sweepInfo = None
    # PubCDFBSweepDict = ReadChConfig.GetEvalChConfig("PubCDFBSweep")
    # for gNum, sInfo in PubCDFBSweepDict.items():
    #    if mapID in sInfo[PCDFB_MapIDList]:
    #        groupNum = gNum
    #        sweepInfo = sInfo
    #        break
    #
    # # å…¬å…±CD副本扫荡
    # if groupNum >= 0:
    #    if not isFinish:
    #        __DoStartPubCDFBSweep(curPlayer, mapID, lineID, cnt, isFinish, dataEx, groupNum, sweepInfo)
    #    else:
    #        __DoFinishPubCDFB(curPlayer, mapID, isFinish, groupNum, sweepInfo)
    #    return
    #===============================================================================================
    
    # å‰¯æœ¬æ˜¯å¦å¯æ‰«è¡, è¿™é‡Œåªåˆ¤æ–­å‰¯æœ¬è‡ªèº«çš„特殊条件, å…¬å…±æ¡ä»¶ä¸Šé¢å·²ç»åˆ¤æ–­
    if not FBLogic.OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, isFinish, dataEx):
@@ -359,193 +154,6 @@
        
    #扫荡结果给奖励等
    FBLogic.OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, isFinish, dataEx)
    return
#// A5 1B è´­ä¹°æŒ‘战副本精力 #tagCMBuyFBEnergy
#
#struct    tagCMBuyFBEnergy
#{
#    tagHead         Head;
#};
def OnPlayerBuyFBEnergy(playerIndex, clientData, tick):
    #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    return
## çŽ©å®¶å‰¯æœ¬åŠŸèƒ½æ—¶é—´å¤„ç†
def DoPlayerFBTimeProcess(curPlayer, tick):
    checkInterval = ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_FBTimeProcess]
    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_FBTimeProcess) < checkInterval:
        return
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FBTimeProcess, tick)
    # é¢†ä¸»éœ¸ä¸šçŽ©å®¶åŠŸèƒ½æ—¶é—´å¤„ç†
    FBCommon.RegainFBCntProcess(curPlayer)
    return
#// B1 02 é¢†å–多倍副本奖励 #tagCMGetMultiFBPrize
#
#struct    tagCMGetMultiFBPrize
#{
#    tagHead         Head;
#    DWORD        MapID;
#    WORD        LineID;
#    WORD        Percent;    // é¢å¤–奖励百分比奖励等级
#};
def OnPlayerGetMultiFBPrize(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    mapID = clientData.MapID
    lineID = clientData.LineID
    prizeExLV = clientData.Percent
    FBLogic.OnGetMultiFBPrize(curPlayer, mapID, lineID, prizeExLV)
    return
#//A5 60 é‡ç½®å‰¯æœ¬æŒ‘战次数 #tagCMResetFBJoinCnt
#
#struct tagCMResetFBJoinCnt
#{
#    tagHead        Head;
#};
def OnPlayerResetFBJoinCnt(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    return
#// B1 01 å®¢æˆ·ç«¯å‰¯æœ¬å‘送结束 #tagCMClientEndFB
#
#struct    tagCMClientEndFB
#{
#    tagHead         Head;
#    DWORD        MapID;
#    WORD        LineID;
#    DWORD        Data;    //副本数据
#};
def OnClientEndFB(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    mapID = clientData.MapID
    lineID = clientData.LineID
    data1 = clientData.Data1
    data2 = clientData.Data2
    dataList = [data1, data2]
    FBLogic.OnClientEndFB(curPlayer, mapID, lineID, dataList)
    GameWorld.DebugLog('    å®¢æˆ·ç«¯å‰¯æœ¬å‘送结束mapID=%s,lineID=%s,dataList=%s'%(mapID,lineID,dataList))
    return
#// B1 04 å®¢æˆ·ç«¯å‘送开始副本 #tagCMClientStartFB
#
#struct    tagCMClientStartFB
#{
#    tagHead         Head;
#};
def OnClientStartFB(playerIndex, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
    FBLogic.OnClientStartFB(curPlayer, tick)
    return
#// A2 31 å‰ç«¯å¼€å§‹è‡ªå®šä¹‰åœºæ™¯ #tagCMClientStartCustomScene
#
#struct    tagCMClientStartCustomScene
#{
#    tagHead        Head;
#    DWORD        MapID;
#    WORD        FuncLineID;
#};
def OnClientStartCustomScene(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    mapID = clientData.MapID
    funcLineID = clientData.FuncLineID
    DoEnterCustomScene(curPlayer, mapID, funcLineID, tick)
    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, tick):
    ## è¿›å…¥è‡ªå®šä¹‰åœºæ™¯çŠ¶æ€
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("玩家请求进入自定义场景!mapID=%s,lineID=%s" % (mapID, lineID), playerID)
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        curMapID = PlayerControl.GetCustomMapID(curPlayer)
        curLineID = PlayerControl.GetCustomLineID(curPlayer)
        if mapID == curMapID and lineID == curLineID:
            GameWorld.Log("    çŽ©å®¶å½“å‰å·²ç»åœ¨è‡ªå®šä¹‰åœºæ™¯ä¸­ï¼æ— éœ€é‡æ–°è¯·æ±‚ï¼", playerID)
            result = 1
        else:
            GameWorld.Log("    çŽ©å®¶å½“å‰åœ¨ä¸åŒçš„è‡ªå®šä¹‰åœºæ™¯ä¸­ï¼ä¸å…è®¸è¿›å…¥ï¼curMapID=%s,curLineID=%s"
                          % (curMapID, curLineID), playerID)
            result = 0
        StartCustomSceneResult(curPlayer, mapID, lineID, result)
        return result
    #进入副本通用检查
    if mapID:
        fbIpyData = FBCommon.GetFBIpyData(mapID)
        fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)
        if PlayerControl.CheckMoveToFB(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, tick) != ShareDefine.EntFBAskRet_OK:
            StartCustomSceneResult(curPlayer, mapID, lineID, 0)
            return 0
    PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 1) # ç”±äºŽå‰ç«¯ä¸ä¸€å®šæœ‰å‘mapID,所以这里额外记录这个状态,不能直接用mapID判断
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick, tick)
    PlayerControl.SetCustomMap(curPlayer, mapID, lineID)
    NPCCommon.ClearPriWoodPile(curPlayer)
    GameWorld.Log("玩家开始自定义场景!mapID=%s,lineID=%s" % (mapID, lineID), playerID)
    if mapID:
        PetControl.DoLogic_PetLoadMapOK(curPlayer)
        FBLogic.OnEnterCustomScene(curPlayer, mapID, lineID)
    #默认回满血
    if GameObj.GetHP(curPlayer) < GameObj.GetMaxHP(curPlayer):
        GameObj.SetHPFull(curPlayer)
    #通知进入状态
    StartCustomSceneResult(curPlayer, mapID, lineID, 1)
    return 1
def StartCustomSceneResult(curPlayer, mapID, lineID, result):
    if result != 1:
        DoExitCustomScene(curPlayer)
    resultPack = ChPyNetSendPack.tagMCStartCustomSceneResult()
    resultPack.MapID = mapID
    resultPack.FuncLineID = lineID
    resultPack.Result = result
    NetPackCommon.SendFakePack(curPlayer, resultPack)
    return
def DoExitCustomScene(curPlayer):
    ## é€€å‡ºè‡ªå®šä¹‰åœºæ™¯çŠ¶æ€
    PlayerControl.SetPlayerSightLevel(curPlayer, 0)
    mapID = PlayerControl.GetCustomMapID(curPlayer)
    lineID = PlayerControl.GetCustomLineID(curPlayer)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 0)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick, 0)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneGrade, 0)
    PlayerControl.SetCustomMap(curPlayer, 0, 0)
    if mapID and FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Over:
        FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over)
    NPCCommon.ClearPriWoodPile(curPlayer)
    #默认回满血
    if GameObj.GetHP(curPlayer) > 0 and curPlayer.GetPlayerAction() != IPY_GameWorld.paDie and GameObj.GetHP(curPlayer) < GameObj.GetMaxHP(curPlayer):
        GameObj.SetHPFull(curPlayer)
    GameWorld.Log("玩家退出自定义场景!", curPlayer.GetPlayerID())
    return
#// B1 08 å¿«é€Ÿä¸€é”®è¿‡å…³å‰¯æœ¬ #tagCMFBQuickPass
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -115,17 +115,10 @@
    if not curPlayer.GetInitOK():
        return
    
    customMapID = PlayerControl.GetCustomMapID(curPlayer)
    if customMapID:
        ipyMapData = IpyGameDataPY.GetIpyGameData("ChinMap", customMapID)
        if not ipyMapData or not ipyMapData.GetCanRide():
            PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
            return
    else:
        #地图不允许骑马 RideLimit_lhs_0
        if not GameWorld.GetMap().GetMapCanRide():
            PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
            return
    #地图不允许骑马 RideLimit_lhs_0
    if not GameWorld.GetMap().GetMapCanRide():
        PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
        return
        
    #检查玩家状态,只有在空闲状态才能上马
    if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull :
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRecover.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1032,16 +1032,11 @@
    #反外挂验证
    #PlayerAutoCheckOnline.HackDefense(curPlayer, tick)
    
    #副本相关时间处理
    #PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick)
    #恶意攻击时间处理
    #AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick)
    #活跃放置
    #PlayerActivity.ProcessActivityPlace(curPlayer)
    #自定义场景
    #FBLogic.OnCustomSceneProcess(curPlayer, tick)
    #炼器
    #PlayerActLianqi.OnProcess(curPlayer)
    #仙盟攻城战
@@ -1227,36 +1222,4 @@
        return
    curPlayer.SetDict(ChConfig.Def_PDict_BossStateTick, 0)
    PlayerControl.SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_BossState, 0)
    return
def ProcessAreaExp(curPlayer, tick):
    ##给场景经验
    if GameWorld.IsCrossServer():
        return
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        return
    crossMapID = PlayerControl.GetCrossMapID(curPlayer)
    mapID = crossMapID if crossMapID else GameWorld.GetMap().GetMapID()
    if not FBLogic.OnCanGetAreaExp(curPlayer, mapID):
        return
    neutralMapExpAwardDict = IpyGameDataPY.GetFuncEvalCfg('NeutralMapExpAward', 1, {})
    expAwardInfo = GameWorld.GetDictValueByKey(neutralMapExpAwardDict, mapID)
    if not expAwardInfo:
        return
    if len(expAwardInfo) != 2:
        return
    secondCD, expFormula = expAwardInfo
    lastTick = curPlayer.GetDictByKey(ChConfig.Def_PDict_MapAreaExpTick)
    if not lastTick:
        curPlayer.SetDict(ChConfig.Def_PDict_MapAreaExpTick, tick)
        return
    if tick - lastTick < secondCD:
        return
    curPlayer.SetDict(ChConfig.Def_PDict_MapAreaExpTick, tick)
    reExp = PlayerControl.GetPlayerReExp(curPlayer)
    reLV = curPlayer.GetLV()
    worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
    addExp = eval(FormulaControl.GetCompileFormula('NeutralMapExpAward%s'%mapID, expFormula))
    PlayerControl.PlayerControl(curPlayer).AddExp(addExp, ShareDefine.Def_ViewExpType_SysEx)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/MapBuff_3017.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -1352,10 +1352,6 @@
    if GameObj.GetHP(curPlayer) <= 0:
        return
    
    if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
        #GameWorld.DebugLog("自定义场景中,不检查!")
        return True
    #===========================================================================
    # if curPlayer.IsMoving():
    #    GameWorld.DebugLog("移动中不可使用技能")