16 卡牌服务端(服务器Event事件触发改为地图如OnDay等;地图开服事件流程;)
13个文件已修改
1个文件已删除
9个文件已添加
1334 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBEventTrig.py 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBMail.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerDay.py 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GetOpenServerDay.py 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnMonth.py 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnYear.py 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py 309 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 303 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GMDateTime.py 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -22348,6 +22348,102 @@
#------------------------------------------------------
# A1 03 同步开服天数 #tagMCOpenServerDay
class  tagMCOpenServerDay(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Day", c_ushort),    # 已开服天数,从0开始
                  ("IsMixServer", c_ubyte),    #是否是合服服务器
                  ("MixDay", c_ushort),    # 已合服天数,从0开始
                  ("OpenWeekday", c_ubyte),    #开服是周几,1代表周一
                  ("NowYear", c_ushort),    #服务器当前时间 - 年
                  ("NowMonth", c_ubyte),
                  ("NowDay", c_ubyte),
                  ("NowHour", c_ubyte),
                  ("NowMinute", c_ubyte),
                  ("NowSecond", c_ubyte),
                  ("NowMicSecond", c_int),
                  ("WeekOfYear", c_ubyte),    #一年中的第几周
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA1
        self.SubCmd = 0x03
        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 = 0xA1
        self.SubCmd = 0x03
        self.Day = 0
        self.IsMixServer = 0
        self.MixDay = 0
        self.OpenWeekday = 0
        self.NowYear = 0
        self.NowMonth = 0
        self.NowDay = 0
        self.NowHour = 0
        self.NowMinute = 0
        self.NowSecond = 0
        self.NowMicSecond = 0
        self.WeekOfYear = 0
        return
    def GetLength(self):
        return sizeof(tagMCOpenServerDay)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A1 03 同步开服天数 //tagMCOpenServerDay:
                                Cmd:%s,
                                SubCmd:%s,
                                Day:%d,
                                IsMixServer:%d,
                                MixDay:%d,
                                OpenWeekday:%d,
                                NowYear:%d,
                                NowMonth:%d,
                                NowDay:%d,
                                NowHour:%d,
                                NowMinute:%d,
                                NowSecond:%d,
                                NowMicSecond:%d,
                                WeekOfYear:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Day,
                                self.IsMixServer,
                                self.MixDay,
                                self.OpenWeekday,
                                self.NowYear,
                                self.NowMonth,
                                self.NowDay,
                                self.NowHour,
                                self.NowMinute,
                                self.NowSecond,
                                self.NowMicSecond,
                                self.WeekOfYear
                                )
        return DumpString
