hxp
2023-09-29 2a659639d74889599ed54458863a2f7b31ff4eff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
#!/usr/bin/python
# -*- coding: GBK -*-
#---------------------------------------------------------------------
#
#---------------------------------------------------------------------
##@package CreateRole
# ¶ÁÈ¡´´½¨½ÇÉ«·â°ü tagCreateRole 
#
# @author Alee
# @date 2010-02-20 16:30
# @version 1.6
#
# ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
# @change: "2013-02-20 16:30" Alee ½ÇÉ«Ãû³¤¶ÈΪ33×Ö½Ú£¬¿Í»§¶ËÈ¡Ãû×î¶à14¸ö×Ö½Ú
# @change: "2013-05-27 22:00" Alee ÏÞÖÆ¿É´´½¨Ö°Òµ
# @change: "2014-08-15 19:30" hxp ´´½Ç¸ù¾ÝµØÍ¼ÈËÊýÏÞÖÆ·ÖÁ÷
# @change: "2014-12-08 19:00" hxp Ôö¼Ó´´½ÇÁ÷Ïò
# @change: "2016-03-28 17:00" hxp ´´½ÇÈ«Ãû¸ñʽÅäÖÃ
# @change: "2016-08-22 18:00" hxp Ö§³ÖÐéÄâ·ÖÏßÈËÊý¿ØÖÆ
#---------------------------------------------------------------------
#"""Version = 2016-08-22 18:00"""
#---------------------------------------------------------------------
#import DataRecordPack
import IPY_GameServer
import IpyGameDataPY
import DirtyList
import GameWorld
import random
import ChConfig
import ShareDefine
import PlayerControl
import PyGameData
#---------------------------------------------------------------------
g_CreateRoleAccID = {}
 
#---------------------------------------------------------------------
#===============================================================================
# //01 05 ´´½¨½ÇÉ«#tagCCreateRole
# tagCCreateRole       *   GettagCCreateRole();
# class   IPY_CCreateRole
# {
# public:
#    char *   GetName();
#    int      GetSex();
#    int      GetHair();
#    int      GetHairColor();  //·¢É«, ²»ÑéÖ¤
#    int      GetFace();
#    
#    int      GetFacePic();   //Á³Æ×
#    
#    int      GetPlayerType();  //1. ½ð 2. Ä¾ 3. Ë® 4. ÍÁ 5. »ð
#    
#    int      GetJob();     // Ö°Òµ
# }; 
#===============================================================================
## ´´½¨½ÇÉ«
#  @param index Íæ¼ÒË÷Òý
#  @param tick µ±Ç°Ê±¼ä
#  @return None
#  @remarks º¯ÊýÏêϸ˵Ã÷.
def CreateRole(index, tick):
    GameWorld.GetPsycoFunc(__Func_CreateRole)(index, tick)
    return
 
