hxp
2025-08-28 736f0f77848f217db1b3a76693cd8289cb5e03ea
16 卡牌服务端(功能开启删除不需要字段;支持任务开启功能;)
9个文件已修改
2个文件已删除
783 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_GuajiAward.py 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGuaji.py 455 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -549,10 +549,8 @@
{
    DWORD        _FuncId;    //功能标识
    DWORD        LimitLV;    //开启等级
    DWORD        LimitMagicWeapon;    //需要解锁法宝ID
    WORD        LimiRealmLV;    //需要境界等级
    DWORD        LimitMissionID;    //需要完成的任务ID
    BYTE        LimitVIPLV;    //需要VIP等级
    char        MailKey;    //邮件
};
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4116,19 +4116,6 @@
Def_PDict_GFPassiveIndex = "GFP_%s_%s"   # 被动功法 页数-索引
Def_PDict_GFPassivePage = "GFPPage"   # 被动功法选中页数
# 挂机收益
Def_PDict_GuajiCalcTime = "GuajiCalcTime"   # 上次统计收益时间戳
Def_PDict_GuajiAwardSeconds = "GuajiAwardSeconds"   # 已累计收益时长,秒
Def_PDict_GuajiQuickCount = "GuajiQuickCount"   # 今日已快速收益次数
Def_PDict_GuajiExp = "GuajiExp"   # 经验
Def_PDict_GuajiExpPoint = "GuajiExpPoint"   # 经验超过E部分
Def_PDict_GuajiMoneyType = "GuajiMoneyType_%s" # 获得货币类型,参数(索引)
Def_PDict_GuajiMoneyValue = "GuajiMoneyValue_%s" # 获得货币值,参数(索引)
Def_PDict_GuajiMoneyUnSeconds = "GuajiMoneyUnSeconds_%s" # 计算获得货币值时未处理收益的累计时长,秒,参数(货币类型)
Def_PDict_GuajiItemUnSeconds = "GuajiItemUnSeconds" # 计算获得物品次数时未处理收益的累计时长,秒
Def_PDict_GuajiItemID = "GuajiItemID_%s" # 获得物品ID,参数(索引)
Def_PDict_GuajiItemCount = "GuajiItemCount_%s" # 获得物品个数,参数(索引)
#套装
Def_PDict_EquipPartSuiteLV = "EQPartSuiteLV_%s_%s" #部位套装等级 参数 部位、套装类型
Def_PDict_EquipPartSuiteActivate = "EQPartSuiteActivate_%s" #套装激活记录 参数 key编号
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -42053,207 +42053,6 @@
#------------------------------------------------------
# B1 09 玩家挂机系统信息 #tagMCGuajiInfo
class  tagMCGuajiMoney(Structure):
    _pack_ = 1
    _fields_ = [
                  ("MoneyType", c_ubyte),
                  ("MoneyValue", 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.MoneyType = 0
        self.MoneyValue = 0
        return
    def GetLength(self):
        return sizeof(tagMCGuajiMoney)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 09 玩家挂机系统信息 //tagMCGuajiInfo:
                                MoneyType:%d,
                                MoneyValue:%d
                                '''\
                                %(
                                self.MoneyType,
                                self.MoneyValue
                                )
        return DumpString
class  tagMCGuajiItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("ItemID", c_int),
                  ("Count", c_ushort),
                  ]
    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.ItemID = 0
        self.Count = 0
        return
    def GetLength(self):
        return sizeof(tagMCGuajiItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// B1 09 玩家挂机系统信息 //tagMCGuajiInfo:
                                ItemID:%d,
                                Count:%d
                                '''\
                                %(
                                self.ItemID,
                                self.Count
                                )
        return DumpString
class  tagMCGuajiInfo(Structure):
    Head = tagHead()
    QuickAwardCount = 0    #(BYTE QuickAwardCount)// 今日已快速挂机收益次数
    AwardType = 0    #(BYTE AwardType)// 收益类型: 0-已累计预览;1-领取结算结果(包含常规领取跟快速领取)
    AwardSeconds = 0    #(DWORD AwardSeconds)// 已累计收益时长,秒
    Exp = 0    #(DWORD Exp)// 已累计经验,求余亿部分
    ExpPoint = 0    #(DWORD ExpPoint)// 已累计经验,整除亿部分
    MoneyLen = 0    #(BYTE MoneyLen)
    MoneyList = list()    #(vector<tagMCGuajiMoney> MoneyList)// 已累计货币
    ItemLen = 0    #(BYTE ItemLen)
    ItemList = list()    #(vector<tagMCGuajiItem> ItemList)// 已累计物品
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xB1
        self.Head.SubCmd = 0x09
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.QuickAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.AwardType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.AwardSeconds,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.Exp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.ExpPoint,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.MoneyLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.MoneyLen):
            temMoneyList = tagMCGuajiMoney()
            _pos = temMoneyList.ReadData(_lpData, _pos)
            self.MoneyList.append(temMoneyList)
        self.ItemLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.ItemLen):
            temItemList = tagMCGuajiItem()
            _pos = temItemList.ReadData(_lpData, _pos)
            self.ItemList.append(temItemList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xB1
        self.Head.SubCmd = 0x09
        self.QuickAwardCount = 0
        self.AwardType = 0
        self.AwardSeconds = 0
        self.Exp = 0
        self.ExpPoint = 0
        self.MoneyLen = 0
        self.MoneyList = list()
        self.ItemLen = 0
        self.ItemList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 4
        length += 4
        length += 4
        length += 1
        for i in range(self.MoneyLen):
            length += self.MoneyList[i].GetLength()
        length += 1
        for i in range(self.ItemLen):
            length += self.ItemList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.QuickAwardCount)
        data = CommFunc.WriteBYTE(data, self.AwardType)
        data = CommFunc.WriteDWORD(data, self.AwardSeconds)
        data = CommFunc.WriteDWORD(data, self.Exp)
        data = CommFunc.WriteDWORD(data, self.ExpPoint)
        data = CommFunc.WriteBYTE(data, self.MoneyLen)
        for i in range(self.MoneyLen):
            data = CommFunc.WriteString(data, self.MoneyList[i].GetLength(), self.MoneyList[i].GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ItemLen)
        for i in range(self.ItemLen):
            data = CommFunc.WriteString(data, self.ItemList[i].GetLength(), self.ItemList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                QuickAwardCount:%d,
                                AwardType:%d,
                                AwardSeconds:%d,
                                Exp:%d,
                                ExpPoint:%d,
                                MoneyLen:%d,
                                MoneyList:%s,
                                ItemLen:%d,
                                ItemList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.QuickAwardCount,
                                self.AwardType,
                                self.AwardSeconds,
                                self.Exp,
                                self.ExpPoint,
                                self.MoneyLen,
                                "...",
                                self.ItemLen,
                                "..."
                                )
        return DumpString
