From 93b6f00c8b142fee8560d58c54d71de135584788 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 03 十二月 2021 18:48:52 +0800
Subject: [PATCH] 9341 【BT5】【主干】【后端】情缘系统(增加魅力等级属性;伴侣亲密度等级属性;优化已成亲的伴侣再次提亲时直接成亲)

---
 ServerPython/CoreServerGroup/GameServer/PyNetPack.ini                                                    |    6 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py                                   |   12 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_Charm.py |   48 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                       |   48 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                        |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCharm.py                |   93 +++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                            |   48 ++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py                                    |   25 ++
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Charm.py                                      |    6 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py       |    2 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py                                      |   55 ++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                     |   29 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                   |    4 
 PySysDB/PySysDBPY.h                                                                                      |   11 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCharm.py                                     |   18 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerLove.py                 |   62 ++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                          |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Charm.py                 |   75 +++++++
 18 files changed, 524 insertions(+), 27 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 08a8847..3e0eb5c 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -2465,6 +2465,17 @@
 	DWORD		UpEatItemPerCount;	//每次培养消耗x个
 };
 
+//情缘魅力属性表
+
+struct tagLoveCharm
+{
+	BYTE		_CharmLV;	//魅力等级
+	DWORD		UpNeedCharm;	//升下级所需总魅力
+	list		LVAttrType;	//属性类型
+	list		LVAttrValue;	//总属性值
+	list		LVAwardItemInfo;	//等级物品奖励[[物品ID,个数,是否拍品], ...]
+};
+
 //骑宠幻化表
 
 struct tagHorsePetSkin
diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
index c94691e..b653ce7 100644
--- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
+++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini
@@ -463,12 +463,16 @@
 Writer = hxp
 Releaser = hxp
 RegType = 0
-RegisterPackCount = 1
+RegisterPackCount = 2
 
 PacketCMD_1=0xB3
 PacketSubCMD_1=0x09
 PacketCallFunc_1=OnCharmOfferBillboardQuery
 
+PacketCMD_2=0xB3
+PacketSubCMD_2=0x19
+PacketCallFunc_2=OnCharmLVUp
+
 [PlayerTalk]
 ScriptName = Player\PlayerTalk.py
 Writer = alee
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index dc58a90..81983c8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -2330,6 +2330,54 @@
 
 
 #------------------------------------------------------
+# B3 19 提升魅力等级 #tagCGCharmLVUp
+
+class  tagCGCharmLVUp(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB3
+        self.SubCmd = 0x19
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB3
+        self.SubCmd = 0x19
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGCharmLVUp)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B3 19 提升魅力等级 //tagCGCharmLVUp:
+                                Cmd:%s,
+                                SubCmd:%s
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd
+                                )
+        return DumpString
+
+
+m_NAtagCGCharmLVUp=tagCGCharmLVUp()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGCharmLVUp.Cmd,m_NAtagCGCharmLVUp.SubCmd))] = m_NAtagCGCharmLVUp
+
+
+#------------------------------------------------------
 # B3 09 魅力贡献榜查看 #tagCGCharmOfferBillboardQuery
 
 class  tagCGCharmOfferBillboardQuery(Structure):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Charm.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Charm.py
index cb3cbb3..a8cdfcd 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Charm.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Charm.py
@@ -19,12 +19,6 @@
 import PlayerCharm
 
 def __Help(curPlayer):
-    GameWorld.DebugAnswer(curPlayer, "---------- %s" % GameWorld.GetCurrentDataTimeStr())
-    GameWorld.DebugAnswer(curPlayer, "清空魅力: Charm 0")
-    GameWorld.DebugAnswer(curPlayer, "随机魅力: Charm 1 人数  贡献人数 [选填 随机范围值A B]")
-    GameWorld.DebugAnswer(curPlayer, "随机范围值不填的话默认10~1000")
-    GameWorld.DebugAnswer(curPlayer, "增加魅力: Charm 2 数值 [选填 贡献玩家ID 获得玩家ID]")
-    GameWorld.DebugAnswer(curPlayer, "玩家ID不填的话均默认自己")
     return
 
 #逻辑实现
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCharm.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCharm.py
index 0a8e7f9..fa0e9b7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCharm.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerCharm.py
@@ -253,6 +253,24 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
+#// B3 19 提升魅力等级 #tagCGCharmLVUp
+#
+#struct    tagCGCharmLVUp
+#{
+#    tagHead        Head;
+#};
+def OnCharmLVUp(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)    
+    playerID = curPlayer.GetPlayerID()
+        
+    totalCharm = 0
+    charmValueRecMgr = PyDataManager.GetDBPyCharmValueRecManager()
+    if playerID in charmValueRecMgr.charmTotalDict:
+        recTypeValueDict = charmValueRecMgr.charmTotalDict.get(playerID, {})
+        totalCharm = recTypeValueDict.get(CharmValueRecType_Total, 0)
+        
+    PlayerControl.MapServer_QueryPlayer_DoLogic(curPlayer, "Charm", ["CharmLVUp", totalCharm], curPlayer.GetID())
+    return
 
 def GMClearCharm():
     ## GM清空魅力
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
index 47564b2..afba519 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -290,6 +290,18 @@
 
 #------------------------------------------------------------------------------ 
 