m_NAtagMCOpenServerDay=tagMCOpenServerDay()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCOpenServerDay.Cmd,m_NAtagMCOpenServerDay.SubCmd))] = m_NAtagMCOpenServerDay
#------------------------------------------------------
#A1 07 玩家掉率加成 #tagMCPlayerDropRate
class  tagMCPlayerDropRate(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py
@@ -17,6 +17,7 @@
import GameWorld
import PyGameData
import DBEventTrig
import DBPlayerViewCache
import DBFamily
import DBMail
@@ -48,9 +49,6 @@
    curMinute = curTime.minute
    ServerDataBackup()
    DBFamily.OnMinute(curMinute)
    return
def OnDayEx():
    return
#------------------------------------------- 备档 ---------------------------------------------------
@@ -163,6 +161,7 @@
class PyGameDataManager(object):
    def __init__(self):
        self.EventTrigMgr = DBEventTrig.EventTrigMgr()
        self.PlayerViewCacheMgr = DBPlayerViewCache.PlayerViewCacheMgr()
        self.FamilyMgr = DBFamily.FamilyMgr()
        self.MailMgr = DBMail.MailMgr()
@@ -170,6 +169,7 @@
    
    def GetSaveData(self):
        buff = ""
        buff += self.EventTrigMgr.GetSaveData()
        buff += self.PlayerViewCacheMgr.GetSaveData()
        buff += self.FamilyMgr.GetSaveData()
        buff += self.MailMgr.GetSaveData()
@@ -177,6 +177,7 @@
    
    def LoadGameData(self, gameBuffer, pos):
        dataslen = len(gameBuffer)
        pos = self.EventTrigMgr.LoadPyGameData(gameBuffer, pos, dataslen)
        pos = self.PlayerViewCacheMgr.LoadPyGameData(gameBuffer, pos, dataslen)
        pos = self.FamilyMgr.LoadPyGameData(gameBuffer, pos, dataslen)
        pos = self.MailMgr.LoadPyGameData(gameBuffer, pos, dataslen)
@@ -190,6 +191,11 @@
        PyGameData.g_pyGameDataManager = pyGameDataMgr
    return pyGameDataMgr
def GetEventTrigMgr():
    ## 事件值管理器
    dbDataMgr = GetDBDataMgr()
    return dbDataMgr.EventTrigMgr
def GetPlayerViewCacheMgr():
    ## 玩家查看缓存数据管理器
    dbDataMgr = GetDBDataMgr()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py
@@ -666,7 +666,67 @@
        else:
            self.Operate = Str[:15]
# 事件触发表 #tagDBEventTrig
class tagDBEventTrig(Structure):
    _pack_ = 1
    _fields_ = [
        ('EventLen', ctypes.c_ulong),
        ('EventID', ctypes.c_char_p),
        ('EventValue', ctypes.c_ulong),
        ('ADOResult', ctypes.c_ulong),
    ]
    def __init__(self):
        Structure.__init__(self)
        self.clear()
    def clear(self):
        self.EventLen = 0
        self.EventID = ''
        self.EventValue = 0
    def readData(self, buf, pos = 0, length = 0):
        if not pos <= length:
            return -1
        if len(buf) < pos + self.getLength():
            return -1
        self.clear()
        self.EventLen, pos = CommFunc.ReadDWORD(buf, pos)
        tmp, pos = CommFunc.ReadString(buf, pos, self.EventLen)
        self.EventID = ctypes.c_char_p(tmp)
        self.EventValue, pos = CommFunc.ReadDWORD(buf, pos)
        return self.getLength()
    def getBuffer(self):
        buf = ''
        buf = CommFunc.WriteDWORD(buf, self.EventLen)
        buf = CommFunc.WriteString(buf, self.EventLen, self.EventID)
        buf = CommFunc.WriteDWORD(buf, self.EventValue)
        return buf
    def getLength(self):
        length = 0
        length += sizeof(ctypes.c_ulong)
        length += self.EventLen
        length += sizeof(ctypes.c_ulong)
        return length
    def outputString(self):
        output = '''// 事件触发表 #tagDBEventTrig:
            EventLen = %s,
            EventID = %s,
            EventValue = %s,
            ADOResult = %s,
            '''%(
                self.EventLen,
                self.EventID,
                self.EventValue,
                self.ADOResult,
            )
        return output
# 家族表 #tagDBFamily
class tagDBFamily(Structure):
    _pack_ = 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBEventTrig.py
New file
@@ -0,0 +1,85 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package DB.StructData.DBEventTrig
#
# @todo:事件触发值管理器
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 事件触发值管理器
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import DBStruct
import GameWorld
import CommFunc
class EventTrigMgr():
    def __init__(self):
        self.__eventDict = {} # 事件字典 {key:value, ...}
        return
    def GetDict(self): return self.__eventDict
    def GetValue(self, key, defaultValue=0):
        if key in self.__eventDict:
            return self.__eventDict[key]
        return defaultValue
    def SetValue(self, key, value):
        self.__eventDict[key] = value
        return value
    def DelAllKey(self, excludeList=[]):
        ## 删除所有记录
        # @param excludeList: 不包含的key列表
        self.__eventDict = {k:self.GetValue(k) for k in excludeList}
        return
    def DelKey(self, key):
        return self.__eventDict.pop(key, None)
    def SetValueIncrement(self, key):
        ## 设定服务器事件(该事件记录为数值从1一直自增累加)
        # @return: 自增后的值
        value = self.GetValue(key, 0)
        return self.SetValue(key, value + 1)
    # 保存数据 存数据库和realtimebackup
    def GetSaveData(self):
        savaData = ""
        cntData = ""
        cnt = 0
        dbData = DBStruct.tagDBEventTrig()
        for key, value in self.__eventDict.items():
            if not value:
                continue
            dbData.clear()
            dbData.EventID = key
            dbData.EventLen = len(dbData.EventID)
            dbData.EventValue = value
            cnt += 1
            savaData += dbData.getBuffer()
        GameWorld.Log("Save DBEventTrig count :%s len=%s" % (cnt, len(savaData)))
        return CommFunc.WriteDWORD(cntData, cnt) + savaData
    # 从数据库载入数据
    def LoadPyGameData(self, datas, pos, dataslen):
        cnt, pos = CommFunc.ReadDWORD(datas, pos)
        GameWorld.Log("Load DBEventTrig count :%s" % cnt)
        dbData = DBStruct.tagDBEventTrig()
        for _ in xrange(cnt):
            pos += dbData.readData(datas, pos, dataslen)
            self.__eventDict[dbData.EventID] = dbData.EventValue
        return pos
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py
@@ -480,6 +480,13 @@
        self.__familyIDDict.pop(familyID, None)
        return family
    
    def DelAllFamily(self):
        for index in range(self.GetCount())[::-1]:
            family = self.GetAt(index)
            familyID = family.GetID()
            self.DelFamily(familyID)
        return
    def GetCount(self): return len(self.__familyList)
    def GetAt(self, index):
        family = None
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBMail.py
@@ -329,6 +329,13 @@
        playerStateDict = self.__serverMailPlayerStateDict.pop(guid, {})
        return playerStateDict
    
    def DelAllMail(self):
        self.__personalMailDict = {}
        self.__mailItemDict = {}
        self.__serverMailDict = {}
        self.__serverMailPlayerStateDict = {}
        return
    # 保存数据 存数据库和realtimebackup
    def GetSaveData(self):
        saveData = ""
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py
@@ -223,6 +223,13 @@
        self.__serverIDRangePlayerIDDict = {}
        return
    
    def DelAllCache(self):
        self.__viewCacheList = []
        self.__idIndexDict = {}
        self.__needSort = False
        self.__serverIDRangePlayerIDDict = {}
        return
    def GetCount(self): return len(self.__viewCacheList)    
    def At(self, index):
        viewCache = self.__viewCacheList[index]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearOpenServerDay.py
New file
@@ -0,0 +1,52 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.ClearOpenServerDay
#
# @todo:清除开服天
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 清除开服天
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import GameWorld
import ShareDefine
import GameWorldEvent
import DBDataMgr
import ChPlayer
import time
#---------------------------------------------------------------------
## 执行逻辑
#  @param curPlayer 当前玩家
#  @param cmdList 参数
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, cmdList):
    #重置开服天,设置非合服
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_ServerWeek, 0)
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_ServerDay, 0)
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_IsMixServer, 0)
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_MixServerDay, 0)
    curTime = int(time.time())
    GameWorldEvent.SetInitOpenServerTime(curTime)
    if curPlayer:
        ChPlayer.Sync_OpenServerDay(curPlayer)
        ServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
        IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
        MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1
        OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
        GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s' % (OpenWeekday, ServerDay, IsMixServer, MixDay))
    # 暂时同步GameServer,之后可去除
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GetOpenServerDay.py
New file
@@ -0,0 +1,36 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.GetOpenServerDay
#
# @todo:获取开服天
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 获取开服天
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import DBDataMgr
import ShareDefine
import GameWorld
## 执行逻辑
#  @param curPlayer 当前玩家
#  @param cmdList 参数
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, cmdList):
    ServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
    IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
    MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1
    OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
    GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s' % (OpenWeekday, ServerDay, IsMixServer, MixDay))
    # 暂时同步GameServer,之后可去除
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnDay.py
New file
@@ -0,0 +1,38 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.test_OnDay
#
# @todo:模拟过天
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 模拟过天
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import GameWorld
import PlayerEventCounter
import GameWorldEvent
def OnExec(curPlayer, gmList):
    __DoExec(GameWorld.GetGameWorld().GetTick())
    # 暂时同步GameServer,之后可去除
    return True
