From 5eb165e536f20635ca01c3dfca1d6525a719a0f1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 07 二月 2025 19:05:51 +0800
Subject: [PATCH] 5562 【英文】【越南】【BT】【砍树】跨服子服玩家打包数据较大(优化跨服、子服打包数据、查看玩家日志输出)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/CreateRole.py |  222 +++++++++++++++++++++++++++----------------------------
 1 files changed, 108 insertions(+), 114 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CreateRole.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CreateRole.py
index ac6c503..fa0f9e9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CreateRole.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CreateRole.py
@@ -27,7 +27,6 @@
 import GameWorld
 import random
 import ChConfig
-import ShareDefine
 import PlayerControl
 import PyGameData
 #---------------------------------------------------------------------
@@ -83,6 +82,10 @@
         PlayerControl.NotifyCode(curPlayer, "CreatSuccess")
         return
     
+    if CheckIsServerCreateRoleLimit(curPlayer):
+        PlayerControl.NotifyCode(curPlayer, "ServerCreateRoleLimit")
+        return
+    
     # CD保护
     createSafeTick = 3000
     accID = curPlayer.GetAccID()
@@ -112,29 +115,37 @@
     sendPack_Sex = 1 #sendPack.GetSex()
     sendPack_Hair = 10001 #sendPack.GetHair()
     sendPack_HairColor = 1 #sendPack.GetHairColor()
-    sendPack_Face = 10005 #sendPack.GetFace()
+    #sendPack_Face = 10005 #sendPack.GetFace()
     sendPack_FacePic = 0 # 固定为0,需与客户端配置一致
     serverID = 1 #sendPack.GetFacePic() # 脸谱作为serverID用
     sendPack_PlayerType = 1 #sendPack.GetPlayerType()
-    sendPack_Job = sendPack.GetJob()
-    
+    roleType = sendPack.GetJob() # 创角使用job作为角色用
+    ipyData = IpyGameDataPY.GetIpyGameData("CreateRole", roleType)
+    if not ipyData:
+        return
+    job = ipyData.GetJob()
+    face = ipyData.GetFace() # 头像
+    modelMark = ipyData.GetModelMark() # 外形  和 时装有区别
     #-----------------------名字校验
-    #C++过滤空格
-    sendPack_Name = GameWorld.GetGameWorld().GetCharTrim(sendPack_Name)
-    
-    GameWorld.Log("playerName = %s 创建角色,sendPack_Job=%s"%(sendPack_Name, sendPack_Job) , curPlayerID)
-    
-    if not CheckPlayerName(curPlayer , sendPack_Name):
-        #disRoleCreateError 人物创建的时候外观属性错误
-        #curPlayer.Kick(IPY_GameServer.disCreateRoleNameError)
-        PlayerControl.NotifyCode(curPlayer, "NameError")
-        return
-    
-    sendPack_Name = GameWorld.GetPlayerFullName(curPlayer, sendPack_Name, serverID)
+    sendPack_Name = IpyGameDataPY.GetFuncCfg("CreateRole", 1) # 将命名格式直接传给db创角 gstCreatePlayer,因为这里的curPlayerID不是实际的curPlayerID
     if not sendPack_Name:
-        #curPlayer.Kick(IPY_GameServer.disCreateRoleNameError)
-        PlayerControl.NotifyCode(curPlayer, "NameError")
         return
+    #C++过滤空格
+    #sendPack_Name = GameWorld.GetGameWorld().GetCharTrim(sendPack_Name)
+    
+    GameWorld.Log("创建角色: accID=%s,roleType=%s,job=%s,face=%s,modelMark=%s, name=%s" % (accID, roleType, job, face, modelMark, sendPack_Name) , curPlayerID)
+    
+    #if not CheckPlayerName(curPlayer , sendPack_Name):
+    #    #disRoleCreateError 人物创建的时候外观属性错误
+    #    #curPlayer.Kick(IPY_GameServer.disCreateRoleNameError)
+    #    PlayerControl.NotifyCode(curPlayer, "NameError")
+    #    return
+    
+    #sendPack_Name = GameWorld.GetPlayerFullName(curPlayer, sendPack_Name, serverID)
+    #if not sendPack_Name:
+    #    #curPlayer.Kick(IPY_GameServer.disCreateRoleNameError)
+    #    PlayerControl.NotifyCode(curPlayer, "NameError")
+    #   return
     
     #-----------------------性别校验
     #===========================================================================
@@ -145,7 +156,7 @@
     
     #---------------------职业检查
     openJob = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)
