From 6a9883b425e53e714b9a930ec70b7544999611a6 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 08 五月 2025 12:01:45 +0800 Subject: [PATCH] 16 卡牌服务端(db数据备档、加载;仙盟基础转到MapServer;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/__init__.py | 0 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py | 248 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 2252 ++++++++------- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyZhenbaoge.py | 4 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 617 ++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 832 +++++ PySysDB/生成IpyGameDataPY/config.ini | 4 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DirtyList.py | 75 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 5 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py | 643 ++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Func_11.py | 4 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py | 4 PySysDB/生成IpyGameDataPY/IpyGameDataPYTemp.py | 10 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/__init__.py | 4 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 166 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 9 PySysDB/PySysDBPY.h | 51 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBComm.py | 74 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py | 347 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py | 327 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 11 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py | 4 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ForbiddenFamilyAction.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 8 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py | 197 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyEmblem.py | 185 + /dev/null | 665 ---- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 66 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyNameRefresh.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py | 37 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini | 14 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 12 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py | 1238 +++++++++ PySysDB/生成IpyGameDataPY/IpyGameDataPYCreater.py | 12 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 16 38 files changed, 6,280 insertions(+), 1,879 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index a81dcd4..c2255da 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -1,3 +1,17 @@ +//屏蔽词 +struct DirtyList +{ + WORD ID; + char Word; //屏蔽词 +}; + +//玩家名屏蔽词 +struct DirtyName +{ + WORD ID; + char Word; //屏蔽词 +}; + //称号表 #tagDienstgrad struct tagDienstgrad @@ -3122,6 +3136,43 @@ list AwardItemList; //奖励物品列表[[物品ID,个数,是否拍品], ...] }; +//仙盟等级表 +struct Family +{ + BYTE _FamilyLV; //仙盟等级 + BYTE MemberMax; //成员数上限 + BYTE DeputyLeaderMax; //副盟主数上限 + BYTE EliteMax; //精英数上限 + DWORD NeedExp; //升级所需经验 + DWORD ZhenbaogeWeights; //珍宝阁总权重 +}; + +//仙盟徽章表 +struct FamilyEmblem +{ + BYTE _EmblemID; //徽章ID + BYTE UnlockFamilyLV; //解锁仙盟等级,为0时代表其他方式解锁 + DWORD ExpireMinutes; //有效时长,分钟 + DWORD CustomFamilyID; //定制仙盟ID +}; + +//仙盟珍宝阁砍价表 +struct FamilyZhenbaogeCut +{ + BYTE _CutNum; //砍价人次 + DWORD CutWeight; //砍价权重 + float MinRatio; //保底比值 + float RandRatio; //随机比值 +}; + +//仙盟珍宝阁物品表 +struct FamilyZhenbaogeItem +{ + BYTE _ItemGroupNum; //物品组编号 + DWORD ItemWeight; //随机权重 + list ItemList; //物品列表[[物品ID,个数,是否拍品], ...] +}; + //仙盟阵法表 struct tagFamilyZhenfa diff --git "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYCreater.py" "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYCreater.py" index 673f776..567e787 100644 --- "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYCreater.py" +++ "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYCreater.py" @@ -94,12 +94,14 @@ continue if "struct" in line: - tagIndex = line.index("tag") + line = line.strip() if "{" in line: - tableName = line[tagIndex + 3:line.index("{")] + tableName = line[6:line.index("{")] else: - tableName = line[tagIndex + 3:] - tableName = tableName.replace(" ", "") # 表名英文名 + tableName = line[6:] + tableName = tableName.replace("\t", "").replace(" ", "") # 表名英文名 + if tableName.startswith("tag"): + tableName = tableName[3:] continue noteInfo = " #" # 字段注释说明 @@ -115,7 +117,7 @@ if not fieldType: if "struct" not in line and "{" not in line and "}" not in line: print "### 类型定义错误表 ###" - print "struct tag%s" % tableName + print "struct %s" % tableName print line raise continue diff --git "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYTemp.py" "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYTemp.py" index 0a0bb50..185d462 100644 --- "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYTemp.py" +++ "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/IpyGameDataPYTemp.py" @@ -11,6 +11,8 @@ # # 详细描述: 读取PY表 # +# @note: 本脚本由 \PySysDB\生成IpyGameDataPY 生成 +# #------------------------------------------------------------------------------- #"""Version = 2018-05-10 12:00""" #------------------------------------------------------------------------------- @@ -106,10 +108,12 @@ def __LoadFileData(self, tableName, onlyCheck=False): # @param onlyCheck: 是否仅检查格式,一般启动时用 - curPath = "<%LoadStructPath%>" + "\\PySysDB\\tag" + tableName + ".txt" + curPath = "<%LoadStructPath%>" + "\\PySysDB\\" + tableName + ".txt" if not os.path.isfile(curPath): - ErrLog("can not find file = %s,%s" % (tableName, curPath)) - raise Exception("can not find file = %s,%s" % (tableName, curPath)) + curPath = "<%LoadStructPath%>" + "\\PySysDB\\tag" + tableName + ".txt" + if not os.path.isfile(curPath): + ErrLog("can not find file = %s,%s" % (tableName, curPath)) + raise Exception("can not find file = %s,%s" % (tableName, curPath)) if not onlyCheck: if not hasattr(self, "ipy%sLen" % tableName): diff --git "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" index 3ea7d1d..e761818 100644 --- "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" +++ "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" @@ -1,5 +1,5 @@ [config] ; 项目根路径 -CodeProjectPath1 = E:\SnxxServerCode\ServerPython -CodeProjectPath2 = E:\Git\SnxxServerCode\ServerPython +CodeProjectPath1 = D:\SG_ServerCode\ServerPython +;CodeProjectPath2 = D:\SG_ServerCode\ServerPython diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini index f7a998a..e8d28a9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini @@ -193,27 +193,27 @@ Writer = alee Releaser = alee RegType = 0 -RegisterPackCount = 9 +RegisterPackCount = 14 PacketCMD_1=0xA6 PacketSubCMD_1=0x01 -PacketCallFunc_1=RequestAddFamilyByID +PacketCallFunc_1=OnRequestJoinFamilyByPlayer PacketCMD_2=0xA6 PacketSubCMD_2=0x02 -PacketCallFunc_2=RequestAddFamily +PacketCallFunc_2=OnRequesJoinFamily -PacketCMD_3= -PacketSubCMD_3= -PacketCallFunc_3= +PacketCMD_3=0xA6 +PacketSubCMD_3=0x04 +PacketCallFunc_3=OnCreateFamily PacketCMD_4=0xA6 PacketSubCMD_4=0x11 PacketCallFunc_4=UpdateFamilyName -PacketCMD_5=0xA6 -PacketSubCMD_5=0x06 -PacketCallFunc_5=OnFamilyActivityExchange +PacketCMD_5= +PacketSubCMD_5= +PacketCallFunc_5= PacketCMD_6=0xA6 PacketSubCMD_6=0x12 @@ -224,12 +224,52 @@ PacketCallFunc_7=OnFamilyAffairOP PacketCMD_8=0xA6 -PacketSubCMD_8=0x15 -PacketCallFunc_8=OnChuangongOP +PacketSubCMD_8=0x20 +PacketCallFunc_8=OnViewFamilyPage PacketCMD_9=0xA6 -PacketSubCMD_9=0x16 -PacketCallFunc_9=OnZhenbaogeOP +PacketSubCMD_9=0x21 +PacketCallFunc_9=OnJoinFamilyReply + +PacketCMD_10=0xA6 +PacketSubCMD_10=0x22 +PacketCallFunc_10=OnChangeFamilyJoin + +PacketCMD_11=0xA6 +PacketSubCMD_11=0x23 +PacketCallFunc_11=OnChangeFamilyBroadcast + +PacketCMD_12=0xA6 +PacketSubCMD_12=0x24 +PacketCallFunc_12=OnChangeFamilyEmblem + +PacketCMD_13=0xA6 +PacketSubCMD_13=0x25 +PacketCallFunc_13=OnChangeFamilyMemLV + +PacketCMD_14=0xA6 +PacketSubCMD_14=0x26 +PacketCallFunc_14=OnGetFamilyInfo + +PacketCMD_15=0xA6 +PacketSubCMD_15=0x03 +PacketCallFunc_15=OnLeaveFamily + +PacketCMD_16=0xA6 +PacketSubCMD_16=0x05 +PacketCallFunc_16=OnDeleteFamilyMember + +;珍宝阁 +[PlayerFamilyZhenbaoge] +ScriptName = Player\PlayerFamilyZhenbaoge.py +Writer = hxp +Releaser = hxp +RegType = 0 +RegisterPackCount = 1 + +PacketCMD_1=0xA6 +PacketSubCMD_1=0x16 +PacketCallFunc_1=OnZhenbaogeOP ;家族仓库 [PlayerFamilyStore] diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 713c71b..54f17cd 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -2697,6 +2697,19 @@ queryType_FamilyEmblem, #仙盟徽章 ) = range(0, Def_QueryType_Count) #------------------------------------------------------------------------------ + +#家族某行为类型保存的条数 +ActionTypeSaveCnt = { + ShareDefine.Def_ActionType_FamilyPray:10 , #家族祈福 + ShareDefine.Def_ActionType_FamilyArrest:7, #家族悬赏 + ShareDefine.Def_ActionType_FamilyMember:1, #记录家族成员信息 + ShareDefine.Def_ActionType_LeaderImpeachTime:1, # 族长下线了多久 + ShareDefine.Def_ActionType_FamilyBossFB:1, # 记录家族boss副本信息 + ShareDefine.Def_ActionType_FamilyStore:30, #仓库操作记录 + ShareDefine.Def_ActionType_OfficerModelEquip:10, # 记录家族有职位的成员模型装备信息(盟主+副盟主*2+战斗队长*5) + ShareDefine.Def_ActionType_FamilyEvent:50, # 记录家族事件 + } + #--------------------------------------------------------------------- #数值上限 2^31 - 1 Def_UpperLimit_DWordEx = ShareDefine.Def_UpperLimit_DWordEx @@ -3622,7 +3635,6 @@ Def_Player_Dict_LoginValid = "LoginValid_106" # 新增有效登陆标记 Def_Player_Dict_RequestAddFamilyCnt = "RequestAddFamilyCnt_107" # 已申请加入家族的个数 Def_Player_Dict_RequestAddFamilyID = "AddFamilyID%s_108" # 申请加入的家族ID, %s为第几个 -Def_Player_Dict_FamilyIDChangeTime = "FamilyIDChangeTime" # 记录玩家家族ID变更时间 Def_Player_Dict_LastFamilyID = "LastFamilyID" # 记录玩家上一个家族ID Def_Player_Dict_SingDay = "SingDay_115" #每日签到 Def_Player_Dict_GiveSignAward = "GiveSignAward_116" #每日签到奖励领取 @@ -3658,7 +3670,7 @@ Def_Player_Dict_UpdateFamilyNameItemIndex = "UpdateFamilyNameItemIndex" # 改名物品在背包的位置 Def_Player_Dict_UpdateFamilyName = "UpdateFamilyName" # 改名锁 Def_Player_Dict_FamilyDayAward = "FamilyDayAward" # 仙盟每日奖励领奖记录 -Def_Player_Dict_FamilyMoneyDonateCount = "FamilyMoneyDonateCount" # 仙盟今日货币捐献次数 +Def_Player_Dict_FamilyDonateRecord = "FamilyDonateRecord" # 仙盟今日捐献记录,按位存储每种类型今日已捐献次数 Def_Player_Dict_FamilyEmblemID = "FamilyEmblemID" # 仙盟徽章ID Def_Player_Dict_FamilyZhenbaogeCut = "FamilyZhenbaogeCut" #珍宝阁今日是否已砍过价 Def_Player_Dict_FamilyZhenbaogeBuy = "FamilyZhenbaogeBuy" #珍宝阁今日是否已购买过 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index 939ec1a..763fff9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -15082,6 +15082,227 @@ #------------------------------------------------------ +# A6 23 修改家族公告 #tagCMChangeFamilyBroadcast + +class tagCMChangeFamilyBroadcast(Structure): + Head = tagHead() + Msg = "" #(char Msg[200]) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA6 + self.Head.SubCmd = 0x23 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,200) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA6 + self.Head.SubCmd = 0x23 + self.Msg = "" + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 200 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteString(data, 200, self.Msg) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Msg:%s + '''\ + %( + self.Head.OutputString(), + self.Msg + ) + return DumpString + + +m_NAtagCMChangeFamilyBroadcast=tagCMChangeFamilyBroadcast() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFamilyBroadcast.Head.Cmd,m_NAtagCMChangeFamilyBroadcast.Head.SubCmd))] = m_NAtagCMChangeFamilyBroadcast + + +#------------------------------------------------------ +# A6 24 修改家族徽章 #tagCMChangeFamilyEmblem + +class tagCMChangeFamilyEmblem(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("EmblemID", c_ubyte), # 更换的徽章ID + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x24 + 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 = 0xA6 + self.SubCmd = 0x24 + self.EmblemID = 0 + return + + def GetLength(self): + return sizeof(tagCMChangeFamilyEmblem) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 24 修改家族徽章 //tagCMChangeFamilyEmblem: + Cmd:%s, + SubCmd:%s, + EmblemID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.EmblemID + ) + return DumpString + + +m_NAtagCMChangeFamilyEmblem=tagCMChangeFamilyEmblem() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFamilyEmblem.Cmd,m_NAtagCMChangeFamilyEmblem.SubCmd))] = m_NAtagCMChangeFamilyEmblem + + +#------------------------------------------------------ +# A6 22 修改收人方式 #tagCMChangeFamilyJoin + +class tagCMChangeFamilyJoin(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("JoinReview", c_ubyte), #成员加入是否需要审核,默认0自动加入 + ("JoinLVMin", c_ushort), #限制最低可加入的玩家等级 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x22 + 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 = 0xA6 + self.SubCmd = 0x22 + self.JoinReview = 0 + self.JoinLVMin = 0 + return + + def GetLength(self): + return sizeof(tagCMChangeFamilyJoin) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 22 修改收人方式 //tagCMChangeFamilyJoin: + Cmd:%s, + SubCmd:%s, + JoinReview:%d, + JoinLVMin:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.JoinReview, + self.JoinLVMin + ) + return DumpString + + +m_NAtagCMChangeFamilyJoin=tagCMChangeFamilyJoin() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFamilyJoin.Cmd,m_NAtagCMChangeFamilyJoin.SubCmd))] = m_NAtagCMChangeFamilyJoin + + +#------------------------------------------------------ +# A6 25 修改家族成员职位 #tagCMChangeFamilyMemLV + +class tagCMChangeFamilyMemLV(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("PlayerID", c_int), # 目标成员ID + ("FmLV", c_ubyte), # 变更为xx职位 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x25 + 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 = 0xA6 + self.SubCmd = 0x25 + self.PlayerID = 0 + self.FmLV = 0 + return + + def GetLength(self): + return sizeof(tagCMChangeFamilyMemLV) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 25 修改家族成员职位 //tagCMChangeFamilyMemLV: + Cmd:%s, + SubCmd:%s, + PlayerID:%d, + FmLV:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.PlayerID, + self.FmLV + ) + return DumpString + + +m_NAtagCMChangeFamilyMemLV=tagCMChangeFamilyMemLV() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChangeFamilyMemLV.Cmd,m_NAtagCMChangeFamilyMemLV.SubCmd))] = m_NAtagCMChangeFamilyMemLV + + +#------------------------------------------------------ # A6 15 传功操作 #tagCMChuangongOP class tagCMChuangongOP(Structure): @@ -15210,6 +15431,122 @@ m_NAtagCMRenameFamily=tagCMRenameFamily() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRenameFamily.Head.Cmd,m_NAtagCMRenameFamily.Head.SubCmd))] = m_NAtagCMRenameFamily + + +#------------------------------------------------------ +# A6 04 创建家族 #tagCMCreateFamily + +class tagCMCreateFamily(Structure): + Head = tagHead() + Name = "" #(char Name[33]) + EmblemID = 0 #(WORD EmblemID)//选择徽章ID,解锁仙盟等级为1级的均为可选ID + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA6 + self.Head.SubCmd = 0x04 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.EmblemID,_pos = CommFunc.ReadWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA6 + self.Head.SubCmd = 0x04 + self.Name = "" + self.EmblemID = 0 + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 33 + length += 2 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteString(data, 33, self.Name) + data = CommFunc.WriteWORD(data, self.EmblemID) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Name:%s, + EmblemID:%d + '''\ + %( + self.Head.OutputString(), + self.Name, + self.EmblemID + ) + return DumpString + + +m_NAtagCMCreateFamily=tagCMCreateFamily() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMCreateFamily.Head.Cmd,m_NAtagCMCreateFamily.Head.SubCmd))] = m_NAtagCMCreateFamily + + +#------------------------------------------------------ +# A6 05 删除家族成员 #tagCMDeleteFamilyMember + +class tagCMDeleteFamilyMember(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("MemberID", c_int), + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x05 + 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 = 0xA6 + self.SubCmd = 0x05 + self.MemberID = 0 + return + + def GetLength(self): + return sizeof(tagCMDeleteFamilyMember) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 05 删除家族成员 //tagCMDeleteFamilyMember: + Cmd:%s, + SubCmd:%s, + MemberID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.MemberID + ) + return DumpString + + +m_NAtagCMDeleteFamilyMember=tagCMDeleteFamilyMember() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMDeleteFamilyMember.Cmd,m_NAtagCMDeleteFamilyMember.SubCmd))] = m_NAtagCMDeleteFamilyMember #------------------------------------------------------ @@ -15353,7 +15690,7 @@ _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), - ("MoneyType", c_ubyte), # 捐献货币类型 + ("DonateType", c_ubyte), # 捐献类型 ] def __init__(self): @@ -15370,7 +15707,7 @@ def Clear(self): self.Cmd = 0xA6 self.SubCmd = 0x12 - self.MoneyType = 0 + self.DonateType = 0 return def GetLength(self): @@ -15383,12 +15720,12 @@ DumpString = '''// A6 12 家族捐献货币 //tagCMFamilyMoneyDonate: Cmd:%s, SubCmd:%s, - MoneyType:%d + DonateType:%d '''\ %( self.Cmd, self.SubCmd, - self.MoneyType + self.DonateType ) return DumpString @@ -15570,15 +15907,167 @@ #------------------------------------------------------ -#A6 02 申请加入家族#tagCGRequesJoinFamily +# A6 26 请求家族成员列表 #tagCMGetFamilyInfo -class tagCGRequesJoinFamily(Structure): +class tagCMGetFamilyInfo(Structure): _pack_ = 1 _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), - ("Type", c_ubyte), #申请类型 - ("AddFamilyID", c_int), #申请加入的家族 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x26 + 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 = 0xA6 + self.SubCmd = 0x26 + return + + def GetLength(self): + return sizeof(tagCMGetFamilyInfo) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 26 请求家族成员列表 //tagCMGetFamilyInfo: + Cmd:%s, + SubCmd:%s + '''\ + %( + self.Cmd, + self.SubCmd + ) + return DumpString + + +m_NAtagCMGetFamilyInfo=tagCMGetFamilyInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMGetFamilyInfo.Cmd,m_NAtagCMGetFamilyInfo.SubCmd))] = m_NAtagCMGetFamilyInfo + + +#------------------------------------------------------ +# A6 21 审核请求加入家族 #tagCMJoinFamilyReply + +class tagCMJoinFamilyReply(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("TagPlayerID", c_int), #被审核玩家ID 0则代表全部 + ("IsOK", c_ubyte), #是否同意其加入 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x21 + 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 = 0xA6 + self.SubCmd = 0x21 + self.TagPlayerID = 0 + self.IsOK = 0 + return + + def GetLength(self): + return sizeof(tagCMJoinFamilyReply) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 21 审核请求加入家族 //tagCMJoinFamilyReply: + Cmd:%s, + SubCmd:%s, + TagPlayerID:%d, + IsOK:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.TagPlayerID, + self.IsOK + ) + return DumpString + + +m_NAtagCMJoinFamilyReply=tagCMJoinFamilyReply() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMJoinFamilyReply.Cmd,m_NAtagCMJoinFamilyReply.SubCmd))] = m_NAtagCMJoinFamilyReply + + +#------------------------------------------------------ +# A6 03 离开家族 #tagCMLeaveFamily + +class tagCMLeaveFamily(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA6 + self.SubCmd = 0x03 + 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 = 0xA6 + self.SubCmd = 0x03 + return + + def GetLength(self): + return sizeof(tagCMLeaveFamily) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A6 03 离开家族 //tagCMLeaveFamily: + Cmd:%s, + SubCmd:%s + '''\ + %( + self.Cmd, + self.SubCmd + ) + return DumpString + + +m_NAtagCMLeaveFamily=tagCMLeaveFamily() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMLeaveFamily.Cmd,m_NAtagCMLeaveFamily.SubCmd))] = m_NAtagCMLeaveFamily + + +#------------------------------------------------------ +# A6 02 申请加入家族#tagCMRequesJoinFamily + +class tagCMRequesJoinFamily(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("Type", c_ubyte), #申请类型,0-申请;1-撤销 + ("TagFamilyID", c_int), #目标家族ID,申请时为0代表一键申请家族任意家族 ] def __init__(self): @@ -15596,44 +16085,44 @@ self.Cmd = 0xA6 self.SubCmd = 0x02 self.Type = 0 - self.AddFamilyID = 0 + self.TagFamilyID = 0 return def GetLength(self): - return sizeof(tagCGRequesJoinFamily) + return sizeof(tagCMRequesJoinFamily) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): - DumpString = '''//A6 02 申请加入家族//tagCGRequesJoinFamily: + DumpString = '''// A6 02 申请加入家族//tagCMRequesJoinFamily: Cmd:%s, SubCmd:%s, Type:%d, - AddFamilyID:%d + TagFamilyID:%d '''\ %( self.Cmd, self.SubCmd, self.Type, - self.AddFamilyID + self.TagFamilyID ) return DumpString -m_NAtagCGRequesJoinFamily=tagCGRequesJoinFamily() -ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGRequesJoinFamily.Cmd,m_NAtagCGRequesJoinFamily.SubCmd))] = m_NAtagCGRequesJoinFamily +m_NAtagCMRequesJoinFamily=tagCMRequesJoinFamily() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRequesJoinFamily.Cmd,m_NAtagCMRequesJoinFamily.SubCmd))] = m_NAtagCMRequesJoinFamily #------------------------------------------------------ -#A6 01 向玩家申请加入家族 #tagCGRequestJoinFamilyByPlayer +# A6 01 向玩家申请加入家族 #tagCMRequestJoinFamilyByPlayer -class tagCGRequestJoinFamilyByPlayer(Structure): +class tagCMRequestJoinFamilyByPlayer(Structure): _pack_ = 1 _fields_ = [ ("Cmd", c_ubyte), ("SubCmd", c_ubyte), - ("AddPlayerID", c_int), #申请加入的玩家ID + ("TagPlayerID", c_int), #目标家族玩家ID ] def __init__(self): @@ -15650,31 +16139,31 @@ def Clear(self): self.Cmd = 0xA6 self.SubCmd = 0x01 - self.AddPlayerID = 0 + self.TagPlayerID = 0 return def GetLength(self): - return sizeof(tagCGRequestJoinFamilyByPlayer) + return sizeof(tagCMRequestJoinFamilyByPlayer) def GetBuffer(self): return string_at(addressof(self), self.GetLength()) def OutputString(self): - DumpString = '''//A6 01 向玩家申请加入家族 //tagCGRequestJoinFamilyByPlayer: + DumpString = '''// A6 01 向玩家申请加入家族 //tagCMRequestJoinFamilyByPlayer: Cmd:%s, SubCmd:%s, - AddPlayerID:%d + TagPlayerID:%d '''\ %( self.Cmd, self.SubCmd, - self.AddPlayerID + self.TagPlayerID ) return DumpString -m_NAtagCGRequestJoinFamilyByPlayer=tagCGRequestJoinFamilyByPlayer() -ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGRequestJoinFamilyByPlayer.Cmd,m_NAtagCGRequestJoinFamilyByPlayer.SubCmd))] = m_NAtagCGRequestJoinFamilyByPlayer +m_NAtagCMRequestJoinFamilyByPlayer=tagCMRequestJoinFamilyByPlayer() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMRequestJoinFamilyByPlayer.Cmd,m_NAtagCMRequestJoinFamilyByPlayer.SubCmd))] = m_NAtagCMRequestJoinFamilyByPlayer #------------------------------------------------------ @@ -15815,6 +16304,84 @@ #------------------------------------------------------ +# A6 20 搜索家族列表 #tagCMViewFamilyPage + +class tagCMViewFamilyPage(Structure): + Head = tagHead() + MsgLen = 0 #(BYTE MsgLen)//模糊搜索家族,如果输入为空,则为不限制该条件 + Msg = "" #(String Msg)//size = MsgLen + PageIndex = 0 #(BYTE PageIndex)//查询第X页索引,0~n + ShowCount = 0 #(BYTE ShowCount)//每页数量,前端可自行指定,最大50 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA6 + self.Head.SubCmd = 0x20 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.MsgLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,self.MsgLen) + self.PageIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ShowCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA6 + self.Head.SubCmd = 0x20 + self.MsgLen = 0 + self.Msg = "" + self.PageIndex = 0 + self.ShowCount = 0 + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += len(self.Msg) + length += 1 + length += 1 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.MsgLen) + data = CommFunc.WriteString(data, self.MsgLen, self.Msg) + data = CommFunc.WriteBYTE(data, self.PageIndex) + data = CommFunc.WriteBYTE(data, self.ShowCount) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + MsgLen:%d, + Msg:%s, + PageIndex:%d, + ShowCount:%d + '''\ + %( + self.Head.OutputString(), + self.MsgLen, + self.Msg, + self.PageIndex, + self.ShowCount + ) + return DumpString + + +m_NAtagCMViewFamilyPage=tagCMViewFamilyPage() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMViewFamilyPage.Head.Cmd,m_NAtagCMViewFamilyPage.Head.SubCmd))] = m_NAtagCMViewFamilyPage + + +#------------------------------------------------------ # A6 16 珍宝阁操作 #tagCMZhenbaogeOP class tagCMZhenbaogeOP(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 53a6757..693db8a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -32149,6 +32149,58 @@ #------------------------------------------------------ +# A5 21 家族变更 #tagMCFamilyChange + +class tagMCFamilyChange(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("Type", c_ubyte), + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xA5 + self.SubCmd = 0x21 + 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 = 0xA5 + self.SubCmd = 0x21 + self.Type = 0 + return + + def GetLength(self): + return sizeof(tagMCFamilyChange) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A5 21 家族变更 //tagMCFamilyChange: + Cmd:%s, + SubCmd:%s, + Type:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.Type + ) + return DumpString + + +m_NAtagMCFamilyChange=tagMCFamilyChange() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyChange.Cmd,m_NAtagMCFamilyChange.SubCmd))] = m_NAtagMCFamilyChange + + +#------------------------------------------------------ # A5 06 仙盟每日福利领取状态 #tagMCFamilyDayAward class tagMCFamilyDayAward(Structure): @@ -32313,6 +32365,197 @@ #------------------------------------------------------ +# A5 22 家族申请加入的玩家信息 #tagMCFamilyReqJoinInfo + +class tagMCFamilyReqJoinPlayer(Structure): + PlayerID = 0 #(DWORD PlayerID) + NameLen = 0 #(BYTE NameLen) + Name = "" #(String Name)//size = NameLen + ReqTime = 0 #(DWORD ReqTime)//申请时间戳 + LV = 0 #(WORD LV)//等级 + Job = 0 #(BYTE Job)//职业 + RealmLV = 0 #(BYTE RealmLV)//境界 + Face = 0 #(DWORD Face)//基本脸型 + FacePic = 0 #(DWORD FacePic)//头像框 + FightPower = 0 #(DWORD FightPower)//战力,求余亿部分 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力,整除亿部分 + ServerID = 0 #(DWORD ServerID)//所属区服ID + IsOnLine = 0 #(BYTE IsOnLine)//是否在线 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen) + self.ReqTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.IsOnLine,_pos = CommFunc.ReadBYTE(_lpData, _pos) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.NameLen = 0 + self.Name = "" + self.ReqTime = 0 + self.LV = 0 + self.Job = 0 + self.RealmLV = 0 + self.Face = 0 + self.FacePic = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.ServerID = 0 + self.IsOnLine = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += len(self.Name) + length += 4 + length += 2 + length += 1 + length += 1 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 1 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteBYTE(data, self.NameLen) + data = CommFunc.WriteString(data, self.NameLen, self.Name) + data = CommFunc.WriteDWORD(data, self.ReqTime) + data = CommFunc.WriteWORD(data, self.LV) + data = CommFunc.WriteBYTE(data, self.Job) + data = CommFunc.WriteBYTE(data, self.RealmLV) + data = CommFunc.WriteDWORD(data, self.Face) + data = CommFunc.WriteDWORD(data, self.FacePic) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.ServerID) + data = CommFunc.WriteBYTE(data, self.IsOnLine) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + NameLen:%d, + Name:%s, + ReqTime:%d, + LV:%d, + Job:%d, + RealmLV:%d, + Face:%d, + FacePic:%d, + FightPower:%d, + FightPowerEx:%d, + ServerID:%d, + IsOnLine:%d + '''\ + %( + self.PlayerID, + self.NameLen, + self.Name, + self.ReqTime, + self.LV, + self.Job, + self.RealmLV, + self.Face, + self.FacePic, + self.FightPower, + self.FightPowerEx, + self.ServerID, + self.IsOnLine + ) + return DumpString + + +class tagMCFamilyReqJoinInfo(Structure): + Head = tagHead() + ReqCnt = 0 #(BYTE ReqCnt) + ReqJoinList = list() #(vector<tagMCFamilyReqJoinPlayer> ReqJoinList) + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA5 + self.Head.SubCmd = 0x22 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.ReqCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.ReqCnt): + temReqJoinList = tagMCFamilyReqJoinPlayer() + _pos = temReqJoinList.ReadData(_lpData, _pos) + self.ReqJoinList.append(temReqJoinList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA5 + self.Head.SubCmd = 0x22 + self.ReqCnt = 0 + self.ReqJoinList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.ReqCnt): + length += self.ReqJoinList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.ReqCnt) + for i in range(self.ReqCnt): + data = CommFunc.WriteString(data, self.ReqJoinList[i].GetLength(), self.ReqJoinList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + ReqCnt:%d, + ReqJoinList:%s + '''\ + %( + self.Head.OutputString(), + self.ReqCnt, + "..." + ) + return DumpString + + +m_NAtagMCFamilyReqJoinInfo=tagMCFamilyReqJoinInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyReqJoinInfo.Head.Cmd,m_NAtagMCFamilyReqJoinInfo.Head.SubCmd))] = m_NAtagMCFamilyReqJoinInfo + + +#------------------------------------------------------ # A5 11 打坐信息 #tagMCFamilySitInfo class tagMCFamilySitInfo(Structure): @@ -32370,6 +32613,239 @@ m_NAtagMCFamilySitInfo=tagMCFamilySitInfo() ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilySitInfo.Cmd,m_NAtagMCFamilySitInfo.SubCmd))] = m_NAtagMCFamilySitInfo + + +#------------------------------------------------------ +# A5 23 搜索家族返回列表 #tagMCFamilyViewList + +class tagMCFamilyView(Structure): + FamilyID = 0 #(DWORD FamilyID)//家族ID + FamilyNameLen = 0 #(BYTE FamilyNameLen) + FamilyName = "" #(String FamilyName)//size = FamilyNameLen + LeaderID = 0 #(DWORD LeaderID)//族长ID + LeaderNameLen = 0 #(BYTE LeaderNameLen) + LeaderName = "" #(String LeaderName)//size = LeaderNameLen + FamilyLV = 0 #(BYTE FamilyLV)//家族等级 + JoinReview = 0 #(BYTE JoinReview)//成员加入是否需要审核,默认0自动加入 + JoinLVMin = 0 #(WORD JoinLVMin)//限制最低可加入的玩家等级 + ServerID = 0 #(DWORD ServerID)//区服ID + EmblemID = 0 #(DWORD EmblemID)//徽章ID + FightPower = 0 #(DWORD FightPower)//总战力,求余亿部分 + FightPowerEx = 0 #(DWORD FightPowerEx)//总战力,整除亿部分 + MemberCount = 0 #(BYTE MemberCount)//成员人数 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FamilyNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,self.FamilyNameLen) + self.LeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.LeaderNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LeaderName,_pos = CommFunc.ReadString(_lpData, _pos,self.LeaderNameLen) + self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.JoinReview,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.JoinLVMin,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + return _pos + + def Clear(self): + self.FamilyID = 0 + self.FamilyNameLen = 0 + self.FamilyName = "" + self.LeaderID = 0 + self.LeaderNameLen = 0 + self.LeaderName = "" + self.FamilyLV = 0 + self.JoinReview = 0 + self.JoinLVMin = 0 + self.ServerID = 0 + self.EmblemID = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.MemberCount = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += len(self.FamilyName) + length += 4 + length += 1 + length += len(self.LeaderName) + length += 1 + length += 1 + length += 2 + length += 4 + length += 4 + length += 4 + length += 4 + length += 1 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.FamilyID) + data = CommFunc.WriteBYTE(data, self.FamilyNameLen) + data = CommFunc.WriteString(data, self.FamilyNameLen, self.FamilyName) + data = CommFunc.WriteDWORD(data, self.LeaderID) + data = CommFunc.WriteBYTE(data, self.LeaderNameLen) + data = CommFunc.WriteString(data, self.LeaderNameLen, self.LeaderName) + data = CommFunc.WriteBYTE(data, self.FamilyLV) + data = CommFunc.WriteBYTE(data, self.JoinReview) + data = CommFunc.WriteWORD(data, self.JoinLVMin) + data = CommFunc.WriteDWORD(data, self.ServerID) + data = CommFunc.WriteDWORD(data, self.EmblemID) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteBYTE(data, self.MemberCount) + return data + + def OutputString(self): + DumpString = ''' + FamilyID:%d, + FamilyNameLen:%d, + FamilyName:%s, + LeaderID:%d, + LeaderNameLen:%d, + LeaderName:%s, + FamilyLV:%d, + JoinReview:%d, + JoinLVMin:%d, + ServerID:%d, + EmblemID:%d, + FightPower:%d, + FightPowerEx:%d, + MemberCount:%d + '''\ + %( + self.FamilyID, + self.FamilyNameLen, + self.FamilyName, + self.LeaderID, + self.LeaderNameLen, + self.LeaderName, + self.FamilyLV, + self.JoinReview, + self.JoinLVMin, + self.ServerID, + self.EmblemID, + self.FightPower, + self.FightPowerEx, + self.MemberCount + ) + return DumpString + + +class tagMCFamilyViewList(Structure): + Head = tagHead() + MsgLen = 0 #(BYTE MsgLen) + Msg = "" #(String Msg)//搜索条件原值返回 + PageIndex = 0 #(BYTE PageIndex)//查询第X页索引,0~n + ShowCount = 0 #(BYTE ShowCount)//每页数量 + TotalPage = 0 #(BYTE TotalPage)//一共有多少页 + FamilyCount = 0 #(BYTE FamilyCount) + FamilyList = list() #(vector<tagMCFamilyView> FamilyList)//本页家族信息列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA5 + self.Head.SubCmd = 0x23 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.MsgLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,self.MsgLen) + self.PageIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.ShowCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.TotalPage,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.FamilyCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.FamilyCount): + temFamilyList = tagMCFamilyView() + _pos = temFamilyList.ReadData(_lpData, _pos) + self.FamilyList.append(temFamilyList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA5 + self.Head.SubCmd = 0x23 + self.MsgLen = 0 + self.Msg = "" + self.PageIndex = 0 + self.ShowCount = 0 + self.TotalPage = 0 + self.FamilyCount = 0 + self.FamilyList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += len(self.Msg) + length += 1 + length += 1 + length += 1 + length += 1 + for i in range(self.FamilyCount): + length += self.FamilyList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteBYTE(data, self.MsgLen) + data = CommFunc.WriteString(data, self.MsgLen, self.Msg) + data = CommFunc.WriteBYTE(data, self.PageIndex) + data = CommFunc.WriteBYTE(data, self.ShowCount) + data = CommFunc.WriteBYTE(data, self.TotalPage) + data = CommFunc.WriteBYTE(data, self.FamilyCount) + for i in range(self.FamilyCount): + data = CommFunc.WriteString(data, self.FamilyList[i].GetLength(), self.FamilyList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + MsgLen:%d, + Msg:%s, + PageIndex:%d, + ShowCount:%d, + TotalPage:%d, + FamilyCount:%d, + FamilyList:%s + '''\ + %( + self.Head.OutputString(), + self.MsgLen, + self.Msg, + self.PageIndex, + self.ShowCount, + self.TotalPage, + self.FamilyCount, + "..." + ) + return DumpString + + +m_NAtagMCFamilyViewList=tagMCFamilyViewList() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyViewList.Head.Cmd,m_NAtagMCFamilyViewList.Head.SubCmd))] = m_NAtagMCFamilyViewList #------------------------------------------------------ @@ -32548,47 +33024,12 @@ #------------------------------------------------------ -#A5 01 查看已申请加入的家族信息 #tagMCNotifyRequestJoinFamilyInfo - -class tagRequestJoinFamily(Structure): - _pack_ = 1 - _fields_ = [ - ("RequestFamilyID", c_int), #申请的加入ID - ] - - def __init__(self): - self.Clear() - 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.RequestFamilyID = 0 - return - - def GetLength(self): - return sizeof(tagRequestJoinFamily) - - def GetBuffer(self): - return string_at(addressof(self), self.GetLength()) - - def OutputString(self): - DumpString = '''//A5 01 查看已申请加入的家族信息 //tagMCNotifyRequestJoinFamilyInfo: - RequestFamilyID:%d - '''\ - %( - self.RequestFamilyID - ) - return DumpString - +#A5 01 已申请加入的家族信息 #tagMCNotifyRequestJoinFamilyInfo class tagMCNotifyRequestJoinFamilyInfo(Structure): Head = tagHead() RequestCount = 0 #(BYTE RequestCount)//申请的数量 - RequestAddFamilyInfo = list() #(vector<tagRequestJoinFamily> RequestAddFamilyInfo)//size = RequestCount + RequestJoinFamilyIDList = list() #(vector<DWORD> RequestJoinFamilyIDList)//size = RequestCount data = None def __init__(self): @@ -32602,9 +33043,8 @@ _pos = self.Head.ReadData(_lpData, _pos) self.RequestCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) for i in range(self.RequestCount): - temRequestAddFamilyInfo = tagRequestJoinFamily() - _pos = temRequestAddFamilyInfo.ReadData(_lpData, _pos) - self.RequestAddFamilyInfo.append(temRequestAddFamilyInfo) + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.RequestJoinFamilyIDList.append(value) return _pos def Clear(self): @@ -32613,15 +33053,14 @@ self.Head.Cmd = 0xA5 self.Head.SubCmd = 0x01 self.RequestCount = 0 - self.RequestAddFamilyInfo = list() + self.RequestJoinFamilyIDList = list() return def GetLength(self): length = 0 length += self.Head.GetLength() length += 1 - for i in range(self.RequestCount): - length += self.RequestAddFamilyInfo[i].GetLength() + length += 4 * self.RequestCount return length @@ -32630,14 +33069,14 @@ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) data = CommFunc.WriteBYTE(data, self.RequestCount) for i in range(self.RequestCount): - data = CommFunc.WriteString(data, self.RequestAddFamilyInfo[i].GetLength(), self.RequestAddFamilyInfo[i].GetBuffer()) + data = CommFunc.WriteDWORD(data, self.RequestJoinFamilyIDList[i]) return data def OutputString(self): DumpString = ''' Head:%s, RequestCount:%d, - RequestAddFamilyInfo:%s + RequestJoinFamilyIDList:%s '''\ %( self.Head.OutputString(), @@ -32760,6 +33199,309 @@ #------------------------------------------------------ +# A5 20 玩家家族信息 #tagMCRoleFamilyInfo + +class tagMCRoleFamilyMember(Structure): + PlayerID = 0 #(DWORD PlayerID) + NameLen = 0 #(BYTE NameLen) + Name = "" #(String Name)//size = NameLen + JoinTime = 0 #(DWORD JoinTime)//加入家族时时间戳 + FmLV = 0 #(BYTE FmLV)//家族职位: 0-成员;1-精英;2-副族长;3-族长 + LV = 0 #(WORD LV)//等级 + Job = 0 #(BYTE Job)//职业 + RealmLV = 0 #(BYTE RealmLV)//境界 + Face = 0 #(DWORD Face)//基本脸型 + FacePic = 0 #(DWORD FacePic)//头像框 + FightPower = 0 #(DWORD FightPower)//战力,求余亿部分 + FightPowerEx = 0 #(DWORD FightPowerEx)//战力,整除亿部分 + ServerID = 0 #(DWORD ServerID)//所属区服ID + ContribTotal = 0 #(DWORD ContribTotal)//总贡献度 + ContribWeek = 0 #(DWORD ContribWeek)//周贡献度 + OffTime = 0 #(DWORD OffTime)// 0-在线; >0-/离线时间戳 + data = None + + def __init__(self): + self.Clear() + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen) + self.JoinTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.RealmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.ContribTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.ContribWeek,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos) + return _pos + + def Clear(self): + self.PlayerID = 0 + self.NameLen = 0 + self.Name = "" + self.JoinTime = 0 + self.FmLV = 0 + self.LV = 0 + self.Job = 0 + self.RealmLV = 0 + self.Face = 0 + self.FacePic = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.ServerID = 0 + self.ContribTotal = 0 + self.ContribWeek = 0 + self.OffTime = 0 + return + + def GetLength(self): + length = 0 + length += 4 + length += 1 + length += len(self.Name) + length += 4 + length += 1 + length += 2 + length += 1 + length += 1 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + length += 4 + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteDWORD(data, self.PlayerID) + data = CommFunc.WriteBYTE(data, self.NameLen) + data = CommFunc.WriteString(data, self.NameLen, self.Name) + data = CommFunc.WriteDWORD(data, self.JoinTime) + data = CommFunc.WriteBYTE(data, self.FmLV) + data = CommFunc.WriteWORD(data, self.LV) + data = CommFunc.WriteBYTE(data, self.Job) + data = CommFunc.WriteBYTE(data, self.RealmLV) + data = CommFunc.WriteDWORD(data, self.Face) + data = CommFunc.WriteDWORD(data, self.FacePic) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteDWORD(data, self.ServerID) + data = CommFunc.WriteDWORD(data, self.ContribTotal) + data = CommFunc.WriteDWORD(data, self.ContribWeek) + data = CommFunc.WriteDWORD(data, self.OffTime) + return data + + def OutputString(self): + DumpString = ''' + PlayerID:%d, + NameLen:%d, + Name:%s, + JoinTime:%d, + FmLV:%d, + LV:%d, + Job:%d, + RealmLV:%d, + Face:%d, + FacePic:%d, + FightPower:%d, + FightPowerEx:%d, + ServerID:%d, + ContribTotal:%d, + ContribWeek:%d, + OffTime:%d + '''\ + %( + self.PlayerID, + self.NameLen, + self.Name, + self.JoinTime, + self.FmLV, + self.LV, + self.Job, + self.RealmLV, + self.Face, + self.FacePic, + self.FightPower, + self.FightPowerEx, + self.ServerID, + self.ContribTotal, + self.ContribWeek, + self.OffTime + ) + return DumpString + + +class tagMCRoleFamilyInfo(Structure): + Head = tagHead() + FamilyID = 0 #(DWORD FamilyID) + FamilyName = "" #(char FamilyName[33])//家族名称 + FamilyLV = 0 #(BYTE FamilyLV)//家族等级 + FamilyLVExp = 0 #(DWORD FamilyLVExp)//家族等级经验 + JoinReview = 0 #(BYTE JoinReview)//成员加入是否需要审核,默认0自动加入 + JoinLVMin = 0 #(WORD JoinLVMin)//限制最低可加入的玩家等级 + ServerID = 0 #(DWORD ServerID)//区服ID,创建时以族长的区服ID赋值 + EmblemID = 0 #(DWORD EmblemID)//徽章ID + FightPower = 0 #(DWORD FightPower)//总战力,求余亿部分 + FightPowerEx = 0 #(DWORD FightPowerEx)//总战力,整除亿部分 + BroadcastLen = 0 #(WORD BroadcastLen)//公告 + Broadcast = "" #(String Broadcast)//size = BroadcastLen + LeaderID = 0 #(DWORD LeaderID)//族长玩家ID + MemberCount = 0 #(BYTE MemberCount)//人数 + MemberList = list() #(vector<tagMCRoleFamilyMember> MemberList)//size = MemberCount + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA5 + self.Head.SubCmd = 0x20 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,33) + self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.FamilyLVExp,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.JoinReview,_pos = CommFunc.ReadBYTE(_lpData, _pos) + self.JoinLVMin,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos) + self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen) + self.LeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos) + self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos) + for i in range(self.MemberCount): + temMemberList = tagMCRoleFamilyMember() + _pos = temMemberList.ReadData(_lpData, _pos) + self.MemberList.append(temMemberList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA5 + self.Head.SubCmd = 0x20 + self.FamilyID = 0 + self.FamilyName = "" + self.FamilyLV = 0 + self.FamilyLVExp = 0 + self.JoinReview = 0 + self.JoinLVMin = 0 + self.ServerID = 0 + self.EmblemID = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.BroadcastLen = 0 + self.Broadcast = "" + self.LeaderID = 0 + self.MemberCount = 0 + self.MemberList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 4 + length += 33 + length += 1 + length += 4 + length += 1 + length += 2 + length += 4 + length += 4 + length += 4 + length += 4 + length += 2 + length += len(self.Broadcast) + length += 4 + length += 1 + for i in range(self.MemberCount): + length += self.MemberList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteDWORD(data, self.FamilyID) + data = CommFunc.WriteString(data, 33, self.FamilyName) + data = CommFunc.WriteBYTE(data, self.FamilyLV) + data = CommFunc.WriteDWORD(data, self.FamilyLVExp) + data = CommFunc.WriteBYTE(data, self.JoinReview) + data = CommFunc.WriteWORD(data, self.JoinLVMin) + data = CommFunc.WriteDWORD(data, self.ServerID) + data = CommFunc.WriteDWORD(data, self.EmblemID) + data = CommFunc.WriteDWORD(data, self.FightPower) + data = CommFunc.WriteDWORD(data, self.FightPowerEx) + data = CommFunc.WriteWORD(data, self.BroadcastLen) + data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast) + data = CommFunc.WriteDWORD(data, self.LeaderID) + data = CommFunc.WriteBYTE(data, self.MemberCount) + for i in range(self.MemberCount): + data = CommFunc.WriteString(data, self.MemberList[i].GetLength(), self.MemberList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + FamilyID:%d, + FamilyName:%s, + FamilyLV:%d, + FamilyLVExp:%d, + JoinReview:%d, + JoinLVMin:%d, + ServerID:%d, + EmblemID:%d, + FightPower:%d, + FightPowerEx:%d, + BroadcastLen:%d, + Broadcast:%s, + LeaderID:%d, + MemberCount:%d, + MemberList:%s + '''\ + %( + self.Head.OutputString(), + self.FamilyID, + self.FamilyName, + self.FamilyLV, + self.FamilyLVExp, + self.JoinReview, + self.JoinLVMin, + self.ServerID, + self.EmblemID, + self.FightPower, + self.FightPowerEx, + self.BroadcastLen, + self.Broadcast, + self.LeaderID, + self.MemberCount, + "..." + ) + return DumpString + + +m_NAtagMCRoleFamilyInfo=tagMCRoleFamilyInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRoleFamilyInfo.Head.Cmd,m_NAtagMCRoleFamilyInfo.Head.SubCmd))] = m_NAtagMCRoleFamilyInfo + + +#------------------------------------------------------ # A6 05 VIP礼包购买记录 #tagMCVIPAwardMsg class tagMCVIPAwardMsg(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBComm.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBComm.py new file mode 100644 index 0000000..2f85eb3 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBComm.py @@ -0,0 +1,74 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package DB.DBComm +# +# @todo:DBComm +# @author hxp +# @date 2025-05-09 +# @version 1.0 +# +# 详细描述: DBComm +# +#------------------------------------------------------------------------------- +#"""Version = 2025-05-09 12:20""" +#------------------------------------------------------------------------------- + +import json + +class UserDataDict(): + '''根据数据自定义字符字段转化为字典处理,减少eval,方便快速存取 + 如果需要按list存储的,建议可以定义一个key然后还是按字典存储,方便之后扩展其他属性 + 所以所有的字符扩展数据建议统一以字典的格式存储,入库时可选直接转化为json格式或直接str + ''' + + def __init__(self, dataObj, dataAttrName, dataLenAttrName, toJson=False): + ''' + @param dataObj: 数据实例对象 + @param dataAttrName: 字符扩展属性名 + @param dataLenAttrName: 字符扩展属性长度名 + ''' + self.__dataObj = dataObj + self.__dataAttrName = dataAttrName + self.__dataLenAttrName = dataLenAttrName + self.__toJson = toJson + self.__dataDict = None + return + + def GetData(self): + if self.__dataDict == None: + try: + self.__dataDict = eval(getattr(self.__dataObj, self.__dataAttrName)) + except: + self.__dataDict = {} + return self.__dataDict + + def SetData(self, setValue): + '''直接设置替换数据 + @param dataStr: 可以是任意数据格式,如果是字典会进行Json或字符串转化 + ''' + if not setValue: + dataStr = "" + elif isinstance(setValue, dict) and self.__toJson: + dataStr = json.dumps(setValue, ensure_ascii=False) + else: + dataStr = str(setValue) + dataStr = dataStr.replace(" ", "") # 替换空格,减少长度 + + if self.__dataObj: + setattr(self.__dataObj, self.__dataAttrName, dataStr) + setattr(self.__dataObj, self.__dataLenAttrName, len(dataStr)) + + if setValue != None and isinstance(setValue, dict) and self.__dataDict != setValue: + self.__dataDict = setValue + return + + def ToString(self): + ## 转化为字符串 + if self.__dataDict != None: + self.SetData(self.__dataDict) + return getattr(self.__dataObj, self.__dataAttrName) + + + \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py new file mode 100644 index 0000000..977f92f --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBDataMgr.py @@ -0,0 +1,197 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Script.DB.DBDataMgr +# +# @todo:DB数据管理器 +# @author hxp +# @date 2025-05-09 +# @version 1.0 +# +# 详细描述: DB数据管理器 +# +#------------------------------------------------------------------------------- +#"""Version = 2025-05-09 12:20""" +#------------------------------------------------------------------------------- + +import GameWorld +import PyGameData +import DBPlayerViewCache +import DBFamily + +import binascii +import time +import zlib +import os + +BakRoot = "C:\ServerRealTimeBackup" +BakFileType = ".bak" + +#临时变量,之后优化 +g_loadErr = False +Map2ServerID = { + 10010:87, + 10090:89, + } + +def OnServerStart(): + GameWorld.DebugLog("地图服务器启动") + LoadServerDataBackup() + return + +def OnServerClose(): + return + +def OnMinute(curMinute): + ServerDataBackup() + DBFamily.OnMinute(curMinute) + return + +#------------------------------------------- 备档 --------------------------------------------------- +def GetBakFileSortList(bakPath): + ## 按备档时间倒序排序返回 [[bakTime, filePath], ...] + bakFileList = [] + for parent, _, filenames in os.walk(bakPath): + for filename in filenames: + if not filename.endswith(BakFileType): + continue + fullPath = os.path.join(parent, filename) + bakTime = GameWorld.ToIntDef(filename[:filename.index(".")].split("_")[1]) + bakFileList.append([bakTime, fullPath]) + bakFileList.sort(reverse=True) + return bakFileList + +def LoadServerDataBackup(): + ## 服务器公共数据备档加载 + global g_loadErr + mapID = GameWorld.GetMap().GetMapID() + if mapID not in Map2ServerID: + return + serverName = "S%s" % Map2ServerID[mapID] + BakDir = os.path.join(BakRoot, serverName) + GameWorld.Log("加载备档: %s" % BakDir) + bakFileList = GetBakFileSortList(BakDir) + if not bakFileList: + GameWorld.Log("不存在备档!") + return + bakFilePath = bakFileList[0][1] # 取第一个为最近的一次备档 + GameWorld.Log("读取备档: %s" % bakFilePath) + + f = open(bakFilePath, 'rb') + compressed_data = f.read().strip() + f.close() + + try: + decompressed_data = zlib.decompress(compressed_data) + bakData = binascii.a2b_hex(decompressed_data) + except: + g_loadErr = True + raise + + LoadPyGameData(bakData, 0) + return + +def ServerDataBackup(): + ## 服务器公共数据定时备档,暂时直接存盘 + if g_loadErr: + GameWorld.ErrLog("加载备档已异常,暂时不在存储备档") + return + mapID = GameWorld.GetMap().GetMapID() + if mapID not in Map2ServerID: + return + serverName = "S%s" % Map2ServerID[mapID] + BakDir = os.path.join(BakRoot, serverName) + BackupCopyMax = 3 + GameWorld.Log("服务器备档: %s" % serverName) + + if not os.path.exists(BakDir): + os.makedirs(BakDir) + + curTime = int(time.time()) + bakFilePath = os.path.join(BakDir, "%s_%s%s" % (serverName, curTime, BakFileType)) + bakData = GetSavePyData() + GameWorld.Log("Bak:%s, len=%s, %s" % (serverName, len(bakData), bakFilePath)) + try: + compressed_data = zlib.compress(bakData, 9) #最大压缩 + GameWorld.Log("compress len=%s" % len(compressed_data)) + fp = open(bakFilePath, "wb") + fp.write(compressed_data) + fp.close() + except: + return + + bakFileList = GetBakFileSortList(BakDir) + # 删除多余备档 + for _, filePath in bakFileList[BackupCopyMax:]: + os.remove(filePath) + GameWorld.Log("删除多余备档文件: %s" % filePath) + + return + +#-------------------------------------------------------------------------------------------------- + +def GetSavePyData(): + + #存储数据前,一些功能业务数据先转化为存档数据 + #... + + pyGameDataMgr = GetDBDataMgr() + result = pyGameDataMgr.GetSaveData() + GameWorld.Log("GetSavePyData!! id = %s-%s"%(id(pyGameDataMgr), len(result))) + result = binascii.b2a_hex(result) + #GameWorld.DebugLog("GetSavePyData!! result = %s-%s"%(result, len(result))) + # 字节码在C++转化会发生错误must be string without null bytes, not str,但是可以正常保存,错误会在下次调用便宜接口才会触发 + # 暂时改成字符串返回,暂无解决方案 + return result +# return str(len(result)) + "|" + result + +def LoadPyGameData(gameBuffer, pos): + pyGameDataMgr = GetDBDataMgr() + GameWorld.Log("LoadPyGameData!!id = %s %s"%(id(pyGameDataMgr), len(gameBuffer))) + pos = pyGameDataMgr.LoadGameData(gameBuffer, pos) + + #加载数据后,一些功能转化为功能业务数据 + #... + + return pos + +class PyGameDataManager(object): + def __init__(self): + self.PlayerViewCacheMgr = DBPlayerViewCache.PlayerViewCacheMgr() + self.FamilyMgr = DBFamily.FamilyMgr() + return + + def GetSaveData(self): + buff = "" + buff += self.PlayerViewCacheMgr.GetSaveData() + buff += self.FamilyMgr.GetSaveData() + return buff + + def LoadGameData(self, gameBuffer, pos): + pos = self.PlayerViewCacheMgr.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) + pos = self.FamilyMgr.LoadPyGameData(gameBuffer, pos, len(gameBuffer)) + return pos + +def GetDBDataMgr(): + ## py数据库表数据管理器 + pyGameDataMgr = PyGameData.g_pyGameDataManager + if not pyGameDataMgr: + pyGameDataMgr = PyGameDataManager() + PyGameData.g_pyGameDataManager = pyGameDataMgr + return pyGameDataMgr + +def GetPlayerViewCacheMgr(): + ## 玩家查看缓存数据管理器 + dbDataMgr = GetDBDataMgr() + return dbDataMgr.PlayerViewCacheMgr + +def GetFamilyMgr(): + ## 家族数据管理器 + dbDataMgr = GetDBDataMgr() + return dbDataMgr.FamilyMgr + +def GetFamilyActionMgr(): + ## 家族Action数据管理器 + return GetFamilyMgr().GetFamilyActionMgr() + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py new file mode 100644 index 0000000..8fce029 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/DBStruct.py @@ -0,0 +1,1238 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package DB.DBStruct +# +# @todo:DB数据结构体 +# @author hxp +# @date 2025-05-09 +# @version 1.0 +# +# 详细描述: CodeMaker PyGameServerSaveData.py生成 +# +#------------------------------------------------------------------------------- +#"""Version = 2025-05-09 12:20""" +#------------------------------------------------------------------------------- + +import ctypes +from ctypes import (Structure, memset, memmove, sizeof, addressof, create_string_buffer, string_at) +import CommFunc + +#玩家详细信息#tagDBPlayer +class tagDBPlayer(Structure): + _pack_ = 1 + _fields_ = [ + ('PlayerID', ctypes.c_ulong), + ('AccID', ctypes.c_char * 65), + ('PlayerName', ctypes.c_char * 33), + ('AccState', ctypes.c_ubyte), + ('IsDeleted', ctypes.c_ubyte), + ('GMLevel', ctypes.c_ubyte), + ('Sex', ctypes.c_int), + ('Hair', ctypes.c_int), + ('HairColor', ctypes.c_int), + ('Face', ctypes.c_int), + ('FacePic', ctypes.c_int), + ('Job', ctypes.c_int), + ('RoleType', ctypes.c_ulong), + ('ReincarnationLv', ctypes.c_ushort), + ('LV', ctypes.c_int), + ('TotalExp', ctypes.c_ulong), + ('FamilyID', ctypes.c_ulong), + ('FamilyName', ctypes.c_char * 33), + ('Country', ctypes.c_int), + ('TeamHornor', ctypes.c_ulong), + ('FamilyHornor', ctypes.c_ulong), + ('FamilyActiveValue', ctypes.c_ulong), + ('LastWeekFamilyActiveValue', ctypes.c_ulong), + ('CountryHornor', ctypes.c_ulong), + ('CountryLastWeekHornor', ctypes.c_ulong), + ('Mate', ctypes.c_ulong), + ('Gold', ctypes.c_ulong), + ('GoldPaper', ctypes.c_ulong), + ('Silver', ctypes.c_ulong), + ('SilverPaper', ctypes.c_ulong), + ('FightPoint', ctypes.c_ulong), + ('HappyPoint', ctypes.c_ulong), + ('MapID', ctypes.c_ulong), + ('DataMapID', ctypes.c_ulong), + ('CopyMapID', ctypes.c_ulong), + ('PosX', ctypes.c_ushort), + ('PosY', ctypes.c_ushort), + ('FromMapID', ctypes.c_ulong), + ('FromCopyMapID', ctypes.c_ulong), + ('FromPosX', ctypes.c_ushort), + ('FromPosY', ctypes.c_ushort), + ('State', ctypes.c_int), + ('HP', ctypes.c_ulong), + ('MP', ctypes.c_ulong), + ('XP', ctypes.c_ulong), + ('HPRestoreSetting', ctypes.c_ushort), + ('MPRestoreSetting', ctypes.c_ushort), + ('FreePoint', ctypes.c_ulong), + ('FreeSkillPoint', ctypes.c_ulong), + ('STR', ctypes.c_int), + ('PNE', ctypes.c_int), + ('PHY', ctypes.c_int), + ('CON', ctypes.c_int), + ('TotalSTR', ctypes.c_int), + ('TotalPNE', ctypes.c_int), + ('TotalPHY', ctypes.c_int), + ('TotalCON', ctypes.c_int), + ('Setting', ctypes.c_char * 100), + ('PKValue', ctypes.c_ushort), + ('FightPower', ctypes.c_ulong), + ('ActiveValue', ctypes.c_ushort), + ('PlayerType', ctypes.c_ubyte), + ('BackpackLV', ctypes.c_ubyte), + ('WarehouseLV', ctypes.c_ubyte), + ('HaveWarehousePsw', ctypes.c_ubyte), + ('WarehousePsw', ctypes.c_char * 15), + ('WarehouseLocked', ctypes.c_ubyte), + ('WarehouseGold', ctypes.c_ulong), + ('WarehouseSilver', ctypes.c_ulong), + ('TeamID', ctypes.c_ulong), + ('UseGoldType', ctypes.c_ubyte), + ('UseSilverType', ctypes.c_ubyte), + ('AttackMode', ctypes.c_ubyte), + ('RebornMapID', ctypes.c_ushort), + ('RebornPosX', ctypes.c_ushort), + ('RebornPosY', ctypes.c_ushort), + ('WeekOnlineTime', ctypes.c_ulong), + ('LastWeekOnlineTime', ctypes.c_ulong), + ('LogoffTime', ctypes.c_char * 30), + ('IsHideMask', ctypes.c_ubyte), + ('DayProcessGameEventCount', ctypes.c_ulong), + ('LoginIP', ctypes.c_char * 20), + ('LoginTime', ctypes.c_char * 30), + ('OnlineTime', ctypes.c_ulong), + ('FriendFavor', ctypes.c_ulong), + ('TeamPrivity', ctypes.c_ulong), + ('OfflineMinutes', ctypes.c_ulong), + ('Energy', ctypes.c_ulong), + ('ReceivedSalary', ctypes.c_ulong), + ('EquipShowSwitch', ctypes.c_ulong), + ('LuckValue', ctypes.c_ushort), + ('ExAttr1', ctypes.c_ulong), + ('ExAttr2', ctypes.c_ulong), + ('ExAttr3', ctypes.c_ulong), + ('ExAttr4', ctypes.c_ulong), + ('ExAttr5', ctypes.c_ulong), + ('Faction', ctypes.c_int), + ('InfamyValue', ctypes.c_ulong), + ('OfficialRank', ctypes.c_ubyte), + ('IsFindByLabel', ctypes.c_ubyte), + ('IsCloseFriendLabel', ctypes.c_ubyte), + ('ChangeCoinPointTotal', ctypes.c_ulong), + ('VIPLv', ctypes.c_ubyte), + ('VIPLvForPhone', ctypes.c_ubyte), + ('PhoneVIPStartTime', ctypes.c_double), + ('PhoneVIPEndTime', ctypes.c_double), + ('VsRoomId', ctypes.c_ulong), + ('ExAttr6', ctypes.c_ulong), + ('ExAttr7', ctypes.c_ulong), + ('ExAttr8', ctypes.c_ulong), + ('ExAttr9', ctypes.c_ulong), + ('ExAttr10', ctypes.c_ulong), + ('ModelMark', ctypes.c_ulong), + ('FromDataMapID', ctypes.c_ulong), + ('LastOrderId', ctypes.c_char * 40), + ('PrizeCoin', ctypes.c_ulong), + ('ExAttr11', ctypes.c_ulong), + ('ExAttr12', ctypes.c_ulong), + ('ExAttr13', ctypes.c_ulong), + ('ExAttr14', ctypes.c_ulong), + ('CreateRoleTime', ctypes.c_char * 30), + ('LVEx', ctypes.c_ushort), + ('LV2', ctypes.c_ushort), + ('ExpPoint', ctypes.c_ulong), + ('OperateInfo', ctypes.c_ulong), + ('Operate', ctypes.c_char * 15), + ('ServerID', ctypes.c_ulong), + ('ExAttr15', ctypes.c_ulong), + ('ExAttr16', ctypes.c_ulong), + ('ExAttr17', ctypes.c_ulong), + ('ExAttr18', ctypes.c_ulong), + ('ExAttr19', ctypes.c_ulong), + ('ExAttr20', ctypes.c_ulong), + ('HPEx', ctypes.c_ulong), + ('FightPowerEx', ctypes.c_ulong), + ('ADOResult', ctypes.c_ulong), + ] + + def __init__(self): + Structure.__init__(self) + self.clear() + + + def clear(self): + memset(addressof(self), 0, self.getLength()) + + def readData(self, buf, pos = 0, length = 0): + if not pos <= length: + return -1 + if len(buf) < pos + self.getLength(): + return -1 + self.clear() + self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos) + self.AccID, pos = CommFunc.ReadString(buf, pos, 65) + self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33) + self.AccState, pos = CommFunc.ReadBYTE(buf, pos) + self.IsDeleted, pos = CommFunc.ReadBYTE(buf, pos) + self.GMLevel, pos = CommFunc.ReadBYTE(buf, pos) + self.Sex, pos = CommFunc.ReadDWORD(buf, pos) + self.Hair, pos = CommFunc.ReadDWORD(buf, pos) + self.HairColor, pos = CommFunc.ReadDWORD(buf, pos) + self.Face, pos = CommFunc.ReadDWORD(buf, pos) + self.FacePic, pos = CommFunc.ReadDWORD(buf, pos) + self.Job, pos = CommFunc.ReadDWORD(buf, pos) + self.RoleType, pos = CommFunc.ReadDWORD(buf, pos) + self.ReincarnationLv, pos = CommFunc.ReadWORD(buf, pos) + self.LV, pos = CommFunc.ReadDWORD(buf, pos) + self.TotalExp, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyName, pos = CommFunc.ReadString(buf, pos, 33) + self.Country, pos = CommFunc.ReadDWORD(buf, pos) + self.TeamHornor, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyHornor, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos) + self.LastWeekFamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos) + self.CountryHornor, pos = CommFunc.ReadDWORD(buf, pos) + self.CountryLastWeekHornor, pos = CommFunc.ReadDWORD(buf, pos) + self.Mate, pos = CommFunc.ReadDWORD(buf, pos) + self.Gold, pos = CommFunc.ReadDWORD(buf, pos) + self.GoldPaper, pos = CommFunc.ReadDWORD(buf, pos) + self.Silver, pos = CommFunc.ReadDWORD(buf, pos) + self.SilverPaper, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPoint, pos = CommFunc.ReadDWORD(buf, pos) + self.HappyPoint, pos = CommFunc.ReadDWORD(buf, pos) + self.MapID, pos = CommFunc.ReadDWORD(buf, pos) + self.DataMapID, pos = CommFunc.ReadDWORD(buf, pos) + self.CopyMapID, pos = CommFunc.ReadDWORD(buf, pos) + self.PosX, pos = CommFunc.ReadWORD(buf, pos) + self.PosY, pos = CommFunc.ReadWORD(buf, pos) + self.FromMapID, pos = CommFunc.ReadDWORD(buf, pos) + self.FromCopyMapID, pos = CommFunc.ReadDWORD(buf, pos) + self.FromPosX, pos = CommFunc.ReadWORD(buf, pos) + self.FromPosY, pos = CommFunc.ReadWORD(buf, pos) + self.State, pos = CommFunc.ReadDWORD(buf, pos) + self.HP, pos = CommFunc.ReadDWORD(buf, pos) + self.MP, pos = CommFunc.ReadDWORD(buf, pos) + self.XP, pos = CommFunc.ReadDWORD(buf, pos) + self.HPRestoreSetting, pos = CommFunc.ReadWORD(buf, pos) + self.MPRestoreSetting, pos = CommFunc.ReadWORD(buf, pos) + self.FreePoint, pos = CommFunc.ReadDWORD(buf, pos) + self.FreeSkillPoint, pos = CommFunc.ReadDWORD(buf, pos) + self.STR, pos = CommFunc.ReadDWORD(buf, pos) + self.PNE, pos = CommFunc.ReadDWORD(buf, pos) + self.PHY, pos = CommFunc.ReadDWORD(buf, pos) + self.CON, pos = CommFunc.ReadDWORD(buf, pos) + self.TotalSTR, pos = CommFunc.ReadDWORD(buf, pos) + self.TotalPNE, pos = CommFunc.ReadDWORD(buf, pos) + self.TotalPHY, pos = CommFunc.ReadDWORD(buf, pos) + self.TotalCON, pos = CommFunc.ReadDWORD(buf, pos) + self.Setting, pos = CommFunc.ReadString(buf, pos, 100) + self.PKValue, pos = CommFunc.ReadWORD(buf, pos) + self.FightPower, pos = CommFunc.ReadDWORD(buf, pos) + self.ActiveValue, pos = CommFunc.ReadWORD(buf, pos) + self.PlayerType, pos = CommFunc.ReadBYTE(buf, pos) + self.BackpackLV, pos = CommFunc.ReadBYTE(buf, pos) + self.WarehouseLV, pos = CommFunc.ReadBYTE(buf, pos) + self.HaveWarehousePsw, pos = CommFunc.ReadBYTE(buf, pos) + self.WarehousePsw, pos = CommFunc.ReadString(buf, pos, 15) + self.WarehouseLocked, pos = CommFunc.ReadBYTE(buf, pos) + self.WarehouseGold, pos = CommFunc.ReadDWORD(buf, pos) + self.WarehouseSilver, pos = CommFunc.ReadDWORD(buf, pos) + self.TeamID, pos = CommFunc.ReadDWORD(buf, pos) + self.UseGoldType, pos = CommFunc.ReadBYTE(buf, pos) + self.UseSilverType, pos = CommFunc.ReadBYTE(buf, pos) + self.AttackMode, pos = CommFunc.ReadBYTE(buf, pos) + self.RebornMapID, pos = CommFunc.ReadWORD(buf, pos) + self.RebornPosX, pos = CommFunc.ReadWORD(buf, pos) + self.RebornPosY, pos = CommFunc.ReadWORD(buf, pos) + self.WeekOnlineTime, pos = CommFunc.ReadDWORD(buf, pos) + self.LastWeekOnlineTime, pos = CommFunc.ReadDWORD(buf, pos) + self.LogoffTime, pos = CommFunc.ReadString(buf, pos, 30) + self.IsHideMask, pos = CommFunc.ReadBYTE(buf, pos) + self.DayProcessGameEventCount, pos = CommFunc.ReadDWORD(buf, pos) + self.LoginIP, pos = CommFunc.ReadString(buf, pos, 20) + self.LoginTime, pos = CommFunc.ReadString(buf, pos, 30) + self.OnlineTime, pos = CommFunc.ReadDWORD(buf, pos) + self.FriendFavor, pos = CommFunc.ReadDWORD(buf, pos) + self.TeamPrivity, pos = CommFunc.ReadDWORD(buf, pos) + self.OfflineMinutes, pos = CommFunc.ReadDWORD(buf, pos) + self.Energy, pos = CommFunc.ReadDWORD(buf, pos) + self.ReceivedSalary, pos = CommFunc.ReadDWORD(buf, pos) + self.EquipShowSwitch, pos = CommFunc.ReadDWORD(buf, pos) + self.LuckValue, pos = CommFunc.ReadWORD(buf, pos) + self.ExAttr1, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr2, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr3, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr4, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr5, pos = CommFunc.ReadDWORD(buf, pos) + self.Faction, pos = CommFunc.ReadDWORD(buf, pos) + self.InfamyValue, pos = CommFunc.ReadDWORD(buf, pos) + self.OfficialRank, pos = CommFunc.ReadBYTE(buf, pos) + self.IsFindByLabel, pos = CommFunc.ReadBYTE(buf, pos) + self.IsCloseFriendLabel, pos = CommFunc.ReadBYTE(buf, pos) + self.ChangeCoinPointTotal, pos = CommFunc.ReadDWORD(buf, pos) + self.VIPLv, pos = CommFunc.ReadBYTE(buf, pos) + self.VIPLvForPhone, pos = CommFunc.ReadBYTE(buf, pos) + self.PhoneVIPStartTime, pos = CommFunc.ReadDouble(buf, pos) + self.PhoneVIPEndTime, pos = CommFunc.ReadDouble(buf, pos) + self.VsRoomId, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr6, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr7, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr8, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr9, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr10, pos = CommFunc.ReadDWORD(buf, pos) + self.ModelMark, pos = CommFunc.ReadDWORD(buf, pos) + self.FromDataMapID, pos = CommFunc.ReadDWORD(buf, pos) + self.LastOrderId, pos = CommFunc.ReadString(buf, pos, 40) + self.PrizeCoin, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr11, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr12, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr13, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr14, pos = CommFunc.ReadDWORD(buf, pos) + self.CreateRoleTime, pos = CommFunc.ReadString(buf, pos, 30) + self.LVEx, pos = CommFunc.ReadWORD(buf, pos) + self.LV2, pos = CommFunc.ReadWORD(buf, pos) + self.ExpPoint, pos = CommFunc.ReadDWORD(buf, pos) + self.OperateInfo, pos = CommFunc.ReadDWORD(buf, pos) + self.Operate, pos = CommFunc.ReadString(buf, pos, 15) + self.ServerID, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr15, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr16, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr17, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr18, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr19, pos = CommFunc.ReadDWORD(buf, pos) + self.ExAttr20, pos = CommFunc.ReadDWORD(buf, pos) + self.HPEx, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos) + return self.getLength() + + + def getBuffer(self): + buf = create_string_buffer(self.getLength()) + memmove(addressof(buf), addressof(self), self.getLength()) + return string_at(addressof(buf), self.getLength()) + + def getLength(self): + return sizeof(tagDBPlayer) + + def outputString(self): + output = '''//玩家详细信息#tagDBPlayer: + PlayerID = %s, + AccID = %s, + PlayerName = %s, + AccState = %s, + IsDeleted = %s, + GMLevel = %s, + Sex = %s, + Hair = %s, + HairColor = %s, + Face = %s, + FacePic = %s, + Job = %s, + RoleType = %s, + ReincarnationLv = %s, + LV = %s, + TotalExp = %s, + FamilyID = %s, + FamilyName = %s, + Country = %s, + TeamHornor = %s, + FamilyHornor = %s, + FamilyActiveValue = %s, + LastWeekFamilyActiveValue = %s, + CountryHornor = %s, + CountryLastWeekHornor = %s, + Mate = %s, + Gold = %s, + GoldPaper = %s, + Silver = %s, + SilverPaper = %s, + FightPoint = %s, + HappyPoint = %s, + MapID = %s, + DataMapID = %s, + CopyMapID = %s, + PosX = %s, + PosY = %s, + FromMapID = %s, + FromCopyMapID = %s, + FromPosX = %s, + FromPosY = %s, + State = %s, + HP = %s, + MP = %s, + XP = %s, + HPRestoreSetting = %s, + MPRestoreSetting = %s, + FreePoint = %s, + FreeSkillPoint = %s, + STR = %s, + PNE = %s, + PHY = %s, + CON = %s, + TotalSTR = %s, + TotalPNE = %s, + TotalPHY = %s, + TotalCON = %s, + Setting = %s, + PKValue = %s, + FightPower = %s, + ActiveValue = %s, + PlayerType = %s, + BackpackLV = %s, + WarehouseLV = %s, + HaveWarehousePsw = %s, + WarehousePsw = %s, + WarehouseLocked = %s, + WarehouseGold = %s, + WarehouseSilver = %s, + TeamID = %s, + UseGoldType = %s, + UseSilverType = %s, + AttackMode = %s, + RebornMapID = %s, + RebornPosX = %s, + RebornPosY = %s, + WeekOnlineTime = %s, + LastWeekOnlineTime = %s, + LogoffTime = %s, + IsHideMask = %s, + DayProcessGameEventCount = %s, + LoginIP = %s, + LoginTime = %s, + OnlineTime = %s, + FriendFavor = %s, + TeamPrivity = %s, + OfflineMinutes = %s, + Energy = %s, + ReceivedSalary = %s, + EquipShowSwitch = %s, + LuckValue = %s, + ExAttr1 = %s, + ExAttr2 = %s, + ExAttr3 = %s, + ExAttr4 = %s, + ExAttr5 = %s, + Faction = %s, + InfamyValue = %s, + OfficialRank = %s, + IsFindByLabel = %s, + IsCloseFriendLabel = %s, + ChangeCoinPointTotal = %s, + VIPLv = %s, + VIPLvForPhone = %s, + PhoneVIPStartTime = %s, + PhoneVIPEndTime = %s, + VsRoomId = %s, + ExAttr6 = %s, + ExAttr7 = %s, + ExAttr8 = %s, + ExAttr9 = %s, + ExAttr10 = %s, + ModelMark = %s, + FromDataMapID = %s, + LastOrderId = %s, + PrizeCoin = %s, + ExAttr11 = %s, + ExAttr12 = %s, + ExAttr13 = %s, + ExAttr14 = %s, + CreateRoleTime = %s, + LVEx = %s, + LV2 = %s, + ExpPoint = %s, + OperateInfo = %s, + Operate = %s, + ServerID = %s, + ExAttr15 = %s, + ExAttr16 = %s, + ExAttr17 = %s, + ExAttr18 = %s, + ExAttr19 = %s, + ExAttr20 = %s, + HPEx = %s, + FightPowerEx = %s, + ADOResult = %s, + '''%( + self.PlayerID, + self.AccID, + self.PlayerName, + self.AccState, + self.IsDeleted, + self.GMLevel, + self.Sex, + self.Hair, + self.HairColor, + self.Face, + self.FacePic, + self.Job, + self.RoleType, + self.ReincarnationLv, + self.LV, + self.TotalExp, + self.FamilyID, + self.FamilyName, + self.Country, + self.TeamHornor, + self.FamilyHornor, + self.FamilyActiveValue, + self.LastWeekFamilyActiveValue, + self.CountryHornor, + self.CountryLastWeekHornor, + self.Mate, + self.Gold, + self.GoldPaper, + self.Silver, + self.SilverPaper, + self.FightPoint, + self.HappyPoint, + self.MapID, + self.DataMapID, + self.CopyMapID, + self.PosX, + self.PosY, + self.FromMapID, + self.FromCopyMapID, + self.FromPosX, + self.FromPosY, + self.State, + self.HP, + self.MP, + self.XP, + self.HPRestoreSetting, + self.MPRestoreSetting, + self.FreePoint, + self.FreeSkillPoint, + self.STR, + self.PNE, + self.PHY, + self.CON, + self.TotalSTR, + self.TotalPNE, + self.TotalPHY, + self.TotalCON, + self.Setting, + self.PKValue, + self.FightPower, + self.ActiveValue, + self.PlayerType, + self.BackpackLV, + self.WarehouseLV, + self.HaveWarehousePsw, + self.WarehousePsw, + self.WarehouseLocked, + self.WarehouseGold, + self.WarehouseSilver, + self.TeamID, + self.UseGoldType, + self.UseSilverType, + self.AttackMode, + self.RebornMapID, + self.RebornPosX, + self.RebornPosY, + self.WeekOnlineTime, + self.LastWeekOnlineTime, + self.LogoffTime, + self.IsHideMask, + self.DayProcessGameEventCount, + self.LoginIP, + self.LoginTime, + self.OnlineTime, + self.FriendFavor, + self.TeamPrivity, + self.OfflineMinutes, + self.Energy, + self.ReceivedSalary, + self.EquipShowSwitch, + self.LuckValue, + self.ExAttr1, + self.ExAttr2, + self.ExAttr3, + self.ExAttr4, + self.ExAttr5, + self.Faction, + self.InfamyValue, + self.OfficialRank, + self.IsFindByLabel, + self.IsCloseFriendLabel, + self.ChangeCoinPointTotal, + self.VIPLv, + self.VIPLvForPhone, + self.PhoneVIPStartTime, + self.PhoneVIPEndTime, + self.VsRoomId, + self.ExAttr6, + self.ExAttr7, + self.ExAttr8, + self.ExAttr9, + self.ExAttr10, + self.ModelMark, + self.FromDataMapID, + self.LastOrderId, + self.PrizeCoin, + self.ExAttr11, + self.ExAttr12, + self.ExAttr13, + self.ExAttr14, + self.CreateRoleTime, + self.LVEx, + self.LV2, + self.ExpPoint, + self.OperateInfo, + self.Operate, + self.ServerID, + self.ExAttr15, + self.ExAttr16, + self.ExAttr17, + self.ExAttr18, + self.ExAttr19, + self.ExAttr20, + self.HPEx, + self.FightPowerEx, + self.ADOResult, + ) + return output + + #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 + def SetAccID(self,Str): + if len(Str)<=65: + self.AccID = Str + else: + self.AccID = Str[:65] + + def SetPlayerName(self,Str): + if len(Str)<=33: + self.PlayerName = Str + else: + self.PlayerName = Str[:33] + + def SetFamilyName(self,Str): + if len(Str)<=33: + self.FamilyName = Str + else: + self.FamilyName = Str[:33] + + def SetSetting(self,Str): + if len(Str)<=100: + self.Setting = Str + else: + self.Setting = Str[:100] + + def SetWarehousePsw(self,Str): + if len(Str)<=15: + self.WarehousePsw = Str + else: + self.WarehousePsw = Str[:15] + + def SetLogoffTime(self,Str): + if len(Str)<=30: + self.LogoffTime = Str + else: + self.LogoffTime = Str[:30] + + def SetLoginIP(self,Str): + if len(Str)<=20: + self.LoginIP = Str + else: + self.LoginIP = Str[:20] + + def SetLoginTime(self,Str): + if len(Str)<=30: + self.LoginTime = Str + else: + self.LoginTime = Str[:30] + + def SetLastOrderId(self,Str): + if len(Str)<=40: + self.LastOrderId = Str + else: + self.LastOrderId = Str[:40] + + def SetCreateRoleTime(self,Str): + if len(Str)<=30: + self.CreateRoleTime = Str + else: + self.CreateRoleTime = Str[:30] + + def SetOperate(self,Str): + if len(Str)<=15: + self.Operate = Str + else: + self.Operate = Str[:15] + + +# 家族表 #tagDBFamily +class tagDBFamily(Structure): + _pack_ = 1 + _fields_ = [ + ('ID', ctypes.c_ulong), + ('Name', ctypes.c_char * 33), + ('LeaderID', ctypes.c_ulong), + ('LV', ctypes.c_ubyte), + ('Exp', ctypes.c_ulong), + ('JoinReview', ctypes.c_ubyte), + ('JoinLVMin', ctypes.c_ushort), + ('CreateTime', ctypes.c_ulong), + ('ServerID', ctypes.c_ulong), + ('BroadcastLen', ctypes.c_ubyte), + ('Broadcast', ctypes.c_char_p), + ('FightPower', ctypes.c_ulong), + ('FightPowerEx', ctypes.c_ulong), + ('EmblemID', ctypes.c_ushort), + ('ADOResult', ctypes.c_ulong), + ] + + def __init__(self): + Structure.__init__(self) + self.clear() + + def clear(self): + self.ID = 0 + self.Name = '' + self.LeaderID = 0 + self.LV = 0 + self.Exp = 0 + self.JoinReview = 0 + self.JoinLVMin = 0 + self.CreateTime = 0 + self.ServerID = 0 + self.BroadcastLen = 0 + self.Broadcast = '' + self.FightPower = 0 + self.FightPowerEx = 0 + self.EmblemID = 0 + + def readData(self, buf, pos = 0, length = 0): + if not pos <= length: + return -1 + if len(buf) < pos + self.getLength(): + return -1 + self.clear() + self.ID, pos = CommFunc.ReadDWORD(buf, pos) + self.Name, pos = CommFunc.ReadString(buf, pos, 33) + self.LeaderID, pos = CommFunc.ReadDWORD(buf, pos) + self.LV, pos = CommFunc.ReadBYTE(buf, pos) + self.Exp, pos = CommFunc.ReadDWORD(buf, pos) + self.JoinReview, pos = CommFunc.ReadBYTE(buf, pos) + self.JoinLVMin, pos = CommFunc.ReadWORD(buf, pos) + self.CreateTime, pos = CommFunc.ReadDWORD(buf, pos) + self.ServerID, pos = CommFunc.ReadDWORD(buf, pos) + self.BroadcastLen, pos = CommFunc.ReadBYTE(buf, pos) + tmp, pos = CommFunc.ReadString(buf, pos, self.BroadcastLen) + self.Broadcast = ctypes.c_char_p(tmp) + self.FightPower, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos) + self.EmblemID, pos = CommFunc.ReadWORD(buf, pos) + return self.getLength() + + def getBuffer(self): + buf = '' + buf = CommFunc.WriteDWORD(buf, self.ID) + buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.Name) + buf = CommFunc.WriteDWORD(buf, self.LeaderID) + buf = CommFunc.WriteBYTE(buf, self.LV) + buf = CommFunc.WriteDWORD(buf, self.Exp) + buf = CommFunc.WriteBYTE(buf, self.JoinReview) + buf = CommFunc.WriteWORD(buf, self.JoinLVMin) + buf = CommFunc.WriteDWORD(buf, self.CreateTime) + buf = CommFunc.WriteDWORD(buf, self.ServerID) + buf = CommFunc.WriteBYTE(buf, self.BroadcastLen) + buf = CommFunc.WriteString(buf, self.BroadcastLen, self.Broadcast) + buf = CommFunc.WriteDWORD(buf, self.FightPower) + buf = CommFunc.WriteDWORD(buf, self.FightPowerEx) + buf = CommFunc.WriteWORD(buf, self.EmblemID) + return buf + + def getLength(self): + length = 0 + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_char) * 33 + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ubyte) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ubyte) + length += sizeof(ctypes.c_ushort) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ubyte) + length += self.BroadcastLen + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ushort) + return length + + def outputString(self): + output = '''// 家族表 #tagDBFamily: + ID = %s, + Name = %s, + LeaderID = %s, + LV = %s, + Exp = %s, + JoinReview = %s, + JoinLVMin = %s, + CreateTime = %s, + ServerID = %s, + BroadcastLen = %s, + Broadcast = %s, + FightPower = %s, + FightPowerEx = %s, + EmblemID = %s, + ADOResult = %s, + '''%( + self.ID, + self.Name, + self.LeaderID, + self.LV, + self.Exp, + self.JoinReview, + self.JoinLVMin, + self.CreateTime, + self.ServerID, + self.BroadcastLen, + self.Broadcast, + self.FightPower, + self.FightPowerEx, + self.EmblemID, + self.ADOResult, + ) + return output + + #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 + def SetName(self,Str): + if len(Str)<=33: + self.Name = Str + else: + self.Name = Str[:33] + + +# 家族成员表 #tagDBFamilyMem +class tagDBFamilyMem(Structure): + _pack_ = 1 + _fields_ = [ + ('PlayerID', ctypes.c_ulong), + ('FamilyID', ctypes.c_ulong), + ('JoinTime', ctypes.c_ulong), + ('PlayerName', ctypes.c_char * 33), + ('LV', ctypes.c_int), + ('Job', ctypes.c_int), + ('RealmLV', ctypes.c_ubyte), + ('Face', ctypes.c_int), + ('FacePic', ctypes.c_int), + ('FightPower', ctypes.c_ulong), + ('FightPowerEx', ctypes.c_ulong), + ('ServerID', ctypes.c_ulong), + ('OffTime', ctypes.c_ulong), + ('FmLV', ctypes.c_ubyte), + ('ContribTotal', ctypes.c_ulong), + ('ContribWeek', ctypes.c_ulong), + ('ADOResult', ctypes.c_ulong), + ] + + def __init__(self): + Structure.__init__(self) + self.clear() + + + def clear(self): + memset(addressof(self), 0, self.getLength()) + + def readData(self, buf, pos = 0, length = 0): + if not pos <= length: + return -1 + if len(buf) < pos + self.getLength(): + return -1 + self.clear() + self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos) + self.JoinTime, pos = CommFunc.ReadDWORD(buf, pos) + self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33) + self.LV, pos = CommFunc.ReadDWORD(buf, pos) + self.Job, pos = CommFunc.ReadDWORD(buf, pos) + self.RealmLV, pos = CommFunc.ReadBYTE(buf, pos) + self.Face, pos = CommFunc.ReadDWORD(buf, pos) + self.FacePic, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPower, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos) + self.ServerID, pos = CommFunc.ReadDWORD(buf, pos) + self.OffTime, pos = CommFunc.ReadDWORD(buf, pos) + self.FmLV, pos = CommFunc.ReadBYTE(buf, pos) + self.ContribTotal, pos = CommFunc.ReadDWORD(buf, pos) + self.ContribWeek, pos = CommFunc.ReadDWORD(buf, pos) + return self.getLength() + + + def getBuffer(self): + buf = create_string_buffer(self.getLength()) + memmove(addressof(buf), addressof(self), self.getLength()) + return string_at(addressof(buf), self.getLength()) + + def getLength(self): + return sizeof(tagDBFamilyMem) + + def outputString(self): + output = '''// 家族成员表 #tagDBFamilyMem: + PlayerID = %s, + FamilyID = %s, + JoinTime = %s, + PlayerName = %s, + LV = %s, + Job = %s, + RealmLV = %s, + Face = %s, + FacePic = %s, + FightPower = %s, + FightPowerEx = %s, + ServerID = %s, + OffTime = %s, + FmLV = %s, + ContribTotal = %s, + ContribWeek = %s, + ADOResult = %s, + '''%( + self.PlayerID, + self.FamilyID, + self.JoinTime, + self.PlayerName, + self.LV, + self.Job, + self.RealmLV, + self.Face, + self.FacePic, + self.FightPower, + self.FightPowerEx, + self.ServerID, + self.OffTime, + self.FmLV, + self.ContribTotal, + self.ContribWeek, + self.ADOResult, + ) + return output + + #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 + def SetPlayerName(self,Str): + if len(Str)<=33: + self.PlayerName = Str + else: + self.PlayerName = Str[:33] + + +# 家族行为表 #tagDBFamilyAction +class tagDBFamilyAction(Structure): + _pack_ = 1 + _fields_ = [ + ('FamilyID', ctypes.c_ulong), + ('ActionType', ctypes.c_ubyte), + ('Name', ctypes.c_char * 33), + ('Time', ctypes.c_ulong), + ('Value1', ctypes.c_ulong), + ('Value2', ctypes.c_ulong), + ('Value3', ctypes.c_ulong), + ('Value4', ctypes.c_ulong), + ('Value5', ctypes.c_ulong), + ('Value6', ctypes.c_ulong), + ('DataLen', ctypes.c_ushort), + ('Data', ctypes.c_char_p), + ('ADOResult', ctypes.c_ulong), + ] + + def __init__(self): + Structure.__init__(self) + self.clear() + + def clear(self): + self.FamilyID = 0 + self.ActionType = 0 + self.Name = '' + self.Time = 0 + self.Value1 = 0 + self.Value2 = 0 + self.Value3 = 0 + self.Value4 = 0 + self.Value5 = 0 + self.Value6 = 0 + self.DataLen = 0 + self.Data = '' + + def readData(self, buf, pos = 0, length = 0): + if not pos <= length: + return -1 + if len(buf) < pos + self.getLength(): + return -1 + self.clear() + self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos) + self.ActionType, pos = CommFunc.ReadBYTE(buf, pos) + self.Name, pos = CommFunc.ReadString(buf, pos, 33) + self.Time, pos = CommFunc.ReadDWORD(buf, pos) + self.Value1, pos = CommFunc.ReadDWORD(buf, pos) + self.Value2, pos = CommFunc.ReadDWORD(buf, pos) + self.Value3, pos = CommFunc.ReadDWORD(buf, pos) + self.Value4, pos = CommFunc.ReadDWORD(buf, pos) + self.Value5, pos = CommFunc.ReadDWORD(buf, pos) + self.Value6, pos = CommFunc.ReadDWORD(buf, pos) + self.DataLen, pos = CommFunc.ReadWORD(buf, pos) + tmp, pos = CommFunc.ReadString(buf, pos, self.DataLen) + self.Data = ctypes.c_char_p(tmp) + return self.getLength() + + def getBuffer(self): + buf = '' + buf = CommFunc.WriteDWORD(buf, self.FamilyID) + buf = CommFunc.WriteBYTE(buf, self.ActionType) + buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.Name) + buf = CommFunc.WriteDWORD(buf, self.Time) + buf = CommFunc.WriteDWORD(buf, self.Value1) + buf = CommFunc.WriteDWORD(buf, self.Value2) + buf = CommFunc.WriteDWORD(buf, self.Value3) + buf = CommFunc.WriteDWORD(buf, self.Value4) + buf = CommFunc.WriteDWORD(buf, self.Value5) + buf = CommFunc.WriteDWORD(buf, self.Value6) + buf = CommFunc.WriteWORD(buf, self.DataLen) + buf = CommFunc.WriteString(buf, self.DataLen, self.Data) + return buf + + def getLength(self): + length = 0 + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ubyte) + length += sizeof(ctypes.c_char) * 33 + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ushort) + length += self.DataLen + return length + + def outputString(self): + output = '''// 家族行为表 #tagDBFamilyAction: + FamilyID = %s, + ActionType = %s, + Name = %s, + Time = %s, + Value1 = %s, + Value2 = %s, + Value3 = %s, + Value4 = %s, + Value5 = %s, + Value6 = %s, + DataLen = %s, + Data = %s, + ADOResult = %s, + '''%( + self.FamilyID, + self.ActionType, + self.Name, + self.Time, + self.Value1, + self.Value2, + self.Value3, + self.Value4, + self.Value5, + self.Value6, + self.DataLen, + self.Data, + self.ADOResult, + ) + return output + + #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 + def SetName(self,Str): + if len(Str)<=33: + self.Name = Str + else: + self.Name = Str[:33] + + +# 玩家查看缓存表 #tagDBPlayerViewCache +class tagDBPlayerViewCache(Structure): + _pack_ = 1 + _fields_ = [ + ('PlayerID', ctypes.c_ulong), + ('AccID', ctypes.c_char * 65), + ('PlayerName', ctypes.c_char * 33), + ('LV', ctypes.c_int), + ('Job', ctypes.c_int), + ('RealmLV', ctypes.c_ubyte), + ('Face', ctypes.c_int), + ('FacePic', ctypes.c_int), + ('FamilyID', ctypes.c_ulong), + ('FamilyName', ctypes.c_char * 33), + ('FamilyEmblemID', ctypes.c_ushort), + ('TitleID', ctypes.c_ulong), + ('FightPower', ctypes.c_ulong), + ('FightPowerEx', ctypes.c_ulong), + ('ServerID', ctypes.c_ulong), + ('OffTime', ctypes.c_ulong), + ('PlusDataSize', ctypes.c_ulong), + ('PlusData', ctypes.c_char_p), + ('ADOResult', ctypes.c_ulong), + ] + + def __init__(self): + Structure.__init__(self) + self.clear() + + def clear(self): + self.PlayerID = 0 + self.AccID = '' + self.PlayerName = '' + self.LV = 0 + self.Job = 0 + self.RealmLV = 0 + self.Face = 0 + self.FacePic = 0 + self.FamilyID = 0 + self.FamilyName = '' + self.FamilyEmblemID = 0 + self.TitleID = 0 + self.FightPower = 0 + self.FightPowerEx = 0 + self.ServerID = 0 + self.OffTime = 0 + self.PlusDataSize = 0 + self.PlusData = '' + + def readData(self, buf, pos = 0, length = 0): + if not pos <= length: + return -1 + if len(buf) < pos + self.getLength(): + return -1 + self.clear() + self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos) + self.AccID, pos = CommFunc.ReadString(buf, pos, 65) + self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33) + self.LV, pos = CommFunc.ReadDWORD(buf, pos) + self.Job, pos = CommFunc.ReadDWORD(buf, pos) + self.RealmLV, pos = CommFunc.ReadBYTE(buf, pos) + self.Face, pos = CommFunc.ReadDWORD(buf, pos) + self.FacePic, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos) + self.FamilyName, pos = CommFunc.ReadString(buf, pos, 33) + self.FamilyEmblemID, pos = CommFunc.ReadWORD(buf, pos) + self.TitleID, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPower, pos = CommFunc.ReadDWORD(buf, pos) + self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos) + self.ServerID, pos = CommFunc.ReadDWORD(buf, pos) + self.OffTime, pos = CommFunc.ReadDWORD(buf, pos) + self.PlusDataSize, pos = CommFunc.ReadDWORD(buf, pos) + tmp, pos = CommFunc.ReadString(buf, pos, self.PlusDataSize) + self.PlusData = ctypes.c_char_p(tmp) + return self.getLength() + + def getBuffer(self): + buf = '' + buf = CommFunc.WriteDWORD(buf, self.PlayerID) + buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.AccID) + buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.PlayerName) + buf = CommFunc.WriteDWORD(buf, self.LV) + buf = CommFunc.WriteDWORD(buf, self.Job) + buf = CommFunc.WriteBYTE(buf, self.RealmLV) + buf = CommFunc.WriteDWORD(buf, self.Face) + buf = CommFunc.WriteDWORD(buf, self.FacePic) + buf = CommFunc.WriteDWORD(buf, self.FamilyID) + buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.FamilyName) + buf = CommFunc.WriteWORD(buf, self.FamilyEmblemID) + buf = CommFunc.WriteDWORD(buf, self.TitleID) + buf = CommFunc.WriteDWORD(buf, self.FightPower) + buf = CommFunc.WriteDWORD(buf, self.FightPowerEx) + buf = CommFunc.WriteDWORD(buf, self.ServerID) + buf = CommFunc.WriteDWORD(buf, self.OffTime) + buf = CommFunc.WriteDWORD(buf, self.PlusDataSize) + buf = CommFunc.WriteString(buf, self.PlusDataSize, self.PlusData) + return buf + + def getLength(self): + length = 0 + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_char) * 65 + length += sizeof(ctypes.c_char) * 33 + length += sizeof(ctypes.c_int) + length += sizeof(ctypes.c_int) + length += sizeof(ctypes.c_ubyte) + length += sizeof(ctypes.c_int) + length += sizeof(ctypes.c_int) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_char) * 33 + length += sizeof(ctypes.c_ushort) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += sizeof(ctypes.c_ulong) + length += self.PlusDataSize + return length + + def outputString(self): + output = '''// 玩家查看缓存表 #tagDBPlayerViewCache: + PlayerID = %s, + AccID = %s, + PlayerName = %s, + LV = %s, + Job = %s, + RealmLV = %s, + Face = %s, + FacePic = %s, + FamilyID = %s, + FamilyName = %s, + FamilyEmblemID = %s, + TitleID = %s, + FightPower = %s, + FightPowerEx = %s, + ServerID = %s, + OffTime = %s, + PlusDataSize = %s, + PlusData = %s, + ADOResult = %s, + '''%( + self.PlayerID, + self.AccID, + self.PlayerName, + self.LV, + self.Job, + self.RealmLV, + self.Face, + self.FacePic, + self.FamilyID, + self.FamilyName, + self.FamilyEmblemID, + self.TitleID, + self.FightPower, + self.FightPowerEx, + self.ServerID, + self.OffTime, + self.PlusDataSize, + self.PlusData, + self.ADOResult, + ) + return output + + #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 + def SetAccID(self,Str): + if len(Str)<=65: + self.AccID = Str + else: + self.AccID = Str[:65] + + def SetPlayerName(self,Str): + if len(Str)<=33: + self.PlayerName = Str + else: + self.PlayerName = Str[:33] + + def SetFamilyName(self,Str): + if len(Str)<=33: + self.FamilyName = Str + else: + self.FamilyName = Str[:33] + diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py new file mode 100644 index 0000000..d688586 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBFamily.py @@ -0,0 +1,643 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package DB.StructData.DBFamily +# +# @todo:DB家族相关 +# @author hxp +# @date 2025-05-09 +# @version 1.0 +# +# 详细描述: DB家族相关 +# +#------------------------------------------------------------------------------- +#"""Version = 2025-05-09 12:20""" +#------------------------------------------------------------------------------- + +import DBStruct +import CommFunc +import GameWorld +import ShareDefine +import PlayerControl +import DBDataMgr +import ChConfig +import DBComm + +import time + +FamilyUpperLimitCount = 2000 + +class FamilyActionData(): + + def __init__(self, dbData=None, dataToJson=False): + self.__dbData = DBStruct.tagDBFamilyAction() if not dbData else dbData + self.__dataDict = DBComm.UserDataDict(self.__dbData, "Data", "DataLen", dataToJson) + return + + def GetFamilyID(self): return self.__dbData.FamilyID + def GetActionType(self): return self.__dbData.ActionType + def GetName(self): return self.__dbData.Name + def SetName(self, name): self.__dbData.Name = name + def GetTime(self): return self.__dbData.Time + def SetTime(self, setTime): self.__dbData.Time = setTime + def GetValue1(self): return self.__dbData.Value1 + def SetValue1(self, value1): self.__dbData.Value1 = value1 + def GetValue2(self): return self.__dbData.Value2 + def SetValue2(self, value2): self.__dbData.Value2 = value2 + def GetValue3(self): return self.__dbData.Value3 + def SetValue3(self, value3): self.__dbData.Value3 = value3 + def GetValue4(self): return self.__dbData.Value4 + def SetValue4(self, value4): self.__dbData.Value4 = value4 + def GetValue5(self): return self.__dbData.Value5 + def SetValue5(self, value5): self.__dbData.Value5 = value5 + def GetValue6(self): return self.__dbData.Value6 + def SetValue6(self, value6): self.__dbData.Value6 = value6 + def GetUserDict(self): return self.__dataDict.GetData() + def GetUserData(self): return self.__dataDict.ToString() + def SetUserData(self, value): self.__dataDict.SetData(value) + def GetBuffer(self): + self.__dataDict.ToString() + return self.__dbData.getBuffer() + +class FamilyAction(): + + def __init__(self): + self.familyID = 0 + self.actionType = 0 + self.__actionDataList = [] + return + + def InitActionInstance(self, dbData): + '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用 + @param dbData: 实例对应绑定的dbData + @return: 成功返回实例对象,失败返回None + ''' + dataToJson = False + # 如果需要 dataToJson,可根据ActionType在这里处理 + if dbData.ActionType in []: + dataToJson = True + actionData = FamilyActionData(dbData, dataToJson) + self.__actionDataList.append(actionData) + return actionData + + def AddAction(self, fullClear=True): + ## 添加仙盟Action数据 + # @param fullClear: 数据条数超过最大数时是否清除最早一条,并创建一条新记录 + + actionData = None + if self.Count() >= ChConfig.ActionTypeSaveCnt.get(self.actionType, 0): + if not fullClear: + #超过记录记录不了了 + return actionData + self.SortByTime() # 按时间升序 + self.DelAction(0) # 删除第一个 + + dbData = DBStruct.tagDBFamilyAction() + dbData.FamilyID = self.familyID + dbData.ActionType = self.actionType + dbData.Time = int(time.time()) + + actionData = self.InitActionInstance(dbData) + return actionData + + def SortByTime(self): + self.__actionDataList.sort(key=lambda f: (f.GetTime())) + return + + def DelAction(self, index): + if 0 <= index < len(self.__actionDataList): + self.__actionDataList.pop(index) + return + + def GetOneAction(self, isAdd=False): + ## 获取一个action数据,仅针对只存一条数据的类型 + aData = None + if self.Count(): + aData = self.At(0) + elif isAdd: + aData = self.AddAction() + return aData + + def Count(self): return len(self.__actionDataList) + def At(self, index): + aData = None + if 0 <= index < len(self.__actionDataList): + aData = self.__actionDataList[index] + elif False: + aData = FamilyActionData() + return aData + +class FamilyActionMgr(): + + def __init__(self): + self.__familyActionDict = {} # 仙盟action信息 {familyID:{actionType:FamilyAction, ...}, ...} + return + + def GetFamilyAction(self, familyID, actionType): + if familyID not in self.__familyActionDict: + self.__familyActionDict[familyID] = {} + actionDict = self.__familyActionDict[familyID] + if actionType in actionDict: + action = actionDict[actionType] + else: + action = FamilyAction() + action.familyID = familyID + action.actionType = actionType + actionDict[actionType] = action + return action + + def DelFamilyAction(self, familyID, actionType): + if familyID not in self.__familyActionDict: + return + actionDict = self.__familyActionDict[familyID] + actionDict.pop(actionType, None) + return + + def ClearFamilyAction(self, familyID): + self.__familyActionDict.pop(familyID, None) + return + + def GetActionTypeList(self, familyID): + ## 获取有数据的action类型列表 + return self.__familyActionDict.get(familyID, {}).keys() + +class FamilyMem(): + + def __init__(self, dbData=None): + self.__dbData = DBStruct.tagDBFamilyMem() if not dbData else dbData + return + + def GetPlayerID(self): return self.__dbData.PlayerID + def GetFamilyID(self): return self.__dbData.FamilyID + def GetJoinTime(self): return self.__dbData.JoinTime + def GetPlayerName(self): return self.__dbData.PlayerName + def SetPlayerName(self, playerName): self.__dbData.PlayerName = playerName + def GetLV(self): return self.__dbData.LV + def SetLV(self, lv): self.__dbData.LV = lv + def GetJob(self): return self.__dbData.Job + def SetJob(self, job): self.__dbData.Job = job + def GetRealmLV(self): return self.__dbData.RealmLV + def SetRealmLV(self, realmLV): self.__dbData.RealmLV = realmLV + def GetFace(self): return self.__dbData.Face + def SetFace(self, face): self.__dbData.Face = face + def GetFacePic(self): return self.__dbData.FacePic + def SetFacePic(self, facePic): self.__dbData.FacePic = facePic + def GetFightPower(self): return self.__dbData.FightPower + def GetFightPowerEx(self): return self.__dbData.FightPowerEx + def GetFightPowerTotal(self): return self.__dbData.FightPowerEx * ChConfig.Def_PerPointValue + self.__dbData.FightPower + def SetFightPowerTotal(self, fightPowerTotal): + self.__dbData.FightPower = fightPowerTotal % ChConfig.Def_PerPointValue + self.__dbData.FightPowerEx = fightPowerTotal / ChConfig.Def_PerPointValue + return + def GetServerID(self): return self.__dbData.ServerID + def SetServerID(self, serverID): self.__dbData.ServerID = serverID + def GetOffTime(self): return self.__dbData.OffTime + def SetOffTime(self, offTime): self.__dbData.OffTime = offTime + def GetFmLV(self): return self.__dbData.FmLV + def SetFmLV(self, fmLV): self.__dbData.FmLV = fmLV + def GetContribTotal(self): return self.__dbData.ContribTotal + def SetContribTotal(self, contribTotal): self.__dbData.ContribTotal = contribTotal + def GetContribWeek(self): return self.__dbData.ContribWeek + def SetContribWeek(self, contribWeek): self.__dbData.ContribWeek = contribWeek + def GetBuffer(self): return self.__dbData.getBuffer() + + def RefreshMemberByID(self, playerID): + ## 根据玩家ID更新成员数据,一般用于离线功能,如添加离线成员,直接使用查看缓存更新 + if playerID != self.GetPlayerID(): + return + viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(playerID) + if not viewCache: + return + self.SetPlayerName(viewCache.GetPlayerName()) + self.SetLV(viewCache.GetLV()) + self.SetJob(viewCache.GetJob()) + self.SetRealmLV(viewCache.GetRealmLV()) + self.SetFace(viewCache.GetFace()) + self.SetFacePic(viewCache.GetFacePic()) + self.SetServerID(viewCache.GetServerID()) + fpChange = False + fightPowerTotal = viewCache.GetFightPowerTotal() + if self.GetFightPowerTotal() < fightPowerTotal: + self.SetFightPowerTotal(fightPowerTotal) + fpChange = True + return fpChange + + def RefreshMember(self, curPlayer): + '''刷新成员信息,仙盟成员属于永久功能数据,除非仙盟解散,所以单独存一份成员基础信息,防止过度依赖查看缓存数据引发的问题 + @return: 战力是否变更 + ''' + if not curPlayer or curPlayer.GetPlayerID() != self.GetPlayerID(): + return + self.SetPlayerName(curPlayer.GetPlayerName()) + self.SetLV(curPlayer.GetLV()) + self.SetJob(curPlayer.GetJob()) + self.SetRealmLV(curPlayer.GetOfficialRank()) + self.SetFace(curPlayer.GetFace()) + self.SetFacePic(curPlayer.GetFacePic()) + self.SetServerID(GameWorld.GetPlayerServerID(curPlayer)) + fightPowerTotal = PlayerControl.GetFightPower(curPlayer) + fpChange = self.GetFightPowerTotal() != fightPowerTotal + self.SetFightPowerTotal(fightPowerTotal) + return fpChange + +class Family(): + + def __init__(self, dbData=None): + self.__dbData = DBStruct.tagDBFamily() if not dbData else dbData + self.__memberList = [] # [FamilyMem, ...] + self.__memberDict = {} # 成员字典 {playerID:FamilyMem, ...} + self.__familyMgr = DBDataMgr.GetFamilyMgr() + self.__actionMgr = DBDataMgr.GetFamilyActionMgr() + self.__memFightPowerChange = None # 成员战力是否有变化,默认None,代表未处理过 + return + + def GetID(self): return self.__dbData.ID + def GetCreateTime(self): return self.__dbData.CreateTime + def GetServerID(self): return self.__dbData.ServerID + def GetName(self): return self.__dbData.Name + def SetName(self, name): self.__dbData.Name = name + def GetLeaderID(self): return self.__dbData.LeaderID + def SetLeaderID(self, leaderID): self.__dbData.LeaderID = leaderID + def GetLV(self): return self.__dbData.LV + def SetLV(self, lv): self.__dbData.LV = lv + def GetExp(self): return self.__dbData.Exp + def SetExp(self, exp): self.__dbData.Exp = exp + def GetJoinReview(self): return self.__dbData.JoinReview # 成员加入是否需要审核,默认0自动加入 + def SetJoinReview(self, joinReview): self.__dbData.JoinReview = joinReview + def GetJoinLVMin(self): return self.__dbData.JoinLVMin + def SetJoinLVMin(self, JoinLVMin): self.__dbData.JoinLVMin = JoinLVMin + def GetBroadcast(self): return self.__dbData.Broadcast + def SetBroadcast(self, broadcast): + self.__dbData.Broadcast = broadcast + self.__dbData.BroadcastLen = len(self.__dbData.Broadcast) + return + def GetFightPower(self): return self.__dbData.FightPower + def GetFightPowerEx(self): return self.__dbData.FightPowerEx + def GetFightPowerTotal(self): return self.__dbData.FightPowerEx * ChConfig.Def_PerPointValue + self.__dbData.FightPower + def SetFightPowerTotal(self, fightPowerTotal): + self.__dbData.FightPower = fightPowerTotal % ChConfig.Def_PerPointValue + self.__dbData.FightPowerEx = fightPowerTotal / ChConfig.Def_PerPointValue + return + def GetEmblemID(self): return self.__dbData.EmblemID + def SetEmblemID(self, emblemID): self.__dbData.EmblemID = emblemID + def GetBuffer(self): return self.__dbData.getBuffer() + + ## ------------------------------------------------ + def InitMemberInstance(self, dbData): + '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用 + @param dbData: 实例对应绑定的dbData + @return: 成功返回实例对象,失败返回None + ''' + member = FamilyMem(dbData) + playerID = member.GetPlayerID() + if playerID in self.__memberDict: + return + self.__memberDict[playerID] = member + self.__memberList.append(member) + return member + + def AddMember(self, playerID): + member = None + if playerID in self.__memberDict: + member = self.__memberDict[playerID] + else: + dbData = DBStruct.tagDBFamilyMem() + dbData.PlayerID = playerID + dbData.FamilyID = self.GetID() + dbData.JoinTime = int(time.time()) + member = self.InitMemberInstance(dbData) + if not member and False: + member = FamilyMem() + self.__memFightPowerChange = True + return member + + def DeleteMember(self, playerID): + delMem = self.__memberDict.pop(playerID, None) + if delMem in self.__memberList: + self.__memberList.remove(delMem) + self.__memFightPowerChange = True + return delMem + + def FindMember(self, playerID): + mem = None + if playerID in self.__memberDict: + mem = self.__memberDict[playerID] + elif False: + mem = FamilyMem() + return mem + + def GetCount(self): return len(self.__memberList) + def GetAt(self, index): + mem = None + if 0 <= index < len(self.__memberList): + mem = self.__memberList[index] + elif False: + mem = FamilyMem() + return mem + + def RefreshFamilyMember(self, curPlayer): + ## 刷新在线成员信息 + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if self.GetID() != familyID: + return + member = self.FindMember(playerID) + if not member: + return + if member.RefreshMember(curPlayer): + self.__memFightPowerChange = True + return + + def RefrshFightPowerTotal(self, checkChange=False): + ## 刷新总战力 + if checkChange and self.__memFightPowerChange == False: # 默认None,首次必刷新 + GameWorld.DebugLog("没有成员战力变化可不刷新仙盟总战力! familyID=%s" % self.GetID()) + return + familyFightPowerTotal = 0 + for index in range(self.GetCount()): + member = self.GetAt(index) + if not member: + continue + familyFightPowerTotal += member.GetFightPowerTotal() + self.SetFightPowerTotal(familyFightPowerTotal) + GameWorld.DebugLog("刷新仙盟总战力! familyID=%s" % self.GetID()) + self.__memFightPowerChange = False + return familyFightPowerTotal + + def GetReqJoinPlayerInfo(self): + ## 获取申请加入的玩家信息 + # @return: {playerID:申请时间戳, ...} + joinAction = self.__actionMgr.GetFamilyAction(self.GetID(), ShareDefine.Def_ActionType_FamilyAdd) + actionData = joinAction.GetOneAction(True) + dataDict = actionData.GetUserDict() + if "ReqJoin" not in dataDict: + dataDict["ReqJoin"] = {} + return dataDict["ReqJoin"] + + def AddReqJoinPlayerID(self, playerID): + reqPlayerIDDict = self.GetReqJoinPlayerInfo() + reqPlayerIDDict[playerID] = int(time.time()) # 申请时间戳 + self.__familyMgr.AddPlayerReqJoinFamilyID(playerID, self.GetID()) + return + + def DelReqJoinPlayerID(self, playerID): + reqPlayerIDDict = self.GetReqJoinPlayerInfo() + if playerID in reqPlayerIDDict: + reqPlayerIDDict.pop(playerID) + self.__familyMgr.DelPlayerReqJoinFamilyID(playerID, self.GetID()) + return + + def DelReqJoinPlayerAll(self): + reqPlayerIDDict = self.GetReqJoinPlayerInfo() + for playerID in reqPlayerIDDict.keys(): + reqPlayerIDDict.pop(playerID) + self.__familyMgr.DelPlayerReqJoinFamilyID(playerID, self.GetID()) + return + + def OnDelete(self): + self.DelReqJoinPlayerAll() + self.__actionMgr.ClearFamilyAction(self.GetID()) + return + +class FamilyMgr(): + + def __init__(self): + self.__familyList = [] # 仙盟对象列表,可进行排序 [Family, ...] + self.__familyIDDict = {} # 仙盟ID对象字典, {familyID:Family, ...} + self.__familyNameDict = {} # 仙盟名称对象字典, {familyName:Family, ...} + self.__actionMgr = FamilyActionMgr() + self.__playerReqJoinDict = None # 玩家申请加入仙盟列表 {playerID:[familyID, ...], ...} + return + + def InitFamilyInstance(self, dbData): + '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用 + @param dbData: 实例对应绑定的dbData + @return: 成功返回实例对象,失败返回None + ''' + family = Family(dbData) + familyID = family.GetID() + if familyID in self.__familyIDDict: + return + self.__familyList.append(family) + self.__familyIDDict[familyID] = family + self.__familyNameDict[family.GetName()] = family + return family + + def Sort(self): + ''' 默认排序倒序,按 仙盟总战力 -> 仙盟等级 + ''' + self.__familyList.sort(key=lambda f: (f.GetFightPowerTotal(), f.GetLV()), reverse=True) + return + + def AddFamily(self, familyID, familyName, serverID): + ## 创建新仙盟 + newFamily = None + if familyID in self.__familyIDDict: + GameWorld.ErrLog("创建仙盟时ID已存在! familyID=%s" % familyID) + return newFamily + if familyName in self.__familyNameDict: + GameWorld.ErrLog("创建仙盟时名称已存在! familyName=%s" % familyName) + return newFamily + if len(self.__familyList) >= FamilyUpperLimitCount: + GameWorld.ErrLog("单服限制创建仙盟数已达上限!") + return newFamily + + dbData = DBStruct.tagDBFamily() + dbData.ID = familyID + dbData.Name = familyName + dbData.ServerID = serverID + dbData.CreateTime = int(time.time()) + + newFamily = self.InitFamilyInstance(dbData) + if not newFamily and False: # 不执行,为了代码提示 + newFamily = Family() + return newFamily + + def FindFamily(self, familyID): + family = None + if familyID in self.__familyIDDict: + family = self.__familyIDDict[familyID] + elif False: + family = Family() + return family + + def FindFamilyByName(self, familyName): + family = None + if familyName in self.__familyNameDict: + family = self.__familyNameDict[familyName] + elif False: + family = Family() + return family + + def DelFamily(self, familyID): + family = self.FindFamily(familyID) + if family: + self.__familyNameDict.pop(family.GetName(), None) + if family in self.__familyList: + self.__familyList.remove(family) + family.OnDelete() + self.__familyIDDict.pop(familyID, None) + return family + + def GetCount(self): return len(self.__familyList) + def GetAt(self, index): + family = None + if 0 <= index < len(self.__familyList): + family = self.__familyList[index] + elif False: + family = Family() + return family + + def GetPlayerFamilyID(self, playerID): + ## 获取玩家当前所属的仙盟ID + for index in range(self.GetCount()): + family = self.GetAt(index) + if family.FindMember(playerID): + return family.GetID() + return 0 + + def GetFamilyActionMgr(self): return self.__actionMgr + + def GetPlayerReqJoinFamilyIDList(self, playerID): + ## 获取玩家申请加入的仙盟ID列表 + if self.__playerReqJoinDict == None: + self.__playerReqJoinDict = {} + for index in xrange(self.GetCount()): + family = self.GetAt(index) + familyID = family.GetID() + reqPlayerIDDict = family.GetReqJoinPlayerInfo() + for reqID in reqPlayerIDDict.keys(): + if reqID not in self.__playerReqJoinDict: + self.__playerReqJoinDict[reqID] = [] + reqFamilyIDList = self.__playerReqJoinDict[reqID] + if familyID not in reqFamilyIDList: + reqFamilyIDList.append(familyID) + + if playerID not in self.__playerReqJoinDict: + self.__playerReqJoinDict[playerID] = [] + return self.__playerReqJoinDict[playerID] + + def AddPlayerReqJoinFamilyID(self, playerID, familyID): + ## 添加玩家申请加入目标仙盟记录 + # @return: 是否有增加记录 + reqFamilyIDList = self.GetPlayerReqJoinFamilyIDList(playerID) + if familyID not in reqFamilyIDList: + reqFamilyIDList.append(familyID) + return True + return False + + def DelPlayerReqJoinFamilyID(self, playerID, familyID): + ## 删除玩家申请加入目标仙盟记录 + # @return: 是否有删除记录 + reqFamilyIDList = self.GetPlayerReqJoinFamilyIDList(playerID) + if familyID in reqFamilyIDList: + reqFamilyIDList.remove(familyID) + return True + return False + + def DelPlayerReqJoinFamilyIDAll(self, playerID): + ## 删除玩家所有的申请加入仙盟记录 + reqFamilyIDList = self.GetPlayerReqJoinFamilyIDList(playerID) + for familyID in reqFamilyIDList[::-1]: + family = self.FindFamily(familyID) + if not family: + continue + family.DelReqJoinPlayerID(playerID) + return + + # 保存数据 存数据库和realtimebackup + def GetSaveData(self): + + familyDataCnt, familySavaData = 0, "" + membreDataCnt, memberSavaData = 0, "" + actionDataCnt, actionSavaData = 0, "" + for family in self.__familyList: + familyID = family.GetID() + familySavaData += family.GetBuffer() + familyDataCnt += 1 + + for memIndex in range(family.GetCount()): + member = family.GetAt(memIndex) + memberSavaData += member.GetBuffer() + membreDataCnt += 1 + + for actionType in self.__actionMgr.GetActionTypeList(familyID): + action = self.__actionMgr.GetFamilyAction(familyID, actionType) + for aIndex in range(action.Count()): + actionData = action.At(aIndex) + actionSavaData += actionData.GetBuffer() + actionDataCnt += 1 + + saveData = "" + + saveData += CommFunc.WriteDWORD("", familyDataCnt) + familySavaData + GameWorld.Log("Save DBFamily count :%s len=%s" % (familyDataCnt, len(familySavaData))) + + saveData += CommFunc.WriteDWORD("", membreDataCnt) + memberSavaData + GameWorld.Log("Save DBFamilyMem count :%s len=%s" % (membreDataCnt, len(memberSavaData))) + + saveData += CommFunc.WriteDWORD("", actionDataCnt) + actionSavaData + GameWorld.Log("Save DBFamilyAction count :%s len=%s" % (actionDataCnt, len(actionSavaData))) + + return saveData + + # 从数据库载入数据 + def LoadPyGameData(self, datas, pos, dataslen): + # 仙盟 + cnt, pos = CommFunc.ReadDWORD(datas, pos) + GameWorld.Log("Load DBFamily count :%s" % cnt) + for _ in xrange(cnt): + dbData = DBStruct.tagDBFamily() + pos += dbData.readData(datas, pos, dataslen) + self.InitFamilyInstance(dbData) + self.Sort() + + # 成员 + cnt, pos = CommFunc.ReadDWORD(datas, pos) + GameWorld.Log("Load DBFamilyMem count :%s" % cnt) + for _ in xrange(cnt): + dbData = DBStruct.tagDBFamilyMem() + pos += dbData.readData(datas, pos, dataslen) + + familyID = dbData.FamilyID + family = self.FindFamily(familyID) + if not family: + continue + member = family.InitMemberInstance(dbData) + GameWorld.Log(" member:%s,familyID=%s" % (member.GetPlayerID(), familyID)) + + # 行为 + cnt, pos = CommFunc.ReadDWORD(datas, pos) + GameWorld.Log("Load DBFamilyAction count :%s" % cnt) + for _ in xrange(cnt): + dbData = DBStruct.tagDBFamilyAction() + pos += dbData.readData(datas, pos, dataslen) + + familyID = dbData.FamilyID + actionType = dbData.ActionType + family = self.FindFamily(familyID) + if not family: + continue + action = self.__actionMgr.GetFamilyAction(familyID, actionType) + action.InitActionInstance(dbData) + + return pos + +def OnMinute(curMinute): + + familyMgr = DBDataMgr.GetFamilyMgr() + # 每分钟刷新下仙盟战力排序 + isSort = False + for index in range(familyMgr.GetCount()): + family = familyMgr.GetAt(index) + if not family: + continue + if family.RefrshFightPowerTotal(True): + isSort = True + if isSort: + familyMgr.Sort() + + return + + \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py new file mode 100644 index 0000000..a108d0d --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py @@ -0,0 +1,327 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Script.DB.StructData.DBPlayerViewCache +# +# @todo:DB玩家查看缓存 +# @author hxp +# @date 2025-05-09 +# @version 1.0 +# +# 详细描述: DB玩家查看缓存 +# +#------------------------------------------------------------------------------- +#"""Version = 2025-05-09 12:20""" +#------------------------------------------------------------------------------- + +import DBComm +import DBStruct +import GameWorld +import ShareDefine +import PlayerControl +import DBDataMgr +import CommFunc +import ChConfig +import GameObj + +import random +import time + +Key_UpdViewCacheTick = "UpdViewCacheTick" + +class PlayerViewCache(): + + def __init__(self, dbData=None): + self.__dbData = DBStruct.tagDBPlayerViewCache() if not dbData else dbData + self.__plusDict = DBComm.UserDataDict(self.__dbData, "PlusData", "PlusDataSize", True) + return + + def GetPlayerID(self): return self.__dbData.PlayerID + def SetPlayerID(self, playerID): self.__dbData.PlayerID = playerID + def GetAccID(self): return self.__dbData.AccID + def SetAccID(self, accID): self.__dbData.AccID = accID + def GetPlayerName(self): return self.__dbData.PlayerName + def SetPlayerName(self, playerName): self.__dbData.PlayerName = playerName + def GetLV(self): return self.__dbData.LV + def SetLV(self, lv): self.__dbData.LV = lv + def GetJob(self): return self.__dbData.Job + def SetJob(self, job): self.__dbData.Job = job + def GetRealmLV(self): return self.__dbData.RealmLV + def SetRealmLV(self, realmLV): self.__dbData.RealmLV = realmLV + def GetFace(self): return self.__dbData.Face + def SetFace(self, face): self.__dbData.Face = face + def GetFacePic(self): return self.__dbData.FacePic + def SetFacePic(self, facePic): self.__dbData.FacePic = facePic + def GetFamilyID(self): return self.__dbData.FamilyID + def SetFamilyID(self, familyID): self.__dbData.FamilyID = familyID + def GetFamilyName(self): return self.__dbData.FamilyName + def SetFamilyName(self, familyName): self.__dbData.FamilyName = familyName + def GetFamilyEmblemID(self): return self.__dbData.FamilyEmblemID + def SetFamilyEmblemID(self, familyEmblemID): self.__dbData.FamilyEmblemID = familyEmblemID + def GetTitleID(self): return self.__dbData.TitleID + def SetTitleID(self, titleID): self.__dbData.TitleID = titleID + def GetFightPower(self): return self.__dbData.FightPower + def GetFightPowerEx(self): return self.__dbData.FightPowerEx + def GetFightPowerTotal(self): return self.__dbData.FightPowerEx * ChConfig.Def_PerPointValue + self.__dbData.FightPower + def SetFightPowerTotal(self, fightPowerTotal): + self.__dbData.FightPower = fightPowerTotal % ChConfig.Def_PerPointValue + self.__dbData.FightPowerEx = fightPowerTotal / ChConfig.Def_PerPointValue + return + def GetServerID(self): return self.__dbData.ServerID + def SetServerID(self, serverID): self.__dbData.ServerID = serverID + def GetOffTime(self): return self.__dbData.OffTime + def SetOffTime(self, offTime): self.__dbData.OffTime = offTime + def GetPlusDict(self): return self.__plusDict.GetData() + def GetPlusData(self): return self.__plusDict.ToString() + def GetBuffer(self): + self.__plusDict.ToString() + return self.__dbData.getBuffer() + + ## ----------------------------------------------------------------------- + +class PlayerViewCacheMgr(): + + def __init__(self): + self.__viewCacheList = [] # [PlayerViewCache, ...] + self.__idIndexDict = {} # {playerID:index, ...} + self.__needSort = False + self.__serverIDRangePlayerIDDict = {} # {serverIDRangeTuple:[playerID, ...], ....} + return + + def InitViewCacheInstance(self, dbData): + '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用 + @param dbData: 实例对应绑定的dbData + @return: 成功返回实例对象,失败返回None + ''' + playerID = dbData.PlayerID + self.__refreshIDIndex() + if playerID in self.__idIndexDict: + return + viewCache = PlayerViewCache(dbData) + self.__viewCacheList.append(viewCache) + self.__idIndexDict[playerID] = len(self.__viewCacheList) - 1 + self.__needSort = True + return viewCache + + def CheckUpdViewCache(self, playerID): + if playerID <= ShareDefine.FackPlayerIDMax: + return + curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if not curPlayer: + return + lastUpdTick = curPlayer.GetDictByKey(Key_UpdViewCacheTick) + tick = GameWorld.GetGameWorld().GetTick() + if lastUpdTick and tick - lastUpdTick < 60000: + GameWorld.DebugLog("1分钟内只更新一次玩家缓存", playerID) + return + curPlayer.SetDict(Key_UpdViewCacheTick, tick) + return UpdPlayerViewCache(curPlayer) + + def FindViewCache(self, playerID, isAdd=False): + '''查找玩家缓存,如果不存在,则会有额外逻辑,如从redis、db直接找, + 跨服玩家从跨服取,可能延迟获得 + ''' + curCache = self.GetPlayerViewCache(playerID) + if curCache: + updCache = self.CheckUpdViewCache(playerID) + if updCache: + curCache = updCache + + # 真实玩家 + elif playerID > ShareDefine.FackPlayerIDMax: + curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + # 本服在线玩家,直接生成新数据 + if curPlayer: + dbData = DBStruct.tagDBPlayerViewCache() + dbData.PlayerID = playerID + self.InitViewCacheInstance(dbData) + UpdPlayerViewCache(curPlayer) + + # 离线玩家 + else: + pass + # 本服玩家,从redis或db读取重新加载读取,换句话说,本服玩家只要获取一定有查看缓存数据 + # 跨服玩家,去子服拉取数据,理论上也一定有,但是如果需要拉数据,有一定延迟 + # 逻辑待扩展 + + # 假玩家,默认添加 + elif ShareDefine.FackPlayerIDStart <= playerID <= ShareDefine.FackPlayerIDMax: + serverID = playerID % 100 + 1 # 1 ~ 100 服 + accID = "fake%s@test@s%s" % (playerID, serverID) + fightPower = random.randint(1000000, 100000000) # 先随机,外层有需要的话再自己设置 + + dbData = DBStruct.tagDBPlayerViewCache() + dbData.PlayerID = playerID + dbData.PlayerName = "%s%s" % (GameWorld.GbkToCode("神秘道友"), playerID) + dbData.AccID = accID + dbData.LV = random.randint(100, 200) + dbData.Job = random.randint(1, 2) + dbData.RealmLV = random.randint(5, 15) + dbData.FightPower = fightPower % ChConfig.Def_PerPointValue + dbData.FightPowerEx = fightPower / ChConfig.Def_PerPointValue + dbData.ServerID = serverID + dbData.OffTime = int(time.time()) - random.randint(1, 3600 * 24 * 10) # 随机离线 0~10天 + curCache = self.InitViewCacheInstance(dbData) + + return curCache + + def GetPlayerViewCache(self, playerID): + ## 获取玩家查看缓存,仅内存中数据,无额外逻辑 + self.__refreshIDIndex() + viewCache = None + if playerID in self.__idIndexDict: + index = self.__idIndexDict[playerID] + if index < len(self.__viewCacheList): + viewCache = self.__viewCacheList[index] + + if not viewCache and False: + viewCache = PlayerViewCache() + + return viewCache + + def GetPlayerIDListByServerIDInfo(self, serverIDList): + ## 根据服务器ID列表信息获取对应服务器ID范围的玩家ID战力排序列表 + if serverIDList == None: + return [] + self.Sort() + key = tuple(serverIDList) + if key not in self.__serverIDRangePlayerIDDict: + playerIDList = [] + for viewCache in self.__viewCacheList: + playerID = viewCache.GetPlayerID() + serverID = viewCache.GetServerID() + for idInfo in serverIDList: + if (isinstance(idInfo, int) and serverID == idInfo) \ + or ((isinstance(idInfo, tuple) or isinstance(idInfo, list)) \ + and len(idInfo) == 2 and idInfo[0] <= serverID <= idInfo[1]): + playerIDList.append(playerID) + GameWorld.DebugLog("重新加载区服玩家查看缓存ID列表: %s, %s, %s" % (key, len(playerIDList), playerIDList)) + self.__serverIDRangePlayerIDDict[key] = playerIDList + return self.__serverIDRangePlayerIDDict[key] + + def IsPlayerIn(self, playerID): + self.__refreshIDIndex() + return playerID in self.__idIndexDict + + def __refreshIDIndex(self): + if not self.__idIndexDict: + self.__idIndexDict = {} + for index, viewCache in enumerate(self.__viewCacheList): + self.__idIndexDict[viewCache.GetPlayerID()] = index + return self.__idIndexDict + + def DelPlayerViewCache(self, playerID): + self.__refreshIDIndex() + index = self.__idIndexDict.pop(playerID, -1) + if index >= 0 and index < len(self.__viewCacheList): + self.__viewCacheList.pop(index) + for playerIDList in self.__serverIDRangePlayerIDDict.values(): + if playerID in playerIDList: + playerIDList.remove(playerID) + self.__idIndexDict = {} + self.__serverIDRangePlayerIDDict = {} + return + + def GetCount(self): return len(self.__viewCacheList) + def At(self, index): + viewCache = self.__viewCacheList[index] + if not viewCache and False: + viewCache = PlayerViewCache() # 不会执行到,只为了.出代码提示 + return viewCache + + def Sort(self): + ## 默认按战力倒序排 + if not self.__needSort: + return + self.__needSort = False + self.__viewCacheList.sort(key=lambda v: (v.GetFightPowerTotal(), v.GetLV()), reverse=True) + self.__idIndexDict = {} + self.__serverIDRangePlayerIDDict = {} + self.__refreshIDIndex() + return + + # 保存数据 存数据库和realtimebackup + def GetSaveData(self): + savaData = "" + cntData = "" + cnt = 0 + + for dbData in self.__viewCacheList: + cnt += 1 + savaData += dbData.GetBuffer() + + GameWorld.Log("Save DBPlayerViewCache count :%s len=%s" % (cnt, len(savaData))) + return CommFunc.WriteDWORD(cntData, cnt) + savaData + + # 从数据库载入数据 + def LoadPyGameData(self, datas, pos, dataslen): + cnt, pos = CommFunc.ReadDWORD(datas, pos) + GameWorld.Log("Load DBPlayerViewCache count :%s" % cnt) + + for _ in xrange(cnt): + dbData = DBStruct.tagDBPlayerViewCache() + pos += dbData.readData(datas, pos, dataslen) + self.InitViewCacheInstance(dbData) + + self.Sort() + return pos + +def OnPlayerLogout(curPlayer): + if curPlayer.GetLV() >= 10: + UpdPlayerViewCache(curPlayer) + + return + +def UpdPlayerViewCache(curPlayer, isOffline=False): + '''更新玩家查看缓存数据,更新时机由外层自己判断,这里只做更新逻辑 + 1. 下线时强制更新一次,上线暂不更新,上线时由各功能如果有需要用到触发更新 + 2. 有需要用到缓存数据时,如果玩家在线,1分钟内多次获取时最多更新一次,没有获取缓存数据则不更新 + ''' + if not curPlayer: + return + + playerID = curPlayer.GetPlayerID() + curCache = DBDataMgr.GetPlayerViewCacheMgr().GetPlayerViewCache(playerID) + if not curCache: + return + + tick = GameWorld.GetGameWorld().GetTick() + curPlayer.SetDict(Key_UpdViewCacheTick, tick) + GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID) + curCache.SetAccID(curPlayer.GetAccID()) + curCache.SetPlayerName(curPlayer.GetPlayerName()) + curCache.SetLV(curPlayer.GetLV()) + curCache.SetJob(curPlayer.GetJob()) + curCache.SetRealmLV(curPlayer.GetOfficialRank()) + curCache.SetFace(curPlayer.GetFace()) + curCache.SetFacePic(curPlayer.GetFacePic()) + curCache.SetFamilyID(curPlayer.GetFamilyID()) + curCache.SetFamilyName(curPlayer.GetFamilyName()) + curCache.SetFamilyEmblemID(PlayerControl.GetFamilyEmblemID(curPlayer)) + curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer)) + curCache.SetFightPowerTotal(PlayerControl.GetFightPower(curPlayer)) + curCache.SetServerID(GameWorld.GetPlayerServerID(curPlayer)) + if isOffline: + curCache.SetOffTime(int(time.time())) + + plusDict = curCache.GetPlusDict() + + #战斗属性 + plusDict.update({ + "MinAtk":curPlayer.GetMinAtk(), + "MaxAtk":curPlayer.GetMaxAtk(), + "Def":curPlayer.GetDef(), + "MaxHP":GameObj.GetMaxHP(curPlayer), + "Hit":curPlayer.GetHit(), + "Miss":curPlayer.GetMiss(), + "SuperHitRate":curPlayer.GetSuperHitRate(), # 暴击率 + }) + + # 功能数据 + + # 其他 + + return curCache + + \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/__init__.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/__init__.py new file mode 100644 index 0000000..1bed595 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/__init__.py @@ -0,0 +1,4 @@ +''' +本包主要针对数据结构体 DBStruct.py 进行二次数据封装 +仅对功能相关表底层数据逻辑进行处理,不关心功能业务逻辑 +''' \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/__init__.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/__init__.py diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DirtyList.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DirtyList.py new file mode 100644 index 0000000..62cce84 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DirtyList.py @@ -0,0 +1,75 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#--------------------------------------------------------------------- +# +#--------------------------------------------------------------------- +##@package DirtyList +# 存储禁言列表 +# +# @author eggxp +# @date 2010-3-31 +# @version 1.4 +# +# @change: "2010-10-08 11:05" panwei 拔除服务器版本控制代码 +# @change: "2012-05-25 16:00" jiang 字符合法性检查增加编码规则检查 +# @change: "2012-06-28 15:00" jiang 编码格式開出配置 +# @change: "2012-09-03 10:00" whx 屏蔽转义字符 +#--------------------------------------------------------------------- +#"""Version = 2012-09-03 10:00""" +#--------------------------------------------------------------------- + +import GameWorld +import ShareDefine +import IpyGameDataPY + +def IsWordForbidden(inputText): + ## 判断是否合法 + if not EncodingToUnicode(inputText): + return True + + if "\xe3\x85\xa4" in inputText: + GameWorld.Log("存在非法空白填充符!") + return True + + #屏蔽转义字符 + for char in ShareDefine.Def_List_EscapeSequence: + if char in inputText: + return True + + #2008.12.21, 不用python的find, 改用AnsiPos + #出错: 对于"小红"名字不能注册, 因为"小红" ascII中包含禁用字符"『", 在第一个字节和第二个字节 + #D0 A1 BA EC --> A1 BA + #所以改用bcb的AnsiPos + #AnsiPos说明: + #Note: This function supports multi-byte character sets (MBCS). + #if inputText.find(eachLine) >= 0: + + return False # 等接口有了后再去除,暂时默认返回False + + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in xrange(ipyDataMgr.GetDirtyListCount()): + ipyData = ipyDataMgr.GetDirtyListByIndex(index) + if GameWorld.GetGameWorld().FindStr(inputText, ipyData.GetWord()): + GameWorld.Log("屏蔽词: ID=%s" % (ipyData.GetID())) + return True + + for index in xrange(ipyDataMgr.GetDirtyNameCount()): + ipyData = ipyDataMgr.GetDirtyNameByIndex(index) + if GameWorld.GetGameWorld().FindStr(inputText, ipyData.GetWord()): + GameWorld.Log("玩家名屏蔽词: ID=%s" % (ipyData.GetID())) + return True + + return False + +def EncodingToUnicode(inputText): + ## 检查字符的规则是否符合 + if IpyGameDataPY.GetFuncCfg("EncodingTex", 1): + #不檢查 + return True + + try: + unicode(inputText, IpyGameDataPY.GetFuncCfg("EncodingTex", 2)) + except: + return False + + return True diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py index 6a56721..5297eff 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py @@ -3980,7 +3980,7 @@ #@return 返回值无意义 #@remarks 自定义函数:结束创建家族事件 def ExitCreateFamily(curPlayer): - PlayerFamily.SendPack_GameServer_ClearViewFamilyState(curPlayer) + #PlayerFamily.SendPack_GameServer_ClearViewFamilyState(curPlayer) return #--------------------------------------------------------------------- @@ -4855,8 +4855,8 @@ # @return None # @remarks def ViewAllFamilyInfo(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - PlayerFamily.SendPack_GameServer_ViewAllFamily(curPlayer) + #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + #PlayerFamily.SendPack_GameServer_ViewAllFamily(curPlayer) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Func_11.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Func_11.py index aa47293..c359676 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Func_11.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Func_11.py @@ -61,7 +61,7 @@ # return False #开始创建家族 - PlayerFamily.SendPack_GameServer_InputFamilyName(curPlayer) + #PlayerFamily.SendPack_GameServer_InputFamilyName(curPlayer) return True #--------------------------------------------------------------------- @@ -71,7 +71,7 @@ # @return 返回值无意义 # @remarks 查看家族 任务功能触发Fc_ def WatchFamily(curPlayer, tick): - PlayerFamily.SendPack_GameServer_ViewAllFamily(curPlayer) + #PlayerFamily.SendPack_GameServer_ViewAllFamily(curPlayer) return #--------------------------------------------------------------------- ##家族升级. diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py new file mode 100644 index 0000000..bd743ce --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py @@ -0,0 +1,248 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GM.Commands.CreateFamily +# +# @todo:创建假仙盟 +# @author hxp +# @date 2025-05-09 +# @version 1.0 +# +# 详细描述: 创建假仙盟 +# +#------------------------------------------------------------------------------- +#"""Version = 2025-05-09 12:20""" +#------------------------------------------------------------------------------- + +import GameWorld +import ShareDefine +import IPY_PlayerDefine +import PlayerFamily +import DBDataMgr +import random + +## 执行逻辑 +# @param curPlayer 当前玩家 +# @param gmList [] +# @return None +def OnExec(curPlayer, gmList): + + if not gmList: + #GameWorld.DebugAnswer(curPlayer, "创建跨服假仙盟: CreatFamily c 个数 [总战力 ServerID 等级 成员数]") + #GameWorld.DebugAnswer(curPlayer, "删除跨服假仙盟: CreatFamily c 0") + GameWorld.DebugAnswer(curPlayer, "建本服假仙盟: CreatFamily 个数 [总战力 ServerID 等级 成员数]") + GameWorld.DebugAnswer(curPlayer, "删本服假仙盟: CreatFamily 0") + GameWorld.DebugAnswer(curPlayer, "输出仙盟列表: CreatFamily pl [条数 从第x名]") + GameWorld.DebugAnswer(curPlayer, "输出仙盟明细: CreatFamily pf 仙盟ID") + GameWorld.DebugAnswer(curPlayer, "添加假申请人: CreatFamily j [申请数 仙盟ID]") + return + + value1 = gmList[0] + if value1 == "c": + # 跨服命令 + return + + if value1 == "pl": + __printFamilyList(curPlayer, gmList) + return + + if value1 == "pf": + __printFamilyInfo(curPlayer, gmList) + return + + if value1 == "j": + __addFackRequestJoin(curPlayer, gmList) + return + + creatCount = value1 + if creatCount <= 0: + __delFackFamily(curPlayer) + return + __createFackFamily(curPlayer, gmList) + return + +def __addFackRequestJoin(curPlayer, gmList): + reqCnt = gmList[1] if len(gmList) > 1 else 1 + familyID = gmList[2] if len(gmList) > 2 else curPlayer.GetFamilyID() + + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + GameWorld.DebugAnswer(curPlayer, "没有该仙盟: %s" % familyID) + return + + reqCnt = min(reqCnt, 100) + fackIDList = range(1, 200) + random.shuffle(fackIDList) + addCnt = 0 + reqDict = family.GetReqJoinPlayerInfo() + for fackID in fackIDList: + if fackID in reqDict: + continue + family.AddReqJoinPlayerID(fackID) + addCnt += 1 + if addCnt >= reqCnt: + break + # 广播给有招人权限的 + clientPack = PlayerFamily.GetPack_FamilyReqJoinInfo(familyID) + PlayerFamily.Broadcast_FamilyPack(familyID, clientPack, PlayerFamily.FamilyPowerID_Call) + GameWorld.DebugAnswer(curPlayer, "增加申请数:%s, 总申请:%s" % (addCnt, len(family.GetReqJoinPlayerInfo()))) + return + +def __printFamilyList(curPlayer, gmList): + printCnt = gmList[1] if len(gmList) > 1 else 100 + fromIndex = gmList[2] if len(gmList) > 2 else 0 + + printAnswerCnt = 0 + familyMgr = DBDataMgr.GetFamilyMgr() + familyMgr.Sort() + familyCnt = familyMgr.GetCount() + GameWorld.DebugAnswer(curPlayer, "仙盟总数: %s" % familyCnt) + for index in range(fromIndex, fromIndex + printCnt): + if index >= familyCnt: + break + family = familyMgr.GetAt(index) + rank = index + 1 + + text = "%s,ID:%s,LV:%s,战力:%s,成员:%s" % (rank, family.GetID(), family.GetLV(), family.GetFightPowerTotal(), family.GetCount()) + printAnswerCnt += 1 + if printAnswerCnt <= 100: + GameWorld.DebugAnswer(curPlayer, text) + else: + GameWorld.DebugLog(text) + + return + +def __printFamilyInfo(curPlayer, gmList): + familyID = gmList[1] if len(gmList) > 1 else curPlayer.GetFamilyID() + + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + GameWorld.DebugAnswer(curPlayer, "仙盟不存在: %s" % familyID) + return + + GameWorld.DebugAnswer(curPlayer, "----- 【%s】 -----" % (GameWorld.CodeToGbk(family.GetName()))) + GameWorld.DebugAnswer(curPlayer, "仙盟ID:%s,ServerID:%s" % (familyID, family.GetServerID())) + GameWorld.DebugAnswer(curPlayer, "LV:%s,Exp:%s" % (family.GetLV(), family.GetExp())) + GameWorld.DebugAnswer(curPlayer, "审核:%s,等级条件:%s,申请数:%s" % (family.GetJoinReview(), family.GetJoinLVMin(), len(family.GetReqJoinPlayerInfo()))) + GameWorld.DebugAnswer(curPlayer, "徽章:%s" % (family.GetEmblemID())) + GameWorld.DebugAnswer(curPlayer, "总战力:%s,人数:%s" % (family.GetFightPowerTotal(), family.GetCount())) + GameWorld.DebugAnswer(curPlayer, "盟主:%s" % (family.GetLeaderID())) + for index in range(family.GetCount()): + member = family.GetAt(index) + playerID = member.GetPlayerID() + fightPower = member.GetFightPowerTotal() + GameWorld.DebugAnswer(curPlayer, "%s,%s,职位:%s,战力:%s" % (index, playerID, member.GetFmLV(), fightPower)) + + return + +def __delFackFamily(curPlayer): + + delCnt = 0 + familyMgr = DBDataMgr.GetFamilyMgr() + for index in range(familyMgr.GetCount())[::-1]: + family = familyMgr.GetAt(index) + familyID = family.GetID() + if familyID > ShareDefine.FackFamilyIDMax: + continue + familyMgr.DelFamily(family.GetID()) + + if curPlayer: + GameWorld.DebugAnswer(curPlayer, "删除假仙盟数: %s,剩余:%s" % (delCnt, familyMgr.GetCount())) + elif GameWorld.IsCrossServer(): + GameWorld.DebugAnswer(None, "删除跨服假仙盟: %s,剩余:%s" % (delCnt, familyMgr.GetCount())) + return + +def __createFackFamily(curPlayer, gmList): + ## 个数 [总战力 ServerID 等级 成员数] + + creatCount = gmList[0] if len(gmList) > 0 else 1 # 默认1个 + familyFightPower = gmList[1] if len(gmList) > 1 else 10000000 + serverID = gmList[2] if len(gmList) > 2 else random.randint(1, 200) + familyLV = gmList[3] if len(gmList) > 3 else 1 # 默认1级 + memberCnt = gmList[4] if len(gmList) > 4 else random.randint(1, 10) + + FakeFamilyName = GameWorld.GbkToCode("神秘军团") + + fackFamilyID = ShareDefine.FackFamilyIDStart + fackMemID = ShareDefine.FackPlayerIDStart + fackMemIDMax = ShareDefine.FackPlayerIDMax + + fackMemIDList = [] + createOKCnt = 0 + familyMgr = DBDataMgr.GetFamilyMgr() + for _ in range(min(creatCount, 100)): + fackFamily = familyMgr.FindFamily(fackFamilyID) + while fackFamily and fackFamilyID < ShareDefine.FackFamilyIDMax: + for m in xrange(fackFamily.GetCount()): + member = fackFamily.GetAt(m) + memID = member.GetPlayerID() + if memID and memID not in fackMemIDList: + fackMemIDList.append(memID) + fackFamilyID += 1 + fackFamily = familyMgr.FindFamily(fackFamilyID) + + if fackFamily: + break + + fackFamilyName = "%s%s" % (FakeFamilyName, fackFamilyID) + fackFamily = familyMgr.AddFamily(fackFamilyID, fackFamilyName, serverID) + fackFamilyID += 1 + if not fackFamily: + continue + + fackFamily.SetLV(familyLV) + fackFamily.SetFightPowerTotal(familyFightPower) + fackFamily.SetEmblemID(1) + fackFamily.SetJoinReview(1) # 设置需要审核 + fackFamily.SetJoinLVMin(random.randint(0, 1000)) + + GameWorld.DebugLog("创建假仙盟: fackFamilyID=%s,serverID=%s,familyFightPower=%s,memberCnt=%s" + % (fackFamilyID, serverID, familyFightPower, memberCnt)) + for _ in range(memberCnt): + + while fackMemID in fackMemIDList and fackMemID < fackMemIDMax: + fackMemID += 1 + + if fackMemID in fackMemIDList: + break + + member = fackFamily.AddMember(fackMemID) + if not member: + continue + + if not fackFamily.GetLeaderID(): + member.SetFmLV(IPY_PlayerDefine.fmlLeader) + fackFamily.SetLeaderID(fackMemID) + + fackMemID += 1 + + # 根据成功创建的成员平均分配总战力 + memFightPowerTotal = familyFightPower + memCnt = fackFamily.GetCount() + avgValue = memFightPowerTotal / memCnt + for m in range(memCnt): + member = fackFamily.GetAt(m) + memID = member.GetPlayerID() + fmLV = member.GetFmLV() + if m == memCnt - 1: + memFightPower = memFightPowerTotal + else: + memFightPower = avgValue + memCnt / 2 - m + memFightPowerTotal -= memFightPower + viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(memID, True) + viewCache.SetFightPowerTotal(memFightPower) + GameWorld.DebugLog(" 仙盟成员: memID=%s,memFightPower=%s,fmLV=%s" % (memID, memFightPower, fmLV)) + member.RefreshMemberByID(memID) + + createOKCnt += 1 + familyFightPower += 10000 + + familyMgr.Sort() + if curPlayer: + GameWorld.DebugAnswer(curPlayer, "成功创建假仙盟: %s,剩余:%s" % (creatCount, familyMgr.GetCount())) + elif GameWorld.IsCrossServer(): + GameWorld.DebugAnswer(None, "成功创建跨服假仙盟: %s,总:%s" % (creatCount, familyMgr.GetCount())) + return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py index 2933ce4..ae37ea9 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Zhenbaoge.py @@ -17,7 +17,7 @@ import GameWorld import PlayerControl -import PlayerFamily +import PlayerFamilyZhenbaoge import ChConfig import time @@ -49,7 +49,7 @@ elif value1 == "d": PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 0) - PlayerFamily.Sync_ZhenbaogeInfo(curPlayer) + PlayerFamilyZhenbaoge.Sync_ZhenbaogeInfo(curPlayer) GameWorld.DebugAnswer(curPlayer, "重置珍宝阁玩家今日状态OK") return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py index 8de3a0d..c71d18d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py @@ -1384,8 +1384,8 @@ ##获取玩家所属区服ID # @param curPlayer # @return -def GetPlayerServerID(curPlayer): - accID = curPlayer.GetAccID() +def GetPlayerServerID(curPlayer): return GetAccIDServerID(curPlayer.GetAccID()) +def GetAccIDServerID(accID): infoList = accID.split(Def_AccID_Split_Sign) return 0 if len(infoList) < 3 else ToIntDef(infoList[-1][1:]) @@ -1879,18 +1879,12 @@ # @param inputText 输入的文字 # @return: 是否符合编码格式 def EncodingToUnicode(inputText): - encodingList = ReadChConfig.GetEvalChConfig("EncodingTex") - - if len(encodingList) != 2: - ErrLog("EncodingTex.txt Error len != 2") - return False - - if encodingList[0]: + if IpyGameDataPY.GetFuncCfg("EncodingTex", 1): #不檢查 return True try: - unicode(inputText, encodingList[1]) + unicode(inputText, IpyGameDataPY.GetFuncCfg("EncodingTex", 2)) except: return False @@ -1898,23 +1892,10 @@ # 获得游戏设置的字符编码 -def GetCharacterEncoding(): - encodingList = ReadChConfig.GetEvalChConfig("EncodingTex") - - if len(encodingList) != 2: - ErrLog("EncodingTex.txt Error len != 2") - return 'utf8' - return encodingList[1] - +def GetCharacterEncoding(): return IpyGameDataPY.GetFuncCfg("EncodingTex", 2) # 服务器默认GBK,转配置编码如UTF8,一般用于与显示层交互,不判断是否base64 def GbkToCode(inputText): - encodingList = ReadChConfig.GetEvalChConfig("EncodingTex") - - if len(encodingList) != 2: - ErrLog("EncodingTex.txt Error len != 2") - return inputText - try: return inputText.decode(ShareDefine.Def_Game_Character_Encoding).encode(GetCharacterEncoding()) except: @@ -1922,6 +1903,14 @@ return inputText +def CodeToGbk(inputText): + try: + return inputText.decode(GetCharacterEncoding()).encode(ShareDefine.Def_Game_Character_Encoding) + except: + return inputText + + return inputText + def IsCrossServer(): ## 是否跨服服务器 return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py index 397afc1..77e539c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/GameWorldProcess.py @@ -52,6 +52,7 @@ import GameMap import NPCRealmRefresh import IpyGameDataPY +import DBDataMgr #--------------------------------------------------------------------- ## 副本开启 # @param gameWorld IPY_GameWorld @@ -592,6 +593,9 @@ # @return None # @remarks 函数详细说明. def InitGameWorld(tick): + if not PyGameData.g_initGame: + PyGameData.g_initGame = True + DBDataMgr.OnServerStart() gameWorld = GameWorld.GetGameWorld() ItemCommon.InitPyItem() EventShell.DoReloadRefresh() @@ -777,6 +781,8 @@ curMinute = curTime.minute if curMinute == PyGameData.g_mapLastProcess_Minute: return + if PyGameData.g_initGame: + DBDataMgr.OnMinute(curMinute) PyGameData.g_mapLastProcess_Minute = curMinute PlayerTeam.OnCheckTeamPlayerDisconnectTimeout(tick) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 49273bf..09f93a8 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -11,6 +11,8 @@ # # 详细描述: 读取PY表 # +# @note: 本脚本由 \PySysDB\生成IpyGameDataPY 生成 +# #------------------------------------------------------------------------------- #"""Version = 2018-05-10 12:00""" #------------------------------------------------------------------------------- @@ -33,6 +35,16 @@ } ''' Def_IpyTable = { + "DirtyList":( + ("WORD", "ID", 0), + ("char", "Word", 0), + ), + + "DirtyName":( + ("WORD", "ID", 0), + ("char", "Word", 0), + ), + "Dienstgrad":( ("DWORD", "ID", 1), ("WORD", "Type", 0), @@ -2417,6 +2429,35 @@ ("list", "AwardItemList", 0), ), + "Family":( + ("BYTE", "FamilyLV", 1), + ("BYTE", "MemberMax", 0), + ("BYTE", "DeputyLeaderMax", 0), + ("BYTE", "EliteMax", 0), + ("DWORD", "NeedExp", 0), + ("DWORD", "ZhenbaogeWeights", 0), + ), + + "FamilyEmblem":( + ("BYTE", "EmblemID", 1), + ("BYTE", "UnlockFamilyLV", 0), + ("DWORD", "ExpireMinutes", 0), + ("DWORD", "CustomFamilyID", 0), + ), + + "FamilyZhenbaogeCut":( + ("BYTE", "CutNum", 1), + ("DWORD", "CutWeight", 0), + ("float", "MinRatio", 0), + ("float", "RandRatio", 0), + ), + + "FamilyZhenbaogeItem":( + ("BYTE", "ItemGroupNum", 1), + ("DWORD", "ItemWeight", 0), + ("list", "ItemList", 0), + ), + "FamilyZhenfa":( ("BYTE", "ZhenfaType", 1), ("WORD", "ZhenfaLV", 1), @@ -2589,6 +2630,26 @@ ), } + +# 屏蔽词 +class IPY_DirtyList(): + + def __init__(self): + self.attrTuple = None + return + + def GetID(self): return self.attrTuple[0] # WORD + def GetWord(self): return self.attrTuple[1] # 屏蔽词 char + +# 玩家名屏蔽词 +class IPY_DirtyName(): + + def __init__(self): + self.attrTuple = None + return + + def GetID(self): return self.attrTuple[0] # WORD + def GetWord(self): return self.attrTuple[1] # 屏蔽词 char # 称号表 class IPY_Dienstgrad(): @@ -6184,6 +6245,55 @@ def GetNeedHurtTotal(self): return self.attrTuple[2] # 所需总伤血 DWORD def GetAwardItemList(self): return self.attrTuple[3] # 奖励物品列表[[物品ID,个数,是否拍品], ...] list +# 仙盟等级表 +class IPY_Family(): + + def __init__(self): + self.attrTuple = None + return + + def GetFamilyLV(self): return self.attrTuple[0] # 仙盟等级 BYTE + def GetMemberMax(self): return self.attrTuple[1] # 成员数上限 BYTE + def GetDeputyLeaderMax(self): return self.attrTuple[2] # 副盟主数上限 BYTE + def GetEliteMax(self): return self.attrTuple[3] # 精英数上限 BYTE + def GetNeedExp(self): return self.attrTuple[4] # 升级所需经验 DWORD + def GetZhenbaogeWeights(self): return self.attrTuple[5] # 珍宝阁总权重 DWORD + +# 仙盟徽章表 +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 + def GetCustomFamilyID(self): return self.attrTuple[3] # 定制仙盟ID DWORD + +# 仙盟珍宝阁砍价表 +class IPY_FamilyZhenbaogeCut(): + + def __init__(self): + self.attrTuple = None + return + + def GetCutNum(self): return self.attrTuple[0] # 砍价人次 BYTE + def GetCutWeight(self): return self.attrTuple[1] # 砍价权重 DWORD + def GetMinRatio(self): return self.attrTuple[2] # 保底比值 float + def GetRandRatio(self): return self.attrTuple[3] # 随机比值 float + +# 仙盟珍宝阁物品表 +class IPY_FamilyZhenbaogeItem(): + + def __init__(self): + self.attrTuple = None + return + + def GetItemGroupNum(self): return self.attrTuple[0] # 物品组编号 BYTE + def GetItemWeight(self): return self.attrTuple[1] # 随机权重 DWORD + def GetItemList(self): return self.attrTuple[2] # 物品列表[[物品ID,个数,是否拍品], ...] list + # 仙盟阵法表 class IPY_FamilyZhenfa(): @@ -6525,6 +6635,8 @@ Log("IPY_DataMgr Reload... onlyCheck=%s" % onlyCheck) if not onlyCheck: self.ipyConfigEx = {} + self.__LoadFileData("DirtyList", onlyCheck) + self.__LoadFileData("DirtyName", onlyCheck) self.__LoadFileData("Dienstgrad", onlyCheck) self.__LoadFileData("TitleStarUp", onlyCheck) self.__LoadFileData("PlayerFace", onlyCheck) @@ -6767,6 +6879,10 @@ self.__LoadFileData("EquipPlusEvolve", onlyCheck) self.__LoadFileData("FamilyBossAward", onlyCheck) self.__LoadFileData("FamilyBossHurtAward", onlyCheck) + self.__LoadFileData("Family", onlyCheck) + self.__LoadFileData("FamilyEmblem", onlyCheck) + self.__LoadFileData("FamilyZhenbaogeCut", onlyCheck) + self.__LoadFileData("FamilyZhenbaogeItem", onlyCheck) self.__LoadFileData("FamilyZhenfa", onlyCheck) self.__LoadFileData("ItemWashMax", onlyCheck) self.__LoadFileData("HorsePetBossAward", onlyCheck) @@ -6802,10 +6918,12 @@ def __LoadFileData(self, tableName, onlyCheck=False): # @param onlyCheck: 是否仅检查格式,一般启动时用 - curPath = ChConfig.GetDBPath() + "\\PySysDB\\tag" + tableName + ".txt" + curPath = ChConfig.GetDBPath() + "\\PySysDB\\" + tableName + ".txt" if not os.path.isfile(curPath): - ErrLog("can not find file = %s,%s" % (tableName, curPath)) - raise Exception("can not find file = %s,%s" % (tableName, curPath)) + curPath = ChConfig.GetDBPath() + "\\PySysDB\\tag" + tableName + ".txt" + if not os.path.isfile(curPath): + ErrLog("can not find file = %s,%s" % (tableName, curPath)) + raise Exception("can not find file = %s,%s" % (tableName, curPath)) if not onlyCheck: if not hasattr(self, "ipy%sLen" % tableName): @@ -6998,6 +7116,20 @@ setList = tuple(setList) return setList + + def GetDirtyListCount(self): + self.CheckLoadData("DirtyList") + return self.ipyDirtyListLen + def GetDirtyListByIndex(self, index): + self.CheckLoadData("DirtyList") + return self.ipyDirtyListCache[index] + + def GetDirtyNameCount(self): + self.CheckLoadData("DirtyName") + return self.ipyDirtyNameLen + def GetDirtyNameByIndex(self, index): + self.CheckLoadData("DirtyName") + return self.ipyDirtyNameCache[index] def GetDienstgradCount(self): self.CheckLoadData("Dienstgrad") @@ -8693,6 +8825,34 @@ self.CheckLoadData("FamilyBossHurtAward") return self.ipyFamilyBossHurtAwardCache[index] + def GetFamilyCount(self): + self.CheckLoadData("Family") + return self.ipyFamilyLen + def GetFamilyByIndex(self, index): + 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 GetFamilyZhenbaogeCutCount(self): + self.CheckLoadData("FamilyZhenbaogeCut") + return self.ipyFamilyZhenbaogeCutLen + def GetFamilyZhenbaogeCutByIndex(self, index): + self.CheckLoadData("FamilyZhenbaogeCut") + return self.ipyFamilyZhenbaogeCutCache[index] + + def GetFamilyZhenbaogeItemCount(self): + self.CheckLoadData("FamilyZhenbaogeItem") + return self.ipyFamilyZhenbaogeItemLen + def GetFamilyZhenbaogeItemByIndex(self, index): + self.CheckLoadData("FamilyZhenbaogeItem") + return self.ipyFamilyZhenbaogeItemCache[index] + def GetFamilyZhenfaCount(self): self.CheckLoadData("FamilyZhenfa") return self.ipyFamilyZhenfaLen diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py index daa622f..2213f4d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NetPackCommon.py @@ -218,6 +218,8 @@ # @return 无返回值 # @remarks def SendFakePack(curPlayer, clientPack): + if not clientPack: + return # Log("SendFakePack: clientPack = %s"%[clientPack.GetBuffer()]) innerPackData = clientPack.GetBuffer() if len(innerPackData) < clientPack.GetLength(): 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 db3008c..1c4fbf6 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -586,8 +586,6 @@ #---玩家上线, 宠物逻辑处理--- PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick) - PlayerFamily.FamilyPlayerOnLoginCross(curPlayer) - PlayerTeam.OnPlayerLoginCrossServer(curPlayer) return @@ -726,8 +724,6 @@ #充值活动玩家登入处理 #PlayerGoldAction.DoLogic_PlayerOnLogin(curPlayer) - # 通知玩家是否可以参加家族活动 - #PlayerFamily.SendClientForbidFamilyAction(curPlayer) # 提示贵宾俱乐部信息 #PlayerVip.NoteVIPClubInfo(curPlayer) @@ -785,7 +781,7 @@ #同步自动战斗配置记录 # Sync_AutoFightSetting(curPlayer) - PlayerFamily.FamilyPlayerOnLogin(curPlayer, tick) + PlayerFamily.OnPlayerLogin(curPlayer, tick) #改到 GameServerRefresh GameSever_PlayerInitOK后处理才能保证玩家已经在Gameserver注册 #PlayerDienstgrad.RefreshBillBoardDienstgrad(curPlayer) # 称号 @@ -5598,9 +5594,6 @@ # 每日免费直购礼包 elif rewardType == ChConfig.Def_RewardType_DayFreeGoldGift: PlayerDailyGiftbag.OnGetDailyFreeGiftbag(curPlayer) - # 仙盟活跃度奖励 - elif rewardType == ChConfig.Def_RewardType_FamilyActivity: - PlayerFamily.GetFamilyActivityAward(curPlayer, dataEx) # 仙盟联赛冠军仙盟每日俸禄奖励 elif rewardType == ChConfig.Def_RewardType_ChampionFamilyDailyReward: GameLogic_FamilyWar.GetChampionFamilyDailyReward(curPlayer) 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 4bc6a23..cdc027c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -89,6 +89,7 @@ import PlayerTongTianLing import PlayerCrossRealmPK import FunctionNPCCommon +import DBPlayerViewCache import PlayerGoldInvest import IPY_PlayerDefine import CrossRealmPlayer @@ -1488,6 +1489,8 @@ #玩家下线通知gameserver记录缓存(放在下线更新排行榜之后,方便Gameserver判断是否需要存入数据库中) PlayerViewCacheTube.OnPlayerLogOut(curPlayer, tick) + DBPlayerViewCache.OnPlayerLogout(curPlayer) + PlayerFamily.OnPlayerLogout(curPlayer) #玩家下线/玩家切换地图公用逻辑 __PlayerLeaveServerLogic(curPlayer, tick, True) @@ -7398,6 +7401,14 @@ def GetFamilyEmblemID(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyEmblemID) def SetFamilyEmblemID(curPlayer, emblemID): NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyEmblemID, emblemID) +# 仙盟职位,使用 GetReceivedSalary,因为FamilyMemberLV没有入库 +def GetFamilyMemberLV(curPlayer): return curPlayer.GetReceivedSalary() +def SetFamilyMemberLV(curPlayer, fmLV): + #因为仙盟职位没有存DBPlayer,而跨服后又没有Family信息,所以这里做个存储,用于跨服用 + curPlayer.SetReceivedSalary(fmLV) + curPlayer.SetFamilyMemberLV(fmLV) # 也同步设置该值,防止有些地方直接调用 curPlayer.GetFamilyMemberLV() + return + # 仙盟事务速度加成 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/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py index b438e41..0e9b165 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py @@ -605,7 +605,7 @@ # 世界boss BossHurtMng.OnDay(curPlayer) # 仙盟过天 - PlayerFamily.FamilyPlayerOnDay(curPlayer) + PlayerFamily.PlayerOnDay(curPlayer) # 重置物品每日使用次数 ChItem.ResetItemUseCntToday(curPlayer) # 极品白拿 @@ -660,16 +660,6 @@ #购买次数礼包 PlayerActBuyCountGift.OnDay(curPlayer, onEventType) return - - -### 服务器Onday处理数据,即不能在玩家上线时的Onday触发 -## @param curPlayer: 当前玩家实例 -## @return: 无 -#def PlayerServerDay(curPlayer): -# -# # 设置玩家是否可以参加家族活动 -# #PlayerFamily.SetForbidFamilyAction(curPlayer, 0) -# return #--------------------------------------------------------------------- ## 把当前这一周的在线时间算到上一周去 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 e7a0ee6..6e63e0f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py @@ -13,170 +13,425 @@ #--------------------------------------------------------------------- #"""Version = 2017-07-12 21:00""" #--------------------------------------------------------------------- -import IPY_GameWorld -import GameWorld -import EventShell + import FBLogic import ChConfig -import PlayerControl +import GameWorld import ShareDefine -import ReadChConfig -import PlayerTruck +import PlayerControl import NetPackCommon import ChPyNetSendPack -import DataRecordPack -import GameLogic_FamilyWar -import GameLogic_FamilyBoss -import ChMapToGamePyPack import PlayerFamilyTech -import PlayerFamilyRedPacket +import PlayerFamilyEmblem import PlayerFamilyZhenfa -import PlayerTongTianLing -import PlayerWeekParty -import PlayerActivity -import ItemControler -import SkillCommon -import BuffSkill -import ItemCommon -import PlayerSuccess -import GameFuncComm -import PlayerTJG +import IPY_PlayerDefine import IpyGameDataPY -import cPickle +import IPY_GameWorld +import GameFuncComm +import ItemCommon +import DBDataMgr +import DirtyList -import time import random -#--------------------------------------------------------------------- -#家族刷新 -#class IPY_MFamilyRefresh -#{ -#public: -# -# int GetFamilyID(); -# -# char * GetFamilyName(); -#}; -## 家族刷新 -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def GameServer_FamilyRefresh(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - refreshPack = IPY_GameWorld.IPY_MFamilyRefresh() +import time + +#申请、审核、退出、踢人、捐献、升级 + +Def_CreatFamily_MaxStr = 33 + +#仙盟变更类型 +FamilyChangeTypes = ( +FamilyChangeType_None, +FamilyChangeType_MemJoin, # 成员加入 1 +FamilyChangeType_MemLeave, # 成员退出 2 +FamilyChangeType_JoinSet, # 收人设置修改 3 +FamilyChangeType_Broadcast, # 公告修改 4 +FamilyChangeType_EChange, # 徽章修改 5 +FamilyChangeType_LeaderChange, # 盟主变更 6 +FamilyChangeType_MemFmlvChange, # 成员职位变更 7 +FamilyChangeType_MemLogin, # 成员上线 8 +FamilyChangeType_MemLogout, # 成员离线9 +) = range(10) + +#仙盟权限 +( +FamilyPowerID_Call, #招人 1 +FamilyPowerID_ChangeFmlv, #变更职位 2 +FamilyPowerID_Broadcast, #发布公告 3 +FamilyPowerID_Kick, #踢人 4 +) = range(1, 1 + 4) + +#仙盟职位对应人数设置属性名 +Def_FmlSetAttrName = { + IPY_PlayerDefine.fmlMember:"MemberMax", + IPY_PlayerDefine.fmlCounsellor:"EliteMax", + IPY_PlayerDefine.fmlViceLeader:"DeputyLeaderMax", + } + +def PlayerOnDay(curPlayer): + if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): + return + #每日福利奖励 + Sync_FamilyDayRewardState(curPlayer) + __FamilyAffair_Refresh(curPlayer, True) - if curPlayer.GetID() != refreshPack.GetPlayerID(): - #不是自己 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 0) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 0) + #PlayerFamilyZhenbaoge.Sync_ZhenbaogeInfo(curPlayer) + return + +def OnPlayerLogin(curPlayer, tick): + if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): + return + PlayerLoginRefreshFamily(curPlayer, tick) + Sync_RequestAddFamilyInfo(curPlayer, False) + Sync_FamilyDayRewardState(curPlayer) + PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer) + __FamilyAffair_CheckReset(curPlayer) + PlayerFamilyZhenfa.OnPlayerLogin(curPlayer) + #PlayerFamilyZhenbaoge.Sync_ZhenbaogeInfo(curPlayer) + return + +def OnPlayerLogout(curPlayer): + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if not familyID: + return + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + curMember.SetOffTime(int(time.time())) + #XW_JZ_LeaguerLeaveline <n color="0,190,255">{%S1%}</n><n color="255,255,0">下线了!</n> 25 - - + NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerLeaveline", [curPlayer.GetPlayerName()]) + Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogout, excludeIDList=[playerID]) + return + +def OnWeekEx(curPlayer): + #重置 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityAwardRecord, 0) + for actionid in ShareDefine.FamilyActiveIDList: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0) + return + +def PlayerLoginRefreshFamily(curPlayer, tick): + ## 玩家登录时刷新家族 + + playerID = curPlayer.GetPlayerID() + familyMgr = DBDataMgr.GetFamilyMgr() + refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID) + MapServer_FamilyRefresh(curPlayer, refreshFamilyID) + + familyID = curPlayer.GetFamilyID() + if not familyID: return - lastFamilyID = curPlayer.GetFamilyID() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + curMember.SetOffTime(0) # 在线0,脱机1,>1离线时间 + curMember.RefreshMember(curPlayer) + Sync_FamilyInfo(curPlayer) -#************族长变更删除发布任务************************************************* - if (curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader - and refreshPack.GetFamilyMemberLV()!= IPY_GameWorld.fmlLeader): - EventShell.EventResponse_OnMemberChange(curPlayer) -#******************************************************************* + #通知招人 + if GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): + NetPackCommon.SendFakePack(curPlayer, GetPack_FamilyReqJoinInfo(familyID)) + + #XW_JZ_LeaguerOnline <n color="0,190,255">{%S1%}</n><n color="255,255,0">上线了!</n> 25 - - + NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerOnline", [curPlayer.GetName()], [playerID]) + Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogin, excludeIDList=[playerID]) + + # 盟主上线处理 + if curMember.GetFmLV() == IPY_PlayerDefine.fmlLeader: + OnFamilyLeaderLogin(curPlayer) + return - #---根据封包修改玩家家族属性--- - if lastFamilyID != refreshPack.GetFamilyID(): - curPlayer.SetFamilyID(refreshPack.GetFamilyID()) - familyIDChangeTime = int(time.time()) - #PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyIDChangeTime, familyIDChangeTime) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_LastFamilyID, lastFamilyID) - GameWorld.Log("记录家族变更时间...familyIDChangeTime=%s,lastFamilyID=%s,nextFamilyID=%s" - % (familyIDChangeTime, lastFamilyID, refreshPack.GetFamilyID()), curPlayer.GetPlayerID()) - - #触发玩家加入家族事件 - EventShell.EventResponse_OnFamilyAdd(curPlayer) - - if curPlayer.GetFamilyName() != refreshPack.GetFamilyName(): - curPlayer.SetFamilyName(refreshPack.GetFamilyName()) - #通知周围玩家家族名称刷新 - curPlayer.Notify_FamilyNameRefresh() +def OnFamilyLeaderLogin(curPlayer): + ## 盟主登录额外处理 - refreshFamilyLV = refreshPack.GetFamilyLV() - lastFamilyLV = curPlayer.GetFamilyLV() - if lastFamilyLV != refreshFamilyLV: - #任务需求,记录先前的家族等级 - curPlayer.SetDict(ChConfig.Def_PlayerKey_FamilyLVLeave, lastFamilyLV) + return + +#// A6 04 创建家族 #tagCMCreateFamily +# +#struct tagCMCreateFamily +#{ +# tagHead Head; +# char Name[33]; +# WORD EmblemID; //选择徽章ID,解锁仙盟等级为1级的均为可选ID +#}; +def OnCreateFamily(index, clientPack, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + inputName = clientPack.Name + emblemID = clientPack.EmblemID + + if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): + return + playerID = curPlayer.GetPlayerID() + playerFamilyID = curPlayer.GetFamilyID() + familyMgr = DBDataMgr.GetFamilyMgr() + if playerFamilyID: + curFamily = familyMgr.FindFamily(playerFamilyID) + if curFamily: + if curFamily.FindMember(playerID): + #玩家已经有家族, 创建失败 + PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_85890") + return + + fullFamilyName = CheckInputFamilyName(curPlayer, inputName) + if not fullFamilyName: + return + + needMoney = IpyGameDataPY.GetFuncCfg("CreateFamily", 1) + moneyType = IpyGameDataPY.GetFuncCfg("CreateFamily", 2) + if moneyType and needMoney: + if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, "CreateFamily"): + return + + newFamilyID = random.randint(10000, 20000) # 先随机,之后替换接口 + serverID = GameWorld.GetPlayerServerID(curPlayer) + curFamily = familyMgr.AddFamily(newFamilyID, fullFamilyName, serverID) + if curFamily == None: + GameWorld.ErrLog("创建家族失败", playerID) + return + curFamily.SetLV(1) + emblemIDList = PlayerFamilyEmblem.GetDefaultFamilyEmblemIDList() + if not emblemID or emblemID not in emblemIDList: + emblemID = random.choice(emblemIDList) # 从默认徽章中随机选择一个 + GameWorld.Log("创建仙盟: familyID=%s,playerID=%s,emblemID=%s" % (newFamilyID, playerID, emblemID)) + curFamily.SetEmblemID(emblemID) + + #-设置家族成员属性 + DoPlayerJionFamily(curFamily, playerID, curPlayer, IPY_PlayerDefine.fmlLeader) + familyMgr.Sort() + + #XW_JZ_EstablishSud <n color="255,255,0">恭喜您,家族建立成功!</n> 25 - - + PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishSud") + PlayerControl.WorldNotify(0, "jiazu_liubo_671654", [curPlayer.GetName(), fullFamilyName, newFamilyID]) + #PlayerFamilyZhenbaoge.OnZhenbaogeReset(curFamily) + return + +def CheckInputFamilyName(curPlayer, inputName): + '''检查玩家输入的仙盟名是否合法,建盟、改名通用 + @return: None-不合法;非空-合法的仙盟全名 + ''' + #C++过滤空格 + familyName = GameWorld.GetGameWorld().GetCharTrim(inputName) + fullFamilyName = GetFamilyFullName(curPlayer, familyName) + if not fullFamilyName: + GameWorld.ErrLog("家族全名异常!", curPlayer.GetPlayerID()) + return + + if DirtyList.IsWordForbidden(familyName): + #XW_JZ_Family_NameNoLegality 对不起,家族名称中含有非法字符 + PlayerControl.NotifyCode(curPlayer, "XW_JZ_Family_NameNoLegality") + return + + if len(familyName) <= 0 or len(familyName) > Def_CreatFamily_MaxStr: + PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [Def_CreatFamily_MaxStr / 2, Def_CreatFamily_MaxStr]) + return + + familyMgr = DBDataMgr.GetFamilyMgr() + if familyMgr.FindFamilyByName(fullFamilyName): + #XW_JZ_EstablishErr_Name <n color="255,255,0">对不起,您输入的家族名已存在,建立家族失败!</n> 25 - - + PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishErr_Name") + return + + return fullFamilyName + + +## 获取家族全名 +def GetFamilyFullName(curPlayer, familyName): + serverID = GameWorld.GetPlayerServerID(curPlayer) + + maxServerID = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 3) + if serverID > maxServerID or serverID <= 0: + GameWorld.ErrLog("仙盟全名 serverID=%s error! maxServerID=%s, check FamilyNameFormat.txt" % (serverID, maxServerID)) + return "" + + specServerDict = IpyGameDataPY.GetFuncEvalCfg("FamilyNameFormat", 4, {}) + nameFormatInfo = GameWorld.GetDictValueByRangeKey(specServerDict, serverID) + if not nameFormatInfo: + nameFormatInfo = IpyGameDataPY.GetFuncEvalCfg("FamilyNameFormat", 1) + if not nameFormatInfo: + return "" + nameFormat = nameFormatInfo[0] + paramList = [eval(pName) for pName in nameFormatInfo[1:]] + fullName = nameFormat % tuple(paramList) + + maxLen = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 2) + if len(fullName) > maxLen: + GameWorld.ErrLog("仙盟全名 familyName=%s,全名=%s len=%s > %s, check FamilyNameFormat.txt" % (familyName, fullName, len(fullName), maxLen)) + PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [maxLen / 2, maxLen]) + return "" + + return fullName + +def DoPlayerJionFamily(family, playerID, jionPlayer, jionFamilySetLv=IPY_PlayerDefine.fmlMember, broadcastFamilyChange=True): + '''加入家族,支持离线玩家加入 + @param jionPlayer: 如果是离线玩家则为None + ''' + if isinstance(family, int): + familyID = family + familyMgr = DBDataMgr.GetFamilyMgr() + curFamily = familyMgr.FindFamily(familyID) + else: + curFamily = family + + if not curFamily: + return + + familyID = curFamily.GetID() + member = curFamily.AddMember(playerID) + member.SetFmLV(jionFamilySetLv) + if jionPlayer: + member.RefreshMember(jionPlayer) + else: + member.RefreshMemberByID(playerID) + curFamily.SetFightPowerTotal(curFamily.GetFightPowerTotal() + member.GetFightPowerTotal()) + + if jionFamilySetLv == IPY_PlayerDefine.fmlLeader: + curFamily.SetLeaderID(playerID) + + #设置玩家身上保存的家族信息 + if jionPlayer: + MapServer_FamilyRefresh(jionPlayer, familyID) + Sync_FamilyInfo(jionPlayer) + + if jionFamilySetLv != IPY_PlayerDefine.fmlLeader: + if broadcastFamilyChange: + Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=[playerID]) + #通知所有家族成员, 这个人加入了家族 + NotifyAllFamilyMemberMsg(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID]) + if jionPlayer: + PlayerControl.NotifyCode(jionPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()]) + + #记录加入事件 + tick = GameWorld.GetGameWorld().GetTick() + AddFamilyActionNote(member.GetPlayerName(), familyID, ShareDefine.Def_ActionType_FamilyEvent, + [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Join, jionFamilySetLv, 0], tick) + + #玩家缓存 + #PlayerViewCache.OnPlayerFamilyChange(jionPlayer.GetPlayerID(), curFamily.GetID(), curFamily.GetName()) + #PlayerTeam.OnTeamMemFamilyRefresh(jionPlayer, curFamily.GetID()) + #SetMemberFightPower(familyMember, PlayerControl.GetFightPower(jionPlayer)) + #GetFamilyMgr().AddFamilyIDToFightPowerChangeList(curFamily.GetID(), jionPlayer.GetPlayerID()) + return + +def AddFamilyActionNote(curName, familyID, actionType, actionDataList, tick, isClearNone=True, useData=""): + '''统一添加家族Action数据 + ''' + if actionType not in ShareDefine.Def_ActionTypeList: + #记录行为类型错误 + GameWorld.ErrLog("记录家族行为类型:%s 错误") + return False + + familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) + actionData = familyAction.AddAction() + if not actionData: + return False + + #---设置行为对象数据--- + actionData.SetName(curName) # 设置名字 + actionData.SetUserData(useData) # 设置自定义数据 + for num, value in enumerate(actionDataList, 1): + setFunc = getattr(actionData, "SetValue%s" % num) + if setFunc: + setFunc(value) + return True + +def MapServer_FamilyRefresh(curPlayer, refreshFamilyID): + ''' 相当于GameServer调用 curPlayer.MapServer_FamilyRefresh() + @param familyID: 玩家更新的familyID + ''' + + tick = GameWorld.GetGameWorld().GetTick() + playerID = curPlayer.GetPlayerID() + refreshFmLV = 0 + refreshFamilyLV = 0 + refreshEmblemID = 0 + refreshFamilyName = "" + if refreshFamilyID: + familyMgr = DBDataMgr.GetFamilyMgr() + curFamily = familyMgr.FindFamily(refreshFamilyID) + if curFamily: + refreshFamilyLV = curFamily.GetLV() + refreshFamilyName = curFamily.GetName() + refreshEmblemID = curFamily.GetEmblemID() + member = curFamily.FindMember(playerID) + if member: + refreshFmLV = member.GetFmLV() + else: + refreshFamilyID = 0 + + lastFamilyID = curPlayer.GetFamilyID() + lastFamilyLV = curPlayer.GetFamilyLV() # 仙盟等级,非职位等级 + lastFmLV = PlayerControl.GetFamilyMemberLV(curPlayer) + + if lastFamilyID != refreshFamilyID: + curPlayer.SetFamilyID(refreshFamilyID) + + if curPlayer.GetFamilyName() != refreshFamilyName: + curPlayer.SetFamilyName(refreshFamilyName) + curPlayer.Notify_FamilyNameRefresh() #//04 36 周围玩家家族名刷新#tagPlayerFamilyNameRefresh + + if PlayerControl.GetFamilyEmblemID(curPlayer) != refreshEmblemID: + PlayerControl.SetFamilyEmblemID(curPlayer, refreshEmblemID) + + if lastFmLV != refreshFmLV: + PlayerControl.SetFamilyMemberLV(curPlayer, refreshFmLV) + + if lastFamilyLV != refreshFamilyLV: isLVUP = False if lastFamilyLV and refreshFamilyLV > 0: #触发家族升级事件 isLVUP = True - curPlayer.SetFamilyLV(refreshFamilyLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyLV, refreshFamilyLV) - - __OnFamilyLVBuffChange(curPlayer, tick) #触发家族升级事件, 在SetFamilyLV之后,任务可以取等级判定 if isLVUP: - EventShell.EventResponse_OnFamilyLVUp(curPlayer) + pass + #EventShell.EventResponse_OnFamilyLVUp(curPlayer) - if curPlayer.GetFamilyMemberLV() != refreshPack.GetFamilyMemberLV(): - # 因为仙盟职位没有存DBPlayer,而跨服后又没有Family信息,所以这里做个存储,用于跨服用 - curPlayer.SetReceivedSalary(refreshPack.GetFamilyMemberLV()) - curPlayer.SetFamilyMemberLV(refreshPack.GetFamilyMemberLV()) - #通知周围玩家家族职位刷新 - #curPlayer.Notify_FamilyMemberLVRefresh() - GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer) - - if curPlayer.GetFamilyMoney() != refreshPack.GetFamilyMoney(): - curPlayer.SetFamilyMoney(refreshPack.GetFamilyMoney()) - - if curPlayer.GetFamilyLastWeekActiveValue() != refreshPack.GetLastWeekFamilyActiveValue(): - curPlayer.SetFamilyLastWeekActiveValue(refreshPack.GetLastWeekFamilyActiveValue()) - - if PlayerControl.GetFamilyEmblemID(curPlayer) != refreshPack.GetExtra6(): - PlayerControl.SetFamilyEmblemID(curPlayer, refreshPack.GetExtra6()) - - #---处理特殊逻辑, 进入退出家族--- - if lastFamilyID != 0 and curPlayer.GetFamilyID() == 0: #玩家离开家族 __OnLeaveFamily(curPlayer, tick) - #改变镖车身上记录的主人信息 - PlayerTruck.ChangeTruckNoteInfo(curPlayer) - elif lastFamilyID == 0 and curPlayer.GetFamilyID() != 0: #刚进家族并为族长,触发建家族事件 if curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader: - EventShell.EventResponse_OnCreateFamily(curPlayer) - + pass + #EventShell.EventResponse_OnCreateFamily(curPlayer) + #进入家族触发事件 __OnEnterFamily(curPlayer, tick) - #改变镖车身上记录的主人信息 - PlayerTruck.ChangeTruckNoteInfo(curPlayer) - #---通知客户端刷新属性--- - curPlayer.View_FamilyInfoRefresh() + curPlayer.View_FamilyInfoRefresh() #//04 30 玩家家族名字职位等信息刷新#tagPlayerInFamilyInfoRefresh return -## 进入家族触发事件 -# @param curPlayer 当前玩家 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. def __OnEnterFamily(curPlayer, tick): - EventShell.EventResponse_OnFamily(curPlayer) - __OnFamilyLVBuffChange(curPlayer, tick) + ## 进入家族触发事件 + familyMgr = DBDataMgr.GetFamilyMgr() + familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID()) + Sync_RequestAddFamilyInfo(curPlayer) + #EventShell.EventResponse_OnFamily(curPlayer) __FamilyAffair_CheckReset(curPlayer) PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer) - DelAddFamilyRecord(curPlayer) - GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer) - GameLogic_FamilyBoss.OnEnterFamily(curPlayer) - PlayerFamilyRedPacket.CreatCacheRedPacktet(curPlayer) - PlayerFamilyZhenfa.OnEnterFamily(curPlayer) + #GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer) + #GameLogic_FamilyBoss.OnEnterFamily(curPlayer) + #PlayerFamilyRedPacket.CreatCacheRedPacktet(curPlayer) + #PlayerFamilyZhenfa.OnEnterFamily(curPlayer) return -## 退出家族触发事件 -# @param curPlayer 当前玩家 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. def __OnLeaveFamily(curPlayer, tick): + ## 退出家族触发事件 #---清空家族相关信息--- curPlayer.SetPerExp(0) curPlayer.SetFamilyHornor(0) @@ -186,615 +441,761 @@ PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time())) #触发玩家离开家族的任务 - EventShell.EventResponse_OnLeaveFamily(curPlayer) - - #设置领奖限制 - __SetForbidFamilyAward(curPlayer) + #EventShell.EventResponse_OnLeaveFamily(curPlayer) FBLogic.OnLeaveFamily(curPlayer, tick) - - __OnFamilyLVBuffChange(curPlayer, tick) - #清空仓库积分 - PlayerControl.SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_FamilyStoreScore, 0) - GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer) - PlayerFamilyZhenfa.OnLeaveFamily(curPlayer) return -## 家族等级加持buff变更处理(进、退家族时 及 家族等级变更时) -def __OnFamilyLVBuffChange(curPlayer, tick): +def GetFamilyMemberHasPow(member, powerID): + ## 仙盟成员是否有该权限 + powerDict = IpyGameDataPY.GetFuncEvalCfg("FamilyPower", 1, {}) + if str(powerID) not in powerDict: + return False + needMemberLV = powerDict[str(powerID)] + return member.GetFmLV() >= needMemberLV + +def Sync_FamilyInfo(curPlayer, infoPack=None): + ## // A5 20 玩家家族信息 #tagMCRoleFamilyInfo + familyID = curPlayer.GetFamilyID() + if not familyID: + return + if not infoPack: + infoPack = GetPack_FamilyInfo(familyID) + NetPackCommon.SendFakePack(curPlayer, infoPack) return - # 跨服服务器不处理,防止登录跨服服务器后无战盟导致战力下降 - if GameWorld.IsCrossServer(): + +def GetPack_FamilyInfo(familyID): + familyMgr = DBDataMgr.GetFamilyMgr() + curFamily = familyMgr.FindFamily(familyID) + if not curFamily: return - familyLVBuffSkillTypeID = ReadChConfig.GetEvalChConfig("FamilyLVBuff") - if not familyLVBuffSkillTypeID: - return - - # 先删后加 - playerSkillManager = curPlayer.GetSkillManager() - BuffSkill.DelBuffBySkillID(curPlayer, familyLVBuffSkillTypeID, tick) - playerSkillManager.DeleteSkillBySkillTypeID(familyLVBuffSkillTypeID) - familyLV = curPlayer.GetFamilyLV() - GameWorld.DebugLog("__OnFamilyLVBuffChange familyLV=%s,familyLVBuffSkillTypeID=%s" % (familyLV, familyLVBuffSkillTypeID)) - if familyLV > 0: - curSkill = GameWorld.GetGameData().FindSkillByType(familyLVBuffSkillTypeID , familyLV) - if not curSkill: - return - skillID = curSkill.GetSkillID() - playerSkillManager.LVUPSkillByID(skillID) - SkillCommon.AddBuffBySkillType(curPlayer, familyLVBuffSkillTypeID, tick, familyLV) - - curControl = PlayerControl.PlayerControl(curPlayer) - #curControl.CalcPassiveBuffAttr() - curControl.RefreshPlayerAttrByBuff() + clientPack = ChPyNetSendPack.tagMCRoleFamilyInfo() + clientPack.FamilyID = familyID + clientPack.FamilyName = curFamily.GetName() + clientPack.FamilyLV = curFamily.GetLV() + clientPack.FamilyLVExp = curFamily.GetExp() + clientPack.JoinReview = curFamily.GetJoinReview() + clientPack.JoinLVMin = curFamily.GetJoinLVMin() + clientPack.ServerID = curFamily.GetServerID() + clientPack.EmblemID = curFamily.GetEmblemID() + clientPack.FightPower = curFamily.GetFightPower() + clientPack.FightPowerEx = curFamily.GetFightPowerEx() + clientPack.Broadcast = curFamily.GetBroadcast() + clientPack.BroadcastLen = len(clientPack.Broadcast) + clientPack.LeaderID = curFamily.GetLeaderID() + clientPack.MemberList = [] + for index in xrange(curFamily.GetCount()): + member = curFamily.GetAt(index) + memInfo = ChPyNetSendPack.tagMCRoleFamilyMember() + memInfo.PlayerID = member.GetPlayerID() + memInfo.JoinTime = member.GetJoinTime() + memInfo.Name = member.GetPlayerName() + memInfo.NameLen = len(memInfo.Name) + memInfo.LV = member.GetLV() + memInfo.Job = member.GetJob() + memInfo.RealmLV = member.GetRealmLV() + memInfo.Face = member.GetFace() + memInfo.FacePic = member.GetFacePic() + memInfo.FightPower = member.GetFightPower() + memInfo.FightPowerEx = member.GetFightPowerEx() + memInfo.FmLV = member.GetFmLV() + memInfo.ServerID = member.GetServerID() + memInfo.ContribTotal = member.GetContribTotal() + memInfo.ContribWeek = member.GetContribWeek() + memInfo.OffTime = member.GetOffTime() + clientPack.MemberList.append(memInfo) + clientPack.MemberCount = len(clientPack.MemberList) + return clientPack + +def Broadcast_FamilyChange(familyID, changeType=FamilyChangeType_None, powerID=None, excludeIDList=None): + ## // A5 21 家族变更 #tagMCFamilyChange + # @param excludeIDList: 不广播的成员ID列表 + clientPack = ChPyNetSendPack.tagMCFamilyChange() + clientPack.Type = changeType + Broadcast_FamilyPack(familyID, clientPack, powerID, excludeIDList) return -def GetPlayerChangeFamilyPastHour(curPlayer): - ## 获取玩家家族变更已经经过了多长时间 - curTime = int(time.time()) - changeTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyIDChangeTime) - return (curTime - changeTime) / 3600 +def Broadcast_FamilyPack(familyID, clientPack, powerID=None, excludeIDList=None): + ## 广播家族成员封包 + # @param powerID: 可指定只发给有该权限的成员 + # @param excludeIDList: 不广播的成员ID列表 + if not clientPack: + return + familyMgr = DBDataMgr.GetFamilyMgr() + curFamily = familyMgr.FindFamily(familyID) + if not curFamily: + return + playerManager = GameWorld.GetPlayerManager() + for index in xrange(curFamily.GetCount()): + member = curFamily.GetAt(index) + playerID = member.GetPlayerID() + if excludeIDList and playerID in excludeIDList: + continue + + curPlayer = playerManager.FindPlayerByID(playerID) + if not curPlayer: + continue + + if powerID != None and not GetFamilyMemberHasPow(member, powerID): + continue + + NetPackCommon.SendFakePack(curPlayer, clientPack) + return +def NotifyAllFamilyMemberMsg(familyID, code, paramList=[], excludeIDList=None): + ## 通知所有家族成员信息 + # @param excludeIDList: 不通知的成员ID列表 + familyMgr = DBDataMgr.GetFamilyMgr() + curFamily = familyMgr.FindFamily(familyID) + if not curFamily: + return + playerManager = GameWorld.GetPlayerManager() + for i in xrange(curFamily.GetCount()): + member = curFamily.GetAt(i) + playerID = member.GetPlayerID() + if excludeIDList and playerID in excludeIDList: + continue + curPlayer = playerManager.FindPlayerByID(playerID) + if not curPlayer: + continue + PlayerControl.NotifyCode(curPlayer, code, paramList) + return + +#// A6 01 向玩家申请加入家族 #tagCMRequestJoinFamilyByPlayer # -#////////////////////////////////////////////////////////////// -#//08 04 申请家族战#tagMRequestFamilyWar -#tagMRequestFamilyWar * GettagMRequestFamilyWar(); -# -#class IPY_MRequestFamilyWar +#struct tagCMRequestJoinFamilyByPlayer #{ -#public: -# -# int GetFamilyID(); -# -# char * GetFamilyName(); -# -# int GetVSFamilyID(); -# -# char * GetVSFamilyName(); +# tagHead Head; +# DWORD TagPlayerID; //目标家族玩家ID #}; -## 08 04 申请家族战# -# @param index 玩家索引 -# @param tick 当前时间 -# @return None -# @remarks 函数详细说明. -def GameServer_RequestFamilyWar(index, tick): -#=============================================================================== -# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) -# pack = IPY_GameWorld.IPY_MRequestFamilyWar() -# familyID = pack.GetFamilyID() -# familyName = pack.GetFamilyName() -# vsFamilyID = pack.GetVSFamilyID() -# vsFamilyName = pack.GetVSFamilyName() -# FBLogic.OnRequestFamilyWar(curPlayer, familyID, familyName, vsFamilyID, vsFamilyName, tick) -#=============================================================================== - GameWorld.ErrLog('GameServer_RequestFamilyWar, 此接口废弃') - return -#--------------------------------------------------------------------- -##玩家金钱转换为家族金钱 -# @param playerMoney 玩家金钱 -# @return 家族金钱 -# @remarks 玩家金钱转换为家族金钱 -def GetPlayerMoney_Change_FamilyMoney(playerMoney): - return int(playerMoney * ShareDefine.Def_PlayerMoney_Change_FamilyMoney_Rate) -#--------------------------------------------------------------------- -##玩家活跃度转换为家族活跃度 -# @param activeValue 玩家活跃度 -# @return 家族活跃度 -# @remarks 玩家活跃度转换为家族活跃度 -def GetPlayerActiveValue_Change_ActiveValue(activeValue): - return activeValue - -#--------------------------------------------------------------------- -##累加玩家的家族活跃度 -# @param curPlayer 玩家实例 -# @param addValue 添加的数值 -# @param sendPackGameServer 是否通知GameServer累加家族活跃度 -# @param reason 来源, 原因 -# @return None -# @remarks 累加玩家的家族活跃度 -def AddPlayerFamilyActiveValue(curPlayer, addValue, sendPackGameServer = False, reason = 0, isSysMsg=False): - if addValue <= 0: - #GameWorld.ErrLog("AddPlayerFamilyActiveValue Err = %s"%(addValue)) +def OnRequestJoinFamilyByPlayer(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + tagPlayerID = clientData.TagPlayerID + tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) + if not tagPlayer: + GameWorld.DebugLog("对方不在线! tagPlayerID=%s" % tagPlayerID) return - - curActiveValue = curPlayer.GetFamilyActiveValue() - totalActiveValue = curPlayer.GetLastWeekFamilyActiveValue() - - #---累加玩家家族活跃度--- - if curActiveValue < ChConfig.Def_UpperLimit_DWord: - #累计活跃度 - curPlayer.SetFamilyActiveValue(min(curActiveValue + addValue, ChConfig.Def_UpperLimit_DWord)) - curPlayer.SetLastWeekFamilyActiveValue(min(totalActiveValue + addValue, ChConfig.Def_UpperLimit_DWord)) - - #增加贡献度 - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Family_Contribution, addValue, isSysHint=isSysMsg) - - #流向记录: - DataRecordPack.DR_AddPlayerFamilyActiveValue(curPlayer, addValue, curPlayer.GetFamilyActiveValue(), reason) - - #---通知世界服务器累加家族活跃度--- - #@warning: 刀剑笑项目, 玩家家族活跃度累加同时累加家族活跃度 - # 如果这边没有加上去在外面要处理一次累加家族活跃度 - if not sendPackGameServer: - return True - - #刀剑笑要求, 玩家活跃度累加的同时累加家族活跃度 1活跃=1资金 - SendPack_GameServer_AddFamilyDetailEx(curPlayer, addValue, addValue, resion=reason) - return True - -#--------------------------------------------------------------------- -##通知世界服务器累加家族属性 -# @param curPlayer 玩家实例 -# @param addFamilyHornor 添加家族兽粮 -# @param addFamilyMoney 添加家族资金 -# @param addFamilyActiveValue 增加家族活跃度 -# @return 返回值无意义 -# @remarks 通知世界服务器累加家族属性 -def SendPack_GameServer_AddFamilyDetail(curPlayer, addFamilyHornor = 0, addFamilyMoney = 0, addFamilyActiveValue = 0, resion=0): -# //增加家族荣誉 -# int GetAddFamilyHornor(); -# //增加家族资金 -# int GetAddFamilyMoney(); -# //增加家族活跃度 -# int GetFamilyActiveValue(); -# GameWorld.Log('addFamilyHornor = %s, addFamilyMoney = %s, addFamilyActiveValue = %s'% -# (addFamilyHornor, addFamilyMoney, addFamilyActiveValue)) - - #curPlayer.GameServer_AddFamilyDetail(addFamilyHornor, addFamilyMoney, addFamilyActiveValue) - #改为PY包 - if not curPlayer.GetFamilyID(): + tagFamilyID = tagPlayer.GetFamilyID() + if tagFamilyID <= 0: + GameWorld.DebugLog("对方没有家族! tagPlayerID=%s" % tagPlayerID) return - sendPack = ChMapToGamePyPack.tagMGAddFamilyDetail() - sendPack.PlayerID = curPlayer.GetPlayerID() - sendPack.AddFamilyHornor = addFamilyHornor - sendPack.AddFamilyMoney = addFamilyMoney - sendPack.FamilyActiveValue = addFamilyActiveValue - sendPack.AddResion = resion - NetPackCommon.SendPyPackToGameServer(sendPack) - GameWorld.DebugLog("AddFamilyDetail addFamilyHornor=%s,addFamilyMoney=%s,addFamilyActiveValue=%s, resion=%s" - % (addFamilyHornor, addFamilyMoney, addFamilyActiveValue, resion), curPlayer.GetPlayerID()) - return -#--------------------------------------------------------------------- -##通知世界服务器累加家族属性 -# @param curPlayer 玩家实例 -# @param addFamilyActiveValue 增加玩家家族活跃度 -# @param addFamilyHornor 添加家族荣誉 -# @param addFamilyMoney 添加家族资金 -# @return 返回值无意义 -# @remarks 通知世界服务器累加家族属性 -def SendPack_GameServer_AddFamilyDetailEx(curPlayer, addPlayerActiveValue, addFamilyMoney = 0, addFamilyHornor = 0, resion=0): - - #刀剑笑增加玩家活跃度默认新增家族活跃度 - addFamilyActiveValue = GetPlayerActiveValue_Change_ActiveValue(addPlayerActiveValue) - - SendPack_GameServer_AddFamilyDetail(curPlayer, addFamilyHornor, addFamilyMoney, addFamilyActiveValue, resion) - - return -#--------------------------------------------------------------------- -##通知GameServer, 客户端开始创建家族 -# @param curPlayer 玩家实例 -# @return 返回值无意义 -# @remarks 通知GameServer, 客户端开始创建家族 -def SendPack_GameServer_InputFamilyName(curPlayer): - #通知GameServer设置查看状态, 防外挂 - curPlayer.GameServer_SetPlayerViewFamilyState(ShareDefine.TViewFamilyType_CreateFamily) - #通知客户端打开输入家族名界面 - curPlayer.Frm_InputFamilyName() + RequestJoinTagFamily(curPlayer, tagFamilyID) return -##通知GameServer, 客户端开始浏览家族信息 -# @param curPlayer 玩家实例 -# @return 返回值无意义 -# @remarks 通知GameServer, 客户端开始浏览家族信息 -def SendPack_GameServer_ViewAllFamily(curPlayer): - #通知GameServer设置查看状态, 防外挂 - curPlayer.GameServer_SetPlayerViewFamilyState(ShareDefine.TViewFamilyType_FamilyWar) - #通知GameServer给客户端家族信息 - curPlayer.GameServer_ViewAllFamily() - return - -##通知GameServer, 清除客户端浏览家族状态 -# @param curPlayer 玩家实例 -# @return 返回值无意义 -# @remarks 通知GameServer, 通知GameServer, 清除客户端浏览家族状态 -def SendPack_GameServer_ClearViewFamilyState(curPlayer): - #MapServer告诉GameServer自己是否在创建家族状态 - #因为家族封包是在GameServer处理的, 防止被骗 - if curPlayer.GetViewFamilyState() in [ShareDefine.TViewFamilyType_None, - ShareDefine.TViewFamilyType_CreateFamily]: - #TViewFamilyType_CreateFamily状态在GameServer DoCreateFamily结束后解除 - return - - curPlayer.GameServer_SetPlayerViewFamilyState(ShareDefine.TViewFamilyType_None) - return - -def __SetForbidFamilyAward(curPlayer): - ''' 设置家族相关活动领奖限制 - 如果退出时今日已开始过对应活动,则设置领奖限制 - ''' - - playerID = curPlayer.GetPlayerID() - openState = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_FamilyActivityDayState) - forbidState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ForbidFamilyAward) - GameWorld.DebugLog("退出家族处理家族活动奖励领取限制! openState=%s,forbidState=%s" % (openState, forbidState), playerID) - - updForbidState = forbidState - for activityType in ShareDefine.Def_FamActivityList: - - if not openState&pow(2, activityType): - GameWorld.DebugLog(" 该家族活动今日未开启过! 不设置限制领奖! activityType=%s" % activityType, playerID) - continue - updForbidState = updForbidState|pow(2, activityType) - GameWorld.DebugLog(" 家族活动领奖限制 activityType=%s,updForbidState=%s" % (activityType, updForbidState), playerID) - - if updForbidState != forbidState: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ForbidFamilyAward, updForbidState) - GameWorld.DebugLog(" 更新家族活动领奖限制: forbidState=%s,updForbidState=%s" % (forbidState, updForbidState), playerID) - - return - -## 设置玩家是否可以参加家族活动 -# @param curPlayer 玩家实例 -# @param isForbid 是否限制 -# @return 返回值无意义 -def SetForbidFamilyAction(curPlayer, isForbid): - #=============================================================================================== - # if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ForbidFamilyAction) != isForbid: - # PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ForbidFamilyAction, isForbid) - # - # # 通知玩家是否可以参加家族活动 - # SendClientForbidFamilyAction(curPlayer) - #=============================================================================================== - return - - -## 通知玩家是否可以参加家族活动 -# @param curPlayer 玩家实例 -# @return 返回值无意义 -def SendClientForbidFamilyAction(curPlayer): -# isForbid = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ForbidFamilyAction) -# -# outCardsCDTime = ChPyNetSendPack.tagPyFamilyActionForbid() -# outCardsCDTime.Clear() -# -# outCardsCDTime.IsForbid = isForbid -# NetPackCommon.SendFakePack(curPlayer, outCardsCDTime) - return - - -#=============================================================================== -# //A6 01 向玩家申请加入家族 #tagCGRequestJoinFamilyByPlayer -# -# struct tagCGRequestJoinFamilyByPlayer -# -# { +#// A6 02 申请加入家族#tagCMRequesJoinFamily +# +#struct tagCMRequesJoinFamily +#{ # tagHead Head; -# DWORD AddPlayerID; //申请加入的玩家ID -# }; -#=============================================================================== -## 通过申请加入家族 -# @param index: 玩家索引 -# @param clientData: 封包结构体 -# @param tick: 时间戳 -# @return: None -def RequestAddFamilyByID(index, clientData, tick): +# BYTE Type; //申请类型,0-申请;1-撤销 +# DWORD TagFamilyID; //目标家族ID,申请时为0代表一键申请家族任意家族 +#}; +def OnRequesJoinFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - addPlayerID = clientData.AddPlayerID #申请进入的家族ID - - addPlayer = GameWorld.GetPlayerManager().FindPlayerByID(addPlayerID) - #对方下线 - if not addPlayer: - return - - addFamilyID = addPlayer.GetFamilyID() - #对方没有家族 - if addFamilyID <= 0: - return - - #申请加入 - AddFamily(curPlayer, addFamilyID) - - #通知当前申请加入的哪些家族 - #Sync_RequestAddFamilyInfo(curPlayer) - return - - -#=============================================================================== -# //A6 02 申请加入家族#tagCGRequesJoinFamily -# -# struct tagCGRequesJoinFamily -# -# { -# tagHead Head; -# BYTE Type; //申请类型 -# DWORD AddFamilyID; //申请加入的家族 -# }; -#=============================================================================== -## 申请加入家族 -# @param index: 玩家索引 -# @param clientData: 封包结构体 -# @param tick: 时间戳 -# @return: None -def RequestAddFamily(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - - addFamilyID = clientData.AddFamilyID # 申请进入的家族ID + tagFamilyID = clientData.TagFamilyID # 申请进入的家族ID requestType = clientData.Type # 申请类型(申请/撤销) - - if requestType == 0: - #申请加入 - AddFamily(curPlayer, addFamilyID) - - elif requestType == 1: - DelAddFamilyRecord() - - #通知当前申请加入的哪些家族 - Sync_RequestAddFamilyInfo(curPlayer) + # 申请加入 + if requestType == 0: + if not tagFamilyID: + AutoJoinFamily(curPlayer) + else: + RequestJoinTagFamily(curPlayer, tagFamilyID) + + # 撤销申请 + elif requestType == 1: + CancelJoinTagFamily(curPlayer, tagFamilyID) + return -def DelAddFamilyRecord(curPlayer): - for index in range(0, ChConfig.Def_Player_RequestAddFamilyMaxCnt): - - #申请加入的家族ID - requestAddFamilyID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyID%index) - if not requestAddFamilyID: - continue - #本版本因为客户端没有单个取消申请的操作,此处发一次包一次性全部取消 -# if addFamilyID != requestAddFamilyID: -# continue - - #申请数量-1 - requestAddFamilyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyCnt) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RequestAddFamilyCnt, requestAddFamilyCnt - 1) - - #清除撤销申请的家族ID记录 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RequestAddFamilyID%index, 0) - - #向GameServer发送请求删除该玩家的申请家族信息情况 - sendMsg = str(requestAddFamilyID) - curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_DelFamilyAction, - ShareDefine.Def_ActionType_FamilyAdd, '', sendMsg, len(sendMsg)) +def AutoJoinFamily(curPlayer): + if curPlayer.GetFamilyID(): + return + playerID = curPlayer.GetPlayerID() + playerLV = curPlayer.GetLV() + GameWorld.DebugLog("玩家一键自动加入家族! playerLV=%s" % playerLV, playerID) + familyMgr = DBDataMgr.GetFamilyMgr() + indexList = range(familyMgr.GetCount()) + random.shuffle(indexList) #打乱顺序 + for index in indexList: + family = familyMgr.GetAt(index) + if not family: + continue + familyID = family.GetID() + lvMin = family.GetJoinLVMin() + if lvMin and playerLV < lvMin: + GameWorld.DebugLog(" 等级不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID) + continue + if family.GetJoinReview(): + GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID) + continue + MemberMax = GetFamilySetting(family.GetLV(), "MemberMax") + if family.GetCount() >= MemberMax: + GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID) + continue + + #直接加入 + DoPlayerJionFamily(family, playerID, curPlayer) + return + + # 可再扩展自动请求,暂时不处理 + GameWorld.DebugLog("没有可自动进入的仙盟!") + return + +def GetFamilySetting(familyLV, fieldName): + ## 获取仙盟等级表对应字段值 + if not fieldName: + return 0 + ipyData = IpyGameDataPY.GetIpyGameData("Family", familyLV) + if not ipyData: + return 0 + attrName = "Get%s" % fieldName + if not hasattr(ipyData, attrName): + return 0 + return getattr(ipyData, attrName)() + +def RequestJoinTagFamily(curPlayer, familyID): + ## 申请加入 + playerID = curPlayer.GetPlayerID() + if curPlayer.GetFamilyID(): + GameWorld.DebugLog('已经有仙盟不能再申请加入! familyID=%s' % curPlayer.GetFamilyID(), playerID) + return + familyMgr = DBDataMgr.GetFamilyMgr() + reqFamilyIDList = familyMgr.GetPlayerReqJoinFamilyIDList(playerID) + if playerID in reqFamilyIDList: + GameWorld.DebugLog('已经在申请加入仙盟列表中! familyID=%s' % familyID, playerID) + return + + maxReqFamilyCnt = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 2) + if len(reqFamilyIDList) >= maxReqFamilyCnt: + GameWorld.DebugLog('已经达到最大申请加入仙盟数! %s, %s' % (len(reqFamilyIDList), reqFamilyIDList), playerID) + return + + tagFamily = familyMgr.FindFamily(familyID) + if not tagFamily: + return + + lvMin = tagFamily.GetJoinLVMin() + if curPlayer.GetLV() < lvMin: + GameWorld.DebugLog('等级未达到该仙盟加入最低等级限制! lv=%s < %s' % (curPlayer.GetLV(), lvMin), playerID) + return + + # 需要审核,满员后端不限制申请,由前端自行决定是否可申请 + if tagFamily.GetJoinReview(): + reqPlayerIDDict = tagFamily.GetReqJoinPlayerInfo() + if playerID not in reqPlayerIDDict: + maxReqPlayerCnt = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 1) + if len(reqPlayerIDDict) >= maxReqPlayerCnt: + GameWorld.DebugLog('目标仙盟申请加入数已满! %s, %s' % (len(reqFamilyIDList), reqFamilyIDList), playerID) + PlayerControl.NotifyCode(curPlayer, "jiazu_pan_141056") + return + + tagFamily.AddReqJoinPlayerID(playerID) + # 广播给有招人权限的 + Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) + + #jiazu_pan_500807:申请入帮成功!请等待帮会管理人员审批! + PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807") + Sync_RequestAddFamilyInfo(curPlayer) + return + + # 不需要审核,自动加入 + memberMax = GetFamilySetting(tagFamily.GetLV(), "MemberMax") + if tagFamily.GetCount() >= memberMax: + GameWorld.DebugLog('目标仙盟成员已满! familyLV=%s,memberMax=%s' % (tagFamily.GetLV(), memberMax), playerID) + return + + DoPlayerJionFamily(tagFamily, playerID, curPlayer) + return + +def CancelJoinTagFamily(curPlayer, familyID): + # 撤销申请 + familyMgr = DBDataMgr.GetFamilyMgr() + playerID = curPlayer.GetPlayerID() + tagFamily = familyMgr.FindFamily(familyID) + if tagFamily: + tagFamily.DelReqJoinPlayerID(playerID) + familyMgr.DelPlayerReqJoinFamilyID(playerID, familyID) + Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) Sync_RequestAddFamilyInfo(curPlayer) return -## 通知当前申请加入的哪些家族 -# @param curPlayer:玩家实例 -# @return: None -def Sync_RequestAddFamilyInfo(curPlayer): - requestAddFamilyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyCnt) +def Sync_RequestAddFamilyInfo(curPlayer, isForce=True): + ## 通知当前申请加入的哪些家族 + playerID = curPlayer.GetPlayerID() + familyMgr = DBDataMgr.GetFamilyMgr() + reqFamilyIDList = familyMgr.GetPlayerReqJoinFamilyIDList(playerID) + # 非强制通知时没有申请记录的可不通知,如登录 + if not isForce and not reqFamilyIDList: + return + clientPack = ChPyNetSendPack.tagMCNotifyRequestJoinFamilyInfo() + clientPack.Clear() + clientPack.RequestJoinFamilyIDList = reqFamilyIDList + clientPack.RequestCount = len(clientPack.RequestJoinFamilyIDList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def GetPack_FamilyReqJoinInfo(familyID): + ## 获取 // A5 22 家族申请加入的玩家信息 #tagMCFamilyReqJoinInfo + familyMgr = DBDataMgr.GetFamilyMgr() + curFamily = familyMgr.FindFamily(familyID) + if not curFamily: + return + reqPlayerIDDict = curFamily.GetReqJoinPlayerInfo() - packList = [] - for index in range(0, ChConfig.Def_Player_RequestAddFamilyMaxCnt): - familyID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyID%index) - if familyID == 0: + playerManager = GameWorld.GetPlayerManager() + clientPack = ChPyNetSendPack.tagMCFamilyReqJoinInfo() + clientPack.ReqJoinList = [] + for playerID, reqTime in reqPlayerIDDict.items(): + curPlayer = playerManager.FindPlayerByID(playerID) + reqInfo = ChPyNetSendPack.tagMCFamilyReqJoinPlayer() + reqInfo.PlayerID = playerID + reqInfo.ReqTime = reqTime + if curPlayer: + reqInfo.IsOnLine = True + viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(playerID) + if viewCache: + reqInfo.Name = viewCache.GetPlayerName() + reqInfo.NameLen = len(reqInfo.Name) + reqInfo.LV = viewCache.GetLV() + reqInfo.Job = viewCache.GetJob() + reqInfo.RealmLV = viewCache.GetRealmLV() + reqInfo.Face = viewCache.GetFace() + reqInfo.FacePic = viewCache.GetFacePic() + reqInfo.FightPower = viewCache.GetFightPower() + reqInfo.FightPowerEx = viewCache.GetFightPowerEx() + reqInfo.ServerID = viewCache.GetServerID() + clientPack.ReqJoinList.append(reqInfo) + if len(clientPack.ReqJoinList) >= 100: + break + clientPack.ReqCnt = len(clientPack.ReqJoinList) + return clientPack + +#// A6 21 审核请求加入家族 #tagCMJoinFamilyReply +# +#struct tagCMJoinFamilyReply +#{ +# tagHead Head; +# DWORD TagPlayerID; //被审核玩家ID 0则代表全部 +# BYTE IsOK; //是否同意其加入 +#}; +def OnJoinFamilyReply(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + tagPlayerID = clientData.TagPlayerID + isOK = clientData.IsOK + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if familyID <= 0: + return + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): + #GameWorld.DebugLog("没有招人权限,无法审核人员入盟!", playerID) + PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Popedom") + return + + GameWorld.DebugLog("审核入盟申请: tagPlayerID=%s,familyID=%s,isOK=%s" % (tagPlayerID, familyID, isOK), playerID) + reqPlayerIDDict = family.GetReqJoinPlayerInfo() + tagPlayerIDList = reqPlayerIDDict.keys() + if tagPlayerID: + if tagPlayerID not in reqPlayerIDDict: + GameWorld.DebugLog("不存在该申请人员! tagPlayerID=%s" % tagPlayerID) + return + tagPlayerIDList = [tagPlayerID] + + if not tagPlayerIDList: + GameWorld.DebugLog("没有申请人员!") + return + + playerManager = GameWorld.GetPlayerManager() + # 拒绝 + if not isOK: + for tagPlayerID in tagPlayerIDList: + family.DelReqJoinPlayerID(tagPlayerID) + tagPlayer = playerManager.FindPlayerByID(tagPlayerID) + if not tagPlayer: + continue + Sync_RequestAddFamilyInfo(tagPlayer) + #jiazu_pan_592934:{%S}拒绝了您的入帮申请 + PlayerControl.NotifyCode(tagPlayer, "jiazu_pan_592934", [family.GetName()]) + Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) + return + + # 处理同意 + offlinePlayerCanJoin = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 3) + MemberMax = GetFamilySetting(family.GetLV(), "MemberMax") + joinOKPlayerIDList = [] + for tagPlayerID in tagPlayerIDList: + if family.GetCount() >= MemberMax: + PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_202580") + break + tagPlayer = playerManager.FindPlayerByID(tagPlayerID) + #申请目标不在线 + if not tagPlayer: + if not offlinePlayerCanJoin: + GameWorld.DebugLog("离线玩家无法加入仙盟! tagPlayerID=%s" % tagPlayerID, playerID) + PlayerControl.NotifyCode(curPlayer, "jiazu_hwj35_367906") + continue + + if family.FindMember(tagPlayerID): + GameWorld.DebugLog("已经是本盟成员! tagPlayerID=%s" % tagPlayerID, playerID) + PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat") continue - requestAddFamilyInfo = ChPyNetSendPack.tagRequestJoinFamily() - requestAddFamilyInfo.RequestFamilyID = familyID - packList.append(requestAddFamilyInfo) - - requestAddFamily = ChPyNetSendPack.tagMCNotifyRequestJoinFamilyInfo() - requestAddFamily.Clear() - requestAddFamily.RequestCount = len(packList) - requestAddFamily.RequestAddFamilyInfo = packList - - NetPackCommon.SendFakePack(curPlayer, requestAddFamily) + tagFamilyID = familyMgr.GetPlayerFamilyID(tagPlayerID) + if tagFamilyID: + GameWorld.DebugLog("已经加入其他仙盟! tagPlayerID=%s,tagFamilyID=%s" % (tagPlayerID, tagFamilyID), playerID) + PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat") + continue + + DoPlayerJionFamily(family, tagPlayerID, tagPlayer, broadcastFamilyChange=False) + joinOKPlayerIDList.append(tagPlayerID) + + if not joinOKPlayerIDList: + return + Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=joinOKPlayerIDList) + Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) return - -## 申请加入帮会 -#@param curPlayer 家族实例 -#@param familyID 家族ID -#@return 返回值无意义 -def AddFamily(curPlayer, familyID): +#// A6 22 修改收人方式 #tagCMChangeFamilyJoin +# +#struct tagCMChangeFamilyJoin +#{ +# tagHead Head; +# BYTE JoinReview; //成员加入是否需要审核,默认0自动加入 +# WORD JoinLVMin; //限制最低可加入的玩家等级 +#}; +def OnChangeFamilyJoin(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + joinReview = clientData.JoinReview + joinLVMin = clientData.JoinLVMin - requestAddFamilyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyCnt) - if requestAddFamilyCnt >= ChConfig.Def_Player_RequestAddFamilyMaxCnt: - # jiazu_pan_21675 改为 jiazu_lhs_31379 最多同时向%s个帮会发出申请 - PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_31379", [ChConfig.Def_Player_RequestAddFamilyMaxCnt]) + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if familyID <= 0: return - - #是否已经申请了 - for index in range(0, ChConfig.Def_Player_RequestAddFamilyMaxCnt): - if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyID%index) == familyID: - GameWorld.DebugLog('已经在申请列表中') - #已经在申请列表中 + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): + GameWorld.DebugLog("没有招人权限", playerID) + return + GameWorld.DebugLog("修改招人设置: familyID=%s,joinReview=%s,joinLVMin=%s" % (familyID, joinReview, joinLVMin), playerID) + family.SetJoinReview(joinReview) + family.SetJoinLVMin(joinLVMin) + Sync_FamilyInfo(curPlayer) + Broadcast_FamilyChange(familyID, FamilyChangeType_JoinSet, FamilyPowerID_Call, excludeIDList=[playerID]) + return + +#// A6 23 修改家族公告 #tagCMChangeFamilyBroadcast +# +#struct tagCMChangeFamilyBroadcast +#{ +# tagHead Head; +# char Msg[200]; +#}; +def OnChangeFamilyBroadcast(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + broadcast = clientData.Msg + + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if familyID <= 0: + return + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Broadcast): + GameWorld.DebugLog("没有修改公告权限", playerID) + return + family.SetBroadcast(broadcast) + GameWorld.DebugLog('更改仙盟公告: Family=%s,公告=%s' % (GameWorld.CodeToGbk(family.GetName()), GameWorld.CodeToGbk(broadcast)), playerID) + Sync_FamilyInfo(curPlayer) + Broadcast_FamilyChange(familyID, FamilyChangeType_Broadcast, excludeIDList=[playerID]) + return + +#// A6 24 修改家族徽章 #tagCMChangeFamilyEmblem +# +#struct tagCMChangeFamilyEmblem +#{ +# tagHead Head; +# BYTE EmblemID; // 更换的徽章ID +#}; +def OnChangeFamilyEmblem(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + changeEmblemID = clientData.EmblemID + PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID) + return + +#// A6 25 修改家族成员职位 #tagCMChangeFamilyMemLV +# +#struct tagCMChangeFamilyMemLV +#{ +# tagHead Head; +# DWORD PlayerID; // 目标成员ID +# BYTE FmLV; // 变更为xx职位 +#}; +def OnChangeFamilyMemLV(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + OnChangeFamilyMemberLV(curPlayer, clientData.PlayerID, clientData.FmLV) + return + +def OnChangeFamilyMemberLV(curPlayer, tagID, changeFmlv, isGMOP=False): + '''变更成员职位 + @param curPlayer: 操作的玩家 + @param tagID: 目标成员ID + @param changeFmlv: 修改为xx职位 + @param isGMOP: 是否是GM后台发起的,如果是GM发起的,一般curPlayer传入的为目标成员ID实例 + ''' + if not curPlayer: + return + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if familyID <= 0: + return + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + if changeFmlv < 0 or changeFmlv > IPY_PlayerDefine.fmlLeader: + GameWorld.DebugLog("不存在该职位等级! changeFmlv=%s" % changeFmlv) + return + # 非GM操作的需检查权限 + if not isGMOP: + if not GetFamilyMemberHasPow(curMember, FamilyPowerID_ChangeFmlv): return - - #请求记录申请进入家族信息 - sendMsg = cPickle.dumps([familyID, PlayerControl.GetFightPower(curPlayer)], 2) - curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_AddFamilyAction, - ShareDefine.Def_ActionType_FamilyAdd, '', sendMsg, len(sendMsg)) - - #等GameServer反馈结果再处理 - return - - #记录个人申请加入的家族ID - for index in range(0, ChConfig.Def_Player_RequestAddFamilyMaxCnt): - if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RequestAddFamilyID%index) == 0: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RequestAddFamilyID%index, familyID) - break + if playerID == tagID: + GameWorld.DebugLog("不能任免自己的家族职位", playerID) + return - #记录个人申请加入家族的个数 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RequestAddFamilyCnt, requestAddFamilyCnt + 1) + tagMember = family.FindMember(tagID) + if tagMember == None: + GameWorld.DebugLog("更改家族成员职位时目标成员不存在! tagID=%s" % tagID, playerID) + return - return - - - - - -## 战盟玩家OnDay -# @param curPlayer -# @return None -def FamilyPlayerOnDay(curPlayer): - if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): - return - #每日福利奖励 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyDayAward, 0) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyMoneyDonateCount, 0) - Sync_FamilyDayRewardState(curPlayer) - __FamilyAffair_Refresh(curPlayer, True) - - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 0) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 0) - Sync_ZhenbaogeInfo(curPlayer) - return - - -## 战盟玩家OnLogin -# @param curPlayer -# @return None -def FamilyPlayerOnLogin(curPlayer, tick): - if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): - return - - PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer) - SyncFamilyActivityInfo(curPlayer) - Sync_FamilyDayRewardState(curPlayer) - __FamilyAffair_CheckReset(curPlayer) - PlayerFamilyZhenfa.OnPlayerLogin(curPlayer) - Sync_ZhenbaogeInfo(curPlayer) - return - -def FamilyPlayerOnLoginCross(curPlayer): - ## 登录跨服服务器 - crossFamilyMemberLV = curPlayer.GetReceivedSalary() - if crossFamilyMemberLV: - curPlayer.SetFamilyMemberLV(crossFamilyMemberLV) - GameWorld.DebugLog("跨服登录设置仙盟职位等级: %s" % crossFamilyMemberLV, curPlayer.GetPlayerID()) + if not isGMOP: + if curMember.GetFmLV() != IPY_PlayerDefine.fmlLeader: + if changeFmlv >= curMember.GetFmLV(): + GameWorld.DebugLog("修改的职位不能比自己高或平级! changeFmlv=%s" % changeFmlv, playerID) + return + if tagMember.GetFmLV() >= curMember.GetFmLV(): + GameWorld.DebugLog("修改的目标成员职位不能比自己高或平级! tagFmlv=%s" % tagMember.GetFmLV(), playerID) + return + + if changeFmlv == IPY_PlayerDefine.fmlLeader: + changeType = FamilyChangeType_LeaderChange + ChangeFamilyLeader(family, tagMember) - return + else: + fmLVMemCnt = 0 + for index in range(family.GetCount()): + familyMember = family.GetAt(index) + if familyMember.GetFmLV() != changeFmlv: + continue + fmLVMemCnt += 1 + + maxCnt = GetFamilySetting(family.GetLV(), Def_FmlSetAttrName.get(changeFmlv, "")) + if fmLVMemCnt >= maxCnt: + # jiazu_hwj35_272921 改为 jiazu_chenxin_31379 + PlayerControl.NotifyCode(curPlayer, "jiazu_chenxin_31379") + GameWorld.DebugLog("目前该职位的人数已经达到上限! changeFmlv=%s,fmLVMemCnt=%s >= %s" % (changeFmlv, fmLVMemCnt, maxCnt)) + return + changeType = FamilyChangeType_MemFmlvChange + ChangeFamilyMemberLv(tagMember, changeFmlv) + + if isGMOP: + family.SetBroadcast("") + Sync_FamilyInfo(curPlayer) + Broadcast_FamilyChange(familyID, changeType, excludeIDList=[playerID, tagID]) + return True - - - -## 通知GameServer增加家族相关信息值 -# @param curPlayer 玩家实例 -# @param infoDict 信息字典 -# @return -def Send_GameServer_PyAddFamilyInfoValue(curPlayer, infoDict={}): - if not isinstance(infoDict, dict) or not infoDict: - GameWorld.DebugLog("Send_GameServer_PyAddFamilyInfoValue infoDict=%s err!" % str(infoDict)) +def ChangeFamilyLeader(family, newLeaderMem): + ## 变更家族族长 + + familyID = family.GetID() + befLeaderID = family.GetLeaderID() + newLeaderID = newLeaderMem.GetPlayerID() + if befLeaderID == newLeaderID: return - sendMsg = '%s'%(infoDict) - #GameWorld.DebugLog("Send_GameServer_PyAddFamilyInfoValue sendMsg=%s" % sendMsg) - GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'PyAddFamilyInfoValue', sendMsg, len(sendMsg)) + befLeaderMem = family.FindMember(befLeaderID) + if befLeaderMem: + #把原族长降为普通成员 + ChangeFamilyMemberLv(befLeaderMem, IPY_PlayerDefine.fmlMember) + + family.SetLeaderID(newLeaderID) + ChangeFamilyMemberLv(newLeaderMem, IPY_PlayerDefine.fmlLeader) + GameWorld.Log("家族设置新族长! familyID=%s,newLeaderID=%s,befLeaderID=%s" % (familyID, newLeaderID, befLeaderID)) return -#--------------------------------------------------------------------- - - - -## 添加家族事件记录 -def AddFamilyEventNote(curPlayer, eventType, valueList): - ##同步记录到GameServer, eventType默认为value1 - sendMsg = cPickle.dumps([eventType] + valueList, 2) - curPlayer.GameServer_QueryPlayerByID(ChConfig.queryType_AddFamilyAction, ShareDefine.Def_ActionType_FamilyEvent, '', sendMsg, len(sendMsg)) - GameWorld.DebugLog("AddFamilyEventNote sendMsg=%s" % sendMsg) - return - - -## --------------------------------- 仙盟活跃 ----------------------------------- -def OnWeekEx(curPlayer): - #重置 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityAwardRecord, 0) - for actionid in ShareDefine.FamilyActiveIDList: - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0) +def ChangeFamilyMemberLv(tagMember, changeFamilyLV): + ## 修改成员职位,只做修改逻辑,不做验证,验证由各调用入口自行验证 + familyID = tagMember.GetFamilyID() + tagID = tagMember.GetPlayerID() + memName = tagMember.GetPlayerName() + befFamilyLV = tagMember.GetFmLV() - SyncFamilyActivityInfo(curPlayer) + tagMember.SetFmLV(changeFamilyLV) + + tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagID) + if tagPlayer: + MapServer_FamilyRefresh(tagPlayer, familyID) + Sync_FamilyInfo(tagPlayer) + if GetFamilyMemberHasPow(tagMember, FamilyPowerID_Call): + NetPackCommon.SendFakePack(tagPlayer, GetPack_FamilyReqJoinInfo(familyID)) + + # 记录家族事件记录信息 + tick = GameWorld.GetGameWorld().GetTick() + AddFamilyActionNote(memName, familyID, ShareDefine.Def_ActionType_FamilyEvent, + [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_FMLV, changeFamilyLV, befFamilyLV], tick) + + #xx被任命为xx + NotifyAllFamilyMemberMsg(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV]) + #GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # 成员职位变更 return -## 领取仙盟活跃度奖励 -# @param curPlayer -# @param awardIndex -# @return None -def GetFamilyActivityAward(curPlayer, awardIndex): +#// A6 26 请求家族成员列表 #tagCMGetFamilyInfo +# +#struct tagCMGetFamilyInfo +#{ +# tagHead Head; +#}; +def OnGetFamilyInfo(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + Sync_FamilyInfo(curPlayer) return - familyActiveList = IpyGameDataPY.GetFuncEvalCfg('FamilyActive') - familyActiveAwardList = IpyGameDataPY.GetFuncEvalCfg('FamilyActive', 2) - if awardIndex < 0 or awardIndex >= len(familyActiveList): - GameWorld.ErrLog("活跃度奖励索引不合法,index=%s,Len=%s" % (awardIndex, len(familyActiveList))) + +#// A6 03 离开家族 #tagCMLeaveFamily +# +#struct tagCMLeaveFamily +#{ +# tagHead Head; +#}; +def OnLeaveFamily(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if familyID <= 0: + return + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: return - # 判断是否已领取 - getAwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyActivityAwardRecord, 0) - if getAwardRecord & pow(2, awardIndex): - GameWorld.Log("已经领取过该活跃度奖励,index=%s" % (awardIndex)) + familyLV = curMember.GetFmLV() # 职位 + if family.GetCount() > 1 and familyLV == IPY_PlayerDefine.fmlLeader: + GameWorld.DebugLog("族长在成员人数大于1时不能直接退出家族", playerID) return + # 功能限制退出仙盟 + # ... - needActivity = familyActiveList[awardIndex] - totalActivity = __GetTotalFamilyActivity(curPlayer)#总活跃度 + # 进出时间限制暂不做,等正式功能再补 + #PlayerControl.SetLeaveFamilyTime(curPlayer, updTime) - # 判断活跃度 - if totalActivity < needActivity: - GameWorld.Log("领奖活跃度不足,index=%s,needActivity=%s,totalActivity=%s" - % (awardIndex, needActivity, totalActivity)) + # 执行退出 + GameWorld.DebugLog("离开家族! familyID=%s" % familyID, playerID) + + family.DeleteMember(playerID) + AddFamilyActionNote(curPlayer.GetName(), familyID, ShareDefine.Def_ActionType_FamilyEvent, + [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Leave], tick) + + #XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n> 25 - - + NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()]) + + MapServer_FamilyRefresh(curPlayer, 0) + + if family.GetCount() == 0: + #玩家离开后, 家族没有人了 , 删除这个家族 + familyMgr.DelFamily(familyID) return - - activityValue = familyActiveAwardList[awardIndex] - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, activityValue) - - # 更新已领取成功标记 - updAwardRecord = getAwardRecord | (1 << awardIndex) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityAwardRecord, updAwardRecord) - - SyncFamilyActivityInfo(curPlayer) - GameWorld.DebugLog("领取仙盟活跃度奖励OK! index=%s,needActivity=%s,totalActivity=%s,awardRecord=%s" - % (awardIndex, needActivity, totalActivity, updAwardRecord)) + Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave) return -def AddFamilyActivity(curPlayer, actionid, addCnt=1): - return - ipyData = IpyGameDataPY.GetIpyGameData('FamilyActivity', actionid) - if not ipyData: +#// A6 05 删除家族成员 #tagCMDeleteFamilyMember +# +#struct tagCMDeleteFamilyMember +#{ +# tagHead Head; +# DWORD MemberID; +#}; +def OnDeleteFamilyMember(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + tagMemberID = clientData.MemberID + + playerID = curPlayer.GetPlayerID() + if playerID == tagMemberID: return - if not GameFuncComm.GetFuncCanUse(curPlayer, ipyData.GetUnLockFuncID()): + + familyID = curPlayer.GetFamilyID() + if familyID <= 0: return - finishCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0) - maxCnt = ipyData.GetTotalActivityTime() - if finishCnt >= maxCnt: + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: return - newCnt = min(maxCnt, finishCnt+addCnt) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, newCnt) - SyncFamilyActivityInfo(curPlayer, actionid) - GameWorld.DebugLog(' 仙盟活跃完成次数 actionid=%s,newCnt=%s'%(actionid, newCnt)) + curMember = family.FindMember(playerID) + if not curMember: + return + + if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Kick): + GameWorld.DebugLog("没有踢人权限!") + return + + tagMember = family.FindMember(tagMemberID) + if not tagMember: + return + + curFmlv = curMember.GetFmLV() + tagFmlv = tagMember.GetFmLV() + if tagFmlv >= curFmlv: + GameWorld.DebugLog("只能踢比自己职位低的成员! tagMemberID=%s,tagFmlv(%s) >= curFmlv(%s)" % (tagMemberID, tagFmlv, curFmlv), playerID) + return + + # 功能限制踢人 + # ... + + tagPlayerName = tagMember.GetPlayerName() # 被踢玩家名 + tagPlayerID = tagMember.GetPlayerID() # 被踢玩家ID + + family.DeleteMember(tagPlayerID) + + AddFamilyActionNote(tagPlayerName, familyID, ShareDefine.Def_ActionType_FamilyEvent, + [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_KickOut], tick) + + #XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n> 25 - - + NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [tagPlayerName]) + + #删除玩家 + tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagMemberID) + if tagPlayer: + MapServer_FamilyRefresh(tagPlayer, 0) + + Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave) return -def __GetTotalFamilyActivity(curPlayer): - ##获取总仙盟活跃度 - totalPoint = 0 - ipyDataMgr = IpyGameDataPY.IPY_Data() - for i in xrange(ipyDataMgr.GetFamilyActivityCount()): - ipyData = ipyDataMgr.GetFamilyActivityByIndex(i) - actionid = ipyData.GetID() - curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0) - totalPoint += curTimes/ipyData.GetSingleTimes()*ipyData.GetSingleActiveValue() - return totalPoint - -def SyncFamilyActivityInfo(curPlayer, syncActionid=-1): - return - #通知活跃领取情况 - syncActionIDList = ShareDefine.FamilyActiveIDList if syncActionid==-1 else [syncActionid] - sendPack = ChPyNetSendPack.tagMCFamilyActivityInfo() - sendPack.Clear() - sendPack.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyActivityAwardRecord, 0) - sendPack.InfoList = [] - for actionid in syncActionIDList: - activityInfo = ChPyNetSendPack.tagMCFamilyActionCnt() - activityInfo.ActionID = actionid - activityInfo.FinishCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0) - sendPack.InfoList.append(activityInfo) - sendPack.Count = len(sendPack.InfoList) - NetPackCommon.SendFakePack(curPlayer, sendPack) - return - -#=================仙盟改名====================== #// A6 11 家族改名 #tagCMRenameFamily # #struct tagCMRenameFamily @@ -805,189 +1206,167 @@ # BYTE ItemIndex; //改名物品在背包中的位置 #}; def UpdateFamilyName(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - if GameWorld.IsCrossServer(): - #itemuse_lzxkoy_0:不可在跨服环境下使用改名功能。 - PlayerControl.NotifyCode(curPlayer, "itemuse_lzxkoy_0") - return - - if not curPlayer.GetFamilyID(): - return - - if curPlayer.GetDictByKey(ChConfig.Def_Player_Dict_UpdateFamilyName): - #正在改名中 - GameWorld.Log("仙盟已经在改名中...", curPlayer.GetID()) - return - - #新名字 newName = clientData.NewName itemIndex = clientData.ItemIndex - + + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if familyID <= 0: + return + familyMgr = DBDataMgr.GetFamilyMgr() + family = familyMgr.FindFamily(familyID) + if not family: + return + curMember = family.FindMember(playerID) + if not curMember: + return + + if curMember.GetFmLV() != IPY_PlayerDefine.fmlLeader: + GameWorld.DebugLog("非盟主不可改名!", playerID) + return + + familyName = CheckInputFamilyName(curPlayer, newName) + if not familyName: + return + itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) curItem = itemPack.GetAt(itemIndex) - if not ItemCommon.CheckItemCanUse(curItem): + if not ItemCommon.CheckItemCanUse(curItem) or curItem.GetType() != ChConfig.Def_ItemType_ChangeFamilyName: + GameWorld.DebugLog("没有仙盟改名道具! itemIndex=%s" % itemIndex, playerID) return - if curItem.GetType() != ChConfig.Def_ItemType_ChangeFamilyName: - return - - #改名物品在背包的位置 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_UpdateFamilyNameItemIndex, itemIndex) + ItemCommon.DelItem(curPlayer, curItem, 1, True, 'UpdateFamilyName') - #设置正在改名中... - curPlayer.SetDict(ChConfig.Def_Player_Dict_UpdateFamilyName, 1) + #oldName = curFamily.GetName() + family.SetName(familyName) - #通知GameServer正式改名 - newNameMsg = str(newName) - GameWorld.Log("UpdateFamilyName 通知GameServer正式改名为:%s"%newNameMsg, curPlayer.GetID()) - GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'UpdateFamilyName', newNameMsg, len(newNameMsg)) + infoPack = GetPack_FamilyInfo(familyID) + playerManager = GameWorld.GetPlayerManager() + for index in xrange(family.GetCount()): + member = family.GetAt(index) + memID = member.GetPlayerID() + player = playerManager.FindPlayerByID(memID) + if not player: + continue + Sync_FamilyInfo(player, infoPack) + player.SetFamilyName(familyName) + player.Notify_FamilyNameRefresh() #//04 36 周围玩家家族名刷新#tagPlayerFamilyNameRefresh + + #PlayerCompensation.SendMailByKey('FamilyNameChange', memberIDList, [], [oldName, familyName]) + #PlayerControl.WorldNotify(0, 'Family_ChangeName', [oldName, familyName]) return - -## 扣除改名消耗 -# @param curPlayer: 玩家实例 -# @return: None -def PayUpdateFamilyNameCost(curPlayer): - itemIndex = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_UpdateFamilyNameItemIndex) - #扣除物品 - itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) - curItem = itemPack.GetAt(itemIndex) - if curItem: - ItemCommon.DelItem(curPlayer, curItem, 1, True, 'UpdateFamilyName') +#// A6 20 搜索家族列表 #tagCMViewFamilyPage +# +#struct tagCMViewFamilyPage +#{ +# tagHead Head; +# BYTE MsgLen; //模糊搜索家族,如果输入为空,则为不限制该条件 +# char Msg[MsgLen]; //size = MsgLen +# BYTE PageIndex; //查询第X页索引,0~n +# BYTE ShowCount; //每页数量,前端可自行指定,最大50 +#}; +def OnViewFamilyPage(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + msg = clientData.Msg + pageIndex = clientData.PageIndex + showCount = min(clientData.ShowCount, 50) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_UpdateFamilyNameItemIndex, 0) - return - -def GetFamilyDayAward(curPlayer): - ##领取仙盟每日奖励 2小时脱机挂时间 - if not curPlayer.GetFamilyID(): - return - hasGot = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDayAward) - if hasGot: - GameWorld.DebugLog('领取仙盟每日奖励 当日已领取!') - return - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyDayAward, 1) - #addTime = IpyGameDataPY.GetFuncCfg('FamilyDayAward') - #PlayerTJG.AddTJGTime(curPlayer, addTime) - #通知 - Sync_FamilyDayRewardState(curPlayer) - #PlayerControl.NotifyCode(curPlayer, 'OfflinePlugSuccess', [addTime/60/60]) + familyMgr = DBDataMgr.GetFamilyMgr() + familyCount = familyMgr.GetCount() + totalPage = 0 - return - -def Sync_FamilyDayRewardState(curPlayer): - clientPack = ChPyNetSendPack.tagMCFamilyDayAward() - clientPack.GetState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDayAward) - clientPack.MoneyDonateCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyMoneyDonateCount) + if not msg: + startIndex = pageIndex * showCount + endIndex = startIndex + showCount - 1 + if familyCount > 0: + totalPage = GameWorld.GetIntUpper(familyCount, showCount) + + # 有指定搜索内容的后端固定返回单页 + else: + pageIndex = 0 + showCount = 20 + totalPage = 1 + startIndex = 0 + endIndex = familyCount - 1 + + clientPack = ChPyNetSendPack.tagMCFamilyViewList() + clientPack.Msg = msg + clientPack.MsgLen = len(clientPack.Msg) + clientPack.PageIndex = pageIndex + clientPack.ShowCount = showCount + clientPack.TotalPage = totalPage + clientPack.FamilyList = [] + for index in range(startIndex, endIndex + 1): + if index >= familyCount: + break + family = familyMgr.GetAt(index) + if not family: + continue + if msg and msg not in family.GetName(): + continue + familyView = ChPyNetSendPack.tagMCFamilyView() + familyView.FamilyID = family.GetID() + familyView.FamilyName = family.GetName() + familyView.FamilyNameLen = len(familyView.FamilyName) + familyView.LeaderID = family.GetLeaderID() + leaderMember = family.FindMember(familyView.LeaderID) + familyView.LeaderName = leaderMember.GetPlayerName() if leaderMember else "" + familyView.LeaderNameLen = len(familyView.LeaderName) + familyView.FamilyLV = family.GetLV() + familyView.JoinReview = family.GetJoinReview() + familyView.JoinLVMin = family.GetJoinLVMin() + familyView.ServerID = family.GetServerID() + familyView.EmblemID = family.GetEmblemID() + familyView.FightPower = family.GetFightPower() + familyView.FightPowerEx = family.GetFightPowerEx() + familyView.MemberCount = family.GetCount() + clientPack.FamilyList.append(familyView) + clientPack.FamilyCount = len(clientPack.FamilyList) + if clientPack.FamilyCount >= showCount: + break NetPackCommon.SendFakePack(curPlayer, clientPack) return - -#// A6 06 家族兑换活跃令 #tagCMFamilyActivityExchange -# -#struct tagCMFamilyActivityExchange -#{ -# tagHead Head; -# BYTE Count; //材料所在背包索引的数量 -# WORD IndexList[Count]; //材料所在背包索引列表 -# DWORD ItemIDList[Count]; //材料所在背包物品ID列表 -#}; -## 家族兑换活跃令 -# @param playerIndex 玩家索引 -# @param clientData 客户端封包 -# @param tick 时间 -# @return None -def OnFamilyActivityExchange(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - if not clientData.Count: - return - playerID = curPlayer.GetID() - eatIndexList = clientData.IndexList - eatItemIDList = clientData.ItemIDList - givePoint = 0 #分解得到活跃令 - familyDonateDict = IpyGameDataPY.GetFuncEvalCfg('FamilyDonate', 1, {}) - familyDonateSpecialDict = IpyGameDataPY.GetFuncEvalCfg('FamilyDonate', 2, {}) - itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) - for i, index in enumerate(eatIndexList): - eatItem = itemPack.GetAt(index) - if not ItemCommon.CheckItemCanUse(eatItem): - GameWorld.DebugLog("物品不可用,无法兑换!itemIndex=%s" % index) - continue - eatItemID = eatItem.GetItemTypeID() - if eatItemID != eatItemIDList[i]: - GameWorld.Log('家族兑换活跃令 发的物品ID不对应index=%s eatItemID=%s,ItemIDList[i]=%s' % (index, eatItemID, eatItemIDList[i]), playerID) - continue - #if eatItem.GetIsBind(): - # GameWorld.DebugLog("装备已绑定,无法兑换!itemIndex=%s" % index) - # continue - if eatItem.GetEndureReduceType(): - GameWorld.DebugLog("有时效耐久物品,无法兑换!itemIndex=%s" % index) - continue - if eatItemID in familyDonateSpecialDict: - addPoint = familyDonateSpecialDict[eatItemID] - else: - if not ItemCommon.CheckItemIsEquip(eatItem): - GameWorld.DebugLog("非装备,无法兑换!itemIndex=%s" % index) - continue - itemColor = eatItem.GetItemColor() - if str(itemColor) not in familyDonateDict: - continue - isSuite = eatItem.GetSuiteID() - addPoint = familyDonateDict[str(itemColor)][1 if isSuite else 0] - itemCnt = eatItem.GetCount() - givePoint += addPoint * itemCnt - ItemCommon.DelItem(curPlayer, eatItem, itemCnt, True, ChConfig.ItemDel_FamilyStore, {'addPoint':addPoint}, True) - - if not givePoint: - GameWorld.DebugLog("家族兑换活跃令,没有装备可兑换!") - return - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, givePoint) - - #通知结果 - packData = ChPyNetSendPack.tagMCFamilyActivityExchangeResult() - packData.Clear() - packData.Point = givePoint - NetPackCommon.SendFakePack(curPlayer, packData) - return #// A6 12 家族捐献货币 #tagCMFamilyMoneyDonate # #struct tagCMFamilyMoneyDonate #{ # tagHead Head; -# BYTE MoneyType; // 捐献货币类型 +# BYTE DonateType; // 捐献类型 #}; def OnFamilyMoneyDonate(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - moneyType = clientData.MoneyType - playerID = curPlayer.GetPlayerID() - - dailyDonateCountMax = IpyGameDataPY.GetFuncCfg('FamilyDonate', 3) - donateCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyMoneyDonateCount) - if dailyDonateCountMax and donateCount >= dailyDonateCountMax: - GameWorld.DebugLog("今日货币捐献次数已达上限. donateCount=%s" % donateCount, playerID) - return - - donatePrizeInfo = IpyGameDataPY.GetFuncEvalCfg('FamilyDonate', 4, {}) - if str(moneyType) not in donatePrizeInfo: - GameWorld.DebugLog("不存在该货币类型捐献: moneyType=%s" % moneyType, playerID) - return - needMoney, contribution, familyActivity = donatePrizeInfo[str(moneyType)] - if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, "FamilyMoneyDonate"): - return - - updDonateCount = donateCount + 1 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyMoneyDonateCount, updDonateCount) - Sync_FamilyDayRewardState(curPlayer) - GameWorld.DebugLog("货币捐献: moneyType=%s,needMoney=%s,updDonateCount=%s,contribution=%s,familyActivity=%s" - % (moneyType, needMoney, updDonateCount, contribution, familyActivity), playerID) - - if contribution > 0: - AddPlayerFamilyActiveValue(curPlayer, contribution, True, ShareDefine.Def_AddFAVReason_FamilyDonateItem, True) - - if familyActivity > 0: - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, familyActivity) - + #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + #DonateType = clientData.DonateType + #playerID = curPlayer.GetPlayerID() + # 先屏蔽,等功能定了再改 + return + + +#--------------------------------------------------------------------- +def AddPlayerFamilyActiveValue(curPlayer, addValue, sendPackGameServer = False, reason = 0, isSysMsg=False): + # 多个地方用到,先保留,之后删除统一修改 + return True +def SendPack_GameServer_AddFamilyDetail(curPlayer, addFamilyHornor = 0, addFamilyMoney = 0, addFamilyActiveValue = 0, resion=0): + return +def SendPack_GameServer_AddFamilyDetailEx(curPlayer, addPlayerActiveValue, addFamilyMoney = 0, addFamilyHornor = 0, resion=0): + return + +## ------------------------------------------------------------------------------------------------ + +def GetFamilyDayAward(curPlayer): + ##领取仙盟每日奖励 2小时脱机挂时间 + return + +def Sync_FamilyDayRewardState(curPlayer): + clientPack = ChPyNetSendPack.tagMCFamilyDayAward() + clientPack.GetState = 0 + clientPack.MoneyDonateCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateRecord) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +def AddFamilyActivity(curPlayer, actionid, addCnt=1): return @@ -1195,222 +1574,3 @@ clientPack.Count = len(clientPack.AffairInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return - -##-------------------------------------------------------------------------------------------------- -##--------------------------------------- 仙盟传功 -------------------------------------------------- -#// A6 15 传功操作 #tagCMChuangongOP -# -#struct tagCMChuangongOP -#{ -# tagHead Head; -# BYTE OPType; // 操作类型:1-邀请;2-回应;3-领奖; -# DWORD PlayerID; // 目标玩家ID;回应时为邀请方玩家ID -# BYTE OPData; // 操作数据,可选:回应时为是否同意 -#}; -def OnChuangongOP(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - opType = clientData.OPType - tagPlayerID = clientData.PlayerID - opData = clientData.OPData - - if tagPlayerID and curPlayer.GetPlayerID() == tagPlayerID: - GameWorld.DebugLog("不能自己传功") - return - - if opType == 1: - __Chuangong_Invite(curPlayer, tagPlayerID) - elif opType == 2: - __Chuangong_Response(curPlayer, tagPlayerID, opData) - elif opType == 3: - __Chuangong_GetAward(curPlayer) - return - -def SendGameServer_FamilyChuangong(curPlayer, msgType, msgData): - playerID = curPlayer.GetPlayerID() - GameWorld.DebugLog("传功同步GameServer: msgType=%s,%s" % (msgType, msgData), playerID) - msgInfo = str([msgType, msgData]) - GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyChuangong", msgInfo, len(msgInfo)) - return - -def __CheckCanChuangong(curPlayer): - playerID = curPlayer.GetPlayerID() - remainCnt = PlayerActivity.GetDailyActionrRemainCnt(curPlayer, ShareDefine.DailyActionID_FamilyChuanGong) - if remainCnt <= 0: - GameWorld.DebugLog("没有传功次数了", playerID) - return - openServerDayLimit = IpyGameDataPY.GetFuncCfg("FamilyChuangong", 1) - if openServerDayLimit: - openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 - if openServerDay > openServerDayLimit: - GameWorld.DebugLog("当前开服天不能传功: openServerDay=%s > %s" % (openServerDay, openServerDayLimit), playerID) - return - return True - -def __Chuangong_Invite(curPlayer, tagPlayerID): - ## 传功邀请 - if not __CheckCanChuangong(curPlayer): - return - SendGameServer_FamilyChuangong(curPlayer, "Invite", [tagPlayerID]) - return - -def __Chuangong_Response(curPlayer, tagPlayerID, isOK): - ## 传功回应 - SendGameServer_FamilyChuangong(curPlayer, "Response", [tagPlayerID, isOK]) - return - -def __Chuangong_GetAward(curPlayer): - ## 传功领奖 - if not __CheckCanChuangong(curPlayer): - return - PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_FamilyChuanGong, 1) - - playerID = curPlayer.GetPlayerID() - fromLV = curPlayer.GetLV() - - # 给经验 - totalExp = 0 - giveRound = IpyGameDataPY.GetFuncCfg("FamilyChuangong", 3) - worldlv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) - playerControl = PlayerControl.PlayerControl(curPlayer) - for index in range(giveRound): - reLV = curPlayer.GetLV() - reExp = PlayerControl.GetPlayerReExp(curPlayer) - giveExp = eval(IpyGameDataPY.GetFuncCompileCfg("FamilyChuangong", 2)) - finalAddExp = playerControl.AddExp(giveExp, ShareDefine.Def_ViewExpType_Chuangong) - totalExp += finalAddExp - GameWorld.DebugLog("传功经验: 轮次=%s,reLV=%s,reExp=%s,finalAddExp=%s, %s" % (index, reLV, reExp, finalAddExp, totalExp), playerID) - - PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FamilyChuanGong, 1) - PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_ChuanGong, 1) - - # 给物品 - giveItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyChuangong", 4) - ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList) - - # 同步结果 - syncItemList = [] - for itemID, itemCount, _ in giveItemList: - syncItem = ChPyNetSendPack.tagMCChuangongItem() - syncItem.Clear() - syncItem.ItemID = itemID - syncItem.ItemCount = itemCount - syncItemList.append(syncItem) - # 有协助感谢礼盒 - if IpyGameDataPY.GetIpyGameDataNotLog("AssistThanksGift", itemID): - SendGameServer_FamilyChuangong(curPlayer, "ThanksGift", [itemID]) - clientPack = ChPyNetSendPack.tagMCChuangongResult() - clientPack.Clear() - clientPack.FromLV = fromLV - clientPack.ToLV = curPlayer.GetLV() - clientPack.Exp = totalExp % ChConfig.Def_PerPointValue - clientPack.ExpPoint = totalExp / ChConfig.Def_PerPointValue - clientPack.AwardItemList = syncItemList - clientPack.ItemCount = len(clientPack.AwardItemList) - NetPackCommon.SendFakePack(curPlayer, clientPack) - return - -##-------------------------------------------------------------------------------------------------- -##----------------------------------------- 珍宝阁 -------------------------------------------------- -#// A6 16 珍宝阁操作 #tagCMZhenbaogeOP -# -#struct tagCMZhenbaogeOP -#{ -# tagHead Head; -# BYTE OpType; // 操作:0-砍价;1-购买 -#}; -def OnZhenbaogeOP(index, clientData, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - opType = clientData.OpType - playerID = curPlayer.GetPlayerID() - if not curPlayer.GetFamilyID(): - GameWorld.DebugLog("没有仙盟无法操作珍宝阁!", playerID) - return - - # 砍价 - if opType == 0: - leaveTimeEx = PlayerControl.GetLeaveFamilyTimeEx(curPlayer) - cutState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut) - if cutState and leaveTimeEx: - cutCDTimes = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 3) * 60 - passTimes = int(time.time()) - leaveTimeEx - if passTimes < cutCDTimes: - GameWorld.DebugLog("今日已砍价变更仙盟砍价CD中! passTimes=%s < %s" % (passTimes, cutCDTimes), playerID) - return - SendGameServer_FamilyZhenbaoge(curPlayer, "Cut", []) - - # 购买 - elif opType == 1: - buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) - if buyState: - GameWorld.DebugLog("珍宝阁今日已购买!", playerID) - return - moneyType = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 1) - playerMoneyValue = PlayerControl.GetMoney(curPlayer, moneyType) - SendGameServer_FamilyZhenbaoge(curPlayer, "Buy", [playerMoneyValue]) - - return - -def SendGameServer_FamilyZhenbaoge(curPlayer, msgType, msgData): - playerID = curPlayer.GetPlayerID() - tick = GameWorld.GetGameWorld().GetTick() - if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyZhenbaoge, tick): - GameWorld.DebugLog("请求CD中...", playerID) - return - GameWorld.DebugLog("珍宝阁同步GameServer: msgType=%s,%s" % (msgType, msgData), playerID) - msgInfo = str([msgType, msgData]) - GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyZhenbaoge", msgInfo, len(msgInfo)) - return - -def GameServer_FamilyZhenbaogeRet(curPlayer, resultList): - curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FamilyZhenbaoge, 0) - playerID = curPlayer.GetPlayerID() - msgType, _ = resultList[:2] - retData = resultList[2:] - GameWorld.Log("仙盟珍宝阁GameServer返回: %s" % str(resultList), playerID) - if msgType == "Cut": - cutPrice = retData[0] - if not cutPrice: - # 砍价失败不处理后续 - return - PlayerControl.NotifyCode(curPlayer, "ZhenbaogeCut", [cutPrice]) - if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut): - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 1) - Sync_ZhenbaogeInfo(curPlayer) - - elif msgType == "Buy": - isOK = retData[0] - if not isOK: - return - buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) - if buyState: - #一天只能买一次,防止变更仙盟刷 - return - nowPrice, giveItemList = retData[1:] - - moneyType = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 1) - if nowPrice > 0: - if not PlayerControl.PayMoney(curPlayer, moneyType, nowPrice, "Zhenbaoge"): - GameWorld.ErrLog("珍宝阁购买货币不足! nowPrice=%s" % nowPrice, playerID) - return - elif nowPrice < 0: - PlayerControl.GiveMoney(curPlayer, moneyType, -nowPrice, "Zhenbaoge") - else: # 0不处理 - pass - - if giveItemList: - ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, event=["Zhenbaoge", False, {}], isNotifyAward=False) - ItemControler.NotifyGiveAwardInfo(curPlayer, giveItemList, "Zhenbaoge", moneyInfo={moneyType:0 if nowPrice > 0 else -nowPrice}) - - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 1) - Sync_ZhenbaogeInfo(curPlayer) - - return - -def Sync_ZhenbaogeInfo(curPlayer): - clientPack = ChPyNetSendPack.tagMCFamilyZhenbaogeInfo() - clientPack.CutState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut) - clientPack.BuyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) - NetPackCommon.SendFakePack(curPlayer, clientPack) - return - -##-------------------------------------------------------------------------------------------------- diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyEmblem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyEmblem.py new file mode 100644 index 0000000..d900533 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyEmblem.py @@ -0,0 +1,185 @@ +#!/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 IpyGameDataPY +import PlayerFamily +import DBDataMgr + +import random +import time + +def GetActionEmblemID(emblemActionObj): return emblemActionObj.GetValue1() +def SetActionEmblemID(emblemActionObj, emblemID): return emblemActionObj.SetValue1(emblemID) +def GetActionEmblemEndTime(emblemActionObj): return emblemActionObj.GetValue2() +def SetActionEmblemEndTime(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 = DBDataMgr.GetFamilyMgr() + for i in xrange(familyManager.GetCount()): + family = familyManager.GetAt(i) + if not family: + continue + familyID = family.GetID() + familyAction = familyManager.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) + for index in range(familyAction.Count())[::-1]: # 可能触发删除,倒序遍历 + emblemActionObj = familyAction.At(index) + emblemID = GetActionEmblemID(emblemActionObj) + endTime = GetActionEmblemEndTime(emblemActionObj) + if not endTime or endTime > curTime: + #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 family.GetEmblemID() == 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)) + family.SetEmblemID(updEmblemID) + family.Broadcast_FamilyChange() + return + +def GetFamilyEmblemActionData(familyID, emblemID): + ## 获取仙盟时效徽章Action数据 + actionType = ShareDefine.Def_ActionType_FamilyEmblem + familyAction = DBDataMgr.GetFamilyActionMgr().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-有效时长秒;没有指定时直接读配置进行累加 + if not familyID or not emblemID: + return + ipyData = IpyGameDataPY.GetIpyGameData("FamilyEmblem", emblemID) + if not ipyData: + return + if ipyData.GetCustomFamilyID(): + GameWorld.Log("仙盟定制徽章不需要添加! familyID=%s,emblemID=%s" % (familyID, emblemID)) + return + unlockFamilyLV = ipyData.GetUnlockFamilyLV() + if unlockFamilyLV: + GameWorld.Log("仙盟解锁的徽章不需要添加! familyID=%s,emblemID=%s" % (familyID, emblemID)) + return + ipyExpireSeconds = ipyData.GetExpireMinutes() * 60 + + curTime = int(time.time()) + emblemActionObj = GetFamilyEmblemActionData(familyID, emblemID) + if not emblemActionObj: + actionType = ShareDefine.Def_ActionType_FamilyEmblem + familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) + emblemActionObj = familyAction.AddAction() + emblemActionObj.SetTime(curTime) + emblemActionObj.SetFamilyId(familyID) + emblemActionObj.SetActionType(actionType) + + if not emblemActionObj: + return + endTime = GetActionEmblemEndTime(emblemActionObj) + updEndTime = endTime + + # 指定时长的,如GM指定 + if setExpireTimes > 0: + updEndTime = curTime + setExpireTimes + + # 永久 + elif ipyExpireSeconds == 0 or setExpireTimes == 0: + updEndTime = 0 + + else: + # 未过期 + if endTime > curTime: + updEndTime = endTime + ipyExpireSeconds + else: + updEndTime = curTime + ipyExpireSeconds + + GameWorld.Log("添加仙盟徽章! familyID=%s,emblemID=%s,setExpireTimes=%s,endTime=%s,updEndTime=%s" + % (familyID, emblemID, setExpireTimes, endTime, updEndTime)) + SetActionEmblemID(emblemActionObj, emblemID) + SetActionEmblemEndTime(emblemActionObj, updEndTime) + + # 通知 + #PlayerFamilyAction.SendFamilyAction(emblemActionObj) + return emblemActionObj + +def OnChangeFamilyEmblem(curPlayer, emblemID): + ## 修改仙盟徽章 + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + familyManager = PlayerFamily.GetFamilyMgr() + curFamily = familyManager.FindFamily(familyID) + 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() + customFamilyID = ipyData.GetCustomFamilyID() + + if customFamilyID: + if familyID != customFamilyID: + GameWorld.DebugLog("不是该定制徽章所属仙盟,无法使用该徽章! emblemID=%s,customFamilyID=%s != %s" + % (emblemID, customFamilyID, familyID), playerID) + return + + elif unlockFamilyLV: + if curFamily.GetLV() < unlockFamilyLV: + GameWorld.DebugLog("仙盟等级不足,无法使用该徽章! emblemID=%s,unlockFamilyLV=%s" + % (emblemID, unlockFamilyLV), playerID) + return + else: + emblemActionObj = GetFamilyEmblemActionData(familyID, emblemID) + if not emblemActionObj: + GameWorld.DebugLog("该徽章未激活! emblemID=%s" % (emblemID), playerID) + return + endTime = GetActionEmblemEndTime(emblemActionObj) + if endTime and endTime <= int(time.time()): + GameWorld.Log("该徽章已过期! familyID=%s,emblemID=%s,endTime=%s" % (familyID, emblemID, endTime)) + return + + GameWorld.DebugLog("更换仙盟徽章! familyID=%s,emblemID=%s" % (familyID, emblemID), playerID) + curFamily.SetEmblemID(emblemID) + #PlayerFamily.SendPack_MapServer_PlayerFamilyRefresh(curFamily) + curFamily.Broadcast_FamilyChange() + return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py new file mode 100644 index 0000000..0922152 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyZhenbaoge.py @@ -0,0 +1,347 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package PlayerFamilyZhenbaoge +# +# @todo:珍宝阁 +# @author hxp +# @date 2024-10-29 +# @version 1.0 +# +# 详细描述: 珍宝阁 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-10-29 17:30""" +#------------------------------------------------------------------------------- + +import ChConfig +import ShareDefine +import IpyGameDataPY +import PlayerFamily +import GameWorld +import DBDataMgr + +import random +import time +import ChPyNetSendPack +import NetPackCommon +import ItemControler +import PlayerControl + +ActionType = ShareDefine.Def_ActionType_Zhenbaoge +ActionGlobalID = 1 # 全局记录ID + +# 全局记录 +#Time 本轮开始时间戳 +#Value1 ActionGlobalID +def GetFAPrice(gActionData): return gActionData.GetValue2() +def SetFAPrice(gActionData, price): return gActionData.SetValue2(price) +def GetFAIsNegative(gActionData): return gActionData.GetValue3() # 是否负值 +def SetFAIsNegative(gActionData, isNegative): return gActionData.SetValue3(isNegative) +def GetFAPriceFinal(gActionData): + ## 获取最终价格 + price = GetFAPrice(gActionData) + isNegative = GetFAIsNegative(gActionData) + return price if not isNegative else -price +def SetFAPriceFinal(gActionData, totalPrice): + SetFAPrice(gActionData, abs(totalPrice)) + SetFAIsNegative(gActionData, 1 if totalPrice < 0 else 0) + return +def GetFAItemList(gActionData): return eval(gActionData.GetUseData()) # 物品列表 +def SetFAItemList(gActionData, itemList): + dataStr = str(itemList) + gActionData.SetUseData(dataStr, len(dataStr)) + return + +# 成员砍价记录 +#Time 砍价时间戳 +#Name 玩家名 +def GetFAPlayerID(actionData): return actionData.GetValue1() +def SetFAPlayerID(actionData, playerID): return actionData.SetValue1(playerID) +def GetFACutPrice(actionData): return actionData.GetValue2() # 玩家砍了多少 +def SetFACutPrice(actionData, cutPrice): return actionData.SetValue2(cutPrice) +def GetFABuyState(actionData): return actionData.GetValue3() # 玩家是否已购买 +def SetFABuyState(actionData, buyState): return actionData.SetValue3(buyState) + +def OnDayEx(family): + OnZhenbaogeReset(family) + return + +def OnZhenbaogeReset(family): + ## 珍宝阁重置 + + familyID = family.GetID() + + familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) + gActionData = familyAction.AddAction() + SetFAPlayerID(gActionData, ActionGlobalID) + + initPrice = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 2) + + randItemList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetFamilyZhenbaogeItemCount()): + ipyData = ipyDataMgr.GetFamilyZhenbaogeItemByIndex(index) + randItemList.append([ipyData.GetItemWeight(), ipyData.GetItemList()]) + + itemList = GameWorld.GetResultByWeightList(randItemList, []) + + SetFAPriceFinal(gActionData, initPrice) + SetFAItemList(gActionData, itemList) + + #PlayerFamilyAction.SendFamilyAction(gActionData) + GameWorld.DebugLog("珍宝阁重置! familyID=%s,itemList=%s" % (familyID, itemList), familyID) + return + +def GetZhenbaogeActionData(familyID, playerID): + ## 获取Action + findActionData = None + familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) + for index in range(0, familyAction.Count()): + actionData = familyAction.At(index) + if GetFAPlayerID(actionData) == playerID: + findActionData = actionData + break + return findActionData + +def MapServer_ZhenbaogeOP(curPlayer, msgList): + mapID = curPlayer.GetRealMapID() + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("MapServer_ZhenbaogeOP mapID=%s,msgList=%s" % (mapID, msgList), playerID) + if not msgList: + return + + curFamily = curPlayer.GetFamily() + if not curFamily: + return + + familyID = curFamily.GetID() + gActionData = GetZhenbaogeActionData(familyID, ActionGlobalID) + if not gActionData: + GameWorld.DebugLog("珍宝阁还没有刷新! familyID=%s" % familyID, playerID) + return + + msgType, dataMsg = msgList + ret = None + + if msgType == "Cut": + cutPrice = CalcCutPrice(curFamily, gActionData, playerID) + if cutPrice: + AddCutPrice(familyID, playerID, curPlayer.GetName(), cutPrice, gActionData) + ret = [cutPrice] + + elif msgType == "Buy": + buyRet = __DoZhenbaogeBuy(familyID, playerID, gActionData, dataMsg) + if buyRet: + ret = [True] + list(buyRet) + else: + ret = [False] + + if ret == None: + return + return msgList + (ret if isinstance(ret, list) else [ret]) + +def CalcCutPrice(curFamily, gActionData, playerID): + ## 计算砍价价格 + # @return: None-砍价限制等;>0-砍价值 + + familyID = curFamily.GetID() + + familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) + actionCount = familyAction.Count() # 其中1条是公共数据 + hadCutCount = actionCount - 1 + maxMemberCnt = PlayerFamily.GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_MaxMemberCnt) + if hadCutCount >= maxMemberCnt: + GameWorld.ErrLog("已达到仙盟砍价人次上限! hadCutCount=%s >= %s,familyID=%s,familyLV=%s" + % (hadCutCount, maxMemberCnt, familyID, curFamily.GetLV()), playerID) + return + + actionData = GetZhenbaogeActionData(familyID, playerID) + if actionData and GetFACutPrice(actionData): + GameWorld.DebugLog("已经在该盟珍宝阁砍价过了! familyID=%s" % familyID, playerID) + return + + cutNum = hadCutCount + 1 + cutIpyData = IpyGameDataPY.GetIpyGameData("FamilyZhenbaogeCut", cutNum) + if not cutIpyData: + return + cutWeight = cutIpyData.GetCutWeight() + minRatio = cutIpyData.GetMinRatio() + randRatio = cutIpyData.GetRandRatio() + totalWeight = PlayerFamily.GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_ZhenbaogeWeights) + rand = random.random() #随机值 0~1 + + initPrice = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 2) + + cutPrice = max(1, eval(IpyGameDataPY.GetFuncCompileCfg("ZhenbaogeCut", 2))) + + nowPrice = GetFAPriceFinal(gActionData) + updPrice = nowPrice - cutPrice + + lowestPrice = IpyGameDataPY.GetFuncCfg("ZhenbaogeCut", 1) # 最低价格保护 + if updPrice < lowestPrice: + if nowPrice > lowestPrice: + updPrice = int(lowestPrice - random.randint(0, 2)) # 之前还未到达最低价,固定最低价+随机0~2 + cutPrice = nowPrice - updPrice + else: + cutPrice = random.randint(1, 2) # 低于最低价格后砍价只能随机1或2 + updPrice = nowPrice - cutPrice + GameWorld.DebugLog("珍宝阁砍价计算地板价保护: cutPrice=%s,nowPrice=%s,updPrice=%s" % (cutPrice, nowPrice, updPrice), playerID) + else: + GameWorld.DebugLog("珍宝阁砍价计算: cutPrice=%s,nowPrice=%s,updPrice=%s,cutWeight=%s/%s,minRatio=%s,randRatio=%s,rand=%s,initPrice=%s" + % (cutPrice, nowPrice, updPrice, cutWeight, totalWeight, minRatio, randRatio, rand, initPrice), playerID) + + return max(1, cutPrice) + +def AddCutPrice(familyID, playerID, playerName, cutPrice, gActionData, isNotify=True): + ## 添加砍价记录 + familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, ActionType) + actionData = familyAction.AddAction() + actionData.SetFamilyId(familyID) + actionData.SetActionType(ActionType) + actionData.SetTime(int(time.time())) + actionData.SetName(playerName) + SetFAPlayerID(actionData, playerID) + SetFACutPrice(actionData, cutPrice) + + # 更新最终价格 + nowPrice = GetFAPriceFinal(gActionData) + updPrice = nowPrice - cutPrice + SetFAPriceFinal(gActionData, updPrice) + GameWorld.DebugLog("珍宝阁砍价更新: playerID=%s,cutPrice=%s,nowPrice=%s,updPrice=%s,familyID=%s" + % (playerID, cutPrice, nowPrice, updPrice, familyID), playerID) + if isNotify: + pass + #PlayerFamilyAction.SendFamilyAction([gActionData, actionData]) + return actionData + +def __DoZhenbaogeBuy(familyID, playerID, gActionData, dataMsg): + playerMoneyValue = dataMsg[0] + actionData = GetZhenbaogeActionData(familyID, playerID) + if not actionData: + GameWorld.DebugLog("珍宝阁未砍价,无法购买! familyID=%s" % familyID, playerID) + return + if GetFABuyState(actionData): + GameWorld.DebugLog("珍宝阁已经购买过了! familyID=%s" % familyID, playerID) + return + nowPrice = GetFAPriceFinal(gActionData) + if nowPrice > 0 and playerMoneyValue < nowPrice: + GameWorld.DebugLog("玩家当前货币不足,无法购买珍宝阁物品! playerMoneyValue=%s < %s" % (playerMoneyValue, nowPrice), playerID) + return + + giveItemList = GetFAItemList(gActionData) + GameWorld.DebugLog("珍宝阁购买! familyID=%s,nowPrice=%s,giveItemList=%s" % (familyID, nowPrice, giveItemList), playerID) + + # 设置已买 + SetFABuyState(actionData, 1) + #PlayerFamilyAction.SendFamilyAction(actionData) + return nowPrice, giveItemList + + + +##----------------------------------------- 珍宝阁 -------------------------------------------------- +#// A6 16 珍宝阁操作 #tagCMZhenbaogeOP +# +#struct tagCMZhenbaogeOP +#{ +# tagHead Head; +# BYTE OpType; // 操作:0-砍价;1-购买 +#}; +def OnZhenbaogeOP(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + opType = clientData.OpType + playerID = curPlayer.GetPlayerID() + if not curPlayer.GetFamilyID(): + GameWorld.DebugLog("没有仙盟无法操作珍宝阁!", playerID) + return + + # 砍价 + if opType == 0: + leaveTimeEx = PlayerControl.GetLeaveFamilyTimeEx(curPlayer) + cutState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut) + if cutState and leaveTimeEx: + cutCDTimes = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 3) * 60 + passTimes = int(time.time()) - leaveTimeEx + if passTimes < cutCDTimes: + GameWorld.DebugLog("今日已砍价变更仙盟砍价CD中! passTimes=%s < %s" % (passTimes, cutCDTimes), playerID) + return + SendGameServer_FamilyZhenbaoge(curPlayer, "Cut", []) + + # 购买 + elif opType == 1: + buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) + if buyState: + GameWorld.DebugLog("珍宝阁今日已购买!", playerID) + return + moneyType = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 1) + playerMoneyValue = PlayerControl.GetMoney(curPlayer, moneyType) + SendGameServer_FamilyZhenbaoge(curPlayer, "Buy", [playerMoneyValue]) + + return + +def SendGameServer_FamilyZhenbaoge(curPlayer, msgType, msgData): + playerID = curPlayer.GetPlayerID() + tick = GameWorld.GetGameWorld().GetTick() + if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyZhenbaoge, tick): + GameWorld.DebugLog("请求CD中...", playerID) + return + GameWorld.DebugLog("珍宝阁同步GameServer: msgType=%s,%s" % (msgType, msgData), playerID) + msgInfo = str([msgType, msgData]) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyZhenbaoge", msgInfo, len(msgInfo)) + return + +def GameServer_FamilyZhenbaogeRet(curPlayer, resultList): + curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FamilyZhenbaoge, 0) + playerID = curPlayer.GetPlayerID() + msgType, _ = resultList[:2] + retData = resultList[2:] + GameWorld.Log("仙盟珍宝阁GameServer返回: %s" % str(resultList), playerID) + if msgType == "Cut": + cutPrice = retData[0] + if not cutPrice: + # 砍价失败不处理后续 + return + PlayerControl.NotifyCode(curPlayer, "ZhenbaogeCut", [cutPrice]) + if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut): + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeCut, 1) + Sync_ZhenbaogeInfo(curPlayer) + + elif msgType == "Buy": + isOK = retData[0] + if not isOK: + return + buyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) + if buyState: + #一天只能买一次,防止变更仙盟刷 + return + nowPrice, giveItemList = retData[1:] + + moneyType = IpyGameDataPY.GetFuncCfg("Zhenbaoge", 1) + if nowPrice > 0: + if not PlayerControl.PayMoney(curPlayer, moneyType, nowPrice, "Zhenbaoge"): + GameWorld.ErrLog("珍宝阁购买货币不足! nowPrice=%s" % nowPrice, playerID) + return + elif nowPrice < 0: + PlayerControl.GiveMoney(curPlayer, moneyType, -nowPrice, "Zhenbaoge") + else: # 0不处理 + pass + + if giveItemList: + ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, event=["Zhenbaoge", False, {}], isNotifyAward=False) + ItemControler.NotifyGiveAwardInfo(curPlayer, giveItemList, "Zhenbaoge", moneyInfo={moneyType:0 if nowPrice > 0 else -nowPrice}) + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy, 1) + Sync_ZhenbaogeInfo(curPlayer) + + return + +def Sync_ZhenbaogeInfo(curPlayer): + clientPack = ChPyNetSendPack.tagMCFamilyZhenbaogeInfo() + clientPack.CutState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeCut) + clientPack.BuyState = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyZhenbaogeBuy) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return + +##-------------------------------------------------------------------------------------------------- + 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 2b08c68..7a9b4ad 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py @@ -20,7 +20,7 @@ import PlayerControl import IPY_GameWorld import ChPyNetSendPack -import PyGameDataStruct +import DBStruct import ChMapToGamePyPack import PlayerMagicWeapon import Operate_EquipStone @@ -40,7 +40,7 @@ import time import json -TempDBPlayer = PyGameDataStruct.tagDBPlayer() +TempDBPlayer = DBStruct.tagDBPlayer() Def_Process_Tick = "ProcessPlayerCache" diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyNameRefresh.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyNameRefresh.py index ad7c5df..3829477 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyNameRefresh.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyNameRefresh.py @@ -49,7 +49,7 @@ PlayerFamily.PayUpdateFamilyNameCost(curFindPlayer) #清除改名锁 - curFindPlayer.SetDict(ChConfig.Def_Player_Dict_UpdateFamilyName, 0) + #curFindPlayer.SetDict(ChConfig.Def_Player_Dict_UpdateFamilyName, 0) return #--------------------------------------------------------------------- diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyZhenbaoge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyZhenbaoge.py index 325d665..0b25851 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyZhenbaoge.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_FamilyZhenbaoge.py @@ -15,7 +15,7 @@ #"""Version = 2024-10-29 17:30""" #------------------------------------------------------------------------------- -import PlayerFamily +import PlayerFamilyZhenbaoge #--------------------------------------------------------------------- #逻辑实现 @@ -39,7 +39,7 @@ # @return None # @remarks 函数详细说明. def DoResult(curPlayer, callFunName, funResult, tick): - PlayerFamily.GameServer_FamilyZhenbaogeRet(curPlayer, eval(funResult)) + PlayerFamilyZhenbaoge.GameServer_FamilyZhenbaogeRet(curPlayer, eval(funResult)) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ForbiddenFamilyAction.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ForbiddenFamilyAction.py index 4d1ef3e..7590972 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ForbiddenFamilyAction.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_ForbiddenFamilyAction.py @@ -28,7 +28,7 @@ forbidFamilyAction = GameWorld.ToIntDef(funResult) # 设置玩家是否可以参加家族活动 - PlayerFamily.SetForbidFamilyAction(curPlayer, forbidFamilyAction) + #PlayerFamily.SetForbidFamilyAction(curPlayer, forbidFamilyAction) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py index 395f224..b6294d7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py @@ -14,6 +14,11 @@ #------------------------------------------------------------------------------- #"""Version = 2017-09-05 21:30""" #------------------------------------------------------------------------------- + +g_initGame = False + +g_pyGameDataManager = None + g_mapIDTxtInfo = {} # MapID.txt 加载的信息 g_realmDiffPlayerDict = {} # 境界难度玩家信息 {realm:[playerID, ...], ...} g_realmDiffNPCRefresh = {} # {(lineID, realm):{refreshID:tagNPCRefresh, ...}} diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameDataStruct.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameDataStruct.py deleted file mode 100644 index 7af8c46..0000000 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameDataStruct.py +++ /dev/null @@ -1,665 +0,0 @@ -#!/usr/bin/python -# -*- coding: GBK -*- -# -##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/CoreServerGroup/GameServer/Script/PyGameDataStruct.py -# @todo: -# -# @author: Alee -# @date 2017-8-21 下午04:21:36 -# @version 1.0 -# -# @note: CodeMaker PyGameServerSaveData.py生成 -# -#--------------------------------------------------------------------- -import ctypes -from ctypes import (Structure, memset, memmove, sizeof, addressof, create_string_buffer, string_at) -import CommFunc - -#玩家详细信息#tagDBPlayer -class tagDBPlayer(Structure): - _pack_ = 1 - _fields_ = [ - ('PlayerID', ctypes.c_ulong), - ('AccID', ctypes.c_char * 65), - ('PlayerName', ctypes.c_char * 33), - ('AccState', ctypes.c_ubyte), - ('IsDeleted', ctypes.c_ubyte), - ('GMLevel', ctypes.c_ubyte), - ('Sex', ctypes.c_int), - ('Hair', ctypes.c_int), - ('HairColor', ctypes.c_int), - ('Face', ctypes.c_int), - ('FacePic', ctypes.c_int), - ('Job', ctypes.c_int), - ('RoleType', ctypes.c_ulong), - ('ReincarnationLv', ctypes.c_ushort), - ('LV', ctypes.c_int), - ('TotalExp', ctypes.c_ulong), - ('FamilyID', ctypes.c_ulong), - ('FamilyName', ctypes.c_char * 33), - ('Country', ctypes.c_int), - ('TeamHornor', ctypes.c_ulong), - ('FamilyHornor', ctypes.c_ulong), - ('FamilyActiveValue', ctypes.c_ulong), - ('LastWeekFamilyActiveValue', ctypes.c_ulong), - ('CountryHornor', ctypes.c_ulong), - ('CountryLastWeekHornor', ctypes.c_ulong), - ('Mate', ctypes.c_ulong), - ('Gold', ctypes.c_ulong), - ('GoldPaper', ctypes.c_ulong), - ('Silver', ctypes.c_ulong), - ('SilverPaper', ctypes.c_ulong), - ('FightPoint', ctypes.c_ulong), - ('HappyPoint', ctypes.c_ulong), - ('MapID', ctypes.c_ulong), - ('DataMapID', ctypes.c_ulong), - ('CopyMapID', ctypes.c_ulong), - ('PosX', ctypes.c_ushort), - ('PosY', ctypes.c_ushort), - ('FromMapID', ctypes.c_ulong), - ('FromCopyMapID', ctypes.c_ulong), - ('FromPosX', ctypes.c_ushort), - ('FromPosY', ctypes.c_ushort), - ('State', ctypes.c_int), - ('HP', ctypes.c_ulong), - ('MP', ctypes.c_ulong), - ('XP', ctypes.c_ulong), - ('HPRestoreSetting', ctypes.c_ushort), - ('MPRestoreSetting', ctypes.c_ushort), - ('FreePoint', ctypes.c_ulong), - ('FreeSkillPoint', ctypes.c_ulong), - ('STR', ctypes.c_int), - ('PNE', ctypes.c_int), - ('PHY', ctypes.c_int), - ('CON', ctypes.c_int), - ('TotalSTR', ctypes.c_int), - ('TotalPNE', ctypes.c_int), - ('TotalPHY', ctypes.c_int), - ('TotalCON', ctypes.c_int), - ('Setting', ctypes.c_char * 100), - ('PKValue', ctypes.c_ushort), - ('FightPower', ctypes.c_ulong), - ('ActiveValue', ctypes.c_ushort), - ('PlayerType', ctypes.c_ubyte), - ('BackpackLV', ctypes.c_ubyte), - ('WarehouseLV', ctypes.c_ubyte), - ('HaveWarehousePsw', ctypes.c_ubyte), - ('WarehousePsw', ctypes.c_char * 15), - ('WarehouseLocked', ctypes.c_ubyte), - ('WarehouseGold', ctypes.c_ulong), - ('WarehouseSilver', ctypes.c_ulong), - ('TeamID', ctypes.c_ulong), - ('UseGoldType', ctypes.c_ubyte), - ('UseSilverType', ctypes.c_ubyte), - ('AttackMode', ctypes.c_ubyte), - ('RebornMapID', ctypes.c_ushort), - ('RebornPosX', ctypes.c_ushort), - ('RebornPosY', ctypes.c_ushort), - ('WeekOnlineTime', ctypes.c_ulong), - ('LastWeekOnlineTime', ctypes.c_ulong), - ('LogoffTime', ctypes.c_char * 30), - ('IsHideMask', ctypes.c_ubyte), - ('DayProcessGameEventCount', ctypes.c_ulong), - ('LoginIP', ctypes.c_char * 20), - ('LoginTime', ctypes.c_char * 30), - ('OnlineTime', ctypes.c_ulong), - ('FriendFavor', ctypes.c_ulong), - ('TeamPrivity', ctypes.c_ulong), - ('OfflineMinutes', ctypes.c_ulong), - ('Energy', ctypes.c_ulong), - ('ReceivedSalary', ctypes.c_ulong), - ('EquipShowSwitch', ctypes.c_ulong), - ('LuckValue', ctypes.c_ushort), - ('ExAttr1', ctypes.c_ulong), - ('ExAttr2', ctypes.c_ulong), - ('ExAttr3', ctypes.c_ulong), - ('ExAttr4', ctypes.c_ulong), - ('ExAttr5', ctypes.c_ulong), - ('Faction', ctypes.c_int), - ('InfamyValue', ctypes.c_ulong), - ('OfficialRank', ctypes.c_ubyte), - ('IsFindByLabel', ctypes.c_ubyte), - ('IsCloseFriendLabel', ctypes.c_ubyte), - ('ChangeCoinPointTotal', ctypes.c_ulong), - ('VIPLv', ctypes.c_ubyte), - ('VIPLvForPhone', ctypes.c_ubyte), - ('PhoneVIPStartTime', ctypes.c_double), - ('PhoneVIPEndTime', ctypes.c_double), - ('VsRoomId', ctypes.c_ulong), - ('ExAttr6', ctypes.c_ulong), - ('ExAttr7', ctypes.c_ulong), - ('ExAttr8', ctypes.c_ulong), - ('ExAttr9', ctypes.c_ulong), - ('ExAttr10', ctypes.c_ulong), - ('ModelMark', ctypes.c_ulong), - ('FromDataMapID', ctypes.c_ulong), - ('LastOrderId', ctypes.c_char * 40), - ('PrizeCoin', ctypes.c_ulong), - ('ExAttr11', ctypes.c_ulong), - ('ExAttr12', ctypes.c_ulong), - ('ExAttr13', ctypes.c_ulong), - ('ExAttr14', ctypes.c_ulong), - ('CreateRoleTime', ctypes.c_char * 30), - ('LVEx', ctypes.c_ushort), - ('LV2', ctypes.c_ushort), - ('ExpPoint', ctypes.c_ulong), - ('OperateInfo', ctypes.c_ulong), - ('Operate', ctypes.c_char * 15), - ('ServerID', ctypes.c_ulong), - ('ExAttr15', ctypes.c_ulong), - ('ExAttr16', ctypes.c_ulong), - ('ExAttr17', ctypes.c_ulong), - ('ExAttr18', ctypes.c_ulong), - ('ExAttr19', ctypes.c_ulong), - ('ExAttr20', ctypes.c_ulong), - ('HPEx', ctypes.c_ulong), - ('FightPowerEx', ctypes.c_ulong), - ('ADOResult', ctypes.c_ulong), - ] - - def __init__(self): - Structure.__init__(self) - self.clear() - - - def clear(self): - memset(addressof(self), 0, self.getLength()) - - def readData(self, buf, pos = 0, length = 0): - if not pos <= length: - return -1 - if len(buf) < pos + self.getLength(): - return -1 - self.clear() - self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos) - self.AccID, pos = CommFunc.ReadString(buf, pos, 65) - self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33) - self.AccState, pos = CommFunc.ReadBYTE(buf, pos) - self.IsDeleted, pos = CommFunc.ReadBYTE(buf, pos) - self.GMLevel, pos = CommFunc.ReadBYTE(buf, pos) - self.Sex, pos = CommFunc.ReadDWORD(buf, pos) - self.Hair, pos = CommFunc.ReadDWORD(buf, pos) - self.HairColor, pos = CommFunc.ReadDWORD(buf, pos) - self.Face, pos = CommFunc.ReadDWORD(buf, pos) - self.FacePic, pos = CommFunc.ReadDWORD(buf, pos) - self.Job, pos = CommFunc.ReadDWORD(buf, pos) - self.RoleType, pos = CommFunc.ReadDWORD(buf, pos) - self.ReincarnationLv, pos = CommFunc.ReadWORD(buf, pos) - self.LV, pos = CommFunc.ReadDWORD(buf, pos) - self.TotalExp, pos = CommFunc.ReadDWORD(buf, pos) - self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos) - self.FamilyName, pos = CommFunc.ReadString(buf, pos, 33) - self.Country, pos = CommFunc.ReadDWORD(buf, pos) - self.TeamHornor, pos = CommFunc.ReadDWORD(buf, pos) - self.FamilyHornor, pos = CommFunc.ReadDWORD(buf, pos) - self.FamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos) - self.LastWeekFamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos) - self.CountryHornor, pos = CommFunc.ReadDWORD(buf, pos) - self.CountryLastWeekHornor, pos = CommFunc.ReadDWORD(buf, pos) - self.Mate, pos = CommFunc.ReadDWORD(buf, pos) - self.Gold, pos = CommFunc.ReadDWORD(buf, pos) - self.GoldPaper, pos = CommFunc.ReadDWORD(buf, pos) - self.Silver, pos = CommFunc.ReadDWORD(buf, pos) - self.SilverPaper, pos = CommFunc.ReadDWORD(buf, pos) - self.FightPoint, pos = CommFunc.ReadDWORD(buf, pos) - self.HappyPoint, pos = CommFunc.ReadDWORD(buf, pos) - self.MapID, pos = CommFunc.ReadDWORD(buf, pos) - self.DataMapID, pos = CommFunc.ReadDWORD(buf, pos) - self.CopyMapID, pos = CommFunc.ReadDWORD(buf, pos) - self.PosX, pos = CommFunc.ReadWORD(buf, pos) - self.PosY, pos = CommFunc.ReadWORD(buf, pos) - self.FromMapID, pos = CommFunc.ReadDWORD(buf, pos) - self.FromCopyMapID, pos = CommFunc.ReadDWORD(buf, pos) - self.FromPosX, pos = CommFunc.ReadWORD(buf, pos) - self.FromPosY, pos = CommFunc.ReadWORD(buf, pos) - self.State, pos = CommFunc.ReadDWORD(buf, pos) - self.HP, pos = CommFunc.ReadDWORD(buf, pos) - self.MP, pos = CommFunc.ReadDWORD(buf, pos) - self.XP, pos = CommFunc.ReadDWORD(buf, pos) - self.HPRestoreSetting, pos = CommFunc.ReadWORD(buf, pos) - self.MPRestoreSetting, pos = CommFunc.ReadWORD(buf, pos) - self.FreePoint, pos = CommFunc.ReadDWORD(buf, pos) - self.FreeSkillPoint, pos = CommFunc.ReadDWORD(buf, pos) - self.STR, pos = CommFunc.ReadDWORD(buf, pos) - self.PNE, pos = CommFunc.ReadDWORD(buf, pos) - self.PHY, pos = CommFunc.ReadDWORD(buf, pos) - self.CON, pos = CommFunc.ReadDWORD(buf, pos) - self.TotalSTR, pos = CommFunc.ReadDWORD(buf, pos) - self.TotalPNE, pos = CommFunc.ReadDWORD(buf, pos) - self.TotalPHY, pos = CommFunc.ReadDWORD(buf, pos) - self.TotalCON, pos = CommFunc.ReadDWORD(buf, pos) - self.Setting, pos = CommFunc.ReadString(buf, pos, 100) - self.PKValue, pos = CommFunc.ReadWORD(buf, pos) - self.FightPower, pos = CommFunc.ReadDWORD(buf, pos) - self.ActiveValue, pos = CommFunc.ReadWORD(buf, pos) - self.PlayerType, pos = CommFunc.ReadBYTE(buf, pos) - self.BackpackLV, pos = CommFunc.ReadBYTE(buf, pos) - self.WarehouseLV, pos = CommFunc.ReadBYTE(buf, pos) - self.HaveWarehousePsw, pos = CommFunc.ReadBYTE(buf, pos) - self.WarehousePsw, pos = CommFunc.ReadString(buf, pos, 15) - self.WarehouseLocked, pos = CommFunc.ReadBYTE(buf, pos) - self.WarehouseGold, pos = CommFunc.ReadDWORD(buf, pos) - self.WarehouseSilver, pos = CommFunc.ReadDWORD(buf, pos) - self.TeamID, pos = CommFunc.ReadDWORD(buf, pos) - self.UseGoldType, pos = CommFunc.ReadBYTE(buf, pos) - self.UseSilverType, pos = CommFunc.ReadBYTE(buf, pos) - self.AttackMode, pos = CommFunc.ReadBYTE(buf, pos) - self.RebornMapID, pos = CommFunc.ReadWORD(buf, pos) - self.RebornPosX, pos = CommFunc.ReadWORD(buf, pos) - self.RebornPosY, pos = CommFunc.ReadWORD(buf, pos) - self.WeekOnlineTime, pos = CommFunc.ReadDWORD(buf, pos) - self.LastWeekOnlineTime, pos = CommFunc.ReadDWORD(buf, pos) - self.LogoffTime, pos = CommFunc.ReadString(buf, pos, 30) - self.IsHideMask, pos = CommFunc.ReadBYTE(buf, pos) - self.DayProcessGameEventCount, pos = CommFunc.ReadDWORD(buf, pos) - self.LoginIP, pos = CommFunc.ReadString(buf, pos, 20) - self.LoginTime, pos = CommFunc.ReadString(buf, pos, 30) - self.OnlineTime, pos = CommFunc.ReadDWORD(buf, pos) - self.FriendFavor, pos = CommFunc.ReadDWORD(buf, pos) - self.TeamPrivity, pos = CommFunc.ReadDWORD(buf, pos) - self.OfflineMinutes, pos = CommFunc.ReadDWORD(buf, pos) - self.Energy, pos = CommFunc.ReadDWORD(buf, pos) - self.ReceivedSalary, pos = CommFunc.ReadDWORD(buf, pos) - self.EquipShowSwitch, pos = CommFunc.ReadDWORD(buf, pos) - self.LuckValue, pos = CommFunc.ReadWORD(buf, pos) - self.ExAttr1, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr2, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr3, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr4, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr5, pos = CommFunc.ReadDWORD(buf, pos) - self.Faction, pos = CommFunc.ReadDWORD(buf, pos) - self.InfamyValue, pos = CommFunc.ReadDWORD(buf, pos) - self.OfficialRank, pos = CommFunc.ReadBYTE(buf, pos) - self.IsFindByLabel, pos = CommFunc.ReadBYTE(buf, pos) - self.IsCloseFriendLabel, pos = CommFunc.ReadBYTE(buf, pos) - self.ChangeCoinPointTotal, pos = CommFunc.ReadDWORD(buf, pos) - self.VIPLv, pos = CommFunc.ReadBYTE(buf, pos) - self.VIPLvForPhone, pos = CommFunc.ReadBYTE(buf, pos) - self.PhoneVIPStartTime, pos = CommFunc.ReadDouble(buf, pos) - self.PhoneVIPEndTime, pos = CommFunc.ReadDouble(buf, pos) - self.VsRoomId, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr6, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr7, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr8, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr9, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr10, pos = CommFunc.ReadDWORD(buf, pos) - self.ModelMark, pos = CommFunc.ReadDWORD(buf, pos) - self.FromDataMapID, pos = CommFunc.ReadDWORD(buf, pos) - self.LastOrderId, pos = CommFunc.ReadString(buf, pos, 40) - self.PrizeCoin, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr11, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr12, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr13, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr14, pos = CommFunc.ReadDWORD(buf, pos) - self.CreateRoleTime, pos = CommFunc.ReadString(buf, pos, 30) - self.LVEx, pos = CommFunc.ReadWORD(buf, pos) - self.LV2, pos = CommFunc.ReadWORD(buf, pos) - self.ExpPoint, pos = CommFunc.ReadDWORD(buf, pos) - self.OperateInfo, pos = CommFunc.ReadDWORD(buf, pos) - self.Operate, pos = CommFunc.ReadString(buf, pos, 15) - self.ServerID, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr15, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr16, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr17, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr18, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr19, pos = CommFunc.ReadDWORD(buf, pos) - self.ExAttr20, pos = CommFunc.ReadDWORD(buf, pos) - self.HPEx, pos = CommFunc.ReadDWORD(buf, pos) - self.FightPowerEx, pos = CommFunc.ReadDWORD(buf, pos) - return self.getLength() - - - def getBuffer(self): - buf = create_string_buffer(self.getLength()) - memmove(addressof(buf), addressof(self), self.getLength()) - return string_at(addressof(buf), self.getLength()) - - def getLength(self): - return sizeof(tagDBPlayer) - - def outputString(self): - output = '''//玩家详细信息#tagDBPlayer: - PlayerID = %s, - AccID = %s, - PlayerName = %s, - AccState = %s, - IsDeleted = %s, - GMLevel = %s, - Sex = %s, - Hair = %s, - HairColor = %s, - Face = %s, - FacePic = %s, - Job = %s, - RoleType = %s, - ReincarnationLv = %s, - LV = %s, - TotalExp = %s, - FamilyID = %s, - FamilyName = %s, - Country = %s, - TeamHornor = %s, - FamilyHornor = %s, - FamilyActiveValue = %s, - LastWeekFamilyActiveValue = %s, - CountryHornor = %s, - CountryLastWeekHornor = %s, - Mate = %s, - Gold = %s, - GoldPaper = %s, - Silver = %s, - SilverPaper = %s, - FightPoint = %s, - HappyPoint = %s, - MapID = %s, - DataMapID = %s, - CopyMapID = %s, - PosX = %s, - PosY = %s, - FromMapID = %s, - FromCopyMapID = %s, - FromPosX = %s, - FromPosY = %s, - State = %s, - HP = %s, - MP = %s, - XP = %s, - HPRestoreSetting = %s, - MPRestoreSetting = %s, - FreePoint = %s, - FreeSkillPoint = %s, - STR = %s, - PNE = %s, - PHY = %s, - CON = %s, - TotalSTR = %s, - TotalPNE = %s, - TotalPHY = %s, - TotalCON = %s, - Setting = %s, - PKValue = %s, - FightPower = %s, - ActiveValue = %s, - PlayerType = %s, - BackpackLV = %s, - WarehouseLV = %s, - HaveWarehousePsw = %s, - WarehousePsw = %s, - WarehouseLocked = %s, - WarehouseGold = %s, - WarehouseSilver = %s, - TeamID = %s, - UseGoldType = %s, - UseSilverType = %s, - AttackMode = %s, - RebornMapID = %s, - RebornPosX = %s, - RebornPosY = %s, - WeekOnlineTime = %s, - LastWeekOnlineTime = %s, - LogoffTime = %s, - IsHideMask = %s, - DayProcessGameEventCount = %s, - LoginIP = %s, - LoginTime = %s, - OnlineTime = %s, - FriendFavor = %s, - TeamPrivity = %s, - OfflineMinutes = %s, - Energy = %s, - ReceivedSalary = %s, - EquipShowSwitch = %s, - LuckValue = %s, - ExAttr1 = %s, - ExAttr2 = %s, - ExAttr3 = %s, - ExAttr4 = %s, - ExAttr5 = %s, - Faction = %s, - InfamyValue = %s, - OfficialRank = %s, - IsFindByLabel = %s, - IsCloseFriendLabel = %s, - ChangeCoinPointTotal = %s, - VIPLv = %s, - VIPLvForPhone = %s, - PhoneVIPStartTime = %s, - PhoneVIPEndTime = %s, - VsRoomId = %s, - ExAttr6 = %s, - ExAttr7 = %s, - ExAttr8 = %s, - ExAttr9 = %s, - ExAttr10 = %s, - ModelMark = %s, - FromDataMapID = %s, - LastOrderId = %s, - PrizeCoin = %s, - ExAttr11 = %s, - ExAttr12 = %s, - ExAttr13 = %s, - ExAttr14 = %s, - CreateRoleTime = %s, - LVEx = %s, - LV2 = %s, - ExpPoint = %s, - OperateInfo = %s, - Operate = %s, - ServerID = %s, - ExAttr15 = %s, - ExAttr16 = %s, - ExAttr17 = %s, - ExAttr18 = %s, - ExAttr19 = %s, - ExAttr20 = %s, - HPEx = %s, - FightPowerEx = %s, - ADOResult = %s, - '''%( - self.PlayerID, - self.AccID, - self.PlayerName, - self.AccState, - self.IsDeleted, - self.GMLevel, - self.Sex, - self.Hair, - self.HairColor, - self.Face, - self.FacePic, - self.Job, - self.RoleType, - self.ReincarnationLv, - self.LV, - self.TotalExp, - self.FamilyID, - self.FamilyName, - self.Country, - self.TeamHornor, - self.FamilyHornor, - self.FamilyActiveValue, - self.LastWeekFamilyActiveValue, - self.CountryHornor, - self.CountryLastWeekHornor, - self.Mate, - self.Gold, - self.GoldPaper, - self.Silver, - self.SilverPaper, - self.FightPoint, - self.HappyPoint, - self.MapID, - self.DataMapID, - self.CopyMapID, - self.PosX, - self.PosY, - self.FromMapID, - self.FromCopyMapID, - self.FromPosX, - self.FromPosY, - self.State, - self.HP, - self.MP, - self.XP, - self.HPRestoreSetting, - self.MPRestoreSetting, - self.FreePoint, - self.FreeSkillPoint, - self.STR, - self.PNE, - self.PHY, - self.CON, - self.TotalSTR, - self.TotalPNE, - self.TotalPHY, - self.TotalCON, - self.Setting, - self.PKValue, - self.FightPower, - self.ActiveValue, - self.PlayerType, - self.BackpackLV, - self.WarehouseLV, - self.HaveWarehousePsw, - self.WarehousePsw, - self.WarehouseLocked, - self.WarehouseGold, - self.WarehouseSilver, - self.TeamID, - self.UseGoldType, - self.UseSilverType, - self.AttackMode, - self.RebornMapID, - self.RebornPosX, - self.RebornPosY, - self.WeekOnlineTime, - self.LastWeekOnlineTime, - self.LogoffTime, - self.IsHideMask, - self.DayProcessGameEventCount, - self.LoginIP, - self.LoginTime, - self.OnlineTime, - self.FriendFavor, - self.TeamPrivity, - self.OfflineMinutes, - self.Energy, - self.ReceivedSalary, - self.EquipShowSwitch, - self.LuckValue, - self.ExAttr1, - self.ExAttr2, - self.ExAttr3, - self.ExAttr4, - self.ExAttr5, - self.Faction, - self.InfamyValue, - self.OfficialRank, - self.IsFindByLabel, - self.IsCloseFriendLabel, - self.ChangeCoinPointTotal, - self.VIPLv, - self.VIPLvForPhone, - self.PhoneVIPStartTime, - self.PhoneVIPEndTime, - self.VsRoomId, - self.ExAttr6, - self.ExAttr7, - self.ExAttr8, - self.ExAttr9, - self.ExAttr10, - self.ModelMark, - self.FromDataMapID, - self.LastOrderId, - self.PrizeCoin, - self.ExAttr11, - self.ExAttr12, - self.ExAttr13, - self.ExAttr14, - self.CreateRoleTime, - self.LVEx, - self.LV2, - self.ExpPoint, - self.OperateInfo, - self.Operate, - self.ServerID, - self.ExAttr15, - self.ExAttr16, - self.ExAttr17, - self.ExAttr18, - self.ExAttr19, - self.ExAttr20, - self.HPEx, - self.FightPowerEx, - self.ADOResult, - ) - return output - - #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错 - def SetAccID(self,Str): - if len(Str)<=65: - self.AccID = Str - else: - self.AccID = Str[:65] - - def SetPlayerName(self,Str): - if len(Str)<=33: - self.PlayerName = Str - else: - self.PlayerName = Str[:33] - - def SetFamilyName(self,Str): - if len(Str)<=33: - self.FamilyName = Str - else: - self.FamilyName = Str[:33] - - def SetSetting(self,Str): - if len(Str)<=100: - self.Setting = Str - else: - self.Setting = Str[:100] - - def SetWarehousePsw(self,Str): - if len(Str)<=15: - self.WarehousePsw = Str - else: - self.WarehousePsw = Str[:15] - - def SetLogoffTime(self,Str): - if len(Str)<=30: - self.LogoffTime = Str - else: - self.LogoffTime = Str[:30] - - def SetLoginIP(self,Str): - if len(Str)<=20: - self.LoginIP = Str - else: - self.LoginIP = Str[:20] - - def SetLoginTime(self,Str): - if len(Str)<=30: - self.LoginTime = Str - else: - self.LoginTime = Str[:30] - - def SetLastOrderId(self,Str): - if len(Str)<=40: - self.LastOrderId = Str - else: - self.LastOrderId = Str[:40] - - def SetCreateRoleTime(self,Str): - if len(Str)<=30: - self.CreateRoleTime = Str - else: - self.CreateRoleTime = Str[:30] - - def SetOperate(self,Str): - if len(Str)<=15: - self.Operate = Str - else: - self.Operate = Str[:15] - - \ No newline at end of file diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py index 12d464c..c6b2c9a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py @@ -38,6 +38,14 @@ #支持超20亿数值的数值点单位数值, 1亿 Def_PerPointValue = 100000000 +#假玩家ID +FackPlayerIDStart = 1 +FackPlayerIDMax = 9999 + +#假仙盟ID +FackFamilyIDStart = 1 +FackFamilyIDMax = 9999 + #---刀剑笑, 特殊事件枚举--- ( TYPE_Event_MakeItem, #///<= 1, 开始打造 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini index 35cf95a..55716ea 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/ServerScript.ini @@ -115,20 +115,6 @@ PacketSubCMD_11=0x5 PacketCallFunc_11=GameServer_PlayerCoinToGold -[PlayerFamily] -ScriptName = Player\PlayerFamily.py -Writer = eggxp -Releaser = eggxp -RegType = 0 -RegisterPackCount = 2 -PacketCMD_1=0x5 -PacketSubCMD_1=0x1 -PacketCallFunc_1=GameServer_FamilyRefresh - -PacketCMD_2=0x8 -PacketSubCMD_2=0x4 -PacketCallFunc_2=GameServer_RequestFamilyWar - [PlayerFriend] ScriptName = Player\PlayerFriend.py Writer = eggxp -- Gitblit v1.8.0