## ´´½¨½ÇÉ«
#  @param index Íæ¼ÒË÷Òý
#  @param tick µ±Ç°Ê±¼ä
#  @return None
#  @remarks º¯ÊýÏêϸ˵Ã÷.
def __Func_CreateRole(index, tick):
    global g_CreateRoleAccID
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    curPlayerID = curPlayer.GetID()
    
    if curPlayerID > 9999:
        # ËµÃ÷½ÇÉ«´´½¨³É¹¦
        PlayerControl.NotifyCode(curPlayer, "CreatSuccess")
        return
    
    if CheckIsServerCreateRoleLimit(curPlayer):
        PlayerControl.NotifyCode(curPlayer, "ServerCreateRoleLimit")
        return
    
    # CD±£»¤
    createSafeTick = 3000
    accID = curPlayer.GetAccID()
 
    if accID not in g_CreateRoleAccID:
        g_CreateRoleAccID[accID] = tick
    else:
        if tick - g_CreateRoleAccID[accID] < createSafeTick:
            PlayerControl.NotifyCode(curPlayer, "CreatingCharacter")
            return
        g_CreateRoleAccID[accID] = tick
        
    if len(g_CreateRoleAccID) > 100 :
        # Çå¿Õ´óÓÚ3ÃëµÄ
        tmpDict = []
        for accID, safeTick in g_CreateRoleAccID.items():
            if tick - safeTick > createSafeTick + 1000:
                tmpDict.append(accID)
        
        for accID in tmpDict:
            g_CreateRoleAccID.pop(accID)
        
    #»ñÈ¡·â°ü²ÎÊý
    sendPack = IPY_GameServer.IPY_CCreateRole()
    
    sendPack_Name = sendPack.GetName()
    sendPack_Sex = 1 #sendPack.GetSex()
    sendPack_Hair = 10001 #sendPack.GetHair()
    sendPack_HairColor = 1 #sendPack.GetHairColor()
    sendPack_Face = 10005 #sendPack.GetFace()
    sendPack_FacePic = 0 # ¹Ì¶¨Îª0£¬ÐèÓë¿Í»§¶ËÅäÖÃÒ»ÖÂ
    serverID = 1 #sendPack.GetFacePic() # Á³Æ××÷ΪserverIDÓÃ
    sendPack_PlayerType = 1 #sendPack.GetPlayerType()
    sendPack_Job = sendPack.GetJob()
    
    #-----------------------Ãû×ÖУÑé
    #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)
    if not sendPack_Name:
        #curPlayer.Kick(IPY_GameServer.disCreateRoleNameError)
        PlayerControl.NotifyCode(curPlayer, "NameError")
        return
    
    #-----------------------ÐÔ±ðУÑé
    #===========================================================================
    # if sendPack_Sex not in [1, 2]:
    #    curPlayer.Kick(IPY_GameServer.disCreateRoleSexError)
    #    return
    #===========================================================================
    
    #---------------------Ö°Òµ¼ì²é
    openJob = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)
    if sendPack_Job not in openJob:
        #curPlayer.Kick(IPY_GameServer.disCreateRoleJobError)
        PlayerControl.NotifyCode(curPlayer, "CreatUnusual")
        return
 
    #-----------------------·¢ÐÍУÑé
#    if sendPack_Hair not in ChConfig.Def_RoleHair[sendPack_Job][sendPack_Sex - 1]:
#        #·¢ÐÍ´íÎó
#        GameWorld.Log("Hair = %d Error!,ÌßÍæ¼ÒÏÂÏß"%(sendPack_Hair), curPlayerID)
#        curPlayer.Kick(IPY_GameServer.disCreateRoleHairError)
#        return
    
    #----------------------Á³ÐÍУÑé
    #===========================================================================
    # if sendPack_Face not in ChConfig.Def_RoleFace[sendPack_Job][sendPack_Sex - 1]:
    #    #Á³ÐÍ´íÎó
    #    GameWorld.Log("Face = %d Error!,ÌßÍæ¼ÒÏÂÏß"%(sendPack_Face) , curPlayerID)
    #    curPlayer.Kick(IPY_GameServer.disCreateRoleFaceError)
    #    return
    #===========================================================================
 
    #---------------------ÎåÐмì²é
    #===========================================================================
    # if sendPack_PlayerType not in range(1 , 5 + 1):
    #    curPlayer.Kick(IPY_GameServer.disCreateRolePlayerTypeError)
    #    return
    #===========================================================================
    
    createMapInfo = __GetCreateRoleMapInfo(sendPack_Job)
    if not createMapInfo:
        PlayerControl.NotifyCode(curPlayer, "CreatUnusual")
        GameWorld.ErrLog("ûÓÐÖ°Òµ¶ÔÓ¦´´½ÇµØÍ¼ÐÅÏ¢:sendPack_Job=%s" % sendPack_Job, curPlayerID)
        return
    dataMapID, lineID, posX, posY = createMapInfo
    mapID, copyMapID = PyGameData.g_commMapLineInfo.get((dataMapID, lineID), (dataMapID, 0))
    
    bornRange = 1
    posX += random.randint(-bornRange, bornRange)
    posY += random.randint(-bornRange, bornRange)
    
    #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 = 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,   #ĬÈÏʹÓÃ½ðÆ±     (½ð×Ó/½ðƱ)
                                    IPY_GameServer.TYPE_Price_Silver_Money, #ĬÈÏʹÓÃÒø×Ó     (Òø×Ó/񿮱)
                                    80,                             #ĬÈÏ×Ô¶¯»ØÑªÉ趨   inputHPRestoreSetting
                                    80                              #ĬÈÏ×Ô¶¯»ØÄ§É趨   inputMPRestoreSetting
                                    )
    
    # ´´½ÇÁ÷Ïò
    #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
 
