From 0c27822ef5e6c67782ed143a4ff03ecfbdfda1fb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 23 五月 2022 16:52:58 +0800
Subject: [PATCH] 9415 【BT】【后端】古神战场(副本内功能完整版本)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_NormalNPC.py | 7
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py | 24
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py | 125 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py | 45 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py | 4
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py | 75
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CrossBattle.py | 85 -
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Map/GameMap.py | 65 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 23
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 11
PySysDB/PySysDBPY.h | 9
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 24
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 3
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 24
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1089.py | 26
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py | 22
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py | 15
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_22.py | 210 ++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossBattlefield.py | 67 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py | 7
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py | 1773 ++++++++++++++++++++++++++++++++------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 16
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py | 6
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py | 7
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2
28 files changed, 2,218 insertions(+), 465 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 4fafc4a..0592cf7 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -446,6 +446,15 @@
DWORD IceLodeFightPower; //冰晶矿脉扫荡战斗力
};
+//特殊地图玩家属性公式表
+
+struct tagSpecMapPlayerAttrFormat
+{
+ DWORD _DataMapID; //数据地图ID
+ char AttrName; //属性名
+ char AttrValueFormat; //最终属性值公式(可用参数属性名)
+};
+
//GM测试属性表
struct tagGMAttr
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
index 0521929..a6dff1b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBattlefield.py
@@ -4,12 +4,12 @@
#
##@package CrossBattlefield
#
-# @todo:跨服战场
+# @todo:跨服战场/古神战场
# @author hxp
# @date 2022-01-06
# @version 1.0
#
-# 详细描述: 跨服战场
+# 详细描述: 跨服战场/古神战场
#
#-------------------------------------------------------------------------------
#"""Version = 2022-01-06 20:30"""
@@ -180,10 +180,13 @@
if not GameWorld.IsCrossServer():
return
- enterWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 3, {}) # 周参与榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
- callWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 4, {}) # 周召集榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
- scoreWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 5, {}) # 周参与榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
+ enterWeekMoneyItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboardJoin", 3) # 周参与榜额外奖励货币物品ID
+ enterWeekMoneyMultiDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboardJoin", 4, {}) # 周参与榜额外奖励货币名次对应倍值
+ enterWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboardJoin", 2, {}) # 周参与榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
+ callWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 2, {}) # 周召集榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
+ scoreWeekOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBillboard", 3, {}) # 周积分榜名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
+ enterWeekMoneyMultiIntDict = {int(k):v for k, v in enterWeekMoneyMultiDict.items()}
enterWeekOrderIntAwardDict = {int(k):v for k, v in enterWeekOrderAwardDict.items()}
callWeekOrderIntAwardDict = {int(k):v for k, v in callWeekOrderAwardDict.items()}
scoreWeekOrderIntAwardDict = {int(k):v for k, v in scoreWeekOrderAwardDict.items()}
@@ -209,11 +212,17 @@
if not billboardData:
continue
playerID = billboardData.ID
+ cmpValue = billboardData.CmpValue
rank = i + 1
awardItemList = GameWorld.GetOrderValueByDict(awardDict, rank)
paramList = [rank]
+ if billboardType == ShareDefine.Def_CBT_BattlefieldWJoin and enterWeekMoneyItemID:
+ moneyBaseCount, multiValue = GameWorld.GetOrderValueByDict(enterWeekMoneyMultiIntDict, rank) # 奖励货币倍值
+ #基础保底值(不同名次可能不一样) + 名次倍率*次数
+ awardMoneyCount = int(moneyBaseCount + multiValue * cmpValue)
+ awardItemList.append([enterWeekMoneyItemID, awardMoneyCount, 0])
PlayerCompensation.SendMailByKey(mailKey, [playerID], awardItemList, paramList, crossMail=True)
-
+
billboardObj.ClearData()
return
@@ -469,13 +478,8 @@
GameWorld.DebugLog("跨服PK赛季未开启中,跨服战场系统开启广播不处理!")
continue
- notifyKey = "CrossBattlefieldOpenSys"
- paramList = [notifyOpenMinute]
- country = 0
- serverGroupIDList = []
- crossNotifyList = []
- crossNotifyList.append([ShareDefine.CrossNotify_World, [country, notifyKey, paramList]])
- PlayerControl.CrossNotifyEx(serverGroupIDList, crossNotifyList)
+ serverGroupIDList = zoneIpyData.GetServerGroupIDList()
+ PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenSys", [notifyOpenMinute])
return
@@ -503,12 +507,7 @@
matchTickSortList = sorted(buyPlayerInfo.values(), key=operator.attrgetter("buyTime"))
buyRec = matchTickSortList[0]
- notifyKey = "CrossBattlefieldOpenPlayer"
- paramList = [buyRec.playerName, notifyOpenMinute]
- country = 0
- crossNotifyList = []
- crossNotifyList.append([ShareDefine.CrossNotify_World, [country, notifyKey, paramList]])
- PlayerControl.CrossNotifyEx(serverGroupIDList, crossNotifyList)
+ PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOpenPlayer", [buyRec.playerName, notifyOpenMinute])
return
@@ -669,7 +668,7 @@
buyPlayerInfo[playerID] = buyRec
# 上榜
- billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 2) # 周召集榜上榜至少次数
+ billboardCallCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周召集榜上榜至少次数
groupValue1, dataID, name1, name2 = zoneID, playerID, playerName, ""
type2, value1, value2 = job, realmLV, 0
cmpValue = buyOpenCountWeek + 1
@@ -758,9 +757,9 @@
## 跨服战场地图结算
overTime = int(time.time())
hmNum = GetCrossBattlefieldState()
- fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, superItemPlayerID, superItemPlayerName, scoreKingID, scoreKingName, battlePlayerList = msgList
- GameWorld.Log("跨服战场地图同步结果: hmNum=%s,zoneID=%s,funcLineID=%s,winnerFaction=%s,superItemInfo=%s,superItemPlayerID=%s,scoreKingID=%s,battlePlayerCount=%s"
- % (hmNum, zoneID, funcLineID, winnerFaction, superItemInfo, superItemPlayerID, scoreKingID, len(battlePlayerList)), fbPropertyID)
+ fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, finalSuperItemPlayerName, superItemPlayerIDList, scoreKingID, scoreKingName, battlePlayerList = msgList
+ GameWorld.Log("跨服战场地图同步结果: hmNum=%s,zoneID=%s,funcLineID=%s,winnerFaction=%s,superItemInfo=%s,finalSuperItemPlayerID=%s,superItemPlayerIDList=%s,scoreKingID=%s,battlePlayerCount=%s"
+ % (hmNum, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, superItemPlayerIDList, scoreKingID, len(battlePlayerList)), fbPropertyID)
winnerOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 2, {}) # 胜利方名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
loserOrderAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAward", 3, {}) # 失败方名次对应奖励物品列表 {"名次":[[物品ID,个数,是否拍品], ...], ...} , 名次配置支持段配置
@@ -770,17 +769,19 @@
winnerOrderIntAwardDict = {int(k):v for k, v in winnerOrderAwardDict.items()}
loserOrderIntAwardDict = {int(k):v for k, v in loserOrderAwardDict.items()}
- billboardEnterCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboard", 1) # 周参与榜上榜至少次数
+ billboardEnterCountLimit = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBillboardJoin", 1) # 周参与榜上榜至少次数
syncPlayerDataInfo = {}
winnerPlayerIDList, loserPlayerIDList = [], []
for playerInfo in battlePlayerList:
- faction, rank, playerID, job, realmLV, name, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter = playerInfo
-
- isWinner = 0
+ playerID, job, realmLV, name, \
+ isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \
+ isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \
+ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt \
+ = playerInfo
+
paramList = [rank]
if faction == winnerFaction:
- isWinner = 1
winnerPlayerIDList.append(playerID)
orderAwardMailKey = "CrossBattlefieldOrderWin"
orderAwardItemList = GameWorld.GetOrderValueByDict(winnerOrderIntAwardDict, rank)
@@ -809,10 +810,12 @@
cmpValue = highScoreWeekTotal
CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BattlefieldWScore, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)
- GameWorld.Log(" 战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallEnter=%s"
- % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter), fbPropertyID)
+ GameWorld.Log(" 战场阵营玩家: faction=%s,isWinner=%s,rank=%s,playerID=%s,score=%s,highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallOpen=%s,isCalled=%s"
+ % (faction, isWinner, rank, playerID, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallOpen, isCalled), fbPropertyID)
- syncPlayerDataInfo[playerID] = [highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter]
+ syncPlayerDataInfo[playerID] = [isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek,
+ isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt,
+ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt]
# 参与奖励邮件
if winnerPlayerIDList:
@@ -822,9 +825,10 @@
# 大奖获得者邮件
superItemID, superItemCount = 0, 0
- if superItemPlayerID and superItemInfo and len(superItemInfo) == 3:
+ if superItemPlayerIDList and superItemInfo and len(superItemInfo) == 3:
superItemID, superItemCount = superItemInfo[0], superItemInfo[1]
- PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True)
+ for superItemPlayerID in superItemPlayerIDList:
+ PlayerCompensation.SendMailByKey("CrossBattlefieldSuperAward", [superItemPlayerID], [superItemInfo], crossMail=True)
crossZoneName = GameWorld.GetCrossZoneName()
zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
@@ -848,7 +852,7 @@
# 本分区全服:XX阵营胜利,xxx为本场积分王,xxx获得了古神大奖XXX,下个场次预计将在XX点开放。
if battlePlayerList:
- msgParamList = [winnerFaction, scoreKingName, superItemPlayerName, superItemID, superItemCount, nextBattleTimeStr]
+ msgParamList = [winnerFaction, scoreKingName, finalSuperItemPlayerName, superItemID, superItemCount, nextBattleTimeStr]
PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossBattlefieldOver", msgParamList)
return
@@ -887,9 +891,8 @@
return
for playerID, playerData in syncPlayerDataInfo.items():
- highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter = playerData
if PlayerControl.GetDBPlayerAccIDByID(playerID):
- msgInfo = ["BattlefieldOver", [overTime, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter]]
+ msgInfo = ["BattlefieldOver", [overTime] + playerData]
CrossRealmPlayer.MapServer_QueryCrossPlayerResult(playerID, "CrossBattlefield", msgInfo)
return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
index 48aebe0..47443a1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -106,6 +106,8 @@
if notifyType == ShareDefine.CrossNotify_World:
country, msgMark, msgParamList = params
openServerDayLimit = IpyGameDataPY.GetFuncCfg("CrossRealmCfg", 1)
+ if msgMark.startswith("CrossBattlefield"):
+ openServerDayLimit = IpyGameDataPY.GetFuncCfg("CrossRealmCfg", 2)
openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
if openServerDay < openServerDayLimit:
GameWorld.DebugLog("开服天不足,不处理该跨服广播! openServerDay=%s < %s" % (openServerDay, openServerDayLimit))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 2ad79cc..d7b975c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1800,7 +1800,27 @@
SuccType_FeastRedPack_CrossPK, # 节日红包 - 跨服PK x次 141
SuccType_FeastRedPack_FBSweep, # 节日红包 - 副本扫荡 x次 142
SuccType_PassSkyTower, #通关天星塔 143
-) = range(1, 144)
+SuccType_Battlefield_Join, # 古神战场 - 参与 x次 144
+SuccType_Battlefield_CallOpen, # 古神战场 - 召集开启 x次 145
+SuccType_Battlefield_Called, # 古神战场 - 当被召集人 x次 146
+SuccType_Battlefield_WinJ, # 古神战场 - 道家获胜 x次 147
+SuccType_Battlefield_WinE, # 古神战场 - 佛家获胜 x次 148
+SuccType_Battlefield_KillCnt, # 古神战场 - 击败玩家 x次 149
+SuccType_Battlefield_CKillCnt, # 古神战场 - 连续击败y玩家 x次 150
+SuccType_Battlefield_KillBoss, # 古神战场 - 阵营击败boss x次 151
+SuccType_Battlefield_KillScoreKing, # 古神战场 - 不同场次击败积分王 x次 152
+SuccType_Battlefield_KillGuard, # 古神战场 - 击败守卫 x次 153
+SuccType_Battlefield_Score, # 古神战场 - 累计获得个人积分 xx 154
+SuccType_Battlefield_ScoreMore, # 古神战场 - 单场个人积分超过yy积分 x次 155
+SuccType_Battlefield_AuraScore, # 古神战场 - 累计在积分光环中获得积分 xx 156
+SuccType_Battlefield_SuperItem, # 古神战场 - 累计获得古神大奖 x次 157
+SuccType_Battlefield_FactionBuff, # 古神战场 - 累计采集阵营buff x次 158
+SuccType_Battlefield_PersonBuff, # 古神战场 - 累计获得个人buff x次 159
+SuccType_Battlefield_Crystal, # 古神战场 - 累计采集占领资源 x次 160
+SuccType_Battlefield_Wall, # 古神战场 - 累计采集积分墙 x次 161
+SuccType_Battlefield_BillFirst, # 古神战场 - 任意周榜榜首 x次 162
+SuccType_Battlefield_BillIn, # 古神战场 - 结算时累计上榜 x次 163
+) = range(1, 164)
# 节日红包成就类型
FeastRedPackSuccessTypeList = range(SuccType_FeastRedPack_TalkWorld, SuccType_FeastRedPack_FBSweep + 1)
@@ -1836,7 +1856,7 @@
ContainSuccessTypeList = [SuccType_CompoundItemEx, SuccType_PickUpItem, SuccType_MWSkillUp]
#传进来的条件是配置条件的整数倍的成就类型
-MultipleSuccessTypeList = [SuccType_ElderBattlefieldConKill]
+MultipleSuccessTypeList = [SuccType_ElderBattlefieldConKill, SuccType_Battlefield_CKillCnt]
#增加进度前需要重置的成就类型
NeedResetSuccessTypeList = [
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 97b8ccc..5910d59 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1034,7 +1034,7 @@
def CheckIsAvailableTag(attacker, defender):
if defender == None or defender.GetID() == 0:
return False
- if GameObj.GetHP(attacker) <= 0 or GameObj.GetHP(defender) <= 0 :
+ if GameObj.GetHP(attacker) <= 0 or GameObj.GetHP(defender) <= 0:
#对象已经死亡
return False
@@ -1997,6 +1997,7 @@
if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
return 0, ChConfig.Def_HurtType_Miss
+ multiValue = 1 # 伤害倍值
summonAtkPer = 1 # 召唤继承提高基础攻击力,取表
summonAtkObj = atkwargs.get('orgAtkObj', None) if atkwargs.get('orgAtkObj', None) else atkObj
if summonAtkObj.GetGameObjType() == IPY_GameWorld.gotNPC and summonAtkObj.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
@@ -2262,6 +2263,7 @@
dFinalHurtReducePer = 0 # 最终伤害减少百分比 默认0
#攻击字典 { 攻击类型 : '公式' }
+ mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
hurtDist = ReadChConfig.GetEvalChConfig('CalcAttackValue')
if suppressLV:
@@ -2284,10 +2286,12 @@
if aRealmLV == 0 or dRealmLV == 0:
SuppressValueRealmRate = 10000
else:
- SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula("SuppressValueRealm", hurtDist["SuppressValueRealm"])))
+ suppressRealmRateMapKey = "SuppressValueRealm_%s" % mapID
+ if suppressRealmRateMapKey not in hurtDist:
+ suppressRealmRateMapKey = "SuppressValueRealm"
+ SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressRealmRateMapKey, hurtDist[suppressRealmRateMapKey])))
-
- # 骑宠争夺最终伤害衰减
+ # 骑宠争夺最终伤害衰减
if defObjType == IPY_GameWorld.gotNPC and FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()):
ownerPlayer, npcObjType = GetAttackPlayer(atkObj)
@@ -2302,7 +2306,6 @@
hurtFormulaKey = "%sV%s_%s" % (atkStateMark, defStateMark, atkType)
suppressLVGroup = 0 # NPC压制等级组编号
- mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
mapHurtKey = "%s_%s" % (hurtFormulaKey, mapID)
if mapHurtKey in hurtDist:
hurtFormulaKey = mapHurtKey
@@ -2331,10 +2334,17 @@
hurtFormulaKey = atkwargs.get('hurtFormulaKey', None)
hurtFormula = hurtDist[hurtFormulaKey]
-
+
hurtValue = int(eval(FormulaControl.GetCompileFormula(hurtFormulaKey, hurtFormula)))
if isDeadlyHit:
hurtValue *= deadlyHitMultiValue
+
+ if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC and mapID == ChConfig.Def_FBMapID_CrossBattlefield:
+ multiValue = FBLogic.GetFBPlayerHurtNPCMultiValue(atkObj, defObj)
+
+ if multiValue != 1:
+ hurtValue = int(hurtValue * multiValue)
+
#hurtValue = min(max(hurtValue, 0), ChConfig.Def_UpperLimit_DWord)
if hurtType == ChConfig.Def_HurtType_Normal and atkSkillPerYinji > 0:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py
index 94ad794..c24f3bd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/NormalNPC_Attack_Player.py
@@ -62,8 +62,13 @@
return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_None
defenderCampType = NPCCommon.GetFaction(curNormalNPC)
+ tagFaction = curTagPlayer.GetFaction()
+ if tagFaction and defenderCampType:
+ if tagFaction == defenderCampType:
+ return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_None
+ return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
#正义的 不攻击玩家 宠物以及玩家的召唤兽
- if defenderCampType == ChConfig.CampType_Justice:
+ elif defenderCampType == ChConfig.CampType_Justice:
return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_None
return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_NormalNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_NormalNPC.py
index 8cabede..0a5446e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_NormalNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/Player_Attack_NormalNPC.py
@@ -62,8 +62,13 @@
# @remarks 函数详细说明.
def GetTagRelation(curPlayer, curTagNormalNPC, skill, tick):
defenderCampType = NPCCommon.GetFaction(curTagNormalNPC)
+ curFaction = curPlayer.GetFaction()
+ if curFaction and defenderCampType:
+ if curFaction == defenderCampType:
+ return ChConfig.Type_Relation_Friend , ChConfig.Def_PASysMessage_None
+ return ChConfig.Type_Relation_Enemy , ChConfig.Def_PASysMessage_None
#不攻击正义的需要去保护的 这里有女神和守卫
- if defenderCampType == ChConfig.CampType_Justice:
+ elif defenderCampType == ChConfig.CampType_Justice:
return ChConfig.Type_Relation_Friend, ChConfig.Def_PASysMessage_None
#私有木桩只能自己打自己的
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 5bc0ae1..6185f74 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3057,8 +3057,6 @@
Def_NPC_Dict_SpeedPer = "SpeedPer" # 移动速度变更百分比
-Def_NPC_Dict_Faction = "Faction" # 阵营
-
# 延迟攻击时长, 毫秒
Def_NPC_Dict_AtkDelayTick = "AtkDelayTick" # 延迟攻击时长
Def_NPC_Dict_AtkStartTick = "AtkStartTick" # 开始攻击tick
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CrossBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CrossBattle.py
index 6fe7508..cf66546 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CrossBattle.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CrossBattle.py
@@ -30,11 +30,12 @@
if not cmdList:
GameWorld.DebugAnswer(curPlayer, "--------------------------------")
- GameWorld.DebugAnswer(curPlayer, "设置玩家击杀: CrossBattle 1 击杀数 [可选玩家ID]")
- GameWorld.DebugAnswer(curPlayer, "设置玩家积分: CrossBattle 2 总积分 [可选玩家ID]")
- GameWorld.DebugAnswer(curPlayer, "设置阵营击杀: CrossBattle 3 击杀数 [可选阵营ID]")
+ GameWorld.DebugAnswer(curPlayer, "设置玩家积分: CrossBattle 1 总积分 [可选玩家ID]")
+ GameWorld.DebugAnswer(curPlayer, "设置玩家击杀: CrossBattle 2 击杀数 [可选玩家ID]")
+ GameWorld.DebugAnswer(curPlayer, "设置玩家贡献: CrossBattle 3 贡献度 [可选玩家ID]")
GameWorld.DebugAnswer(curPlayer, "设置阵营积分: CrossBattle 4 总积分 [可选阵营ID]")
- GameWorld.DebugAnswer(curPlayer, "重置大奖信息: CrossBattle 5 [可选是否重新随机]")
+ GameWorld.DebugAnswer(curPlayer, "重新随机大奖: CrossBattle 5")
+ GameWorld.DebugAnswer(curPlayer, "复活阵营守卫: CrossBattle 6")
GameWorld.DebugAnswer(curPlayer, "可选玩家/阵营ID没填则默认自身")
return
@@ -45,38 +46,35 @@
if value1 in [1, 2, 3, 4, 5, 6] and not GameWorld.IsCrossServer() or mapID != ChConfig.Def_FBMapID_CrossBattlefield:
GameWorld.DebugAnswer(curPlayer, "该命令需在跨服战场使用CrossServer发送")
return
-
- # 设置玩家击杀
- if value1 == 1:
- setCount = cmdList[1] if len(cmdList) > 1 else 1
- tagPlayerID = cmdList[2] if len(cmdList) > 2 else playerID
- battleObj = GameLogic_CrossBattlefield.GetBattlePlayerObj(tagPlayerID)
- battleObj.killCount = setCount
- GameWorld.DebugAnswer(curPlayer, "玩家(%s)击杀数: %s" % (tagPlayerID, battleObj.killCount))
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshFactionPlayer) # 触发刷新FBHelp
- return
-
+
# 设置玩家积分
- if value1 == 2:
+ if value1 == 1:
setScore = cmdList[1] if len(cmdList) > 1 else 1
tagPlayerID = cmdList[2] if len(cmdList) > 2 else playerID
battleObj = GameLogic_CrossBattlefield.GetBattlePlayerObj(tagPlayerID)
- battleObj.score = setScore
+ battleObj.addPlayerScore(curPlayer, setScore - battleObj.score)
GameWorld.DebugAnswer(curPlayer, "玩家(%s)积分: %s" % (tagPlayerID, battleObj.score))
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshFactionPlayer) # 触发刷新FBHelp
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshCrossBattlefield) # 触发刷新FBHelp
return
- # 设置阵营击杀
- if value1 == 3:
+ # 设置玩家击杀
+ if value1 == 2:
setCount = cmdList[1] if len(cmdList) > 1 else 1
- tagFaction = cmdList[2] if len(cmdList) > 2 else 0
- if not tagFaction or tagFaction not in ShareDefine.CampTypeList:
- battleObj = GameLogic_CrossBattlefield.GetBattlePlayerObj(playerID)
- tagFaction = battleObj.faction
- factionObj = GameLogic_CrossBattlefield.GetBattleFactionObj(tagFaction)
- factionObj.killCount = setCount
- GameWorld.DebugAnswer(curPlayer, "阵营(%s)击杀数: %s" % (tagFaction, factionObj.killCount))
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshFactionPlayer) # 触发刷新FBHelp
+ tagPlayerID = cmdList[2] if len(cmdList) > 2 else playerID
+ battleObj = GameLogic_CrossBattlefield.GetBattlePlayerObj(tagPlayerID)
+ battleObj.addKillCount(setCount - battleObj.killCount)
+ GameWorld.DebugAnswer(curPlayer, "玩家(%s)击杀数: %s, 连杀数: %s" % (tagPlayerID, battleObj.killCount, battleObj.continueKillCount))
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshCrossBattlefield) # 触发刷新FBHelp
+ return
+
+ # 设置玩家贡献度
+ if value1 == 3:
+ setProgress = cmdList[1] if len(cmdList) > 1 else 1
+ tagPlayerID = cmdList[2] if len(cmdList) > 2 else playerID
+ battleObj = GameLogic_CrossBattlefield.GetBattlePlayerObj(tagPlayerID)
+ battleObj.addSuperItemContribution(setProgress - battleObj.superItemContribution)
+ GameWorld.DebugAnswer(curPlayer, "玩家(%s)贡献度: %s" % (tagPlayerID, battleObj.superItemContribution))
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshCrossBattlefield) # 触发刷新FBHelp
return
# 设置阵营积分
@@ -87,32 +85,23 @@
battleObj = GameLogic_CrossBattlefield.GetBattlePlayerObj(playerID)
tagFaction = battleObj.faction
factionObj = GameLogic_CrossBattlefield.GetBattleFactionObj(tagFaction)
- factionObj.score = setScore
+ factionObj.addFactionScore(setScore - factionObj.score)
GameWorld.DebugAnswer(curPlayer, "阵营(%s)积分: %s" % (tagFaction, factionObj.score))
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshFactionPlayer) # 触发刷新FBHelp
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshCrossBattlefield) # 触发刷新FBHelp
return
# 重置大奖信息
if value1 == 5:
- isRand = cmdList[1] if len(cmdList) > 1 else 1
worldObj = GameLogic_CrossBattlefield.GetBattleWorld()
- worldObj.superItemPlayerID = 0
- worldObj.superItemPlayerName = ""
- if isRand:
- worldObj.RandSuperTask()
- for faction in ShareDefine.CampTypeList:
- if not faction:
- continue
- factionObj = GameLogic_CrossBattlefield.GetBattleFactionObj(faction)
- factionObj.superTaskValue = 0
- factionObj.superTaskFinishCount = 0
- factionObj.setSuperTaskValueMax(worldObj)
- for battleObj in factionObj.factionPlayerDict.values():
- battleObj.superTaskValue = 0
- battleObj.superTaskFinishCount = 0
- battleObj.setSuperTaskValueMax(worldObj)
- GameWorld.DebugAnswer(curPlayer, "重置大奖信息OK!")
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshFactionPlayer) # 触发刷新FBHelp
+ worldObj.RandSuperTask()
+ GameWorld.DebugAnswer(curPlayer, "重新随机大奖OK! %s" % worldObj.superItemInfo)
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, GameLogic_CrossBattlefield.DoFBHelp, 0, GameLogic_CrossBattlefield.refreshCrossBattlefield) # 触发刷新FBHelp
+ return
+
+ # 复活阵营守卫
+ if value1 == 6:
+ rebornNPCIDList = GameLogic_CrossBattlefield.rebornGurad()
+ GameWorld.DebugAnswer(curPlayer, "复活阵营守卫! %s" % rebornNPCIDList)
return
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
index 94a6d4a..29b96e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/KillScreenNPC.py
@@ -73,7 +73,12 @@
def __DoKillNPC(curPlayer, curNPC, tick):
if not curNPC or curNPC.GetID() == 0 or GameObj.GetHP(curNPC) <= 0:
return
- if NPCCommon.GetFaction(curNPC) == ChConfig.CampType_Justice:
+ curFaction = curPlayer.GetFaction()
+ npcFaction = NPCCommon.GetFaction(curNPC)
+ if curFaction and npcFaction:
+ if curFaction == npcFaction:
+ return
+ elif npcFaction == ChConfig.CampType_Justice:
return
if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie:
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py
index 2a3f49c..7484a3f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py
@@ -18,11 +18,30 @@
import ChConfig
import GameWorld
import PlayerControl
+import IpyGameDataPY
+import ShareDefine
+import PetControl
import PlayerPet
-import PetClear
+import OpenFunc
-#---------------------------------------------------------------------
-#逻辑实现
+
+def __Help(curPlayer, petNumNameDict):
+ GameWorld.DebugAnswer(curPlayer, "------------------")
+ GameWorld.DebugAnswer(curPlayer, "重置灵宠: Pet 0 [可选第几只]")
+ GameWorld.DebugAnswer(curPlayer, "激活所有: Pet 99 [可选是否满阶]")
+ GameWorld.DebugAnswer(curPlayer, "激活指定: Pet 第几只 阶级")
+ GameWorld.DebugAnswer(curPlayer, "培养灵宠: Pet 培养类型 等阶 丹数")
+ GameWorld.DebugAnswer(curPlayer, "注:重置灵宠需重登")
+
+ petNumList = petNumNameDict.keys()
+ petNameNumInfo = ""
+ for i, petNum in enumerate(petNumList, 1):
+ petNameNumInfo += "%s-%s;" % (petNumNameDict[petNum], petNum)
+ if petNum % 3 == 0 or i == len(petNumList):
+ GameWorld.DebugAnswer(curPlayer, petNameNumInfo)
+ petNameNumInfo = ""
+
+ return
## GM命令执行入口
# @param curPlayer 当前玩家
@@ -31,29 +50,117 @@
# @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
+ petNumNameDict = {}
+ petNPCIDNumDict = {}
+ ipyDataMgr = IpyGameDataPY.IPY_Data()
+ for index in xrange(ipyDataMgr.GetPetInfoCount()):
+ ipyData = ipyDataMgr.GetPetInfoByIndex(index)
+ needItemID = ipyData.GetUnLockNeedItemID()
+ curItem = GameWorld.GetGameData().GetItemByTypeID(needItemID)
+ if not curItem:
+ continue
+ itemName = curItem.GetName()
+ petName = itemName.replace("灵宠:", "")
+ petNum = index + 1
+
+ petNPCID = ipyData.GetID()
+ petNPCIDNumDict[petNPCID] = petNum
+ petNumNameDict[petNum] = petName
+ petNumList = sorted(petNumNameDict.keys())
+
if not msgList:
- GameWorld.DebugAnswer(curPlayer, "重置所有灵宠: Pet 0")
- GameWorld.DebugAnswer(curPlayer, "设置培养灵宠: Pet 培养类型 等阶 丹数")
+ __Help(curPlayer, petNumNameDict)
return
+
+ # 重置灵宠
if msgList[0] == 0:
- if len(msgList) > 1 and msgList[1] == 1:
- PetClear.OnExec(curPlayer, [])
-
+ clearNumList = msgList[1:] if len(msgList) > 1 else None
+ clearOKList = __ClearPet(curPlayer, petNPCIDNumDict, clearNumList)
+
for trainType in xrange(1, PlayerPet.GetPetTrainTypes() + 1):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainLV % trainType, 1)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainItemCount % trainType, 0)
+ GameWorld.DebugAnswer(curPlayer, "重置灵宠编号:%s" % sorted(clearOKList))
+
+ # 激活所有
+ elif msgList[0] == 99:
+ isFullLV = msgList[1] if len(msgList) > 1 else None
+ classLV = 999 if isFullLV else None
+ OpenFunc.DoGMOpenFunc(curPlayer, ShareDefine.GameFuncID_Pet)
+ activeOKList = []
+ petNumList = petNPCIDNumDict.values()
+ for i, petNum in enumerate(petNumList):
+ index = msgList[0]
+ refresh = i >= (len(petNumList) - 1)
+ if PlayerPet.DoPetActivate(curPlayer, petNum, classLV, refresh=refresh):
+ activeOKList.append(petNum)
+
+ GameWorld.DebugAnswer(curPlayer, "激活灵宠编号:%s" % sorted(activeOKList))
+
+ # 激活指定
+ elif len(msgList) == 2:
+ petNum = msgList[0]
+ classLV = msgList[1]
+ OpenFunc.DoGMOpenFunc(curPlayer, ShareDefine.GameFuncID_Pet)
+ if PlayerPet.DoPetActivate(curPlayer, petNum, classLV):
+ GameWorld.DebugAnswer(curPlayer, "激活灵宠: %s(%s), %s阶" % (petNumNameDict.get(petNum, petNum), petNum, classLV))
+
+ # 培养灵宠
elif len(msgList) == 3:
trainType, trainLV, eatItemCount = msgList
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainLV % trainType, trainLV)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainItemCount % trainType, eatItemCount)
else:
+ __Help(curPlayer, petNumNameDict)
return
PlayerPet.RefreshPetItemAddAttr(curPlayer, True)
PlayerPet.OnPlayerPetLogin(curPlayer)
return
-
+def __ClearPet(curPlayer, petNPCIDNumDict, clearNumList=None):
+
+ clearOKList = []
+ #获得战斗的宠物
+ fightPetNPCID = 0
+ curPetMgr = curPlayer.GetPetMgr()
+ fightPet = curPetMgr.GetFightPet()
+ if fightPet != None:
+ fightPetNPCID = fightPet.GetRolePet().NPCID
+
+ fightPetNum = petNPCIDNumDict.get(fightPetNPCID)
+ #---如果有出战中的宠物需要先召回---
+ if not clearNumList or fightPetNum in clearNumList:
+ PetControl.ReCallFightPet(curPlayer)
+
+ #获得玩家宠物信息
+ petList = []
+ petListCount = curPetMgr.PetList_Cnt()
+ for i in range(petListCount):
+ pet = curPetMgr.PetList_At(i)
+ petNPCID = pet.GetRolePet().NPCID
+ petNum = petNPCIDNumDict.get(petNPCID)
+ if not clearNumList or petNum in clearNumList:
+ petList.append(pet)
+
+ for pet in petList:
+ curPetMgr.PetList_SetFree(pet.GetRolePet().PetID)
+
+ # 宠物数据物品背包清除
+ petPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet)
+ for i in range(petPack.GetCount())[::-1]:
+ petItem = petPack.GetAt(i)
+
+ if not petItem or petItem.IsEmpty():
+ continue
+
+ petNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
+ petNum = petNPCIDNumDict.get(petNPCID)
+ if not clearNumList or petNum in clearNumList:
+ petItem.Clear()
+ clearOKList.append(petNum)
+
+ return clearOKList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index 4a1a011..e9c753f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -1465,16 +1465,16 @@
## 从列表中产生物品,[[权重, object], ....]
# @param weightList 待选列表
-def GetResultByWeightList(weightList):
+def GetResultByWeightList(weightList, defValue=None):
randList = []
weight = 0
for info in weightList:
weight += info[0]
randList.append([weight, info[1] if len(info) == 2 else info[1:]])
if not randList:
- return
+ return defValue
rate = random.randint(1, randList[-1][0])
- return GetResultByRiseList(randList, rate)
+ return GetResultByRiseList(randList, rate, defValue)
#---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index db9d922..c668d83 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -1427,6 +1427,17 @@
return callFunc(curPlayer)
+def OnCanFBReborn(curPlayer, rebornType):
+ ## 副本中额外验证是否可以复活 - 仅副本特有复活限制逻辑需要处理,其他公共复活逻辑外层处理
+ do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
+
+ callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnCanFBReborn"))
+
+ if callFunc == None:
+ return True
+
+ return callFunc(curPlayer, rebornType)
+
## 玩家副本重生设置坐标
# @param rebornPlace 复活位置
# @return None
@@ -1440,6 +1451,29 @@
return
return callFunc(curPlayer, rebornPlace, tick)
+
+def GetFBRobotCanAtkObjTypeIDList(curNPC):
+ ## 获取副本中机器人可能可攻击的实例类型ID列表
+ ## @return: [[objType, objID], ...]
+ do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
+
+ callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "GetFBRobotCanAtkObjTypeIDList"))
+
+ if callFunc == None:
+ return []
+
+ return callFunc(curNPC)
+
+def GetFBRobotRandomMovePos(curNPC):
+ ## 获取副本中机器人随机移动坐标点
+ do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
+
+ callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "GetFBRobotRandomMovePos"))
+
+ if callFunc == None:
+ return
+
+ return callFunc(curNPC)
#---------------------------------------------------------------------
## 杀怪奖励是否给最后一个补刀的玩家
@@ -2047,6 +2081,17 @@
return False
+def GetFBPlayerHurtNPCMultiValue(curPlayer, curNPC):
+ ## 玩家对NPC造成伤害倍值,默认1
+ do_FBLogic_ID = __GetFBLogic_MapID(GameWorld.GetMap().GetMapID())
+
+ callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "GetFBPlayerHurtNPCMultiValue"))
+
+ if callFunc:
+ return callFunc(curPlayer, curNPC)
+
+ return 1
+
## 玩家对NPC造成伤害
# @param curPlayer 当前玩家
# @param curNPC
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py
index 5db11ee..830fe33 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossBattlefield.py
@@ -4,12 +4,12 @@
#
##@package GameWorldLogic.FBProcess.GameLogic_CrossBattlefield
#
-# @todo:跨服战场
+# @todo:跨服战场/古神战场
# @author hxp
# @date 2022-01-06
# @version 1.0
#
-# 详细描述: 跨服战场
+# 详细描述: 跨服战场/古神战场
#
#-------------------------------------------------------------------------------
#"""Version = 2022-01-06 20:30"""
@@ -23,16 +23,23 @@
import IpyGameDataPY
import PlayerActivity
import GameWorldProcess
+import NPCCustomRefresh
import PlayerControl
import ShareDefine
import SkillCommon
+import SkillShell
import BuffSkill
import ChConfig
+import AICommon
+import GameObj
import GameMap
+import ChNPC
import operator
import random
import time
+import copy
+import math
#当前副本地图的状态
(
@@ -49,218 +56,400 @@
Time_Leave, # 副本离开时间 2
) = range(3)
-# 大奖任务类型
-SuperTaskList = (
-SuperTaskType_Kill, # 击杀 1
-SuperTaskType_Score, # 积分 2
-) = range(1, 1 + 2)
+FightRefreshInterval = 5000 # 战斗阶段刷新处理间隔,毫秒
GameFBData_BattleWorld = "BattleWorld"
GameFBData_FactionInfo = "FactionInfo"
GameFBData_PlayerInfo = "PlayerInfo"
+# 事件编号
+AllEventNumList = (
+EventNum_Aura, # 事件 - 积分光环
+EventNum_Boss, # 事件 - Boss
+EventNum_Wall, # 事件 - 积分墙
+) = range(1, 1 + 3)
+
+# 得分类型
+(
+ScoreType_Default, # 默认
+ScoreType_KillPlayer, # 击杀玩家 1
+ScoreType_CollectCrystal, # 占领资源建筑 2
+ScoreType_CollectFactionBuff, # 采集阵营buff 3
+ScoreType_GuardKillPlayer, # 守卫击杀玩家 4
+ScoreType_HurtBoss, # 对boss造成伤害 5
+ScoreType_Aura, # 积分光环 6
+) = range(7)
+
## 战场公共世界管理类
class BattleWorld():
def __init__(self):
+ self.callOpenPlayerInfo = {} # 本场次购买召集的玩家信息 {playerID:faction, ...}
self.superItemInfo = [] # 大奖信息 [物品ID,个数,是否拍品]
- self.superItemPlayerID = 0 # 大奖中奖者玩家ID
- self.superItemPlayerName = "" # 大奖中奖者玩家名
- self.superTaskType = 0 # 大奖任务类型
+ self.crystalFactionInfo = {} # 水晶资源所属阵营信息 {npcID:所属阵营, ...}
+ self.crystalAwardTick = {} # 水晶资源定时奖励tick {npcID:tick, ...}
+
+ self.personBuffCount = 0 # 战场存在的个人buff个数
+ self.personBuffCalcTick = 0 # 开始计算个人buff补充个数tick
+
+ self.factionBuffNPCInfo = [] # 战场存在的阵营buffNPC信息,默认只能存在一个 [npcID, posX, posY]
+ self.factionBuffCalcTick = 0 # 开始计算阵营buff补充个数tick
+ self.factionBuffIDOrderList = [] # 阵营buff顺序刷新列表
+
+ self.eventInfoList = [] # 本场次要刷新的事件列表 [[刷新时间秒, 事件编号], ...]
+ self.eventNum = 0 # 当前进行中的事件编号
+ self.eventNPCID = 0 # 当前进行中的事件NPCID
+ self.eventNPCPos = [] # 当前进行中的事件NPC坐标
+ self.eventStartTick = 0 # 事件开始tick
+ self.eventEndTick = 0 # 事件结束时tick,某些事件有,不一定有值
+ self.eventNPCHP = 0 # 事件NPC当前剩余血量
+ self.lastEventEndTick = 0 # 上个事件结束tick
+ self.lastWallCollOKTick = 0 # 上次积分墙采集OK时tick
+
self.RandSuperTask()
+ self.__randEventList()
return
+
+ def getWorldHelpInfo(self, tick):
+ worldInfo = {"superItemInfo":self.superItemInfo, "crystalFactionInfo":self.crystalFactionInfo,
+ "factionBuffNPCInfo":self.factionBuffNPCInfo, "eventNPCID":self.eventNPCID, "eventNPCPos":self.eventNPCPos}
+ if self.eventEndTick:
+ worldInfo["eventEndTick"] = max(0, self.eventEndTick - tick) # 事件结束剩余时间,单位毫秒
+ if self.eventNPCHP:
+ worldInfo["eventNPCHP"] = self.eventNPCHP
+ return {"worldInfo":worldInfo}
def RandSuperTask(self):
# 随机生成大奖任务
fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
superItemWeightList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAwardSuper", 1)
- superItemInfo = GameWorld.GetResultByWeightList(superItemWeightList)
- self.superItemInfo = superItemInfo if superItemInfo else []
- self.superTaskType = random.choice(SuperTaskList)
- GameWorld.Log("随机战场大奖: superTaskType=%s,superItemInfo=%s" % (self.superTaskType, self.superItemInfo), fbPropertyID)
+ self.superItemInfo = GameWorld.GetResultByWeightList(superItemWeightList, [])
+ GameWorld.Log("随机战场大奖: superItemInfo=%s" % str(self.superItemInfo), fbPropertyID)
return
-
-## 战斗实体基类
-class BattleBase(object):
-
- BattleType_Player = "Player"
- BattleType_Faction = "Faction"
-
- def __init__(self, ID):
- self.fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
- self.battleType = ""
- self.ID = ID
- self.name = ""
- self.score = 0 # 积分
- self.scoreSortTime = 0 # 积分变更排序time值,用于同积分时,先到排名靠前
- self.superTaskValue = 0 # 大奖任务当前进度
- self.superTaskValueMax = 0 # 大奖任务完成需要的进度值
- self.superTaskFinishCount = 0 # 大奖任务完成次数
- self.killCount = 0 # 击杀数
- self.continueKillCount = 0 # 连杀数
- self.beKilledCount = 0 # 被击杀数
- return
-
- def addScore(self, worldObj, addValue):
- self.score += addValue
- calcTime = 3471264000 #GameWorld.ChangeTimeStrToNum("2080-01-01 00:00:00")
- self.scoreSortTime = max(0, calcTime - int(time.time()))
- GameWorld.DebugLog(" 增加积分: battleType=%s,ID=%s,addValue=%s,updScore=%s" % (self.battleType, self.ID, addValue, self.score), self.fbPropertyID)
- self.addSuperTaskValue(worldObj, SuperTaskType_Score, addValue)
- return
-
- def addKillCount(self, worldObj, addCount):
- self.killCount += addCount
- self.continueKillCount += addCount # 同步增加连杀
- self.addSuperTaskValue(worldObj, SuperTaskType_Kill, addCount)
- return
-
- def addBeKilledCount(self, addCount):
- self.beKilledCount += addCount
- self.continueKillCount = 0 # 被击杀时,连杀重置
- return
-
- def setSuperTaskValueMax(self, worldObj):
- if worldObj == None:
- worldObj = GetBattleWorld()
- taskType = worldObj.superTaskType
- if taskType == SuperTaskType_Kill:
- superTaskValueMaxList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAwardSuper2", 1)
- elif taskType == SuperTaskType_Score:
- superTaskValueMaxList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAwardSuper2", 2)
- else:
+ def __randEventList(self):
+ # 随机本场次事件顺序列表
+ if self.eventInfoList:
return
- if self.battleType == self.BattleType_Player:
- curValueMaxList = superTaskValueMaxList[0]
- elif self.battleType == self.BattleType_Faction:
- curValueMaxList = superTaskValueMaxList[1]
- else:
- return
+ commEventTimeList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldEvent", 2)
+ commEventNumList = [] # 常规事件 - 不包含boss的所有事件
+ commEventNumList += AllEventNumList
+ commEventNumList.remove(EventNum_Boss)
- if not curValueMaxList:
+ if len(commEventTimeList) != len(commEventNumList):
+ GameWorld.ErrLog("战场常规事件刷新时间个数配置错误! commEventTimeList=%s,commEventNumList=%s"
+ % (commEventTimeList, commEventNumList))
return
+ random.shuffle(commEventNumList)
- if self.superTaskFinishCount >= len(curValueMaxList):
- valueMax = curValueMaxList[-1]
- else:
- valueMax = curValueMaxList[self.superTaskFinishCount]
- self.superTaskValueMax = valueMax
- GameWorld.Log(" 更新大奖任务进度完成所需值! battleType=%s,ID=%s,taskType=%s,superTaskFinishCount=%s,superTaskValueMax=%s"
- % (self.battleType, self.ID, taskType, self.superTaskFinishCount, self.superTaskValueMax), self.fbPropertyID)
- return
-
- def addSuperTaskValue(self, worldObj, taskType, addValue):
- if taskType != worldObj.superTaskType:
- #GameWorld.DebugLog(" 非战场大奖任务类型,不处理! taskType=%s != superTaskType(%s)" % (taskType, worldObj.superTaskType), self.fbPropertyID)
- return
-
- if len(worldObj.superItemInfo) != 3:
- GameWorld.ErrLog("大奖任务物品异常,不处理! taskType=%s,superItemInfo=%s" % (taskType, worldObj.superItemInfo), self.fbPropertyID)
- return
-
- if worldObj.superItemPlayerID:
- GameWorld.DebugLog(" 大奖已经产出,不再处理! superItemPlayerID=%s" % worldObj.superItemPlayerID, self.fbPropertyID)
- return
+ for i, eventNum in enumerate(commEventNumList):
+ self.eventInfoList.append([commEventTimeList[i], eventNum])
- if not self.superTaskValueMax:
- self.setSuperTaskValueMax(worldObj)
- if not self.superTaskValueMax:
- return
+ eventBossStartTime = IpyGameDataPY.GetFuncCfg("CrossBattlefieldEvent", 3)
+ isOnlyCallHaveBoss = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 5)
- self.superTaskValue += addValue
- if self.superTaskValue < self.superTaskValueMax:
- GameWorld.DebugLog(" 更新大奖进度! battleType=%s,ID=%s,taskType=%s,addValue=%s,superTaskValue=%s < %s"
- % (self.battleType, self.ID, taskType, addValue, self.superTaskValue, self.superTaskValueMax), self.fbPropertyID)
- return
- self.superTaskValue -= self.superTaskValueMax
- self.superTaskFinishCount += 1
- GameWorld.Log(" 完成大奖任务! battleType=%s,ID=%s,taskType=%s,superTaskFinishCount=%s"
- % (self.battleType, self.ID, taskType, self.superTaskFinishCount), self.fbPropertyID)
- self.setSuperTaskValueMax(worldObj)
+ if isOnlyCallHaveBoss:
+ zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
+ hmNum = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield)
+ hmCallTeamInfo = PyGameData.g_crossBattlefieldCallTeamInfo.get(zoneID, {})
+ callTeamInfo = hmCallTeamInfo.get(hmNum, {})
+ if callTeamInfo:
+ self.eventInfoList.append([eventBossStartTime, EventNum_Boss])
+ else:
+ self.eventInfoList.append([eventBossStartTime, EventNum_Boss])
- superRate = self.getSuperItemRate()
- tick = GameWorld.GetGameWorld().GetTick()
- if not GameWorld.CanHappen(superRate):
- GameWorld.Log(" 大奖没有中奖! battleType=%s,ID=%s,taskType=%s,superRate=%s"
- % (self.battleType, self.ID, taskType, superRate), self.fbPropertyID)
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshFactionPlayer)
- return
+ self.eventInfoList.sort()
- superItemPlayerID = self.getSuperItemPlayerID()
- GameWorld.Log(" 大奖中奖! battleType=%s,ID=%s,taskType=%s,superRate=%s,superItemPlayerID=%s"
- % (self.battleType, self.ID, taskType, superRate, superItemPlayerID), self.fbPropertyID)
- if not superItemPlayerID:
- return
- worldObj.superItemPlayerID = superItemPlayerID
- itemID, itemCount = worldObj.superItemInfo[0], worldObj.superItemInfo[1]
- battleObj = GetBattlePlayerObj(superItemPlayerID)
- worldObj.superItemPlayerName = battleObj.name
- PlayerControl.FBNotify("CrossBattlefieldSuperItemPlayer", [battleObj.faction, battleObj.name, itemID, itemCount])
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshFactionPlayer)
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ GameWorld.Log("随机战场事件刷新时间及编号列表: eventInfoList=%s" % self.eventInfoList, fbPropertyID)
return
- def getSuperItemRate(self): return 0
- def getSuperItemPlayerID(self): return 0
+ def setEventEnd(self, tick):
+ GameWorld.Log("战场随机事件结束! eventNum=%s" % (self.eventNum), GameWorld.GetGameWorld().GetPropertyID())
+ self.eventNum = 0
+ self.eventNPCID = 0
+ self.eventNPCPos = []
+ self.eventNPCHP = 0
+ self.eventEndTick = 0
+ self.lastEventEndTick = tick # 上个事件结束tick
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ return
+
## 战场阵营类
-class BattleFaction(BattleBase):
+class BattleFaction():
def __init__(self, faction):
- super(BattleFaction, self).__init__(faction)
+ self.fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
self.faction = faction
- self.battleType = self.BattleType_Faction
+ self.score = 0 # 积分
+ self.scoreSortTime = 0 # 积分变更排序time值,用于同积分时,先到排名靠前
+
self.factionPlayerDict = {} # {playerID:BattlePlayer, ...}
self.battlePlayerSortList = [] # 阵营积分排名玩家列表 [BattlePlayer, ...]
self.scoreKingIDList = [] # 前x名积分王ID列表 [playerID, ...] ,只算在线的,所以不一定是积分排名前x名
self.onlineFightPowerTotal = 0 # 在线人数总战力
self.onlinePlayerIDList = [] # 在线玩家ID列表 [playerID, ...]
- self.setSuperTaskValueMax(None)
+ self.homePlayerIDList = [] # 在营地家里的玩家ID列表 [playerID, ...]
+
+ self.factionBuffInfo = [] # 阵营当前获得的阵营buff信息 [buff技能ID, 结束时间戳]
+ self.crystalScorePlusRate = 0 # 建筑获取资源速度提升万分率
+ self.crystalScorePlusEndTick = 0 # 建筑获取资源速度提升结束tick
+
+ self.hurtBossValue = 0 # 阵营对boss的总伤害
+ self.hurtBossPlayerDict = {} # 阵营玩家对boss的伤害 {playerID:hurtValue, ...}
+
+ self.superItemProgress = 0 # 阵营大奖开奖进度魂
+ self.superItemPlayerID = 0 # 阵营大奖中奖者玩家ID
+ self.superItemPlayerName = "" # 阵营大奖中奖者玩家名
+
+ self.robotObjIDList = [] # 本阵营当前机器人实例ID列表
return
- def getSuperItemRate(self):
- single = IpyGameDataPY.GetFuncCfg("CrossBattlefieldAwardSuper", 3)
- return single * len(self.onlinePlayerIDList)
- def getSuperItemPlayerID(self):
- if not self.onlinePlayerIDList:
- return 0
- return random.choice(self.onlinePlayerIDList)
+ def getFactionHelpInfo(self):
+ if self.factionBuffInfo and time.time() >= self.factionBuffInfo[1]:
+ self.factionBuffInfo = []
+ factionInfo = {"faction":self.faction, "score":self.score, "superItemPlayerName":self.superItemPlayerName,
+ "superItemProgress":self.superItemProgress, "factionBuffInfo":self.factionBuffInfo}
+ if self.hurtBossValue:
+ factionInfo["hurtBossValue"] = self.hurtBossValue
+ return {"factionInfo_%s" % self.faction:factionInfo}
- def addScore(self, worldObj, addValue):
- super(BattleFaction, self).addScore(worldObj, addValue)
+ def addSuperItemProgress(self, addProgress):
+ if self.superItemPlayerID:
+ # 阵营大奖已开奖,不再增加阵营大奖进度,但是依然会增加个人大奖贡献
+ return
+ self.superItemProgress = max(0, self.superItemProgress + addProgress)
+ GameWorld.DebugLog(" 增加阵营大奖进度: faction=%s,addProgress=%s,superItemProgress=%s"
+ % (self.faction, addProgress, self.superItemProgress), self.fbPropertyID)
- battleOverScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldFB", 2)
+ if self.superItemProgress < IpyGameDataPY.GetFuncCfg("CrossBattlefieldAwardSuper", 2):
+ return
+
+ worldObj = GetBattleWorld()
+ if not worldObj.superItemInfo:
+ return
+
+ # 本阵营大奖开奖,仅限在线玩家
+ weightList = []
+ for playerID, battleObj in self.factionPlayerDict.items():
+ if playerID not in self.onlinePlayerIDList:
+ continue
+ if not battleObj.superItemContribution:
+ continue
+ weightList.append([battleObj.superItemContribution, playerID])
+ superItemPlayerID = GameWorld.GetResultByWeightList(weightList)
+ if not superItemPlayerID:
+ return
+ battleObj = GetBattlePlayerObj(superItemPlayerID)
+ self.superItemPlayerID = superItemPlayerID
+ self.superItemPlayerName = battleObj.name
+ battleObj.superItemContribution = 0 # 重置贡献
+ battleObj.superItemAwardCnt += 1
+
+ itemID, itemCount = worldObj.superItemInfo[0], worldObj.superItemInfo[1]
+ GameWorld.Log("阵营大奖开奖: faction=%s,weightList=%s,superItemPlayerID=%s,itemID=%s,itemCount=%s"
+ % (self.faction, weightList, superItemPlayerID, itemID, itemCount), self.fbPropertyID)
+ PlayerControl.FBNotify("CrossBattlefieldSuperItemPlayer", [battleObj.faction, battleObj.name, itemID, itemCount])
+ tick = GameWorld.GetGameWorld().GetTick()
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ return
+
+ def __checkPerScoreAddSuperItemProgress(self, befScore):
+ perScoreInfo = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAwardSuper2", 4)
+ if not perScoreInfo or len(perScoreInfo) != 2:
+ return
+ superScorePer, addProgress = perScoreInfo
+ if not superScorePer or not addProgress:
+ return
+ befTimes = befScore / superScorePer
+ aftTimes = self.score / superScorePer
+ if aftTimes <= 0 or aftTimes == befTimes:
+ return
+ GameWorld.DebugLog(" 阵营每%s积分增加在线阵营玩家大奖贡献! addProgress=%s" % (superScorePer, addProgress), self.fbPropertyID)
+ for playerID, battleObj in self.factionPlayerDict.items():
+ if playerID in self.onlinePlayerIDList:
+ battleObj.addSuperItemContribution(addProgress)
+ return
+
+ def addFactionScore(self, addValue, isCheckVictory=True):
+ ## 增加阵营积分
+ # @return: 是否结算胜负,某些情况下不能在加分后直接验证是否获胜,由于某些功能可能同时增加双方阵营积分,所以需等都加完后才处理结算
+ if not addValue:
+ return
+ befScore = self.score
+ self.score = max(0, self.score + addValue)
+ calcTime = 3471264000 #GameWorld.ChangeTimeStrToNum("2080-01-01 00:00:00")
+ self.scoreSortTime = max(0, calcTime - int(time.time()))
+ GameWorld.DebugLog(" 增加阵营积分: faction=%s,addValue=%s,updScore=%s" % (self.faction, addValue, self.score), self.fbPropertyID)
+
+ self.__checkPerScoreAddSuperItemProgress(befScore)
+
+ if not isCheckVictory:
+ return
+ return self.checkIsVictory()
+
+ def checkIsVictory(self):
+ battleOverScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreBase", 1)
if self.score < battleOverScore:
return
- GameWorld.Log("阵营积分达到获胜积分,获胜! faction=%s,updScore=%s" % (self.faction, self.score), self.fbPropertyID)
+ GameWorld.Log("阵营积分达到获胜积分,获胜! faction=%s,score=%s" % (self.faction, self.score), self.fbPropertyID)
tick = GameWorld.GetGameWorld().GetTick()
DoOver(self.faction, tick)
+ return True
+
+def checkBattleOver(tick):
+ ## 检查结算,根据双方最终积分判断获胜方
+
+ jFactionObj = GetBattleFactionObj(ShareDefine.CampType_Justice)
+ eFactionObj = GetBattleFactionObj(ShareDefine.CampType_Evil)
+ battleOverScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreBase", 1)
+ if jFactionObj.score < battleOverScore and eFactionObj.score < battleOverScore:
+ # 都未获胜
return
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+
+ winFactionObj = jFactionObj
+ # 一般情况双方积分不一样,取排序后的最高分即为获胜阵营
+ if jFactionObj.score != eFactionObj.score:
+ sortList = [[jFactionObj.score, jFactionObj], [eFactionObj.score, eFactionObj]]
+ sortList.sort(reverse=True)
+ _, winFactionObj = sortList[0]
+ winFaction = winFactionObj.faction
+ GameWorld.Log("双方阵营积分不同,高分一方获胜! winFaction=%s,jScore=%s,eScore=%s"
+ % (winFaction, jFactionObj.score, eFactionObj.score), fbPropertyID)
+
+ # 积分相同的情况,随机一方获胜
+ else:
+ winFaction = random.choice([ShareDefine.CampType_Justice, ShareDefine.CampType_Evil])
+ winFactionObj = GetBattleFactionObj(winFaction)
+ winFactionObj.score += 100 # 随机获胜方额外增加积分
+ GameWorld.Log("双方阵营积分相同,随机一方获胜! winFaction=%s,jScore=%s,eScore=%s"
+ % (winFaction, jFactionObj.score, eFactionObj.score), fbPropertyID)
+
+ return winFactionObj.checkIsVictory()
+
## 战场玩家类
-class BattlePlayer(BattleBase):
+class BattlePlayer():
def __init__(self, playerID):
- super(BattlePlayer, self).__init__(playerID)
- self.battleType = self.BattleType_Player
+ self.playerID = playerID
+ self.name = ""
self.faction = 0
+ self.factionObj = None
self.accID = ""
self.job = 1
self.realmLV = 0
self.fightPower = 0
+
self.highScoreToday = 0 # 本日最高积分
self.highScoreWeekTotal = 0 # 本周每日最高分累计
self.enterCountWeek = 0 # 本周累计进入次数
self.onlineCalcTick = 0 # 在线统计tick
self.onlineTimes = 0 # 活动累计在线时长,毫秒
- self.setSuperTaskValueMax(None)
+ self.restoreHPTick = 0 # 营地回血tick
+ self.itemRebornCount = 0 # 使用特殊道具原地复活次数
+
+ self.score = 0 # 积分
+ self.scoreSortTime = 0 # 积分变更排序time值,用于同积分时,先到排名靠前
+ self.killCount = 0 # 击杀数
+ self.continueKillCount = 0 # 连杀数
+ self.ckillCntInfo = {} # 成就连杀数次数 {连杀数:次数, ...}
+ self.killPlayerAddScoreTimes = 0 # 击杀玩家获得积分倍值
+ self.killPlayerScoreAwardEndTick = 0 # 击杀玩家多倍积分福利结束tick
+ self.killBossCnt = 0 # 本阵营归属击败boss
+ self.killScoreKing = 0 # 本场次是否有击败积分王,单场仅计算一次
+ self.killGuardCnt = 0 # 击杀守卫次数
+ self.auraScore = 0 # 在光环中累计获得积分
+ self.superItemAwardCnt = 0 # 获得大奖次数
+ self.factionBuffCollCnt = 0 # 采集阵营buff次数
+ self.personBuffCollCnt = 0 # 个人buff次数
+ self.crystalCollCnt = 0 # 采集水晶资源次数
+ self.wallCollCnt = 0 # 采集积分墙次数
+ self.superItemContribution = 0 # 大奖进度贡献值,也是大奖获奖权重
return
- def getSuperItemRate(self): return IpyGameDataPY.GetFuncCfg("CrossBattlefieldAwardSuper", 2)
- def getSuperItemPlayerID(self): return self.ID
+ def getFactionObj(self):
+ if not self.factionObj and self.faction:
+ self.factionObj = GetBattleFactionObj(self.faction)
+ return self.factionObj
+
+ def getPlayerHelpInfo(self, exInfo=None):
+ helpInfo = {"score":self.score, "superItemContribution":self.superItemContribution, "itemRebornCount":self.itemRebornCount,
+ "killCount":self.killCount, "continueKillCount":self.continueKillCount}
+ if exInfo:
+ helpInfo.update(exInfo)
+ return {"playerInfo":helpInfo}
+
+ def addPlayerScore(self, curPlayer, addValue, scoreType=ScoreType_Default, scoreTimes=1, isCheckVictory=True):
+ addValue *= scoreTimes
+ befScore = self.score
+ self.score = max(0, self.score + addValue)
+ calcTime = 3471264000 #GameWorld.ChangeTimeStrToNum("2080-01-01 00:00:00")
+ self.scoreSortTime = max(0, calcTime - int(time.time()))
+ GameWorld.DebugLog(" 增加玩家积分: playerID=%s,scoreType=%s,addValue=%s,倍值=%s,updScore=%s"
+ % (self.playerID, scoreType, addValue, scoreTimes, self.score), self.playerID)
+
+ if scoreType == ScoreType_Aura and addValue > 0:
+ self.auraScore += addValue
+
+ if curPlayer:
+ FBCommon.Notify_FBHelp(curPlayer, self.getPlayerHelpInfo({"addScore":[addValue, scoreType, scoreTimes]}))
+
+ superScorePer = IpyGameDataPY.GetFuncCfg("CrossBattlefieldAwardSuper2", 1)
+ if superScorePer:
+ befTimes = befScore / superScorePer
+ aftTimes = self.score / superScorePer
+ if aftTimes > 0 and aftTimes != befTimes:
+ addIndex = aftTimes - 1
+ addProgressList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAwardSuper2", 3)
+ addProgress = addProgressList[addIndex] if len(addProgressList) > addIndex else addProgressList[-1]
+ GameWorld.DebugLog(" 玩家每%s积分增加大奖贡献! addProgress=%s,superItemContribution=%s"
+ % (superScorePer, addProgress, self.superItemContribution), self.playerID)
+ self.addSuperItemContribution(addProgress)
+
+ # 个人增加积分同步增加所属阵营积分
+ factionObj = self.getFactionObj()
+ if factionObj:
+ factionObj.addFactionScore(addValue, isCheckVictory)
+ return
+
+ def addKillCount(self, addCount):
+ befContKillCount = self.continueKillCount
+ self.killCount = max(0, self.killCount + addCount)
+ self.continueKillCount = max(0, self.continueKillCount + addCount) # 同步增加连杀
+
+ superContKillPer = IpyGameDataPY.GetFuncCfg("CrossBattlefieldAwardSuper2", 2)
+ if superContKillPer:
+ befTimes = befContKillCount / superContKillPer
+ aftTimes = self.continueKillCount / superContKillPer
+ if aftTimes > 0 and aftTimes != befTimes:
+ addIndex = aftTimes - 1
+ addProgressList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldAwardSuper2", 3)
+ addProgress = addProgressList[addIndex] if len(addProgressList) > addIndex else addProgressList[-1]
+ GameWorld.DebugLog(" 玩家每%s连杀增加大奖贡献! addProgress=%s,superItemContribution=%s"
+ % (superContKillPer, addProgress, self.superItemContribution), self.playerID)
+ self.addSuperItemContribution(addProgress)
+
+ # 连杀数成就计数
+ ckillCntList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldSuccess", 1)
+ for ckillCnt in ckillCntList:
+ # 需整除才计数1
+ if self.continueKillCount and self.continueKillCount % ckillCnt == 0:
+ self.ckillCntInfo[ckillCnt] = self.ckillCntInfo.get(ckillCnt, 0) + 1
+ return
+
+ def addSuperItemContribution(self, addProgress):
+ self.superItemContribution = max(0, self.superItemContribution + addProgress)
+ GameWorld.DebugLog(" 更新玩家大奖贡献: playerID=%s,addProgress=%s,superItemContribution=%s" % (self.playerID, addProgress, self.superItemContribution), self.playerID)
+ factionObj = self.getFactionObj()
+ if factionObj:
+ factionObj.addSuperItemProgress(addProgress)
+ return
def GetBattleWorld():
worldObj = FBCommon.GetGameFBData(GameFBData_BattleWorld)
@@ -288,27 +477,80 @@
playerObj = BattlePlayer(playerID)
playerInfoDict[playerID] = playerObj
return playerObj
-
+
def GetBFStepTime(): return IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFB", 1) # 阶段时间
+def GetCrystalNPCIDList(): # 水晶资源NPCID列表
+ crystalNPCIDPosDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldCrystal", 1, {})
+ return crystalNPCIDPosDict.keys()
+def GetGuardNPCIDList(): return IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldGuard", 1) # 守卫NPCID列表
+def GetPersonBuffIDList(): return IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldPersonBuff", 1) # 个人buffID列表
+def GetFactionBuffIDList(): return IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFactionBuff", 1) # 阵营buffID列表
+def GetRobotNPCIDList(): return IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldRobot", 1) # 机器人NPCID列表
def OnOpenFB(tick):
- #fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
FBCommon.SetGameFBData(GameFBData_BattleWorld, None)
FBCommon.SetGameFBData(GameFBData_FactionInfo, {})
FBCommon.SetGameFBData(GameFBData_PlayerInfo, {})
- GetBattleWorld()
+ worldObj = GetBattleWorld()
GetBattleFactionObj(ShareDefine.CampType_Justice)
GetBattleFactionObj(ShareDefine.CampType_Evil)
FBCommon.SetFBStep(FB_Step_Prepare, tick)
+
+ zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
+ hmNum = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield)
+ hmCallTeamInfo = PyGameData.g_crossBattlefieldCallTeamInfo.get(zoneID, {})
+ callTeamInfo = hmCallTeamInfo.get(hmNum, {})
+ for playerID, callTeam in callTeamInfo.items():
+ worldObj.callOpenPlayerInfo[playerID] = callTeam["factionID"]
+ GameWorld.Log("开启战场副本: hmNum=%s,callOpenPlayerInfo=%s" % (hmNum, worldObj.callOpenPlayerInfo), fbPropertyID)
+
+ # 刷水晶
+ crystalNPCIDPosDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldCrystal", 1, {})
+ for npcID, posInfo in crystalNPCIDPosDict.items():
+ NPCCommon.SummonMapNpc(npcID, posInfo[0], posInfo[1])
+
+ # 刷守卫
+ rebornGurad()
return
+
+def rebornGurad():
+ # 复活守卫
+ isOnlyCallHaveGuard = IpyGameDataPY.GetFuncCfg("CrossBattlefieldGuard", 5)
+ guardFactionList = []
+ if isOnlyCallHaveGuard:
+ zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
+ hmNum = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield)
+ hmCallTeamInfo = PyGameData.g_crossBattlefieldCallTeamInfo.get(zoneID, {})
+ callTeamInfo = hmCallTeamInfo.get(hmNum, {})
+ for playerID, callTeam in callTeamInfo.items():
+ guardFactionList.append([callTeam["factionID"], playerID])
+ else:
+ guardFactionList = [[ShareDefine.CampType_Justice, 0], [ShareDefine.CampType_Evil, 0]]
+
+ rebornNPCIDList = []
+ guardNPCIDList = GetGuardNPCIDList()
+ guardNPCPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldGuard", 2)
+ for faction, playerID in guardFactionList:
+ if not faction or faction > len(guardNPCIDList) or faction > len(guardNPCPosList):
+ continue
+ npcID = guardNPCIDList[faction - 1]
+ if GameWorld.FindNPCByNPCID(npcID):
+ GameWorld.DebugLog("守卫已存在,不重复复活! npcID=%s" % npcID)
+ continue
+ posInfo = guardNPCPosList[faction - 1]
+ NPCCommon.SummonMapNpc(npcID, posInfo[0], posInfo[1], playerID=playerID)
+ rebornNPCIDList.append(npcID)
+ return rebornNPCIDList
def OnCloseFB(tick):
GameWorld.GetGameWorld().SetPropertyID(0)
FBCommon.SetGameFBData(GameFBData_BattleWorld, None)
FBCommon.SetGameFBData(GameFBData_FactionInfo, None)
FBCommon.SetGameFBData(GameFBData_PlayerInfo, None)
+ FBCommon.ClearFBNPC()
return
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
@@ -334,7 +576,7 @@
##副本玩家进入点, 玩家分散在半径3格范围
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
- return random.choice(IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldPos", 1))
+ return random.choice(IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFB", 2))
def DoEnterFB(curPlayer, tick):
gameFB = GameWorld.GetGameFB()
@@ -367,31 +609,26 @@
elif fbStep == FB_Step_Fighting:
notify_tick = GetBFStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
- isToSafePos = not battleObj.faction
- allotPlayerFaction(playerID, fightPower, curPlayer, isToSafePos, tick)
+ allotPlayerFaction(playerID, fightPower, curPlayer, fbStep, tick)
return
##获得副本帮助信息, 用于通知阵营比分条
def DoFBHelp(curPlayer, tick):
- #gameWorld = GameWorld.GetGameWorld()
+ gameWorld = GameWorld.GetGameWorld()
playerID = curPlayer.GetPlayerID()
+ lineID = gameWorld.GetLineID()
worldObj = GetBattleWorld()
battleObj = GetBattlePlayerObj(playerID)
-
- playerInfo = {"score":battleObj.score, "superTaskValue":battleObj.superTaskValue,
- "superTaskValueMax":battleObj.superTaskValueMax, "superTaskFinishCount":battleObj.superTaskFinishCount}
- factionInfo = {}
+ helpDict = {}
+ helpDict.update(battleObj.getPlayerHelpInfo())
+ helpDict.update(worldObj.getWorldHelpInfo(tick))
for faction in [ShareDefine.CampType_Justice, ShareDefine.CampType_Evil]:
factionObj = GetBattleFactionObj(faction)
- factionInfo[str(faction)] = {"score":factionObj.score, "superTaskValue":factionObj.superTaskValue,
- "superTaskValueMax":factionObj.superTaskValueMax, "superTaskFinishCount":factionObj.superTaskFinishCount}
-
- worldInfo = {"superTaskType":worldObj.superTaskType, "superItemPlayerName":worldObj.superItemPlayerName, "superItemInfo":worldObj.superItemInfo}
-
- helpDict = {"playerInfo":playerInfo, "factionInfo":factionInfo, "worldInfo":worldInfo}
+ helpDict.update(factionObj.getFactionHelpInfo())
+ helpDict[FBCommon.Help_robotJob] = PyGameData.g_fbRobotJobDict.get(lineID, {})
#GameWorld.DebugLog("DoFBHelp %s" % helpDict, playerID)
FBCommon.Notify_FBHelp(curPlayer, helpDict)
return
@@ -439,7 +676,7 @@
# 副本准备
if fbStep == FB_Step_Prepare:
- __DoLogic_FB_Prepare(tick)
+ __DoLogic_FB_Prepare(fbStep, tick)
# 副本进行中
elif fbStep == FB_Step_Fighting:
@@ -447,11 +684,11 @@
# 副本结束
elif fbStep == FB_Step_LeaveTime:
- __DoLogic_FB_Over(tick)
+ __DoLogic_FB_Leave(tick)
return
-def __DoLogic_FB_Prepare(tick):
+def __DoLogic_FB_Prepare(fbStep, tick):
remaindTick = GetBFStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
if remaindTick > 0:
@@ -483,11 +720,8 @@
# playerInfoList.append({"playerID":playerID, "fightPower":fightPower, "curPlayer":None})
# ##--------- 山寨分配测试代码 --------------
- # 按战力排序
- # 当超过副本下限人数时,往人数低的阵营划分; 否则 往战力低的阵营划分
- playerInfoList.sort(key=operator.itemgetter("fightPower"), reverse=True)
-
- isToSafePos = True
+ # 按战力从低到高升序排序
+ playerInfoList.sort(key=operator.itemgetter("fightPower"))
# 先分配召集队伍
fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
@@ -507,7 +741,7 @@
playerID = playerInfo["playerID"]
fightPower = playerInfo["fightPower"]
curPlayer = playerInfo["curPlayer"]
- allotPlayerFaction(playerID, fightPower, curPlayer, isToSafePos, tick)
+ allotPlayerFaction(playerID, fightPower, curPlayer, fbStep, tick)
for playerInfo in playerInfoList:
playerID = playerInfo["playerID"]
@@ -515,11 +749,12 @@
curPlayer = playerInfo["curPlayer"]
if playerID in callPlayerIDList:
continue
- allotPlayerFaction(playerID, fightPower, curPlayer, isToSafePos, tick)
+ allotPlayerFaction(playerID, fightPower, curPlayer, fbStep, tick)
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
return
-def allotPlayerFaction(playerID, fightPower, curPlayer, isToSafePos, tick):
+def allotPlayerFaction(playerID, fightPower, curPlayer, allotStep, tick):
## 分配玩家阵营
zoneID = FBCommon.GetCrossDynamicLineMapZoneID()
@@ -536,26 +771,28 @@
fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
battleObj = GetBattlePlayerObj(playerID)
faction = battleObj.faction
+ isAllot = not faction # 是否分配,无阵营时为 True
if callFaction:
faction = callFaction # 召集阵营为固定阵营
if not faction:
jFactionObj = GetBattleFactionObj(ShareDefine.CampType_Justice)
eFactionObj = GetBattleFactionObj(ShareDefine.CampType_Evil)
-
- onlinePlayerTotal = len(jFactionObj.onlinePlayerIDList) + len(eFactionObj.onlinePlayerIDList)
- fbPlayerCountSet = IpyGameDataPY.GetFuncCfg("CrossBattlefieldFB", 3) # 副本下限人数设定
-
- # 当超过副本下限人数时,往人数低的阵营划分; 否则 往战力低的阵营划分
- if onlinePlayerTotal > fbPlayerCountSet:
- faction = ShareDefine.CampType_Justice if len(jFactionObj.onlinePlayerIDList) <= len(eFactionObj.onlinePlayerIDList) else ShareDefine.CampType_Evil
+ jPlayerCount = len(jFactionObj.factionPlayerDict)
+ ePlayerCount = len(eFactionObj.factionPlayerDict)
+ # 人数相同时随机,否则往人数少的分配
+ if jPlayerCount == ePlayerCount:
+ faction = random.choice([ShareDefine.CampType_Justice, ShareDefine.CampType_Evil])
+ elif jPlayerCount < ePlayerCount:
+ faction = ShareDefine.CampType_Justice
else:
- faction = ShareDefine.CampType_Justice if jFactionObj.onlineFightPowerTotal <= eFactionObj.onlineFightPowerTotal else ShareDefine.CampType_Evil
+ faction = ShareDefine.CampType_Evil
battleObj.faction = faction
battleObj.onlineCalcTick = tick
factionObj = GetBattleFactionObj(faction)
+ battleObj.factionObj = factionObj
if playerID not in factionObj.factionPlayerDict:
factionObj.factionPlayerDict[playerID] = battleObj
@@ -565,38 +802,120 @@
if playerID not in factionObj.onlinePlayerIDList:
factionObj.onlinePlayerIDList.append(playerID)
- GameWorld.Log(" 分配阵营: callFaction=%s,faction=%s,playerID=%s,fightPower=%s,onlineFightPowerTotal=%s,onlinePlayerIDList=%s,isToSafePos=%s"
- % (callFaction, faction, playerID, fightPower, factionObj.onlineFightPowerTotal, factionObj.onlinePlayerIDList, isToSafePos), fbPropertyID)
+ GameWorld.Log(" 分配阵营: allotStep=%s,callFaction=%s,faction=%s,playerID=%s,fightPower=%s,onlineFightPowerTotal=%s,onlinePlayerIDList=%s,isAllot=%s"
+ % (allotStep, callFaction, faction, playerID, fightPower, factionObj.onlineFightPowerTotal, factionObj.onlinePlayerIDList, isAllot), fbPropertyID)
+ # 分配阶段是准备阶段的
+ if allotStep == FB_Step_Prepare:
+ initScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreBase", 2)
+ battleObj.addPlayerScore(curPlayer, initScore)
+
if curPlayer:
curPlayer.SetFaction(faction)
- if isToSafePos:
- __RandFactionSafeArea(curPlayer)
+ if isAllot:
+ __RandFactionRebornArea(curPlayer)
return
-## 重置副本复活玩家坐标点
-def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):
- __RandFactionSafeArea(curPlayer)
+def OnCanFBReborn(curPlayer, rebornType):
+ playerID = curPlayer.GetPlayerID()
+ if rebornType == ChConfig.rebornType_Health:
+ GameWorld.ErrLog("不允许消耗货币原地健康复活! ", playerID)
+ return False
+
+ if rebornType == ChConfig.rebornType_UseItem:
+ battleObj = GetBattlePlayerObj(playerID)
+ if battleObj.itemRebornCount >= IpyGameDataPY.GetFuncCfg("CrossBattlefieldReborn", 2):
+ PlayerControl.NotifyCode(curPlayer, "CrossBattlefieldItemRebornLimit")
+ return False
+
+ return True
+
+## 玩家复活后处理
+def OnPlayerRebornOver(curPlayer, rebornType):
+ playerID = curPlayer.GetPlayerID()
+ battleObj = GetBattlePlayerObj(playerID)
+
+ if rebornType == ChConfig.rebornType_UseItem:
+ battleObj.itemRebornCount += 1
+ GameWorld.DebugLog("更新使用道具复活次数! itemRebornCount=%s, 且不中断连杀=%s"
+ % (battleObj.itemRebornCount, battleObj.continueKillCount), playerID)
+ else:
+ GameWorld.DebugLog("非原地复活,中断连杀! %s" % battleObj.continueKillCount, playerID)
+ battleObj.continueKillCount = 0 # 非原地复活的中断连杀数
+
return
-def __RandFactionSafeArea(curPlayer):
- faction = curPlayer.GetFaction()
- factionSafeAreaRandPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldPos", 2)
- if faction and faction <= len(factionSafeAreaRandPosList):
- safePosX, safePosY, radius = random.choice(factionSafeAreaRandPosList[faction - 1])
- posPoint = GameMap.GetEmptyPlaceInArea(safePosX, safePosY, radius)
- posX, posY = posPoint.GetPosX(), posPoint.GetPosY()
+def OnPlayerReborn():
+ ## 是否副本复活
+ return True
+
+## 重置副本复活玩家坐标点
+def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):
+ __RandFactionRebornArea(curPlayer)
+ return
+
+def __RandFactionRebornArea(curPlayer):
+ ## 随机阵营复活点: 营地 + 已占领的资源点 随机
+ faction = curPlayer.GetFaction()
+ posInfo = getRandFactionRebornPos(faction)
+ if posInfo:
+ posX, posY = posInfo
else:
posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
curPlayer.ResetPos(posX, posY)
return
+def getRandFactionRebornPos(faction):
+ rebornPosList = []
+ factionSafeAreaRandPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFB", 3)
+ if faction and faction <= len(factionSafeAreaRandPosList):
+ safePosX, safePosY, _ = factionSafeAreaRandPosList[faction - 1]
+ rebornPosList.append([safePosX, safePosY, 3])
+
+ crystalNPCIDPosDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldCrystal", 1, {})
+ worldObj = GetBattleWorld()
+ for npcID, ownerFaction in worldObj.crystalFactionInfo.items():
+ if ownerFaction != faction:
+ continue
+ if npcID not in crystalNPCIDPosDict:
+ continue
+ posInfo = crystalNPCIDPosDict[npcID]
+ rebornPosList.append([posInfo[0], posInfo[1], 3])
+
+ if not rebornPosList:
+ return
+ randPosX, randPosY, radius = random.choice(rebornPosList)
+ posPoint = GameMap.GetEmptyPlaceInArea(randPosX, randPosY, radius)
+ return posPoint.GetPosX(), posPoint.GetPosY()
+
+def GetFBRobotRandomMovePos(curNPC):
+ ## 获取副本中机器人随机移动坐标点
+
+ randPosList = []
+
+ crystalNPCIDPosDict = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldCrystal", 1, {})
+ for posX, posY in crystalNPCIDPosDict.values():
+ randPosList.append([posX, posY])
+
+ factionBuffPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFactionBuff", 2)
+ for posList in factionBuffPosList:
+ for posX, posY in posList:
+ randPosList.append([posX, posY])
+
+ return random.choice(randPosList)
+
def __DoLogic_FB_Fighting(tick):
- remaindTick = GetBFStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
+ passTick = tick - GameWorld.GetGameFB().GetFBStepTick()
+ remaindTick = GetBFStepTime()[Time_Fight] * 1000 - passTick
if remaindTick > 0:
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000, refreshFactionPlayer)
+ passSeconds = passTick / 1000
+ __refreshFactionHome(tick)
+ __RefreshPersonBuff(tick, passSeconds)
+ __RefreshFactionBuff(tick, passSeconds)
+ __RefreshBattlefieldEvent(tick, passSeconds)
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, FightRefreshInterval, refreshCrossBattlefield)
return
jFactionObj = GetBattleFactionObj(ShareDefine.CampType_Justice)
@@ -611,111 +930,531 @@
DoOver(winnerFaction, tick)
return
-def __DoLogic_FB_Over(tick):
+def __refreshFactionHome(tick):
+ # 刷新阵营营地相关,如回血等
+
+ restoreHPPerBySecond = IpyGameDataPY.GetFuncCfg("CrossBattlefieldFB", 4) # 每秒回血百分比
+ factionSafeAreaRandPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFB", 3) # 营地坐标
+
+ copyMapMgr = GameWorld.GetMapCopyPlayerManager()
+ for faction in [ShareDefine.CampType_Justice, ShareDefine.CampType_Evil]:
+ factionObj = GetBattleFactionObj(faction)
+ if not factionObj.homePlayerIDList:
+ continue
+
+ for playerID in factionObj.homePlayerIDList[::-1]:
+ curPlayer = copyMapMgr.FindPlayerByID(playerID)
+ if not curPlayer:
+ continue
+
+ batObj = GetBattlePlayerObj(playerID)
+ safePosX, safePosY, safeRadius = factionSafeAreaRandPosList[faction - 1]
+ if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), safePosX, safePosY) > safeRadius:
+ factionObj.homePlayerIDList.remove(playerID)
+ batObj.restoreHPTick = 0
+ continue
+
+ # 营地回血
+ restoreSeconds = (tick - batObj.restoreHPTick) / 1000.0 if batObj.restoreHPTick else 1 # 首次保底1秒
+ if restoreSeconds < 1:
+ continue
+ maxHP = GameObj.GetMaxHP(curPlayer)
+ if GameObj.GetHP(curPlayer) < maxHP:
+ restoreHP = int(maxHP * restoreHPPerBySecond / 100.0 * round(restoreSeconds, 1))
+ #GameWorld.DebugLog("restoreHPPerBySecond=%s,restoreSeconds=%s,maxHP=%s,restoreHP=%s"
+ # % (restoreHPPerBySecond, restoreSeconds, maxHP, restoreHP), playerID)
+ SkillCommon.SkillAddHP(curPlayer, 0, restoreHP)
+ batObj.restoreHPTick = tick
+
+ return
+
+def __RefreshPersonBuff(tick, passSeconds):
+ ## 刷新个人buff
+ startRefreshSeconds, refreshCD = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldPersonBuff", 3)
+ if passSeconds < startRefreshSeconds:
+ return
+
+ buffCountMax = IpyGameDataPY.GetFuncCfg("CrossBattlefieldPersonBuff", 4)
+ worldObj = GetBattleWorld()
+ if worldObj.personBuffCount >= buffCountMax:
+ return
+
+ if (tick - worldObj.personBuffCalcTick) < (refreshCD * 1000):
+ return
+
+ buffIDList = GetPersonBuffIDList()
+ if not buffIDList:
+ return
+
+ posList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldPersonBuff", 2)
+ posInfo = __GetRandPos(posList)
+ if not posInfo:
+ return
+
+ randBuffNPCID = random.choice(buffIDList)
+ if not NPCCommon.SummonMapNpc(randBuffNPCID, posInfo[0], posInfo[1]):
+ return
+
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ worldObj.personBuffCount = worldObj.personBuffCount + 1
+ if worldObj.personBuffCount >= buffCountMax:
+ worldObj.personBuffCalcTick = 0
+ else:
+ worldObj.personBuffCalcTick = tick
+
+ GameWorld.DebugLog("刷新个人buff: randBuffNPCID=%s,personBuffCount=%s" % (randBuffNPCID, worldObj.personBuffCount), fbPropertyID)
+ return
+
+def __RefreshFactionBuff(tick, passSeconds):
+ ## 刷新阵营buff
+ startRefreshSeconds, refreshCD = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFactionBuff", 3)
+ if passSeconds < startRefreshSeconds:
+ return
+
+ worldObj = GetBattleWorld()
+ if worldObj.factionBuffNPCInfo:
+ return
+
+ if (tick - worldObj.factionBuffCalcTick) < (refreshCD * 1000):
+ return
+
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ if not worldObj.factionBuffIDOrderList:
+ buffIDList = GetFactionBuffIDList()
+ if not buffIDList:
+ return
+ worldObj.factionBuffIDOrderList = copy.deepcopy(buffIDList)
+ random.shuffle(worldObj.factionBuffIDOrderList) # 每轮重新打乱顺序
+ GameWorld.DebugLog("战场阵营buff顺序列表: %s" % worldObj.factionBuffIDOrderList, fbPropertyID)
+
+ if not worldObj.factionBuffIDOrderList:
+ return
+
+ jFactionObj = GetBattleFactionObj(ShareDefine.CampType_Justice)
+ eFactionObj = GetBattleFactionObj(ShareDefine.CampType_Evil)
+ # 使用对方阵营的积分作为本阵营权重, 分数越低的阵营随机到靠近自己阵营的位置的权重越高,权重至少10
+ nearFactionWeightList = [[max(10, jFactionObj.score), ShareDefine.CampType_Evil],
+ [max(10, eFactionObj.score), ShareDefine.CampType_Justice]]
+ nearFaction = GameWorld.GetResultByWeightList(nearFactionWeightList, ShareDefine.CampType_Evil)
+
+ allPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFactionBuff", 2)
+ if nearFaction > len(allPosList):
+ return
+
+ posList = allPosList[nearFaction - 1]
+ posInfo = __GetRandPos(posList)
+ if not posInfo:
+ return
+ posX, posY = posInfo[0], posInfo[1]
+
+ randBuffNPCID = worldObj.factionBuffIDOrderList.pop(0)
+ if not NPCCommon.SummonMapNpc(randBuffNPCID, posX, posY):
+ return
+
+ worldObj.factionBuffNPCInfo = [randBuffNPCID, posX, posY]
+ GameWorld.DebugLog("刷新阵营buff: randBuffNPCID=%s,nearFaction=%s,nearFactionWeightList=%s"
+ % (randBuffNPCID, nearFaction, nearFactionWeightList), fbPropertyID)
+ PlayerControl.FBNotify("CrossBattlefieldBuff_%s" % randBuffNPCID, [randBuffNPCID])
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ return
+
+def __GetRandPos(posList):
+ if not posList:
+ return
+ random.shuffle(posList)
+ gameMap = GameWorld.GetMap()
+ for posX, posY in posList:
+ if gameMap.CanMove(posX, posY) != True:
+ continue
+ #检查有没有玩家在这一点上
+ mapObj = gameMap.GetPosObj(posX, posY)
+ if not mapObj:
+ continue
+ if mapObj.GetObjCount() != 0:
+ #有玩家在此点上
+ #GameWorld.DebugLog("有实例在此坐标上: posX=%s, posY=%s, GetObjCount=%s"
+ # % (posX, posY, mapObj.GetObjCount()), GameWorld.GetGameWorld().GetPropertyID())
+ continue
+ return posX, posY
+
+ return
+
+def __RefreshBattlefieldEvent(tick, passSeconds):
+ ## 刷新战场随机事件
+
+ worldObj = GetBattleWorld()
+
+ if worldObj.eventStartTick > worldObj.lastEventEndTick:
+ #GameWorld.DebugLog("当前事件进行中未结束!")
+ if worldObj.eventNum == EventNum_Aura:
+ if tick <= worldObj.eventEndTick:
+ return
+
+ auraNPCID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreAura", 1)
+ auraNPC = GameWorld.FindNPCByNPCID(auraNPCID)
+ if auraNPC:
+ NPCCommon.SetDeadEx(auraNPC)
+
+ worldObj.setEventEnd(tick)
+
+ return
+
+ if not worldObj.eventInfoList:
+ return
+
+ nextEventTime, nextEventNum = worldObj.eventInfoList[0] # 默认取第一个就行,副本开始时已随机好
+ if passSeconds < nextEventTime:
+ # 事件时间未到
+ return
+
+ eventRefresCD = IpyGameDataPY.GetFuncCfg("CrossBattlefieldEvent", 4) * 1000
+ if worldObj.lastEventEndTick and eventRefresCD and (tick - worldObj.lastEventEndTick) < eventRefresCD:
+ GameWorld.DebugLog("事件刷新CD中!")
+ return
+
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ jFactionObj = GetBattleFactionObj(ShareDefine.CampType_Justice)
+ eFactionObj = GetBattleFactionObj(ShareDefine.CampType_Evil)
+
+ nearFaction = 0
+ if nextEventNum == EventNum_Boss:
+ callFactioList = worldObj.callOpenPlayerInfo.values()
+ callFactioList = worldObj.callOpenPlayerInfo.values()
+ if len(callFactioList) == 1:
+ nearFaction = callFactioList[0]
+ GameWorld.Log("战场boss事件,仅一方召集,固定刷新在靠近该阵营的位置: nearFaction=%s, callOpenPlayerInfo=%s"
+ % (nearFaction, worldObj.callOpenPlayerInfo), fbPropertyID)
+ else:
+ GameWorld.Log("战场boss事件,走常规逻辑判断靠近阵营位置! callOpenPlayerInfo=%s" % worldObj.callOpenPlayerInfo, fbPropertyID)
+
+ # 使用对方阵营的积分作为本阵营权重, 分数越低的阵营随机到靠近自己阵营的位置的权重越高,权重至少10
+ if nearFaction:
+ # 已经决定了事件靠近的阵营,不用再处理
+ pass
+ elif jFactionObj.score < eFactionObj.score:
+ nearFaction = ShareDefine.CampType_Justice
+ elif jFactionObj.score > eFactionObj.score:
+ nearFaction = ShareDefine.CampType_Evil
+ else:
+ nearFaction = random.choice([ShareDefine.CampType_Justice, ShareDefine.CampType_Evil])
+
+ if nextEventNum == EventNum_Aura:
+ refreshNPCID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreAura", 1)
+ elif nextEventNum == EventNum_Boss:
+ refreshNPCID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 1)
+ elif nextEventNum == EventNum_Wall:
+ refreshNPCID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreWall", 1)
+ else:
+ return
+
+ refreshMark = 0
+ if refreshNPCID:
+ eventRefreshMarkList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldEvent", 1)
+ if nearFaction > len(eventRefreshMarkList):
+ return
+ refreshMark = eventRefreshMarkList[nearFaction - 1]
+
+ worldObj.eventInfoList.pop(0)
+ eventNum = nextEventNum
+ GameWorld.Log("开始战场事件: eventNum=%s,refreshNPCID=%s,nearFaction=%s,refreshMark=%s"
+ % (eventNum, refreshNPCID, nearFaction, refreshMark), fbPropertyID)
+
+ worldObj.eventNum = eventNum
+ worldObj.eventNPCID = refreshNPCID
+ worldObj.eventStartTick = tick
+ if eventNum == EventNum_Aura:
+ worldObj.eventEndTick = tick + IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreAura", 2) * 1000
+ else:
+ worldObj.eventEndTick = 0
+
+ if refreshNPCID and refreshMark:
+ NPCCustomRefresh.SetNPCRefresh(refreshMark, [refreshNPCID])
+
+ # 帮助信息放在NPC刷出来后通知,因为需要坐标信息
+ return
+
+def DoFBRebornNPC(curNPC, tick):
+ ##副本有NPC召出
+
+ npcID = curNPC.GetNPCID()
+ worldObj = GetBattleWorld()
+
+ if npcID == worldObj.eventNPCID:
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ eventNum = worldObj.eventNum
+ worldObj.eventNPCHP = GameObj.GetHP(curNPC)
+ worldObj.eventNPCPos = [curNPC.GetPosX(), curNPC.GetPosY()]
+ GameWorld.Log("战场事件NPC刷新: eventNum=%s,npcID=%s,eventNPCPos=%s,eventNPCHP=%s"
+ % (worldObj.eventNum, npcID, worldObj.eventNPCPos, worldObj.eventNPCHP), fbPropertyID)
+
+ if eventNum == EventNum_Aura:
+ PlayerControl.FBNotify("CrossBattlefieldEventAura", [npcID])
+ elif eventNum == EventNum_Boss:
+ factionScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 3)
+ PlayerControl.FBNotify("CrossBattlefieldEventBoss", [npcID, factionScore])
+ elif eventNum == EventNum_Wall:
+ wallScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreWall", 3)
+ PlayerControl.FBNotify("CrossBattlefieldEventWall", [npcID, wallScore, worldObj.eventNPCHP])
+
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+
+ return
+
+def DoBeAttackOver(attacker, defender, curSkill, tick):
+ atkObjType = attacker.GetGameObjType()
+ defObjType = defender.GetGameObjType()
+
+ if atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:
+ curNPC, curPlayer = attacker, defender
+ npcID = curNPC.GetNPCID()
+ if npcID == IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreAura", 1):
+ __DoAuraNPCAddPlayerScore(curNPC, curPlayer)
+
+ return
+
+def __DoAuraNPCAddPlayerScore(curNPC, curPlayer):
+ ## 积分光环给玩家增加积分
+ #npcID = curNPC.GetNPCID()
+ playerID = curPlayer.GetPlayerID()
+ auraScoreRange = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreAura", 3)
+ if len(auraScoreRange) != 2:
+ return
+ addValue = random.randint(auraScoreRange[0], auraScoreRange[1])
+ #GameWorld.DebugLog("积分光环给玩家加积分: addValue=%s,auraScoreRange=%s" % (addValue, auraScoreRange), playerID)
+ battleObj = GetBattlePlayerObj(playerID)
+ battleObj.addPlayerScore(curPlayer, addValue, ScoreType_Aura)
+ return
+
+def __DoLogic_FB_Leave(tick):
remaindTick = GetBFStepTime()[Time_Leave] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
if remaindTick > 0:
return
+ FBCommon.DoLogic_FBKickAllPlayer()
GameWorldProcess.CloseFB(tick)
FBCommon.SetFBStep(FB_Step_Over, tick)
return
##处理副本中杀死玩家逻辑
def DoFBOnKill_Player(curPlayer, defender, tick):
- playerID = curPlayer.GetPlayerID()
- tagPlayerID = defender.GetPlayerID()
- faction = curPlayer.GetFaction()
- tagFaction = defender.GetFaction()
- curBattleObj = GetBattlePlayerObj(playerID)
- tagBattleObj = GetBattlePlayerObj(tagPlayerID)
- if not faction or not tagFaction:
- GameWorld.ErrLog("击杀玩家没有阵营! playerID=%s,faction=%s,tagPlayerID=%s,tagFaction=%s"
- % (playerID, faction, tagPlayerID, tagFaction), playerID)
- return
-
- worldObj = GetBattleWorld()
- curFactionObj = GetBattleFactionObj(faction)
- tagFactionObj = GetBattleFactionObj(tagFaction)
-
- GameWorld.DebugLog("击杀玩家! playerID=%s,faction=%s,tagPlayerID=%s,tagFaction=%s"
- % (playerID, faction, tagPlayerID, tagFaction), playerID)
-
- # 1. 处理玩家
- killPlayerScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldKill", 1)
- addPlayerScore = 0
- addPlayerScore += killPlayerScore
- #addPlayerScore += ... # 其他加分
- curBattleObj.addScore(worldObj, addPlayerScore)
- curBattleObj.addKillCount(worldObj, 1)
- tagBattleObj.addBeKilledCount(1)
-
- # 2. 处理阵营
- addFactionScore = 0
- addFactionScore += addPlayerScore # 阵营积分同步增加玩家得分
- # 击杀积分王,阵营积分额外增加
- for index, kingID in enumerate(tagFactionObj.scoreKingIDList):
- if kingID == tagPlayerID:
- killScoreKingScoreList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreKing", 3)
- if index < len(killScoreKingScoreList):
- kingScore = killScoreKingScoreList[index]
- addFactionScore += kingScore
- GameWorld.DebugLog(" 对方是积分王,阵营额外获得积分: index=%s,kingScore=%s" % (index, kingScore), playerID)
-
- killScoreKingNotifyList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreKing", 4)
- if index < len(killScoreKingNotifyList):
- msgMark = killScoreKingNotifyList[index]
- defMapID = defender.GetMapID()
- defPosX = defender.GetPosX()
- defPosY = defender.GetPosY()
- PlayerControl.FBNotify(msgMark, [faction, curPlayer.GetPlayerName(), tagFaction, defender.GetPlayerName(), defMapID, defPosX, defPosY])
-
- break
- #addFactionScore += ... # 其他加分
- curFactionObj.addScore(worldObj, addFactionScore)
- curFactionObj.addKillCount(worldObj, 1)
- tagFactionObj.addBeKilledCount(1)
+ onBattleObjKillOtherBattleObj(curPlayer, defender, tick)
return True
-def refreshFactionPlayer(tick):
- ## 刷新阵营玩家相关
+def onBattleObjKillOtherBattleObj(atkObj, defObj, tick):
+ ## 战斗实例 击杀 其他阵营战斗实例,战斗实例包含(真实玩家、战斗机器人)
+ if not atkObj or not defObj:
+ return
+ atkID = atkObj.GetID()
+ defID = defObj.GetID()
+ atkObjType = atkObj.GetGameObjType()
+ defObjType = defObj.GetGameObjType()
+
+ if atkObjType == defObjType and atkID == defID:
+ return
+
+ if atkObjType == IPY_GameWorld.gotPlayer:
+ atkName = atkObj.GetName()
+ atkFaction = atkObj.GetFaction()
+ elif atkObjType == IPY_GameWorld.gotNPC:
+ atkFaction = NPCCommon.GetFaction(atkObj)
+ atkName = atkObj.GetName()
+ atkName = atkName.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
+ else:
+ return
+
+ if defObjType == IPY_GameWorld.gotPlayer:
+ defFaction = defObj.GetFaction()
+ elif defObjType == IPY_GameWorld.gotNPC:
+ defFaction = NPCCommon.GetFaction(defObj)
+ else:
+ return
+
+ if not atkFaction or not defFaction or atkFaction == defFaction:
+ return
+
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ baseKillScore = 0 # 基础击杀分
+ fbFightSeconds = (tick - GameWorld.GetGameFB().GetFBStepTick()) / 1000
+ killPlayerScoreTimeList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreBase", 3)
+ for fbFightTimes, killScore in killPlayerScoreTimeList:
+ if fbFightSeconds <= (fbFightTimes * 60):
+ baseKillScore = killScore
+ GameWorld.DebugLog("基础击杀分: baseKillScore=%s, %s分钟内" % (baseKillScore, fbFightTimes), fbPropertyID)
+ break
+
+ worldObj = GetBattleWorld()
+
+ # 1. 处理玩家个人积分
+ if atkObjType == IPY_GameWorld.gotPlayer:
+ playerID = atkID
+ playerScore = 0
+ playerScore += baseKillScore
+
+ GameWorld.DebugLog("玩家击杀对手! playerID=%s,atkFaction=%s,defObjType=%s,defID=%s"
+ % (playerID, atkFaction, defObjType, defID), fbPropertyID)
+
+ if playerID in worldObj.callOpenPlayerInfo:
+ callPlayerKillScoreEx = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreBase", 4)
+ playerScore += callPlayerKillScoreEx
+ GameWorld.DebugLog(" 召集人额外击杀分: callPlayerKillScoreEx=%s" % callPlayerKillScoreEx, fbPropertyID)
+
+ atkBattleObj = GetBattlePlayerObj(playerID)
+ scoreTimes = 1 # 积分倍值
+ if atkBattleObj.killPlayerAddScoreTimes and tick <= atkBattleObj.killPlayerScoreAwardEndTick:
+ scoreTimes = atkBattleObj.killPlayerAddScoreTimes
+ else:
+ atkBattleObj.killPlayerAddScoreTimes = 0
+ atkBattleObj.killPlayerScoreAwardEndTick = 0
+ atkBattleObj.addKillCount(1)
+ atkBattleObj.addPlayerScore(atkObj, playerScore, ScoreType_KillPlayer, scoreTimes)
+
+ else:
+ GameWorld.DebugLog("机器人击杀对手! atkID=%s,atkFaction=%s,defObjType=%s,defID=%s"
+ % (atkID, atkFaction, defObjType, defID), fbPropertyID)
+ # 机器人不计算个人积分
+
+ # 2. 处理阵营积分
+ factionScore = 0
+ atkFactionObj = GetBattleFactionObj(atkFaction)
+ defFactionObj = GetBattleFactionObj(defFaction)
+
+ if atkObjType == IPY_GameWorld.gotNPC:
+ factionScore += baseKillScore # 机器人没有个人分,所以击杀基础分直接算到阵营上
+
+ # 击杀积分王,阵营积分额外增加
+ if defObjType == IPY_GameWorld.gotPlayer:
+ for index, kingID in enumerate(defFactionObj.scoreKingIDList):
+ if kingID == defID:
+ killScoreKingScoreList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreKing", 3)
+ kingScore = killScoreKingScoreList[index] if index < len(killScoreKingScoreList) else 0
+ factionScore += kingScore
+ GameWorld.DebugLog(" 对方是积分王,阵营额外获得积分: index=%s,kingScore=%s" % (index, kingScore), fbPropertyID)
+
+ killScoreKingNotifyList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreKing", 4)
+ if index < len(killScoreKingNotifyList):
+ msgMark = killScoreKingNotifyList[index]
+ defMapID = GameWorld.GetMap().GetMapID()
+ defPosX = defObj.GetPosX()
+ defPosY = defObj.GetPosY()
+ PlayerControl.FBNotify(msgMark, [atkFaction, atkName, defFaction, defObj.GetPlayerName(), kingScore, defMapID, defPosX, defPosY])
+
+ # 玩家击败积分王
+ if atkObjType == IPY_GameWorld.gotPlayer and index == 0:
+ atkBattleObj.killScoreKing = 1
+ break
+ else:
+ pass
+
+ #factionScore += ... # 其他加分
+ atkFactionObj.addFactionScore(factionScore)
+ return
+
+def DoFB_NPCDead(curNPC):
+
+ gameFB = GameWorld.GetGameFB()
+ if gameFB.GetFBStep() != FB_Step_Fighting:
+ return
+
+ faction = NPCCommon.GetFaction(curNPC)
+ if not faction:
+ return
+ if curNPC.GetType() == ChConfig.ntRobot:
+ objID = curNPC.GetID()
+ factionObj = GetBattleFactionObj(faction)
+ if objID in factionObj.robotObjIDList:
+ factionObj.robotObjIDList.remove(objID)
+ GameWorld.DebugLog("机器人被击杀,阵营机器人ID移除: faction=%s,objID=%s,robotObjIDList=%s"
+ % (faction, objID, factionObj.robotObjIDList), GameWorld.GetGameWorld().GetPropertyID())
+ return
+
+def refreshCrossBattlefield(tick, checkVictory=True):
+ ## 刷新战场相关
+
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ # 定时占领资源积分奖励
+ awardScorePerSecond = IpyGameDataPY.GetFuncCfg("CrossBattlefieldCrystal", 3)
+ worldObj = GetBattleWorld()
+ for npcID, ownerFaction in worldObj.crystalFactionInfo.items():
+ lastAwardTick = worldObj.crystalAwardTick.get(npcID, tick)
+ awardSeconds = (tick - lastAwardTick) / 1000.0
+ awardFactionScore = int(awardScorePerSecond * round(awardSeconds))
+ worldObj.crystalAwardTick[npcID] = tick
+ if awardFactionScore <= 0:
+ continue
+ factionObj = GetBattleFactionObj(ownerFaction)
+ if factionObj.crystalScorePlusRate and tick <= factionObj.crystalScorePlusEndTick:
+ awardFactionScore = int(awardFactionScore * (1 + int(factionObj.crystalScorePlusRate / 10000.0)))
+ else:
+ factionObj.crystalScorePlusRate = 0
+ factionObj.crystalScorePlusEndTick = 0
+ GameWorld.DebugLog("定时资源积分: npcID=%s,ownerFaction=%s,awardSeconds=%s,awardFactionScore=%s"
+ % (npcID, ownerFaction, awardSeconds, awardFactionScore), fbPropertyID)
+ factionObj.addFactionScore(awardFactionScore, False)
+
+ # 参与玩家处理
scoreKingScoreMin = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreKing", 1)
scoreKingBuffIDList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldScoreKing", 2)
scoreKingCount = len(scoreKingBuffIDList)
+ factionSafeAreaRandPosList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldFB", 3) # 营地坐标
+ robotNPCIDList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldRobot", 1)
+ battleObjBaseCount = IpyGameDataPY.GetFuncCfg("CrossBattlefieldRobot", 2) # 阵营保底战斗人员数,在线+机器人
+
copyMapMgr = GameWorld.GetMapCopyPlayerManager()
+ copyPlayerCount = copyMapMgr.GetPlayerCount()
for faction in [ShareDefine.CampType_Justice, ShareDefine.CampType_Evil]:
factionObj = GetBattleFactionObj(faction)
+ # 机器人,有真实玩家时才处理刷出机器人
+ if copyPlayerCount and len(factionObj.onlinePlayerIDList) + len(factionObj.robotObjIDList) < battleObjBaseCount and faction <= len(robotNPCIDList):
+ robotNPCID = robotNPCIDList[faction - 1]
+ posInfo = getRandFactionRebornPos(faction)
+ if posInfo:
+ robotNPC = NPCCommon.SummonMapNpc(robotNPCID, posInfo[0], posInfo[1])
+ if robotNPC:
+ robotNPC.SetIsNeedProcess(True)
+ robotID = robotNPC.GetID()
+ if robotID not in factionObj.robotObjIDList:
+ factionObj.robotObjIDList.append(robotID)
+ GameWorld.DebugLog("新增阵营机器人: faction=%s,robotNPCID=%s,robotID=%s,posInfo=%s,robotObjIDList=%s"
+ % (faction, robotNPCID, robotID, posInfo, factionObj.robotObjIDList), fbPropertyID)
+
befKingIDList = factionObj.scoreKingIDList
factionObj.battlePlayerSortList = factionObj.factionPlayerDict.values()
factionObj.battlePlayerSortList.sort(key=operator.attrgetter("score", "scoreSortTime"), reverse=True)
+ safePosX, safePosY, safeRadius = factionSafeAreaRandPosList[faction - 1]
+
aftKingIDList = []
aftKingObjList = []
for batObj in factionObj.battlePlayerSortList:
- playerID = batObj.ID
+ playerID = batObj.playerID
curPlayer = copyMapMgr.FindPlayerByID(playerID)
if not curPlayer:
continue
+ # 累计参与战斗时长
if batObj.onlineCalcTick:
batObj.onlineTimes += max(0, tick - batObj.onlineCalcTick)
batObj.onlineCalcTick = tick
- if batObj.score < scoreKingScoreMin:
- continue
-
- if len(aftKingIDList) < scoreKingCount:
+ # 回营地
+ if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), safePosX, safePosY) <= safeRadius:
+ if playerID not in factionObj.homePlayerIDList:
+ factionObj.homePlayerIDList.append(playerID)
+
+ # 有资格的积分王列表
+ if batObj.score >= scoreKingScoreMin and len(aftKingIDList) < scoreKingCount:
aftKingIDList.append(playerID)
aftKingObjList.append([curPlayer, batObj])
if befKingIDList == aftKingIDList:
- #GameWorld.DebugLog(" 阵营积分王不变: faction=%s,befKingIDList=%s,aftKingIDList=%s" % (faction, befKingIDList, aftKingIDList))
+ #GameWorld.DebugLog(" 阵营积分王不变: faction=%s,befKingIDList=%s,aftKingIDList=%s" % (faction, befKingIDList, aftKingIDList), fbPropertyID)
continue
- GameWorld.DebugLog(" 阵营积分王变更: faction=%s,befKingIDList=%s,aftKingIDList=%s" % (faction, befKingIDList, aftKingIDList))
+ GameWorld.DebugLog(" 阵营积分王变更: faction=%s,befKingIDList=%s,aftKingIDList=%s" % (faction, befKingIDList, aftKingIDList), fbPropertyID)
# 更新buff
for index, objInfo in enumerate(aftKingObjList):
@@ -728,27 +1467,34 @@
if playerID in befKingIDList:
befIndex = befKingIDList.index(playerID)
if index == befIndex:
- GameWorld.DebugLog(" 积分王名次不变,不需要变更buff! index=%s" % index, playerID)
+ GameWorld.DebugLog(" 积分王名次不变,不需要变更buff! index=%s,playerID=%s" % (index, playerID), fbPropertyID)
continue
delBuffID = scoreKingBuffIDList[befIndex] if befIndex < len(scoreKingBuffIDList) else 0
if delBuffID:
- GameWorld.DebugLog(" 积分王名次变更! 删除旧buff! befIndex=%s,delBuffID=%s" % (befIndex, delBuffID), playerID)
+ GameWorld.DebugLog(" 积分王名次变更! 删除旧buff! befIndex=%s,delBuffID=%s,playerID=%s" % (befIndex, delBuffID, playerID), fbPropertyID)
BuffSkill.DelBuffBySkillID(curPlayer, delBuffID, tick)
if addBuffID:
- GameWorld.DebugLog(" 积分王名次变更! 添加新buff! index=%s,addBuffID=%s" % (index, addBuffID), playerID)
+ GameWorld.DebugLog(" 积分王名次变更! 添加新buff! index=%s,addBuffID=%s,playerID=%s" % (index, addBuffID, playerID), fbPropertyID)
SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, addBuffID, tick)
for befIndex, playerID in enumerate(befKingIDList):
if playerID in aftKingIDList:
continue
+ curPlayer = copyMapMgr.FindPlayerByID(playerID)
+ if not curPlayer:
+ continue
delBuffID = scoreKingBuffIDList[befIndex] if befIndex < len(scoreKingBuffIDList) else 0
if delBuffID:
- GameWorld.DebugLog(" 积分王被挤掉! 删除旧buff! befIndex=%s,delBuffID=%s" % (befIndex, delBuffID), playerID)
+ GameWorld.DebugLog(" 积分王被挤掉! 删除旧buff! befIndex=%s,delBuffID=%s,playerID=%s" % (befIndex, delBuffID, playerID), fbPropertyID)
BuffSkill.DelBuffBySkillID(curPlayer, delBuffID, tick)
factionObj.scoreKingIDList = aftKingIDList
-
+
+ if not checkVictory:
+ return
+
+ checkBattleOver(tick)
return
def DoOver(winnerFaction, tick):
@@ -757,7 +1503,8 @@
funcLineID = FBCommon.GetCrossDynamicLineMapFuncLineID()
GameWorld.Log("跨服战场结算! zoneID=%s,funcLineID=%s,winnerFaction=%s" % (zoneID, funcLineID, winnerFaction), fbPropertyID)
- FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshFactionPlayer) # 结算前强刷一次
+ refreshCrossBattlefield(tick, False) # 结算前强刷一次
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0)
#awardOnlineTimes = IpyGameDataPY.GetFuncCfg("CrossBattlefieldAward", 1) # 结算奖励需参与活动时长,秒钟
@@ -766,28 +1513,28 @@
leaveTime = GetBFStepTime()[Time_Leave] * 1000
copyMapMgr = GameWorld.GetMapCopyPlayerManager()
- superItemPlayerID = worldObj.superItemPlayerID
- superItemPlayerName = worldObj.superItemPlayerName
- # 没人中奖则随机给其中一位在线的玩家
- if not superItemPlayerID:
- onlinePlayerIDList = []
- for index in xrange(copyMapMgr.GetPlayerCount()):
- curPlayer = copyMapMgr.GetPlayerByIndex(index)
- playerID = curPlayer.GetPlayerID()
- if not playerID:
- continue
- onlinePlayerIDList.append(playerID)
- if onlinePlayerIDList:
- superItemPlayerID = random.choice(onlinePlayerIDList)
- superPlayerObj = GetBattlePlayerObj(superItemPlayerID)
- superItemPlayerName = superPlayerObj.name
- worldObj.superItemPlayerID = superItemPlayerID
- worldObj.superItemPlayerName = superItemPlayerName
- GameWorld.Log("没人中大奖,则随机其中一位在线玩家! superItemPlayerID=%s,onlinePlayerIDList=%s"
- % (superItemPlayerID, onlinePlayerIDList), fbPropertyID)
-
- GameWorld.Log("大奖获奖信息: superItemInfo=%s,superItemPlayerID=%s" % (worldObj.superItemInfo, superItemPlayerID), fbPropertyID)
-
+ superItemPlayerIDList = []
+ superWeight = []
+ for index in xrange(copyMapMgr.GetPlayerCount()):
+ curPlayer = copyMapMgr.GetPlayerByIndex(index)
+ playerID = curPlayer.GetPlayerID()
+ if not playerID:
+ continue
+ battleObj = GetBattlePlayerObj(playerID)
+ if not battleObj.superItemContribution:
+ continue
+ superWeight.append([battleObj.superItemContribution, playerID])
+ # 这是最终结算额外再开一次的大奖,仅限结算时在线的所有玩家
+ finalSuperItemPlayerName = ""
+ finalSuperItemPlayerID = GameWorld.GetResultByWeightList(superWeight, 0)
+ GameWorld.Log("最终结算额外随机大奖在线玩家! superItemInfo=%s,finalSuperItemPlayerID=%s,superWeight=%s"
+ % (worldObj.superItemInfo, finalSuperItemPlayerID, superWeight), fbPropertyID)
+ if finalSuperItemPlayerID:
+ superPlayerObj = GetBattlePlayerObj(finalSuperItemPlayerID)
+ superPlayerObj.superItemAwardCnt += 1
+ finalSuperItemPlayerName = superPlayerObj.name
+ superItemPlayerIDList.append(finalSuperItemPlayerID)
+
hmNum = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossBattlefield)
hmCallTeamInfo = PyGameData.g_crossBattlefieldCallTeamInfo.get(zoneID, {})
callTeamInfo = hmCallTeamInfo.get(hmNum, {})
@@ -800,10 +1547,13 @@
for faction in [ShareDefine.CampType_Justice, ShareDefine.CampType_Evil]:
factionObj = GetBattleFactionObj(faction)
factionScore = factionObj.score
- isWinner = (faction == winnerFaction)
+ isWinner = 1 if faction == winnerFaction else 0
scoreKingIDList = factionObj.scoreKingIDList
- GameWorld.Log("结算阵营! faction=%s,factionScore=%s,isWinner=%s,playerCount=%s,onlineFightPowerTotal=%s,onlinePlayerIDList=%s,scoreKingIDList=%s"
- % (faction, factionScore, isWinner, len(factionObj.battlePlayerSortList), factionObj.onlineFightPowerTotal, factionObj.onlinePlayerIDList, scoreKingIDList), fbPropertyID)
+ factionSuperItemPlayerID = factionObj.superItemPlayerID
+ GameWorld.Log("结算阵营! faction=%s,factionScore=%s,isWinner=%s,playerCount=%s,onlineFightPowerTotal=%s,onlinePlayerIDList=%s,scoreKingIDList=%s,factionSuperItemPlayerID=%s"
+ % (faction, factionScore, isWinner, len(factionObj.battlePlayerSortList), factionObj.onlineFightPowerTotal, factionObj.onlinePlayerIDList, scoreKingIDList, factionSuperItemPlayerID), fbPropertyID)
+ if factionSuperItemPlayerID:
+ superItemPlayerIDList.append(factionSuperItemPlayerID)
if isWinner and scoreKingIDList:
scoreKingID = scoreKingIDList[0]
scoreKingObj = GetBattlePlayerObj(scoreKingID)
@@ -813,9 +1563,9 @@
for battleObj in factionObj.battlePlayerSortList[:20]:
rankPlayerList.append({"Name":battleObj.name, "Job":battleObj.job, "Score":battleObj.score})
- overDict = {"rankPlayerList":rankPlayerList, "faction":faction, "superItemPlayerName":superItemPlayerName, "scoreKingName":scoreKingName}
+ overDict = {"rankPlayerList":rankPlayerList, "faction":faction, "superItemPlayerName":finalSuperItemPlayerName, "scoreKingName":scoreKingName}
for rank, battleObj in enumerate(factionObj.battlePlayerSortList, 1):
- playerID = battleObj.ID
+ playerID = battleObj.playerID
score = battleObj.score
job = battleObj.job
realmLV = battleObj.realmLV
@@ -824,6 +1574,7 @@
highScoreWeekTotal = battleObj.highScoreWeekTotal
enterCountWeek = battleObj.enterCountWeek
onlineTimes = battleObj.onlineTimes / 1000
+
GameWorld.Log(" rank=%s,playerID=%s,score=%s,fightPower=%s,onlineTimes=%s,accID=%s"
% (rank, playerID, score, battleObj.fightPower, onlineTimes, battleObj.accID), fbPropertyID)
@@ -832,8 +1583,18 @@
# GameWorld.Log(" 活动时长不足,不给奖励! faction=%s,playerID=%s,isWinner=%s" % (faction, playerID, isWinner), fbPropertyID)
# continue
- isCallEnter = 1 if playerID in allCallPlayerIDList else 0 # 是否召集进入的
- playerInfo = [faction, rank, playerID, job, realmLV, name, score, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter]
+ isCallOpen = 1 if playerID in worldObj.callOpenPlayerInfo else 0 # 是否召集进入的
+ isCalled = 1 if (playerID in allCallPlayerIDList and not isCallOpen) else 0 # 是否被召集的
+ killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \
+ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt = \
+ battleObj.killCount, battleObj.ckillCntInfo, battleObj.killBossCnt, battleObj.killScoreKing, battleObj.killGuardCnt, \
+ battleObj.auraScore, battleObj.superItemAwardCnt, battleObj.factionBuffCollCnt, battleObj.personBuffCollCnt, \
+ battleObj.crystalCollCnt, battleObj.wallCollCnt
+
+ playerInfo = [playerID, job, realmLV, name,
+ isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek,
+ isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt,
+ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt]
battlePlayerList.append(playerInfo)
player = copyMapMgr.FindPlayerByID(playerID)
@@ -849,28 +1610,391 @@
# 同步GameServer 比赛结果
superItemInfo = worldObj.superItemInfo
- msgInfo = str([fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, superItemPlayerID, superItemPlayerName, scoreKingID, scoreKingName, battlePlayerList])
+ msgInfo = str([fbPropertyID, zoneID, funcLineID, winnerFaction, superItemInfo, finalSuperItemPlayerID, finalSuperItemPlayerName, superItemPlayerIDList, scoreKingID, scoreKingName, battlePlayerList])
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CrossBattlefieldOver", msgInfo, len(msgInfo))
FBCommon.SetFBStep(FB_Step_LeaveTime, tick)
return
-## 执行副本杀怪逻辑
-def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
- #curNPC.SetDict(ChConfig.Def_NPC_Dict_Faction, 0)
+##是否可以夺旗
+def OnCanCollect(curPlayer, curNPC, tick):
+ gameFB = GameWorld.GetGameFB()
+ fbStep = gameFB.GetFBStep()
+
+ # 非战斗阶段不可采集
+ if fbStep != FB_Step_Fighting:
+ PlayerControl.NotifyCode(curPlayer, "NotFightStepCanNotCollect")
+ return False
+
+ npcID = curNPC.GetNPCID()
+ GameWorld.DebugLog("OnCanCollect npcID=%s" % npcID, curPlayer.GetPlayerID())
+ if npcID in GetCrystalNPCIDList():
+ # 已获得战旗的战盟不可采集
+ worldObj = GetBattleWorld()
+ ownerFaction = worldObj.crystalFactionInfo.get(npcID)
+ faction = curPlayer.GetFaction()
+ if ownerFaction == faction:
+ PlayerControl.NotifyCode(curPlayer, "CrossBattlefieldCollectOwnerLimit")
+ return False
+
+ # 积分墙
+ elif npcID == IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreWall", 1):
+ worldObj = GetBattleWorld()
+ collectCD = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreWall", 2) * 1000
+ passTick = tick - worldObj.lastWallCollOKTick
+ #GameWorld.DebugLog("lastWallCollOKTick=%s,tick=%s,passTick=%s,collectCD=%s" % (worldObj.lastWallCollOKTick, tick, passTick, collectCD))
+ if passTick <= collectCD:
+ waitSeconds = int(math.ceil((collectCD - passTick) / 1000.0))
+ PlayerControl.NotifyCode(curPlayer, "CrossBattlefieldWallTimeLimit", [waitSeconds])
+ return False
+
+ return True
+
+##玩家收集成功(塔, 旗)
+def OnCollectOK(curPlayer, npcID, tick):
+ GameWorld.DebugLog("OnCollectOK npcID=%s" % npcID, curPlayer.GetPlayerID())
+ tagObj = curPlayer.GetActionObj()
+ if not tagObj:
+ return
+ if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC:
+ return
+
+ curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex())
+ AICommon.ClearPlayerPreparing(curNPC, curPlayer)
+ npcID = curNPC.GetNPCID()
+
+ # 水晶
+ if npcID in GetCrystalNPCIDList():
+ __OnCollectOK_Crystal(curPlayer, curNPC, tick)
+
+ # 个人buff
+ elif npcID in GetPersonBuffIDList():
+ __OnCollectOK_PersonBuff(curPlayer, curNPC, tick)
+
+ # 阵营buff
+ elif npcID in GetFactionBuffIDList():
+ __OnCollectOK_FactionBuff(curPlayer, curNPC, tick)
+
+ # 积分墙
+ elif npcID == IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreWall", 1):
+ __OnCollectOK_EventWall(curPlayer, curNPC, tick)
+
+ return
+
+def __OnCollectOK_Crystal(curPlayer, curNPC, tick):
+ ## 采集水晶资源建筑
+ objID = curNPC.GetID()
+ npcID = curNPC.GetNPCID()
+ playerID = curPlayer.GetPlayerID()
+ battleObj = GetBattlePlayerObj(playerID)
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ if not battleObj:
+ return
+ faction = battleObj.faction
+ worldObj = GetBattleWorld()
+ lastOwnerFaction = worldObj.crystalFactionInfo.get(npcID)
+
+ if lastOwnerFaction == faction:
+ return
+ # 更新归属信息
+ worldObj.crystalFactionInfo[npcID] = faction
+ worldObj.crystalAwardTick[npcID] = tick
+
+ battleObj.crystalCollCnt += 1
+ GameWorld.Log("玩家占领水晶: objID=%s,npcID=%s,lastOwnerFaction=%s,playerID=%s,faction=%s"
+ % (objID, npcID, lastOwnerFaction, playerID, faction), fbPropertyID)
+ addScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldCrystal", 2)
+ battleObj.addPlayerScore(curPlayer, addScore, ScoreType_CollectCrystal)
+
+ # 占领广播给自己阵营、对方阵营 不同内容
+ PlayerControl.FBFactionNotify(curPlayer.GetFaction(), "CrossBattlefieldOccupiedSelf", [battleObj.name],
+ "CrossBattlefieldOccupiedOther", [battleObj.name])
+
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ return
+
+def __OnCollectOK_PersonBuff(curPlayer, curNPC, tick):
+ npcID = curNPC.GetNPCID()
+ worldObj = GetBattleWorld()
+ if worldObj.personBuffCount > 0:
+ worldObj.personBuffCount = worldObj.personBuffCount - 1
+ if not worldObj.personBuffCalcTick:
+ worldObj.personBuffCalcTick = tick
+
+ # 增加buff效果
+ addSkill = curNPC.GetSkillManager().GetSkillByIndex(0)
+ addSkillID = addSkill.GetSkillID() if addSkill else 0
+
+ playerID = curPlayer.GetPlayerID()
+ GameWorld.DebugLog("采集个人buff: npcID=%s,addSkillID=%s,personBuffCount=%s"
+ % (npcID, addSkillID, worldObj.personBuffCount), playerID)
+ battleObj = GetBattlePlayerObj(playerID)
+ battleObj.personBuffCollCnt += 1
+
+ if addSkill:
+ SkillShell.__DoLogic_AddBuff(curPlayer, curPlayer, addSkill, False, tick, addForce=True)
+
+ # 攻击翻x倍 30908107
+ # 击杀玩家积分翻x倍 30908108
+ # 无敌 30908109
+ if npcID == 30908108:
+ buffSkill = GameWorld.GetGameData().GetSkillBySkillID(addSkillID)
+ if buffSkill:
+ buffTime = buffSkill.GetLastTime()
+ battleObj.killPlayerAddScoreTimes = buffSkill.GetEffect(0).GetEffectValue(0)
+ battleObj.killPlayerScoreAwardEndTick = tick + buffTime
+ GameWorld.DebugLog("获得击杀玩家多倍积分福利: killPlayerAddScoreTimes=%s,buffTime=%s"
+ % (battleObj.killPlayerAddScoreTimes, buffTime), playerID)
+
+ NPCCommon.SetDeadEx(curNPC)
+ return
+
+def __OnCollectOK_FactionBuff(curPlayer, curNPC, tick):
+ npcID = curNPC.GetNPCID()
+ worldObj = GetBattleWorld()
+ if worldObj.factionBuffNPCInfo and npcID == worldObj.factionBuffNPCInfo[0]:
+ worldObj.factionBuffNPCInfo = []
+ worldObj.factionBuffCalcTick = tick
+
+ # 增加buff效果
+ addSkill = curNPC.GetSkillManager().GetSkillByIndex(0)
+ addSkillID = addSkill.GetSkillID() if addSkill else 0
+ if not addSkillID:
+ return
+ buffSkill = GameWorld.GetGameData().GetSkillBySkillID(addSkillID)
+ if not buffSkill:
+ return
+
+ playerID = curPlayer.GetPlayerID()
+
+ addScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldFactionBuff", 4)
+ battleObj = GetBattlePlayerObj(playerID)
+ battleObj.factionBuffCollCnt += 1
+ battleObj.addPlayerScore(curPlayer, addScore, ScoreType_CollectFactionBuff)
+
+ faction = battleObj.faction
+ tagFaction = ShareDefine.CampType_Justice if faction == ShareDefine.CampType_Evil else ShareDefine.CampType_Evil
+
+ # 黑夜降临: 敌对玩家每x秒掉血y%,持续xx秒 30908110
+ # 天道威压: 敌对玩家攻击降低x%,持续xx秒 30908111
+ # 普度众生: 我方建筑获取资源速度提升x%,持续xx秒 30908112
+ # 洞天福地: 我方玩家每x秒回血y%,持续xx秒 30908113
+
+ gainBuffFaction = faction # 获得buff的阵营
+ if npcID in [30908110, 30908111]:
+ gainBuffFaction = tagFaction
+
+ GameWorld.DebugLog("采集阵营buff: npcID=%s,addSkillID=%s,faction=%s,tagFaction=%s,gainBuffFaction=%s"
+ % (npcID, addSkillID, faction, tagFaction, gainBuffFaction), playerID)
+
+ paramList = [faction, battleObj.name, npcID, gainBuffFaction]
+ PlayerControl.FBNotify("CrossBattlefieldBuffOK_%s" % npcID, paramList)
+
+ gainBuffFactionObj = GetBattleFactionObj(gainBuffFaction)
+
+ doAddFactionPlayerBuff(curPlayer, gainBuffFactionObj, buffSkill, tick)
+
+ buffTime = buffSkill.GetLastTime()
+ endTime = int(time.time()) + int(buffTime / 1000)
+ gainBuffFactionObj.factionBuffInfo = [addSkillID, endTime]
+
+ if npcID == 30908112:
+ gainBuffFactionObj.crystalScorePlusRate = buffSkill.GetEffect(0).GetEffectValue(0)
+ gainBuffFactionObj.crystalScorePlusEndTick = tick + buffTime
+
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ NPCCommon.SetDeadEx(curNPC)
+ return
+
+def doAddFactionPlayerBuff(curPlayer, factionObj, buffSkill, tick):
+ ## 给某个阵营在线玩家添加buff
+ copyMapMgr = GameWorld.GetMapCopyPlayerManager()
+ for playerID in factionObj.onlinePlayerIDList:
+ player = copyMapMgr.FindPlayerByID(playerID)
+ if not player:
+ continue
+ SkillShell.__DoLogic_AddBuff(curPlayer, player, buffSkill, False, tick, addForce=True)
+ return
+
+def __OnCollectOK_EventWall(curPlayer, curNPC, tick):
+ ## 采集积分墙
+ npcID = curNPC.GetNPCID()
+ ChNPC.OnCollectEnd(curPlayer, curNPC)
+ worldObj = GetBattleWorld()
+ worldObj.lastWallCollOKTick = tick
+ worldObj.eventNPCHP = GameObj.GetHP(curNPC)
+
+ playerID = curPlayer.GetPlayerID()
+ faction = curPlayer.GetFaction()
+
+ battleObj = GetBattlePlayerObj(playerID)
+ battleObj.wallCollCnt += 1
+
+ factionObj = GetBattleFactionObj(faction)
+ addValue = IpyGameDataPY.GetFuncCfg("CrossBattlefieldScoreWall", 3)
+ GameWorld.Log("玩家采集积分墙: npcID=%s,faction=%s,eventNPCHP=%s,tick=%s" % (npcID, faction, worldObj.eventNPCHP, tick), playerID)
+ factionObj.addFactionScore(addValue)
+ PlayerControl.FBNotify("CrossBattlefieldWallCollectOK", [faction, curPlayer.GetPlayerName(), npcID, addValue])
+ if worldObj.eventNPCHP <= 0:
+ worldObj.setEventEnd(tick)
+ else:
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ return
+
+def DoFBOnNPCKill_Player(curNPC, curPlayer, tick):
+ ## 执行副本NPC击杀玩家
+
+ npcID = curNPC.GetNPCID()
npcFaction = NPCCommon.GetFaction(curNPC)
if npcFaction:
- __OnPlayerKillOtherFactionRobot(curPlayer, npcFaction, tick)
+ if npcID in GetGuardNPCIDList():
+ __OnGuardKillOtherPlayer(curNPC, curPlayer, tick)
+ elif npcID in GetRobotNPCIDList():
+ onBattleObjKillOtherBattleObj(curNPC, curPlayer, tick)
+
else:
- __OnPlayerKillNeutralNPC(curPlayer, curNPC, tick)
+ pass
+
return
-def __OnPlayerKillOtherFactionRobot(curPlayer, npcFaction, tick):
- ## 玩家击杀其他阵营机器人玩家
+def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
+ ## 执行副本杀怪逻辑
+ npcID = curNPC.GetNPCID()
+ npcFaction = NPCCommon.GetFaction(curNPC)
+ GameWorld.DebugLog("DoFB_Player_KillNPC %s kill %s" % (curPlayer.GetID(), npcID))
+ if npcFaction:
+ if npcID in GetGuardNPCIDList():
+ __OnPlayerKillOtherFactionGurad(curPlayer, curNPC, tick)
+ elif npcID in GetRobotNPCIDList():
+ onBattleObjKillOtherBattleObj(curPlayer, curNPC, tick)
+
+ # boss
+ elif npcID == IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 1):
+ __OnPlayerKillEventBoss(curPlayer, curNPC, tick)
+
return
-def __OnPlayerKillNeutralNPC(curPlayer, curNPC, tick):
- ## 玩家击杀中立怪物
+def DoFB_Npc_KillNPC(attacker, curNPC, tick):
+ if attacker.GetType() == ChConfig.ntRobot and curNPC.GetType() == ChConfig.ntRobot:
+ onBattleObjKillOtherBattleObj(attacker, curNPC, tick)
+ return
+
+def __OnPlayerKillOtherFactionGurad(curPlayer, curNPC, tick):
+ ## 玩家击杀其他阵营守卫
+ playerID = curPlayer.GetPlayerID()
+ guardFaction = NPCCommon.GetFaction(curNPC)
+ tagFaction = curPlayer.GetFaction()
+ if guardFaction == tagFaction:
+ return
+
+ battleObj = GetBattlePlayerObj(playerID)
+ battleObj.killGuardCnt += 1
+ PlayerControl.FBFactionNotify(curPlayer.GetFaction(), "CrossBattlefieldKillGuardSelf", [battleObj.name],
+ "CrossBattlefieldKillGuardOther", [battleObj.name])
+
+ factionObj = GetBattleFactionObj(battleObj.faction)
+ killGuardScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldGuard", 3)
+ factionObj.addFactionScore(killGuardScore)
+ return
+
+def __OnGuardKillOtherPlayer(curNPC, tagPlayer, tick):
+ ## 守卫击杀玩家
+
+ npcID = curNPC.GetNPCID()
+ guardFaction = NPCCommon.GetFaction(curNPC)
+ tagFaction = tagPlayer.GetFaction()
+ tagPlayerID = tagPlayer.GetPlayerID()
+ ownerPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID)
+ if not ownerPlayerID or guardFaction == tagFaction:
+ return
+
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ copyMapMgr = GameWorld.GetMapCopyPlayerManager()
+ ownerPlayer = copyMapMgr.FindPlayerByID(ownerPlayerID)
+
+ guardKillPlayerScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldGuard", 4)
+ GameWorld.DebugLog("守卫击杀玩家: npcID=%s,guardFaction=%s,ownerPlayerID=%s,tagPlayerID=%s"
+ % (npcID, guardFaction, ownerPlayerID, tagPlayerID), fbPropertyID)
+ battleObj = GetBattlePlayerObj(ownerPlayerID)
+ battleObj.addKillCount(1)
+ battleObj.addPlayerScore(ownerPlayer, guardKillPlayerScore, ScoreType_GuardKillPlayer)
+ return
+
+def __OnPlayerKillEventBoss(curPlayer, curNPC, tick):
+ ## 玩家击杀事件Boss
+
+ npcID = curNPC.GetNPCID()
+ killerPlayerID = curPlayer.GetPlayerID()
+ killerFaction = curPlayer.GetFaction()
+ fbPropertyID = GameWorld.GetGameWorld().GetPropertyID()
+ jFactionObj = GetBattleFactionObj(ShareDefine.CampType_Justice)
+ eFactionObj = GetBattleFactionObj(ShareDefine.CampType_Evil)
+ GameWorld.Log("击杀天道之眼Boss: npcID=%s,killerPlayerID=%s,killerFaction=%s"
+ % (npcID, killerPlayerID, killerFaction), fbPropertyID)
+ GameWorld.Log(" faction=%s,hurtBossValue=%s" % (jFactionObj.faction, jFactionObj.hurtBossValue), fbPropertyID)
+ GameWorld.Log(" faction=%s,hurtBossValue=%s" % (eFactionObj.faction, eFactionObj.hurtBossValue), fbPropertyID)
+ ownerFaction = None
+ if jFactionObj.hurtBossValue > eFactionObj.hurtBossValue:
+ ownerFaction = jFactionObj
+ elif jFactionObj.hurtBossValue < eFactionObj.hurtBossValue:
+ ownerFaction = eFactionObj
+ else:
+ # 伤害相同时,归属最后一击玩家所属阵营
+ ownerFaction = jFactionObj if killerFaction == jFactionObj.faction else eFactionObj
+ ownerFaction.hurtBossValue += 100 # 随机归属方额外增加伤害
+ GameWorld.Log(" 伤害相同,归属最后一击玩家阵营! ", fbPropertyID)
+ GameWorld.Log(" Boss归属阵营: faction=%s" % ownerFaction.faction, fbPropertyID)
+ ownerFactionScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 3)
+ ownerFaction.addFactionScore(ownerFactionScore, False)
+
+ hurtPlayerScore = IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 2)
+ for factionObj in [jFactionObj, eFactionObj]:
+ for playerID in factionObj.hurtBossPlayerDict.keys():
+ battleObj = GetBattlePlayerObj(playerID)
+ if factionObj.faction == ownerFaction.faction:
+ battleObj.killBossCnt += 1
+ battleObj.addPlayerScore(curPlayer, hurtPlayerScore, ScoreType_HurtBoss, isCheckVictory=False)
+
+ PlayerControl.FBNotify("CrossBattlefieldBossKilled", [npcID, ownerFaction.faction, ownerFactionScore, hurtPlayerScore])
+
+ worldObj = GetBattleWorld()
+ worldObj.setEventEnd(tick)
+ if not checkBattleOver(tick):
+ FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0, refreshCrossBattlefield)
+ return
+
+def GetFBPlayerHurtNPCMultiValue(curPlayer, curNPC):
+ ## 玩家对NPC造成伤害倍值,默认1
+
+ npcID = curNPC.GetNPCID()
+ playerID = curPlayer.GetPlayerID()
+ worldObj = GetBattleWorld()
+
+ # 召集开启的玩家 对 Boss的伤害倍值
+ if playerID in worldObj.callOpenPlayerInfo and npcID == IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 1):
+ return IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 4)
+
+ return 1
+
+def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP):
+ ## 玩家对NPC造成伤害
+
+ npcID = curNPC.GetNPCID()
+ playerID = curPlayer.GetPlayerID()
+
+ # Boss
+ if npcID == IpyGameDataPY.GetFuncCfg("CrossBattlefieldBoss", 1):
+ worldObj = GetBattleWorld()
+ worldObj.eventNPCHP = GameObj.GetHP(curNPC)
+
+ faction = curPlayer.GetFaction()
+ factionObj = GetBattleFactionObj(faction)
+
+ # 累加伤害
+ factionObj.hurtBossValue = factionObj.hurtBossValue + hurtHP
+ factionObj.hurtBossPlayerDict[playerID] = factionObj.hurtBossPlayerDict.get(playerID, 0) + hurtHP
+ GameWorld.DebugLog("玩家攻击boss: faction=%s,hurtHP=%s,factionHurtBossValue=%s,playerHurtBossValue=%s,npcHP=%s"
+ % (faction, hurtHP, factionObj.hurtBossValue, factionObj.hurtBossPlayerDict[playerID], GameObj.GetHP(curNPC)), playerID)
return
## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
@@ -878,13 +2002,40 @@
gameFB = GameWorld.GetGameFB()
if gameFB.GetFBStep() != FB_Step_Fighting:
return False
+
+ atkObjType = attacker.GetGameObjType()
+ defObjType = defender.GetGameObjType()
+ if atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotNPC:
+ if NPCCommon.GetFaction(attacker) == NPCCommon.GetFaction(defender):
+ return False
+ if attacker.GetType() == ChConfig.ntRobot and defender.GetType() == ChConfig.ntRobot:
+ #GameWorld.DebugLog("本副本机器人NPC可以互相攻击: atkNPCID=%s(%s),defNPCID=%s(%s)" % (attacker.GetNPCID(), attacker.GetName(), defender.GetNPCID(), defender.GetName()))
+ return True
+ #GameWorld.DebugLog("本副本NPC不能互相攻击: atkNPCID=%s(%s),defNPCID=%s(%s)" % (attacker.GetNPCID(), attacker.GetName(), defender.GetNPCID(), defender.GetName()))
+ return False
+
return True
+
+def GetFBRobotCanAtkObjTypeIDList(curNPC):
+ ## 获取副本中机器人可能可攻击的实例类型ID列表
+ ## @return: [[objType, objID], ...]
+ faction = NPCCommon.GetFaction(curNPC)
+ if not faction:
+ return []
+
+ defFaction = ShareDefine.CampType_Justice if faction == ShareDefine.CampType_Evil else ShareDefine.CampType_Evil
+ objTypeIDList = []
+ defFactionObj = GetBattleFactionObj(defFaction)
+ for playerID in defFactionObj.onlinePlayerIDList:
+ objTypeIDList.append([IPY_GameWorld.gotPlayer, playerID])
+
+ for robotID in defFactionObj.robotObjIDList:
+ objTypeIDList.append([IPY_GameWorld.gotNPC, robotID])
+
+ random.shuffle(objTypeIDList) # 打乱顺序
+ return objTypeIDList
+
## 玩家攻击玩家是否有惩罚
def DoFBAttackHasPunish(atkPlayer, defPlayer):
return False
-
-## 是否副本复活
-def OnPlayerReborn():
- return True
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index c6d5c7e..066fd08 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -374,6 +374,12 @@
("DWORD", "IceLodeFightPower", 0),
),
+ "SpecMapPlayerAttrFormat":(
+ ("DWORD", "DataMapID", 1),
+ ("char", "AttrName", 0),
+ ("char", "AttrValueFormat", 0),
+ ),
+
"GMAttr":(
("DWORD", "GMAttrID", 1),
("BYTE", "IsValid", 0),
@@ -2669,6 +2675,19 @@
def GetAttackEff(self): return self.AttackEff # 挂机效率
def GetReFightPower(self): return self.ReFightPower # 战斗力
def GetIceLodeFightPower(self): return self.IceLodeFightPower # 冰晶矿脉扫荡战斗力
+
+# 特殊地图玩家属性公式表
+class IPY_SpecMapPlayerAttrFormat():
+
+ def __init__(self):
+ self.DataMapID = 0
+ self.AttrName = ""
+ self.AttrValueFormat = ""
+ return
+
+ def GetDataMapID(self): return self.DataMapID # 数据地图ID
+ def GetAttrName(self): return self.AttrName # 属性名
+ def GetAttrValueFormat(self): return self.AttrValueFormat # 最终属性值公式(可用参数属性名)
# GM测试属性表
class IPY_GMAttr():
@@ -6080,6 +6099,8 @@
self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache)
self.ipyPlayerLVCache = self.__LoadFileData("PlayerLV", IPY_PlayerLV)
self.ipyPlayerLVLen = len(self.ipyPlayerLVCache)
+ self.ipySpecMapPlayerAttrFormatCache = self.__LoadFileData("SpecMapPlayerAttrFormat", IPY_SpecMapPlayerAttrFormat)
+ self.ipySpecMapPlayerAttrFormatLen = len(self.ipySpecMapPlayerAttrFormatCache)
self.ipyGMAttrCache = self.__LoadFileData("GMAttr", IPY_GMAttr)
self.ipyGMAttrLen = len(self.ipyGMAttrCache)
self.ipyNPCExCache = self.__LoadFileData("NPCEx", IPY_NPCEx)
@@ -6644,6 +6665,8 @@
def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index]
def GetPlayerLVCount(self): return self.ipyPlayerLVLen
def GetPlayerLVByIndex(self, index): return self.ipyPlayerLVCache[index]
+ def GetSpecMapPlayerAttrFormatCount(self): return self.ipySpecMapPlayerAttrFormatLen
+ def GetSpecMapPlayerAttrFormatByIndex(self, index): return self.ipySpecMapPlayerAttrFormatCache[index]
def GetGMAttrCount(self): return self.ipyGMAttrLen
def GetGMAttrByIndex(self, index): return self.ipyGMAttrCache[index]
def GetNPCExCount(self): return self.ipyNPCExLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Map/GameMap.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Map/GameMap.py
index 5168672..1ff81a7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Map/GameMap.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Map/GameMap.py
@@ -21,13 +21,16 @@
# @change: "2012-05-22 11:00" jiang 增加函数GetAreaTypeByMapPos()获取某一点所在的区域类型
# @change: "2015-09-23 14:30" hxp 增加函数GetEmptyPlaceInAreaEx获取某点指定范围区域内的随机点
#---------------------------------------------------------------------
-"""Version = 2015-09-23 14:30"""
+#"""Version = 2015-09-23 14:30"""
#---------------------------------------------------------------------
import GameWorld
import random
import ChConfig
import AttackCommon
import IPY_GameWorld
+import FormulaControl
+import IpyGameDataPY
+import GameObj
#---------------------------------------------------------------------
#########################################################
#Python的pos定义
@@ -302,4 +305,62 @@
effectID = curPosObj.GetEffectID(index)
if effectID == findEffectID:
return True
- return False
\ No newline at end of file
+ return False
+
+def SpecialMapSetAttrValueByFormat(curPlayer):
+ import FBCommon
+ import PlayerControl
+ dataMapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
+ ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("SpecMapPlayerAttrFormat", dataMapID)
+ if not ipyDataList:
+ return
+
+ playerID = curPlayer.GetPlayerID()
+ GameWorld.DebugLog("特殊地图设置属性: dataMapID=%s" % dataMapID, playerID)
+
+ for ipyData in ipyDataList:
+ attrName = ipyData.GetAttrName()
+ attrValueFormat = ipyData.GetAttrValueFormat()
+
+ attrOwner = ""
+ # GameObj 的 Get、Set函数
+ getFuncName = "Get%s" % attrName
+ setFuncName = "Set%s" % attrName
+ if hasattr(GameObj, getFuncName) and hasattr(GameObj, setFuncName):
+ getFunc = getattr(GameObj, getFuncName)
+ setFunc = getattr(GameObj, setFuncName)
+ value = getFunc(curPlayer)
+ attrOwner = "GameObj"
+
+ # PlayerControl 的 Get、Set函数
+ elif hasattr(PlayerControl, getFuncName) and hasattr(PlayerControl, setFuncName):
+ getFunc = getattr(PlayerControl, getFuncName)
+ setFunc = getattr(PlayerControl, setFuncName)
+ value = getFunc(curPlayer)
+ attrOwner = "PlayerControl"
+
+ # curPlayer 的 Get、Set函数
+ elif hasattr(curPlayer, getFuncName) and hasattr(curPlayer, setFuncName):
+ getFunc = getattr(curPlayer, getFuncName)
+ setFunc = getattr(curPlayer, setFuncName)
+ value = getFunc()
+ attrOwner = "curPlayer"
+
+ else:
+ GameWorld.ErrLog("特殊地图设置属性异常,不存在该属性! dataMapID=%s,attrName=%s" % (dataMapID, attrName), playerID)
+ continue
+
+ if attrValueFormat.isdigit():
+ setValue = int(attrValueFormat)
+ else:
+ setValue = eval(FormulaControl.GetCompileFormula("SpecMapAttr_%s_%s" % (dataMapID, attrName), attrValueFormat))
+
+ if attrOwner == "curPlayer":
+ setFunc(setValue)
+ else:
+ setFunc(curPlayer, setValue)
+
+ GameWorld.DebugLog(" attrName=%s,value=%s,setValue=%s,%s" % (attrName, value, setValue, attrOwner), playerID)
+
+ return
+
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_22.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_22.py
new file mode 100644
index 0000000..8d77c35
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AIType_22.py
@@ -0,0 +1,210 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package NPCAI.AIType_22
+#
+# @todo:副本活动机器人
+# @author hxp
+# @date 2022-02-21
+# @version 1.0
+#
+# 详细描述: 副本活动机器人,默认自动寻找可攻击的目标,没有可攻击目标时,随机移动
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2022-02-21 20:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import AICommon
+import NPCCommon
+import BaseAttack
+import IPY_GameWorld
+import AttackCommon
+import GameWorld
+import GameObj
+import GameMap
+import FBLogic
+
+import random
+#---------------------------------------------------------------------
+
+Key_TagObjType = "TagObjType"
+Key_TagObjID = "TagObjID"
+
+#---------------------------------------------------------------------
+## 初始化
+# @param curNPC 当前npc
+# @return None
+# @remarks 函数详细说明.
+def DoInit(curNPC):
+ curNPC.GetNPCAngry().Init(ChConfig.Def_SuperFBBossAngryCount)
+ return
+
+def OnNPCReborn(curNPC):
+ curNPC.SetIsNeedProcess(True)
+ return
+
+## 执行AI
+# @param curNPC 当前npc
+# @param tick 当前时间
+# @return None
+# @remarks 函数详细说明.
+def ProcessAI(curNPC, tick):
+ npcControl = NPCCommon.NPCControl(curNPC)
+ if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie or not curNPC.IsAlive():
+ return
+
+ #刷新自己的buff
+ npcControl.RefreshBuffState(tick)
+ if GameObj.GetHP(curNPC) == 0:
+ # BUFF刷新中可能会导致NPC死亡
+ return
+
+ #刷新自己仇恨度列表
+ npcControl.RefreshAngryList(tick)
+ curNPCAngry = npcControl.GetMaxAngryTag()
+
+ tagObjType, tagObjID = 0, 0
+ if curNPCAngry:
+ tagObjType = curNPCAngry.GetObjType()
+ tagObjID = curNPCAngry.GetObjID()
+ else:
+ tagObj = getRandAtkObj(curNPC, tick)
+ if tagObj:
+ tagObjType = tagObj.GetGameObjType()
+ tagObjID = tagObj.GetID()
+
+ curNPC.SetDict(Key_TagObjType, tagObjType)
+ curNPC.SetDict(Key_TagObjID, tagObjID)
+
+ if tagObjType and tagObjID:
+ robotFight(curNPC, tagObjID, tagObjType, tick)
+ else:
+ randomMove(curNPC, tick)
+
+ return
+
+def randomMove(curNPC, tick):
+ ## 随机移动
+ if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
+ return
+
+ randPos = FBLogic.GetFBRobotRandomMovePos(curNPC)
+ if randPos:
+ tagPosX, tagPosY = randPos
+ else:
+ tagPos = GameMap.GetEmptyPlaceInArea(curNPC.GetPosX(), curNPC.GetPosY(), 10)
+ tagPosX, tagPosY = tagPos.GetPosX(), tagPos.GetPosY()
+
+ #GameWorld.DebugLog("机器人随机移动到目标点: objID=%s,npcID=%s,tagPosX=%s,tagPosY=%s"
+ # % (curNPC.GetID(), curNPC.GetNPCID(), tagPosX, tagPosY), GameWorld.GetGameWorld().GetPropertyID())
+ curNPC.Move(tagPosX, tagPosY)
+ return
+
+def getRandAtkObj(curNPC, tick):
+ ## 获取地图中一个可攻击的随机目标玩家
+
+ tagObjType = curNPC.GetDictByKey(Key_TagObjType)
+ tagObjID = curNPC.GetDictByKey(Key_TagObjID)
+
+ if tagObjType and tagObjID:
+ tagObj = GameWorld.GetObj(tagObjID, tagObjType)
+ if tagObj and not AttackCommon.GetIsDead(tagObj) and GameObj.GetHP(tagObj) > 0 and checkCanAtkTag(curNPC, tagObj, tick):
+ return tagObj
+ #GameWorld.DebugLog("机器人追踪指定目标无效了: objID=%s,npcID=%s,tagObjType=%s,tagObjID=%s,canAtk=%s"
+ # % (curNPC.GetID(), curNPC.GetNPCID(), tagObjType, tagObjID, checkCanAtkTag(curNPC, tagObj, tick)),
+ # GameWorld.GetGameWorld().GetPropertyID())
+
+ # 如果副本已有特殊指定
+ canAtkObjTypeIDList = FBLogic.GetFBRobotCanAtkObjTypeIDList(curNPC)
+ #GameWorld.DebugLog("机器人副本指定可追踪目标: objID=%s,npcID=%s,canAtkObjTypeIDList=%s"
+ # % (curNPC.GetID(), curNPC.GetNPCID(), canAtkObjTypeIDList),
+ # GameWorld.GetGameWorld().GetPropertyID())
+ for objType, objID in canAtkObjTypeIDList:
+ tagObj = GameWorld.GetObj(objID, objType)
+ if not tagObj:
+ continue
+ if checkCanAtkTag(curNPC, tagObj, tick):
+ return tagObj
+
+ # 没有的话随机遍历副本中在线玩家
+ copyMapMgr = GameWorld.GetMapCopyPlayerManager()
+ randIndexList = range(copyMapMgr.GetPlayerCount())
+ random.shuffle(randIndexList)
+ for index in randIndexList:
+ tagPlayer = copyMapMgr.GetPlayerByIndex(index)
+ if not tagPlayer:
+ continue
+ if checkCanAtkTag(curNPC, tagPlayer, tick):
+ return tagPlayer
+
+ # 及NPC...待扩展
+ return
+
+def checkCanAtkTag(curNPC, tagObj, tick):
+ if not AttackCommon.CheckCanAttackTag(curNPC, tagObj):
+ return
+ relation = BaseAttack.GetTagRelation(curNPC, tagObj, None, tick)[0]
+ if relation != ChConfig.Type_Relation_Enemy:
+ return
+ return True
+
+
+def robotFight(curNPC, tagID, tagType, tick):
+
+ curTag = GameWorld.GetObj(tagID, tagType)
+ if curTag == None or GameObj.GetHP(curTag) <= 0:
+ return
+
+ tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
+ if tagDist > curNPC.GetAtkDist():
+ moveToTag(curNPC, curTag)
+ return
+
+ npcControl = NPCCommon.NPCControl(curNPC)
+ if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
+ curNPC.StopMove()
+
+ if npcControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):
+ #修正这个NPC的站立位置
+ return
+
+ NPCCommon.SetNPCInBattleState(curNPC)
+ #---优先释放技能---
+ if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick):
+ return
+
+ #---释放普通攻击---
+ if tick - curNPC.GetAttackTick() >= curNPC.GetAtkInterval():
+ BaseAttack.Attack(curNPC, curTag, None, tick)
+
+ return
+
+def moveToTag(curNPC, tagObj):
+ tagPosX, tagPosY = tagObj.GetPosX(), tagObj.GetPosY()
+
+ destDist = GameWorld.GetDist(curNPC.GetDestPosX(), curNPC.GetDestPosY(), tagObj.GetPosX(), tagObj.GetPosY())
+ if destDist <= curNPC.GetAtkDist() and curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:
+ # 目标在移动的攻击范围内,不改变目标点
+ #GameWorld.DebugLog("机器人追踪指定目标在移动的攻击范围内,不改变目标点: objID=%s,npcID=%s,tagID=%s,tagPosX=(%s,%s),destPos=(%s,%s)"
+ # % (objID, npcID, tagID, tagPosX, tagPosY, curNPC.GetDestPosX(), curNPC.GetDestPosY()), propertyID)
+ return
+
+ movePos = GameMap.GetEmptyPlaceInArea(tagPosX, tagPosY, 3)
+ movePosX, movePosY = movePos.GetPosX(), movePos.GetPosY()
+ curNPC.Move(movePosX, movePosY)
+ #GameWorld.DebugLog("机器人追踪指定目标: objID=%s,npcID=%s,tagID=%s,tagPosX=(%s,%s),movePos=(%s,%s)"
+ # % (curNPC.GetID(), curNPC.GetNPCID(), tagObj.GetID(), tagPosX, tagPosY, movePosX, movePosY),
+ # GameWorld.GetGameWorld().GetPropertyID())
+ return
+
+### NPC死亡
+## @param curNPC 当前npc
+## @param hurtType 伤害者的obj类型
+## @param hurtID 伤害者的objID
+## @return None
+#def OnDie(curNPC, hurtType, hurtID):
+# AICommon.DoNPCUseSkillOnDie(curNPC)
+# return
+
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 5eda952..6b08c4f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -135,9 +135,7 @@
def SetSuppressFightPower(curNPC, value): return curNPC.SetThunderDef(min(value, ShareDefine.Def_UpperLimit_DWord))
def GetCommendFightPower(curNPC): return curNPC.GetFireDef() # 火防代表推荐战力
def GetDropOwnerType(curNPC): return curNPC.GetThunderAtk() # 雷攻代表掉落归属类型
-def GetFaction(curNPC):
- faction = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_Faction)
- return faction if faction else curNPC.GetCountry()
+def GetFaction(curNPC): return curNPC.GetCountry()
def GetSkillAtkRate(curNPC): return curNPC.GetPoisionAtk() # 毒攻代表NPC技能伤害加成万分率
def GetFinalHurt(curNPC): return curNPC.GetFireAtk() # 火攻代表NPC最终固定伤害加成, 普攻也有效果
def SetFinalHurt(curNPC, hurt): return curNPC.SetFireAtk(hurt) # 火攻代表NPC最终固定伤害加成, 普攻也有效果
@@ -2167,7 +2165,10 @@
if playerID > 0:
curSummon.SetDict(ChConfig.Def_NPC_Dict_SummonMapNPCPlayerID, playerID)
-
+
+ if curSummon.GetType() == ChConfig.ntRobot:
+ __OnFBRobotReborn(curSummon, curSummon.GetLV())
+
FBLogic.DoFBRebornSummonNPC(curSummon, tick)
__NotifyMapPlayerSummonMapNPC(npcId, rebornX, rebornY)
return curSummon
@@ -3521,6 +3522,9 @@
#得到地图刷新点
posMap = curNPC.GetRefreshPosAt(curNPC.GetCurRefreshPointIndex())
#范围校验
+ if not posMap:
+ GameWorld.ErrLog("__Func_GetRandPosInRefreshArea GetRefreshPosAt error: return None! npcID=%s" % curNPC.GetNPCID())
+ return
posMapX = posMap.GetPosX()
posMapY = posMap.GetPosY()
@@ -5654,8 +5658,8 @@
collTimeReduceRate = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_CollTimeReduceRate)
if collTimeReduceRate:
prepareTime = max(1000, int(prepareTime * (ShareDefine.Def_MaxRateValue - collTimeReduceRate) / float(ShareDefine.Def_MaxRateValue)))
- PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, IPY_GameWorld.pstMissionCollecting, prepareID=curNPC.GetID())
-
+ prepareType = IPY_GameWorld.pstCollecting if curNPC.GetType() == IPY_GameWorld.ntCollection else IPY_GameWorld.pstMissionCollecting
+ PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, prepareType, prepareID=curNPC.GetID())
if collectNPCIpyData.GetLostHPPer():
curPlayer.SetDict(ChConfig.Def_PlayerKey_CollectLostHPTick, tick)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index f6781a1..b78c037 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -4308,11 +4308,16 @@
if not __RebornCost(curPlayer, rebornType, False):
return
+ # 副本额外验证
+ if not FBLogic.OnCanFBReborn(curPlayer, rebornType):
+ return
+
return True
def __RebornCost(curPlayer, rebornType, isDoCost):
## 扣除复活消耗
# @param isDoCost: 是否执行消耗
+ crossMapID = PlayerControl.GetCrossMapID(curPlayer)
playerID = curPlayer.GetPlayerID()
if rebornType == ChConfig.rebornType_Health:
rebornCfg = IpyGameDataPY.GetFuncEvalCfg('RebornArguments', 1)
@@ -4328,7 +4333,11 @@
return
elif rebornType == ChConfig.rebornType_UseItem:
- rebornItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, ChConfig.Def_Effect_Reborn)
+ if crossMapID == ChConfig.Def_FBMapID_CrossBattlefield:
+ rebornItemID = IpyGameDataPY.GetFuncCfg("CrossBattlefieldReborn", 1)
+ rebornItem = ItemCommon.FindItemInPackByItemID(curPlayer, rebornItemID, IPY_GameWorld.rptItem)
+ else:
+ rebornItem = ItemCommon.FindItemInPackByEffectEx(curPlayer, ChConfig.Def_Effect_Reborn)
if not rebornItem:
GameWorld.ErrLog("复活道具不足,无法原地复活! ", playerID)
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
index 2ab86c5..cebf17f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCompensationTube.py
@@ -30,6 +30,7 @@
import ChConfig
import PlayerControl
import IpyGameDataPY
+import PlayerSuccess
import EventShell
import time
@@ -195,6 +196,20 @@
sendMCPack.Result = 1
NetPackCommon.SendFakePack(curPlayer, sendMCPack)
+ #<MailTemplate>模板编号</MailTemplate>[%s,%s]
+ lSign, rSign = "<MailTemplate>", "</MailTemplate>"
+ if lSign in content and rSign in content:
+ mailKey = content[content.index(lSign) + len(lSign):content.index(rSign)]
+ try:
+ mailParamList = eval(content[content.index(rSign) + len(rSign):])
+ except:
+ mailParamList = []
+ if mailKey in ["CrossBattlefieldEnterOrderWeek", "CrossBattlefieldCallOrderWeek", "CrossBattlefieldScoreOrderWeek"]:
+ GameWorld.DebugLog("古神战场周榜邮件处理成就: mailKey=%s,mailParamList=%s" % (mailKey, mailParamList), curPlayer.GetPlayerID())
+ if mailParamList and mailParamList[0] == 1:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_BillFirst, 1)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_BillIn, 1)
+
#===========================================================================
# #领取补偿事件记录
# Text = curPackData.Text
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 41301f6..6764441 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4858,6 +4858,9 @@
#护盾值刷新
self.__RefreshMaxProDef(beforeMaxProDef)
+ #特殊指定属性公式
+ GameMap.SpecialMapSetAttrValueByFormat(curPlayer)
+
# 【到此所有功能属性都已刷新处理完毕,复制一份 功能属性的刷新结果,用于BUFF属性单独刷新】
EffGetSet.CopyPlayerFuncAttr(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossBattlefield.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossBattlefield.py
index 79a64da..f076dba 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossBattlefield.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossBattlefield.py
@@ -4,12 +4,12 @@
#
##@package Player.PlayerCrossBattlefield
#
-# @todo:跨服战场
+# @todo:跨服战场/古神战场
# @author hxp
# @date 2022-01-06
# @version 1.0
#
-# 详细描述: 跨服战场
+# 详细描述: 跨服战场/古神战场
#
#-------------------------------------------------------------------------------
#"""Version = 2022-01-06 20:30"""
@@ -27,6 +27,7 @@
import NetPackCommon
import ItemControler
import PlayerActivity
+import PlayerSuccess
def DoPlayerLogin(curPlayer):
@@ -192,27 +193,37 @@
# 固定礼包
buyAwardItemList = IpyGameDataPY.GetFuncEvalCfg("CrossBattlefieldBuyOpen", 3)
ItemControler.GivePlayerItemOrMail(curPlayer, buyAwardItemList)
+
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_CallOpen, 1)
return
def __DoBattlefieldOver(curPlayer, dataMsg):
playerID = curPlayer.GetPlayerID()
- overTime, highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter = dataMsg
-
+ overTime, \
+ isWinner, faction, rank, score, highScoreToday, highScoreWeekTotal, enterCountWeek, \
+ isCallOpen, isCalled, killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt, \
+ factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt = dataMsg
+
isToday = GameWorld.CheckTimeIsSameServerDayEx(overTime)
isSameWeek = GameWorld.CheckTimeIsSameWeek(overTime)
- GameWorld.Log("跨服战场结算玩家结果: highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,isCallEnter=%s,overTime=%s,isToday=%s,isSameWeek=%s"
- % (highScoreToday, highScoreWeekTotal, enterCountWeek, isCallEnter, GameWorld.ChangeTimeNumToStr(overTime), isToday, isSameWeek), playerID)
+ GameWorld.Log("跨服战场结算玩家结果: highScoreToday=%s,highScoreWeekTotal=%s,enterCountWeek=%s,overTime=%s,isToday=%s,isSameWeek=%s"
+ % (highScoreToday, highScoreWeekTotal, enterCountWeek, GameWorld.ChangeTimeNumToStr(overTime), isToday, isSameWeek), playerID)
+ GameWorld.Log(" isWinner=%s,faction=%s,rank=%s,score=%s,isCallOpen=%s,isCalled=%s" % (isWinner, faction, rank, score, isCallOpen, isCalled), playerID)
+ GameWorld.Log(" killCnt=%s,ckillCntInfo=%s,killBossCnt=%s,killScoreKing=%s,killGuardCnt=%s,auraScore=%s,superItemAwardCnt=%s"
+ % (killCnt, ckillCntInfo, killBossCnt, killScoreKing, killGuardCnt, auraScore, superItemAwardCnt), playerID)
+ GameWorld.Log(" factionBuffCollCnt=%s,personBuffCollCnt=%s,crystalCollCnt=%s,wallCollCnt=%s"
+ % (factionBuffCollCnt, personBuffCollCnt, crystalCollCnt, wallCollCnt), playerID)
if isToday:
addCnt = 1
- # 非召集进入的需要增加日常次数
- if not isCallEnter:
- PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_CrossBattlefield, addCnt)
- # 召集进入由于是免费进入,不许要增加日常次数,直接增加日常活跃
- else:
+ # 召集进入由于是免费进入,不需要增加日常次数,直接增加日常活跃
+ if isCallOpen or isCalled:
activityNum = PlayerActivity.GetActivityNum(PlayerActivity.RelatedType_1, ShareDefine.DailyActionID_CrossBattlefield)
PlayerActivity.AddActivityFinishCnt(curPlayer, activityNum, None, addCnt)
+ # 非召集兑入进入的需要增加日常次数
+ else:
+ PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_CrossBattlefield, addCnt)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreToday, highScoreToday)
SyncCrossBattlefieldPlayerInfo(curPlayer)
@@ -221,6 +232,40 @@
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_EnterCountWeek, enterCountWeek)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Battlefield_HighScoreTotalWeek, highScoreWeekTotal)
+ # 成就
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Join, 1)
+ if isCalled:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Called, 1)
+ if isWinner:
+ if faction == ShareDefine.CampType_Justice:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_WinJ, 1)
+ elif faction == ShareDefine.CampType_Evil:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_WinE, 1)
+ if killCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillCnt, killCnt)
+ for ckillCnt, addCnt in ckillCntInfo.items():
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_CKillCnt, addCnt, [ckillCnt])
+ if killBossCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillBoss, killBossCnt)
+ if killScoreKing > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillScoreKing, killScoreKing)
+ if killGuardCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_KillGuard, killGuardCnt)
+ if score > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Score, score)
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_ScoreMore, 1, [score])
+ if auraScore > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_AuraScore, auraScore)
+ if superItemAwardCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_SuperItem, superItemAwardCnt)
+ if factionBuffCollCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_FactionBuff, factionBuffCollCnt)
+ if personBuffCollCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_PersonBuff, personBuffCollCnt)
+ if crystalCollCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Crystal, crystalCollCnt)
+ if wallCollCnt > 0:
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Battlefield_Wall, wallCollCnt)
return
def SyncCrossBattlefieldPlayerInfo(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
index c4534d3..e027e7a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -527,15 +527,18 @@
return True
-def DoPetActivate(curPlayer, index, classlv):
+def DoPetActivate(curPlayer, index, classlv=None, refresh=True):
##直接激活 外部调用GM测试用
ipyDataMgr = IpyGameDataPY.IPY_Data()
petInfoCount = ipyDataMgr.GetPetInfoCount()
if petInfoCount <= 0 or index > petInfoCount:
GameWorld.ErrLog("激活宠物超过宠物表数据数: index=%s,petInfoCount=%s" % (index, petInfoCount))
return
- petNPCID = ipyDataMgr.GetPetInfoByIndex(index - 1).GetID()
- quality = ipyDataMgr.GetPetInfoByIndex(index - 1).GetQuality()
+ petIpyData = ipyDataMgr.GetPetInfoByIndex(index - 1)
+ petNPCID = petIpyData.GetID()
+ quality = petIpyData.GetQuality()
+ maxClassLV = petIpyData.GetMaxRank()
+
petPackIndex = ShareDefine.rptPet
petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
for i in range(petPack.GetCount()):
@@ -544,12 +547,15 @@
continue
petItemNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
if petItemNPCID == petNPCID:
- packItem.SetUserAttr(ShareDefine.Def_IudetPet_ClassLV, max(0, classlv - 1))
+ if classlv:
+ packItem.SetUserAttr(ShareDefine.Def_IudetPet_ClassLV, max(0, min(classlv, maxClassLV) - 1))
packItem.SetUserAttr(ShareDefine.Def_IudetPet_QualityLV, quality) # 宠物品质
GameWorld.DebugLog("已经拥有该宠物! i=%s,petItemNPCID=%s,petNPCID=%s" % (i, petItemNPCID, petNPCID))
- return
-
-
+ return True
+
+ if classlv == None:
+ classlv = 1
+ classlv = min(classlv, maxClassLV)
newPetItem = GetNewPetDataItem(curPlayer, petNPCID, classlv)
if not newPetItem:
return
@@ -557,10 +563,12 @@
if not ItemControler.PlayerItemControler(curPlayer).PutInItem(petPackIndex, newPetItem):
return
+ if not refresh:
+ return True
petItemIndex = GetPetDataItemIndexByNPCID(curPlayer, petNPCID)
DoChangePetState(curPlayer, petItemIndex, ShareDefine.Def_PetState_Fight)
RefreshPetItemAddAttr(curPlayer, True)
- return
+ return True
#===============================================================================
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 2ac3136..1816ccc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -663,6 +663,10 @@
if not result:
return
+ collectNPCIpyData = IpyGameDataPY.GetIpyGameDataNotLog("CollectNPC", curNPC.GetNPCID())
+ if collectNPCIpyData:
+ DoCollectingLostHP(curPlayer, collectNPCIpyData, tick, True)
+
FBLogic.OnCollectOK(curPlayer, curNPC.GetNPCID(), tick)
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index b7da1e1..f4963bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -101,7 +101,7 @@
g_crossPlayerItemsChangeInfo = {} #跨服玩家物品变化信息 {playerID:{"背包类型-物品位":itemMD5, ...}, ...}
g_crossPlayerSkillsChangeInfo = {} #跨服玩家技能变化信息 {playerID:[技能ID], ...}
-g_crossBattlefieldCallTeamInfo = {} # 跨服战场召集队伍信息 {zoneID:{hmNum:{playerID:[召集队伍玩家ID列表], ...}, ...}, ...}
+g_crossBattlefieldCallTeamInfo = {} # 跨服战场召集队伍信息 {zoneID:{hmNum:{playerID:{"callPlayerIDList":[召集队伍玩家ID列表], "factionID":阵营ID}, ...}, ...}, ...}
g_ZhuXianBossPlayerHurtDict = {} #诛仙BOSS玩家伤害排行信息
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 2ad79cc..d7b975c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1800,7 +1800,27 @@
SuccType_FeastRedPack_CrossPK, # 节日红包 - 跨服PK x次 141
SuccType_FeastRedPack_FBSweep, # 节日红包 - 副本扫荡 x次 142
SuccType_PassSkyTower, #通关天星塔 143
-) = range(1, 144)
+SuccType_Battlefield_Join, # 古神战场 - 参与 x次 144
+SuccType_Battlefield_CallOpen, # 古神战场 - 召集开启 x次 145
+SuccType_Battlefield_Called, # 古神战场 - 当被召集人 x次 146
+SuccType_Battlefield_WinJ, # 古神战场 - 道家获胜 x次 147
+SuccType_Battlefield_WinE, # 古神战场 - 佛家获胜 x次 148
+SuccType_Battlefield_KillCnt, # 古神战场 - 击败玩家 x次 149
+SuccType_Battlefield_CKillCnt, # 古神战场 - 连续击败y玩家 x次 150
+SuccType_Battlefield_KillBoss, # 古神战场 - 阵营击败boss x次 151
+SuccType_Battlefield_KillScoreKing, # 古神战场 - 不同场次击败积分王 x次 152
+SuccType_Battlefield_KillGuard, # 古神战场 - 击败守卫 x次 153
+SuccType_Battlefield_Score, # 古神战场 - 累计获得个人积分 xx 154
+SuccType_Battlefield_ScoreMore, # 古神战场 - 单场个人积分超过yy积分 x次 155
+SuccType_Battlefield_AuraScore, # 古神战场 - 累计在积分光环中获得积分 xx 156
+SuccType_Battlefield_SuperItem, # 古神战场 - 累计获得古神大奖 x次 157
+SuccType_Battlefield_FactionBuff, # 古神战场 - 累计采集阵营buff x次 158
+SuccType_Battlefield_PersonBuff, # 古神战场 - 累计获得个人buff x次 159
+SuccType_Battlefield_Crystal, # 古神战场 - 累计采集占领资源 x次 160
+SuccType_Battlefield_Wall, # 古神战场 - 累计采集积分墙 x次 161
+SuccType_Battlefield_BillFirst, # 古神战场 - 任意周榜榜首 x次 162
+SuccType_Battlefield_BillIn, # 古神战场 - 结算时累计上榜 x次 163
+) = range(1, 164)
# 节日红包成就类型
FeastRedPackSuccessTypeList = range(SuccType_FeastRedPack_TalkWorld, SuccType_FeastRedPack_FBSweep + 1)
@@ -1836,7 +1856,7 @@
ContainSuccessTypeList = [SuccType_CompoundItemEx, SuccType_PickUpItem, SuccType_MWSkillUp]
#传进来的条件是配置条件的整数倍的成就类型
-MultipleSuccessTypeList = [SuccType_ElderBattlefieldConKill]
+MultipleSuccessTypeList = [SuccType_ElderBattlefieldConKill, SuccType_Battlefield_CKillCnt]
#增加进度前需要重置的成就类型
NeedResetSuccessTypeList = [
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1089.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1089.py
index 2e5560a..5d2c846 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1089.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/BuffProcess_1089.py
@@ -50,18 +50,20 @@
def OnPassiveSkillByHurtCount(defender, curBuff, curEffect, buffOwner):
- if not buffOwner:
- return
- if buffOwner.GetGameObjType() != IPY_GameWorld.gotPlayer:
- return
- # 执行次数。 当汲灵对目标造成3次伤害时,可降低目标20%的防御
- curBuff.SetValue1(curBuff.GetValue1() + 1)
- tick = GameWorld.GetGameWorld().GetTick()
-
- defender.SetDict(ChConfig.Def_PlayerKey_BuffHurtCnt, curBuff.GetValue1())
- PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, defender, curBuff.GetSkill(), ChConfig.TriggerType_BuffHurtCnt, tick)
- defender.SetDict(ChConfig.Def_PlayerKey_BuffHurtCnt, 0)
-
+ try:
+ if not buffOwner:
+ return
+ if buffOwner.GetGameObjType() != IPY_GameWorld.gotPlayer:
+ return
+ # 执行次数。 当汲灵对目标造成3次伤害时,可降低目标20%的防御
+ curBuff.SetValue1(curBuff.GetValue1() + 1)
+ tick = GameWorld.GetGameWorld().GetTick()
+
+ defender.SetDict(ChConfig.Def_PlayerKey_BuffHurtCnt, curBuff.GetValue1())
+ PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, defender, curBuff.GetSkill(), ChConfig.TriggerType_BuffHurtCnt, tick)
+ defender.SetDict(ChConfig.Def_PlayerKey_BuffHurtCnt, 0)
+ except:
+ GameWorld.ErrLog("OnPassiveSkillByHurtCount error!!!")
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index dfab201..6a5f468 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -3547,7 +3547,7 @@
# @param tagRoundPosY 对地面区域攻击坐标Y
# @return 返回值真, 释放成功
# @remarks 自定义函数, 释放Buff技能
-def __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX = 0, tagRoundPosY = 0):
+def __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX = 0, tagRoundPosY = 0, addForce=False):
skillTypeID = curSkill.GetSkillTypeID()
skillBuffType = SkillCommon.GetBuffType(curSkill)
@@ -3581,7 +3581,7 @@
else:
#---添加的Buff值---, 仅支持放在效果1的buff
addBuffValueList = GetAddBuffValue(attacker, curSkill, defender)
- result = BuffSkill.DoAddBuff(defender, skillBuffType, curSkill, tick, addBuffValueList, attacker)
+ result = BuffSkill.DoAddBuff(defender, skillBuffType, curSkill, tick, addBuffValueList, attacker, addForce=addForce)
# result为0 是抵消的不需要对buff处理
if result is not 0:
--
Gitblit v1.8.0