From 83ea442cfaceaf76648c6ec948e4494a10e228db Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 12 九月 2024 17:01:40 +0800 Subject: [PATCH] 10261 【越南】【砍树】仙盟徽章,头像框,头像(动态),聊天气泡,聊天表情(增加仙盟徽章) --- ServerPython/CoreServerGroup/GameServer/PyNetPack.ini | 6 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 25 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 3 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 3 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 63 ++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 11 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 63 ++++++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 11 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py | 200 ++++++++++++++++++++ ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py | 35 ++ ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py | 87 ++++---- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py | 2 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 3 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 4 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py | 45 ++++ PySysDB/PySysDBG.h | 9 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py | 1 18 files changed, 514 insertions(+), 58 deletions(-) diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h index 97a40c6..b9ad138 100644 --- a/PySysDB/PySysDBG.h +++ b/PySysDB/PySysDBG.h @@ -39,6 +39,15 @@ BYTE BossFBCnt; //BOSS副本次数 }; +//仙盟徽章表 + +struct tagFamilyEmblem +{ + BYTE _EmblemID; //徽章ID + BYTE UnlockFamilyLV; //解锁仙盟等级,为0时代表其他方式解锁 + DWORD ExpireMinutes; //有效时长,分钟 +}; + //仙盟试炼伤血奖励表 struct tagFamilyBossHurtAward diff --git a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini index 512e415..96477c9 100644 --- a/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini +++ b/ServerPython/CoreServerGroup/GameServer/PyNetPack.ini @@ -39,7 +39,7 @@ Writer = Alee Releaser = Alee RegType = 0 -RegisterPackCount = 9 +RegisterPackCount = 10 PacketCMD_1=0xA4 PacketSubCMD_1=0x01 @@ -77,6 +77,10 @@ PacketSubCMD_9=0x12 PacketCallFunc_9=PySearchFamily +PacketCMD_10=0xA4 +PacketSubCMD_10=0x13 +PacketCallFunc_10=OnChangeFamilyEmblem + [GameWorldFamilyWar] ScriptName = GameWorldLogic\GameWorldFamilyWar.py Writer = hxp diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index 4265437..0f9e00f 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -379,6 +379,58 @@ #------------------------------------------------------ +# A4 13 修改家族徽章 #tagCGChangeFamilyEmblem + +class tagCGChangeFamilyEmblem(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("EmblemID", c_ubyte), # 更换的徽章ID + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA4 + self.SubCmd = 0x13 + 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 = 0xA4 + self.SubCmd = 0x13 + self.EmblemID = 0 + return + + def GetLength(self): + return sizeof(tagCGChangeFamilyEmblem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A4 13 修改家族徽章 //tagCGChangeFamilyEmblem: + Cmd:%s, + SubCmd:%s, + EmblemID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.EmblemID + ) + return DumpString + + +m_NAtagCGChangeFamilyEmblem=tagCGChangeFamilyEmblem() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGChangeFamilyEmblem.Cmd,m_NAtagCGChangeFamilyEmblem.SubCmd))] = m_NAtagCGChangeFamilyEmblem + + +#------------------------------------------------------ # A4 08 查询家族行为信息 #tagCGQueryFamilyAction class tagCGQueryFamilyAction(Structure): @@ -712,6 +764,7 @@ Head = tagHead() Name = "" #(char Name[33]) FakeID = 0 #(WORD FakeID)//假仙盟编号 + EmblemID = 0 #(BYTE EmblemID)//选择徽章ID,解锁仙盟等级为1级的均为可选ID data = None def __init__(self): @@ -725,6 +778,7 @@ _pos = self.Head.ReadData(_lpData, _pos) self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) self.FakeID,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos) return _pos def Clear(self): @@ -734,6 +788,7 @@ self.Head.SubCmd = 0x04 self.Name = "" self.FakeID = 0 + self.EmblemID = 0 return def GetLength(self): @@ -741,6 +796,7 @@ length += self.Head.GetLength() length += 33 length += 2 + length += 1 return length @@ -749,18 +805,21 @@ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) data = CommFunc.WriteString(data, 33, self.Name) data = CommFunc.WriteWORD(data, self.FakeID) + data = CommFunc.WriteBYTE(data, self.EmblemID) return data def OutputString(self): DumpString = ''' Head:%s, Name:%s, - FakeID:%d + FakeID:%d, + EmblemID:%d '''\ %( self.Head.OutputString(), self.Name, - self.FakeID + self.FakeID, + self.EmblemID ) return DumpString diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index f208134..4a01742 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -2409,6 +2409,7 @@ WarRank = 0 #(BYTE WarRank)//联赛排名 TotalFightPower = 0 #(DWORD TotalFightPower)//总战力,不足1个亿的部分 TotalFightPowerEx = 0 #(DWORD TotalFightPowerEx)//总战力点,1点=1亿 + EmblemID = 0 #(BYTE EmblemID)//徽章ID data = None def __init__(self): @@ -2431,6 +2432,7 @@ self.WarRank,_pos = CommFunc.ReadBYTE(_lpData, _pos) self.TotalFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.TotalFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos) return _pos def Clear(self): @@ -2448,6 +2450,7 @@ self.WarRank = 0 self.TotalFightPower = 0 self.TotalFightPowerEx = 0 + self.EmblemID = 0 return def GetLength(self): @@ -2466,6 +2469,7 @@ length += 1 length += 4 length += 4 + length += 1 return length @@ -2485,6 +2489,7 @@ data = CommFunc.WriteBYTE(data, self.WarRank) data = CommFunc.WriteDWORD(data, self.TotalFightPower) data = CommFunc.WriteDWORD(data, self.TotalFightPowerEx) + data = CommFunc.WriteBYTE(data, self.EmblemID) return data def OutputString(self): @@ -2502,7 +2507,8 @@ JoinAccept:%d, WarRank:%d, TotalFightPower:%d, - TotalFightPowerEx:%d + TotalFightPowerEx:%d, + EmblemID:%d '''\ %( self.FamilyIndex, @@ -2518,7 +2524,8 @@ self.JoinAccept, self.WarRank, self.TotalFightPower, - self.TotalFightPowerEx + self.TotalFightPowerEx, + self.EmblemID ) return DumpString diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py index 8454d86..fd72e8a 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetFamilyInfo.py @@ -17,6 +17,7 @@ #--------------------------------------------------------------------- #"""Version = 2016-06-06 22:00""" #--------------------------------------------------------------------- +import PlayerFamilyEmblem import PlayerFamily import GameWorld #--------------------------------------------------------------------- @@ -28,7 +29,8 @@ Def_FamilyInfo_FightPower, # 设置家族总战力 Def_FamilyInfo_BossFood, # 设置家族兽粮 Def_FamilyInfo_WeekMissionMoney, # 本周任务资金 -) = range(6) +Def_FamilyInfo_Emblem, # 徽章 +) = range(7) #系统提示信息表 Def_MsgDict = { @@ -38,11 +40,8 @@ Def_FamilyInfo_FightPower:'总战力', Def_FamilyInfo_BossFood:'兽粮', Def_FamilyInfo_WeekMissionMoney:'本周任务资金', - "all":'所有属性', + Def_FamilyInfo_Emblem:'设置徽章', } - -#设置全部属性时需要设置的属性类型, 一般用于快速测试用 -Def_SetAllFamilyInfoList = [Def_FamilyInfo_Money] #--------------------------------------------------------------------- ## 执行逻辑 # @param curPlayer 当前玩家 @@ -50,13 +49,14 @@ # @return None # @remarks 函数详细说明. def OnExec(curPlayer, cmdList): - if len(cmdList) != 2: + if not cmdList: helpStr = "" for index, name in Def_MsgDict.items(): helpStr = helpStr + "%s-%s," % (index, name) GameWorld.DebugAnswer(curPlayer, 'SetFamilyInfo 类型 数值') GameWorld.DebugAnswer(curPlayer, '%s' % helpStr) #GameWorld.DebugAnswer(curPlayer, ' 特殊: SetFamilyInfo all, 数值; 可设置所有战盟属性数值') + GameWorld.DebugAnswer(curPlayer, '设置徽章: %s 徽章ID [剩余时间秒]' % Def_FamilyInfo_Emblem) return curFamily = curPlayer.GetFamily() @@ -65,12 +65,13 @@ GameWorld.DebugAnswer(curPlayer, 'SetFamilyInfo 错误 玩家无家族') return - funcType, funcValue = cmdList - infoTypeList = [funcType] - if funcType == "all": - infoTypeList = Def_SetAllFamilyInfoList - - __SetFamilyInfoValue(curPlayer, curFamily, infoTypeList, funcValue) + funcType = cmdList[0] + funcValue = cmdList[1] if len(cmdList) > 1 else 0 + + if not __SetFamilyInfoValue(curPlayer, curFamily, funcType, funcValue, cmdList): + GameWorld.DebugAnswer(curPlayer, '设置家族%s 失败, 数值 = %s'%(Def_MsgDict[funcType], funcValue)) + return + #通知客户端刷新 curFamily.Broadcast_FamilyChange() #通知地图服务器刷新 @@ -79,44 +80,50 @@ GameWorld.DebugAnswer(curPlayer, '设置家族%s 成功, 数值 = %s'%(Def_MsgDict[funcType], funcValue)) return -def __SetFamilyInfoValue(curPlayer, curFamily, infoTypeList, funcValue): +def __SetFamilyInfoValue(curPlayer, curFamily, funcType, funcValue, cmdList): isLVUP = False isSort = False - - for funcType in infoTypeList: + + if funcType == Def_FamilyInfo_LV: + curFamily.SetLV(funcValue) + isSort = True - if funcType == Def_FamilyInfo_LV: - curFamily.SetLV(funcValue) - isSort = True - - elif funcType == Def_FamilyInfo_Money: - curFamily.SetMoney(funcValue) - isLVUP = True - if funcValue == 0: - PlayerFamily.SetCurWeekMissionMoney(curFamily, 0) - - elif funcType == Def_FamilyInfo_WarRank: - PlayerFamily.SetFamilyWarRank(curFamily, funcValue) - isSort = True - - elif funcType == Def_FamilyInfo_FightPower: - PlayerFamily.SetFamilyTotalFightPower(curFamily, funcValue) - isSort = True - - elif funcType == Def_FamilyInfo_BossFood: - PlayerFamily.SetFamilyBossFood(curFamily, funcValue) - - elif funcType == Def_FamilyInfo_WeekMissionMoney: + elif funcType == Def_FamilyInfo_Money: + curFamily.SetMoney(funcValue) + isLVUP = True + if funcValue == 0: PlayerFamily.SetCurWeekMissionMoney(curFamily, 0) - else: - GameWorld.DebugAnswer(curPlayer, 'SetFamilyInfo 错误 funcType = %s'%(funcType)) + elif funcType == Def_FamilyInfo_WarRank: + PlayerFamily.SetFamilyWarRank(curFamily, funcValue) + isSort = True + + elif funcType == Def_FamilyInfo_FightPower: + PlayerFamily.SetFamilyTotalFightPower(curFamily, funcValue) + isSort = True + + elif funcType == Def_FamilyInfo_BossFood: + PlayerFamily.SetFamilyBossFood(curFamily, funcValue) + + elif funcType == Def_FamilyInfo_WeekMissionMoney: + PlayerFamily.SetCurWeekMissionMoney(curFamily, 0) + + elif funcType == Def_FamilyInfo_Emblem: + setExpireTimes = None + if len(cmdList) > 2: + setExpireTimes = cmdList[2] + if not PlayerFamilyEmblem.AddFamilyEmblem(curFamily.GetID(), funcValue, setExpireTimes): + return + + else: + return + #自动升级战盟 if isLVUP: if PlayerFamily.DoFamilyLvUp(curFamily): isSort = False if isSort: PlayerFamily.DoFamilySort() - return + return True \ No newline at end of file diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py index 6d688c0..4f469c5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py @@ -98,6 +98,7 @@ import IpyGameDataPY import PlayerFamilyParty import PlayerFamilyZhenfa +import PlayerFamilyEmblem import GameWorldFamilyWar import GameWorldArena import CrossLuckyCloudBuy @@ -401,6 +402,7 @@ if curMinute % 5 == 0: PlayerFamily.UpdFamilyTotalFightPower() PlayerFamilyRedPacket.CheckDelRedpacketData() + PlayerFamilyEmblem.CheckExpireEmblem() return diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py index 2a98b53..348090e 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py @@ -62,6 +62,12 @@ ("BYTE", "BossFBCnt", 0), ), + "FamilyEmblem":( + ("BYTE", "EmblemID", 1), + ("BYTE", "UnlockFamilyLV", 0), + ("DWORD", "ExpireMinutes", 0), + ), + "FamilyBossHurtAward":( ("BYTE", "AwardType", 1), ("BYTE", "RecordIndex", 1), @@ -1212,6 +1218,17 @@ def GetNeedMoney(self): return self.attrTuple[4] # 升级需要资金 DWORD def GetWeekMissionMoneyMax(self): return self.attrTuple[5] # 每周任务最大可获得仙盟资金 DWORD def GetBossFBCnt(self): return self.attrTuple[6] # BOSS副本次数 BYTE + +# 仙盟徽章表 +class IPY_FamilyEmblem(): + + def __init__(self): + self.attrTuple = None + return + + def GetEmblemID(self): return self.attrTuple[0] # 徽章ID BYTE + def GetUnlockFamilyLV(self): return self.attrTuple[1] # 解锁仙盟等级,为0时代表其他方式解锁 BYTE + def GetExpireMinutes(self): return self.attrTuple[2] # 有效时长,分钟 DWORD # 仙盟试炼伤血奖励表 class IPY_FamilyBossHurtAward(): @@ -2882,6 +2899,7 @@ self.__LoadFileData("CreateRoleLimitServer", onlyCheck) self.__LoadFileData("WorldLV", onlyCheck) self.__LoadFileData("Family", onlyCheck) + self.__LoadFileData("FamilyEmblem", onlyCheck) self.__LoadFileData("FamilyBossHurtAward", onlyCheck) self.__LoadFileData("FamilyZhenfa", onlyCheck) self.__LoadFileData("MarketQuery", onlyCheck) @@ -3217,6 +3235,13 @@ self.CheckLoadData("Family") return self.ipyFamilyCache[index] + def GetFamilyEmblemCount(self): + self.CheckLoadData("FamilyEmblem") + return self.ipyFamilyEmblemLen + def GetFamilyEmblemByIndex(self, index): + self.CheckLoadData("FamilyEmblem") + return self.ipyFamilyEmblemCache[index] + def GetFamilyBossHurtAwardCount(self): self.CheckLoadData("FamilyBossHurtAward") return self.ipyFamilyBossHurtAwardLen diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py index 9dc63bf..8b22ad5 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py @@ -38,6 +38,7 @@ import PlayerBillboard import PlayerActBossTrial import PlayerCompensation +import PlayerFamilyEmblem import PlayerFamilyParty import PlayerFamilySWRH import PlayerViewCache @@ -75,9 +76,9 @@ if not family: return 0 return GetFamilyTotalFightPower(family) -# 徽章 -def GetFamilyEmblem(curFamily): return curFamily.GetExtra6() -def SetFamilyEmblem(curFamily, value): return curFamily.SetExtra6(value) +# 徽章ID +def GetFamilyEmblemID(curFamily): return curFamily.GetExtra6() +def SetFamilyEmblemID(curFamily, emblemID): return curFamily.SetExtra6(emblemID) # 公告修改次数 def GetFamilyBroadcastCnt(curFamily): return curFamily.GetExtra3() @@ -270,7 +271,7 @@ # @param tick 当前时间 # @return None # @remarks 函数详细说明. -def DoCreateFamily(curPlayer, familyName, fakeIndex, tick): +def DoCreateFamily(curPlayer, familyName, fakeIndex, tick, emblemID=0): #---验证玩家属性--- curPlayerID = curPlayer.GetPlayerID() @@ -327,12 +328,16 @@ if curFamily == None: GameWorld.ErrLog("家族创建数目已满, 创建家族失败", curPlayerID) return - GameWorld.Log("创建仙盟: familyID=%s,playerID=%s" % (curFamily.GetID(), curPlayerID)) + emblemIDList = PlayerFamilyEmblem.GetDefaultFamilyEmblemIDList() + if not emblemID or emblemID not in emblemIDList: + emblemID = random.choice(emblemIDList) # 从默认徽章中随机选择一个 + GameWorld.Log("创建仙盟: familyID=%s,playerID=%s,emblemID=%s" % (curFamily.GetID(), curPlayerID, emblemID)) #---创建家族--- curFamily.SetServerID(GameWorld.GetAccIDServerID(curPlayer.GetAccID())) curFamily.SetCreateTime(GameWorld.GetCurrentDataTimeStr()) curFamily.SetLV(1) curFamily.SetAcceptJoin(ShareDefine.FamilyAcceptJoin_Agree) #设置收人方式为直接通过申请 + SetFamilyEmblemID(curFamily, emblemID) PyDataManager.GetFamilyStoreItemManager().DelFamilyStoreItemAll(curFamily.GetID()) #新创建的仙盟默认设置已处理过合服 @@ -597,6 +602,7 @@ # tagHead Head; # char Name[33]; # WORD FakeID; +# BYTE EmblemID; //选择徽章ID,解锁仙盟等级为1级的均为可选ID #}; ## 查看申请帮会的成员信息 # @param index 玩家索引 @@ -607,8 +613,9 @@ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) inputName = clientPack.Name fakeIndex = clientPack.FakeID + emblemID = clientPack.EmblemID #执行创建家族逻辑 - DoCreateFamily(curPlayer, inputName, fakeIndex, tick) + DoCreateFamily(curPlayer, inputName, fakeIndex, tick, emblemID) #重置查看家族状态(仅创建家族时候重置, 其余状态由MapServer退出事件时重置) __ClearViewFamilyState(curPlayer) #玩家离开事件 @@ -744,6 +751,7 @@ totalFightPower = GetFamilyTotalFightPower(family) familyView.TotalFightPower = totalFightPower % ChConfig.Def_PerPointValue familyView.TotalFightPowerEx = totalFightPower / ChConfig.Def_PerPointValue + familyView.EmblemID = GetFamilyEmblemID(family) return familyView ## 玩家模糊查询家族,0F 0D封包 @@ -824,6 +832,19 @@ break familyViewPack.PageCount = len(familyViewPack.Family) NetPackCommon.SendFakePack(curPlayer, familyViewPack) + return + +#// A4 13 修改家族徽章 #tagCGChangeFamilyEmblem +# +#struct tagCGChangeFamilyEmblem +#{ +# tagHead Head; +# BYTE EmblemID; // 更换的徽章ID +#}; +def OnChangeFamilyEmblem(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + changeEmblemID = clientData.EmblemID + PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID) return #class IPY_CFamilyChangeBroadcast @@ -3774,7 +3795,7 @@ fightPower = GetFamilyTotalFightPower(curFamily) value1 = fightPower / ChConfig.Def_PerPointValue value2 = fightPower % ChConfig.Def_PerPointValue - value3 = GetFamilyEmblem(curFamily) + value3 = GetFamilyEmblemID(curFamily) value4 = curFamily.GetLV() value5 = curFamily.GetServerID() return {"id":familyID, "name":name, "id2":id2, "name2":name2, "value1":value1, "value2":value2, diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py index 356f27f..0528290 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py @@ -557,6 +557,51 @@ return +def SendFamilyAction(familyActionData, curPlayer=None): + + familyID = familyActionData.GetFamilyId() + + actionInfoPack = ChPyNetSendPack.tagGCFamilyActionInfo() + actionInfoPack.Clear() + actionInfoPack.FamilyID = familyID + actionInfoPack.ActionType = familyActionData.GetActionType() + actionInfoPack.FamilyActionList = [] + + actionData = ChPyNetSendPack.tagGCFamilyAction() + actionData.Clear() + actionData.Time = familyActionData.GetTime() + actionData.Name = familyActionData.GetName() + actionData.NameLen = len(actionData.Name) + actionData.Value1 = familyActionData.GetValue1() + actionData.Value2 = familyActionData.GetValue2() + actionData.Value3 = familyActionData.GetValue3() + actionData.Value4 = familyActionData.GetValue4() + actionData.Value5 = familyActionData.GetValue5() + actionData.Value6 = familyActionData.GetValue6() + actionData.UseData = familyActionData.GetUseData() + actionData.UseDataLen = len(actionData.UseData) + actionInfoPack.FamilyActionList.append(actionData) + + actionInfoPack.Count = len(actionInfoPack.FamilyActionList) + + if curPlayer: + NetPackCommon.SendFakePack(curPlayer, actionInfoPack) + return + + # 没有指定玩家的情况下通知全战盟 + family = GameWorld.GetFamilyManager().FindFamily(familyID) + if not family: + return + + for index in xrange(family.GetCount()): + curMember = family.GetAt(index) + curPlayer = curMember.GetPlayer() + #不在线 + if curPlayer == None: + continue + NetPackCommon.SendFakePack(curPlayer, actionInfoPack) + + return ## 删除时机: 1-降为普通成员;2-退出家族 def DelFamilyOfficerModelEquip(familyID, delPlayerID): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py new file mode 100644 index 0000000..da087bb --- /dev/null +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py @@ -0,0 +1,200 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package PlayerFamilyEmblem +# +# @todo:仙盟徽章 +# @author hxp +# @date 2024-09-09 +# @version 1.0 +# +# 详细描述: 仙盟徽章 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-09-09 15:30""" +#------------------------------------------------------------------------------- + +import GameWorld +import ShareDefine +import PlayerFamilyAction +import IpyGameDataPY +import PlayerFamily + +import random +import time + +def GetActionEmblemID(emblemActionObj): return emblemActionObj.GetValue1() +def SetActionEmblemID(emblemActionObj, emblemID): return emblemActionObj.SetValue1(emblemID) +def GetActionEmblemExpireTimes(emblemActionObj): return emblemActionObj.GetValue2() +def SetActionEmblemExpireTimes(emblemActionObj, endTime): return emblemActionObj.SetValue2(endTime) + +def GetDefaultFamilyEmblemIDList(): + ## 获取默认的仙盟徽章ID列表,即所有解锁等级为1的徽章ID + defaultEmblemIDList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetFamilyEmblemCount()): + ipyData = ipyDataMgr.GetFamilyEmblemByIndex(index) + emblemID = ipyData.GetEmblemID() + if ipyData.GetUnlockFamilyLV() == 1: + defaultEmblemIDList.append(emblemID) + return defaultEmblemIDList + +def CheckExpireEmblem(): + ## 检查过期的勋章 + + defaultEmblemIDList = [] + curTime = int(time.time()) + actionType = ShareDefine.Def_ActionType_FamilyEmblem + familyManager = GameWorld.GetFamilyManager() + familyActionMgr = GameWorld.GetFamilyActionManager() + for i in xrange(familyManager.GetCount()): + family = familyManager.GetAt(i) + if not family: + continue + familyID = family.GetID() + familyAction = familyActionMgr.GetFamilyAction(familyID, actionType) + for index in range(familyAction.Count())[::-1]: # 可能触发删除,倒序遍历 + emblemActionObj = familyAction.At(index) + emblemID = GetActionEmblemID(emblemActionObj) + isExpired, endTime = IsEmblemExpired(emblemActionObj, curTime) + if not isExpired: + #GameWorld.Log("检查仙盟徽章未过期! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime)) + continue + familyAction.DelAction(index) + GameWorld.Log("删除过期仙盟徽章! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime)) + if PlayerFamily.GetFamilyEmblemID(family) == emblemID: + if not defaultEmblemIDList: + defaultEmblemIDList = GetDefaultFamilyEmblemIDList() + updEmblemID = random.choice(defaultEmblemIDList) if defaultEmblemIDList else 0 + GameWorld.Log("仙盟佩戴徽章过期恢复随机默认徽章! familyID=%s,emblemID=%s,endTime=%s,updEmblemID=%s" % (familyID, emblemID, endTime, updEmblemID)) + PlayerFamily.SetFamilyEmblemID(family, updEmblemID) + family.Broadcast_FamilyChange() + return + +def IsEmblemExpired(emblemActionObj, curTime): + ## 勋章是否过期 + # @return: 是否过期, endTime + + endTime = -1 + if not emblemActionObj: + return True, endTime + + createTime = emblemActionObj.GetTime() + expireTimes = GetEmblemExpireTimes(emblemActionObj) + if expireTimes == 0: + # 永久的 + return False, 0 + + if expireTimes > 0: + endTime = createTime + expireTimes + if endTime >= curTime: + # 未过期 + return False, endTime + + return True, endTime + +def GetEmblemExpireTimes(emblemActionObj): + ## 获取勋章有效时长,秒 + # @return: 0-永久;-1-无效;>0-有效秒数 + expireTimes = GetActionEmblemExpireTimes(emblemActionObj) # 有效时长,秒 + if not expireTimes: + emblemID = GetActionEmblemID(emblemActionObj) + ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID) + if not ipyData: + return -1 + expireTimes = ipyData.GetExpireMinutes() * 60 + return expireTimes + +def GetFamilyEmblemActionData(familyID, emblemID): + ## 获取仙盟时效徽章Action数据 + actionType = ShareDefine.Def_ActionType_FamilyEmblem + familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType) + for index in range(familyAction.Count()): + familyActionObj = familyAction.At(index) + if emblemID == familyActionObj.GetValue1(): + return familyActionObj + return + +def AddFamilyEmblem(familyID, emblemID, setExpireTimes=None): + ## 添加仙盟徽章 + # @param setExpireTimes: 指定的有效时长秒,0-永久,>0-有效时长秒;没有指定时直接读配置进行累加 + + ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID) + if not ipyData: + return + unlockFamilyLV = ipyData.GetUnlockFamilyLV() + if unlockFamilyLV: + GameWorld.Log("仙盟解锁的徽章不需要添加! familyID=%s,emblemID=%s" % (familyID, emblemID)) + return + if setExpireTimes >= 0: + expireTimes = setExpireTimes + else: + expireTimes = ipyData.GetExpireMinutes() * 60 + GameWorld.Log("添加仙盟徽章! familyID=%s,emblemID=%s,setExpireTimes=%s,expireTimes=%s" + % (familyID, emblemID, setExpireTimes, expireTimes)) + + curTime = int(time.time()) + emblemActionObj = GetFamilyEmblemActionData(familyID, emblemID) + if not emblemActionObj: + actionType = ShareDefine.Def_ActionType_FamilyEmblem + familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType) + emblemActionObj = familyAction.AddAction() + emblemActionObj.SetTime(curTime) + emblemActionObj.SetFamilyId(familyID) + emblemActionObj.SetActionType(actionType) + else: + isExpired, endTime = IsEmblemExpired(emblemActionObj, curTime) + if setExpireTimes >= 0: + emblemActionObj.SetTime(curTime) + GameWorld.Log("直接设置勋章剩余时长,重新设置获得时间! familyID=%s,emblemID=%s" % (familyID, emblemID)) + elif isExpired: + emblemActionObj.SetTime(curTime) + GameWorld.Log("获得勋章时已过期,重新设置获得时间! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime)) + else: + # 未过期,非永久的直接累加时长 + if expireTimes > 0: + expireTimes += GetActionEmblemExpireTimes(emblemActionObj) + GameWorld.Log("获得勋章时未过期,累加有效时长! familyID=%s,emblemID=%s,expireTimes=%s" % (familyID, emblemID, expireTimes)) + + SetActionEmblemID(emblemActionObj, emblemID) + SetActionEmblemExpireTimes(emblemActionObj, expireTimes) + + # 通知 + PlayerFamilyAction.SendFamilyAction(emblemActionObj) + return emblemActionObj + +def OnChangeFamilyEmblem(curPlayer, emblemID): + ## 修改仙盟徽章 + playerID = curPlayer.GetPlayerID() + curFamily = curPlayer.GetFamily() + if not curFamily: + return + familyID = curFamily.GetID() + + if curFamily.GetLeaderID() != playerID: + GameWorld.DebugLog("只有盟主可以修改徽章!", playerID) + return + + ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID) + if not ipyData: + return + unlockFamilyLV = ipyData.GetUnlockFamilyLV() + + if unlockFamilyLV: + if curFamily.GetLV() < unlockFamilyLV: + GameWorld.DebugLog("仙盟等级不足,无法使用该徽章! emblemID=%s,unlockFamilyLV=%s" + % (emblemID, unlockFamilyLV), playerID) + return + else: + emblemActionObj = GetFamilyEmblemActionData(familyID, emblemID) + isExpired, endTime = IsEmblemExpired(emblemActionObj, int(time.time())) + if isExpired: + GameWorld.DebugLog("该徽章不存在或已过期! emblemID=%s,endTime=%s" % (emblemID, endTime), playerID) + return + + GameWorld.DebugLog("更换仙盟徽章! familyID=%s,emblemID=%s" % (familyID, emblemID), playerID) + PlayerFamily.SetFamilyEmblemID(curFamily, emblemID) + PlayerFamily.SendPack_MapServer_PlayerFamilyRefresh(curFamily) + curFamily.Broadcast_FamilyChange() + return diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py index 048b2f1..8ba4720 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py @@ -1483,7 +1483,8 @@ Def_ActionType_FamilyEvent, #记录家族事件12 Def_ActionType_BossTrialSubmit, #boss凭证提交 13 Def_ActionType_FamilyCTGAssist, #仙盟充值协助活动 14 - ) = range(0, 15) + Def_ActionType_FamilyEmblem, #仙盟时效徽章信息 15 + ) = range(0, 16) # 家族行为事件类型定义; Def_ActionType_FamilyEvent; 存与事件记录Value1 # 通用:time-时间;name-玩家;value1-事件类型 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index b0f48ea..4e66f6a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -3637,6 +3637,7 @@ Def_Player_Dict_UpdateFamilyName = "UpdateFamilyName" # 改名锁 Def_Player_Dict_FamilyDayAward = "FamilyDayAward" # 仙盟每日奖励领奖记录 Def_Player_Dict_FamilyMoneyDonateCount = "FamilyMoneyDonateCount" # 仙盟今日货币捐献次数 +Def_Player_Dict_FamilyEmblemID = "FamilyEmblemID" # 仙盟徽章ID # 仙盟事务 Def_Player_Dict_FamilyAffairRefreshFree = "FamilyAffairRefreshFree" # 今日已免费刷新事务次数 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index 4265437..0f9e00f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -379,6 +379,58 @@ #------------------------------------------------------ +# A4 13 修改家族徽章 #tagCGChangeFamilyEmblem + +class tagCGChangeFamilyEmblem(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("EmblemID", c_ubyte), # 更换的徽章ID + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA4 + self.SubCmd = 0x13 + 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 = 0xA4 + self.SubCmd = 0x13 + self.EmblemID = 0 + return + + def GetLength(self): + return sizeof(tagCGChangeFamilyEmblem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A4 13 修改家族徽章 //tagCGChangeFamilyEmblem: + Cmd:%s, + SubCmd:%s, + EmblemID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.EmblemID + ) + return DumpString + + +m_NAtagCGChangeFamilyEmblem=tagCGChangeFamilyEmblem() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGChangeFamilyEmblem.Cmd,m_NAtagCGChangeFamilyEmblem.SubCmd))] = m_NAtagCGChangeFamilyEmblem + + +#------------------------------------------------------ # A4 08 查询家族行为信息 #tagCGQueryFamilyAction class tagCGQueryFamilyAction(Structure): @@ -712,6 +764,7 @@ Head = tagHead() Name = "" #(char Name[33]) FakeID = 0 #(WORD FakeID)//假仙盟编号 + EmblemID = 0 #(BYTE EmblemID)//选择徽章ID,解锁仙盟等级为1级的均为可选ID data = None def __init__(self): @@ -725,6 +778,7 @@ _pos = self.Head.ReadData(_lpData, _pos) self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) self.FakeID,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos) return _pos def Clear(self): @@ -734,6 +788,7 @@ self.Head.SubCmd = 0x04 self.Name = "" self.FakeID = 0 + self.EmblemID = 0 return def GetLength(self): @@ -741,6 +796,7 @@ length += self.Head.GetLength() length += 33 length += 2 + length += 1 return length @@ -749,18 +805,21 @@ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) data = CommFunc.WriteString(data, 33, self.Name) data = CommFunc.WriteWORD(data, self.FakeID) + data = CommFunc.WriteBYTE(data, self.EmblemID) return data def OutputString(self): DumpString = ''' Head:%s, Name:%s, - FakeID:%d + FakeID:%d, + EmblemID:%d '''\ %( self.Head.OutputString(), self.Name, - self.FakeID + self.FakeID, + self.EmblemID ) return DumpString diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index f208134..4a01742 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -2409,6 +2409,7 @@ WarRank = 0 #(BYTE WarRank)//联赛排名 TotalFightPower = 0 #(DWORD TotalFightPower)//总战力,不足1个亿的部分 TotalFightPowerEx = 0 #(DWORD TotalFightPowerEx)//总战力点,1点=1亿 + EmblemID = 0 #(BYTE EmblemID)//徽章ID data = None def __init__(self): @@ -2431,6 +2432,7 @@ self.WarRank,_pos = CommFunc.ReadBYTE(_lpData, _pos) self.TotalFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) self.TotalFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadBYTE(_lpData, _pos) return _pos def Clear(self): @@ -2448,6 +2450,7 @@ self.WarRank = 0 self.TotalFightPower = 0 self.TotalFightPowerEx = 0 + self.EmblemID = 0 return def GetLength(self): @@ -2466,6 +2469,7 @@ length += 1 length += 4 length += 4 + length += 1 return length @@ -2485,6 +2489,7 @@ data = CommFunc.WriteBYTE(data, self.WarRank) data = CommFunc.WriteDWORD(data, self.TotalFightPower) data = CommFunc.WriteDWORD(data, self.TotalFightPowerEx) + data = CommFunc.WriteBYTE(data, self.EmblemID) return data def OutputString(self): @@ -2502,7 +2507,8 @@ JoinAccept:%d, WarRank:%d, TotalFightPower:%d, - TotalFightPowerEx:%d + TotalFightPowerEx:%d, + EmblemID:%d '''\ %( self.FamilyIndex, @@ -2518,7 +2524,8 @@ self.JoinAccept, self.WarRank, self.TotalFightPower, - self.TotalFightPowerEx + self.TotalFightPowerEx, + self.EmblemID ) return DumpString diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py index 9581a1b..72d55c4 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -7253,6 +7253,10 @@ def GetAttr160(curPlayer): return 0 def SetAttr160(curPlayer, value): pass +# 仙盟徽章ID +def GetFamilyEmblemID(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyEmblemID) +def SetFamilyEmblemID(curPlayer, emblemID): NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyEmblemID, emblemID) + # 仙盟事务速度加成 def GetAffairSpeedPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AffairSpeedPer) def SetAffairSpeedPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_AffairSpeedPer, value) 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 24c06c9..cd82528 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py @@ -127,6 +127,9 @@ if curPlayer.GetFamilyLastWeekActiveValue() != refreshPack.GetLastWeekFamilyActiveValue(): curPlayer.SetFamilyLastWeekActiveValue(refreshPack.GetLastWeekFamilyActiveValue()) + if hasattr(refreshPack, "GetExtra6") and PlayerControl.GetFamilyEmblemID(curPlayer) != refreshPack.GetExtra6(): + PlayerControl.SetFamilyEmblemID(curPlayer, refreshPack.GetExtra6()) + #---处理特殊逻辑, 进入退出家族--- if lastFamilyID != 0 and curPlayer.GetFamilyID() == 0: diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py index 6ea032f..c102e68 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py @@ -171,6 +171,7 @@ curPlayerPropDict["Name"] = curPlayer.GetPlayerName() curPlayerPropDict["FamilyID"] = curPlayer.GetFamilyID() curPlayerPropDict["FamilyName"] = curPlayer.GetFamilyName() + curPlayerPropDict["FamilyEmblemID"] = PlayerControl.GetFamilyEmblemID(curPlayer) curPlayerPropDict["TitleID"] = PlayerControl.GetTitleID(curPlayer) curPlayerPropDict["CoupleName"] = PlayerControl.GetCoupleName(curPlayer) curPlayerPropDict["FightPower"] = PlayerControl.GetFightPower(curPlayer) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py index 048b2f1..8ba4720 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py @@ -1483,7 +1483,8 @@ Def_ActionType_FamilyEvent, #记录家族事件12 Def_ActionType_BossTrialSubmit, #boss凭证提交 13 Def_ActionType_FamilyCTGAssist, #仙盟充值协助活动 14 - ) = range(0, 15) + Def_ActionType_FamilyEmblem, #仙盟时效徽章信息 15 + ) = range(0, 16) # 家族行为事件类型定义; Def_ActionType_FamilyEvent; 存与事件记录Value1 # 通用:time-时间;name-玩家;value1-事件类型 -- Gitblit v1.8.0