From b965081066ea579c45c73f08cd9cd61bc157ac9f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 09 五月 2019 11:15:45 +0800
Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(防范跨服妖王关闭线路时导致的报错)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 148 ++++++++++++++++++++++++++++++++++++------------
1 files changed, 110 insertions(+), 38 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index f99b5dd..30c0148 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -50,7 +50,6 @@
import PlayerBossReborn
import PlayerFairyCeremony
import PlayerNewFairyCeremony
-import GameLogic_CrossDemonKing
import GameLogic_CrossGrassland
import PlayerWeekParty
import PlayerActLogin
@@ -1223,7 +1222,7 @@
itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
if not itemData:
continue
- itemJob = itemData.GetJobLimit() / 100
+ itemJob = itemData.GetJobLimit()
if itemJob and itemJob != curPlayer.GetJob():
# 非本职业可用,不掉落
GameWorld.DebugLog("全服击杀次数必掉,非本职业可用,不掉落! itemID=%s" % itemID)
@@ -1237,7 +1236,7 @@
itemData = GameWorld.GetGameData().GetItemByTypeID(rItemID)
if not itemData:
continue
- itemJob = itemData.GetJobLimit() / 100
+ itemJob = itemData.GetJobLimit()
if itemJob and itemJob != curPlayer.GetJob():
# 非本职业可用,不掉落
GameWorld.DebugLog("全服击杀次数必掉随机,非本职业可用,不掉落! rItemID=%s" % rItemID)
@@ -1276,7 +1275,7 @@
if itemData.GetItemColor() != color:
continue
suiteID = itemData.GetSuiteID()
- itemJob = itemData.GetJobLimit() / 100
+ itemJob = itemData.GetJobLimit()
itemPlace = itemData.GetEquipPlace()
itemID = itemData.GetItemTypeID()
if itemPlace not in filterItemIDDict:
@@ -1402,7 +1401,7 @@
if not itemData:
GameWorld.ErrLog("掉落物品ID不存在, dropItemID=%s" % dropItemID)
continue
- itemJob = itemData.GetJobLimit() / 100
+ itemJob = itemData.GetJobLimit()
if isJobLimit and itemJob and itemJob != curPlayer.GetJob():
# 非本职业可用,不掉落
#GameWorld.DebugLog("非本职业可用,不掉落! dropItemID=%s" % dropItemID)
@@ -1941,6 +1940,67 @@
return
+#// B4 0C 召唤私有专属木桩怪 #tagCMSummonPriWoodPile
+#
+#struct tagCMSummonPriWoodPile
+#{
+# tagHead Head;
+# DWORD NPCID;
+# BYTE Count; //默认1个,最多5个
+#};
+def OnSummonPriWoodPile(index, clientData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ npcID = clientData.NPCID
+ count = clientData.Count
+ SummonPriWoodPile(curPlayer, npcID, count)
+ return
+
+def SummonPriWoodPile(curPlayer, npcID, count):
+ ''' 召唤私有专属木桩怪
+ '''
+
+ maxCount = 5
+ nowCount = 0
+ # 只允许存在一个私有木桩
+ indexList = range(curPlayer.GetSummonCount())
+ for index in indexList[::-1]:
+ summonNPC = curPlayer.GetSummonNPCAt(index)
+ if not summonNPC:
+ continue
+ npcType = summonNPC.GetType()
+ if npcType not in [ChConfig.ntPriWoodPilePVE, ChConfig.ntPriWoodPilePVP]:
+ continue
+ if nowCount >= maxCount or summonNPC.GetNPCID() != npcID:
+ SetDeadEx(summonNPC)
+ else:
+ nowCount += 1
+
+ summonCount = min(count, maxCount - nowCount)
+ #GameWorld.DebugLog("召唤: count=%s,maxCount=%s,nowCount=%s,summonCount=%s"
+ # % (count, maxCount, nowCount, summonCount))
+ if summonCount <= 0:
+ return
+
+ for _ in xrange(summonCount):
+ summonNPC = curPlayer.SummonNewNPC()
+
+ #设置召唤兽基础信息
+ summonNPC.SetNPCTypeID(npcID)
+ #初始化
+ InitNPC(summonNPC)
+
+ #玩家召唤兽列表添加召唤兽,召唤兽添加主人
+ summonNPC.SetOwner(curPlayer)
+ summonNPC.SetDict(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID, curPlayer.GetPlayerID())
+
+ #将召唤兽召唤出来
+ #玩家周围随机出生点
+ #技能召唤坐标 ChConfig.Def_SummonAppearDist
+ summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), 3)
+ summonNPC.Reborn(summonPos.GetPosX(), summonPos.GetPosY())
+
+ return
+
## 设置npc死亡及自身处理(请不要将游戏逻辑加在此函数中)
# @param curNPC:npc实例
# @return
@@ -1995,34 +2055,34 @@
return
def GameServer_KillGameWorldBoss(bossID, killPlayerName, hurtValue, isNotify=True, killerIDList=[]):
- dataMapID = GameWorld.GetGameWorld().GetMapID()
+ mapID = GameWorld.GetGameWorld().GetMapID()
realMapID = GameWorld.GetGameWorld().GetRealMapID()
copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
- killMsg = str([bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID, killerIDList])
+ killMsg = str([bossID, killPlayerName, hurtValue, isNotify, mapID, realMapID, copyMapID, killerIDList])
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'KillGameWorldBoss', killMsg, len(killMsg))
- GameWorld.DebugLog("Boss被击杀: bossID=%s,dataMapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s" % (bossID, dataMapID, realMapID, copyMapID, killerIDList))
+ GameWorld.DebugLog("Boss被击杀: bossID=%s,mapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s" % (bossID, mapID, realMapID, copyMapID, killerIDList))
return
def GameServe_GameWorldBossState(bossID, isAlive):
- dataMapID = GameWorld.GetGameWorld().GetMapID()
+ mapID = GameWorld.GetGameWorld().GetMapID()
realMapID = GameWorld.GetGameWorld().GetRealMapID()
copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
- stateMsg = str([bossID, isAlive, dataMapID, realMapID, copyMapID])
+ stateMsg = str([bossID, isAlive, mapID, realMapID, copyMapID])
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GameWorldBossState', '%s' % stateMsg, len(stateMsg))
- GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,dataMapID=%s,realMapID=%s,copyMapID=%s"
- % (bossID, isAlive, dataMapID, realMapID, copyMapID))
+ GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,mapID=%s,realMapID=%s,copyMapID=%s"
+ % (bossID, isAlive, mapID, realMapID, copyMapID))
if not isAlive:
- if dataMapID in ChConfig.Def_CrossZoneMapTableName:
- tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
+ if mapID in ChConfig.Def_CrossZoneMapTableName:
+ tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
realMapID = GameWorld.GetGameWorld().GetRealMapID()
copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
- zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
+ zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, mapID, copyMapID)
if not zoneIpyData:
return
zoneID = zoneIpyData.GetZoneID()
GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID), 0)
- elif dataMapID == ChConfig.Def_FBMapID_CrossDemonKing:
- zoneID = GameLogic_CrossDemonKing.GetCurFBLineZoneID()
+ elif mapID in ChConfig.Def_CrossDynamicLineMap:
+ zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID), 0)
else:
GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 0)
@@ -3556,14 +3616,13 @@
def DoHPPerLogic(self, dropType, ownerID):
curNPC = self.__Instance
curNPCID = curNPC.GetNPCID()
- hpPerLogicNPCIDList = ReadChConfig.GetEvalChConfig('HPPerLogicNPCIDList')
- if curNPCID not in hpPerLogicNPCIDList:
+
+ hpPerLogicNPCIDDict = IpyGameDataPY.GetFuncEvalCfg('BossHPInformation', 1, {})
+ hpPerLogicList = GameWorld.GetDictValueByKey(hpPerLogicNPCIDDict, curNPCID)
+ if not hpPerLogicList:
return
-
- hpPerLogicDict = ReadChConfig.GetEvalChConfig('HPPerLogic_%s' % curNPCID)
-
- hpPerList = sorted(hpPerLogicDict.keys(), reverse=True)
-
+ hpPerList, sysMark = hpPerLogicList
+ hpPerList = sorted(hpPerList, reverse=True)
nowHPPer = GameObj.GetHP(curNPC) * 100 / GameObj.GetMaxHP(curNPC) # 当前百分比
hpPerLogicMark = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_HPPerLogicMark)
logicHPPerList = hpPerList[hpPerLogicMark:]
@@ -3576,16 +3635,12 @@
#GameWorld.DebugLog("DoHPPerLogic npcID=%s,hpPerLogicDict=%s,nowHPPer=%s,hpPerLogicMark=%s,logicHPPerList=%s"
# % (curNPCID, str(hpPerLogicDict), nowHPPer, hpPerLogicMark, str(logicHPPerList)))
- isNotify, dropItemTemplate, addPrestigeFormat = hpPerLogicDict[hpPer]
- if isNotify:
- PlayerControl.WorldNotify(0, "FB_liubo_0", [GameWorld.GetMap().GetMapID(), curNPCID, hpPer])
+
+ PlayerControl.WorldNotify(0, sysMark, [curNPCID, hpPer])
# if dropItemTemplate > 0:
# self.__DropItemByTemplate(dropItemTemplate, dropType, ownerID)
# PlayerControl.WorldNotify(0, "GeRen_admin_481766", [GameWorld.GetMap().GetMapID(), curNPCID, curNPCID])
-
- if addPrestigeFormat != '':
- self.__GiveNearbyPlayerPrestige(addPrestigeFormat, ChConfig.Def_Matrix_Six)
hpPerLogicMark += 1
#GameWorld.DebugLog("DoHPPerLogic update hpPerLogicMark=%s" % (hpPerLogicMark))
@@ -3895,11 +3950,11 @@
#杀死NPC, 触发任务
self.__EventKillNpc()
- #mapID = GameWorld.GetMap().GetMapID()
+ mapID = GameWorld.GetMap().GetMapID()
killerName = "" if not self.__Killer else self.__Killer.GetPlayerName()
# 记录boss击杀信息的NPC
bossIpyData = IpyGameDataPY.GetIpyGameDataListNotLog('BOSSInfo', npcID)
- if bossIpyData:
+ if bossIpyData and mapID not in [ChConfig.Def_FBMapID_ZhuXianBoss, ChConfig.Def_FBMapID_SealDemon]:
if GetDropOwnerType(curNPC) == ChConfig.DropOwnerType_Family:
killerName = FamilyRobBoss.FamilyOwnerBossOnKilled(curNPC, self.__OwnerHurtID)
#KillerJob = 0 if not self.__Killer else self.__Killer.GetJob()
@@ -5525,7 +5580,11 @@
npcID = curNPC.GetNPCID()
collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID)
if not collectNPCIpyData:
- GameWorld.DebugLog("非特定采集NPC...")
+ #GameWorld.DebugLog("非特定采集NPC...")
+ return False
+
+ if collectNPCIpyData.GetIsMissionCollectNPC():
+ #GameWorld.DebugLog("任务采集物暂不处理")
return False
if not CheckCanCollectByNPCID(curPlayer, npcID, collectNPCIpyData):
@@ -5628,6 +5687,10 @@
GameWorld.DebugLog(" 非特定采集NPC...npcID=%s" % npcID)
return
+ if collectNPCIpyData.GetIsMissionCollectNPC():
+ #GameWorld.DebugLog("任务采集物暂不处理")
+ return
+
PlayerState.DoCollectingLostHP(curPlayer, collectNPCIpyData, tick, True)
if GameWorld.IsCrossServer():
@@ -5675,6 +5738,10 @@
GameWorld.DebugLog("给采集奖励: npcID=%s,collectCnt=%s" % (npcID, collectCnt))
if collectCnt <= 0:
return
+
+ if collectNPCIpyData.GetIsMissionCollectNPC():
+ #GameWorld.DebugLog("任务采集物暂不处理")
+ return
isMaxTime = False # 是否达到了采集最大次数
limitMaxTime = collectNPCIpyData.GetMaxCollectCount()
@@ -5690,7 +5757,7 @@
updCollTime = curCollTime + collectCnt
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTime % npcID, updCollTime)
SyncCollNPCTime(curPlayer, [npcID])
- GameWorld.DebugLog(" 增加采集次数: npcID=%s,todayCollTime=%s,curCollTime=%s,updCollTime=%s" % (npcID, todayCollTime, curCollTime, updCollTime))
+ GameWorld.DebugLog(" 增加采集次数: npcID=%s,todayCollTime=%s,curCollTime=%s,updCollTime=%s" % (npcID, todayCollTime, curCollTime, updCollTime))
isMaxTime = todayCollTime + collectCnt >= limitMaxTime
awardItemList = []
@@ -5701,7 +5768,7 @@
if collTotalTime in collectAppointAwardCfg:
awardItemList.append(collectAppointAwardCfg[collTotalTime])
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTimeTotal % npcID, collTotalTime)
- #GameWorld.DebugLog("采集次数定制奖励: collTotalTime=%s,awardItemList=%s" % (collTotalTime, awardItemList))
+ GameWorld.DebugLog(" 采集次数定制奖励: collTotalTime=%s,awardItemList=%s" % (collTotalTime, awardItemList))
if not awardItemList:
alchemyDiffLV = collectNPCIpyData.GetAlchemyDiffLV()
@@ -5719,9 +5786,12 @@
else:
giveItemWeightList = collectAwardCfg
+ GameWorld.DebugLog(" 常规采集物品权重列表: alchemyDiffLV=%s,collectAwardCfg=%s,giveItemWeightList=%s" % (alchemyDiffLV, collectAwardCfg, giveItemWeightList))
giveItemInfo = GameWorld.GetResultByWeightList(giveItemWeightList)
- awardItemList.append(giveItemInfo)
-
+ if giveItemInfo:
+ awardItemList.append(giveItemInfo)
+
+ GameWorld.DebugLog(" 最终采集奖励: awardItemList=%s" % awardItemList)
if awardItemList:
for itemID, itemCount, isAuctionItem in awardItemList:
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
@@ -5736,7 +5806,9 @@
awardPack.AwardItemList.append(awardItem)
awardPack.Count = len(awardPack.AwardItemList)
NetPackCommon.SendFakePack(curPlayer, awardPack)
-
+ else:
+ GameWorld.ErrLog("采集物品没有奖励!npcID=%s" % (npcID))
+
#采集成就
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Collect, collectCnt, [npcID])
#SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, giveItemInfoList, npcID)
--
Gitblit v1.8.0