-    if sendPack_Job not in openJob:
+    if job not in openJob:
         #curPlayer.Kick(IPY_GameServer.disCreateRoleJobError)
         PlayerControl.NotifyCode(curPlayer, "CreatUnusual")
         return
@@ -173,10 +184,10 @@
     #    return
     #===========================================================================
     
-    createMapInfo = __GetCreateRoleMapInfo(sendPack_Job)
+    createMapInfo = __GetCreateRoleMapInfo(ipyData.GetCreateRoleMap())
     if not createMapInfo:
         PlayerControl.NotifyCode(curPlayer, "CreatUnusual")
-        GameWorld.ErrLog("没有职业对应创角地图信息:sendPack_Job=%s" % sendPack_Job, curPlayerID)
+        GameWorld.ErrLog("没有职业对应创角地图信息:sendPack_Job=%s" % job, curPlayerID)
         return
     dataMapID, lineID, posX, posY = createMapInfo
     mapID, copyMapID = PyGameData.g_commMapLineInfo.get((dataMapID, lineID), (dataMapID, 0))
@@ -188,98 +199,76 @@
     #GameWorld.DebugLog("SendToDBPlayerCreate dataMapID=%s,lineID=%s,posX=%s,posY=%s,mapID=%s,copyMapID=%s" 
     #                   % (dataMapID, lineID, posX, posY, mapID, copyMapID))
     #根据职业获得默认的属性, #STR//力量 ,PNE//智力,PHY//敏捷,CON//体力
