hxp
2025-10-15 a7cda2ada3349bce6a6f9261752c0a2fe5e6927b
263 【主界面】头像系统(内政-幻境阁系统)-服务端(玩家改名)
7个文件已修改
384 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py 224 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3315,11 +3315,7 @@
Def_Player_Dict_HasVIPClubNote = 'HasVIPClubNote_186'  # 是否提示过vip升级可加入贵宾俱乐部信息
Def_Player_Dict_PyPlayerAction = 'PyPlayerAction_187'  # py自定义玩家状态
Def_Player_Dict_FamilyLV = 'FamilyLV_189'  # 玩家帮会等级
Def_Player_UpdatePlayerNameCnt = "UpdatePlayerNameCnt_196"  # 角色改名次数
Def_Player_Dict_UpdatePlayerNameItemIndex = "UpdatePlayerNameItemIndex_198"  # 改名物品在背包的位置
Def_Player_Dict_UpdatePlayerName = "UpdatePlayerName_199"  # 改名锁
Def_Player_Dict_UpdateFamilyNameItemIndex = "UpdateFamilyNameItemIndex"  # 改名物品在背包的位置
Def_Player_Dict_UpdateFamilyName = "UpdateFamilyName"  # 改名锁
Def_Player_Rename = "Rename"  # 是否已改名过
Def_Player_Dict_FamilyZhenbaogeCut = "FamilyZhenbaogeCut" #珍宝阁今日是否已砍过价
Def_Player_Dict_FamilyZhenbaogeBuy = "FamilyZhenbaogeBuy" #珍宝阁今日是否已购买过
Def_Player_Dict_FamilyDonateCnt = "FamilyDonateCnt_%s"  # 仙盟今日捐献次数,参数(捐献类型)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -19721,6 +19721,70 @@
#------------------------------------------------------
# A9 21 角色改名结果 #tagSCRenameResult
class  tagSCRenameResult(Structure):
    Head = tagHead()
    PlayerName = ""    #(char PlayerName[33])//size = 14
    Result = 0    #(BYTE Result)//角色改名结果
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA9
        self.Head.SubCmd = 0x21
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.PlayerName,_pos = CommFunc.ReadString(_lpData, _pos,33)
        self.Result,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA9
        self.Head.SubCmd = 0x21
        self.PlayerName = ""
        self.Result = 0
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 33
        length += 1
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteString(data, 33, self.PlayerName)
        data = CommFunc.WriteBYTE(data, self.Result)
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                PlayerName:%s,
                                Result:%d
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.PlayerName,
                                self.Result
                                )
        return DumpString
m_NAtagSCRenameResult=tagSCRenameResult()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCRenameResult.Head.Cmd,m_NAtagSCRenameResult.Head.SubCmd))] = m_NAtagSCRenameResult
#------------------------------------------------------
# A9 06 商城全服购买次数通知 #tagGCStoreServerBuyCntInfo
class  tagGCStoreServerBuyCnt(Structure):
@@ -19826,58 +19890,6 @@
m_NAtagGCStoreServerBuyCntInfo=tagGCStoreServerBuyCntInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCStoreServerBuyCntInfo.Head.Cmd,m_NAtagGCStoreServerBuyCntInfo.Head.SubCmd))] = m_NAtagGCStoreServerBuyCntInfo
#------------------------------------------------------
#A9 21 角色改名结果 #tagUpdatePlayerNameResult
class  tagUpdatePlayerNameResult(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Result", c_ubyte),    #角色改名结果
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA9
        self.SubCmd = 0x21
        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 = 0xA9
        self.SubCmd = 0x21
        self.Result = 0
        return
    def GetLength(self):
        return sizeof(tagUpdatePlayerNameResult)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''//A9 21 角色改名结果 //tagUpdatePlayerNameResult:
                                Cmd:%s,
                                SubCmd:%s,
                                Result:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Result
                                )
        return DumpString