def __DoExec(tick):
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerEventCounter.GMDateTime(curPlayer, "GMOnDay")
    GameWorldEvent.OnHour(tick)
    GameWorldEvent.OnDay(tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnHour.py
New file
@@ -0,0 +1,37 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.test_OnHour
#
# @todo:模式过小时
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 模式过小时
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import GameWorld
import PlayerEventCounter
import GameWorldEvent
def OnExec(curPlayer, gmList):
    __DoExec(GameWorld.GetGameWorld().GetTick())
    # 暂时同步GameServer,之后可去除
    return True
def __DoExec(tick):
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerEventCounter.GMDateTime(curPlayer, "GMOnHour")
    GameWorldEvent.OnHour(tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnMonth.py
New file
@@ -0,0 +1,40 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.test_OnMonth
#
# @todo:模拟过月
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 模拟过月
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import GameWorld
import PlayerEventCounter
import GameWorldEvent
def OnExec(curPlayer, gmList):
    __DoExec(GameWorld.GetGameWorld().GetTick())
    # 暂时同步GameServer,之后可去除
    return True
def __DoExec(tick):
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerEventCounter.GMDateTime(curPlayer, "GMOnMonth")
    GameWorldEvent.OnHour(tick)
    GameWorldEvent.OnDay(tick)
    GameWorldEvent.OnWeek(tick)
    GameWorldEvent.OnMonth(tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnWeek.py
New file
@@ -0,0 +1,39 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.test_OnWeek
#
# @todo:模拟过周
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 模拟过周
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import GameWorld
import PlayerEventCounter
import GameWorldEvent
def OnExec(curPlayer, gmList):
    __DoExec(GameWorld.GetGameWorld().GetTick())
    # 暂时同步GameServer,之后可去除
    return True
def __DoExec(tick):
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerEventCounter.GMDateTime(curPlayer, "GMOnWeek")
    GameWorldEvent.OnHour(tick)
    GameWorldEvent.OnDay(tick)
    GameWorldEvent.OnWeek(tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/test_OnYear.py
New file
@@ -0,0 +1,41 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.test_OnYear
#
# @todo:模拟过年
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 模拟过年
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import GameWorld
import PlayerEventCounter
import GameWorldEvent
def OnExec(curPlayer, gmList):
    __DoExec(GameWorld.GetGameWorld().GetTick())
    # 暂时同步GameServer,之后可去除
    return True
def __DoExec(tick):
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerEventCounter.GMDateTime(curPlayer, "GMOnYear")
    GameWorldEvent.OnHour(tick)
    GameWorldEvent.OnDay(tick)
    GameWorldEvent.OnWeek(tick)
    GameWorldEvent.OnMonth(tick)
    GameWorldEvent.OnYear(tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -1318,6 +1318,10 @@
    ## 服务器组ID,必须唯一,代表这台物理服务器
    return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "GroupID"), 0)
def GetServerID():
    ## 当前服务器ID
    return 87
def GetMainServerID(serverID):
    ## 获取服务器ID所属主服ID
    ServerIDMainServerDict = IpyGameDataPY.GetConfigEx("ServerIDMainServerDict")
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldEvent.py
New file
@@ -0,0 +1,309 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GameWorldLogic.GameWorldEvent
#
# @todo:服务器世界事件
# @author hxp
# @date 2025-05-15
# @version 1.0
#
# 详细描述: 服务器世界事件
#
#-------------------------------------------------------------------------------
#"""Version = 2025-05-15 10:35"""
#-------------------------------------------------------------------------------
import DBDataMgr
import GameWorld
import PlayerEventCounter
import ShareDefine
import PyGameData
import datetime
import time
def Get_Server_Year(): return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_Server_Year)
def Set_Server_Year():
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_Server_Year, datetime.datetime.today().year)
    return
def Get_Server_Month(): return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_Server_Month)
def Set_Server_Month():
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_Server_Month, datetime.datetime.today().month)
    return