m_NAtagMCGuajiInfo=tagMCGuajiInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGuajiInfo.Head.Cmd,m_NAtagMCGuajiInfo.Head.SubCmd))] = m_NAtagMCGuajiInfo
#------------------------------------------------------
# B1 22 武将信息 #tagSCHeroInfo
class  tagSCHero(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -485,10 +485,8 @@
                "FuncOpenLV":(
                        ("DWORD", "FuncId", 1),
                        ("DWORD", "LimitLV", 0),
                        ("DWORD", "LimitMagicWeapon", 0),
                        ("WORD", "LimiRealmLV", 0),
                        ("DWORD", "LimitMissionID", 0),
                        ("BYTE", "LimitVIPLV", 0),
                        ("char", "MailKey", 0),
                        ),
@@ -3322,11 +3320,9 @@
        
    def GetFuncId(self): return self.attrTuple[0] # 功能标识 DWORD
    def GetLimitLV(self): return self.attrTuple[1] # 开启等级 DWORD
    def GetLimitMagicWeapon(self): return self.attrTuple[2] # 需要解锁法宝ID DWORD
    def GetLimiRealmLV(self): return self.attrTuple[3] # 需要境界等级 WORD
    def GetLimitMissionID(self): return self.attrTuple[4] # 需要完成的任务ID DWORD
    def GetLimitVIPLV(self): return self.attrTuple[5] # 需要VIP等级 BYTE
    def GetMailKey(self): return self.attrTuple[6] # 邮件 char
    def GetLimiRealmLV(self): return self.attrTuple[2] # 需要境界等级 WORD
    def GetLimitMissionID(self): return self.attrTuple[3] # 需要完成的任务ID DWORD
    def GetMailKey(self): return self.attrTuple[4] # 邮件 char
# 合成表
class IPY_ItemCompound():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_GuajiAward.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -128,7 +128,6 @@
import PlayerLove
import GameObj
import PlayerChangeJob
import PlayerGuaji
import PlayerFace
import PlayerChatBox
import PlayerXiangong
@@ -789,7 +788,6 @@
        PlayerTask.OnPlayerLogin(curPlayer)
        PlayerTree.OnPlayerLogin(curPlayer)
        PlayerMineArea.OnPlayerLogin(curPlayer)
        PlayerGuaji.OnPlayerLogin(curPlayer)
        PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
        PlayerTalk.OnPlayerLogin(curPlayer)
        
@@ -3313,9 +3311,6 @@
    # 活跃放置奖励
    elif rewardType == ChConfig.Def_RewardType_ActivityPlace:
        PlayerActivity.GetActivityPlaceReward(curPlayer)
    # 挂机奖励
    elif rewardType == ChConfig.Def_RewardType_Guaji:
        PlayerGuaji.OnGetGuajiAward(curPlayer, dataEx)
    # 仙树免费减时
    elif rewardType == ChConfig.Def_RewardType_TreeFreeTime:
        PlayerTree.FreeReduceTreeLVTime(curPlayer)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -24,9 +24,9 @@
import ChPyNetSendPack
import GameWorld
import NetPackCommon
import PlayerGodWeapon
import PlayerHorse
import PlayerPet
#import PlayerGodWeapon
#import PlayerHorse
#import PlayerPet
import ShareDefine
import IpyGameDataPY
import PlayerControl
@@ -34,45 +34,40 @@
import PlayerBillboard
import PlayerTreasure
import PlayerSignDay
import PlayerGoldGift
import PlayerEquipDecompose
import PlayerCrossChampionship
import PlayerFreeGoods
import FunctionNPCCommon
#import PlayerGoldGift
#import PlayerEquipDecompose
#import PlayerCrossChampionship
#import PlayerFreeGoods
#import FunctionNPCCommon
import PlayerActBuyCountGift
import PlayerActLoginNew
import PlayerActTask
import IPY_GameWorld
import ItemCommon
import ItemControler
import PlayerLianTi
import PlayerArena
import PlayerFaQi
import PlayerGuaji
#import PlayerLianTi
#import PlayerFaQi
# 功能开启需执行的函数{功能ID:执行函数, ...} 函数需返回是否激活成功, 功能开启有需要处理功能逻辑的这里增加函数调用配置即可
FuncOpenLogicDict = {
                     ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj),
                     ShareDefine.GameFuncID_GodWeapon:lambda curObj:PlayerGodWeapon.DoGodWeaponOpen(curObj),
                     ShareDefine.GameFuncID_Pet:lambda curObj:PlayerPet.DoPetOpen(curObj),
                     ShareDefine.GameFuncID_Official:lambda curObj:PlayerPrestigeSys.DoOfficialOpen(curObj),
                     ShareDefine.GameFuncID_Billboard:lambda curObj:PlayerBillboard.DoBillboardOpen(curObj),
                     ShareDefine.GameFuncID_SignDay:lambda curObj:PlayerSignDay.DoSignDayOpen(curObj),
                     ShareDefine.GameFuncID_Treasure:lambda curObj:PlayerTreasure.DoTreasureOpen(curObj),
                     ShareDefine.GameFuncID_FirstGoldTip:lambda curObj:PlayerGoldGift.DoFirstGoldOpen(curObj),
                     ShareDefine.GameFuncID_EquipDecompose:lambda curObj:PlayerEquipDecompose.DoEquipDecomposeOpen(curObj),
                     ShareDefine.GameFuncID_FreeGoods:lambda curObj:PlayerFreeGoods.DoFreeGoodsOpen(curObj),
                     ShareDefine.GameFuncID_OSSail:lambda curObj:FunctionNPCCommon.OSSaleOpenMail(curObj),
                     ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj),
                     ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj),
                     ShareDefine.GameFuncID_FaQi:lambda curObj:PlayerFaQi.DoFaQiOpen(curObj),
                     ShareDefine.GameFuncID_LianTi:lambda curObj:PlayerLianTi.DoLianTiOpen(curObj),
                     ShareDefine.GameFuncID_Championship:lambda curObj:PlayerCrossChampionship.DoChampionshipOpen(curObj),
                     ShareDefine.GameFuncID_Guaji:lambda curObj:PlayerGuaji.DoGuajiOpen(curObj),
                     #ShareDefine.GameFuncID_RunDaily:lambda curObj:FBCommon.DoFuncOpen_RunDaily(curObj),
                     #ShareDefine.GameFuncID_RunFamily:lambda curObj:FBCommon.DoFuncOpen_RunFamily(curObj),
                     #ShareDefine.GameFuncID_Horse:lambda curObj:PlayerHorse.DoHorseOpen(curObj),
                     #ShareDefine.GameFuncID_GodWeapon:lambda curObj:PlayerGodWeapon.DoGodWeaponOpen(curObj),
                     #ShareDefine.GameFuncID_Pet:lambda curObj:PlayerPet.DoPetOpen(curObj),
                     #ShareDefine.GameFuncID_FirstGoldTip:lambda curObj:PlayerGoldGift.DoFirstGoldOpen(curObj),
                     #ShareDefine.GameFuncID_EquipDecompose:lambda curObj:PlayerEquipDecompose.DoEquipDecomposeOpen(curObj),
                     #ShareDefine.GameFuncID_FreeGoods:lambda curObj:PlayerFreeGoods.DoFreeGoodsOpen(curObj),
                     #ShareDefine.GameFuncID_OSSail:lambda curObj:FunctionNPCCommon.OSSaleOpenMail(curObj),
                     #ShareDefine.GameFuncID_AddPoint:lambda curObj:PlayerControl.DoAddPointOpen(curObj),
                     #ShareDefine.GameFuncID_FaQi:lambda curObj:PlayerFaQi.DoFaQiOpen(curObj),
                     #ShareDefine.GameFuncID_LianTi:lambda curObj:PlayerLianTi.DoLianTiOpen(curObj),
                     #ShareDefine.GameFuncID_Championship:lambda curObj:PlayerCrossChampionship.DoChampionshipOpen(curObj),
                     }
