121 【武将】武将系统-服务端(优化图鉴升级,增加记录历史最高星级、突破等级;)
5个文件已修改
103 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4150,6 +4150,7 @@
#武将
Def_PDict_HeroSkin = "HeroSkin_%s" # 武将皮肤解锁状态,按皮肤索引二进制存储,参数(武将ID)
Def_PDict_HeroBook = "HeroBook_%s" # 武将图鉴激活等级,参数(武将ID) cccbbba a-初始激活状态1-英雄激活,2-初始图鉴激活; bbb-存星级图鉴激活等级;ccc-存突破图鉴激活等级
Def_PDict_HeroBookH = "HeroBookH_%s" # 武将图鉴历史最高等级,参数(武将ID) cccbbba: bbb-存星级图鉴最高等级;ccc-存突破图鉴最高等级
Def_PDict_HeroAwakeRebirthCnt = "HeroAwakeRebirthCnt" # 已觉醒过的武将今日已重生次数,共享次数
#主线
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -14722,7 +14722,6 @@
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HeroID", c_int),    #武将ID
                  ("ItemIndex", c_ushort),    #关联武将物品所在武将背包索引,激活时可不用发
                  ("BookType", c_ubyte),    #图鉴激活类型: 0-初始激活;1-星级升级;2-突破等级升级
                  ]
@@ -14741,7 +14740,6 @@
        self.Cmd = 0xB2
        self.SubCmd = 0x37
        self.HeroID = 0
        self.ItemIndex = 0
        self.BookType = 0
        return
@@ -14756,14 +14754,12 @@
                                Cmd:%s,
                                SubCmd:%s,
                                HeroID:%d,
                                ItemIndex:%d,
                                BookType:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.HeroID,
                                self.ItemIndex,
                                self.BookType
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -38000,6 +38000,8 @@
                  ("BookInitState", c_ubyte),    # 图鉴激活状态:0-未激活;1-可激活;2-已激活
                  ("BookStarLV", c_ushort),    # 图鉴星级等级
                  ("BookBreakLV", c_ushort),    # 图鉴突破等级
                  ("BookStarLVH", c_ushort),    # 图鉴星级历史最高等级
                  ("BookBreakLVH", c_ushort),    # 图鉴突破历史最高等级
                  ]
    def __init__(self):
@@ -38017,6 +38019,8 @@
        self.BookInitState = 0
        self.BookStarLV = 0
        self.BookBreakLV = 0
        self.BookStarLVH = 0
        self.BookBreakLVH = 0
        return
    def GetLength(self):
