From 5f3b500dd8efc188323d6e6ec2a74857e82142c8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 10 二月 2026 19:50:38 +0800
Subject: [PATCH] 1111 【后台】 扣除玩家物品、扣除玩家货币命令支持;

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py |  107 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 83 insertions(+), 24 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 5c1faa5..f8f6636 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -149,11 +149,10 @@
 def __doPlayerOnDay(curPlayer):
     PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
     PlayerFamilyTaofa.PlayerOnDay(curPlayer)
-    Do_MapServer_PlayerOnDay(curPlayer)
+    ResetDailyDonateCnt(curPlayer)
     return
 
 def OnPlayerLogin(curPlayer, tick):
-    Do_MapServer_PlayerLogin(curPlayer)
     if DBFamily.IsFamilyCross():
         GameWorld.DebugLog("公会已跨服不处理,由所属跨服服务器处理成员登录逻辑 OnPlayerLogin", curPlayer.GetPlayerID())
         return
@@ -163,10 +162,12 @@
 
 def OnCrossPlayerLogin(crossPlayer):
     ## 玩家上线,游戏服跨服通用,流程上当做以前GameServer处理公会一样,处理后再通知地图(现在的游戏服)
-    PlayerLoginRefreshFamily(crossPlayer)
+    PlayerLoginRefreshFamily(crossPlayer) # 必须先刷新
     Sync_RequestAddFamilyInfo(crossPlayer, False)
     PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcFamily]) # 公会聊天缓存
-    #PlayerFamilyTaofa.OnPlayerLogin(curPlayer) 讨伐待修改
+    if GameWorld.IsCrossServer():
+        PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcCountry]) # 跨服公会聊天缓存
+    PlayerFamilyTaofa.OnCrossPlayerLogin(crossPlayer)
     return
 
 def OnPlayerLogout(curPlayer):
@@ -205,12 +206,13 @@
         C2S_FamilyMapPlayer(dataMsg, playerID)
     return
 
-def MapServer_FamilyRefresh(crossPlayer, familyID, isVoluntarily=0):
+def MapServer_FamilyRefresh(crossPlayer, familyID, isVoluntarily=0, isLogin=False):
     ''' 相当于GameServer调用 curPlayer.MapServer_FamilyRefresh()
     '''
     playerID = crossPlayer.GetPlayerID()
     FmLV = 0 # 职位
     FamilyLV = 0 # 公会等级
+    JoinTime = 0
     FamilyName = ""
     EmblemID, EmblemWord = 0, ""
     if familyID:
@@ -224,6 +226,7 @@
             member = curFamily.FindMember(playerID)
             if member:
                 FmLV = member.GetFmLV()
+                JoinTime = member.GetJoinTime()
         else:
             familyID = 0
                     
@@ -233,9 +236,11 @@
     
     doData = {"FamilyID":familyID}
     if familyID:
-        doData.update({"FmLV":FmLV, "FamilyLV":FamilyLV, "FamilyName":FamilyName, "EmblemID":EmblemID, "EmblemWord":EmblemWord})
+        doData.update({"FmLV":FmLV, "JoinTime":JoinTime, "FamilyLV":FamilyLV, "FamilyName":FamilyName, "EmblemID":EmblemID, "EmblemWord":EmblemWord})
     if isVoluntarily:
         doData["isVoluntarily"] = 1
+    if isLogin:
+        doData["isLogin"] = 1
     SendToFamilyMapPlayer(crossPlayer, "FamilyRefresh", doData)
     return
 
@@ -247,7 +252,7 @@
     refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID)
     GameWorld.DebugLog("PlayerLoginRefreshFamily playerID=%s,refreshFamilyID=%s" % (playerID, refreshFamilyID))
     crossPlayer.SetFamilyID(refreshFamilyID)
-    MapServer_FamilyRefresh(crossPlayer, refreshFamilyID) # 登录
+    MapServer_FamilyRefresh(crossPlayer, refreshFamilyID, isLogin=True) # 登录
     familyID = refreshFamilyID
     if not familyID:
         return
@@ -292,6 +297,7 @@
     if not member:
         return
     member.RefreshMemberByID(playerID)
+    Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # 成员信息变更
     return
 
 def FamilyPyPackForwarding(curPlayer, clientData, tick, funcName, needResult=False, reqCD=0.5, reqDataEx=None):
@@ -801,12 +807,17 @@
             joinCDMinute = joinCDMinuteList[kickedCnt - 1] if len(joinCDMinuteList) >= kickedCnt else joinCDMinuteList[-1]
     if joinCDMinute:
         cdTimes = joinCDMinute * 60
-        passTimes = int(time.time()) - leaveFamilyTime
+        passTimes = GetFamilyTime() - leaveFamilyTime
         if passTimes < cdTimes:
             GameWorld.DebugLog("加入公会CD中: leaveCnt=%s,kickedCnt=%s,lastVoluntarily=%s,leaveFamilyTime=%s(%s),passTimes=%s < %s" 
                    % (leaveCnt, kickedCnt, lastVoluntarily, leaveFamilyTime, GameWorld.ChangeTimeNumToStr(leaveFamilyTime), passTimes, cdTimes))
             return True
     return False
+
+def GetFamilyTime():
+    if GameWorld.IsMainServer() and DBFamily.IsFamilyCross():
+        return CrossMgr.GetSSServerMgr().GetCrossTime()
+    return int(time.time())
 
 def AutoJoinFamily(crossPlayer):
     if crossPlayer.GetFamilyID():
@@ -1590,13 +1601,19 @@
     if CheckFamilyNameExists(crossPlayer, newName, fromServerID):
         return
     
