#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package NPCRealmRefresh
|
#
|
# @todo:¾³½çNPCË¢¹Ö
|
# @author hxp
|
# @date 2022-08-23
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: tagNPCRefresh.txt py¶ÁÈ¡¸Ã±íË¢¹Ö¹æÔò
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2022-08-23 19:00"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import PyGameData
|
import IpyGameDataPY
|
import PlayerControl
|
import NPCCommon
|
import ChConfig
|
|
import os
|
|
class IPY_ChRefreshPos():
|
|
def __init__(self):
|
self.posX = 0
|
self.posY = 0
|
self.area = 0
|
self.moveDist = 0
|
return
|
|
def GetRandPosX(self): return self.posX
|
def GetRandPosY(self): return self.posY
|
def GetPosX(self): return self.posX
|
def GetPosY(self): return self.posY
|
def GetArea(self): return self.area
|
def GetMoveDist(self): return self.moveDist
|
|
class tagNPCRefresh():
|
|
def __init__(self, RefreshID):
|
self.RefreshID = RefreshID
|
self.NPCID = 0
|
self.RefreshPoint = IPY_ChRefreshPos()
|
self.RefreshTotal = 0
|
self.RefreshCount = 0
|
self.RefreshTime = 0
|
self.RebornState = 0 # ÊÇ·ñ¸´»î״̬
|
self.DeadTick = 0 # ÉÏ´ÎËÀÍötick
|
return
|
|
def GetRefreshID(self): return self.RefreshID
|
def GetNPCID(self): return self.NPCID
|
def GetRefreshPoint(self): return self.RefreshPoint
|
def GetRefreshTotal(self): return self.RefreshTotal
|
def GetRefreshCount(self): return self.RefreshCount
|
def GetRefreshTime(self): return self.RefreshTime
|
def GetRebornState(self): return self.RebornState
|
def GetDeadTick(self): return self.DeadTick
|
def SetReborn(self):
|
self.RebornState = 1
|
return
|
def SetDead(self, tick):
|
self.RebornState = 0
|
self.DeadTick = tick
|
return
|
|
def GetTagNPCRefresh(curNPC):
|
realmDiff = curNPC.GetSightLevel()
|
refreshID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SummonRefreshID)
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
key = (lineID, realmDiff)
|
|
obj = None
|
if key in PyGameData.g_realmDiffNPCRefresh:
|
mapNPCRefresh = PyGameData.g_realmDiffNPCRefresh[key]
|
if refreshID in mapNPCRefresh:
|
obj = mapNPCRefresh[refreshID]
|
else:
|
if False:
|
obj = tagNPCRefresh(refreshID) # ÕâÁ½ÐдúÂëÎÞÓã¬Ö»ÊÇΪÁË·½±ã . ³ö´úÂëÌáʾ
|
|
return obj
|
|
def GetMapRealmNPCRefresh(realm):
|
''' ¼ÓÔØ±¾µØÍ¼ tagNPCRefresh.txt Ë¢¹Ö¹æÔò
|
'''
|
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
key = (lineID, realm)
|
|
if key in PyGameData.g_realmDiffNPCRefresh:
|
return PyGameData.g_realmDiffNPCRefresh[key]
|
|
filePath = os.path.join(ChConfig.GetDBPath(), "SysDB", "tagNPCRefresh.txt")
|
if not os.path.isfile(filePath):
|
GameWorld.ErrLog("can not find file = %s" % filePath)
|
raise Exception("can not find file = %s" % filePath)
|
|
mapNPCRefresh = {}
|
curMapID = GameWorld.GetMap().GetMapID()
|
fileObj = open(filePath, 'rb')
|
content = fileObj.read()
|
fileObj.close()
|
infoList = content.split('\r\n')
|
for line in xrange(len(infoList)):
|
if line == 0:
|
continue
|
if not infoList[line]:
|
continue
|
rowList = infoList[line].split('\t')
|
if len(rowList) != 17:
|
continue
|
try:
|
MapID = int(rowList[2])
|
if curMapID != MapID:
|
continue
|
RefreshID = int(rowList[0])
|
NPCID = int(rowList[1])
|
if not NPCID:
|
continue
|
RefreshPos = eval(rowList[4])
|
RefreshTotal = int(rowList[5])
|
RefreshCount = int(rowList[6])
|
RefreshTime = int(rowList[8])
|
if not (type(RefreshPos) in [list, tuple] and len(RefreshPos) == 4 and isinstance(RefreshPos[0], int)):
|
GameWorld.ErrLog("tagNPCRefresh.txt line(%s) not processed." % (line + 1))
|
continue
|
refreshObj = tagNPCRefresh(RefreshID)
|
refreshObj.NPCID = NPCID
|
refreshObj.RefreshPoint.posX = RefreshPos[0]
|
refreshObj.RefreshPoint.posY = RefreshPos[1]
|
refreshObj.RefreshPoint.area = RefreshPos[2]
|
refreshObj.RefreshPoint.moveDist = RefreshPos[3]
|
refreshObj.RefreshTotal = RefreshTotal
|
refreshObj.RefreshCount = RefreshCount
|
refreshObj.RefreshTime = RefreshTime
|
mapNPCRefresh[RefreshID] = refreshObj
|
except:
|
GameWorld.ErrLog("tagNPCRefresh.txt line(%s) error." % (line + 1))
|
continue
|
|
PyGameData.g_realmDiffNPCRefresh[key] = mapNPCRefresh
|
GameWorld.Log("LoadMapRealmNPCRefresh mapID=%s,lineID=%s,realm=%s,refreshIDList=%s" % (curMapID, lineID, realm, mapNPCRefresh.keys()))
|
return mapNPCRefresh
|
|
def ProcessRealmNPCRefresh(gameWorld, tick):
|
mapID = gameWorld.GetMapID()
|
mapIDList = IpyGameDataPY.GetFuncEvalCfg("RealmDifficulty", 1)
|
if mapID not in mapIDList:
|
return
|
|
playerDict = {}
|
copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
|
for realmDiff, playerIDList in PyGameData.g_realmDiffPlayerDict.items():
|
if not playerIDList:
|
continue
|
|
mapNPCRefresh = GetMapRealmNPCRefresh(realmDiff)
|
if not mapNPCRefresh:
|
continue
|
|
for refreshID, refreshObj in mapNPCRefresh.items():
|
if not refreshObj:
|
continue
|
if refreshObj.GetRebornState():
|
continue
|
|
DeadTick = refreshObj.GetDeadTick()
|
RefreshTime = refreshObj.GetRefreshTime()
|
if DeadTick and RefreshTime:
|
if (tick - DeadTick) < RefreshTime:
|
continue
|
|
NPCID = refreshObj.GetNPCID()
|
npcData = GameWorld.GetGameData().FindNPCDataByID(NPCID)
|
if not npcData:
|
continue
|
|
refreshPoint = refreshObj.GetRefreshPoint()
|
posX, posY = refreshPoint.GetPosX(), refreshPoint.GetPosY()
|
canRefresh = False
|
# ÅжÏÍæ¼ÒÊÇ·ñ¿ÉÊÓ
|
for playerID in playerIDList:
|
if playerID in playerDict:
|
player = playerDict[playerID]
|
else:
|
player = copyPlayerMgr.FindPlayerByID(playerID)
|
if not player:
|
continue
|
playerDict[playerID] = player
|
playerRealm = PlayerControl.GetRealmDifficulty(player)
|
if playerRealm != realmDiff:
|
continue
|
sight = player.GetSight()
|
playerPosX, playerPosY = player.GetPosX(), player.GetPosY()
|
if GameWorld.GetDist(posX, posY, playerPosX, playerPosY) <= sight:
|
canRefresh = True
|
break
|
|
if not canRefresh:
|
continue
|
|
if NPCCommon.SummonMapNpc(NPCID, posX, posY, npcData.GetAIType(), sightLevel=realmDiff, refreshID=refreshID):
|
refreshObj.SetReborn()
|
#GameWorld.DebugLog("ProcessNPCRefresh realmDiff=%s,NPCID=%s,posX=%s,posY=%s" % (realmDiff, NPCID, posX, posY), refreshID)
|
continue
|
|
return
|
|
|