def Get_Server_Week(): return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_Server_Week)
def Set_Server_Week():
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_Server_Week, datetime.datetime.isocalendar(datetime.datetime.today())[1])
    return
def Get_Server_Day(): return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_Server_Day)
def Set_Server_Day():
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_Server_Day, datetime.datetime.today().day)
    return
def Get_Server_Hour(): return DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_Server_Hour)
def Set_Server_Hour():
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_Server_Hour, datetime.datetime.today().hour)
    return
def InitServerTime():
    ## 初始化服务器时间
    if not Get_Server_Year():
        Set_Server_Hour()
        Set_Server_Day()
        Set_Server_Week()
        Set_Server_Month()
        Set_Server_Year()
        GameWorld.Log('###服务器新开, 初始化服务器时间 !')
    return Get_Server_Hour(), Get_Server_Day(), Get_Server_Week(), Get_Server_Month(), Get_Server_Year()
def InitGameWorld(tick):
    ## GameWorld初始化
    if PyGameData.g_initGameTime:
        return
    PyGameData.g_initGameTime = int(time.time())
    serverID = GameWorld.GetServerID()
    GameWorld.Log("服务器启动初始化InitGameWorld: serverID=%s" % serverID)
    DBDataMgr.OnServerStart() # 优先加载公共数据
    LoadDBPlayer()
    #初始话开服时间、星期几
    initOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
    openServerWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
    if initOpenServerTime <= 0 or openServerWeekday <= 0:
        #记录首次开发时间(现实时间戳)
        SetInitOpenServerTime(initOpenServerTime if initOpenServerTime else int(time.time()))
    #合服首次启动加载处理
    __DoMixServerInit()
    # 其他功能初始化
    OnHighProcess(tick) # 主动触发一次高精度的调用,确保服务器启动后一些功能活动等的数据会被加载
    OnMinute(tick)
    GameWorld.Log("=============================== 服务器启动成功 ===================================")
    isCrossServer = GameWorld.IsCrossServer()
    if isCrossServer:
        pass
    else:
        serverGroupID = GameWorld.GetServerGroupID()
        GameWorld.Log("服务器启动成功: ServerGroupID=%s,serverID=%s" % (serverGroupID, serverID))
    GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_WorldKey_GameWorldInitOK, 1)
    return
def AllMapServerInitOK(tick):
    return
def LoadDBPlayer():
    if GameWorld.IsCrossServer():
        return
    #PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet)
    return
def GMSetOpenServerTime(openServerTime):
    '''GM设置开服时间
    @param openServerTime: 开服时间戳
    @return: 1-成功;-1-设置的时间异常;-2-已经设置过且开服了,不能重复设置
    '''
    serverID = GameWorld.GetServerID()
    curTime = int(time.time())
    if openServerTime < curTime:
        GameWorld.ErrLog("当前时间已经超过设置的开服时间,不能设置! serverID=%s" % serverID)
        #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_InvalidTime, "The set time is less than the current time.")
        return -1
    setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
    if setOpenServerTime and curTime > setOpenServerTime:
        GameWorld.ErrLog("已经设置过且开服了,不能重复设置! serverID=%s" % serverID)
        #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ServerAlreadyOpen, "The server has been opened.")
        return -2
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, openServerTime)
    GameWorld.Log("GM设置开服时间: serverID=%s,%s,%s" % (serverID, GameWorld.ChangeTimeNumToStr(openServerTime), openServerTime))
    if openServerTime == curTime:
        OnNewServerOpen(GameWorld.GetGameWorld().GetTick())
    return 1
def DoCheckNewServerOpen(tick):
    setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
    if not setOpenServerTime:
        #GameWorld.DebugLog("没有指定开服时间!")
        return
    curOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
    if curOpenServerTime == setOpenServerTime:
        #GameWorld.DebugLog("已经正式开服过了!")
        return
    curTime = int(time.time())
    if curTime < setOpenServerTime:
        #GameWorld.DebugLog("还未到正式开服时间!")
        return
    OnNewServerOpen(tick)
    return
def OnNewServerOpen(tick):
    '''新服开启需要处理的逻辑'''
    serverID = GameWorld.GetServerID()
    GameWorld.Log("执行正式开服重置逻辑... serverID=%s" % serverID)
    setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
    if not setOpenServerTime:
        return
    #清DBGSTrig
    excludeList = [ShareDefine.Def_InitOpenServerTime, ShareDefine.Def_SetOpenServerTime]
    DBDataMgr.GetEventTrigMgr().DelAllKey(excludeList)
    #清家族
    DBDataMgr.GetFamilyMgr().DelAllFamily()
    #清邮件
    DBDataMgr.GetMailMgr().DelAllMail()
    DBDataMgr.GetPlayerViewCacheMgr().DelAllCache()
    SetInitOpenServerTime(setOpenServerTime)
    AllMapServerInitOK(tick)
    GameWorld.GetGameWorld().SaveGameServerData()
    GameWorld.SendGameError("ClearOpenServerOK")
    return