-    baseSTR, basePNE, basePHY, baseCON = __GetPlayerBasePoint(sendPack_Job)
+    baseSTR, basePNE, basePHY, baseCON = 0, 0, 0, 0
     
     curPlayer.SendToDBPlayerCreate(
-                                    curPlayerID,                    #PlayerID,
-                                    sendPack_Name,                  #PlayerName, //size = 14
-                                    1,                              #inputAccState,		//0: 未创建, 1: 创建OK,正常登录 2:封号 3:已删除
-                                    0,                              #inputGMLevel   //GM等级, 0:不是GM  >=1 : GM的等级
-                                    sendPack_Sex,                   #Sex, //性别
-                                    sendPack_Hair,                  #Hair, //发型, 1.标准型(男) 2.名仕型 3.浪子型 4.标准型(女) 5.马髻型 6.妩媚型
-                                    sendPack_HairColor,             #HairColor, //头发颜色, 5种
-                                    sendPack_Face,                  #Face, //基本脸型
-                                    sendPack_FacePic,               #脸部图片
-                                    sendPack_Job,                   #Job, //职业
-                                    1,                              #LV, //等级
-                                    0,                              #TotalExp, //总经验
-                                    0,                              #FamilyID, //家族
-                                    1,                              #Country, //国家, 1.秦国(新手) 2.魏国 3.楚国   阵营
-                                    0,                              #Mate,
-                                    0,                              #Gold, //金子
-                                    0,                              #Silver, //银子
-                                    0,                              #金票
-                                    0,                              #银票
-                                    0,                              #FightPoint, //战斗值
-                                    0,                              #HappyPoint, //娱乐值
-                                    mapID,                          #MapID, //角色所在地图
-                                    dataMapID,                      #DataMapID, //地图分线ID
-                                    copyMapID,                      #CopyMapID, //副本地图ID
-                                    posX,                           #PosX, //角色坐标
-                                    posY,                           #PosY,
-                                    0,                              #State, //角色状态   1.封存 2.死亡 3.正常  以后还有陆续添加
-                                    100,                            #HP, //当前HP
-                                    100,                            #MP, //当前MP
-                                    0,                              #FreePoint, //未分配点数
-                                    0,                              #FreeSkillPoint,//未分配技能点数
-                                    baseSTR,                        #STR, //力量
-                                    basePNE,                        #PNE, //智力
-                                    basePHY,                        #PHY, //敏捷
-                                    baseCON,                        #CON, //体力
-                                    "",                             #Setting, //用户设定
-                                    0,                              #PKValue, //PK值
-                                    0,                              #ActiveValue, //击杀敌国阵营玩家和NPC的统计值
-                                    sendPack_PlayerType,            #PlayerType, //角色的五行属性,组队用 1. 金 2. 木 3. 水 4. 土 5. 火
-                                    "",                             #上次登录时间, 设置为空, 以便触发OnDay事件
-                                    0,                              #是否使用仓库密码
-                                    "111111",                       #仓库密码
-                                    IPY_GameServer.TYPE_Price_Gold_Paper,   #默认使用金票     (金子/金票)
+                                    curPlayerID, #PlayerID,
+                                    sendPack_Name, #PlayerName, //size = 14
+                                    1, #inputAccState,		//0: 未创建, 1: 创建OK,正常登录 2:封号 3:已删除
+                                    0, #inputGMLevel   //GM等级, 0:不是GM  >=1 : GM的等级
+                                    sendPack_Sex, #Sex, //性别
+                                    sendPack_Hair, #Hair, //发型, 1.标准型(男) 2.名仕型 3.浪子型 4.标准型(女) 5.马髻型 6.妩媚型
+                                    sendPack_HairColor, #HairColor, //头发颜色, 5种
+                                    face, #Face, //基本脸型
+                                    sendPack_FacePic, #脸部图片
+                                    job, #Job, //职业
+                                    1, #LV, //等级
+                                    0, #TotalExp, //总经验
+                                    0, #FamilyID, //家族
+                                    1, #Country, //国家, 1.秦国(新手) 2.魏国 3.楚国   阵营
+                                    0, #Mate,
+                                    0, #Gold, //金子
+                                    0, #Silver, //银子
+                                    0, #金票
+                                    0, #银票
+                                    0, #FightPoint, //战斗值
+                                    0, #HappyPoint, //娱乐值
+                                    mapID, #MapID, //角色所在地图
+                                    dataMapID, #DataMapID, //地图分线ID
+                                    copyMapID, #CopyMapID, //副本地图ID
+                                    posX, #PosX, //角色坐标
+                                    posY, #PosY,
+                                    0, #State, //角色状态   1.封存 2.死亡 3.正常  以后还有陆续添加
+                                    100, #HP, //当前HP
+                                    100, #MP, //当前MP
+                                    0, #FreePoint, //未分配点数
+                                    0, #FreeSkillPoint,//未分配技能点数
+                                    baseSTR, #STR, //力量
+                                    basePNE, #PNE, //智力
+                                    basePHY, #PHY, //敏捷
+                                    baseCON, #CON, //体力
+                                    "", #Setting, //用户设定
+                                    0, #PKValue, //PK值
+                                    0, #ActiveValue, //击杀敌国阵营玩家和NPC的统计值
+                                    sendPack_PlayerType, #PlayerType, //角色的五行属性,组队用 1. 金 2. 木 3. 水 4. 土 5. 火
+                                    "", #上次登录时间, 设置为空, 以便触发OnDay事件
+                                    0, #是否使用仓库密码
+                                    "111111", #仓库密码
+                                    IPY_GameServer.TYPE_Price_Gold_Paper, #默认使用金票     (金子/金票)
                                     IPY_GameServer.TYPE_Price_Silver_Money, #默认使用银子     (银子/银票)
-                                    80,                             #默认自动回血设定   inputHPRestoreSetting
-                                    80                              #默认自动回魔设定   inputMPRestoreSetting
+                                    80, #默认自动回血设定   inputHPRestoreSetting
+                                    80, #默认自动回魔设定   inputMPRestoreSetting
+                                    roleType,   #角色
+                                    modelMark   #外观
                                     )
     
     # 创角流向
     #DataRecordPack.DR_CreateRole(curPlayer.GetAccID(), sendPack_Name, sendPack_Job)
     return
+#---------------------------------------------------------------------
+def CheckIsServerCreateRoleLimit(curPlayer):
+    ## 服务器是否创角限制
+    groupID = GameWorld.GetServerGroupID()
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for i in xrange(ipyDataMgr.GetCreateRoleLimitServerCount()):
+        ipyData = ipyDataMgr.GetCreateRoleLimitServerByIndex(i)
+        if groupID in ipyData.GetLimitServerGroupIDList():
+            return True
+        for idA, idB in ipyData.GetLimitServerGroupIDRangeList():
+            if idA <= groupID <= idB:
+                return True
+    return False
 