## ¼ì²éÍæ¼ÒÃû×ÖÊÇ·ñºÏ·¨(ÕâÀïµÄPlayerNameΪ¹ýÂËÍê¿Õ¸ñµÄÃû×Ö)
#  @param curPlayer µ±Ç°Íæ¼Ò
#  @param playerName Íæ¼ÒÃû³Æ
#  @return True or False
#  @remarks º¯ÊýÏêϸ˵Ã÷.
def CheckPlayerName(curPlayer , playerName):
    if playerName.strip() == "":
        return False
    
    if DirtyList.IsWordForbidden(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))
        return False
    
    if playerNameLen > ChConfig.Def_CreatRole_MaxStr:
        GameWorld.Log('Íæ¼Ò´´½¨½Çɫʧ°Ü, ½ÇÉ«Ãû×Ö¹ý³¤ = %s , %s > %s'%(playerName, playerNameLen, ChConfig.Def_CreatRole_MaxStr))
        return False
    
    return True
 
def __GetCreateRoleMapInfo(job):
    '''»ñÈ¡´´½ÇÖØÉúÐÂÊÖ´åµØÍ¼
    @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]
    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 = []
    
    mapServerStateManager = GameWorld.GetGameWorld().GetMapServerStateManager()
    zoneServerCnt = mapServerStateManager.GetZoneServerCnt()
    #GameWorld.DebugLog("´´½ÇÖØÉúÐÂÊÖ´åµØÍ¼×´Ì¬ zoneServerCnt=%s,job=%s,createRoleDataMapID=%s,lineMaxPlayerCount=%s" 
    #                   % (zoneServerCnt, job, createRoleDataMapID, lineMaxPlayerCount))
    for zoneIndex in range(zoneServerCnt):
        zoneServerState = mapServerStateManager.GetZoneServerByIndex(zoneIndex)
        routeServerIndex = zoneServerState.GetRouteServerIndex()
        mapCount = zoneServerState.GetMapCount()
        #GameWorld.DebugLog("  ZoneServerState.routeServerIndex=%s,mapCount=%s" % (routeServerIndex, mapCount))
        for i in range(mapCount):
            mapServerState = zoneServerState.GetMapServerStateByIndex(i)
            dataMapID = mapServerState.GetMapID()
            lineCount = mapServerState.GetLineCount()
            #GameWorld.DebugLog("    MapServerState dataMapID=%s,lineCount=%s" % (dataMapID, lineCount))
            for lineIndex in range(lineCount):
                lineState = mapServerState.GetLineByIndex(lineIndex)
                dataMapID = lineState.GetMapID()
                lineID = lineState.GetLineID()
                curPlayerCnt = lineState.GetCurPlayerCnt()
                maxPlayerCnt = lineState.GetMaxPlayerCnt()
                
                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])
                    
                elif not curPlayerCnt and emptyLineID == None:
                    emptyLineID = lineID
                    
                # ÒѾ­ÓÐÈË£¬ÇÒ»¹Î´´ïµ½¹æ¶¨ÈËÊýµÄ£¬Ö±½ÓʹÓøÃÏß·
                elif curPlayerCnt:
                    return createRoleDataMapID, lineID, posX, posY
                
    # ÓпÕÏß·£¬ÔòÖ±½ÓʹÓà           
    if emptyLineID != None:
        return createRoleDataMapID, emptyLineID, posX, posY
    
    if not heavyLineList:
        return
    
    # Ã»ÓпÕÏß·ÁË£¬È¡ÈËÊý½ÏÉÙµÄ
    heavyLineList.sort()
    heavyLineID = heavyLineList[0][1]
    return createRoleDataMapID, heavyLineID, posX, posY