def SetInitOpenServerTime(initTime):
    openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
    openServerWeekday = openDatetime.weekday() + 1
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_InitOpenServerTime, initTime)
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_OpenServerWeekday, openServerWeekday)
    GameWorld.Log("设置开服时间: %s(%s), 周%s" % (openDatetime, initTime, openServerWeekday))
    # 需要这个参数主要是GM工具会判断是否有设置过,所以该值一般只有GM命令或工具才能设置
    setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
    if setOpenServerTime and setOpenServerTime != initTime:
        DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, initTime)
        GameWorld.Log("    同步更新 Def_SetOpenServerTime=%s" % initTime)
    return
def __DoMixServerInit():
    isMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
    if not isMixServer:
        GameWorld.DebugLog("非合服,不处理合服首次启动数据加载!")
        return
    isMixServerInitOK = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServerInitOK)
    if isMixServerInitOK:
        GameWorld.DebugLog("合服首次启动加载已经处理过!")
        return
    GameWorld.Log("合服首次启动加载处理...")
    # 清除指定通用数据,一般是合服工具删,这里可以再做个补充
    #universalRecMgr = GameWorld.GetUniversalRecMgr()
    #delRecTypeList = []
    #GameWorld.Log("清除指定通用数据 delRecTypeList=%s" % str(delRecTypeList))
    #for delRecType in delRecTypeList:
    #    universalRecMgr.Delete(delRecType)
    # 删除过期的通用数据
    #__DelOutofdayRecData(universalRecMgr)
    # 设置合服首次启动加载成功
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_IsMixServerInitOK, 1)
    # 设置本次合服时的开服天数、世界等级
    serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay)
    DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_LastMixServerDay, serverDay)
    GameWorld.Log("    合服首次启动加载成功! serverDay=%s" % (serverDay))
    return
def OnHighProcess(tick):
    ## 每秒分钟执行一次
    return
def OnMinute(tick):
    ## 每整分钟执行一次
    curTime = GameWorld.GetCurrentTime()
    #检查服务器正式开服
    DoCheckNewServerOpen(tick)
    DBDataMgr.OnMinute(curTime)
    DoLogic_GameWorldEvenByTime(tick)
    #其他功能逻辑
    #GameWorldActionControl.Dispose_OperationActionState()
    #GameWorldActionControl.Dispose_DailyActionState()
    #GameWorldActionControl.Dispose_FBStateTime()
    return
def DoLogic_GameWorldEvenByTime(tick):
    #-----------服务器当前时间
    curTime = datetime.datetime.today()
    curTimeHour = curTime.hour
    curTimeDay = curTime.day
    curTimeWeek = datetime.datetime.isocalendar(curTime)[1]
    curTimeMonth = curTime.month
    curTimeYear = curTime.year
    #-----------服务器记录的时间
    serverHour , serverDay , serverWeek , serverMonth , serverYear = InitServerTime()
    #-----------开始比对时间
    #OnHour事件
    if (serverHour != curTimeHour or serverDay != curTimeDay or serverMonth != curTimeMonth or serverYear != curTimeYear):
        Set_Server_Hour()
        OnHour(tick)
    #OnDay事件
    if (serverDay != curTimeDay or serverMonth != curTimeMonth or serverYear != curTimeYear):
        Set_Server_Day()
        OnDay(tick)
    #OnWeek事件
    #不考虑隔年情况,如2009,12,31日关服->2010,12,31日开服(不触发OnWeek)
    if (serverWeek != curTimeWeek):
        Set_Server_Week()
        OnWeek(tick)
    #OnMonth事件
    if (serverMonth != curTimeMonth or serverYear != curTimeYear):
        Set_Server_Month()
        OnMonth(tick)
    #OnYear事件
    if serverYear != curTimeYear:
        Set_Server_Year()
        OnYear(tick)
    return
def OnHour(tick):
    GameWorld.Log("Server -> OnHour!")
    PlayerEventCounter.DoLogic_OnHour(tick)
    return
def OnDay(tick):
    GameWorld.Log("Server -> OnDay!")
    #设定服务器当前天事件
    eventMgr = DBDataMgr.GetEventTrigMgr()
    eventMgr.SetValueIncrement(ShareDefine.Def_ServerDay)
    isMixServer = eventMgr.GetValue(ShareDefine.Def_IsMixServer)
    if isMixServer:
        eventMgr.SetValueIncrement(ShareDefine.Def_MixServerDay)
    PlayerEventCounter.DoLogic_OnDay(tick)
    return
def OnWeek(tick):
    GameWorld.Log("Server -> OnWeek!")
    eventMgr = DBDataMgr.GetEventTrigMgr()
    eventMgr.SetValueIncrement(ShareDefine.Def_ServerWeek)
    PlayerEventCounter.DoLogic_OnWeek(tick)
    return
def OnMonth(tick):
    GameWorld.Log("Server -> OnMonth!")
    PlayerEventCounter.DoLogic_OnMonth(tick)
    return
def OnYear(tick):
    GameWorld.Log("Server -> OnYear!")
    PlayerEventCounter.DoLogic_OnYear(tick)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -44,7 +44,6 @@
