10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(增加查看其他指定仙盟/跨服仙盟支持;增加领取点赞奖励;修改仙盟轮次伤害计算规则受当前城池剩余生命影响;)
| | |
| | | Writer = Alee
|
| | | Releaser = Alee
|
| | | RegType = 0
|
| | | RegisterPackCount = 10
|
| | | RegisterPackCount = 11
|
| | |
|
| | | PacketCMD_1=0xA4
|
| | | PacketSubCMD_1=0x01
|
| | |
| | | PacketSubCMD_10=0x13
|
| | | PacketCallFunc_10=OnChangeFamilyEmblem
|
| | |
|
| | | PacketCMD_11=0xA4
|
| | | PacketSubCMD_11=0x14
|
| | | PacketCallFunc_11=OnViewTagFamily
|
| | |
|
| | | [GameWorldFamilyWar]
|
| | | ScriptName = GameWorldLogic\GameWorldFamilyWar.py
|
| | | Writer = hxp
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A4 14 查看目标仙盟 #tagCGViewTagFamily
|
| | |
|
| | | class tagCGViewTagFamily(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("TagFamilyID", c_int), # 目标仙盟ID,支持查看跨服仙盟
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xA4
|
| | | self.SubCmd = 0x14
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xA4
|
| | | self.SubCmd = 0x14
|
| | | self.TagFamilyID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCGViewTagFamily)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A4 14 查看目标仙盟 //tagCGViewTagFamily:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | TagFamilyID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.TagFamilyID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCGViewTagFamily=tagCGViewTagFamily()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGViewTagFamily.Cmd,m_NAtagCGViewTagFamily.SubCmd))] = m_NAtagCGViewTagFamily
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 03 关注BOSS刷新 #tagCGAttentionBoss
|
| | |
|
| | | class tagCGAttentionBoss(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A4 13 查看目标仙盟返回信息 #tagGCTagFamilyInfo
|
| | |
|
| | | class tagGCTagFamilyMember(Structure):
|
| | | PlayerID = 0 #(DWORD PlayerID)
|
| | | NameLen = 0 #(BYTE NameLen)
|
| | | Name = "" #(String Name)//size = NameLen
|
| | | FamilyLV = 0 #(BYTE FamilyLV)//家族成员等级
|
| | | LV = 0 #(WORD LV)
|
| | | Job = 0 #(BYTE Job)//ְҵ
|
| | | Face = 0 #(DWORD Face)//头像
|
| | | FacePic = 0 #(DWORD FacePic)//头像外框
|
| | | OfficialRank = 0 #(BYTE OfficialRank)//境界
|
| | | FightPower = 0 #(DWORD FightPower)//成员战力,求余亿部分
|
| | | FightPowerEx = 0 #(DWORD FightPowerEx)//成员战力,整除亿部分
|
| | | 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.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.OfficialRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.PlayerID = 0
|
| | | self.NameLen = 0
|
| | | self.Name = ""
|
| | | self.FamilyLV = 0
|
| | | self.LV = 0
|
| | | self.Job = 0
|
| | | self.Face = 0
|
| | | self.FacePic = 0
|
| | | self.OfficialRank = 0
|
| | | self.FightPower = 0
|
| | | self.FightPowerEx = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 4
|
| | | length += 1
|
| | | length += len(self.Name)
|
| | | length += 1
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 4
|
| | | length += 1
|
| | | 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.WriteBYTE(data, self.FamilyLV)
|
| | | data = CommFunc.WriteWORD(data, self.LV)
|
| | | data = CommFunc.WriteBYTE(data, self.Job)
|
| | | data = CommFunc.WriteDWORD(data, self.Face)
|
| | | data = CommFunc.WriteDWORD(data, self.FacePic)
|
| | | data = CommFunc.WriteBYTE(data, self.OfficialRank)
|
| | | data = CommFunc.WriteDWORD(data, self.FightPower)
|
| | | data = CommFunc.WriteDWORD(data, self.FightPowerEx)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | PlayerID:%d,
|
| | | NameLen:%d,
|
| | | Name:%s,
|
| | | FamilyLV:%d,
|
| | | LV:%d,
|
| | | Job:%d,
|
| | | Face:%d,
|
| | | FacePic:%d,
|
| | | OfficialRank:%d,
|
| | | FightPower:%d,
|
| | | FightPowerEx:%d
|
| | | '''\
|
| | | %(
|
| | | self.PlayerID,
|
| | | self.NameLen,
|
| | | self.Name,
|
| | | self.FamilyLV,
|
| | | self.LV,
|
| | | self.Job,
|
| | | self.Face,
|
| | | self.FacePic,
|
| | | self.OfficialRank,
|
| | | self.FightPower,
|
| | | self.FightPowerEx
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCTagFamilyInfo(Structure):
|
| | | Head = tagHead()
|
| | | FamilyID = 0 #(DWORD FamilyID)
|
| | | FamilyName = "" #(char FamilyName[33])//家族名称
|
| | | FamilyLV = 0 #(WORD FamilyLV)//家族等级
|
| | | BroadcastLen = 0 #(WORD BroadcastLen)//公告
|
| | | Broadcast = "" #(String Broadcast)//size = BroadcastLen
|
| | | MemberCount = 0 #(WORD MemberCount)//人数
|
| | | Member = list() #(vector<tagGCTagFamilyMember> Member)//size = MemberCount
|
| | | FightPower = 0 #(DWORD FightPower)//仙盟总战力,求余亿部分
|
| | | FightPowerEx = 0 #(DWORD FightPowerEx)//仙盟总战力,整除亿部分
|
| | | EmblemID = 0 #(DWORD EmblemID)//徽章ID
|
| | | ServerID = 0 #(DWORD ServerID)//仙盟区服ID
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA4
|
| | | self.Head.SubCmd = 0x13
|
| | | 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.ReadWORD(_lpData, _pos)
|
| | | self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen)
|
| | | self.MemberCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.MemberCount):
|
| | | temMember = tagGCTagFamilyMember()
|
| | | _pos = temMember.ReadData(_lpData, _pos)
|
| | | self.Member.append(temMember)
|
| | | self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA4
|
| | | self.Head.SubCmd = 0x13
|
| | | self.FamilyID = 0
|
| | | self.FamilyName = ""
|
| | | self.FamilyLV = 0
|
| | | self.BroadcastLen = 0
|
| | | self.Broadcast = ""
|
| | | self.MemberCount = 0
|
| | | self.Member = list()
|
| | | self.FightPower = 0
|
| | | self.FightPowerEx = 0
|
| | | self.EmblemID = 0
|
| | | self.ServerID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 33
|
| | | length += 2
|
| | | length += 2
|
| | | length += len(self.Broadcast)
|
| | | length += 2
|
| | | for i in range(self.MemberCount):
|
| | | length += self.Member[i].GetLength()
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | |
|
| | | 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.WriteWORD(data, self.FamilyLV)
|
| | | data = CommFunc.WriteWORD(data, self.BroadcastLen)
|
| | | data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast)
|
| | | data = CommFunc.WriteWORD(data, self.MemberCount)
|
| | | for i in range(self.MemberCount):
|
| | | data = CommFunc.WriteString(data, self.Member[i].GetLength(), self.Member[i].GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.FightPower)
|
| | | data = CommFunc.WriteDWORD(data, self.FightPowerEx)
|
| | | data = CommFunc.WriteDWORD(data, self.EmblemID)
|
| | | data = CommFunc.WriteDWORD(data, self.ServerID)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | FamilyID:%d,
|
| | | FamilyName:%s,
|
| | | FamilyLV:%d,
|
| | | BroadcastLen:%d,
|
| | | Broadcast:%s,
|
| | | MemberCount:%d,
|
| | | Member:%s,
|
| | | FightPower:%d,
|
| | | FightPowerEx:%d,
|
| | | EmblemID:%d,
|
| | | ServerID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.FamilyID,
|
| | | self.FamilyName,
|
| | | self.FamilyLV,
|
| | | self.BroadcastLen,
|
| | | self.Broadcast,
|
| | | self.MemberCount,
|
| | | "...",
|
| | | self.FightPower,
|
| | | self.FightPowerEx,
|
| | | self.EmblemID,
|
| | | self.ServerID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGCTagFamilyInfo=tagGCTagFamilyInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTagFamilyInfo.Head.Cmd,m_NAtagGCTagFamilyInfo.Head.SubCmd))] = m_NAtagGCTagFamilyInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #A4 01 查看申请入会的玩家信息 #tagGCViewFamilyRequestInfo
|
| | |
|
| | | class tagtMemberInfo(Structure):
|
| | |
| | | AwwardType_Guess, # 竞猜
|
| | | AwwardType_PlayerHurt, # 个人伤害排行
|
| | | AwwardType_FamilyScore, # 仙盟积分排行
|
| | | ) = range(3)
|
| | | AwwardType_Like, # 点赞
|
| | | ) = range(4)
|
| | |
|
| | |
|
| | | class FamilyGCZFighter(object):
|
| | |
| | | value5 = joinFamily.serverID
|
| | | groupValue1 = joinFamily.zoneID
|
| | | groupValue2 = GetRoundHurtGroupID(joinFamily.batType, joinFamily.groupNum)
|
| | | roundTotalHurt = sum(joinFamily.cityWall.fighterHurtDict.values())
|
| | | cmpValue = roundTotalHurt / ChConfig.Def_PerPointValue
|
| | | cmpValue2 = roundTotalHurt % ChConfig.Def_PerPointValue
|
| | | memHurtTotal = sum(joinFamily.cityWall.fighterHurtDict.values())
|
| | | cityRemainHPPer = joinFamily.cityWall.hp / float(joinFamily.cityWall.hpMax)
|
| | | familyRoundHurt = eval(IpyGameDataPY.GetFuncCompileCfg("FamilyGCZCity", 3))
|
| | | GameWorld.DebugLog("计算仙盟轮次伤害榜值: familyID=%s,familyRoundHurt=%s,memHurtTotal=%s,cityRemainHPPer=%s, %s/%s" |
| | | % (dataID, familyRoundHurt, memHurtTotal, cityRemainHPPer, joinFamily.cityWall.hp, joinFamily.cityWall.hpMax))
|
| | | cmpValue = familyRoundHurt / ChConfig.Def_PerPointValue
|
| | | cmpValue2 = familyRoundHurt % ChConfig.Def_PerPointValue
|
| | | cmpValue3 = joinFamily.sortWeight
|
| | | CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_FamilyGCZRoundHurt, groupValue1, dataID, name1, name2, type2, value1, value2,
|
| | | cmpValue, cmpValue2, cmpValue3, groupValue2=groupValue2, id2=id2, autoSort=True, value3=value3, value5=value5)
|
| | |
| | | % (remainHurtTotal, killCnt, curCity.atkReportDict, tagCity.defReportDict))
|
| | |
|
| | | GameWorld.DebugLog("cityHP=%s/%s,atkedGuardIDList=%s" % (tagCity.hp, tagCity.hpMax, atkedGuardIDList))
|
| | | |
| | | if tagFamilyID:
|
| | | tagJoinFamily = zone.GetZoneJoinFamily(tagFamilyID)
|
| | | if tagJoinFamily:
|
| | | UndFamilyRoundHurtBillboard(tagJoinFamily) # 榜单伤害受城池血量影响,所以被攻击方也要更新榜单
|
| | | |
| | | for memID, memHurt in memHurtDict.items():
|
| | | GameWorld.DebugLog("攻击方成员输出: memID=%s,%s" % (memID, memHurt))
|
| | | joinMember = zone.GetZoneJoinMember(memID)
|
| | |
| | |
|
| | | if not curCity.IsBroken():
|
| | | UndFamilyRoundHurtBillboard(curJoinFamily)
|
| | | else:
|
| | | GameWorld.DebugLog(" 攻击方仙盟城池已被摧毁,不再累加本轮仙盟伤害榜值! familyID=%s" % curFamilyID)
|
| | |
|
| | | if not CheckXiuluoCity(zoneID, curRound, batType, groupNum, gmPlayerID):
|
| | | Sync_FamilyGCZBatSceneInfo(zoneID, batType, groupNum)
|
| | |
| | | hurtDict[tagCityID] = oneHurtTotal # 飘血按伤害
|
| | | # 通知被攻击盟成员大本营城池信息
|
| | | if tagCity.familyID:
|
| | | tagJoinFamily = zone.GetZoneJoinFamily(tagCity.familyID)
|
| | | if tagJoinFamily:
|
| | | UndFamilyRoundHurtBillboard(tagJoinFamily) # 榜单伤害受城池血量影响,所以被攻击方也要更新榜单
|
| | | Sync_FamilyGCZCampInfo(zoneID, tagCity.familyID, defMemIDList=atkedGuardIDList)
|
| | | Sync_FamilyGCZBatCityInfo(zoneID, batType, groupNum, tagCityID, AtkRet_OK, playerID, oneHurtTotal, killCnt)
|
| | |
|
| | |
| | | # 竞猜
|
| | | if awardType == AwwardType_Guess:
|
| | | awardTemplateID = ipyDataInfo.get("GuessTemplateID", 0)
|
| | | __clientServer_GetAward_Guess(zoneID, playerID, serverGroupID, actID, state, awardType, awardTemplateID)
|
| | | playerAwardID, awardItemList = GetGuessAwardInfo(zoneID, state, awardTemplateID, playerID)
|
| | | if not awardItemList:
|
| | | GameWorld.ErrLog("仙盟攻城战玩家没有竞猜奖励! zoneID=%s" % (zoneID), playerID)
|
| | | return
|
| | | __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, playerAwardID, awardItemList)
|
| | | return
|
| | |
|
| | | gczMgr = GetFamilyGCZMgr()
|
| | |
| | | billboardType = ShareDefine.Def_CBT_FamilyGCZScore
|
| | | awardTemplateID = ipyDataInfo.get("FamilyTemplateID", 0)
|
| | |
|
| | | # 点赞奖励
|
| | | elif awardType == AwwardType_Like:
|
| | | awardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZGuess", 4)
|
| | | __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, 0, awardItemList)
|
| | | return
|
| | | |
| | | else:
|
| | | return
|
| | |
|
| | |
| | | if not playerAwardItemList:
|
| | | return
|
| | |
|
| | | GameWorld.Log("仙盟攻城战玩家请求领取奖励! zoneID=%s,awardType=%s,playerAwardItemList=%s" |
| | | % (zoneID, awardType, playerAwardItemList), playerID)
|
| | | |
| | | joinMember.awardState = joinMember.awardState | pow(2, awardType) # 标记已推送
|
| | | msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":billRank, |
| | | "awardItemList":playerAwardItemList, "fmLV":fmLV}
|
| | | Send_CrossServerMsg_FamilyGCZ("FamilyGCZAward", msgInfo, [serverGroupID])
|
| | | __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, billRank, playerAwardItemList)
|
| | | return
|
| | |
|
| | | def __clientServer_GetAward_Guess(zoneID, playerID, serverGroupID, actID, state, awardType, guessTemplateID):
|
| | | ## 竞猜领奖
|
| | | playerAwardID, awardItemList = GetGuessAwardInfo(zoneID, state, guessTemplateID, playerID)
|
| | | if not awardItemList:
|
| | | GameWorld.ErrLog("仙盟攻城战玩家没有竞猜奖励! zoneID=%s" % (zoneID), playerID)
|
| | | return
|
| | | GameWorld.Log("仙盟攻城战玩家请求领取竞猜奖励! zoneID=%s,playerAwardID=%s,awardItemList=%s" |
| | | % (zoneID, playerAwardID, awardItemList), playerID)
|
| | | |
| | | def __clientServer_GetAward_Ret(zoneID, playerID, serverGroupID, actID, awardType, awardValue, awardItemList):
|
| | | ## 同步子服领奖结果
|
| | | gczMgr = GetFamilyGCZMgr()
|
| | | zone = gczMgr.GetActZone(zoneID)
|
| | | joinMember = zone.GetZoneJoinMember(playerID)
|
| | | fmLV = 0
|
| | | if joinMember:
|
| | | fmLV = joinMember.fmLV
|
| | | joinMember.awardState = joinMember.awardState | pow(2, awardType) # 标记已推送
|
| | | msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":playerAwardID, "awardItemList":awardItemList}
|
| | | GameWorld.Log("仙盟攻城战玩家请求领取奖励! zoneID=%s,awardType=%s,awardValue=%s,awardItemList=%s" |
| | | % (zoneID, awardType, awardValue, awardItemList), playerID)
|
| | | msgInfo = {"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardValue":awardValue, |
| | | "awardItemList":awardItemList, "fmLV":fmLV}
|
| | | Send_CrossServerMsg_FamilyGCZ("FamilyGCZAward", msgInfo, [serverGroupID])
|
| | | return
|
| | |
|
| | |
| | | elif msgType == ShareDefine.ClientServerMsg_SyncFamilyInfo:
|
| | | PlayerFamily.ClientServerMsg_SyncFamilyInfo(serverGroupID, msgData)
|
| | |
|
| | | elif msgType == ShareDefine.ClientServerMsg_QueryCrossFamily:
|
| | | PlayerFamily.ClientServerMsg_QueryCrossFamily(serverGroupID, msgData)
|
| | | |
| | | elif msgType == ShareDefine.ClientServerMsg_FamilyGCZ:
|
| | | CrossFamilyGCZ.ClientServerMsg_FamilyGCZ(serverGroupID, msgData)
|
| | |
|
| | |
| | | PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID)
|
| | | return
|
| | |
|
| | | #// A4 14 查看目标仙盟 #tagCGViewTagFamily
|
| | | #
|
| | | #struct tagCGViewTagFamily
|
| | | #{
|
| | | # tagHead Head;
|
| | | # DWORD TagFamilyID; // 目标仙盟ID,支持查看跨服仙盟
|
| | | #};
|
| | | def OnViewTagFamily(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | tagFamilyID = clientData.TagFamilyID
|
| | | clientPack = __GetTagFamilyInfoPack(tagFamilyID)
|
| | | if not clientPack:
|
| | | # 发送跨服服务器查询,可能是跨服仙盟
|
| | | dataMsg = {"playerID":playerID, "tagFamilyID":tagFamilyID}
|
| | | CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryCrossFamily, dataMsg)
|
| | | return
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | def __GetTagFamilyInfoPack(tagFamilyID):
|
| | | ## 获取查看目标仙盟同步封包
|
| | | familyManager = GameWorld.GetFamilyManager()
|
| | | family = familyManager.FindFamily(tagFamilyID)
|
| | | if not family:
|
| | | return
|
| | | clientPack = ChPyNetSendPack.tagGCTagFamilyInfo()
|
| | | clientPack.FamilyID = tagFamilyID
|
| | | clientPack.FamilyName = family.GetName()
|
| | | clientPack.FamilyLV = family.GetLV()
|
| | | clientPack.Broadcast = family.GetBroadcast()
|
| | | clientPack.BroadcastLen = len(clientPack.Broadcast)
|
| | | clientPack.Member = []
|
| | | for index in range(family.GetCount()):
|
| | | curMember = family.GetAt(index)
|
| | | mem = ChPyNetSendPack.tagGCTagFamilyMember()
|
| | | mem.PlayerID = curMember.GetPlayerID()
|
| | | mem.Name = curMember.GetName()
|
| | | mem.NameLen = len(mem.Name)
|
| | | mem.FamilyLV = curMember.GetFamilyLV()
|
| | | mem.LV = curMember.GetLV()
|
| | | mem.Job = curMember.GetJob()
|
| | | mem.Face = curMember.GetFace()
|
| | | mem.FacePic = curMember.GetFacePic()
|
| | | mem.OfficialRank = curMember.GetOfficialRank()
|
| | | fightPower = GetMemberFightPower(curMember)
|
| | | mem.FightPower = fightPower % ChConfig.Def_PerPointValue
|
| | | mem.FightPowerEx = fightPower / ChConfig.Def_PerPointValue
|
| | | clientPack.Member.append(mem)
|
| | | clientPack.MemberCount = len(clientPack.Member)
|
| | | familyFightPower = GetFamilyTotalFightPower(family)
|
| | | clientPack.FightPower = familyFightPower % ChConfig.Def_PerPointValue
|
| | | clientPack.FightPowerEx = familyFightPower / ChConfig.Def_PerPointValue
|
| | | clientPack.EmblemID = GetFamilyEmblemID(family)
|
| | | clientPack.ServerID = family.GetServerID()
|
| | | return clientPack
|
| | |
|
| | | #class IPY_CFamilyChangeBroadcast
|
| | | #{
|
| | | #public:
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def ClientServerMsg_QueryCrossFamily(serverGroupID, msgData):
|
| | | ## 子服查询跨服仙盟
|
| | | playerID = msgData["playerID"]
|
| | | tagFamilyID = msgData.get("tagFamilyID", 0)
|
| | | if tagFamilyID:
|
| | | clientPack = __GetTagFamilyInfoPack(tagFamilyID)
|
| | | if clientPack:
|
| | | NetPackCommon.SendFakePackByCross({playerID:serverGroupID}, clientPack)
|
| | | else:
|
| | | PlayerControl.NotifyCodeCross(serverGroupID, playerID, "TagFamilyNotExist")
|
| | | return
|
| | | |
| | | # 可扩展查看跨服仙盟列表信息...
|
| | | |
| | | return
|
| | |
| | | ClientServerMsg_QueryXiangong = "QueryXiangong" # 查看仙宫仙名录
|
| | | ClientServerMsg_LianqiScore = "LianqiScore" # 炼器积分
|
| | | ClientServerMsg_SyncFamilyInfo = "SyncFamilyInfo" # 仙盟信息同步
|
| | | ClientServerMsg_QueryCrossFamily = "QueryCrossFamily" # 查询跨服仙盟
|
| | | ClientServerMsg_FamilyGCZ = "FamilyGCZ" # 仙盟攻城战
|
| | |
|
| | | #跨服广播类型定义
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A4 14 查看目标仙盟 #tagCGViewTagFamily
|
| | |
|
| | | class tagCGViewTagFamily(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("TagFamilyID", c_int), # 目标仙盟ID,支持查看跨服仙盟
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xA4
|
| | | self.SubCmd = 0x14
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xA4
|
| | | self.SubCmd = 0x14
|
| | | self.TagFamilyID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCGViewTagFamily)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A4 14 查看目标仙盟 //tagCGViewTagFamily:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | TagFamilyID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.TagFamilyID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCGViewTagFamily=tagCGViewTagFamily()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGViewTagFamily.Cmd,m_NAtagCGViewTagFamily.SubCmd))] = m_NAtagCGViewTagFamily
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A9 03 关注BOSS刷新 #tagCGAttentionBoss
|
| | |
|
| | | class tagCGAttentionBoss(Structure):
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A4 13 查看目标仙盟返回信息 #tagGCTagFamilyInfo
|
| | |
|
| | | class tagGCTagFamilyMember(Structure):
|
| | | PlayerID = 0 #(DWORD PlayerID)
|
| | | NameLen = 0 #(BYTE NameLen)
|
| | | Name = "" #(String Name)//size = NameLen
|
| | | FamilyLV = 0 #(BYTE FamilyLV)//家族成员等级
|
| | | LV = 0 #(WORD LV)
|
| | | Job = 0 #(BYTE Job)//ְҵ
|
| | | Face = 0 #(DWORD Face)//头像
|
| | | FacePic = 0 #(DWORD FacePic)//头像外框
|
| | | OfficialRank = 0 #(BYTE OfficialRank)//境界
|
| | | FightPower = 0 #(DWORD FightPower)//成员战力,求余亿部分
|
| | | FightPowerEx = 0 #(DWORD FightPowerEx)//成员战力,整除亿部分
|
| | | 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.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.OfficialRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.PlayerID = 0
|
| | | self.NameLen = 0
|
| | | self.Name = ""
|
| | | self.FamilyLV = 0
|
| | | self.LV = 0
|
| | | self.Job = 0
|
| | | self.Face = 0
|
| | | self.FacePic = 0
|
| | | self.OfficialRank = 0
|
| | | self.FightPower = 0
|
| | | self.FightPowerEx = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += 4
|
| | | length += 1
|
| | | length += len(self.Name)
|
| | | length += 1
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 4
|
| | | length += 1
|
| | | 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.WriteBYTE(data, self.FamilyLV)
|
| | | data = CommFunc.WriteWORD(data, self.LV)
|
| | | data = CommFunc.WriteBYTE(data, self.Job)
|
| | | data = CommFunc.WriteDWORD(data, self.Face)
|
| | | data = CommFunc.WriteDWORD(data, self.FacePic)
|
| | | data = CommFunc.WriteBYTE(data, self.OfficialRank)
|
| | | data = CommFunc.WriteDWORD(data, self.FightPower)
|
| | | data = CommFunc.WriteDWORD(data, self.FightPowerEx)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | PlayerID:%d,
|
| | | NameLen:%d,
|
| | | Name:%s,
|
| | | FamilyLV:%d,
|
| | | LV:%d,
|
| | | Job:%d,
|
| | | Face:%d,
|
| | | FacePic:%d,
|
| | | OfficialRank:%d,
|
| | | FightPower:%d,
|
| | | FightPowerEx:%d
|
| | | '''\
|
| | | %(
|
| | | self.PlayerID,
|
| | | self.NameLen,
|
| | | self.Name,
|
| | | self.FamilyLV,
|
| | | self.LV,
|
| | | self.Job,
|
| | | self.Face,
|
| | | self.FacePic,
|
| | | self.OfficialRank,
|
| | | self.FightPower,
|
| | | self.FightPowerEx
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagGCTagFamilyInfo(Structure):
|
| | | Head = tagHead()
|
| | | FamilyID = 0 #(DWORD FamilyID)
|
| | | FamilyName = "" #(char FamilyName[33])//家族名称
|
| | | FamilyLV = 0 #(WORD FamilyLV)//家族等级
|
| | | BroadcastLen = 0 #(WORD BroadcastLen)//公告
|
| | | Broadcast = "" #(String Broadcast)//size = BroadcastLen
|
| | | MemberCount = 0 #(WORD MemberCount)//人数
|
| | | Member = list() #(vector<tagGCTagFamilyMember> Member)//size = MemberCount
|
| | | FightPower = 0 #(DWORD FightPower)//仙盟总战力,求余亿部分
|
| | | FightPowerEx = 0 #(DWORD FightPowerEx)//仙盟总战力,整除亿部分
|
| | | EmblemID = 0 #(DWORD EmblemID)//徽章ID
|
| | | ServerID = 0 #(DWORD ServerID)//仙盟区服ID
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA4
|
| | | self.Head.SubCmd = 0x13
|
| | | 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.ReadWORD(_lpData, _pos)
|
| | | self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen)
|
| | | self.MemberCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | for i in range(self.MemberCount):
|
| | | temMember = tagGCTagFamilyMember()
|
| | | _pos = temMember.ReadData(_lpData, _pos)
|
| | | self.Member.append(temMember)
|
| | | self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA4
|
| | | self.Head.SubCmd = 0x13
|
| | | self.FamilyID = 0
|
| | | self.FamilyName = ""
|
| | | self.FamilyLV = 0
|
| | | self.BroadcastLen = 0
|
| | | self.Broadcast = ""
|
| | | self.MemberCount = 0
|
| | | self.Member = list()
|
| | | self.FightPower = 0
|
| | | self.FightPowerEx = 0
|
| | | self.EmblemID = 0
|
| | | self.ServerID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 33
|
| | | length += 2
|
| | | length += 2
|
| | | length += len(self.Broadcast)
|
| | | length += 2
|
| | | for i in range(self.MemberCount):
|
| | | length += self.Member[i].GetLength()
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | | length += 4
|
| | |
|
| | | 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.WriteWORD(data, self.FamilyLV)
|
| | | data = CommFunc.WriteWORD(data, self.BroadcastLen)
|
| | | data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast)
|
| | | data = CommFunc.WriteWORD(data, self.MemberCount)
|
| | | for i in range(self.MemberCount):
|
| | | data = CommFunc.WriteString(data, self.Member[i].GetLength(), self.Member[i].GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.FightPower)
|
| | | data = CommFunc.WriteDWORD(data, self.FightPowerEx)
|
| | | data = CommFunc.WriteDWORD(data, self.EmblemID)
|
| | | data = CommFunc.WriteDWORD(data, self.ServerID)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | FamilyID:%d,
|
| | | FamilyName:%s,
|
| | | FamilyLV:%d,
|
| | | BroadcastLen:%d,
|
| | | Broadcast:%s,
|
| | | MemberCount:%d,
|
| | | Member:%s,
|
| | | FightPower:%d,
|
| | | FightPowerEx:%d,
|
| | | EmblemID:%d,
|
| | | ServerID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.FamilyID,
|
| | | self.FamilyName,
|
| | | self.FamilyLV,
|
| | | self.BroadcastLen,
|
| | | self.Broadcast,
|
| | | self.MemberCount,
|
| | | "...",
|
| | | self.FightPower,
|
| | | self.FightPowerEx,
|
| | | self.EmblemID,
|
| | | self.ServerID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagGCTagFamilyInfo=tagGCTagFamilyInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTagFamilyInfo.Head.Cmd,m_NAtagGCTagFamilyInfo.Head.SubCmd))] = m_NAtagGCTagFamilyInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | #A4 01 查看申请入会的玩家信息 #tagGCViewFamilyRequestInfo
|
| | |
|
| | | class tagtMemberInfo(Structure):
|
| | |
| | | return
|
| | |
|
| | | def GetFamilyGCZAward(curPlayer, awardType, tick):
|
| | | ## 领奖 0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励;
|
| | | ## 领奖 0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励;3-点赞
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZAwardState)
|
| | | if awardState&pow(2, awardType):
|
| | |
| | | ClientServerMsg_QueryXiangong = "QueryXiangong" # 查看仙宫仙名录
|
| | | ClientServerMsg_LianqiScore = "LianqiScore" # 炼器积分
|
| | | ClientServerMsg_SyncFamilyInfo = "SyncFamilyInfo" # 仙盟信息同步
|
| | | ClientServerMsg_QueryCrossFamily = "QueryCrossFamily" # 查询跨服仙盟
|
| | | ClientServerMsg_FamilyGCZ = "FamilyGCZ" # 仙盟攻城战
|
| | |
|
| | | #跨服广播类型定义
|