-#---------------------------------------------------------------------
-## 获取玩家基础属性点
-#  @param sendPack_Job 职业类型
-#  @return baseSTR, basePNE, basePHY, baseCON
-#  @remarks 函数详细说明.
-def __GetPlayerBasePoint(sendPack_Job):
-    baseSTR, basePNE, basePHY, baseCON = (0, 0, 0, 0)
-    #{ 职业 : { key : value } }
-    
-    jobDict = IpyGameDataPY.GetFuncEvalCfg("CreatRolePoint%s" % sendPack_Job, 1)
-    
-    if not jobDict:
-        GameWorld.ErrLog('CreatRoleErr RoleBasePoint, job = %s' % (sendPack_Job))
-        return baseSTR, basePNE, basePHY, baseCON
-    
-    for key, value in jobDict.items():
-        
-        if type(key) == str:
-            key = key.upper()
-        
-        if key in ['STR', ShareDefine.Def_Effect_STR]:
-            baseSTR = value
-            
-        elif key in ['PNE', ShareDefine.Def_Effect_PNE]:
-            basePNE = value
-        
-        elif key in ['PHY', ShareDefine.Def_Effect_PHY]:
-            basePHY = value
-        
-        elif key in ['CON', ShareDefine.Def_Effect_CON]:
-            baseCON = value
-        
-        else:
-            GameWorld.ErrLog('CreatRoleErr RoleBasePoint, key = %s' % (key))
-    
-    return baseSTR, basePNE, basePHY, baseCON
-#---------------------------------------------------------------------
 ## 检查玩家名字是否合法(这里的PlayerName为过滤完空格的名字)
 #  @param curPlayer 当前玩家
 #  @param playerName 玩家名称
@@ -290,36 +279,36 @@
         return False
     
     if DirtyList.IsWordForbidden(playerName):
-        GameWorld.Log('玩家创建角色失败, 名字不合法 = %s'%(playerName))
+        GameWorld.Log('玩家创建角色失败, 名字不合法 = %s' % (playerName))
         return False
     
     playerNameLen = len(playerName)
     
     if playerNameLen < ChConfig.Def_CreatRole_MinStr:
-        GameWorld.Log('玩家创建角色失败, 角色名字过短 = %s , %s < %s'%(playerName, playerNameLen, ChConfig.Def_CreatRole_MinStr))
+        GameWorld.Log('玩家创建角色失败, 角色名字过短 = %s , %s < %s' % (playerName, playerNameLen, ChConfig.Def_CreatRole_MinStr))
         return False
     
     if playerNameLen > ChConfig.Def_CreatRole_MaxStr:
-        GameWorld.Log('玩家创建角色失败, 角色名字过长 = %s , %s > %s'%(playerName, playerNameLen, ChConfig.Def_CreatRole_MaxStr))
+        GameWorld.Log('玩家创建角色失败, 角色名字过长 = %s , %s > %s' % (playerName, playerNameLen, ChConfig.Def_CreatRole_MaxStr))
         return False
     
     return True
 
-def __GetCreateRoleMapInfo(job):
+def __GetCreateRoleMapInfo(createRoleMap):
     '''获取创角重生新手村地图
     @return: None
     @return: dataMapID, lineID, posX, posY
     '''
-    
-    createRoleMapDict = IpyGameDataPY.GetFuncEvalCfg("CreateRoleMap", 1) # {职业:[dataMapID, posX,posY], ...}
-    if job not in createRoleMapDict:
-        return
-    
-    createRoleDataMapID, posX, posY = createRoleMapDict[job]
+    createRoleDataMapID, posX, posY = createRoleMap
     mapShuntInfoDict = IpyGameDataPY.GetFuncEvalCfg("SetWorldPosShunt", 1) # 地图对应分流人数 {dataMapID:人数, ...}
     if createRoleDataMapID not in mapShuntInfoDict:
         return createRoleDataMapID, 0, posX, posY # 默认1线
     
+    activityLineIndex = 0 # 活动线默认1线
+    activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {})
+    if createRoleDataMapID in activityMapLineDict:
+        activityLineIndex = max(0, activityMapLineDict[createRoleDataMapID] - 1)
+        
     lineMaxPlayerCount = mapShuntInfoDict[createRoleDataMapID]
     emptyLineID = None
     heavyLineList = []
@@ -348,6 +337,11 @@
                 if dataMapID != createRoleDataMapID:
                     continue
                 
+                #创角不分配到非一线的活动线路
+                if lineID != 0 and lineID == activityLineIndex:
+                    #GameWorld.DebugLog("创角不分配到活动线!lineID=%s" % lineID)
+                    continue
+                
                 #GameWorld.DebugLog("        lineIndex=%s,lineID=%s,playerCnt=(%s/%s)" % (lineIndex, lineID, curPlayerCnt, maxPlayerCnt))
                 if curPlayerCnt >= lineMaxPlayerCount:
                     heavyLineList.append([curPlayerCnt, lineID])

--
Gitblit v1.8.0