m_NAtagUpdatePlayerNameResult=tagUpdatePlayerNameResult()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagUpdatePlayerNameResult.Cmd,m_NAtagUpdatePlayerNameResult.SubCmd))] = m_NAtagUpdatePlayerNameResult
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -126,6 +126,7 @@
import PlayerActTask
import PlayerMail
import DBDataMgr
import UpdatePlayerName
import GameServerRefresh
import IPY_ServerDefine
import CommFunc
@@ -751,6 +752,7 @@
        PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
        PlayerTalk.OnPlayerLogin(curPlayer)
        SyncADCntInfo(curPlayer)
        UpdatePlayerName.OnPlayerLogin(curPlayer)
        
        # 上线查询一次充值订单
        curPlayer.SendDBQueryRecharge()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBillboard.py
@@ -64,6 +64,26 @@
    
    return
def UpdatePlayerBillboardName(curPlayer):
    ## 更新排行榜中的玩家名字记录
    playerID = curPlayer.GetPlayerID()
    updName = curPlayer.GetPlayerName()
    billboardMgr = DBDataMgr.GetBillboardMgr()
    for billboardType in ShareDefine.BillboardTypeList:
        if billboardType in ShareDefine.FamilyBillboardList:
            continue
        groupList = billboardMgr.GetBillboardGroupList(billboardType)
        for billboardType, groupValue1, groupValue2 in groupList:
            billboardObj = billboardMgr.GetBillboard(billboardType, groupValue1, groupValue2)
            billData = billboardObj.FindByID(playerID)
            if not billData:
                continue
            billData.SetName1(updName)
    # 跨服榜更新, 待处理
    return
def UpdatePlayerFPTotalBillboard(curPlayer, isForceUpdate=False, isCheckRule=True):
    ##更新玩家总战斗力
#    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/UpdatePlayerName.py
@@ -1,198 +1,78 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.UpdatePlayerName
#
##@package UpdatePlayerName.py
# @todo:改名
# @author hxp
# @date 2025-10-15
# @version 1.0
#
# @todo:玩家改名
# 详细描述: 改名
#
# @author jiang
# @date 2013-01-23 13:30
# @version 1.5
# @note:
#
# @change: "2013-03-13 17:00" wdb 删除封包
# @change: "2014-05-22 10:20" xcc 恢复改名功能
# @change: "2014-12-23 03:40" Alee 改名字典用内存key
# @change: "2016-11-09 14:10" xdh 修改改名消耗
# @change: "2017-07-04 20:10" xdh 玩家合服首次登录改名次数重置为0
#------------------------------------------------------------------------------
#"""Version = 2017-07-04 20:10"""
#------------------------------------------------------------------------------
# 导入
import GameWorld
import ChConfig
import ReadChConfig
import PlayerControl
import IPY_GameWorld
import ItemCommon
import ChPyNetSendPack
import NetPackCommon
import EventReport
import ItemControler
#------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#"""Version = 2025-10-15 19:30"""
#-------------------------------------------------------------------------------
## 合服首登
def ResetChangeNameCnt(curPlayer):
    return #暂屏蔽
    GameWorld.DebugLog('        玩家合服首次登录 改名次数重置为0')
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_UpdatePlayerNameCnt, 0)
    Sync_UpdatePlayerNameCount(curPlayer)
import ChConfig
import GameWorld
import PlayerControl
import ChPyNetSendPack
import PlayerBillboard
import NetPackCommon
import IpyGameDataPY
import PlayerFamily
import ObjPool
def OnPlayerLogin(curPlayer):
    if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Rename):
        Sync_UpdatePlayerNameCount(curPlayer)
    return