import EventShell
import FBLogic
import FBCommon
import ShareDefine
import EventReport
import ItemCommon
import PyGameData
@@ -52,7 +51,7 @@
import GameMap
import NPCRealmRefresh
import IpyGameDataPY
import DBDataMgr
import GameWorldEvent
#---------------------------------------------------------------------
## 副本开启
#  @param gameWorld IPY_GameWorld
@@ -593,9 +592,7 @@
#  @return None
#  @remarks 函数详细说明.
def InitGameWorld(tick):
    if not PyGameData.g_initGame:
        PyGameData.g_initGame = True
        DBDataMgr.OnServerStart()
    GameWorldEvent.InitGameWorld(tick)
    gameWorld = GameWorld.GetGameWorld()
    ItemCommon.InitPyItem()
    EventShell.DoReloadRefresh()
@@ -778,12 +775,15 @@
def __OnMapMinute(curTime, tick):
    ## 地图层级每分钟处理, 每分钟最多只会处理一次, 无视虚拟分线
    if not PyGameData.g_initGameTime:
        return
    curMinute = curTime.minute
    if curMinute == PyGameData.g_mapLastProcess_Minute:
        return
    if PyGameData.g_initGame:
        DBDataMgr.OnMinute(curTime)
    PyGameData.g_mapLastProcess_Minute = curMinute
    GameWorldEvent.OnMinute(tick)
    PlayerTeam.OnCheckTeamPlayerDisconnectTimeout(tick)
    
    __CheckIpyDataRecycle(curTime)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -173,6 +173,7 @@
import PlayerActYunshi
import PlayerActTask
import PlayerMail
import DBDataMgr
import datetime
import time
@@ -6076,6 +6077,23 @@
    serverTime = GameWorld.GetCurrentTime()
    if not serverTime:
        return
    clientPack = ChPyNetSendPack.tagMCOpenServerDay()
    clientPack.Day = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay)
    clientPack.IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
    clientPack.MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay)
    clientPack.OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
    clientPack.NowYear = serverTime.year
    clientPack.NowMonth = serverTime.month
    clientPack.NowDay = serverTime.day
    clientPack.NowHour = serverTime.hour
    clientPack.NowMinute = serverTime.minute
    clientPack.NowSecond = serverTime.second
    clientPack.NowMicSecond = serverTime.microsecond
    clientPack.WeekOfYear = GameWorld.GetWeekOfYear()
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    #旧包先保留,之后删除
    gw = GameWorld.GetGameWorld()
    packData = ChPyNetSendPack.tagOpenServerDay()
    packData.Clear()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -11,20 +11,7 @@
# @version 2.6
#
# @note: 处理每周, 每日, 每月事件处理
# @change: "2015-07-10 16:00" xdh QQ每日礼包
# @change: "2015-08-13 14:00" ljd 新手卡OnDay
# @change: "2015-09-18 19:30" hxp 跨服boss状态变更
# @change: "2015-10-25 17:00" hxp 跨服PK状态变更
# @change: "2015-11-18 18:30" hxp 跨服王者争霸
# @change: "2016-02-30 17:00" hxp 领主霸业、恶魔试炼
# @change: "2016-04-29 18:00" hxp 宠物OnDay
# @change: "2016-07-13 18:00" hxp 在线赠送寻宝免费次数统计OnHour触发
# @change: "2016-07-26 17:30" hxp 增加获胜战盟盟主ID变更处理
# @change: "2016-08-05 19:00" hxp 脚本热更支持
# @change: "2016-08-29 23:30" hxp 洪荒之力
# @change: "2016-09-19 10:30" hxp key状态变更时全服玩家人数获取方式修改
# @change: "2016-10-26 11:00" hxp 签到逻辑修改
# @change: "2017-03-22 21:00" hxp 二维码红包
#
#---------------------------------------------------------------------
#"""Version = 2017-05-12 18:00""" 
#---------------------------------------------------------------------
@@ -143,60 +130,20 @@
import PlayerFuncTeam
import PlayerMineArea
import PlayerMail
import DBDataMgr
import datetime
import time
#---------------------------------------------------------------------
#===============================================================================
# //01 01 新一天的响应#tagMOnDay
# tagMOnDay       *   GettagMOnDay();
#
# class   IPY_MOnDay
# {
# public:
#
#    char *      GetTime();
# };
#===============================================================================
## 世界服务器->每日响应(封包参数)01 01
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def GameServer_OnDay(index, tick):
    GameWorld.GetPsycoFunc(__Func_GameServer_OnDay)(index, tick)
    CheckMachineTick(tick)
    return
## 原GameServer通知的
def GameServer_OnDay(index, tick): return
def GameServer_OnHour(index, tick): return
def GameServer_OnWeek(index, tick): return
def GameServer_OnMonth(index, tick): return
def GameServer_OnYear(index, tick): return
## 用于防范运维开机时间超过24天导致报错
#  @param tick 当前时间
#  @return None
def CheckMachineTick(tick):
    #取一张地图测试,在mapserver做逻辑,方便运维观察
    if GameWorld.GetMap().GetMapID() != 101:
        return
    #超过24.8天就会发生游戏逻辑出错,因为tick变成负数
    if tick/1000.0/60/60/24 >= 22:
        raise Exception('Start PC > 22 days!!!')
    return
## 世界服务器->每日响应(封包参数)01 01
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_GameServer_OnDay(index, tick):
def DoLogic_OnDay(tick):
    GameWorld.Log("MapServer -> OnDay!")
    playerManager = GameWorld.GetPlayerManager()
    #获取每日响应封包
    pack = IPY_GameWorld.IPY_MOnDay()
    #同步世界服务器时间
    SetMapServerTimeFromGameServer(pack.GetTime())
    #处理所有玩家信件的onday事件, 把存在时间+1
    playerManager.ProcessAllPlayerMailOnDay()
    #清空每日日记记录信息
@@ -216,62 +163,20 @@
            continue
        
        PlayerOnDay(curPlayer)
        # 服务器Onday处理数据,即不能在玩家上线时的Onday触发
        #PlayerServerDay(curPlayer)
        PlayerOnDayEx(curPlayer)
    
    DoLogic_OnDayEx(tick)
    return
def __Func_GameServer_OnDayEx(tick):
def DoLogic_OnDayEx(tick):
    GameWorld.Log("MapServer -> OnDayEx!")
    
    DBDataMgr.OnDayEx()
    PlayerMail.OnDayEx()
    PlayerControl.RemoveTimeoutLeaveServerPlayerInfo(tick)
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerOnDayEx(curPlayer)
    return
#---------------------------------------------------------------------
#===============================================================================
# #//////////////////////////////////////////////////////////////
# #//01 06 新一个小时的响应#tagMOnHour
# #tagMOnHour       *   GettagMOnHour();
# #
# #class   IPY_MOnHour
# #{
# #public:
# #
# #    char *      GetTime();
# #};
#===============================================================================
## 01 06 新一个小时的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def GameServer_OnHour(index, tick):
    GameWorld.GetPsycoFunc(__Func_GameServer_OnHour)(index, tick)
    return
## 01 06 新一个小时的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_GameServer_OnHour(index, tick):
def DoLogic_OnHour(tick):
    GameWorld.Log("MapServer -> OnHour!")
    #获取每小时响应封包
    pack = IPY_GameWorld.IPY_MOnHour()
    time = pack.GetTime()
    #同步世界服务器时间
    SetMapServerTimeFromGameServer(time)
    
    #副本OnHour事件
    FBLogic.OnHour(time, tick)
@@ -288,39 +193,9 @@
        PlayerOnHour(curPlayer)
        
    return
#---------------------------------------------------------------------
#===============================================================================
# //01 02 新一个星期的响应#tagMOnWeek
# tagMOnWeek       *   GettagMOnWeek();
#
# class   IPY_MOnWeek
# {
# public:
#
#    char *      GetTime();
# };
#===============================================================================
## 世界服务器->每周响应(封包参数) 01 02 新一个星期的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def GameServer_OnWeek(index, tick):
    GameWorld.GetPsycoFunc(__Func_GameServer_OnWeek)(index, tick)
    return
## 世界服务器->每周响应(封包参数) 01 02 新一个星期的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_GameServer_OnWeek(index, tick):
def DoLogic_OnWeek(tick):
    GameWorld.Log("MapServer -> OnWeek!")
    #获得每周响应封包
    pack = IPY_GameWorld.IPY_MOnWeek()
    #同步世界服务器时间
    SetMapServerTimeFromGameServer(pack.GetTime())
    
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
@@ -330,58 +205,14 @@
            continue
        
        PlayerOnWeek(curPlayer)
        PlayerOnWeekEx(curPlayer)
        
    #副本OnWeek事件响应
    FBLogic.OnWeek(tick)
    return
def __Func_GameServer_OnWeekEx(tick):
    GameWorld.Log("MapServer -> OnWeekEx!")
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerOnWeekEx(curPlayer)
    return
#---------------------------------------------------------------------
#===============================================================================
# //01 03 新一个月的响应#tagMOnMonth
# tagMOnMonth       *   GettagMOnMonth();
#
# class   IPY_MOnMonth
# {
# public:
#
#    char *      GetTime();
# };
#===============================================================================
## 世界服务器->每月响应(封包参数)01 03 新一个月的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def GameServer_OnMonth(index, tick):
    GameWorld.GetPsycoFunc(__Func_GameServer_OnMonth)(index, tick)
    return
## 世界服务器->每月响应(封包参数)01 03 新一个月的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_GameServer_OnMonth(index, tick):
def DoLogic_OnMonth(tick):
    GameWorld.Log("MapServer -> OnMonth!")
    #获得每月响应封包
    pack = IPY_GameWorld.IPY_MOnMonth()
    #同步世界服务器时间
    SetMapServerTimeFromGameServer(pack.GetTime())
    
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
@@ -391,56 +222,12 @@
            continue
        
        PlayerOnMonth(curPlayer)
    return
def __Func_GameServer_OnMonthEx(tick):
    GameWorld.Log("MapServer -> OnMonthEx!")
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        PlayerOnMonthEx(curPlayer)
        
    return
#---------------------------------------------------------------------
#===============================================================================
# //01 04 新一年的响应#tagMOnYear
# tagMOnYear       *   GettagMOnYear();
#
# class   IPY_MOnYear
# {
# public:
#
#    char *      GetTime();
# };
#===============================================================================
## 世界服务器->每年响应(封包参数)01 04 新一年的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def GameServer_OnYear(index, tick):
    GameWorld.GetPsycoFunc(__Func_GameServer_OnYear)(index, tick)
    return
## 世界服务器->每年响应(封包参数)01 04 新一年的响应
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_GameServer_OnYear(index, tick):
def DoLogic_OnYear(tick):
    GameWorld.Log("MapServer -> OnYear")
    #获得新年响应封包
    pack = IPY_GameWorld.IPY_MOnYear()
    #同步世界服务器时间
    SetMapServerTimeFromGameServer(pack.GetTime())
    
    playerManager = GameWorld.GetPlayerManager()
    for i in range(0, playerManager.GetPlayerCount()):
@@ -1008,6 +795,49 @@
    GameWorld.Log('验证重生点完毕, mapID = %s, cnt = %s'%(mapID, br_Count))
    return
#---------------------------------------------------------------------
def GMDateTime(curPlayer, eventName):
    if eventName == 'GMOnHour':
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnHour, 0)
        return
    if eventName == 'GMOnDay':
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnHour, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDay, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDayEx, 0)
        return
    if eventName == 'GMOnWeek':
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnHour, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDay, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnWeek, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDayEx, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnWeekEx, 0)
        return
    if eventName == 'GMOnMonth':
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnHour, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDay, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnWeek, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnMonth, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDayEx, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnWeekEx, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnMonthEx, 0)
        return
    if eventName == 'GMOnYear':
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnHour, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDay, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnWeek, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnMonth, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnYear, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnDayEx, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnWeekEx, 0)
        #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnMonthEx, 0)
        return
    return
## 更新玩家在线时间(参数 -> 当前玩家)
#  @param curPlayer 当前玩家
#  @return None
@@ -1672,21 +1502,6 @@
    elif key == ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.CrossDailyActionID_YaomoBoss:
        if gameWorldMgr.GetGameWorldDictByKey(key) != value:
            PlayerCrossYaomoBoss.OnYaomoBossStateChange(value, tick)
    # OnDayEx
    elif key == ShareDefine.Def_Notify_WorldKey_OnDayEx:
        if value and gameWorldMgr.GetGameWorldDictByKey(key) != value:
            __Func_GameServer_OnDayEx(tick)
    # OnWeekEx
    elif key == ShareDefine.Def_Notify_WorldKey_OnWeekEx:
        if value and gameWorldMgr.GetGameWorldDictByKey(key) != value:
            __Func_GameServer_OnWeekEx(tick)
    # OnMonthEx
    elif key == ShareDefine.Def_Notify_WorldKey_OnMonthEx:
        if value and gameWorldMgr.GetGameWorldDictByKey(key) != value:
            __Func_GameServer_OnMonthEx(tick)
            
    # 世界等级      
    elif key == ShareDefine.Def_Notify_WorldKey_WorldAverageLv:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py
@@ -91,7 +91,7 @@
            mailState = mailObj.GetMailState()
            mailItemCount = mailMgr.GetMailItemCount(guid)
            if mailItemCount and mailState != ShareDefine.MailState_Got:
                #GameWorld.DebugLog("个人邮件有物品邮件未领取不删除! %s" % guid, playerID)
                #GameWorld.DebugLog("个人邮件有物品未领取不删除! %s" % guid, playerID)
                continue
            
            mailMgr.DelPersonalMail(playerID, guid)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GMDateTime.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -15,7 +15,7 @@
#"""Version = 2017-09-05 21:30"""
#-------------------------------------------------------------------------------
g_initGame = False
g_initGameTime = 0 # 初始化游戏时间戳
g_pyGameDataManager = None
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -18,6 +18,31 @@
# 游戏默认编码
Def_Game_Character_Encoding = 'gbk'
# ------------------------- DBEventTrig事件key -------------------------
Def_Server_Year = 'Def_Server_Year' #服务器开服自动逻辑处理 年
Def_Server_Month = 'Def_Server_Month' #服务器开服自动逻辑处理 月
Def_Server_Week = 'Def_Server_Week' #服务器开服自动逻辑处理 周
Def_Server_Day = 'Def_Server_Day' #服务器开服自动逻辑处理 日
Def_Server_Hour = 'Def_Server_Hour' #服务器开服自动逻辑处理 小时
Def_ServerWeek = 'ServerWeek' #服务器运行了几周
Def_ServerDay = 'ServerDay' #服务器运行了几天
Def_OpenServerWeekday = 'OpenServerWeekday' #开服是周几, 1代表周一
Def_IsMixServer = 'IsMixServer' #服务器是否是合服服务器
Def_MixServerDay = 'MixServerDay' #服务器已经合服多少天
Def_IsMixServerInitOK = 'IsMixServerInitOK' #服务器合服首次启动OK
Def_LastMixServerDay = 'LastMixServerDay' #上次合服时的开服天数
#首次开服时间,注意不要用该日期做开服天相关的功能逻辑,如果要用开服天,请用 Def_ServerDay
''' 原因:
因为目前开服天的逻辑大部分是用 Def_ServerDay,当出现服务器宕机超过24小时时,就会导致 Def_ServerDay 与 Def_InitOpenServerTime 不对应
所以为了功能逻辑和数据的统一性,开服天相关的功能逻辑必须用 Def_ServerDay
Def_InitOpenServerTime 目前仅用于预先设置开服日期用
'''
Def_InitOpenServerTime = 'InitOpenServerTime'
Def_SetOpenServerTime = 'SetOpenServerTime' # GM工具预定的开服时间
# ------------------------- WorldKey -------------------------
Def_WorldKey_GameWorldInitOK = 'GameWorldInitOK'             #GameWold是否初始化完成OK
#---奇迹, 职业枚举定义---
(
PlayerJob_None,     # 无