From e35ed3606a9dd4da24331cc520faf4b720d83f13 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 25 十二月 2023 13:52:23 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(NPC支持暴击、吸血)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 162 +++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 124 insertions(+), 38 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 811d666..d1fc6ae 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -25,7 +25,6 @@
# @change: "2014-02-27 12:00" hxp 增加世界boss逻辑
# @change: "2014-04-26 19:30" hxp 增加领地战活动
# @change: "2014-06-21 15:20" hxp 增加特惠活动
-# @change: "2014-08-04 17:30" xmnathan 天梯每日更新
# @change: "2014-08-15 17:00" xmnathan 修改OnDay函数内的执行顺序
# @change: "2014-10-08 10:30" xmnathan add 定时清理过期补偿
# @change: "2014-10-29 22:00" hxp MapServerInitOK增加扩展key状态通知
@@ -83,9 +82,7 @@
import GameWorldAverageLv
import PlayerDBOper
import PlayerGeTui
-#import PlayerManorWar
import GameWorldBoss
-#import HighLadder
import PlayerCompensation
import ReadChConfig
import EventReport
@@ -93,16 +90,28 @@
import CrossRealmPK
import CrossRealmMsg
import CrossRealmPlayer
+import CrossBattlefield
+import CrossActionControl
import PlayerFBHelpBattle
import PlayerFamilyRedPacket
+import PlayerFairyDomain
import IpyGameDataPY
import PlayerFamilyParty
+import PlayerFamilyZhenfa
import GameWorldFamilyWar
+import GameWorldArena
+import CrossLuckyCloudBuy
import AuctionHouse
import PlayerXMZZ
+import PlayerLove
import PlayerTeam
import PyGameData
+import CrossBoss
import ChPlayer
+import PyDataManager
+import GameWorldOpenServerCampaign
+import CrossBillboard
+import CrossChampionship
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -118,8 +127,6 @@
GameWorld.Log("GameServer -> OnHour!")
PlayerEventCounter.DoLogic_GameServer_OnHour(tick)
GameWorld.GetGameWorld().OnHour(curTimeStr)
- #每小时更新天梯
- #HighLadder.OnHour()
#设置存取数据库Key
__SetWorldKey_SavePlayer(curTimeStr)
#每小时清空宝物掉落
@@ -128,6 +135,7 @@
GameLogInfo.Set_Server_Hour()
PlayerFamily.FamilyOnHour()
+ ChPlayer.CheckOnedayJobPlayerLoginoffTimeout()
return
## 触发每日事件(参数 -> 当前时间)
@@ -137,10 +145,9 @@
# @remarks 函数详细说明.
def OnDay(curTimeStr, tick):
GameWorld.Log("GameServer -> OnDay!")
- #天梯竞技场,放在排行榜更新之前处理
- #HighLadder.OnDay()
#排行榜拷贝昨日榜单
PlayerBillboard.CopyBillboardOnDay()
+ CrossBillboard.CopyBillboardOnDay()
#开服活动,放在排行榜拷贝昨日榜更新后处理
PlayerEventCounter.DoLogic_GameServer_OnDay(tick)
# 通知开服天数, 放在地图OnDay之前处理, 不然地图在OnDay时需要用到开服天时会取到昨天的值
@@ -166,13 +173,18 @@
# 通知开服天数
#openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)
#GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay)
+ GameWorldOpenServerCampaign.DoOnDay()
#清理过期补偿
PlayerCompensation.ClearUpTimeOutCompensation()
- PlayerGeTui.ClearFMTGeTuiLimit()
+ #PlayerGeTui.ClearFMTGeTuiLimit()
import PlayerBourse
PlayerBourse.OverTimeItemsDeal()
# 仙盟联赛
GameWorldFamilyWar.DoOnDay()
+ # 情缘
+ PlayerLove.DoOnDay()
+ # 云购
+ CrossLuckyCloudBuy.DoOnDay()
return
def OnDayEx(tick):
@@ -183,6 +195,8 @@
#仙魔之争
PlayerXMZZ.XMZZOndayEx()
+ #boss复活
+ GameWorldBoss.BossRebornOnDayEx()
return
## 触发每周事件(参数 -> 当前时间)
@@ -298,8 +312,8 @@
CrossRealmPK.OnPKMatchProcess(tick)
GameWorldBoss.DoCheckWorldBossReborn(tick)
- GameWorldBoss.ProcessBossGeTui(tick)
- PlayerGeTui.ProcessNewGuyCallBackGeTui(tick)
+ #GameWorldBoss.ProcessBossGeTui(tick)
+ #PlayerGeTui.ProcessNewGuyCallBackGeTui(tick)
#组队副本版本
PlayerTeam.DoTeamProcess(tick)
@@ -307,7 +321,10 @@
PlayerDBOper.PyDBProccess(tick)
#拍卖行
- AuctionHouse.OnAuctionItemTimeProcess(curTime)
+ AuctionHouse.OnAuctionItemTimeProcess(curTime, tick)
+
+ #情缘
+ PlayerLove.OnTimeProcess(curTime, tick)
#每整分钟处理一次
curDateTime = datetime.datetime.today()
@@ -342,9 +359,11 @@
def GameWorldProcessOnMinute(curMinute, tick):
# 每整分钟触发一次
+ CheckServerHasPlayerLoginAfterInitOK()
#检查服务器正式开服
DoCheckNewServerOpen(tick)
-
+ #回报数据库当前在线玩家数
+ DisposeGameActivePlayer(tick)
#处理游戏世界中的时间事件
DisposeGameWorldEvenByTime(tick)
GameWorldActionControl.Dispose_OperationActionState()
@@ -352,19 +371,45 @@
GameWorldActionControl.Dispose_FBStateTime()
#跨服PK
CrossRealmPK.OnMinuteProcess()
+ #跨服排位
+ CrossChampionship.OnMinuteProcess(curMinute)
+ CrossBattlefield.OnMinuteProcess()
#处理重开服务器后, 活动继续开启逻辑根据天数
#GameWorldActionControl.Dispose_Action_GoOn_ByDay(tick)
#触发世界等级
GameWorldAverageLv.OpenWorldAverageLv()
#倒计时离队处理
PlayerTeam.DoCountdownLeaveTeamLogic(tick)
- #副本助战
- PlayerFBHelpBattle.OnMinuteProcess()
#红包
PlayerFamilyRedPacket.OnRedPacketMinuteProcess()
+ #拍卖行
+ AuctionHouse.OnAuctionItemMinuteProcess(tick)
#每5分钟触发一次仙盟总战力更新
if curMinute % 5 == 0:
PlayerFamily.UpdFamilyTotalFightPower()
+ PlayerFamilyRedPacket.CheckDelRedpacketData()
+
+ return
+
+def CheckServerHasPlayerLoginAfterInitOK():
+ ## 检查服务器启动成功后是否有玩家正常登录
+ initGameWorldTime = GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit)
+ if not initGameWorldTime:
+ return
+
+ if PyGameData.g_noPlayerLoginWarningMailState:
+ return
+
+ curTime = int(time.time())
+ noPlayerLoginWarningTimes = IpyGameDataPY.GetFuncCfg("ServerEvent", 1) * 60 # x分钟没有玩家登录则预警
+ if curTime - initGameWorldTime < noPlayerLoginWarningTimes:
+ return
+
+ GameWorld.SendGameError("NoPlayerLogin")
+ PyGameData.g_noPlayerLoginWarningMailState = 1
+ return
+
+def OnReloadConfig():
return
#---------------------------------------------------------------------
@@ -390,7 +435,7 @@
#处理世界活动
DisposeGameWorldGame(tick)
#回报数据库当前在线玩家数
- DisposeGameActivePlayer(tick)
+ #DisposeGameActivePlayer(tick)
#同步地图服务器时间
Dispose_MapServer_Time(tick)
#保存玩家数据
@@ -590,15 +635,18 @@
#activePlayerCount = GameWorld.GetPlayerManager().GetActivePlayerCount()
#DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, platformOLDict, tjgOnlineCnt)
#===========================================================================
- for platform, playerCnt in platformOLDict.items():
- DataRecordPack.DR_OnLinePlayerCount(playerCnt, platform, tjgOnlineCnt) # 单平台
- EventReport.WriteEvent_concurrency(playerCnt, 0, platform) # 单平台 此处不能传脱机挂玩家总数
-
-
+ isMixture = False #是否混服
+ if isMixture:
+ for platform, playerCnt in platformOLDict.items():
+ DataRecordPack.DR_OnLinePlayerCount(playerCnt, platform, tjgOnlineCnt) # 单平台
+ EventReport.WriteEvent_concurrency(playerCnt, 0, platform) # 单平台 此处不能传脱机挂玩家总数
+ DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, {}, tjgOnlineCnt) # 总在线
+ #EventReport.WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt)
+ else:
+ serverPlatform = GameWorld.GetPlatform()
+ DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, {}, tjgOnlineCnt) # 总在线
+ EventReport.WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt, serverPlatform)
#===========================================================================
-
- DataRecordPack.DR_OnLinePlayerCount(activePlayerCount, {}, tjgOnlineCnt) # 总在线
- #EventReport.WriteEvent_concurrency(activePlayerCount, tjgOnlineCnt)
#刷新当前地图服务器
#===========================================================================
# custom_concurrencyMapList = ReadChConfig.GetEvalChConfig("EventReportMapID")
@@ -1203,6 +1251,7 @@
def InitGameWorld(tick):
#标记GameWorld初始化完成
GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_IsGameWorldInit, int(time.time()))
+ PlayerControl.LoadDBPlayer()
#初始化游戏时钟
GameWorld.GetGameWorld().SetTickTypeCount(ChConfig.TYPE_Tick_Count)
#初始话开服时间、星期几
@@ -1237,8 +1286,18 @@
ChPlayer.LoadPlayerLVData()
#加载助战信息
PlayerFBHelpBattle.OnServerStart()
+ #本服竞技场
+ GameWorldArena.OnServerStart()
#跨服PK
CrossRealmPK.OnGameServerInitOK()
+ #跨服排位
+ CrossChampionship.OnServerStart()
+ #跨服战场
+ CrossBattlefield.OnServerStart()
+ #红包
+ PlayerFamilyRedPacket.OnServerStart()
+ #云购
+ CrossLuckyCloudBuy.OnServerStart()
#世界boss被杀次数重置
#GameWorldBoss.CheckResetBossKilledCntOnServerInit()
@@ -1256,8 +1315,14 @@
GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_GameWorldInitOK, 1)
+ AuctionHouse.OnGameServerInitOK()
# 注意:跨服相关信息的调用需放在最后,不然可能导致服务器未启动功能或者功能未加载成功导致跨服服务器与子服之间的数据同步可能出现异常的情况
CrossRealmMsg.OnGameServerInitOK()
+ if PyGameData.g_allMapServerInitOK:
+ GameWorld.Log("InitGameWorld时AllMapServerInitOK已触发则补触发一次!")
+ GameWorld.SendGameError("GameWarning", "InitGameWorld later than AllMapServerInitOK")
+ AllMapServerInitOK(tick)
+
return
def DoCheckNewServerOpen(tick):
@@ -1314,7 +1379,8 @@
universalRecMgr.Delete(recType)
if recordCount:
GameWorld.Log("DeleteRecData recType=%s, count=%s" % (recType, recordCount))
-
+ CrossBoss.g_bossRecDataDict = {} # 需要清除,不然会导致跨服boss通用记录缓存对象错误
+
#清 家族
familyList = []
familyMgr = GameWorld.GetFamilyManager()
@@ -1329,11 +1395,18 @@
PyGameData.g_sortBOSSRefreshList = [] # boss刷新信息记录缓存重置, 不重置会导致通知前端的boss信息为空
+ GameWorldArena.OnServerStart()
+
+ CrossBattlefield.OnServerStart()
+
PlayerDBGSEvent.SetInitOpenServerTime(setOpenServerTime)
ReadChConfig.ReloadConfig()
AllMapServerInitOK(tick)
+
+ GameWorld.GetGameWorld().SaveGameServerData()
+ GameWorld.SendGameError("ClearOpenServerOK")
return
## 服务器开服时是星期几
@@ -1344,6 +1417,10 @@
# @return None
# @remarks 当一个mapServer开启时,
def AllMapServerInitOK(tick):
+ PyGameData.g_allMapServerInitOK = True
+ if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit):
+ GameWorld.Log("AllMapServerInitOK时GameServer还未启动好!")
+ return
#通知所有地图服务器初始化成功, 同步时间
GameWorld.GetGameWorld().Notify_AllMapServerInitOK(GameWorld.GetCurrentDataTimeStr())
@@ -1405,23 +1482,33 @@
# 仙盟联赛
GameWorldFamilyWar.OnMapServerInitOK()
- # 领地争夺战
- #PlayerManorWar.OnMapServerInitOK()
# 跨服服务器状态
+ GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerTime, PyGameData.g_crossServerTimeInfo)
isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen)
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossZoneName, PyGameData.g_crossZoneName)
# 跨服PK
CrossRealmPK.OnMapServerInitOK()
+ #跨服战场
+ CrossBattlefield.OnMapServerInitOK()
+ # 本服竞技场
+ GameWorldArena.SendMapServerArenaInfo()
+ # 幸运云购
+ CrossLuckyCloudBuy.OnMapServerInitOK()
SendAllMapGlobalDropInfo() # 全局掉落控制
SendMapCommMapLinePlayerCount(True) # 同步一次普通地图线路人数信息
#随机假仙盟
PlayerFamily.RandomFakeFamily()
-
+ #仙盟阵法
+ PlayerFamilyZhenfa.OnMapServerInitOK()
+ #缥缈仙域
+ PlayerFairyDomain.OnMapServerInitOK()
+ #情侣信息
+ PyDataManager.GetDBPyCoupleManager().SendMapServerCoupleInfo()
# 记录服务器是否正常开启完毕
getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") + "?Type=MapInit&MapCount=%s"%GameWorld.GetGameWorld().GetGameMapManager().GetCount()
GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl)
@@ -1837,20 +1924,12 @@
if mapServerPack.GetState() not in [0,1,2,3] and curMap.GetState() != mapServerPack.GetState():
# 记录服务器是否正常开启完毕, 避免重复发送
GameWorld.DebugLog("MapServer_RunningStateRefresh--_%s"%([mapServerPack.GetState(), curMap.GetState(), mapServerPack.GetMapID(), curMap.GetID()]))
- SendGameError("MapError")
+ GameWorld.SendGameError("MapError")
curMap.SetState(mapServerPack.GetState())
curMap.SetRefreshTick(tick)
return
-
-
-def SendGameError(state):
- getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl")
- groupID = ReadChConfig.GetPyMongoConfig("platform", "GroupID")
- userDBName = ReadChConfig.GetPyMongoConfig("connect", "USER_DB_NAME")
- getUrl = getUrl + "?Type=%s&groupID=%s&userDBName=%s"%(state, groupID, userDBName)
- GameWorld.GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl)
## 刷新地图服务器状态, 如果1分钟没有状态回报, 刷新为消失状态
# @param tick 当前时间
@@ -1878,7 +1957,7 @@
curMap.SetState(IPY_GameServer.mssNone)
if not isSendMapClose:
# 避免多地图发送过多邮件, 如关服的时候
- SendGameError("MapDisconnect") # 状态报告
+ GameWorld.SendGameError("MapDisconnect") # 状态报告
isSendMapClose = True
return
@@ -1928,6 +2007,13 @@
PlayerTeam.OnServerClose(tick)
ChPlayer.SavePlayerLVData()
PlayerFBHelpBattle.OnServerClose()
+ CrossActionControl.OnServerClose()
+ CrossChampionship.OnServerClose()
+ CrossBattlefield.OnServerClose()
+ PlayerFamilyRedPacket.OnServerClose()
+ CrossLuckyCloudBuy.OnServerClose()
+ GameWorldArena.OnServerClose()
+ PlayerLove.OnServerClose()
GameWorld.Log("通知C++关服!")
GameWorld.GetGameWorld().OnServerClose()
@@ -1935,6 +2021,6 @@
def ChangeGameServerState(state):
# 只接收大于等于mssPyError
GameWorld.DebugLog("ChangeGameServerState:%s"%state)
- SendGameError("GameServerError")
+ GameWorld.SendGameError("GameServerError")
\ No newline at end of file
--
Gitblit v1.8.0