+    zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(familyID)
+    if not zoneMgr:
+        return
+    
+    if not zoneMgr.FamilyRemainName(family, newName):
+        return
+    
+    if cdHours:
+        SetRenameTime(family, curTime)
+        
     moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyRename", 1)
     if moneyType and moneyValue:
         CrossPlayer.CostPlayerResources(crossPlayer, "FamilyRename", costMoneyDict={moneyType:moneyValue})
-        
-    family.SetName(newName)        
-    if cdHours:
-        SetRenameTime(family, curTime)
         
     crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
     for index in xrange(family.GetCount()):
@@ -2019,7 +2036,7 @@
 def OnFamilyTalk(curPlayer, familyID, talkPack, tick):
     clientData, tick = None, 0
     reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
-    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqCD=0, reqDataEx=reqDataEx)
+    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqDataEx=reqDataEx)
     return
 def __OnFamilyTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
     talkBuffer = reqDataEx["talkBuffer"]
@@ -2039,6 +2056,44 @@
     PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox, familyID)
     return
 
+def OnCrossFamilyTalk(curPlayer, talkPack, tick):
+    ## 跨服公会聊天,与跨服公会互通范围一致
+    crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
+    if crossServerID <= 0:
+        GameWorld.DebugLog("本服公会未互通,不允许跨服聊天")
+        return
+    clientData, tick = None, 0
+    reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
+    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnCrossTalk", reqDataEx=reqDataEx)
+    return
+def __OnCrossTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
+    talkBuffer = reqDataEx["talkBuffer"]
+    playerID = crossPlayer.GetPlayerID()
+    
+    if not talkBuffer:
+        return
+    
+    familyMgr = DBDataMgr.GetFamilyMgr()
+    zoneID = familyMgr.GetZoneIDInThisServer(fromServerID)
+    if zoneID < 0:
+        GameWorld.ErrLog("找不到服务器ID在跨服中的公会分区! fromServerID=%s" % fromServerID)
+        return
+    zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID)
+    serverIDList = zoneMgr.GetZoneServerIDList()
+    if not serverIDList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagMCTalk()
+    clientPack.ReadData(talkBuffer)
+    CrossPlayer.SendFackPackToServerList(clientPack, serverIDList)
+    
+    # 聊天缓存
+    channelType = clientPack.ChannelType
+    content = clientPack.Content
+    bubbleBox = clientPack.BubbleBox
+    PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox)
+    return
+
 ## -------------------------------------- 游戏服本服处理 --------------------------------------------
 '''
 为方便本服、跨服互通公会逻辑统一,公会相关数据处理统一使用 CrossPlayer,视为以前的GameServer处理,这样本服跨服的公会管理通用
@@ -2056,27 +2111,20 @@
         Do_MapServer_FamilyRefresh(curPlayer, doData)
     return
 
-def Do_MapServer_PlayerOnDay(curPlayer):
-    ResetDailyDonateCnt(curPlayer)
-    return
-
-def Do_MapServer_PlayerLogin(curPlayer):
-    DBFamily.Sync_FamilyCrossInfo(curPlayer)
-    SyncDonateCntInfo(curPlayer)
-    PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
-    return
-
 def Do_MapServer_FamilyRefresh(curPlayer, doData):
     tick = GameWorld.GetGameWorld().GetTick()
     playerID = curPlayer.GetPlayerID()
     refreshFamilyID = doData["FamilyID"]
     refreshFmLV = doData.get("FmLV", 0)
+    refreshJoinTime = doData.get("JoinTime", 0)
     refreshFamilyLV = doData.get("FamilyLV", 0)
     refreshFamilyName = doData.get("FamilyName", "")
     refreshEmblemID = doData.get("EmblemID", 0)
     refreshEmblemWord = doData.get("EmblemWord", "")
+    isLogin = doData.get("isLogin", 0) # 是否登录刷新的
     
     PlayerViewCache.UpdPlayerViewFamilyInfo(playerID, refreshFamilyID, refreshFamilyName, refreshEmblemID, refreshEmblemWord)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyJoinTime, refreshJoinTime)
     
     lastFamilyID = curPlayer.GetFamilyID()
     lastFamilyLV = curPlayer.GetFamilyLV() # 公会等级,非职位等级
@@ -2118,6 +2166,17 @@
         
     #---通知客户端刷新属性---
     curPlayer.View_FamilyInfoRefresh() #//04 30 玩家家族名字职位等信息刷新#tagPlayerInFamilyInfoRefresh
+    
+    if isLogin:
+        Do_MapServer_PlayerLogin(curPlayer)
+    return
+
+def Do_MapServer_PlayerLogin(curPlayer):
+    ## 地图公会玩家的登录逻辑由最新所属公会刷新后处理
+    DBFamily.Sync_FamilyCrossInfo(curPlayer)
+    SyncDonateCntInfo(curPlayer)
+    PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
+    PlayerFamilyTaofa.OnPlayerLogin(curPlayer)
     return
 
 def __OnEnterFamily(curPlayer, tick):
@@ -2133,7 +2192,7 @@
     curPlayer.SetFamilyActiveValue(0)
     curPlayer.SetLastWeekFamilyActiveValue(0)
     curPlayer.SetFamilyLV(0)
-    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()))
+    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, GetFamilyTime())
     leaveCnt, kickedCnt, _ = PlayerControl.GetLeaveFamilyInfo(curPlayer)
     GameWorld.DebugLog("__OnLeaveFamily: isVoluntarily=%s,leaveCnt=%s,kickedCnt=%s" % (isVoluntarily, leaveCnt, kickedCnt))
     delMoneyType, delMoneyPer = IpyGameDataPY.GetFuncCfg("FamilyLeave", 3), 0

--
Gitblit v1.8.0