From eaacbe4d04de3500764587a6e0f3e3f22d1aba20 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 十二月 2025 17:43:08 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复貂蝉倾城潜能增加值计算;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 103 insertions(+), 9 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index b9e2f8a..3ee482d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -24,14 +24,16 @@
import ChPyNetSendPack
import PlayerFamilyEmblem
import PlayerFamilyZhenbaoge
+import PlayerFamilyTaofa
import IPY_PlayerDefine
import IpyGameDataPY
import IPY_GameWorld
import ItemControler
import GameFuncComm
+import PlayerMail
+import PlayerTask
import DBDataMgr
import DirtyList
-import ObjPool
import random
import time
@@ -81,8 +83,8 @@
family = familyManager.GetAt(i)
familyID = family.GetID()
- #珍宝阁
PlayerFamilyZhenbaoge.OnDay(family)
+ PlayerFamilyTaofa.OnDay(family)
for index in xrange(family.GetCount()):
member = family.GetAt(index)
@@ -94,11 +96,24 @@
return
+def FamilyOnHour():
+ if GameWorld.IsCrossServer():
+ return
+
+ familyManager = DBDataMgr.GetFamilyMgr()
+ for i in range(0, familyManager.GetCount()):
+ family = familyManager.GetAt(i)
+ #自动传位
+ __AutoChangeLeader(family)
+
+ return
+
def PlayerOnDay(curPlayer):
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
return
ResetDailyDonateCnt(curPlayer)
PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
+ PlayerFamilyTaofa.PlayerOnDay(curPlayer)
return
def OnPlayerLogin(curPlayer, tick):
@@ -108,6 +123,7 @@
Sync_RequestAddFamilyInfo(curPlayer, False)
SyncDonateCntInfo(curPlayer)
PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
+ PlayerFamilyTaofa.OnPlayerLogin(curPlayer)
return
def OnPlayerLogout(curPlayer):
@@ -461,6 +477,8 @@
familyMgr = DBDataMgr.GetFamilyMgr()
familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
Sync_RequestAddFamilyInfo(curPlayer)
+ PlayerFamilyTaofa.OnPlayerEnterFamily(curPlayer)
+ PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily)
return
def __OnLeaveFamily(curPlayer, isVoluntarily, tick):
@@ -495,6 +513,8 @@
delMoney = int(nowMoney * delMoneyPer / 100.0)
GameWorld.DebugLog(" 扣除货币: delMoneyType=%s,delMoneyPer=%s,nowMoney=%s,delMoney=%s" % (delMoneyType, delMoneyPer, nowMoney, delMoney))
PlayerControl.PayMoney(curPlayer, delMoneyType, delMoney, "LeaveFamily")
+
+ PlayerFamilyTaofa.OnPlayerLeaveFamily(curPlayer)
FBLogic.OnLeaveFamily(curPlayer, tick)
return
@@ -655,6 +675,7 @@
# 申请加入
if requestType == 0:
+ PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily, 1)
if not tagFamilyID:
AutoJoinFamily(curPlayer)
else:
@@ -711,17 +732,17 @@
family = familyMgr.GetAt(index)
if not family:
continue
- familyID = family.GetID()
+ #familyID = family.GetID()
lvMin = family.GetJoinLVMin()
if lvMin and realmLV < lvMin:
- GameWorld.DebugLog(" 官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
+ #GameWorld.DebugLog(" 官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
continue
if family.GetJoinReview():
- GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID)
+ #GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID)
continue
MemberMax = GetFamilySetting(family.GetLV(), "MemberMax")
if family.GetCount() >= MemberMax:
- GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID)
+ #GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID)
continue
#直接加入
@@ -1166,6 +1187,71 @@
#GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # 成员职位变更
return
+def __AutoChangeLeader(curFamily):
+ ## 自动传位
+ leaderID = curFamily.GetLeaderID()
+ leaderMem = curFamily.FindMember(leaderID)
+ if not leaderMem:
+ return
+ offTime = leaderMem.GetOffTime()
+ if not offTime:
+ return
+ familyID = curFamily.GetID()
+ curTime = int(time.time())
+ passTime = curTime - offTime
+ passHours = passTime / 3600.0
+ needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
+ if passHours < needHours:
+ GameWorld.DebugLogEx("盟主离线未超过限制小时,不处理自动传位!familyID=%s,leaderID=%s,offTime=%s,passHours=%s < %s",
+ familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, needHours)
+ return
+
+ priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1) # 优先传给离线不超过x小时的成员,一样按优先级
+
+ priorityList = []
+ commList = []
+ for i in range(0, curFamily.GetCount()):
+ member = curFamily.GetAt(i)
+ if member.GetFmLV() == IPY_PlayerDefine.fmlLeader:
+ continue
+
+ memOffTime = member.GetOffTime()
+ memPassTime = curTime - memOffTime
+ memPassHours = memPassTime / 3600.0
+ sortTime = memOffTime if memOffTime else curTime # 排序用的时间,越大越优先
+
+ fmLV = member.GetFmLV() # 职位
+ contribTotal = member.GetContribTotal() # 总贡献
+
+ commList.append([fmLV, sortTime, contribTotal, member])
+ if priorityHours and memPassHours <= priorityHours:
+ priorityList.append([fmLV, sortTime, contribTotal, member])
+
+ if not priorityList and not commList:
+ # 没有可传位的目标成员
+ return
+
+ toMember = None
+ if priorityList:
+ priorityList.sort(reverse=True)
+ toMember = priorityList[0][-1]
+ else:
+ commList.sort(reverse=True)
+ toMember = commList[0][-1]
+
+ if not toMember:
+ return
+
+ newLeaderID = toMember.GetPlayerID()
+ GameWorld.Log("公会自动传位: familyID=%s,leaderID=%s,offTime=%s,passHours=%s,newLeaderID=%s"
+ % (familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, newLeaderID))
+ ChangeFamilyLeader(curFamily, toMember)
+ Broadcast_FamilyChange(familyID, FamilyChangeType_LeaderChange, excludeIDList=[leaderID, newLeaderID])
+
+ # 邮件通知
+ PlayerMail.SendMailByKey("FamilyLeaderAutoChange", newLeaderID, [], [curFamily.GetName()])
+ return
+
#// A6 26 请求家族成员列表 #tagCMGetFamilyInfo
#
#struct tagCMGetFamilyInfo
@@ -1219,6 +1305,7 @@
#XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n> 25 - -
NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
+ __DoPlayerLeaveFamilyByID(family, playerID, curPlayer)
MapServer_FamilyRefresh(curPlayer, 0, 1)
if family.GetCount() == 0:
@@ -1284,10 +1371,16 @@
#删除玩家
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagMemberID)
+ __DoPlayerLeaveFamilyByID(family, tagPlayerID, tagPlayer)
if tagPlayer:
MapServer_FamilyRefresh(tagPlayer, 0)
Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave)
+ return
+
+def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, tagPlayer=None):
+ ## 有玩家离开家族处理,主要针对家族层级的,玩家个人的在 __OnLeaveFamily 处理
+ PlayerFamilyTaofa.OnFamilyMemberLeave(curFamily, leavePlayerID, tagPlayer)
return
#// A6 11 家族改名 #tagCMRenameFamily
@@ -1484,7 +1577,7 @@
curMember.SetDonateCntTotal(memDonateCntTotal)
GameWorld.DebugLog("家族捐献: donateType=%s,donateCnt=%s,%s,memDonateCntDay=%s,memDonateCntDay=%s"
% (donateType, donateCnt, awardItemList, memDonateCntDay, memDonateCntTotal), playerID)
- ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList)
+ ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FamilyMoneyDonate", False, {}])
return
def ResetDailyDonateCnt(curPlayer):
@@ -1511,7 +1604,7 @@
donateCntList.append(donateCnt)
if not donateCntList:
return
- clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCDonateCntInfo)
+ clientPack = ChPyNetSendPack.tagSCDonateCntInfo()
clientPack.DonateCntList = donateCntList
clientPack.Count = len(clientPack.DonateCntList)
NetPackCommon.SendFakePack(curPlayer, clientPack)
@@ -1604,7 +1697,8 @@
def SendFamilyActionInfo(curPlayer, familyID, actionType):
## 发送家族行为
# @param curPlayer: 为None时通知该仙盟所有成员
-
+ if not familyID:
+ return
familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType)
clientPack = ChPyNetSendPack.tagMCFamilyActionInfo()
--
Gitblit v1.8.0