+def MapServer_QueryPlayer_DoLogic(tagPlayer, callName, cmdInfo, srcPlayerID=0, queryType=0):
+    ## 通知目标玩家地图执行 DoLogic
+    tagPlayerID = tagPlayer.GetPlayerID()
+    tagMapID = tagPlayer.GetRealMapID()
+    if tagMapID:
+        cmdStr = str(cmdInfo)
+        GameWorld.Log("MapServer_QueryPlayer_DoLogic: %s, cmdInfo=%s,tagPlayerID=%s,tagMapID=%s" 
+                      % (callName, cmdInfo, tagPlayerID, tagMapID), srcPlayerID)
+        #MapServer_QueryPlayer(int srcPlayerID, int queryType, int queryID, int mapID, char *callName, char *cmd,WORD cmdLen, int RouteServerIndex)
+        GameWorld.GetPlayerManager().MapServer_QueryPlayer(srcPlayerID, 0, tagPlayerID, tagMapID, callName,
+                                                           cmdStr, len(cmdStr), tagPlayer.GetRouteServerIndex())
+    return
 
 ## 增加成就完成进度
 #  @param curPlayer
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py
index 7eeaebd..5cd5ace 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerLove.py
@@ -358,6 +358,15 @@
 
 def OnPlayerLogin(curPlayer):
     PyDataManager.GetDBPyUnNotifyLoveGiftRecManager().LoginNotify(curPlayer)
+    
+    # 同步伴侣亲密度
+    playerID = curPlayer.GetPlayerID()
+    couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)
+    if couple:
+        coupleID = couple.GetCoupleID(playerID)
+        intimacys = PyDataManager.GetIntimacyManager().GetIntimacys(playerID)
+        intimacys.SyncMapServerIntimacy(curPlayer, coupleID)
+        
     Sync_CoupleInfo(curPlayer)
     Sync_CandyList(curPlayer)
     return
@@ -458,7 +467,7 @@
     __DoMarryResponse(curPlayer, reqPlayer, reqPlayerID, isOK)
     return
 