## 注意:功能开启需执行的函数 及 功能开启后升级逻辑 只会执行其中一个
@@ -123,10 +118,6 @@
        
        limitMissionID = ipyData.GetLimitMissionID()
        if limitMissionID and not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
            continue
        limitVIPLV = ipyData.GetLimitVIPLV()
        if limitVIPLV and curPlayer.GetVIPLv() < limitVIPLV:
            continue
        
        # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -97,7 +97,6 @@
import IpyGameDataPY
import PlayerArena
import PyGameData
import PlayerGuaji
import PlayerXiangong
import PlayerMineArea
import PlayerBillboard
@@ -335,8 +334,6 @@
        PlayerArena.OnDayEx(curPlayer)
        #福地
        PlayerMineArea.PlayerOnDay(curPlayer)
        #挂机
        PlayerGuaji.PlayerOnDay(curPlayer)
        #特殊时间点过天的,一般是游戏功能,此时立即同步一次跨服玩家数据
        CrossPlayerData.SendMergePlayerDataNow(curPlayer)
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGuaji.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1033,9 +1033,6 @@
    #副本相关时间处理
    #PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick)
    
    #挂机收益
    #PlayerGuaji.ProcessGuaji(curPlayer)
    #恶意攻击时间处理
    #AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick)
    #成就
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -923,23 +923,25 @@
) = range(1, 4)
# 游戏功能ID定义,需确保唯一,与PyGameFuncControl.txt中FuncId一致
GameFuncID_Official = 12        # 官爵,境界
GameFuncID_Family = 15          # 战盟,仙盟
GameFuncID_Billboard = 72       # 排行榜
GameFuncID_SignDay = 81         # 签到
GameFuncID_Treasure = 99        # 寻宝
GameFuncID_Arena = 195          # 竞技场
GameFuncID_Wing = 3             # 翅膀
GameFuncID_Pet = 6              # 宠物,灵宠
GameFuncID_MagicWeapon = 7      # 法宝
GameFuncID_Horse = 8            # 坐骑
GameFuncID_Official = 12        # 官爵,境界
GameFuncID_Family = 15          # 战盟,仙盟
GameFuncID_GodWeapon = 20       # 神器
GameFuncID_Talent = 149         # 天赋
GameFuncID_RefineExp = 60       # 经验炼制,祈愿
GameFuncID_RefineMoney = 61     # 金币炼制,祈愿
GameFuncID_WorldLV = 71         # 世界等级
GameFuncID_Billboard = 72       # 排行榜
GameFuncID_Friend = 73          # 好友
GameFuncID_SignDay = 81         # 签到
GameFuncID_RefineStove = 87     # 炼丹炉
GameFuncID_EquipWash = 91       # 洗练
GameFuncID_Treasure = 99        # 寻宝
GameFuncID_FirstGoldTip = 128      # 首充优势提示
GameFuncID_EquipDecompose = 123 # 装备分解
GameFuncID_DailyQuest = 78      # 日常
@@ -953,7 +955,6 @@
GameFuncID_CrossRealmPK = 157   # 跨服天梯
GameFuncID_PenglaiBoss = 162    # 蓬莱仙境
GameFuncID_ZhuXianBoss = 163    # 诛仙BOSS
GameFuncID_Arena = 195          # 竞技场
GameFuncID_FaQi = 199           # 法器
GameFuncID_LianTi = 207         # 炼体
GameFuncID_CrossBattlefield = 208   # 跨服古神战场