ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -118,6 +118,14 @@
    except ValueError:
        return defValue
    
def ToFloat(input, defValue = 0):
    try:
        result = float(input)
        return result
    except ValueError:
        return defValue
## 判断2个对象是否同国籍 
#  @param srcObj 起点对象 
#  @param desObj 目标对象 
@@ -449,8 +457,8 @@
##获取玩家所属区服ID
# @param curPlayer
# @return
def GetPlayerServerID(curPlayer):
    accID = curPlayer.GetAccID()
def GetPlayerServerID(curPlayer): return GetAccIDServerID(curPlayer.GetAccID())
def GetAccIDServerID(accID):
    infoList = accID.split(Def_AccID_Split_Sign)
    return 0 if len(infoList) < 3 else int(infoList[-1][1:])
@@ -537,6 +545,23 @@
    return tagPlayer.GetRealMapID()
#---------------------------------------------------------------------
def GetTemplateID(ipyData, cfgID, dayIndex):
    if cfgID == None or dayIndex == None or not ipyData:
        return 0
    templateIDList = ipyData.GetTemplateIDList()
    if not templateIDList:
        return 0
    templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
    return templateID
def GetTemplateIDByList(templateIDList, dayIndex):
    if dayIndex == None:
        return 0
    if not templateIDList:
        return 0
    templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
    return templateID
def GetOperationActionDateStr(ipyData):
    ## 获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期
@@ -675,6 +700,15 @@
    return pastTimeDelta.days * 24 * 60 * 60 + pastTimeDelta.seconds
#---------------------------------------------------------------------
def GetDiff_Day(timeA , timeB):
    ## 获取 timeA - timeB 相差的日期天数
    dateTimeA = ChangeTimeNumToDatetime(timeA)
    dateTimeA = datetime.datetime(dateTimeA.year, dateTimeA.month, dateTimeA.day, 0, 0, 0)
    dateTimeB = ChangeTimeNumToDatetime(timeB)
    dateTimeB = datetime.datetime(dateTimeB.year, dateTimeB.month, dateTimeB.day, 0, 0, 0)
    return (dateTimeA - dateTimeB).days
##设置世界服务器字典
# @param key 字典值
# @param tick 时间戳
@@ -918,6 +952,17 @@
        return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName")
    return PyGameData.g_crossZoneName
def GetCrossServerTimeStr():
    ## 跨服服务器时间
    if IsCrossServer():
        return GetCurrentDataTimeStr()
    lastCrossServerTime, lastServerTime, _ = PyGameData.g_crossServerTimeInfo
    if not lastCrossServerTime:
        return GetCurrentDataTimeStr()
    curTime = int(time.time())
    crossServerTime = lastCrossServerTime + (curTime - lastServerTime)
    return ChangeTimeNumToStr(crossServerTime)
## 获取玩家的区服名,仅在跨服有效
#  @param curPlayer 玩家实例
#  @return: 区服名
@@ -985,16 +1030,59 @@
## 从列表中产生物品,[[权重, object], ....]
#  @param weightList 待选列表
def GetResultByWeightList(weightList):
def GetResultByWeightList(weightList, defValue=None):
    randList = []
    weight = 0
    for info in weightList:
        weight += info[0]
        randList.append([weight, info[1] if len(info) == 2 else info[1:]])
    if not randList:
        return
        return defValue
    rate = random.randint(1, randList[-1][0])
    return GetResultByRiseList(randList, rate)
    return GetResultByRiseList(randList, rate, defValue)
## 获得对应数位的值
#  @param numValue 数值
#  @param dataIndex 数位索引
#  @return 获得的值
def GetDataByDigitPlace(numValue, dataIndex):
    return (numValue/pow(10, dataIndex))%10
## 设置对应数位的值
#  @param numValue 数值
#  @param dataIndex 数位索引
#  @param dataValue 当前修改数值
#  @return 获得的值
def ChangeDataByDigitPlace(numValue, dataIndex, dataValue):
    if dataValue < 0 or dataValue > 9 or dataIndex > ShareDefine.Def_PDictDigitCnt:
        return numValue
    # 获得对应数位的值
    lastTagLV = GetDataByDigitPlace(numValue, dataIndex)
    numValue += pow(10, dataIndex)*(dataValue - lastTagLV)
    return numValue
def GetBitValue(dataValue, index):
    """ 得到某个字节值中某一位(Bit)的值
    @param dataValue: 待取值的字节值
    @param index: 待读取位的序号,从右向左0开始,0-7为一个完整字节的8个位
    @return: 返回读取该位的值,0或1
    """
    return 1 if dataValue & (1 << index) else 0
def SetBitValue(dataValue, index, val):
    """ 更改某个字节值中某一位(Bit)的值
    @param dataValue: 准备更改的字节原值
    @param index: 待更改位的序号,从右向左0开始,0-7为一个完整字节的8个位
    @param val: 目标位预更改的值,0或1
    @return: 返回更改后字节的值
    """
    if val:
        return dataValue | (1 << index)
    return dataValue & ~(1 << index)
## 根据字典key获取value值
#  @return 
@@ -1037,7 +1125,7 @@
#  @param order 名次,从1开始
#  @param isDefaultLast 找不到的名次是否默认取最后一名的
#  @return obj or None
def GetOrderValueByDict(orderDict, order, isDefaultLast=True):
def GetOrderValueByDict(orderDict, order, isDefaultLast=True, defaultValue=None):
    if order in orderDict:
        return orderDict[order]
    
@@ -1048,7 +1136,7 @@
                return orderDict[dOrder]
        
    # 找不到的默认取最后一名
    return orderDict[orderList[-1]] if isDefaultLast else None
    return orderDict[orderList[-1]] if isDefaultLast else defaultValue
##概率相关, 这个事件是否能够出现
# @param rate 基础几率
@@ -1061,17 +1149,36 @@
    
    return 0
def DebugAnswer(curPlayer, text):
def DebugAnswer(curPlayer, text, isLog=True):
    '''转码后再发DebugAnswer'''
    #===========================================================================
    # if not GetGameWorld().GetDebugLevel():
    #    return
    #===========================================================================
    DebugLog(text)
    if isLog:
        DebugLog(text)
    text = text.decode(ShareDefine.Def_Game_Character_Encoding).encode(GetCharacterEncoding())
    curPlayer.DebugAnswer(text)
    return
def CrossServerMsg_DebugAnswer(msgData):
    playerID, text = msgData
    curPlayer = GetPlayerManager().FindPlayerByID(playerID)
    if not curPlayer:
        return
    curPlayer.DebugAnswer(text)
    return
def DebugAnswerCross(playerID, serverGroupID, text):
    DebugLog(text)
    text = text.decode(ShareDefine.Def_Game_Character_Encoding).encode(GetCharacterEncoding())
    import CrossRealmMsg
    dataMsg = [playerID, text]
    serverGroupIDList = [serverGroupID]
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_DebugAnswer, dataMsg, serverGroupIDList)
    return
def GetMap(mapID): return IpyGameDataPY.GetIpyGameData("ChinMap", mapID)
def GetNPCData(npcID): return IpyGameDataPY.GetIpyGameData("ChinNPC", npcID)