#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldLogic.FBProcess.GameLogic_FamilyWar
|
#
|
# @todo:ÏÉÃËÁªÈü
|
# @author hxp
|
# @date 2018-01-12
|
# @version 1.1
|
#
|
# @change: "2018-07-23 16:00" hxp ²É¼¯Ë®¾§Ö§³Ö°´Ë®¾§IDÅäÖòɼ¯»ý·Ö£»Ôö¼ÓÎÞÖ÷buff£»Ì켫ÁªÈü»ý·Ö¶îÍâ½±Àøµ÷ÕûΪ»ñʤ·½»ý·ÖµÚÒ»Ãû²ÅÓУ»
|
#
|
# ÏêϸÃèÊö: ÏÉÃËÁªÈü
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-07-23 16:00"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import NPCCommon
|
import GameWorld
|
import PyGameData
|
import ShareDefine
|
import IPY_GameWorld
|
import PlayerControl
|
import ItemControler
|
import ChPyNetSendPack
|
import GameWorldProcess
|
import PlayerDienstgrad
|
import PlayerWeekParty
|
import IpyGameDataPY
|
import PlayerFamily
|
import NetPackCommon
|
import SkillCommon
|
import EventReport
|
import PlayerGubao
|
import ItemCommon
|
import BuffSkill
|
import AICommon
|
import FBCommon
|
import GameMap
|
import GameObj
|
|
import random
|
import copy
|
import math
|
|
FamilyWarRound_First = 1 # Ê×ÂÖ
|
FamilyWarRound_Second = 2 # ´ÎÂÖ
|
|
FamilyWar_MaxGroupID = 5 # ÁªÈü·Ö×éÊý
|
|
#µ±Ç°¸±±¾µØÍ¼µÄ״̬
|
(
|
FB_Step_Open, # µØÍ¼¿ªÆô
|
FB_Step_Prepare, # µØÍ¼×¼±¸
|
FB_Step_Fighting, # Õ½¶·ÖÐ
|
FB_Step_LeaveTime, # ×ÔÓÉʱ¼ä
|
FB_Step_Over, # ¸±±¾¹Ø±Õ
|
) = range(5)
|
|
(
|
Time_Prepare, # ¸±±¾×¼±¸Ê±¼ä 0
|
Time_Fight, # ¸±±¾Õ½¶·Ê±¼ä 1
|
Time_Leave, # ¸±±¾À뿪ʱ¼ä 2
|
) = range(3)
|
|
# GameFBData »º´æ
|
GameFBData_FamilyWarGlobal = "FamilyWarGlobal" # {key:value, ...}
|
GameFBData_FamilyWarFamily = "FamilyWarFamily" # {playerID:FamilyWarFamily, ...}
|
GameFBData_FamilyWarPlayer = "FamilyWarPlayer" # {playerID:FamilyWarPlayer, ...}
|
|
# GameFBData_FamilyWarGlobal key
|
Global_HelpInfo = "HelpInfo" # ¼Ç¼³£¹æ°ïÖúÐÅÏ¢£¬±ä¸üʱͬ²½
|
Global_HelpBuff = "HelpBuff" # ¼ÇÂ¼Ëæ»úbuff״̬ÐÅÏ¢£¬±ä¸üʱͬ²½
|
Global_HelpCrystal = "HelpCrystal" # ¼Ç¼ˮ¾§Õ¼ÁìÃ÷ϸÐÅÏ¢£¬±ä¸üʱͬ²½
|
Global_HelpCrystalAtk = "HelpCrystalAtk" # ¼Ç¼ˮ¾§¹¥»÷Ã÷ϸÐÅÏ¢£¬±ä¸üʱͬ²½
|
Global_BillboardBuff = "BillboardBuff" # ¼Ç¼ÅÅÐаñbuffÐÅÏ¢£¬±ä¸üʱͬ²½
|
|
# ¸±±¾Ïà¹Ø×Öµäkey
|
GameFBDict_IsFinalMatch = "IsFinalMatch" # ÊÇ·ñ×îÖÕ¾öÈü³¡´Î
|
GameFBDict_RoundNum = "RoundNum" # ÂÖ´Î
|
GameFBDict_GroupID = "GroupID" # ÁªÈü×é¼¶±ð
|
|
GameFBDict_WinnerFamilyID = "WinnerFamilyID" # »ñʤµÄÏÉÃËID
|
GameFBDict_GetFlagFamilyID = "FlagFamily_%s" # »ñµÃÕ½ÆìµÄÕ½ÃËid£¬²ÎÊýΪսÆìNPCID
|
GameFBDict_FamilyResPointTick = "FamResPointTick_%s" # »ñµÃÕ½ÆìÕ½ÃËˢлý·Öʱ¼ä£¬²ÎÊýΪսÆìNPCID
|
GameFBDict_HelpInfoTick = "HelpInfoTick" # ¸±±¾°ïÖúÐÅϢͬ²½tick
|
|
GameFBDict_RandBuffCollectTick = "RBuffCollectTick" # Ëæ»úbuff±»²Étick
|
GameFBDict_RandBuffRefreshTick = "RBuffRefreshTick" # Ëæ»úbuffË¢ÐÂtick
|
GameFBDict_RandBuffObjID = "RBuffObjID_%s" # Ëæ»úbuffµÄObjID, ²ÎÊýÎª×ø±ê±àºÅË÷Òý 0~n
|
|
## ²ÎÈüµÄÏÉÃËÀà
|
class FamilyWarFamily():
|
|
def __init__(self, familyID):
|
self.familyID = familyID
|
self.faction = 0
|
self.rank = 0 # ÏÉÃËÁбíÃû´Î
|
self.winCount = 0 # Á¬Ê¤´ÎÊý
|
self.resPoint = 0.0 # µ±Ç°×ÊÔ´µãÊý, ³É³¤°Ù·Ö±È¼ÆËãºó²»È¡Õû£¬¿ÉÄÜÊÇСÊý
|
self.memCount = 0 # ÏÉÃËÔÚÕ½³¡ÖеÄÈËÊý
|
|
self.randBuffAttrLV = 0 # Ëæ»úbuff¼ÓÊôÐԵȼ¶
|
self.randBuffResPoint = 0 # Ëæ»úbuffÔö¼ÓµÄ¹Ì¶¨×ÊÔ´µãÊý
|
self.randBuffResPointPerDict = {} # Ëæ»úbuffÔö¼ÓµÄ×ÊÔ´µã³É³¤ÐÅÏ¢ {addBuffTick:[lastTime, addPer], ...}
|
return
|
|
def GetBuffResPointPer(self, tick):
|
totalPer = 0
|
for addBuffTick, buffInfo in self.randBuffResPointPerDict.items():
|
lastTime, addPer = buffInfo
|
if tick - addBuffTick >= lastTime:
|
self.randBuffResPointPerDict.pop(addBuffTick)
|
else:
|
totalPer += addPer
|
return totalPer
|
|
def GetResPoint(self): return self.resPoint
|
def AddResPoint(self, addResPoint):
|
basePoint = 500
|
befDivValue = int(self.resPoint / basePoint)
|
self.resPoint += addResPoint
|
aftDivValue = int(self.resPoint / basePoint)
|
if befDivValue != aftDivValue:
|
notifyPoint = basePoint * aftDivValue
|
# ¼º·½×ÊÔ´µãÒÑ´ï<color=#ff0000FF>%s0</color>µã
|
# µÐ·½×ÊÔ´µãÒÑ´ï<color=#ff0000FF>%s0</color>µã
|
PlayerControl.FBFactionNotify(self.faction, "FamilyMatchOwnResources", [notifyPoint],
|
"FamilyMatchEnimeyResources", [notifyPoint])
|
return self.resPoint
|
|
def AddFamilyWarFamily(familyID):
|
familyWarFamilyDict = FBCommon.GetGameFBData(GameFBData_FamilyWarFamily)
|
if familyID in familyWarFamilyDict:
|
return familyWarFamilyDict[familyID]
|
warFamily = FamilyWarFamily(familyID)
|
warFamily.faction = GetFamilyFaction(familyID)
|
familyWarFamilyDict[familyID] = warFamily
|
return warFamily
|
def GetFamilyWarFamily(familyID):
|
familyWarFamilyDict = FBCommon.GetGameFBData(GameFBData_FamilyWarFamily)
|
if familyID in familyWarFamilyDict:
|
return familyWarFamilyDict[familyID]
|
return AddFamilyWarFamily(familyID)
|
def GetWarFamilyName(familyID):
|
familyVsMgr = GameWorld.GetGameFB().GetFamilyVS()
|
if familyVsMgr.GetFamilyID() == familyID:
|
return familyVsMgr.GetFamilyName()
|
return familyVsMgr.GetVSFamilyName()
|
|
## ²ÎÈüµÄÏÉÃËÍæ¼ÒÀà
|
class FamilyWarPlayer():
|
|
def __init__(self, familyID, faction, playerID, name, tick):
|
self.familyID = familyID
|
self.faction = faction
|
self.playerID = playerID
|
self.name = name
|
self.score = 0 # »ý·Ö
|
self.killPlayerCount = 0 # »÷ɱÊý
|
self.collResourceCount = 0 # Õ¼Áì×ÊÔ´µãÊý
|
self.collRandBuffCount = 0 # ÇÀ¶ábuffÊý
|
self.fightTime = 0 # Õ½¶·Ê±³¤
|
self.joinTick = tick # ¼ÓÈëÕ½³¡Ê±µÄtick
|
|
self.calcFightTimeTick = 0 # ¼ÆËãÕ½¶·Ê±³¤tick
|
self.collectTypeIndex = 0 # ²É¼¯NPCÀàÐÍÅäÖÃindex
|
self.collectLostHPTick = 0 # ²É¼¯NPCµôѪtick
|
|
self.restoreHPTick = 0 # ÓªµØ»ØÑªtick
|
return
|
|
def AddFamilyWarPlayer(familyID, faction, playerID, name, tick):
|
familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer)
|
if playerID in familyWarPlayerDict:
|
return familyWarPlayerDict[playerID]
|
warPlayer = FamilyWarPlayer(familyID, faction, playerID, name, tick)
|
familyWarPlayerDict[playerID] = warPlayer
|
return warPlayer
|
def GetFamilyWarPlayer(playerID):
|
familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer)
|
if playerID in familyWarPlayerDict:
|
return familyWarPlayerDict[playerID]
|
# Ò»°ã²»¿ÉÄܳöÏÖ²»´æÔÚµÄÇé¿ö£¬ÒÔÏ´úÂëÖ÷ҪΪÁ˱àÂëʱ°´ . ÄÜÌáʾÏÔʾÀàÖжÔÏó
|
tick = GameWorld.GetGameWorld().GetTick()
|
curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID)
|
familyID = 0 if not curPlayer else curPlayer.GetFamilyID()
|
name = "" if not curPlayer else curPlayer.GetPlayerName()
|
faction = GetFamilyFaction(familyID)
|
return AddFamilyWarPlayer(familyID, faction, playerID, name, tick)
|
|
def GetFamilyWarBillboardPack(gameFB, sortWarPlayer, tick, winFaction=0):
|
warBillboard = ChPyNetSendPack.tagMCFamilyWarBillboard()
|
warBillboard.Clear()
|
warBillboard.GroupID = gameFB.GetGameFBDictByKey(GameFBDict_GroupID)
|
warBillboard.WinFaction = winFaction
|
warBillboard.TotalFightTime = 0 if not winFaction else (tick - gameFB.GetFBStepTick()) / 1000
|
warBillboard.FBBillboardPlayer = []
|
for warPlayer in sortWarPlayer:
|
wPlayer = ChPyNetSendPack.tagMCFamilyWarPlayer()
|
wPlayer.Clear()
|
wPlayer.PlayerID = warPlayer.playerID
|
wPlayer.PlayerName = warPlayer.name
|
wPlayer.PlayerNameLen = len(wPlayer.PlayerName)
|
wPlayer.Faction = warPlayer.faction
|
wPlayer.CrystalCount = warPlayer.collResourceCount
|
wPlayer.RandBuffCount = warPlayer.collRandBuffCount
|
wPlayer.KillPlayerCount = warPlayer.killPlayerCount
|
wPlayer.FightTime = 0 if not winFaction else warPlayer.fightTime / 1000
|
wPlayer.Point = warPlayer.score
|
warBillboard.FBBillboardPlayer.append(wPlayer)
|
warBillboard.BillboardCount = len(warBillboard.FBBillboardPlayer)
|
return warBillboard
|
|
def SortFamilyWarPlayer():
|
familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer)
|
sortWarPlayerList = familyWarPlayerDict.values()
|
sortWarPlayerList.sort(cmp=CmpWarPlayer)
|
return sortWarPlayerList
|
|
def CmpWarPlayer(warPlayerA, warPlayerB):
|
## ÅÅÐò¹æÔò£¬»ý·Ö > ʤÀûµÄ £¾ »÷ɱÊý¶àµÄ £¾ Õ¼Áì×ÊÔ´µã¶àµÄ£¾ ÇÀ¶áBUFF¶àµÄ £¾ Õ½¶·Ê±³¤³¤µÄ £¾ ¼ÓÈëÕ½³¡tick
|
# »ý·Ö
|
scoreA = warPlayerA.score
|
scoreB = warPlayerB.score
|
cmpRet = cmp(scoreB, scoreA) # µ¹Ðò
|
#GameWorld.DebugLog(" »ý·Ö±È½Ï: scoreB=%s,scoreA=%s,cmpRet=%s" % (scoreB, scoreA, cmpRet))
|
if cmpRet != 0:
|
return cmpRet
|
|
# »ñʤµÄ
|
winnerFamilyID = GameWorld.GetGameFB().GetGameFBDictByKey(GameFBDict_WinnerFamilyID)
|
isWinA = warPlayerA.familyID == winnerFamilyID
|
isWinB = warPlayerB.familyID == winnerFamilyID
|
cmpRet = cmp(isWinB, isWinA) # µ¹Ðò
|
#GameWorld.DebugLog(" »ñʤ±È½Ï: winnerFamilyID=%s,isWinB=%s,isWinA=%s,cmpRet=%s" % (winnerFamilyID, isWinB, isWinA, cmpRet))
|
if cmpRet != 0:
|
return cmpRet
|
|
# »÷É±Íæ¼Ò
|
killPlayerCountA = warPlayerA.killPlayerCount
|
killPlayerCountB = warPlayerB.killPlayerCount
|
cmpRet = cmp(killPlayerCountB, killPlayerCountA) # µ¹Ðò
|
#GameWorld.DebugLog(" »÷É±Íæ¼Ò: killPlayerCountB=%s,killPlayerCountA=%s,cmpRet=%s" % (killPlayerCountB, killPlayerCountA, cmpRet))
|
if cmpRet != 0:
|
return cmpRet
|
|
# Õ¼Áì×ÊÔ´
|
collResourceCountA = warPlayerA.collResourceCount
|
collResourceCountB = warPlayerB.collResourceCount
|
cmpRet = cmp(collResourceCountB, collResourceCountA) # µ¹Ðò
|
#GameWorld.DebugLog(" Õ¼Áì×ÊÔ´: collResourceCountB=%s,collResourceCountA=%s,cmpRet=%s" % (collResourceCountB, collResourceCountA, cmpRet))
|
if cmpRet != 0:
|
return cmpRet
|
|
# ÇÀ¶ábuff
|
collRandBuffCountA = warPlayerA.collRandBuffCount
|
collRandBuffCountB = warPlayerB.collRandBuffCount
|
cmpRet = cmp(collRandBuffCountB, collRandBuffCountA) # µ¹Ðò
|
#GameWorld.DebugLog(" ÇÀ¶ábuff: collRandBuffCountB=%s,collRandBuffCountA=%s,cmpRet=%s" % (collRandBuffCountB, collRandBuffCountA, cmpRet))
|
if cmpRet != 0:
|
return cmpRet
|
|
# Õ½¶·Ê±³¤
|
fightTimeA = warPlayerA.fightTime
|
fightTimeB = warPlayerB.fightTime
|
cmpRet = cmp(fightTimeB, fightTimeA) # µ¹Ðò
|
#GameWorld.DebugLog(" Õ½¶·Ê±³¤: fightTimeB=%s,fightTimeA=%s,cmpRet=%s" % (fightTimeB, fightTimeA, cmpRet))
|
if cmpRet != 0:
|
return cmpRet
|
|
# ¼ÓÈëÕ½³¡tick ÕýÐò
|
joinTickA = warPlayerA.joinTick
|
joinTickB = warPlayerB.joinTick
|
cmpRet = cmp(joinTickA, joinTickB) # µ¹Ðò
|
#GameWorld.DebugLog(" ¼ÓÈëÕ½³¡tick: joinTickA=%s,joinTickB=%s,cmpRet=%s" % (joinTickA, joinTickB, cmpRet))
|
return cmpRet
|
|
## -----------------------------------------------------------------------------------------------
|
def GetFWarStepTime(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchPlayTime") # ½×¶Îʱ¼ä
|
|
## ÓªµØ
|
def GetFactionArea(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSpawnPoint", 1) # ÓªµØ·¶Î§
|
def GetBarrierPointList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSpawnPoint", 2) # ×¼±¸Çø¼äÓªµØÕϰµã
|
|
## Ë®¾§
|
def GetResourceRebornPosList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint", 1) # Ë®¾§¸´»îµãÁбí
|
def GetResourceNPCIDList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint", 2) # Ë®¾§NPCID˳ÐòÁбí
|
def GetResourceRebornRank(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint", 3) # ¸´»î¶ÔÓ¦Õ¼ÁìË®¾§±àºÅÓÅÏȼ¶
|
def GetResourceWinPoint(): return IpyGameDataPY.GetFuncCfg("FamilyMatchResourcePoint", 5) # »ñʤ×ÊÔ´ÉÏÏÞ
|
|
def GetResourcePointMultiple(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint1", 1) # ÌØÊâË®¾§×ÊÔ´µã³É³¤±¶Öµ
|
def GetResourcePointPerSecond(): return IpyGameDataPY.GetFuncCfg("FamilyMatchResourcePoint1", 2) # Õ¼ÁìË®¾§»ñµÃ×ÊÔ´µã/Ãë
|
|
## ²É¼¯
|
def GetCollectTimeList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchCollect", 1)
|
def GetCollectLostHPPerList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchCollect", 2)
|
|
## Ëæ»úbuff
|
def GetRandBuffPosList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRandomBuff", 1) # Ëæ»úbuffË¢ÐÂ×ø±êÁбí
|
def GetRandBuffCount(): return IpyGameDataPY.GetFuncCfg("FamilyMatchRandomBuff", 2) # ÿ´ÎË¢ÐÂËæ»úbuffÊý
|
def GetRandBuffNPCIDList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRandomBuff", 3) # Ëæ»úbuffNPCIDÁбí
|
def GetRandBuffRefreshTime(): return IpyGameDataPY.GetFuncCfg("FamilyMatchRandomBuff", 4) # Ëæ»úbuffˢмä¸ôÃë
|
|
## ¸öÈË»ý·Ö
|
def GetScorePerMinute(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 1) # ÔÚÕ½³¡ÄÚ¶ºÁôÿ·ÖÖÓ»ñµÃ»ý·Ö
|
def GetScoreKillPlayer(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 2) # ÿ´Î»÷ɱµÐ·½Íæ¼Ò»ñµÃ»ý·Ö
|
def GetScoreCollectRescource(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 3) # ³É¹¦Õ¼ÁìÒ»¸öË®¾§»ñµÃ»ý·Ö
|
def GetScoreCollectRandBuff(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 4) # ³É¹¦²É¼¯Ò»¸öBUFF»ñµÃ»ý·Ö
|
def GetScoreWinerAddPer(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 5) # ʤÀû·½½áËãʱ£¬»ý·ÖµÄ¶îÍâ°Ù·Ö±È¼Ó³É£¨N%£©
|
|
|
def OnFBPlayerOnDay(curPlayer):
|
dailyRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward)
|
if dailyRewardState:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyWarDailyReward, 0)
|
championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID)
|
if curPlayer.GetFamilyID() == championFamilyID:
|
Sync_ChampionFamilyDailyRewardState(curPlayer)
|
return
|
|
def OnFBPlayerOnLogin(curPlayer):
|
dailyRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward)
|
if dailyRewardState:
|
championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID)
|
if curPlayer.GetFamilyID() == championFamilyID:
|
Sync_ChampionFamilyDailyRewardState(curPlayer)
|
return
|
|
def OnChampionFamilyIDChange():
|
playerManager = GameWorld.GetPlayerManager()
|
for index in range(0, playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if curPlayer.GetID() == 0:
|
continue
|
DoCheckChampionFamilyTitle(curPlayer)
|
return
|
|
def DoCheckChampionFamilyTitle(curPlayer):
|
## ¼ì²éÍõÕßÏÉÃ˳ƺÅ: 1-ÍõÕßÏÉÃ˱ä¸üʱ£»2-Íæ¼Ò¼ÓÈëÏÉÃËʱ£»3-Íæ¼ÒÍ˳öÏÉÃËʱ£»3-Íæ¼Òְλ±ä¸üʱ
|
titleIDList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchDayReward", 2)
|
if not titleIDList:
|
return
|
leaderTitleID, memberTitleID = titleIDList
|
|
delDienstgradIDList = []
|
addDienstgradIDList = []
|
|
familyID = curPlayer.GetFamilyID()
|
championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID)
|
if not championFamilyID or familyID != championFamilyID:
|
delDienstgradIDList = [leaderTitleID, memberTitleID]
|
elif curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader:
|
addDienstgradIDList = [leaderTitleID]
|
delDienstgradIDList = [memberTitleID]
|
else:
|
addDienstgradIDList = [memberTitleID]
|
delDienstgradIDList = [leaderTitleID]
|
|
PlayerDienstgrad.PlayerDelAddDienstgrad(curPlayer, delDienstgradIDList, addDienstgradIDList)
|
return
|
|
##¿ªÆô¸±±¾
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ¿ªÆô¸±±¾
|
def OnOpenFB(tick):
|
globalDict = {
|
Global_HelpInfo:None,
|
Global_HelpBuff:None,
|
Global_HelpCrystal:None,
|
Global_HelpCrystalAtk:None,
|
Global_BillboardBuff:None,
|
}
|
FBCommon.SetGameFBData(GameFBData_FamilyWarGlobal, globalDict)
|
FBCommon.SetGameFBData(GameFBData_FamilyWarFamily, {})
|
FBCommon.SetGameFBData(GameFBData_FamilyWarPlayer, {})
|
|
FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
|
gameFB = GameWorld.GetGameFB()
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
|
warFamilyA = AddFamilyWarFamily(familyIDA)
|
warFamilyB = AddFamilyWarFamily(familyIDB)
|
|
for vsFamily in PyGameData.VSFamilyInfo:
|
familyIDList = vsFamily[ShareDefine.VSFamilyInfo_FamilyIDList]
|
if familyIDA in familyIDList and familyIDB in familyIDList:
|
isFinalMatch = vsFamily[ShareDefine.VSFamilyInfo_IsFinalMatch]
|
roundNum = vsFamily[ShareDefine.VSFamilyInfo_RoundNum]
|
groupID = vsFamily[ShareDefine.VSFamilyInfo_GroupID]
|
rankA, rankB = vsFamily[ShareDefine.VSFamilyInfo_FamilyRankList]
|
winCountA, winCountB = vsFamily[ShareDefine.VSFamilyInfo_WinCountList]
|
|
gameFB.SetGameFBDict(GameFBDict_IsFinalMatch, int(isFinalMatch))
|
gameFB.SetGameFBDict(GameFBDict_RoundNum, roundNum)
|
gameFB.SetGameFBDict(GameFBDict_GroupID, groupID)
|
warFamilyA.faction = ShareDefine.CampType_Justice
|
warFamilyA.rank = rankA
|
warFamilyA.winCount = winCountA
|
warFamilyB.faction = ShareDefine.CampType_Evil
|
warFamilyB.rank = rankB
|
warFamilyB.winCount = winCountB
|
GameWorld.Log("OpenFBWar: isFinalMatch=%s,roundNum=%s,groupID=%s,familyIDA(%s) VS familyIDB(%s),rank=[%s,%s],winCount=[%s,%s]"
|
% (isFinalMatch, roundNum, groupID, familyIDA, familyIDB, rankA, rankB, winCountA, winCountB))
|
break
|
|
return
|
|
##¹Ø±Õ¸±±¾
|
# @param tick ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
# @remarks
|
def OnCloseFB(tick):
|
FBCommon.SetGameFBData(GameFBData_FamilyWarGlobal, None)
|
FBCommon.SetGameFBData(GameFBData_FamilyWarFamily, None)
|
FBCommon.SetGameFBData(GameFBData_FamilyWarPlayer, None)
|
return
|
|
## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param mapID µØÍ¼ID
|
# @param lineID Ïß·id
|
# @param tick ʱ¼ä´Á
|
# @return ²¼¶ûÖµ
|
def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
|
if not GetFamilyFaction(curPlayer.GetFamilyID()):
|
PlayerControl.NotifyCode(curPlayer, "NoFamilyWarLine")
|
return False
|
return True
|
|
## ½øÈë´«Ë͵ã
|
# @param curPlayer
|
# @param mapID µØÍ¼ID
|
# @param lineId ·ÖÏßID
|
# @param tick
|
# @return ×ø±êÁбí(X,Y)
|
def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
|
faction = GetFamilyFaction(curPlayer.GetFamilyID())
|
if not faction:
|
return
|
return GetFactionArea()[GetFactionIndex(faction)]
|
|
def GetFactionIndex(faction): return max(0, faction - 1)
|
|
def GetFamilyFaction(familyID):
|
# »ñÈ¡ÏÉÃËËùÊôÕóÓª£¬ÆäËûµØÍ¼Ò²ÐèÒªÓõ½£¬¹ÊÕâÀïÖ±½Ó±éÀú»º´æÖÐÊý¾Ý
|
for vsFamily in PyGameData.VSFamilyInfo:
|
familyIDList = vsFamily[ShareDefine.VSFamilyInfo_FamilyIDList]
|
if familyID in familyIDList:
|
if familyID == familyIDList[0]:
|
return ShareDefine.CampType_Justice
|
return ShareDefine.CampType_Evil
|
return 0
|
|
##»ñµÃÍæ¼Ò´«È븱±¾ÐèҪЯ´øµÄÐÅÏ¢
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return ×Ö·û´®
|
# @remarks
|
def GetPlayerResetWorldPosFBMsg(curPlayer, lineId):
|
return str(curPlayer.GetFamilyID())
|
|
## ÊÇ·ñ¿ÉÒÔ½øÈë
|
# @param ask ÇëÇóÐÅÏ¢
|
# @param tick
|
# @return »Ø¸´ÊÇ·ñͨ¹ýÇëÇó
|
def OnChangeMapAsk(ask, tick):
|
familyIDMsg = ask.GetMsg()
|
|
if not familyIDMsg:
|
GameWorld.ErrLog("ÎÞ·¨»ñµÃ´«ÈëµÄ¼Ò×åID = %s" % (familyIDMsg))
|
return IPY_GameWorld.cmeNull
|
|
familyID = int(familyIDMsg)
|
result = GetFamilyWarGameFB(familyID)
|
if result == None:
|
return IPY_GameWorld.cmeCustom, "NoFamilyWarLine"
|
|
gameFB, openState = result
|
if openState != IPY_GameWorld.fbosOpen:
|
return IPY_GameWorld.cmeCustom, "FamilyWarLineClose"
|
|
#ÒѾ¿ªÆôÁË£¬²»ÈýøÈë
|
if gameFB.GetFBStep() >= FB_Step_LeaveTime:
|
return IPY_GameWorld.cmeCustom, "FamilyWarLineEnd"
|
|
return IPY_GameWorld.cmeAccept
|
|
def GetFamilyWarGameFB(familyID):
|
gameWorld = GameWorld.GetGameWorld()
|
for index in range(gameWorld.GetGameWorldCount()):
|
gameFB = gameWorld.GetGameFBByFbIndex(index)
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
if familyID in [familyIDA, familyIDB]:
|
return gameFB, gameWorld.GetOpenStateByFbIndex(index)
|
return
|
|
##Íæ¼Ò½øÈ븱±¾
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
# @remarks Íæ¼Ò½øÈ븱±¾
|
def DoEnterFB(curPlayer, tick):
|
gameFB = GameWorld.GetGameFB()
|
|
fbStep = gameFB.GetFBStep()
|
playerID = curPlayer.GetPlayerID()
|
familyID = curPlayer.GetFamilyID()
|
faction = GetFamilyFaction(familyID)
|
if not faction or fbStep not in [FB_Step_Prepare, FB_Step_Fighting]:
|
GameWorld.ErrLog("DoEnterFB PlayerLeaveFB familyID=%s,faction=%s,fbStep=%s" % (familyID, faction, fbStep), playerID)
|
PlayerControl.PlayerLeaveFB(curPlayer)
|
return
|
if curPlayer.GetFaction() != faction:
|
curPlayer.SetFaction(faction)
|
|
if not FBCommon.GetHadDelTicket(curPlayer):
|
FBCommon.SetHadDelTicket(curPlayer)
|
FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_FamilyWar)
|
PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FamilyWar, 1)
|
PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_FamilyWar, 1)
|
isFinalMatch = gameFB.GetGameFBDictByKey(GameFBDict_IsFinalMatch)
|
roundNum = gameFB.GetGameFBDictByKey(GameFBDict_RoundNum)
|
groupID = gameFB.GetGameFBDictByKey(GameFBDict_GroupID)
|
warPlayer = AddFamilyWarPlayer(familyID, faction, playerID, curPlayer.GetPlayerName(), tick)
|
|
if fbStep == FB_Step_Prepare:
|
notify_tick = GetFWarStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
|
FBCommon.SyncDynamicBarrierState(GetBarrierPointList(), 1, curPlayer) # ×¼±¸ÆÚ¼äÓж¯Ì¬Õϰµã
|
|
elif fbStep == FB_Step_Fighting:
|
notify_tick = GetFWarStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
|
warPlayer.calcFightTimeTick = tick # Õ½¶·½×¶Î½øÈë¸üдËtick
|
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
warFamilyA = GetFamilyWarFamily(familyIDA)
|
warFamilyB = GetFamilyWarFamily(familyIDB)
|
|
curWarFamily = warFamilyA if familyID == familyIDA else warFamilyB
|
tagWarFamily = warFamilyA if familyID != familyIDA else warFamilyB
|
|
curWarFamily.memCount += 1
|
GameWorld.Log("DoEnterFB ÏÉÃËÕ½³¡ÈËÊý¼Ó1, isFinalMatch=%s,roundNum=%s,groupID=%s,familyID=%s,memCount=%s,faction=%s"
|
% (isFinalMatch, roundNum, groupID, familyID, curWarFamily.memCount, faction), playerID)
|
|
enterHelpDict = {"familyWar_Enter":{"WinCount":[warFamilyA.winCount, warFamilyB.winCount], "IsFinalMatch":isFinalMatch}}
|
__NotifyWarHelp_Info(tick, curPlayer, enterHelpDict)
|
|
# ¸ù¾Ýµ±Ç°ÏÉÃËÕ½³¡ÈËÊý¼Ó²ÎÓëbuff
|
__AddFamilyWarBuff(familyID, ChConfig.Def_SkillID_FamilyWar_JoinBuff, tick, curWarFamily.memCount)
|
|
# ×îÖÕ¾öÈü³¡´Î£¬¶ÔÊÖÓÐÁ¬Ê¤´ÎÊýµÄ£¬Ôö¼ÓÁ¬Ê¤buff
|
if isFinalMatch and tagWarFamily.winCount:
|
cWinBuffLV = min(IpyGameDataPY.GetFuncCfg("FamilyMatchEnterBuff", 1), tagWarFamily.winCount)
|
__AddFamilyWarBuff(familyID, ChConfig.Def_SkillID_FamilyWar_CWinBuff, tick, cWinBuffLV)
|
|
EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_FamilyWar, 0, ChConfig.CME_Log_Start)
|
return
|
|
def __NotifyWarHelp_Info(tick, enterPlayer=None, enterHelpDict={}):
|
''' ¸±±¾°ïÖúÐÅÏ¢
|
ʵʱͬ²½
|
{"familyWar_Buff":[{"PosIndex":λÖÃË÷Òý, "NPCID":buffNPCID, "Atk":1}, {"PosIndex":λÖÃË÷Òý, "NPCID":buffNPCID, "Atk":0}, ...]]}
|
|
{"familyWar_Crystal":{"ÕóÓª1":[Ë®¾§NPCID, ...], "ÕóÓª2":[Ë®¾§NPCID, ...]}, "familyWar_CrystalAtk":[ÕýÔÚ±»¹¥»÷µÄË®¾§NPCIDÁбí]}
|
|
ͬ²½¹æÔò£º xÃëÒ»´Î
|
{"familyWar_HelpInfo":[{"ResPoint":1, MemCount":1, "BuffResPoint":buffÔö¼ÓµÄ×ÊÔ´µãÊý, "BuffResPointPer":buff×ÊÔ´µãÊý³É³¤Íò·ÖÂÊ, "BuffAttrLV":buffÊôÐԵȼ¶},
|
{"ResPoint":1, "MemCount":1, "BuffResPoint":buffÔö¼ÓµÄ×ÊÔ´µãÊý, "BuffResPointPer":buff×ÊÔ´µãÊý³É³¤Íò·ÖÂÊ, "BuffAttrLV":buffÊôÐԵȼ¶}]}
|
'''
|
|
helpDict = {}
|
billboardPack = None
|
globalDict = FBCommon.GetGameFBData(GameFBData_FamilyWarGlobal)
|
gameFB = GameWorld.GetGameFB()
|
lastHelpTick = gameFB.GetGameFBDictByKey(GameFBDict_HelpInfoTick)
|
# ÓÐÐÂÍæ¼Ò½øÈë »ò xÃëÇ¿ÖÆÍ¬²½Ò»´Î
|
if enterPlayer or tick - lastHelpTick >= 10000:
|
gameFB.SetGameFBDict(GameFBDict_HelpInfoTick, tick)
|
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
warFamilyA = GetFamilyWarFamily(familyIDA)
|
warFamilyB = GetFamilyWarFamily(familyIDB)
|
helpInfoList = []
|
for warFamily in [warFamilyA, warFamilyB]:
|
helpInfoList.append({"ResPoint":warFamily.GetResPoint(), "MemCount":warFamily.memCount,
|
"BuffResPoint":warFamily.randBuffResPoint, "BuffResPointPer":warFamily.GetBuffResPointPer(tick),
|
"BuffAttrLV":warFamily.randBuffAttrLV})
|
helpInfoListHis = globalDict[Global_HelpInfo]
|
if helpInfoList != helpInfoListHis:
|
globalDict[Global_HelpInfo] = helpInfoList
|
helpDict["familyWar_HelpInfo"] = helpInfoList
|
if enterHelpDict:
|
enterHelpDict["familyWar_HelpInfo"] = helpInfoList
|
|
billboardPack = GetFamilyWarBillboardPack(gameFB, SortFamilyWarPlayer(), tick)
|
|
# buffÐÅÏ¢
|
helpBuffList = []
|
for i in xrange(len(GetRandBuffPosList())):
|
objID = gameFB.GetGameFBDictByKey(GameFBDict_RandBuffObjID % i)
|
if not objID:
|
continue
|
curNPC = GameWorld.FindNPCByID(objID)
|
if not curNPC:
|
continue
|
isInAtk = int(curNPC.GetPlayerHurtList().GetHurtCount() > 0)
|
helpBuffList.append({"PosIndex":i, "NPCID":curNPC.GetNPCID(), "Atk":isInAtk})
|
helpBuffListHis = globalDict[Global_HelpBuff]
|
if helpBuffList != helpBuffListHis:
|
globalDict[Global_HelpBuff] = helpBuffList
|
helpDict["familyWar_Buff"] = helpBuffList
|
if enterHelpDict:
|
enterHelpDict["familyWar_Buff"] = helpBuffList
|
|
# Ë®¾§×ÊÔ´
|
familyIDA = gameFB.GetFamilyVS().GetFamilyID()
|
flagAtkList = []
|
factionFlagList = [[], []]
|
for npcID in GetResourceNPCIDList():
|
curNPC = GameWorld.FindNPCByNPCID(npcID)
|
if not curNPC:
|
continue
|
familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
if familyID:
|
factionIndex = 0 if familyID == familyIDA else 1
|
factionFlagList[factionIndex].append(npcID)
|
if curNPC.GetPlayerHurtList().GetHurtCount() > 0:
|
flagAtkList.append(npcID)
|
|
# Õ¼ÁìË®¾§
|
helpCrystal = {ShareDefine.CampType_Justice:factionFlagList[0], ShareDefine.CampType_Evil:factionFlagList[1]} # {ÕóÓª:[Õ¼ÁìNPCID, ...], ...}
|
crystalHis = globalDict[Global_HelpCrystal]
|
if factionFlagList != crystalHis:
|
globalDict[Global_HelpCrystal] = factionFlagList
|
helpDict["familyWar_Crystal"] = helpCrystal
|
if enterHelpDict:
|
enterHelpDict["familyWar_Crystal"] = helpCrystal
|
|
# ¹¥»÷Ë®¾§
|
crystalAtkHis = globalDict[Global_HelpCrystalAtk]
|
if flagAtkList != crystalAtkHis:
|
globalDict[Global_HelpCrystalAtk] = flagAtkList
|
helpDict["familyWar_CrystalAtk"] = flagAtkList
|
if enterHelpDict:
|
enterHelpDict["familyWar_CrystalAtk"] = flagAtkList
|
|
isBillPackChange = False
|
if billboardPack:
|
billBuff = billboardPack.GetBuffer()
|
lastBillBuff = globalDict[Global_BillboardBuff]
|
if billBuff != lastBillBuff:
|
globalDict[Global_BillboardBuff] = billBuff
|
isBillPackChange = True
|
GameWorld.DebugLog("isBillPackChange=%s" % isBillPackChange)
|
|
if enterPlayer or isBillPackChange or helpDict:
|
enterPlayerID = 0 if not enterPlayer else enterPlayer.GetPlayerID()
|
playerManager = GameWorld.GetMapCopyPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
player = playerManager.GetPlayerByIndex(index)
|
if not player:
|
continue
|
playerID = player.GetPlayerID()
|
if not playerID:
|
continue
|
|
if playerID == enterPlayerID:
|
FBCommon.NotifyFBHelp(player, 0, enterHelpDict)
|
NetPackCommon.SendFakePack(player, billboardPack)
|
continue
|
|
if helpDict:
|
FBCommon.NotifyFBHelp(player, 0, helpDict)
|
|
if isBillPackChange:
|
NetPackCommon.SendFakePack(player, billboardPack)
|
return
|
|
##Íæ¼ÒÍ˳ö¸±±¾
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
def DoExitFB(curPlayer, tick):
|
fbStep = GameWorld.GetGameFB().GetFBStep()
|
if fbStep >= FB_Step_LeaveTime:
|
if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1:
|
GameWorldProcess.CloseFB(tick)
|
FBCommon.SetFBStep(FB_Step_Over, tick)
|
return
|
|
playerID = curPlayer.GetPlayerID()
|
warPlayer = GetFamilyWarPlayer(playerID)
|
familyID = warPlayer.familyID # ÕâÀïÈ¡familyID·½Ê½ÌØÊâ´¦Àí£¬·ÀÖ¹Íæ¼ÒÒì³£À뿪ÏÉÃ˱»Ìß³ö¸±±¾Ê±µ¼ÖÂÔÏÉÃËÈËÊý²»»á-1
|
warFamily = GetFamilyWarFamily(familyID)
|
warFamily.memCount = max(0, warFamily.memCount - 1)
|
GameWorld.Log("DoExitFB ÏÉÃËÕ½³¡ÈËÊý¼õ1, familyID=%s,memCount=%s" % (familyID, warFamily.memCount), playerID)
|
|
# ÒòΪÊǽµbuffµÈ¼¶£¬ËùÒÔÐèÒªÏÈɾ³ý
|
__AddFamilyWarBuff(familyID, ChConfig.Def_SkillID_FamilyWar_JoinBuff, tick, warFamily.memCount, True)
|
return
|
|
def OnProcess(tick):
|
fbStep = GameWorld.GetGameFB().GetFBStep()
|
|
# ¸±±¾×¼±¸
|
if fbStep == FB_Step_Prepare:
|
__DoLogic_FB_Prepare(tick)
|
|
# ¸±±¾½øÐÐÖÐ
|
elif fbStep == FB_Step_Fighting:
|
__DoLogic_FB_Fighting(tick)
|
|
# ¸±±¾½áÊø
|
elif fbStep == FB_Step_LeaveTime:
|
__DoLogic_FB_Over(tick)
|
|
return
|
|
def __DoLogic_FB_Prepare(tick):
|
|
remaindTick = GetFWarStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
if remaindTick > 0:
|
return
|
|
barrierPointList = GetBarrierPointList()
|
#¹Ø±Õ¶¯Ì¬Õϰµã
|
FBCommon.SyncDynamicBarrierState(barrierPointList, 0)
|
|
FBCommon.SetFBStep(FB_Step_Fighting, tick)
|
|
factionAreaInfo = GetFactionArea()
|
maxDistList = []
|
for i, pointList in enumerate(barrierPointList):
|
centrePosX, centrePosY = factionAreaInfo[i][:2]
|
dist1 = GameWorld.GetDist(centrePosX, centrePosY, pointList[0], pointList[1])
|
dist2 = GameWorld.GetDist(centrePosX, centrePosY, pointList[2], pointList[3])
|
maxDistList.append(max(dist1, dist2))
|
|
fightTime = GetFWarStepTime()[Time_Fight] * 1000
|
playerManager = GameWorld.GetMapCopyPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
if not playerID:
|
continue
|
curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, fightTime, True)
|
|
warPlayer = GetFamilyWarPlayer(playerID)
|
warPlayer.calcFightTimeTick = tick
|
|
faction = curPlayer.GetFaction()
|
if not faction:
|
GameWorld.Log("»¹Î´ÉèÖÃÕóÓªµÄÍæ¼ÒÔݲ»´¦Àí£¡¿ÉÄÜÊÇDoEnterÖУ¡", playerID)
|
continue
|
# ¼ì²é×ø±ê£¬·ÀÖ¹×÷±×
|
factionIndex = GetFactionIndex(faction)
|
centrePosX, centrePosY, radius = factionAreaInfo[factionIndex]
|
curPosX, curPosY = curPlayer.GetPosX(), curPlayer.GetPosY()
|
dist = GameWorld.GetDist(curPosX, curPosY, centrePosX, centrePosY)
|
maxDist = maxDistList[factionIndex]
|
# ÅжϾàÀë
|
if dist > maxDist:
|
posPoint = GameMap.GetEmptyPlaceInArea(centrePosX, centrePosY, radius)
|
curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY())
|
GameWorld.Log("Íæ¼Ò²»ÔÚÓªµØ·¶Î§ÄÚ£¬Ç¿ÖÆÀ»Ø£¡faction=%s,curPos=(%s,%s),centerPos=(%s,%s), dist=%s > maxDist=%s"
|
% (faction, curPosX, curPosY, centrePosX, centrePosY, dist, maxDist), playerID)
|
return
|
|
def __DoLogic_FB_Fighting(tick):
|
__NotifyWarHelp_Info(tick)
|
__AddPlayerFightTimeByTime(tick) # ¸üÐÂÍæ¼ÒÕ½¶·Ê±³¤
|
if __AddFamilyResPointByTime(tick):
|
return
|
|
remaindTick = GetFWarStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
if remaindTick > 0:
|
__RefreshRandBuff(tick)
|
return
|
|
__DoLogicFamilyWarOver(tick) # Ö´ÐбÈÈü½áÊøÂß¼
|
return
|
|
def __AddPlayerFightTimeByTime(tick):
|
# ¸üÐÂÍæ¼ÒÕ½¶·Ê±³¤
|
|
restoreHPPerBySecond = IpyGameDataPY.GetFuncCfg("FamilyMatchSpawnPoint", 4) # ÿÃë»ØÑª°Ù·Ö±È
|
factionSafeAreaRandPosList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSpawnPoint", 3) # ÓªµØ×ø±ê
|
|
playerManager = GameWorld.GetMapCopyPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
if not playerID:
|
continue
|
warPlayer = GetFamilyWarPlayer(playerID)
|
|
faction = curPlayer.GetFaction()
|
if faction and faction <= len(factionSafeAreaRandPosList):
|
safePosX, safePosY, safeRadius = factionSafeAreaRandPosList[faction - 1]
|
if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), safePosX, safePosY) <= safeRadius:
|
# ÓªµØ»ØÑª
|
restoreSeconds = (tick - warPlayer.restoreHPTick) / 1000.0 if warPlayer.restoreHPTick else 1 # Ê״α£µ×1Ãë
|
if restoreSeconds >= 1:
|
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)
|
warPlayer.restoreHPTick = tick
|
else:
|
warPlayer.restoreHPTick = 0
|
|
lastCalcTick = warPlayer.calcFightTimeTick
|
warPlayer.calcFightTimeTick = tick
|
if not lastCalcTick:
|
continue
|
addTick = tick - lastCalcTick
|
lastFightMinute = warPlayer.fightTime / 60000 # ÒѾս¶··ÖÖÓÊý
|
warPlayer.fightTime += addTick
|
updFightMinute = warPlayer.fightTime / 60000 # ¸üÐÂÕ½¶··ÖÖÓÊý
|
addFightMinute = updFightMinute - lastFightMinute
|
# Âú·ÖÖӲżÓ
|
if not addFightMinute:
|
continue
|
addScore = GetScorePerMinute() * addFightMinute
|
warPlayer.score += addScore
|
#GameWorld.DebugLog("¶¨Ê±Ôö¼ÓÍæ¼Ò»ý·Ö: fightTime=%s,addScore=%s,updScore=%s"
|
# % (warPlayer.fightTime, addScore, warPlayer.score), playerID)
|
return
|
|
def __AddFamilyResPointByTime(tick):
|
# ¶¨Ê±Ôö¼Ó×ÊÔ´µã
|
# @return: ÊÇ·ñÓÐÏÉÃË»ñʤ
|
|
resPointPerSecond = GetResourcePointPerSecond()
|
pointMultipleDict = GetResourcePointMultiple()
|
gameFB = GameWorld.GetGameFB()
|
resourceNPCIDList = GetResourceNPCIDList()
|
addResPointDict = {} # Ôö¼ÓµÄ×ÊÔ´µã×ÜÊý {familyID:addPoint, ...}
|
for npcID in resourceNPCIDList:
|
pointTick = gameFB.GetGameFBDictByKey(GameFBDict_FamilyResPointTick % npcID)
|
familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
if not pointTick or not familyID:
|
continue
|
# ÿÃë¼Ó»ý·Ö, ÔÝдËÀ
|
addTime = (tick - pointTick) / 1000
|
if not addTime:
|
continue
|
gameFB.SetGameFBDict(GameFBDict_FamilyResPointTick % npcID, tick)
|
|
addPoint = resPointPerSecond * addTime
|
if npcID in pointMultipleDict:
|
addPoint = int(math.ceil(addPoint * pointMultipleDict[npcID]))
|
#GameWorld.DebugLog("ÌØÊâË®¾§Ôö¼Ó×ÊÔ´µã: resPointPerSecond=%s,addTime=%s,addPoint=%s" % (resPointPerSecond, addTime, addPoint))
|
addResPointDict[familyID] = addResPointDict.get(familyID, 0) + addPoint
|
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
warFamilyA = GetFamilyWarFamily(familyIDA)
|
warFamilyB = GetFamilyWarFamily(familyIDB)
|
|
buffResPointPerA = warFamilyA.GetBuffResPointPer(tick)
|
buffResPointPerB = warFamilyB.GetBuffResPointPer(tick)
|
addResPointA = addResPointDict.get(familyIDA, 0) * (10000 + buffResPointPerA) / 10000.0 # ²»È¡Õû£¬Ö§³ÖСÊý
|
addResPointB = addResPointDict.get(familyIDB, 0) * (10000 + buffResPointPerB) / 10000.0 # ²»È¡Õû£¬Ö§³ÖСÊý
|
resPointA = warFamilyA.AddResPoint(addResPointA)
|
resPointB = warFamilyB.AddResPoint(addResPointB)
|
|
resWinPoint = GetResourceWinPoint()
|
#if addResPointDict:
|
# GameWorld.DebugLog("Ôö¼ÓÏÉÃË×ÊÔ´: addResPointDict=%s,buffResPointPerAB(%s, %s),addResPointAB=(%s, %s),updResPointAB=(%s, %s)"
|
# % (addResPointDict, buffResPointPerA, buffResPointPerB, addResPointA, addResPointB, resPointA, resPointB))
|
#else:
|
# GameWorld.DebugLog("ûÏÉÃËÔö¼Ó×ÊÔ´")
|
if resPointA < resWinPoint and resPointB < resWinPoint:
|
#GameWorld.DebugLog("ûÓÐÏÉÃ˵½´ï»ñʤ×ÊÔ´µã£¡")
|
return
|
|
GameWorld.Log("ÓÐÏÉÃË×ÊÔ´µãµ½´ïʤÀûÌõ¼þ, ±ÈÈü½áÊø!familyIDA=%s,resPointA=%s VS familyIDB=%s,resPointB=%s,resWinPoint=%s"
|
% (familyIDA, resPointA, familyIDB, resPointB, resWinPoint))
|
__DoLogicFamilyWarOver(tick) # Ö´ÐбÈÈü½áÊøÂß¼
|
return True
|
|
def __AddFamilyResPoint(warFamily, resPointAdd, tick):
|
# Ôö¼Ó×ÊÔ´µã£¬´ËÇé¿öÊÊÓÃÓÚ²»ÊÇÁ½¸öÏÉÃËͬʱ´¥·¢µÄ£¬¼ÓÍêºóÁ¢¼´ÅжÏÊÇ·ñ»ñʤ
|
|
resPoint = warFamily.AddResPoint(resPointAdd)
|
resWinPoint = GetResourceWinPoint()
|
GameWorld.DebugLog("Ôö¼Ó×ÊÔ´µã: familyID=%s,resPointAdd=%s£¬updPoint=%s,resWinPoint=%s"
|
% (warFamily.familyID, resPointAdd, resPoint, resWinPoint))
|
if resPoint >= resWinPoint:
|
__DoLogicFamilyWarOver(tick)
|
return
|
|
def __RefreshRandBuff(tick):
|
## Ëæ»úbuff
|
gameFB = GameWorld.GetGameFB()
|
lastRefreshTick = gameFB.GetGameFBDictByKey(GameFBDict_RandBuffRefreshTick)
|
if not lastRefreshTick:
|
gameFB.SetGameFBDict(GameFBDict_RandBuffRefreshTick, tick)
|
return
|
|
if tick - lastRefreshTick < GetRandBuffRefreshTime() * 1000:
|
return
|
|
lastCollectTick = gameFB.GetGameFBDictByKey(GameFBDict_RandBuffCollectTick)
|
if tick - lastCollectTick < 3000:
|
# ¸Õ±»²ÉÍê3ÃëÄÚ²»ÂíÉÏË¢£¬·ÀÖ¹Ò»²ÉÍê¾ÍÂíÉϳöÀ´buff£¬Óиö»º³å
|
return
|
|
randPosList = GetRandBuffPosList()
|
maxBuffCount = len(randPosList)
|
emptyBuffPosIndexList = range(maxBuffCount)
|
for i in xrange(maxBuffCount):
|
if gameFB.GetGameFBDictByKey(GameFBDict_RandBuffObjID % i):
|
emptyBuffPosIndexList.remove(i)
|
if not emptyBuffPosIndexList:
|
#GameWorld.DebugLog("³¬¹ý×î´óËæ»úbuffÊý£¬²»Ë¢Ð£¡")
|
return
|
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
randCount = min(GetRandBuffCount(), len(emptyBuffPosIndexList))
|
randNPCIDList = GetRandBuffNPCIDList()
|
for i in xrange(randCount):
|
randNPCID = random.choice(randNPCIDList)
|
randPosIndex = random.choice(emptyBuffPosIndexList)
|
randPosX, randPosY = randPosList[randPosIndex]
|
|
# ÕÙ»½³öËæ»úbuff
|
randBuffNPC = NPCCommon.SummonMapNpc(randNPCID, randPosX, randPosY)
|
if not randBuffNPC:
|
continue
|
emptyBuffPosIndexList.remove(randPosIndex)
|
buffObjID = randBuffNPC.GetID()
|
gameFB.SetGameFBDict(GameFBDict_RandBuffObjID % randPosIndex, buffObjID)
|
GameWorld.Log("Ë¢ÐÂËæ»úbuff: lineID=%s,randPosIndex=%s,randNPCID=%s,buffObjID=%s" % (lineID, randPosIndex, randNPCID, buffObjID))
|
|
# Ç¿Á¦BUFFÉú³ÉÔÚÕ½³¡ÄÚ£¬¿ì¿ìÈ¥Õù¶á
|
PlayerControl.FBNotify("FamilyMatchBuff")
|
gameFB.SetGameFBDict(GameFBDict_RandBuffRefreshTick, tick)
|
return
|
|
def __DoLogicFamilyWarOver(tick):
|
## ±ÈÈü½áÊøÂß¼
|
|
gameFB = GameWorld.GetGameFB()
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
|
vsFamilyIDList = [familyIDA, familyIDB]
|
vsFamilyIDList.sort(cmp=CmpFamilyWinner)
|
winnerFamilyID = vsFamilyIDList[0]
|
gameFB.SetGameFBDict(GameFBDict_WinnerFamilyID, winnerFamilyID)
|
isFinalMatch = gameFB.GetGameFBDictByKey(GameFBDict_IsFinalMatch)
|
roundNum = gameFB.GetGameFBDictByKey(GameFBDict_RoundNum)
|
groupID = gameFB.GetGameFBDictByKey(GameFBDict_GroupID)
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
|
winnerWarFamily = GetFamilyWarFamily(winnerFamilyID)
|
winFaction = winnerWarFamily.faction
|
winCount = winnerWarFamily.winCount + 1
|
|
GameWorld.Log("±ÈÈü½áÊø: isFinalMatch=%s,roundNum=%s,groupID=%s,familyIDA=%s VS familyIDB=%s,winnerFamilyID=%s,winFaction=%s,winCount=%s"
|
% (isFinalMatch, roundNum, groupID, familyIDA, familyIDB, winnerFamilyID, winFaction, winCount), lineID)
|
|
# ͬ²½GameServer ±ÈÈü½á¹û
|
msgInfo = str([familyIDA, familyIDB, winnerFamilyID, isFinalMatch])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'FamilyWarOver', msgInfo, len(msgInfo))
|
|
# »ñʤÏÉÃËÍæ¼Ò»ý·Ö¼Ó³É
|
winnerScoreAddPer = GetScoreWinerAddPer()
|
familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer)
|
for playerID, warPlayer in familyWarPlayerDict.items():
|
if warPlayer.familyID != winnerFamilyID:
|
continue
|
score = warPlayer.score
|
warPlayer.score = int(score * (100 + winnerScoreAddPer) / 100.0)
|
GameWorld.DebugLog(" »ñʤÏÉÃËÍæ¼Ò½áËã»ý·Ö¼Ó³É: familyID=%s,playerID=%s,score=%s,upScore=%s"
|
% (warPlayer.familyID, playerID, score, warPlayer.score), lineID)
|
|
rankAwardDict = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 1)
|
awardPerList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 2)
|
joinAwardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 3)
|
|
if groupID <= 0:
|
awardPer = awardPerList[0]
|
elif groupID > len(awardPerList):
|
awardPer = awardPerList[-1]
|
else:
|
awardPer = awardPerList[groupID - 1]
|
rankAwardDictCopy = {}
|
for rank, itemList in rankAwardDict.items():
|
copyItemList = []
|
for itemID, itemCount, isBind, isPer in itemList:
|
if isPer: # ½±Àø¸öÊýÊÇ·ñÊܰٷֱÈÓ°Ïì, ĬÈÏÊÜÓ°Ïì
|
copyItemList.append([itemID, max(1, int(itemCount * awardPer / 100.0)), isBind])
|
else:
|
copyItemList.append([itemID, itemCount, isBind])
|
rankAwardDictCopy[rank] = copyItemList
|
|
# ×î¸ß¼¶±ðÁªÈüµÚÒ»Ãû¶îÍâ½±Àø
|
winnerFirstAwardEx = [] # »ñʤ·½µÚÒ»Ãû¶îÍâ½±Àø
|
loserFirstAwardEx = [] # ʧ°Ü·½µÚÒ»Ãû¶îÍâ½±Àø
|
firstAwardEx, firstAwardEx2= [], []
|
if groupID == FamilyWar_MaxGroupID:
|
worldLv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
|
if isFinalMatch:
|
firstAwardExDict = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSRankOneReward", 1)
|
firstAwardExDict2 = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSRankOneReward", 2)
|
else:
|
firstAwardExDict = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankOneReward", 1)
|
firstAwardExDict2 = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankOneReward", 2)
|
firstAwardEx = GameWorld.GetOrderValueByDict(firstAwardExDict, worldLv)
|
firstAwardEx = [] if not firstAwardEx else firstAwardEx
|
GameWorld.Log("×î¸ß¼¶±ðÁªÈüʤÕßµÚÒ»Ãû¶îÍâ½±Àø: firstAwardEx=%s,firstAwardExDict=%s,worldLv=%s"
|
% (firstAwardEx, firstAwardExDict, worldLv), lineID)
|
firstAwardEx2 = GameWorld.GetOrderValueByDict(firstAwardExDict2, worldLv)
|
firstAwardEx2 = [] if not firstAwardEx2 else firstAwardEx2
|
GameWorld.Log("×î¸ß¼¶±ðÁªÈü°ÜÕßµÚÒ»Ãû¶îÍâ½±Àø: firstAwardEx2=%s,firstAwardExDict2=%s,worldLv=%s"
|
% (firstAwardEx2, firstAwardExDict2, worldLv), lineID)
|
|
GameWorld.Log("Ãû´Î½±ÀøÅäÖÃ: rankAwardDict=%s,awardPer=%s,rankAwardDictCopy=%s,firstAwardEx=%s,joinAwardItemList=%s"
|
% (rankAwardDict, awardPer, rankAwardDictCopy, firstAwardEx, joinAwardItemList), lineID)
|
|
# ´Ë´¦½áËã½±ÀøµÈ
|
joinPlayerIDList = [] # ²ÎÓëµÄÍæ¼ÒIDÁбí [playerID, ...]
|
championPlayerIDList = [] # ¹Ú¾üÍæ¼ÒIDÁбí [playerID, ...]
|
batchPlayerIDList, batchAddItemList, batchParamList = [], [], []
|
|
leaveTime = GetFWarStepTime()[Time_Leave] * 1000
|
sortWarPlayerList = SortFamilyWarPlayer()
|
billboardPack = GetFamilyWarBillboardPack(gameFB, sortWarPlayerList, tick, winFaction)
|
copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
|
for rank, warPlayer in enumerate(sortWarPlayerList, 1):
|
rankItemList = GameWorld.GetOrderValueByDict(rankAwardDictCopy, rank)
|
if firstAwardEx and not winnerFirstAwardEx and warPlayer.familyID == winnerFamilyID:
|
winnerFirstAwardEx = firstAwardEx
|
awardItemList = rankItemList + winnerFirstAwardEx
|
# <color=#44e863FF>%s0</color>ÔÚÏÉÃËÁªÈüÖбíÏÖÓÅÒ죬»ñµÃ¶îÍâ<color=#44e863FF><Word info=item id=%s1/></color>½±Àø
|
PlayerControl.WorldNotify(0, "FamilyMatchRankNoOne", [warPlayer.name, winnerFirstAwardEx[0][0]])
|
elif firstAwardEx2 and not loserFirstAwardEx and warPlayer.familyID != winnerFamilyID:
|
loserFirstAwardEx = firstAwardEx2
|
awardItemList = rankItemList + loserFirstAwardEx
|
PlayerControl.WorldNotify(0, "FamilyMatchRankNoOneLose", [warPlayer.name, loserFirstAwardEx[0][0]])
|
else:
|
awardItemList = rankItemList
|
playerID = warPlayer.playerID
|
GameWorld.Log(" ½±Àø:rank=%s,awardItemList=%s,playerID=%s,score=%s," % (rank, awardItemList, playerID, warPlayer.score), lineID)
|
batchPlayerIDList.append([playerID])
|
batchAddItemList.append(awardItemList)
|
batchParamList.append([rank])
|
joinPlayerIDList.append(playerID)
|
if isFinalMatch and warPlayer.familyID == winnerFamilyID:
|
championPlayerIDList.append(playerID)
|
|
player = copyPlayerMgr.FindPlayerByID(playerID)
|
if player:
|
NetPackCommon.SendFakePack(player, billboardPack)
|
player.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTime, True)
|
PlayerFamily.AddFamilyActivity(player, ShareDefine.FamilyActive_War)
|
|
# ÅÅÃû½±ÀøÓʼþ
|
PlayerControl.SendMailBatch("FamilyMatchRankMail", batchPlayerIDList, batchAddItemList, batchParamList)
|
# ²ÎÓë½±Óʼþ
|
PlayerControl.SendMailByKey("FamilyMatchJoinMail", joinPlayerIDList, joinAwardItemList)
|
# ³ÆºÅÓʼþ, Çø·ÖÃËÖ÷Óë³ÉÔ±£¬¸ÄΪʵʱ¸üÐÂ
|
#if championPlayerIDList:
|
# titleItemID = IpyGameDataPY.GetFuncCfg("FamilyMatchDayReward", 2)
|
# PlayerControl.SendMailByKey("FamilyMatchTitleMail", championPlayerIDList, [[titleItemID, 1, 1]])
|
|
FBCommon.SetFBStep(FB_Step_LeaveTime, tick)
|
return
|
|
def CmpFamilyWinner(familyIDA, familyIDB):
|
## »ñʤÅÅÐò¹æÔò: ×ÊÔ´µã > Õ¼ÁìË®¾§Êý > Õ½³¡ÖÐÏÉÃËÈËÊý > ÏÉÃËÁбíÖÐÅÅÃû
|
|
lineID = GameWorld.GetGameWorld().GetLineID()
|
# ×ÊÔ´µã
|
resPointA = GetFamilyWarFamily(familyIDA).GetResPoint()
|
resPointB = GetFamilyWarFamily(familyIDB).GetResPoint()
|
cmpRet = cmp(resPointB, resPointA) # µ¹Ðò
|
GameWorld.Log(" ×ÊÔ´µãÊý: familyIDA=%s,familyIDB=%s,resPointB=%s,resPointA=%s,cmpRet=%s"
|
% (familyIDA, familyIDB, resPointB, resPointA, cmpRet), lineID)
|
if cmpRet != 0:
|
return cmpRet
|
|
gameFB = GameWorld.GetGameFB()
|
# Õ¼ÁìË®¾§Êý
|
getFlagCountA = 0
|
getFlagCountB = 0
|
resourceNPCIDList = GetResourceNPCIDList()
|
for npcID in resourceNPCIDList:
|
familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
if not familyID:
|
continue
|
if familyID == familyIDA:
|
getFlagCountA += 1
|
if familyID == familyIDB:
|
getFlagCountB += 1
|
cmpRet = cmp(getFlagCountB, getFlagCountA) # µ¹Ðò
|
GameWorld.Log(" Õ¼ÁìË®¾§Êý: getFlagCountB=%s,getFlagCountA=%s,cmpRet=%s" % (getFlagCountB, getFlagCountA, cmpRet), lineID)
|
if cmpRet != 0:
|
return cmpRet
|
|
# Õ½³¡ÖÐÏÉÃËÈËÊý
|
familyPlayerCountA = 0
|
familyPlayerCountB = 0
|
copyPlayerMgr = GameWorld.GetMapCopyPlayerManager()
|
for index in xrange(copyPlayerMgr.GetPlayerCount()):
|
player = copyPlayerMgr.GetPlayerByIndex(index)
|
if not player:
|
continue
|
familyID = player.GetFamilyID()
|
if not familyID:
|
continue
|
if familyID == familyIDA:
|
familyPlayerCountA += 1
|
if familyID == familyIDB:
|
familyPlayerCountB += 1
|
cmpRet = cmp(familyPlayerCountB, familyPlayerCountA) # µ¹Ðò
|
GameWorld.Log(" Õ½³¡ÖÐÏÉÃËÈËÊý: familyPlayerCountB=%s,familyPlayerCountA=%s,cmpRet=%s" % (familyPlayerCountB, familyPlayerCountA, cmpRet), lineID)
|
if cmpRet != 0:
|
return cmpRet
|
|
# ÏÉÃËÁбíÖÐÅÅÃû, Ò»¶¨ÊDz»Ò»ÑùµÄ
|
familyRankA = GetFamilyWarFamily(familyIDA).rank
|
familyRankB = GetFamilyWarFamily(familyIDB).rank
|
cmpRet = cmp(familyRankA, familyRankB) # ÕýÐò
|
GameWorld.Log(" ÏÉÃËÁбíÖÐÅÅÃû: familyRankA=%s,familyRankB=%s,cmpRet=%s" % (familyRankA, familyRankB, cmpRet), lineID)
|
return cmpRet
|
|
def __DoLogic_FB_Over(tick):
|
remaindTick = GetFWarStepTime()[Time_Leave] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
if remaindTick > 0:
|
return
|
|
GameWorldProcess.CloseFB(tick)
|
FBCommon.SetFBStep(FB_Step_Over, tick)
|
return
|
|
## ÊÇ·ñ¸±±¾¸´»î
|
def OnPlayerReborn():
|
return True
|
|
## ÖØÖø±±¾¸´»îÍæ¼Ò×ø±êµã
|
def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):
|
gameFB = GameWorld.GetGameFB()
|
faction = curPlayer.GetFaction()
|
factionIndex = GetFactionIndex(faction)
|
posRankList = GetResourceRebornRank()[factionIndex]
|
resNPCIDList = GetResourceNPCIDList()
|
resRebornPosList = GetResourceRebornPosList()
|
playerFamilyID = curPlayer.GetFamilyID()
|
if len(resNPCIDList) != len(resRebornPosList):
|
return
|
|
for posRank in posRankList:
|
index = posRank - 1
|
if index < 0 or index >= len(resNPCIDList):
|
continue
|
npcID = resNPCIDList[index]
|
flagFamilyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
if playerFamilyID != flagFamilyID:
|
#GameWorld.DebugLog("²»ÊÇÍæ¼ÒËùÊôÏÉÃËÕ¼ÁìµÄ×ÊÔ´£¡playerFamilyID=%s,flagFamilyID=%s,npcID=%s"
|
# % (playerFamilyID, flagFamilyID, npcID))
|
continue
|
randPosX, randPosY, randDist = random.choice(resRebornPosList[index])
|
posPoint = GameMap.GetEmptyPlaceInArea(randPosX, randPosY, randDist)
|
curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY())
|
GameWorld.DebugLog("Íæ¼ÒÓÅÏȸ´»îµã: faction=%s,posNum=%s,npcID=%s" % (faction, posRank, npcID))
|
return
|
|
# ĬÈÏÓªµØ
|
centrePosX, centrePosY, radius = GetFactionArea()[factionIndex]
|
posPoint = GameMap.GetEmptyPlaceInArea(centrePosX, centrePosY, radius)
|
curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY())
|
GameWorld.DebugLog("Íæ¼ÒÓªµØ¸´»î: faction=%s" % (faction))
|
return
|
|
##´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼
|
def DoFBOnKill_Player(curPlayer, defender, tick):
|
playerID = curPlayer.GetPlayerID()
|
|
killPlayerScore = GetScoreKillPlayer()
|
warPlayer = GetFamilyWarPlayer(playerID)
|
warPlayer.killPlayerCount += 1
|
warPlayer.score += killPlayerScore
|
GameWorld.DebugLog("»÷É±Íæ¼Ò: addScore=%s,score=%s,killPlayerCount=%s"
|
% (killPlayerScore, warPlayer.score, warPlayer.killPlayerCount), playerID)
|
return True
|
|
#¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË
|
##ÅжÏÊÇ·ñÓѺùØÏµ£¬¸Ã²ãÅж¨ÎªÓѺÃÂß¼ÖеÄ×îºóÅжÏ
|
def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer):
|
return not __CanAttackPlayer(curPlayer, curTagPlayer)
|
|
##¸±±¾ÖÐ,¹¥»÷¶ÓÓÑÂß¼
|
def DoCanAttackTeamer(curPlayer, curTagPlayer):
|
return __CanAttackPlayer(curPlayer, curTagPlayer)
|
|
def __CanAttackPlayer(curPlayer, curTagPlayer):
|
if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting:
|
return False
|
return curPlayer.GetFamilyID() != curTagPlayer.GetFamilyID()
|
|
## Íæ¼Ò¹¥»÷Íæ¼ÒÊÇ·ñÓгͷ£
|
def DoFBAttackHasPunish(atkPlayer, defPlayer):
|
return False
|
|
## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨
|
def CheckCanAttackTagObjInFB(attacker, defender):
|
if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting:
|
return False
|
return True
|
|
##ÊÇ·ñ¿ÉÒÔ¶áÆì
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param curNPC NPCʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
# @remarks
|
def OnCanCollect(curPlayer, curNPC, tick):
|
npcID = curNPC.GetNPCID()
|
familyID = curPlayer.GetFamilyID()
|
|
GameWorld.DebugLog("OnCanCollect npcID=%s,familyID=%s" % (npcID, familyID), curPlayer.GetPlayerID())
|
if not familyID:
|
return False
|
|
gameFB = GameWorld.GetGameFB()
|
fbStep = gameFB.GetFBStep()
|
|
# ·ÇÕ½¶·½×¶Î²»¿É²É¼¯
|
if fbStep != FB_Step_Fighting:
|
PlayerControl.NotifyCode(curPlayer, "NotFightStepCanNotCollect")
|
return False
|
|
if npcID in GetResourceNPCIDList():
|
# ÒÑ»ñµÃÕ½ÆìµÄÕ½Ã˲»¿É²É¼¯
|
getFlagFamilyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
if getFlagFamilyID == familyID:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_976459")
|
return False
|
|
return True
|
|
##¸±±¾ÖÐ,Õ¼ÁìNPCµÄLoadingʱ¼ä.
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param curNPC NPCʵÀý
|
# @return ·µ»ØÖµ, Loadingʱ¼ä
|
# @remarks ¸±±¾ÖÐ,Õ¼ÁìNPCµÄLoadingʱ¼ä
|
def GetFBPrepareTime(curPlayer, curNPC):
|
npcID = curNPC.GetNPCID()
|
playerID = curPlayer.GetPlayerID()
|
collectTimeList = GetCollectTimeList()
|
cfgIndex = 1 if npcID in GetRandBuffNPCIDList() else 0
|
|
tick = GameWorld.GetGameWorld().GetTick()
|
warPlayer = GetFamilyWarPlayer(playerID)
|
warPlayer.collectTypeIndex = cfgIndex
|
warPlayer.collectLostHPTick = tick
|
|
prepareTime = collectTimeList[cfgIndex] * 1000
|
GameWorld.DebugLog("CollectPrepare npcID=%s,cfgIndex=%s,tick=%s,prepareTime=%s" % (npcID, cfgIndex, tick, prepareTime))
|
return prepareTime
|
|
## ÊÕ¼¯ÖÐ
|
def OnCollecting(curPlayer, tick):
|
playerID = curPlayer.GetPlayerID()
|
warPlayer = GetFamilyWarPlayer(playerID)
|
|
## ÿÃëµôѪ£¬ÔÝдËÀ
|
lostTime = (tick - warPlayer.collectLostHPTick) / 1000 # µôѪ´ÎÊý
|
if not lostTime:
|
return
|
warPlayer.collectLostHPTick = tick
|
|
lostHPPerList = GetCollectLostHPPerList()
|
lostHPPer = lostHPPerList[warPlayer.collectTypeIndex]
|
skillTypeID, buffOwner = 0, None
|
lostValue = int(GameObj.GetMaxHP(curPlayer) * lostHPPer / 100.0) * lostTime
|
#GameWorld.DebugLog("OnCollecting lostHPPer=%s,lostTime=%s,lostValue=%s" % (lostHPPer, lostTime, lostValue), playerID)
|
SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick, skillAffect=False)
|
return
|
|
|
##Íæ¼ÒÊÕ¼¯³É¹¦(Ëþ, Æì)
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ÎÞÒâÒå
|
# @remarks
|
def OnCollectOK(curPlayer, npcID, tick):
|
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 GetResourceNPCIDList():
|
__OnCollectOK_Resource(curPlayer, curNPC, tick)
|
|
# Ëæ»úbuff
|
else:
|
__OnCollectOK_Buff(curPlayer, curNPC, tick)
|
return
|
|
def __OnCollectOK_Resource(curPlayer, curNPC, tick):
|
objID = curNPC.GetID()
|
npcID = curNPC.GetNPCID()
|
playerID = curPlayer.GetPlayerID()
|
familyID = curPlayer.GetFamilyID()
|
GameWorld.Log("²É¼¯Ë®¾§ objID=%s,npcID=%s,familyID=%s" % (objID, npcID, familyID), playerID)
|
|
gameFB = GameWorld.GetGameFB()
|
lastFlagFamilyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
nextFlagFamilyID = familyID
|
if lastFlagFamilyID == nextFlagFamilyID:
|
return
|
|
# ¸üÐÂÕ½Æì¹éÊôÐÅÏ¢
|
gameFB.SetGameFBDict(GameFBDict_GetFlagFamilyID % npcID, nextFlagFamilyID)
|
gameFB.SetGameFBDict(GameFBDict_FamilyResPointTick % npcID, tick)
|
|
collRescourceScoreDict = GetScoreCollectRescource()
|
if npcID in collRescourceScoreDict:
|
collRescourceScore = collRescourceScoreDict[npcID]
|
else:
|
collRescourceScore = collRescourceScoreDict[0]
|
warPlayer = GetFamilyWarPlayer(playerID)
|
warPlayer.collResourceCount += 1
|
warPlayer.score += collRescourceScore
|
GameWorld.DebugLog(" Íæ¼ÒÕ¼ÁìË®¾§: addScore=%s,score=%s,collResourceCount=%s"
|
% (collRescourceScore, warPlayer.score, warPlayer.collResourceCount), playerID)
|
|
# Õ¼Áì¹ã²¥¸ø¶ÔÊÖÕóÓª
|
# ÓÐÒ»¸ö×ÊÔ´Ë®¾§±»µÐ·½Õ¼ÁìÁË£¬¿ìÈ¥ÇÀ¶á»ØÀ´
|
PlayerControl.FBFactionNotifyOther(curPlayer.GetFaction(), "FamilyMatchOccupied")
|
return
|
|
def __OnCollectOK_Buff(curPlayer, curNPC, tick):
|
|
objID = curNPC.GetID()
|
npcID = curNPC.GetNPCID()
|
playerID = curPlayer.GetPlayerID()
|
familyID = curPlayer.GetFamilyID()
|
gameFB = GameWorld.GetGameFB()
|
|
# ÉèÖÃbuff±»²É¼¯
|
gameFB.SetGameFBDict(GameFBDict_RandBuffCollectTick, tick)
|
for i in xrange(len(GetRandBuffPosList())):
|
if objID == gameFB.GetGameFBDictByKey(GameFBDict_RandBuffObjID % i):
|
gameFB.SetGameFBDict(GameFBDict_RandBuffObjID % i, 0)
|
break
|
|
collBuffScore = GetScoreCollectRandBuff()
|
warPlayer = GetFamilyWarPlayer(playerID)
|
warPlayer.collRandBuffCount += 1
|
warPlayer.score += collBuffScore
|
GameWorld.DebugLog(" Íæ¼ÒÕ¼ÁìBuff: addScore=%s,score=%s,collRandBuffCount=%s"
|
% (collBuffScore, warPlayer.score, warPlayer.collRandBuffCount), playerID)
|
|
warFamily = GetFamilyWarFamily(familyID)
|
# Ôö¼ÓbuffЧ¹û
|
buffSkill = curNPC.GetSkillManager().GetSkillByIndex(0)
|
if buffSkill:
|
buffSkillTypeID = buffSkill.GetSkillTypeID()
|
GameWorld.Log("²É¼¯buff objID=%s,npcID=%s,familyID=%s,buffSkillTypeID=%s"
|
% (objID, npcID, familyID, buffSkillTypeID), curPlayer.GetPlayerID())
|
if buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_ResPointAdd:
|
resPointAdd = buffSkill.GetEffect(0).GetEffectValue(0)
|
warFamily.randBuffResPoint += resPointAdd
|
__AddFamilyResPoint(warFamily, resPointAdd, tick)
|
elif buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_ResPointAddPer:
|
warFamily.randBuffResPointPerDict[tick] = [buffSkill.GetLastTime(), buffSkill.GetEffect(0).GetEffectValue(0)]
|
elif buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_RandBuffAttr:
|
warFamily.randBuffAttrLV += 1
|
__AddFamilyWarBuff(familyID, buffSkillTypeID, tick, warFamily.randBuffAttrLV)
|
elif buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_OwnerlessBuff:
|
familyVsMgr = gameFB.GetFamilyVS()
|
familyIDA = familyVsMgr.GetFamilyID()
|
familyIDB = familyVsMgr.GetVSFamilyID()
|
tagFamilyID = familyIDB if familyID == familyIDA else familyIDA
|
__RandBuffOwnerless(warFamily.faction, familyID, tagFamilyID, buffSkill.GetEffect(0).GetEffectValue(0))
|
else:
|
GameWorld.ErrLog("²»Ö§³Ö¸ÃËæ»úbuffЧ¹û£¡npcID=%s,buffSkillTypeID=%s" % (npcID, buffSkillTypeID))
|
|
# <color=#44e863FF><Word info=Skill ID=%s0/></color>BUFFÒѱ»¼º·½ÏÉÃË»ñµÃ£¬Ê¿Æø´óÕÇ
|
# <color=#44e863FF><Word info=Skill ID=%s0/></color>BUFFÒѱ»µÐ·½ÏÉÃË»ñµÃ£¬Å¬Á¦Õù¶áÏÂÒ»¸ö£¬²»ÒªÆøÄÙ
|
PlayerControl.FBFactionNotify(curPlayer.GetFaction(), "FamilyMatchBuffOccupied", [buffSkillTypeID],
|
"FamilyMatchBuffOccupiedEnimy", [buffSkillTypeID])
|
else:
|
GameWorld.ErrLog("Ëæ»úbuffûÅäÖòɼ¯Ð§¹û£¡npcID=%s" % npcID)
|
|
NPCCommon.SetDeadEx(curNPC)
|
return
|
|
def __AddFamilyWarBuff(familyID, buffSkillTypeID, tick, skillLV=None, isDelFirst=False):
|
## ¸øÏÉÃ˳ÉÔ±¼Óbuff
|
buffSkill = GameWorld.GetGameData().GetSkillBySkillID(buffSkillTypeID)
|
if not buffSkill:
|
return
|
GameWorld.DebugLog("ÏÉÃ˳ÉÔ±¼ÓBuff(%s): familyID=%s,buffSkillTypeID=%s,skillLV=%s,isDelFirst=%s"
|
% (buffSkill.GetSkillName(), familyID, buffSkillTypeID, skillLV, isDelFirst))
|
maxSkillLV = buffSkill.GetSkillMaxLV()
|
if skillLV > maxSkillLV:
|
skillLV = maxSkillLV
|
GameWorld.DebugLog(" ³¬¹ý×î´ó¼¼Äܵȼ¶£¬È¡×î´ó¼¼Äܵȼ¶!skillLV=%s" % skillLV)
|
|
playerManager = GameWorld.GetMapCopyPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
if not playerID:
|
continue
|
if curPlayer.GetFamilyID() != familyID:
|
continue
|
#Ìí¼Ó½ÏµÍ¼¶µÄbuff£¬ÐèÒªÏÈɾ³ý
|
if isDelFirst:
|
BuffSkill.DelBuffBySkillID(curPlayer, buffSkillTypeID, tick)
|
SkillCommon.AddBuffBySkillType(curPlayer, buffSkillTypeID, tick, skillLV)
|
|
return
|
|
def __RandBuffOwnerless(faction, curFamilyID, tagFamilyID, randCount):
|
# Ë®¾§×ÊÔ´
|
|
randResNPCIDList = []
|
gameFB = GameWorld.GetGameFB()
|
for npcID in GetResourceNPCIDList():
|
curNPC = GameWorld.FindNPCByNPCID(npcID)
|
if not curNPC:
|
continue
|
familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID)
|
if not familyID:
|
continue
|
|
if familyID == tagFamilyID:
|
randResNPCIDList.append(npcID)
|
|
GameWorld.DebugLog("²É¼¯ÎÞÖ÷buff: curFamilyID=%s,tagFamilyID=%s,randResNPCIDList=%s"
|
% (curFamilyID, tagFamilyID, randResNPCIDList))
|
random.shuffle(randResNPCIDList)
|
GameWorld.DebugLog(" ´òÂÒºó: randResNPCIDList=%s,randCount=%s" % (randResNPCIDList, randCount))
|
|
ownerLessNPCIDList = randResNPCIDList[:randCount]
|
for npcID in ownerLessNPCIDList:
|
gameFB.SetGameFBDict(GameFBDict_GetFlagFamilyID % npcID, 0)
|
PlayerControl.FBFactionNotify(faction, "FamilyWarIneffctive1", [], "FamilyWarIneffctive2", [])
|
|
if not ownerLessNPCIDList:
|
PlayerControl.FBFactionNotify(faction, "FamilyWarIneffctive3", [], "FamilyWarIneffctive4", [])
|
return
|
|
## ------------------------------------------------------------------------
|
|
def GetChampionFamilyDailyReward(curPlayer):
|
## ¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø
|
|
playerID = curPlayer.GetPlayerID()
|
curFamilyID = curPlayer.GetFamilyID()
|
if not curFamilyID:
|
GameWorld.DebugLog("¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø£¬ÎÞÏÉÃË£¬²»¿ÉÁì½±!", playerID)
|
return
|
|
championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID)
|
if curFamilyID != championFamilyID:
|
GameWorld.DebugLog("¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø, Íæ¼ÒÏÉÃË·Ç»ñʤÏÉÃË£¬²»¿ÉÁì½±!championFamilyID=%s,curFamilyID=%s"
|
% (championFamilyID, curFamilyID), playerID)
|
return
|
|
dailyRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward)
|
if dailyRewardState:
|
# ÒÑÁìÈ¡¹ý¸Ã½±Àø
|
PlayerControl.NotifyCode(curPlayer, 'GeRen_admin_327925')
|
return
|
|
itemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchDayReward")
|
if not itemList:
|
return
|
|
needSpace = len(itemList)
|
# ±³°ü¿Õ¼ä
|
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if packSpace < needSpace:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580")
|
return
|
|
# ÉèÖÃÁì½±¼Ç¼Ϊ1£¬Í¨Öª¿Í»§¶Ë
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyWarDailyReward, 1)
|
|
Sync_ChampionFamilyDailyRewardState(curPlayer)
|
|
for itemID, itemCnt, isBind in itemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem])
|
|
GameWorld.DebugLog("ÁìÈ¡ÍõÕßÏÉÃËÿÈÕٺ»: itemList=%s" % itemList, playerID)
|
return
|
|
def Sync_ChampionFamilyDailyRewardState(curPlayer):
|
clientPack = ChPyNetSendPack.tagMCChampionFamilyDailyReward()
|
clientPack.GetState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
|