From 35c596a6ed34680d9af09788274051c1c212d4eb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 07 七月 2025 15:05:03 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(优化战斗武将跟NPC独立处理;去除程序无技能普攻,增加反击普攻;新增回合主动普攻技能功能类型23;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py |  233 ++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 129 insertions(+), 104 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
index 397afc1..43a085b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py
@@ -41,17 +41,14 @@
 import PlayerControl
 import FamilyRobBoss
 import NPCCustomRefresh
-import EventShell
 import FBLogic
 import FBCommon
-import ShareDefine
 import EventReport
 import ItemCommon
 import PyGameData
-import PlayerTeam
 import GameMap
 import NPCRealmRefresh
-import IpyGameDataPY
+import GameWorldEvent
 #---------------------------------------------------------------------
 ## 副本开启
 #  @param gameWorld IPY_GameWorld
@@ -163,7 +160,7 @@
             GameWorld.Log("发送未拾取的物品给玩家: %s" % mailItemList, ownerID)
             if isCrossServer:
                 serverGroupID = playerServerGroupIDDict.get(ownerID, 0)
-                PlayerControl.SendCrossMail(serverGroupID, "ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
+                # 删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
             else:
                 PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
         
@@ -274,10 +271,7 @@
         if playerExistTime < existTime / 2:
             #这个玩家存在时间过短, 不能触发副本结束的事件
             continue
-
-        #副本时间到了, 调用时间到响应
-        EventShell.EventResponse_OnFBTimeOut(curPlayer)
-    
+        
     #输出调试信息
     GameWorld.Log('__ProcessTimeKickPlayer! LineID = %s, openState = %s'%(gameWorld.GetLineID(), gameWorld.GetOpenState()))
     
@@ -527,6 +521,8 @@
     if not gameWorld.GetInitOK() :
         return
     
+    GameWorldEvent.OnHighProcess(tick)
+    
     __ProcessOpen(gameWorld, tick)
     
     __ProcessTimeKickPlayer(gameWorld, tick) # 处理副本生存周期强关副本
@@ -548,12 +544,6 @@
     #通知RouteServer 消息
     __ProcessRouteServer(gameWorld, tick)
     
-    #每分钟触发
-    curTime = GameWorld.GetCurrentTime()
-    __OnMapMinute(curTime, tick)
-    __RefreshOnMinute(curTime, tick)
-    #五分钟触发
-    __RefreshOnFiveMinute(tick)
     #定时检测关闭超时文件
     EventReport.OnTimeCloseScribeTxt()
     
@@ -590,11 +580,10 @@
 ## 初始化gameWorld
 #  @param tick 当前时间
 #  @return None
-#  @remarks 函数详细说明.
+#  @remarks 函数详细说明 每条分线都会触发该函数
 def InitGameWorld(tick):
     gameWorld = GameWorld.GetGameWorld()
     ItemCommon.InitPyItem()
-    EventShell.DoReloadRefresh()
     #处理副本逻辑
     FBLogic.OnInit(tick)
     #初始化地图时钟
@@ -602,12 +591,14 @@
     #初始化事件报告
     EventReport.InitDllAppID()
     #向GameServer注册普通地图启动成功信息
-    GameServer_CommMapServerInitOK(gameWorld)
+    #GameServer_CommMapServerInitOK(gameWorld)
     #初始化游戏世界的最后一步
     gameWorld.SetInitOK(True)
     #通知BalanceServer自己初始化好了
     gameWorld.BalanceServer_MapServerInitOK()
     return
+
+
 
 def GameServer_CommMapServerInitOK(gameWorld):
     '''
@@ -733,90 +724,124 @@
 
 #---------------------------------------------------------------------
 
-## 五分钟刷新
-# @param tick
-# @return None
-def __RefreshOnFiveMinute(tick):
-    gameWorld = GameWorld.GetGameWorld()
-    lastTick = gameWorld.GetTickByType(ChConfig.TYPE_Map_Tick_ProcessFiveMinute)
-    tickInterval = ChConfig.TYPE_Map_Tick_Time[ChConfig.TYPE_Map_Tick_ProcessFiveMinute]
-    if tick - lastTick < tickInterval:
-        return
-    gameWorld.SetTickByType(ChConfig.TYPE_Map_Tick_ProcessFiveMinute, tick)
-    
-#    playerManager = GameWorld.GetMapCopyPlayerManager()
-#    for index in xrange(playerManager.GetPlayerCount()):
-#        curPlayer = playerManager.GetPlayerByIndex(index)
-#        if not curPlayer:
-#            continue
+
+## 初始化共享表(原c++表)
+#  @param tick 当前时间
+#  @return None
+def ReadShareData(tick):
+    #读取静态表,与数据库无关 不要调用UserCtrlDB
+    from PyMongoDB.Collections import DataServerGameData
+    from PyMongoDB.DBCommon import (GlobalFunctions, CommonDefine, error)
+    from PyMongoDB.Common import (CommFunc, )
+    import NetPackCommon
+    import os
+    import zlib
+    sysData = DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinNPC,
+                                                os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                                CommonDefine.SYSDB_PATH,
+                                                                'tagChinNPC.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagNPCRefresh,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagNPCRefresh.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinSkill,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagChinSkill.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinExp,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagChinExp.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinItem,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagChinItem.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagTransportRefresh,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagTransportRefresh.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinShopItem,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagChinShopItem.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagBornRefresh,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagBornRefresh.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinMixItem,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagChinMixItem.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagBuildEquip,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagBuildEquip.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagSuiteActivation,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagSuiteActivation.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagSuiteEffect,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagSuiteEffect.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagRepeatEvent,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagRepeatEvent.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagEffectRefresh,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagEffectRefresh.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagChinMap,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagChinMap.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagDBStoreItem,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagDBStoreItem.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagOnMissionDelete,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagOnMissionDelete.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPet,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagPet.txt'))   
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPetGrade,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagPetGrade.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPetFriendliness,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagPetFriendliness.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagPetExp,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagPetExp.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagNPC_Item_Pet,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagNPC_Item_Pet.txt'))
+    sysData += DataServerGameData.sysDBLoadFromFile(DataServerGameData.tagFlyObjBaseInfo,
+                                        os.path.join(GlobalFunctions.getServerConfigPath(),
+                                                    CommonDefine.SYSDB_PATH,
+                                                    'tagFlyObjBaseInfo.txt'))
+
+
+    #压缩
+    try:
+        compressSysData = zlib.compress(sysData, 9)    #最大压缩
+                    
+        #回发地图
+        data = ''
+        data = CommFunc.WriteBYTE(data, CommonDefine.dgGameData)         #1
+        data = CommFunc.WriteString(data, len(compressSysData), compressSysData)
         
-    return
-
-## 按分钟刷新
-# @param tick
-# @return None
-def __RefreshOnMinute(curTime, tick):
-    gameWorld = GameWorld.GetGameWorld()
-    lastTick = gameWorld.GetTickByType(ChConfig.TYPE_Map_Tick_ProcessMinute)
-    tickInterval = ChConfig.TYPE_Map_Tick_Time[ChConfig.TYPE_Map_Tick_ProcessMinute]
-    if tick - lastTick < tickInterval:
-        return
-    gameWorld.SetTickByType(ChConfig.TYPE_Map_Tick_ProcessMinute, tick)
-    
-    playerManager = GameWorld.GetMapCopyPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not curPlayer:
-            continue
-        
-        __ProcessHalfHour(curPlayer, curTime, tick)
-    return
-
-def __OnMapMinute(curTime, tick):
-    ## 地图层级每分钟处理, 每分钟最多只会处理一次, 无视虚拟分线
-    curMinute = curTime.minute
-    if curMinute == PyGameData.g_mapLastProcess_Minute:
-        return
-    PyGameData.g_mapLastProcess_Minute = curMinute
-    PlayerTeam.OnCheckTeamPlayerDisconnectTimeout(tick)
-    
-    __CheckIpyDataRecycle(curTime)
-    return
-
-def __CheckIpyDataRecycle(timeNow):
-    ## 检查IpyData数据回收
-    playerCount = GameWorld.GetPlayerManager().OnlineCount()
-    if playerCount:
-        PyGameData.g_ipyDataRecycleCheckTime = 0
-        #GameWorld.DebugLog("地图还有玩家在线! playerCount=%s" % playerCount)
-        return
-    
-    curTime = GameWorld.ChangeDatetimeToNum(timeNow)
-    if not PyGameData.g_ipyDataRecycleCheckTime:
-        PyGameData.g_ipyDataRecycleCheckTime = curTime
-        #GameWorld.DebugLog("地图没有玩家在线")
-        return
-    
-    if PyGameData.g_ipyDataRecycleCheckTime == 1:
-        # 已经回收了
-        #GameWorld.DebugLog("本次已经回收过了")
-        return
-    
-    if curTime - PyGameData.g_ipyDataRecycleCheckTime < 24 * 3600:
-        #GameWorld.DebugLog("还未到达回收时间, passSeconds=%s" % (curTime - PyGameData.g_ipyDataRecycleCheckTime))
-        return
-    PyGameData.g_ipyDataRecycleCheckTime = 1    
-    IpyGameDataPY.IPYData.Recycle()
-    return
-
-## 整半小时触发 <00和30分钟时触发>
-# @param curPlayer
-# @param curTime 当前时间对象
-# @param tick
-# @return None
-def __ProcessHalfHour(curPlayer, curTime, tick):
-    if curTime.minute not in [0, 30]:
-        return
-    
-    EventShell.EventResponse_OnHalfHour(curPlayer)
-    return
+        GameWorld.Log('Load game sys data for len = %s - %s ok!'%(len(compressSysData), len(data)))
+        NetPackCommon.SendPyPackToMapServerSelf(data, len(data))
+    except:
+        msg = error.formatMsg('fatal', error.ERROR_NO_53, 'Compress game sys data failed!error = \n%s'%traceback.format_exc())
+        GameWorld.ErrLog(msg)
+    return
\ No newline at end of file

--
Gitblit v1.8.0