-def __DoMarryResponse(curPlayer, reqPlayer, reqPlayerID, isOK):
+def __DoMarryResponse(curPlayer, reqPlayer, reqPlayerID, isOK, needResponse=True):
     ''' 提亲回应
     @param curPlayer: 回应玩家
     @param reqPlayer: 提亲玩家
@@ -476,20 +485,22 @@
     reqPlayerName = reqPlayer.GetName() if reqPlayer else PlayerSocial.GetSocialPlayerName(reqPlayerID)
     playerName = curPlayer.GetName()
     
-    responsePack = ChPyNetSendPack.tagGCMarryResponseRet()
-    responsePack.PlayerIDA = reqPlayerID
-    responsePack.PlayerNameA = reqPlayerName
-    responsePack.NameALen = len(responsePack.PlayerNameA)
-    responsePack.PlayerIDB = playerID
-    responsePack.PlayerNameB = playerName
-    responsePack.NameBLen = len(responsePack.PlayerNameB)
-    responsePack.IsOK = isOK
-    if reqPlayer:
-        NetPackCommon.SendFakePack(reqPlayer, responsePack) # 必回复提亲方
+    if needResponse:
+        responsePack = ChPyNetSendPack.tagGCMarryResponseRet()
+        responsePack.PlayerIDA = reqPlayerID
+        responsePack.PlayerNameA = reqPlayerName
+        responsePack.NameALen = len(responsePack.PlayerNameA)
+        responsePack.PlayerIDB = playerID
+        responsePack.PlayerNameB = playerName
+        responsePack.NameBLen = len(responsePack.PlayerNameB)
+        responsePack.IsOK = isOK
+        if reqPlayer:
+            NetPackCommon.SendFakePack(reqPlayer, responsePack) # 必回复提亲方
     # 拒绝
     if not isOK:
         return
-    NetPackCommon.SendFakePack(curPlayer, responsePack) # 回应方仅同意时同步
+    if needResponse:
+        NetPackCommon.SendFakePack(curPlayer, responsePack) # 回应方仅同意时同步
     
     # ===================== 以下执行成亲逻辑 ===================== 
     GameWorld.Log("执行成亲: reqPlayerID=%s,playerID=%s,bridePriceID=%s" % (reqPlayerID, playerID, bridePriceID), playerID)
@@ -540,7 +551,11 @@
         if not player:
             continue   
         mapServerCoupleInfo = couple.GetSendMapServerCoupleInfo(player.GetPlayerID())
-        dataMsg = [reqPlayerID, bridePriceID, mapServerCoupleInfo]
+        
+        curIntimacys = PyDataManager.GetIntimacyManager().GetIntimacys(player.GetPlayerID())
+        coupleIntimacy = curIntimacys.GetTagIntimacy(couple.GetCoupleID(player.GetPlayerID())) if curIntimacys else 0
+        
+        dataMsg = [reqPlayerID, bridePriceID, mapServerCoupleInfo, coupleIntimacy]
         MapServer_QueryPlayer_DoLogic_Love(player, "MarrySuccess", dataMsg, playerID)
         Sync_CoupleInfo(player)
         
@@ -841,6 +856,7 @@
     if not __MarryCheckComm(curPlayer, tagPlayer, tagPlayerID, True):
         return
     
+    curTime = int(time.time())
     playerID = curPlayer.GetPlayerID()
     
     if (playerID, tagPlayerID) in PyGameData.g_marryCandyInfo or (tagPlayerID, playerID) in PyGameData.g_marryCandyInfo:
@@ -865,8 +881,17 @@
             GameWorld.Log("聘礼提亲次数不足,无法提亲! bridePriceID=%s,buyCount(%s) >= canBuyMax(%s)" 
                           % (bridePriceID, buyCount, canBuyMax), playerID)
             return
-                
-    curTime = int(time.time())
+        
+        GameWorld.Log("已成亲的伴侣再次提亲,直接成亲! tagPlayerID=%s,coupleID=%s" % (tagPlayerID, coupleID), playerID)
+        reqData = MarryReq()
+        reqData.playerIDA = playerID
+        reqData.playerIDB = tagPlayerID
+        reqData.bridePriceID = bridePriceID
+        reqData.reqTime = curTime
+        PyGameData.g_marryReqInfo[playerID] = reqData
+        __DoMarryResponse(tagPlayer, curPlayer, playerID, 1, False)
+        return
+    
     if tagPlayerID in PyGameData.g_marryReqInfo:
         tagReqData = PyGameData.g_marryReqInfo[tagPlayerID]
         tagBridePriceID = tagReqData.bridePriceID
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
index 6b70901..c723b63 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
@@ -329,6 +329,8 @@
         if not curPlayer:
             return nowIntimacy
         
+        self.__SyncMapServerCoupleIntimacy(curPlayer, tagID)
+        
         tagName = ""
         socialPlayer = PyDataManager.GetPersonalSocialManager().GetSocialPlayer(tagID)
         if socialPlayer:
@@ -349,9 +351,32 @@
             return 0
         intimacyObj.Intimacy = setValue
         if curPlayer:
+            self.__SyncMapServerCoupleIntimacy(curPlayer, tagID)
             self.Sync_SocialsInfo(curPlayer, [tagID])
         return intimacyObj.Intimacy
     
+    def __SyncMapServerCoupleIntimacy(self, curPlayer, tagID):
+        ## 同步地图玩家伴侣亲密度
+        playerID = curPlayer.GetPlayerID()
+        couple = PyDataManager.GetDBPyCoupleManager().GetCouple(playerID)
+        if not couple:
+            return
+        if couple.GetCoupleID(playerID) != tagID:
+            return
+        self.SyncMapServerIntimacy(curPlayer, tagID)
+        return
+    
+    def SyncMapServerIntimacy(self, curPlayer, tagID):
+        ## 同步地图玩家伴侣亲密度
+        playerID = curPlayer.GetPlayerID()
+        intimacyValue = 0
+        intimacyObj = self.GetIntimacyObj(tagID)
+        if intimacyObj:
+            intimacyValue = intimacyObj.Intimacy
+        cmdInfo = ["SyncMapServerIntimacy", [tagID, intimacyValue]]
+        PlayerControl.MapServer_QueryPlayer_DoLogic(curPlayer, "Love", cmdInfo, playerID)
+        return
+    
 # 整个游戏的亲密管理
 class IntimacyManager(object):
     def __init__(self):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index a585b55..d355b3a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3565,8 +3565,6 @@
 Def_PDict_FamilyWarDailyReward = "FamilyWarDailyReward"  # 王者仙盟每日俸禄领取状态
 Def_PDict_Family_Contribution = "FamilyContribution"  #战盟贡献度
 Def_PDict_HasChange_FamilyActiveToContribution = "HasChangeContribution"  #战盟活跃度已转化过贡献度
-Def_PDict_FreeGiveFlowerCnt = "FreeGiveFlowerCnt"  #当日已免费赠送鲜花数
-Def_PDict_GiveFlowerCntByDay = "GiveFlowerCntByDay"  #当日已赠送鲜次数
 Def_PDict_PackCount_FineSoul = "PackCount_FineSoul"    # 已购买精魄/符文背包格子数
 Def_PDict_KillPlayerAddActive = "KillPlayerAddActiveByDay"  # 杀人每日获得活跃度
 Def_PDict_LoginDayCnt = "PLoginDayCnt"  # 累计登陆天数
@@ -4177,6 +4175,8 @@
 Def_PDict_LoveRingClassLV = "LoveRingClassLV" # 情戒 - 阶级
 Def_PDict_LoveRingStarLV = "LoveRingStarLV" # 情戒 - 星级
 Def_PDict_LoveRingEatCount = "LoveRingEatCount" # 情戒 - 本星已淬炼道具数
+Def_PDict_LoveCoupleIntimacy = "LoveCoupleIntimacy" # 伴侣亲密度
+Def_PDict_CharmLV = "CharmLV"  # 魅力等级
 #-------------------------------------------------------------------------------
 #可以从07 41封包购买的背包类型,和对应字典{背包类型:[字典key, 默认格子数]}
 
@@ -4658,7 +4658,8 @@
 Def_CalcAttrFunc_FaQi, # 法器 48
 Def_CalcAttrFunc_LoveRing, # 情戒基础 49
 Def_CalcAttrFunc_LoveRingCouple, # 情戒仙侣 50
-) = range(51)
+Def_CalcAttrFunc_Charm, # 魅力 51
+) = range(52)
 
 # 技能功能点列表  - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
 CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
@@ -4682,6 +4683,7 @@
                             ShareDefine.Def_MFPType_HorseSoul:[Def_CalcAttrFunc_HorseSoul],
                             ShareDefine.Def_MFPType_FaQi:[Def_CalcAttrFunc_FaQi],
                             ShareDefine.Def_MFPType_Love:[Def_CalcAttrFunc_LoveRing, Def_CalcAttrFunc_LoveRingCouple],
+                            ShareDefine.Def_MFPType_Charm:[Def_CalcAttrFunc_Charm],
                             ShareDefine.Def_MFPType_Prestige:[Def_CalcAttrFunc_Prestige],
                             ShareDefine.Def_MFPType_GodWeapon:[Def_CalcAttrFunc_GodWeapon],
                             ShareDefine.Def_MFPType_Dienstgrad:[Def_CalcAttrFunc_Dienstgrad],
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index dc58a90..81983c8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -2330,6 +2330,54 @@
 
 
 #------------------------------------------------------
+# B3 19 提升魅力等级 #tagCGCharmLVUp
+
+class  tagCGCharmLVUp(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB3
+        self.SubCmd = 0x19
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB3
+        self.SubCmd = 0x19
+        return
+
+    def GetLength(self):
+        return sizeof(tagCGCharmLVUp)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B3 19 提升魅力等级 //tagCGCharmLVUp:
+                                Cmd:%s,
+                                SubCmd:%s
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd
+                                )
+        return DumpString
+
+
+m_NAtagCGCharmLVUp=tagCGCharmLVUp()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGCharmLVUp.Cmd,m_NAtagCGCharmLVUp.SubCmd))] = m_NAtagCGCharmLVUp
+
+
+#------------------------------------------------------
 # B3 09 魅力贡献榜查看 #tagCGCharmOfferBillboardQuery
 
 class  tagCGCharmOfferBillboardQuery(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Charm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Charm.py
new file mode 100644
index 0000000..a98ddbb
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Charm.py
@@ -0,0 +1,75 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Charm
+#
+# @todo:魅力
+# @author hxp
+# @date 2021-12-03
+# @version 1.0
+#
+# 详细描述: 魅力
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2021-12-03 19:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PlayerControl
+import IpyGameDataPY
+import PlayerCharm
+
+
+def __Help(curPlayer):
+    GameWorld.DebugAnswer(curPlayer, "---------- %s" % GameWorld.GetCurrentDataTimeStr())
+    GameWorld.DebugAnswer(curPlayer, "清空魅力: Charm 0")
+    GameWorld.DebugAnswer(curPlayer, "魅力等级: Charm 等级")
+    GameWorld.DebugAnswer(curPlayer, "随机魅力: Charm 1 人数  贡献人数 [选填 随机范围值A B]")
+    GameWorld.DebugAnswer(curPlayer, "随机范围值不填的话默认10~1000")
+    GameWorld.DebugAnswer(curPlayer, "增加魅力: Charm 2 数值 [选填 贡献玩家ID 获得玩家ID]")
+    GameWorld.DebugAnswer(curPlayer, "玩家ID不填的话均默认自己")
+    return
+
+## GM命令执行入口
+#  @param curPlayer 当前玩家
+#  @param msgList 参数列表 [addSkillID]
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(curPlayer, msgList):
+    
+    if not msgList:
+        __Help(curPlayer)
+        return
+    
+    value1 = msgList[0]
+    
+    # 设置魅力等级
+    if value1 > 0 and len(msgList) == 1:
+        maxIpyData = IpyGameDataPY.IPY_Data().GetLoveCharmByIndex(IpyGameDataPY.IPY_Data().GetLoveCharmCount() - 1)
+        if maxIpyData:
+            value1 = min(value1, maxIpyData.GetCharmLV())
+        GameWorld.DebugAnswer(curPlayer, "设置魅力等级: %s" % value1)
+        PlayerControl.SetCharmLV(curPlayer, value1)
+        PlayerCharm.RefreshCharmAttr(curPlayer)
+        return
+    
+    isSendGameServer = True
+    # 清空魅力
+    if value1 == 0:
+        PlayerControl.SetCharmLV(curPlayer, value1)
+        PlayerCharm.RefreshCharmAttr(curPlayer)
+        
+    # 随机魅力
+    elif value1 == 1 and len(msgList) >= 3:
+        pass
+    
+    # 增加魅力
+    elif value1 == 2 and len(msgList) >= 2:
+        pass
+    
+    else:
+        __Help(curPlayer)
+        return
+    
+    return isSendGameServer
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
index 8407b24..c1c4bfb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
@@ -54,6 +54,7 @@
                    ShareDefine.Def_MFPType_Dogz:"神兽",
                    ShareDefine.Def_MFPType_Coat:"时装",
                    ShareDefine.Def_MFPType_Love:"情缘",
+                   ShareDefine.Def_MFPType_Charm:"魅力",
                    ShareDefine.Def_MFPType_Other:"其他",
                    }
     
@@ -103,6 +104,7 @@
                      ChConfig.Def_CalcAttrFunc_FaQi:"法器",
                      ChConfig.Def_CalcAttrFunc_LoveRing:"情戒基础",
                      ChConfig.Def_CalcAttrFunc_LoveRingCouple:"情戒仙侣",
+                     ChConfig.Def_CalcAttrFunc_Charm:"魅力",
                      }
     
     GameWorld.DebugAnswer(curPlayer, "PrintFightPower 模块类型(可选)")
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 378ca3d..64cdfe4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1906,6 +1906,14 @@
                         ("DWORD", "UpEatItemPerCount", 0),
                         ),
 
+                "LoveCharm":(
+                        ("BYTE", "CharmLV", 1),
+                        ("DWORD", "UpNeedCharm", 0),
+                        ("list", "LVAttrType", 0),
+                        ("list", "LVAttrValue", 0),
+                        ("list", "LVAwardItemInfo", 0),
+                        ),
+
                 "HorsePetSkin":(
                         ("BYTE", "Type", 1),
                         ("DWORD", "ID", 1),
@@ -5876,6 +5884,23 @@
     def GetNeedEatCount(self): return self.NeedEatCount # 升级所需个数(非累计)
     def GetUpEatItemPerCount(self): return self.UpEatItemPerCount # 每次培养消耗x个
 
+# 情缘魅力属性表
+class IPY_LoveCharm():
+    
+    def __init__(self):
+        self.CharmLV = 0
+        self.UpNeedCharm = 0
+        self.LVAttrType = []
+        self.LVAttrValue = []
+        self.LVAwardItemInfo = []
+        return
+        
+    def GetCharmLV(self): return self.CharmLV # 魅力等级
+    def GetUpNeedCharm(self): return self.UpNeedCharm # 升下级所需总魅力
+    def GetLVAttrType(self): return self.LVAttrType # 属性类型
+    def GetLVAttrValue(self): return self.LVAttrValue # 总属性值
+    def GetLVAwardItemInfo(self): return self.LVAwardItemInfo # 等级物品奖励[[物品ID,个数,是否拍品], ...]
+
 # 骑宠幻化表
 class IPY_HorsePetSkin():
     
@@ -6344,6 +6369,8 @@
         self.ipyMarryLen = len(self.ipyMarryCache)
         self.ipyLoveRingCache = self.__LoadFileData("LoveRing", IPY_LoveRing)
         self.ipyLoveRingLen = len(self.ipyLoveRingCache)
+        self.ipyLoveCharmCache = self.__LoadFileData("LoveCharm", IPY_LoveCharm)
+        self.ipyLoveCharmLen = len(self.ipyLoveCharmCache)
         self.ipyHorsePetSkinCache = self.__LoadFileData("HorsePetSkin", IPY_HorsePetSkin)
         self.ipyHorsePetSkinLen = len(self.ipyHorsePetSkinCache)
         self.ipyAssistThanksGiftCache = self.__LoadFileData("AssistThanksGift", IPY_AssistThanksGift)
@@ -6904,6 +6931,8 @@
     def GetMarryByIndex(self, index): return self.ipyMarryCache[index]
     def GetLoveRingCount(self): return self.ipyLoveRingLen
     def GetLoveRingByIndex(self, index): return self.ipyLoveRingCache[index]
+    def GetLoveCharmCount(self): return self.ipyLoveCharmLen
+    def GetLoveCharmByIndex(self, index): return self.ipyLoveCharmCache[index]
     def GetHorsePetSkinCount(self): return self.ipyHorsePetSkinLen
     def GetHorsePetSkinByIndex(self, index): return self.ipyHorsePetSkinCache[index]
     def GetAssistThanksGiftCount(self): return self.ipyAssistThanksGiftLen
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 95ed861..3f8bc7c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -130,6 +130,7 @@
 import PyGameData
 import PlayerCoin
 import PlayerGeTui
+import PlayerCharm
 import PlayerDogz
 import PlayerCoat
 import PlayerFB
@@ -686,6 +687,9 @@
     #成就
     PlayerSuccess.SuccOnLogin(curPlayer)
     
+    #魅力
+    PlayerCharm.OnPlayerLogin(curPlayer)
+    
     #情缘
     PlayerLove.DoPlayerLogin(curPlayer)
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCharm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCharm.py
new file mode 100644
index 0000000..d969883
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCharm.py
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerCharm
+#
+# @todo:魅力
+# @author hxp
+# @date 2021-12-03
+# @version 1.0
+#
+# 详细描述: 魅力
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2021-12-03 19:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import PlayerControl
+import IpyGameDataPY
+import ItemControler
+import GameWorld
+
+def OnPlayerLogin(curPlayer):
+    
+    # 重新设置,触发上线通知
+    if PlayerControl.GetCharmLV(curPlayer):
+        PlayerControl.SetCharmLV(curPlayer, PlayerControl.GetCharmLV(curPlayer))
+        
+    return
+
+def GameServer_DoLogic_Charm(curPlayer, msgData):
+    
+    msgType = msgData[0]
+    
+    ## 魅力等级提升
+    if msgType == "CharmLVUp":
+        totalCharm = msgData[1]
+        __DoCharmLVUp(curPlayer, totalCharm)
+        
+    return
+
+def __DoCharmLVUp(curPlayer, totalCharm):
+    
+    playerID = curPlayer.GetPlayerID()
+    charmLV = PlayerControl.GetCharmLV(curPlayer)
+    ipyData = IpyGameDataPY.GetIpyGameData("LoveCharm", charmLV)
+    if not ipyData:
+        return
+    
+    if not ipyData.GetUpNeedCharm():
+        GameWorld.DebugLog("魅力等级已满级,无法升级! charmLV=%s" % charmLV, playerID)
+        return
+    
+    if totalCharm < ipyData.GetUpNeedCharm():
+        GameWorld.DebugLog("魅力值不足,无法升级! totalCharm=%s < %s, charmLV=%s" % (totalCharm, ipyData.GetUpNeedCharm(), charmLV), playerID)
+        return
+    
+    charmLV += 1
+    nextLVIpyData = IpyGameDataPY.GetIpyGameData("LoveCharm", charmLV)
+    if not nextLVIpyData:
+        return
+    awardItemList = nextLVIpyData.GetLVAwardItemInfo()
+    GameWorld.DebugLog("魅力等级升级! charmLV=%s" % charmLV, playerID)
+    PlayerControl.SetCharmLV(curPlayer, charmLV)
+    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList)
+    RefreshCharmAttr(curPlayer)
+    return
+
+def RefreshCharmAttr(curPlayer):
+    CalcCharmAttr(curPlayer)
+    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
+    return
+
+def CalcCharmAttr(curPlayer):
+    
+    allAttrList = [{} for _ in range(4)]
+    
+    charmLV = PlayerControl.GetCharmLV(curPlayer)
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("LoveCharm", charmLV)
+    if ipyData:
+        lvAttrTypeList = ipyData.GetLVAttrType()
+        lvAttrValueList = ipyData.GetLVAttrValue()
+        for i, attrID in enumerate(lvAttrTypeList):
+            attrValue = lvAttrValueList[i]
+            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
+            
+    # 保存计算值
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Charm, allAttrList)
+    return
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerLove.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerLove.py
index 99570be..0feb3be 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerLove.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerLove.py
@@ -25,6 +25,9 @@
 import ItemControler
 import NetPackCommon
 import ChConfig
+import SkillCommon
+import BuffSkill
+import PyGameData
 
 def DoPlayerOnDay(curPlayer):   
     return
@@ -219,6 +222,10 @@
     ## 离婚成功
     elif msgType == "ClearCoupleSocial":
         __ClearCoupleSocial(curPlayer, dataMsg)
+    
+    ## 同步亲密度
+    elif msgType == "SyncMapServerIntimacy":
+        SyncMapServerIntimacy(curPlayer, dataMsg)
         
     return
 
@@ -326,11 +333,11 @@
 
 def __DoMarrySuccess(curPlayer, dataMsg):
     ## 执行成亲成功
-    reqPlayerID, bridePriceID, mapServerCoupleInfo = dataMsg
+    reqPlayerID, bridePriceID, mapServerCoupleInfo, coupleIntimacy = dataMsg
     playerID = curPlayer.GetPlayerID()
     PlayerControl.SetCoupleInfo(playerID, mapServerCoupleInfo)
     
-    GameWorld.Log("执行成亲成功! reqPlayerID=%s,bridePriceID=%s" % (reqPlayerID, bridePriceID), playerID)
+    GameWorld.Log("执行成亲成功! reqPlayerID=%s,bridePriceID=%s,coupleIntimacy=%s" % (reqPlayerID, bridePriceID, coupleIntimacy), playerID)
     
     if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LoveRingClassLV) == 0:
         GameWorld.DebugLog("激活情戒!")
@@ -339,6 +346,9 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LoveRingEatCount, 0)
         Sync_LoveRingInfo(curPlayer)
         
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LoveCoupleIntimacy, coupleIntimacy)
+    RefreshCoupleTeamBuff(curPlayer)
+    
     # 提亲的玩家扣除消耗
     if playerID == reqPlayerID:
         ipyData = IpyGameDataPY.GetIpyGameData("Marry", bridePriceID)
@@ -359,6 +369,10 @@
     PlayerControl.SetCoupleInfo(playerID, None)
     
     GameWorld.Log("清除伴侣关系成功! coupleID=%s" % (coupleID), playerID)
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LoveCoupleIntimacy, 0)
+    RefreshCoupleTeamBuff(curPlayer)
+    
     RefreshLoveAttr(curPlayer)
     return
 
@@ -543,3 +557,47 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
+def SyncMapServerIntimacy(curPlayer, dataMsg):
+    tagID, intimacyValue = dataMsg
+    coupleID = PlayerControl.GetCoupleID(curPlayer)
+    if coupleID == tagID:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LoveCoupleIntimacy, intimacyValue)
+        RefreshCoupleTeamBuff(curPlayer)
+    return
+
+def RefreshCoupleTeamBuff(curPlayer):
+    ## 刷新伴侣组队buff
+    
+    teamID = curPlayer.GetTeamID()
+    playerID = curPlayer.GetPlayerID()
+    cupleID = PlayerControl.GetCoupleID(curPlayer)
+    teamPlayerInfoDict = PyGameData.g_teamPlayerInfoDict.get(teamID, {}) if teamID else {}
+    teamPlayerIDList = teamPlayerInfoDict.keys()
+    skillLV = 0
+    skillTypeID = IpyGameDataPY.GetFuncCfg("IntimacyBuff", 2)
+    coupleIntimacy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LoveCoupleIntimacy)
+    if cupleID and cupleID in teamPlayerIDList:
+        skillLVIntimacyList = IpyGameDataPY.GetFuncEvalCfg("IntimacyBuff", 1)
+        for lv, lvIntimacy in enumerate(skillLVIntimacyList, 1):
+            if coupleIntimacy >= lvIntimacy:
+                skillLV = lv
+            else:
+                break
+            
+    GameWorld.DebugLog("刷新伴侣组队Buff: cupleID=%s,coupleIntimacy=%s,teamID=%s,teamPlayerIDList=%s,skillTypeID=%s,skillLV=%s" 
+                       % (cupleID, coupleIntimacy, teamID, teamPlayerIDList, skillTypeID, skillLV), playerID)
+    tick = GameWorld.GetGameWorld().GetTick()
+    if skillLV > 0:
+        findBuff = SkillCommon.FindBuffByID(curPlayer, skillTypeID)[0]
+        if findBuff:
+            if skillLV == findBuff.GetSkill().GetSkillLV():
+                return
+            BuffSkill.DelBuffBySkillID(curPlayer, skillTypeID, tick)
+        SkillCommon.AddBuffBySkillType(curPlayer, skillTypeID, tick, skillLV)
+    else:
+        if BuffSkill.DelBuffBySkillID(curPlayer, skillTypeID, tick):
+            #统一刷新状态
+            playerControl = PlayerControl.PlayerControl(curPlayer)
+            playerControl.RefreshPlayerAttrByBuff()
+            
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_Charm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_Charm.py
new file mode 100644
index 0000000..c537d21
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_Charm.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.RemoteQuery.GY_Query_Charm
+#
+# @todo:魅力
+# @author hxp
+# @date 2021-12-03
+# @version 1.0
+#
+# 详细描述: 魅力
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2021-12-03 19:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PlayerCharm
+
+#------------------------------------------------------------------------------ 
+## 跨服赛报名调用接口
+#  @param query_Type 请求类型
+#  @param query_ID 请求的玩家ID
+#  @param packCMDList 发包命令
+#  @param tick 当前时间
+#  @return "True" or "False" or ""
+#  @remarks 函数详细说明.
+def DoLogic(query_Type, query_ID, packCMDList, tick):
+    
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(query_ID)
+    if not curPlayer or curPlayer.IsEmpty():
+        return
+    
+    PlayerCharm.GameServer_DoLogic_Charm(curPlayer, packCMDList)
+    return
+
+#------------------------------------------------------------------------------ 
+## 执行结果
+#  @param curPlayer 发出请求的玩家
+#  @param callFunName 功能名称
+#  @param funResult 查询的结果
+#  @param tick 当前时间
+#  @return None
+#  @remarks 函数详细说明.
+def DoResult(curPlayer, callFunName, funResult, 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 8c0e8f2..3633870 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -35,6 +35,7 @@
 
 g_teamPlayerHurtValue = {} # 队伍玩家对NPC伤害输出量 {(lineID, objID, npcID):{(teamID, playerID):hurtValue, ...}, }
 g_teamPlayerDict = {} # 地图队伍对应玩家ID列表,含离线玩家 {teamID:[playerID, ...], ...}
+g_teamPlayerInfoDict = {} # 地图队伍对应玩家ID信息 {teamID:{playerID:{k:v, ...}, ...}
 
 g_unLoginOKPlayerMailInfo = {} # GameServer 未登录成功前需要发送的邮件缓存,防止登录失败不存db导致重复发送邮件 {playerID:[[待发送邮件内容信息], ...], ...}
 g_disconnectPlayer = {} # 在本地图离线的玩家信息 {playerID:[tick, posX, posY], ...}

--
Gitblit v1.8.0