#===============================================================================
#//A1 22 角色改名 #tagUpdatePlayerName
#
#struct    tagUpdatePlayerName
#struct tagUpdatePlayerName
#{
#    tagHead        Head;
#    BYTE        NewNameLen;
#    BYTE        NewNameLen;
#    char        NewName[NewNameLen];
#    BYTE        ItemIndex;    //改名物品在背包中的位置
#    DWORD       ServerID;
#    BYTE        ItemIndex;  //改名物品在背包中的位置
#    DWORD        ServerID;
#};
#===============================================================================
## 玩家更改名字
#  @param index: 玩家索引
#  @param clientData: 封包结构体
#  @param tick: 时间戳
#  @return: None
def UpdatePlayerName(index, clientData, tick):
    
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if GameWorld.IsCrossServer():
        #itemuse_lzxkoy_0:不可在跨服环境下使用改名功能。
        PlayerControl.NotifyCode(curPlayer, "itemuse_lzxkoy_0")
        return
    if curPlayer.GetDictByKey(ChConfig.Def_Player_Dict_UpdatePlayerName):
        #正在改名中
        GameWorld.Log("已经在改名中...", curPlayer.GetID())
        return
    #新名字
    newName = clientData.NewName
    itemIndex = clientData.ItemIndex - 1 #客户端发的默认+了1
    serverID = clientData.ServerID
    if itemIndex == -1: #-1则默认扣钱否则扣道具
        return
        moneyType, moneyCount = GetCostMoney(curPlayer)
        if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyCount):
            #金钱不足
            return False
    else:
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        curItem = itemPack.GetAt(itemIndex)
        if not __CheckItemUpdatePlayerName(curPlayer, curItem):
            #物品错误
    renameState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Rename)
    if renameState:
        moneyType, moneyCount = IpyGameDataPY.GetFuncEvalCfg("PlayerRename", 1)
        if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCount, "Rename"):
            return
        #改名物品在背包的位置, 因为背包物品索引从0开始, 字典最小值只能0, 所以此次索引+1
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_UpdatePlayerNameItemIndex, itemIndex + 1)
    #设置正在改名中...
    curPlayer.SetDict(ChConfig.Def_Player_Dict_UpdatePlayerName, 1)
    #通知GameServer正式改名
    newNameMsg = str([newName, serverID])
    GameWorld.Log("UpdatePlayerName 通知GameServer正式改名为:%s"%newNameMsg, curPlayer.GetID())
    curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_UpdatePlayerName, 0, '', newNameMsg, len(newNameMsg))
    return True
## 验证物品是否为改名贴
#  @param curPlayer 玩家实例
#  @param curItem 改名贴
#  @return 是否为改名贴
def __CheckItemUpdatePlayerName(curPlayer, curItem):
    if not ItemCommon.CheckItemCanUse(curItem):
        return False
    return (curItem.GetType() == ChConfig.Def_ItemType_ChangePlayerName)
## 获取金钱消耗
#  @param curPlayer: 玩家实例
#  @return: 金钱类型, 金钱数量
def GetCostMoney(curPlayer):
    #改名次数(公式参数)
    updatePlayerNameCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_UpdatePlayerNameCnt)
    moneyType, moneyCount = ReadChConfig.GetEvalChConfig("UpdatePlayerNameMoney")
    return moneyType, eval(moneyCount)