@@ -38031,14 +38035,18 @@
                                SkinState:%d,
                                BookInitState:%d,
                                BookStarLV:%d,
                                BookBreakLV:%d
                                BookBreakLV:%d,
                                BookStarLVH:%d,
                                BookBreakLVH:%d
                                '''\
                                %(
                                self.HeroID,
                                self.SkinState,
                                self.BookInitState,
                                self.BookStarLV,
                                self.BookBreakLV
                                self.BookBreakLV,
                                self.BookStarLVH,
                                self.BookBreakLVH
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Hero.py
@@ -148,7 +148,7 @@
    # 突破
    if value == "b":
        breakLV = msgList[2] if len(msgList) > 2 else 0
        PlayerHero.SetHeroBreakLV(heroItem, breakLV)
        PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV)
        GameWorld.DebugAnswer(curPlayer, "设置武将突破: %s,itemIndex=%s" % (breakLV, itemIndex))
        return
    
@@ -314,7 +314,7 @@
                if not IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityBreak", quality, bLV):
                    break
                breakLV = bLV
        PlayerHero.SetHeroBreakLV(heroItem, breakLV, False)
        PlayerHero.SetHeroBreakLV(curPlayer, heroItem, breakLV, False)
        
        # 星级
        starMax = PlayerHero.GetHeroStarMax(heroItem)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -233,6 +233,19 @@
    GameWorld.DebugLog("设置武将图鉴星级等级:%s,bookState=%s,updBookState=%s" % (starLV, bookState, updBookState), curPlayer.GetPlayerID())
    return
def GetHeroBookStarLVH(curPlayer, heroID):
    ## 武将图鉴星级历史最高等级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    return GameWorld.GetValue(bookStateH, 4, 3)
def SetHeroBookStarLVH(curPlayer, heroID, starLVH):
    ## 设置武将图鉴星级历史最高等级,支持三位数 0~999 级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    updBookStateH = GameWorld.SetValue(bookStateH, 4, 3, starLVH)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
    GameWorld.DebugLog("设置武将图鉴星级历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (starLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
    Sync_HeroInfo(curPlayer, [heroID])
    return
def GetHeroBookBreakLV(curPlayer, heroID):
    ## 武将图鉴突破等级
    bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID)
@@ -243,6 +256,19 @@
    updBookState = GameWorld.SetValue(bookState, 7, 3, breakLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState)
    GameWorld.DebugLog("设置武将图鉴突破等级:%s,bookState=%s,updBookState=%s" % (breakLV, bookState, updBookState), curPlayer.GetPlayerID())
    return
def GetHeroBookBreakLVH(curPlayer, heroID):
    ## 武将图鉴突破历史最高等级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    return GameWorld.GetValue(bookStateH, 7, 3)
def SetHeroBookBreakLVH(curPlayer, heroID, breakLVH):
    ## 设置武将图鉴突破历史最高等级,支持三位数 0~999 级
    bookStateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID)
    updBookStateH = GameWorld.SetValue(bookStateH, 7, 3, breakLVH)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBookH % heroID, updBookStateH)
    GameWorld.DebugLog("设置武将图鉴突破历史最高等级:%s,bookStateH=%s,updBookStateH=%s" % (breakLVH, bookStateH, updBookStateH), curPlayer.GetPlayerID())
    Sync_HeroInfo(curPlayer, [heroID])
    return
def GetHeroItem(curPlayer, itemIndex):
@@ -438,6 +464,7 @@
def DoHeroUpdStar(curPlayer, heroItem, updStar, isSync=True):
    ## 执行武将星级更新
    heroID = heroItem.GetItemTypeID()
    curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
    addStar = updStar - curStar
    item = heroItem.GetItem()
@@ -449,6 +476,10 @@
    
    itemIndex = heroItem.GetItemPlaceIndex()
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    starLVH = GetHeroBookStarLVH(curPlayer, heroID)
    if updStar > starLVH:
        SetHeroBookStarLVH(curPlayer, heroID, updStar)
    return
def __DoHeroStarTalentUp(singleItem, addLV):
@@ -593,17 +624,22 @@
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroBreak")
    GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
    SetHeroBreakLV(heroItem, nextBreakLV)
    SetHeroBreakLV(curPlayer, heroItem, nextBreakLV)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def SetHeroBreakLV(heroItem, breakLV, isSync=True):
def SetHeroBreakLV(curPlayer, heroItem, breakLV, isSync=True):
    ## 设置武将突破等级
    heroID = heroItem.GetItemTypeID()
    item = heroItem.GetItem()
    item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
    if isSync:
        heroItem.Sync_Item()
    breakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
    if breakLV > breakLVH:
        SetHeroBookBreakLVH(curPlayer, heroID, breakLV)
    return
#// B2 33 武将觉醒 #tagCSHeroAwake
@@ -992,13 +1028,12 @@
def OnHeroBookUP(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    heroID = clientData.HeroID
    itemIndex = clientData.ItemIndex
    bookType = clientData.BookType
    
    if bookType == 1:
        __doHeroBookStarLVUP(curPlayer, heroID, itemIndex)
        __doHeroBookStarLVUP(curPlayer, heroID)
    elif bookType == 2:
        __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex)
        __doHeroBookBreakLVUP(curPlayer, heroID)
    else:
        __doHeroBookAct(curPlayer, heroID)
    return
@@ -1033,48 +1068,36 @@
    RefreshLordAttr(curPlayer)
    return
def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
def __doHeroBookStarLVUP(curPlayer, heroID):
    ## 图鉴星级升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
    if heroItem.GetItemTypeID() != heroID:
        GameWorld.DebugLog("非该武将图鉴关联物品! heroID=%s,itemID=%s" % (heroID, heroItem.GetItemTypeID()), playerID)
        return
    heroStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
    bookStar = GetHeroBookStarLV(curPlayer, heroID)
    if bookStar >= heroStar:
        GameWorld.DebugLog("该武将图鉴星级已达当前英雄星级! heroID=%s,bookStar=%s,heroStar=%s" % (heroID, bookStar, heroStar), playerID)
    bookStarH = GetHeroBookStarLVH(curPlayer, heroID)
    if bookStar >= bookStarH:
        GameWorld.DebugLog("该武将图鉴星级已达当前英雄最高星级! heroID=%s,bookStar=%s >= %s" % (heroID, bookStar, bookStarH), playerID)
        return
    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,heroStar=%s" % (heroID, bookStar, heroStar), playerID)
    GameWorld.DebugLog("武将图鉴星级升级! heroID=%s,bookStar=%s,bookStarH=%s" % (heroID, bookStar, bookStarH), playerID)
    SetHeroBookStarLV(curPlayer, heroID, bookStar + 1)
    Sync_HeroInfo(curPlayer, [heroID])
    
    RefreshLordAttr(curPlayer)
    return
def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
def __doHeroBookBreakLVUP(curPlayer, heroID):
    ## 图鉴突破升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
    if heroItem.GetItemTypeID() != heroID:
        GameWorld.DebugLog("非该武将图鉴关联物品! heroID=%s,itemID=%s" % (heroID, heroItem.GetItemTypeID()), playerID)
        return
    heroBreakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
    bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
    if bookBreakLV >= heroBreakLV:
        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄突破等级! heroID=%s,bookBreakLV=%s,heroBreakLV=%s" % (heroID, bookBreakLV, heroBreakLV), playerID)
    bookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
    if bookBreakLV >= bookBreakLVH:
        GameWorld.DebugLog("该武将图鉴突破等级已达当前英雄最高突破等级! heroID=%s,bookBreakLV=%s >= %s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
        return
    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,heroBreakLV=%s" % (heroID, bookBreakLV, heroBreakLV), playerID)
    GameWorld.DebugLog("武将图鉴突破升级! heroID=%s,bookBreakLV=%s,bookBreakLVH=%s" % (heroID, bookBreakLV, bookBreakLVH), playerID)
    SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1)
    Sync_HeroInfo(curPlayer, [heroID])
    
@@ -1443,7 +1466,8 @@
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
        if not heroIpyData:
            continue
        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID):
        if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) \
            and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBookH % heroID):
            continue
        
        hero = ChPyNetSendPack.tagSCHero()
@@ -1452,6 +1476,8 @@
        hero.BookInitState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10
        hero.BookStarLV = GetHeroBookStarLV(curPlayer, heroID)
        hero.BookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
        hero.BookStarLVH = GetHeroBookStarLVH(curPlayer, heroID)
        hero.BookBreakLVH = GetHeroBookBreakLVH(curPlayer, heroID)
        syncInfoList.append(hero)
        
    if not syncInfoList: