16 卡牌服务端(服务器Event事件触发改为地图如OnDay等;地图开服事件流程;)
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # 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):
|
| | |
| | |
|
| | | import GameWorld
|
| | | import PyGameData
|
| | | import DBEventTrig
|
| | | import DBPlayerViewCache
|
| | | import DBFamily
|
| | | import DBMail
|
| | |
| | | curMinute = curTime.minute
|
| | | ServerDataBackup()
|
| | | DBFamily.OnMinute(curMinute)
|
| | | return
|
| | |
|
| | | def OnDayEx():
|
| | | return
|
| | |
|
| | | #------------------------------------------- 备档 ---------------------------------------------------
|
| | |
| | |
|
| | | class PyGameDataManager(object):
|
| | | def __init__(self):
|
| | | self.EventTrigMgr = DBEventTrig.EventTrigMgr()
|
| | | self.PlayerViewCacheMgr = DBPlayerViewCache.PlayerViewCacheMgr()
|
| | | self.FamilyMgr = DBFamily.FamilyMgr()
|
| | | self.MailMgr = DBMail.MailMgr()
|
| | |
| | |
|
| | | def GetSaveData(self):
|
| | | buff = ""
|
| | | buff += self.EventTrigMgr.GetSaveData()
|
| | | buff += self.PlayerViewCacheMgr.GetSaveData()
|
| | | buff += self.FamilyMgr.GetSaveData()
|
| | | buff += self.MailMgr.GetSaveData()
|
| | |
| | |
|
| | | 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)
|
| | |
| | | PyGameData.g_pyGameDataManager = pyGameDataMgr
|
| | | return pyGameDataMgr
|
| | |
|
| | | def GetEventTrigMgr():
|
| | | ## 事件值管理器
|
| | | dbDataMgr = GetDBDataMgr()
|
| | | return dbDataMgr.EventTrigMgr
|
| | |
|
| | | def GetPlayerViewCacheMgr():
|
| | | ## 玩家查看缓存数据管理器
|
| | | dbDataMgr = GetDBDataMgr()
|
| | |
| | | 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
|
New file |
| | |
| | | #!/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
|
| | |
| | | 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
|
| | |
| | | playerStateDict = self.__serverMailPlayerStateDict.pop(guid, {})
|
| | | return playerStateDict
|
| | |
|
| | | def DelAllMail(self):
|
| | | self.__personalMailDict = {}
|
| | | self.__mailItemDict = {}
|
| | | self.__serverMailDict = {}
|
| | | self.__serverMailPlayerStateDict = {}
|
| | | return
|
| | | |
| | | # 保存数据 存数据库和realtimebackup
|
| | | def GetSaveData(self):
|
| | | saveData = ""
|
| | |
| | | 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]
|
New file |
| | |
| | | #!/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
|
| | |
|
New file |
| | |
| | | #!/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
|
| | |
|
New file |
| | |
| | | #!/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
|
New file |
| | |
| | | #!/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
|
New file |
| | |
| | | #!/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
|
New file |
| | |
| | | #!/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
|
New file |
| | |
| | | #!/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
|
| | |
| | | ## 服务器组ID,必须唯一,代表这台物理服务器
|
| | | return ToIntDef(ReadChConfig.GetPyMongoConfig("platform", "GroupID"), 0)
|
| | |
|
| | | def GetServerID():
|
| | | ## 当前服务器ID
|
| | | return 87
|
| | |
|
| | | def GetMainServerID(serverID):
|
| | | ## 获取服务器ID所属主服ID
|
| | | ServerIDMainServerDict = IpyGameDataPY.GetConfigEx("ServerIDMainServerDict")
|
New file |
| | |
| | | #!/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
|
| | |
|
| | |
| | | import EventShell
|
| | | import FBLogic
|
| | | import FBCommon
|
| | | import ShareDefine
|
| | | import EventReport
|
| | | import ItemCommon
|
| | | import PyGameData
|
| | |
| | | import GameMap
|
| | | import NPCRealmRefresh
|
| | | import IpyGameDataPY
|
| | | import DBDataMgr
|
| | | import GameWorldEvent
|
| | | #---------------------------------------------------------------------
|
| | | ## 副本开启
|
| | | # @param gameWorld IPY_GameWorld
|
| | |
| | | # @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()
|
| | |
| | |
|
| | | 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)
|
| | |
| | | import PlayerActYunshi
|
| | | import PlayerActTask
|
| | | import PlayerMail
|
| | | import DBDataMgr
|
| | |
|
| | | import datetime
|
| | | import time
|
| | |
| | | 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()
|
| | |
| | | # @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"""
|
| | | #---------------------------------------------------------------------
|
| | |
| | | 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()
|
| | | #清空每日日记记录信息
|
| | |
| | | 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)
|
| | |
| | | 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()):
|
| | |
| | | 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()):
|
| | |
| | | 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()):
|
| | |
| | | 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
|
| | |
| | | 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:
|
| | |
| | | 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)
|
| | |
| | | #"""Version = 2017-09-05 21:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | g_initGame = False
|
| | | g_initGameTime = 0 # 初始化游戏时间戳
|
| | |
|
| | | g_pyGameDataManager = None
|
| | |
|
| | |
| | | # 游戏默认编码
|
| | | 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, # 无
|