#===============================================================================
#//01 17 角色名同步#tagMUpdatePlayerName
#tagMUpdatePlayerName    * GettagMUpdatePlayerName();
#
#class IPY_MUpdatePlayerName
#{
#public:
#
#
#    unsigned char      GetNewNameLen();
#
#    std::string GetNewName();
#};
#===============================================================================
## 收到GameServer通知改名
#  @param index: 玩家索引
#  @param tick: 时间戳
#  @return
def GameServer_UpdatePlayerName(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    curPlayerName = curPlayer.GetName()
    sendPack = IPY_GameWorld.IPY_MUpdatePlayerName()
    newName = sendPack.GetNewName()
    curPlayer.SetPlayerName(newName)
    GameWorld.GetPlayerManager().UpdatePlayerNameIndex(curPlayerName, newName)
    GameWorld.GetMapCopyPlayerManager().UpdatePlayerNameIndex(curPlayerName, newName)
    #EventReport.WriteEvent_change_name(curPlayer, curPlayerName, newName)
    GameWorld.Log("UpdatePlayerName MapServer改名成功, newName = %s"%newName, curPlayer.GetID())
        
    #通知GameServer结果
    curPlayer.UpdatePlayerNameResult(True)
    return True
## 扣除改名消耗
#  @param curPlayer: 玩家实例
#  @return: None
def PayUpdatePlayerNameCost(curPlayer):
    itemIndex = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_UpdatePlayerNameItemIndex) - 1
    if itemIndex == -1: #-1则默认扣钱否则扣道具
        #扣除消耗
        moneyType, moneyCount = GetCostMoney(curPlayer)
        PlayerControl.PayMoney(curPlayer, moneyType, moneyCount, ChConfig.Def_Cost_Rename)
    else:
        #扣除物品
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        curItem = itemPack.GetAt(itemIndex)
        if not __CheckItemUpdatePlayerName(curPlayer, curItem):
            # 物品可能已经变更,不是改名道具了或为空,重新找一遍
            curItem = ItemControler.FindPlayerItemByType(curPlayer, IPY_GameWorld.rptItem, ChConfig.Def_ItemType_ChangePlayerName)
        if ItemCommon.CheckItemCanUse(curItem):
            ItemCommon.DelItem(curPlayer, curItem, 1, True, 'UpdatePlayerName')
    #改名次数+1
    #updatePlayerNameCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_UpdatePlayerNameCnt)
    #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_UpdatePlayerNameCnt, updatePlayerNameCnt + 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_UpdatePlayerNameItemIndex, 0)
    oldName = curPlayer.GetName()
    curPlayer.SetPlayerName(newName)
    GameWorld.GetPlayerManager().UpdatePlayerNameIndex(oldName, newName)
    GameWorld.GetMapCopyPlayerManager().UpdatePlayerNameIndex(oldName, newName)
    #改名结果
    clientPack = ChPyNetSendPack.tagSCRenameResult()
    clientPack.PlayerName = curPlayer.GetPlayerName()
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    if not renameState:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Rename, 1)
        Sync_UpdatePlayerNameCount(curPlayer)
    #同步其他功能玩家名
    PlayerFamily.RefreshFamilyMember(curPlayer)
    PlayerBillboard.UpdatePlayerBillboardName(curPlayer)
    #社交名待更新
    return
## 通知改名次数
#  @param curPlayer: 玩家实例
#  @return: None
def Sync_UpdatePlayerNameCount(curPlayer):
    return
    updatePlayerNameCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_UpdatePlayerNameCnt)
    pack = ChPyNetSendPack.tagUpdatePlayerNameCount()
    pack.Clear()
    pack.Count = updatePlayerNameCnt
    NetPackCommon.SendFakePack(curPlayer, pack)
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagUpdatePlayerNameCount)
    clientPack.Count = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Rename)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -963,7 +963,7 @@
                                Def_UniversalGameRecType_LuckyCloudBuyNum, # 幸运云购购买号码记录 21
                                Def_UniversalGameRecType_LuckyCloudBuyLottery, # 幸运云购开奖记录 22
                                Def_UniversalGameRecType_CrossBattlefieldBuy, # 玩家购买的跨服战场 23
                                Def_UniversalGameRecType_UpdatePlayerName,  # 玩家改名正在改名中的信息24
                                Def_UniversalGameRecType_24,
                                Def_UniversalGameRecType_BossDropGoodItemInfo,  # boss掉落好物品信息记录25
                                Def_UniversalGameRecType_26,
                                Def_UniversalGameRecType_27,
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini
@@ -88,20 +88,6 @@
PacketSubCMD_1=0x1
PacketCallFunc_1=GameServer_MergeRegisterResult
;角色改名
[UpdatePlayerName]
ScriptName = Player\UpdatePlayerName
Writer = jiang
Releaser = jiang
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0x1
PacketSubCMD_1=0x17
PacketCallFunc_1=GameServer_UpdatePlayerName
;GameServerPy万能封包
[GameServerPyPack]
ScriptName = NetPackCommon.py