10261 【越南】【砍树】【英文】仙盟徽章增加定制仙盟ID支持; 增加聊天气泡,聊天表情;
| | |
| | | BYTE _EmblemID; //徽章ID
|
| | | BYTE UnlockFamilyLV; //解锁仙盟等级,为0时代表其他方式解锁
|
| | | DWORD ExpireMinutes; //有效时长,分钟
|
| | | DWORD CustomFamilyID; //定制仙盟ID
|
| | | };
|
| | |
|
| | | //仙盟试炼伤血奖励表
|
| | |
| | | BYTE _BoxID; //气泡框ID
|
| | | WORD NeedLV; //所需等级
|
| | | BYTE NeedVIPLVGift; //所需购买VIP等级礼包
|
| | | BYTE UnlockDefault; //是否默认激活
|
| | | DWORD ExpireMinutes; //时效分钟,0永久
|
| | | list LightAttrType; //点亮属性类型
|
| | | list LightAttrValue; //点亮属性值
|
| | | DWORD LightFightPower; //点亮附加战力
|
| | | };
|
| | |
|
| | | //聊天气泡升星表
|
| | |
|
| | | struct tagChatBubbleBoxStar
|
| | | {
|
| | | BYTE _BoxID; //气泡框ID
|
| | | BYTE _BoxStar; //气泡框星级
|
| | | list StarUpNeedItemList; //升该星所需物品 [[物品ID,个数], ...]
|
| | | list StarAttrType; //累计总属性类型
|
| | | list StarAttrValue; //累计总属性值
|
| | | };
|
| | |
|
| | | //表情包表
|
| | |
|
| | | struct tagEmojiPack
|
| | | {
|
| | | DWORD _EmojiPackID; //表情包ID
|
| | | BYTE UnlockDefault; //是否默认激活
|
| | | DWORD ExpireMinutes; //时效分钟,0永久
|
| | | };
|
| | |
|
| | | //充值返利活动表
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A2 36 聊天气泡框升星 #tagCMChatBubbleBoxStarUP
|
| | |
|
| | | class tagCMChatBubbleBoxStarUP(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("BoxID", c_ubyte), #气泡ID
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xA2
|
| | | self.SubCmd = 0x36
|
| | | 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 = 0xA2
|
| | | self.SubCmd = 0x36
|
| | | self.BoxID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMChatBubbleBoxStarUP)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A2 36 聊天气泡框升星 //tagCMChatBubbleBoxStarUP:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | BoxID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.BoxID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMChatBubbleBoxStarUP=tagCMChatBubbleBoxStarUP()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChatBubbleBoxStarUP.Cmd,m_NAtagCMChatBubbleBoxStarUP.SubCmd))] = m_NAtagCMChatBubbleBoxStarUP
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A2 10 清除副本CD#tagCMClearFBCD
|
| | |
|
| | | class tagCMClearFBCD(Structure):
|
| | |
| | | #------------------------------------------------------
|
| | | # A7 17 聊天气泡框状态 #tagMCChatBubbleBoxState
|
| | |
|
| | | class tagMCChatBubbleBoxState(Structure):
|
| | | class tagMCChatBubbleBox(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("BoxState", c_int), # 按二进制位存储代表是否已开启,暂支持31位,以后有需要再加
|
| | | ("BoxID", c_ubyte), #气泡ID
|
| | | ("State", c_ubyte), #是否已激活
|
| | | ("EndTime", c_int), #到期时间戳,0为永久
|
| | | ("Star", c_ubyte), #星级
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xA7
|
| | | self.SubCmd = 0x17
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | |
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xA7
|
| | | self.SubCmd = 0x17
|
| | | self.BoxState = 0
|
| | | self.BoxID = 0
|
| | | self.State = 0
|
| | | self.EndTime = 0
|
| | | self.Star = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCChatBubbleBoxState)
|
| | | return sizeof(tagMCChatBubbleBox)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A7 17 聊天气泡框状态 //tagMCChatBubbleBoxState:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | BoxState:%d
|
| | | BoxID:%d,
|
| | | State:%d,
|
| | | EndTime:%d,
|
| | | Star:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.BoxState
|
| | | self.BoxID,
|
| | | self.State,
|
| | | self.EndTime,
|
| | | self.Star
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCChatBubbleBoxState(Structure):
|
| | | Head = tagHead()
|
| | | Count = 0 #(BYTE Count)
|
| | | BoxList = list() #(vector<tagMCChatBubbleBox> BoxList)
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x17
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.Count):
|
| | | temBoxList = tagMCChatBubbleBox()
|
| | | _pos = temBoxList.ReadData(_lpData, _pos)
|
| | | self.BoxList.append(temBoxList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x17
|
| | | self.Count = 0
|
| | | self.BoxList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | for i in range(self.Count):
|
| | | length += self.BoxList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.Count)
|
| | | for i in range(self.Count):
|
| | | data = CommFunc.WriteString(data, self.BoxList[i].GetLength(), self.BoxList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Count:%d,
|
| | | BoxList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Count,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCChatBubbleBoxState=tagMCChatBubbleBoxState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChatBubbleBoxState.Cmd,m_NAtagMCChatBubbleBoxState.SubCmd))] = m_NAtagMCChatBubbleBoxState
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChatBubbleBoxState.Head.Cmd,m_NAtagMCChatBubbleBoxState.Head.SubCmd))] = m_NAtagMCChatBubbleBoxState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 21 表情包信息 #tagMCEmojiPackInfo
|
| | |
|
| | | class tagMCEmojiPack(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("PackID", c_ubyte), #表情包ID
|
| | | ("State", c_ubyte), #是否已激活
|
| | | ("EndTime", c_int), #到期时间戳,0为永久
|
| | | ]
|
| | |
|
| | | 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.PackID = 0
|
| | | self.State = 0
|
| | | self.EndTime = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCEmojiPack)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A7 21 表情包信息 //tagMCEmojiPackInfo:
|
| | | PackID:%d,
|
| | | State:%d,
|
| | | EndTime:%d
|
| | | '''\
|
| | | %(
|
| | | self.PackID,
|
| | | self.State,
|
| | | self.EndTime
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCEmojiPackInfo(Structure):
|
| | | Head = tagHead()
|
| | | Count = 0 #(BYTE Count)
|
| | | EmojiPackList = list() #(vector<tagMCEmojiPack> EmojiPackList)
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x21
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.Count):
|
| | | temEmojiPackList = tagMCEmojiPack()
|
| | | _pos = temEmojiPackList.ReadData(_lpData, _pos)
|
| | | self.EmojiPackList.append(temEmojiPackList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x21
|
| | | self.Count = 0
|
| | | self.EmojiPackList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | for i in range(self.Count):
|
| | | length += self.EmojiPackList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.Count)
|
| | | for i in range(self.Count):
|
| | | data = CommFunc.WriteString(data, self.EmojiPackList[i].GetLength(), self.EmojiPackList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Count:%d,
|
| | | EmojiPackList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Count,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCEmojiPackInfo=tagMCEmojiPackInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEmojiPackInfo.Head.Cmd,m_NAtagMCEmojiPackInfo.Head.SubCmd))] = m_NAtagMCEmojiPackInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 15 通知仙盟抢Boss伤血信息 #tagMCFamilyBossHurtList
|
| | |
|
| | | class tagMCFamilyBossHurt(Structure):
|
| | |
| | | ("BYTE", "EmblemID", 1),
|
| | | ("BYTE", "UnlockFamilyLV", 0),
|
| | | ("DWORD", "ExpireMinutes", 0),
|
| | | ("DWORD", "CustomFamilyID", 0),
|
| | | ),
|
| | |
|
| | | "FamilyBossHurtAward":(
|
| | |
| | | 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_FamilyBossHurtAward(): |
| | |
| | | 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))
|
| | |
| | | if not ipyData:
|
| | | return
|
| | | unlockFamilyLV = ipyData.GetUnlockFamilyLV()
|
| | | customFamilyID = ipyData.GetCustomFamilyID()
|
| | |
|
| | | if unlockFamilyLV:
|
| | | 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)
|
| | |
| | | )=range(5)
|
| | |
|
| | | # 战斗力模块类型
|
| | | Def_MFPType_Max = 36
|
| | | Def_MFPType_Max = 37
|
| | | ModuleFightPowerTypeList = (
|
| | | Def_MFPType_Role, # 角色 0
|
| | | Def_MFPType_Equip, # 装备(装备本身) 1
|
| | |
| | | Def_MFPType_GatherTheSoul, # 聚魂新 32
|
| | | Def_MFPType_Face, # 头像 33
|
| | | Def_MFPType_FacePic, # 头像框 34
|
| | | Def_MFPType_ChatBox, # 气泡框 35
|
| | | Def_MFPType_Other, # 其他
|
| | | ) = range(Def_MFPType_Max)
|
| | |
|
| | |
| | | PacketSubCMD_4=0x29
|
| | | PacketCallFunc_4=OnFacePicStarUP
|
| | |
|
| | | ;聊天框
|
| | | [PlayerChatBox]
|
| | | ScriptName = Player\PlayerChatBox.py
|
| | | Writer = hxp
|
| | | Releaser = hxp
|
| | | RegType = 0
|
| | | RegisterPackCount = 2
|
| | |
|
| | | PacketCMD_1=0xA2
|
| | | PacketSubCMD_1=0x30
|
| | | PacketCallFunc_1=OnSetChatBubbleBox
|
| | |
|
| | | PacketCMD_2=0xA2
|
| | | PacketSubCMD_2=0x36
|
| | | PacketCallFunc_2=OnChatBubbleBoxStarUP
|
| | |
|
| | | ;事件
|
| | | [EventShell]
|
| | | ScriptName = Event\EventShell.py
|
| | |
| | |
|
| | | PacketCMD_18=0xA2
|
| | | PacketSubCMD_18=0x30
|
| | | PacketCallFunc_18=OnSetChatBubbleBox
|
| | | PacketCallFunc_18=
|
| | |
|
| | | PacketCMD_19=0xA1
|
| | | PacketSubCMD_19=0x08
|
| | |
| | | Def_Effect_TiandaoQiyun = 273 #增加天道树气运;A值-增加值 效果值B: 领取是否默认直接使用
|
| | | Def_Effect_Face = 274 #头像物品;A值-头像ID
|
| | | Def_Effect_FacePic = 275 #头像框物品;A值-头像框ID
|
| | | Def_Effect_EmojiPack = 276 #表情包物品;A值-表情包ID
|
| | | #----以下未使用或代码依然存在的---
|
| | | Def_Effect_ItemGiveGongXun = 1920 #使用道具给予功勋
|
| | | Def_Effect_ItemGiveRuneJH = 1925 #使用道具给予符印精华
|
| | |
| | |
|
| | | #聊天气泡
|
| | | Def_PDict_ChatBubbleBoxState = "ChatBubbleBoxState_%s" # 聊天气泡状态, 参数(key编号)
|
| | | Def_PDict_ChatBoxEndTime = "ChatBoxEndTime_%s" # 到期时间戳,0为永久,参数(气泡ID)
|
| | | Def_PDict_ChatBoxStar = "ChatBoxStar_%s" # 星级,参数(气泡ID)
|
| | | Def_PDict_EmojiPackState = "EmojiPackState_%s" # 表情包状态,参数(key编号)
|
| | | Def_PDict_EmojiPackEndTime = "EmojiPackEndTime_%s" # 到期时间戳,0为永久,参数(表情包ID)
|
| | |
|
| | | #冰晶矿脉
|
| | | Def_PDict_IceLodeStarAwardRecord = "IceLodeStarAwardRecord" #星级奖励领奖记录
|
| | |
| | | Def_CalcAttrFunc_GubaoResonance, # 古宝共鸣 62
|
| | | Def_CalcAttrFunc_Face, # 头像 63
|
| | | Def_CalcAttrFunc_FacePic, # 头像框 64
|
| | | ) = range(65)
|
| | | Def_CalcAttrFunc_ChatBox, # 气泡框 65
|
| | | ) = range(66)
|
| | |
|
| | | # 技能功能点列表 - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
|
| | | CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
|
| | |
| | | ShareDefine.Def_MFPType_FamilyZhenfa:[Def_CalcAttrFunc_FamilyZhenfa],
|
| | | ShareDefine.Def_MFPType_Face:[Def_CalcAttrFunc_Face],
|
| | | ShareDefine.Def_MFPType_FacePic:[Def_CalcAttrFunc_FacePic],
|
| | | ShareDefine.Def_MFPType_ChatBox:[Def_CalcAttrFunc_ChatBox],
|
| | | ShareDefine.Def_MFPType_Other:[Def_CalcAttrFunc_Success, Def_CalcAttrFunc_FamilyTech, Def_CalcAttrFunc_EquipDecompose],
|
| | | }
|
| | |
|
| | |
| | | ShareDefine.Def_MFPType_PetSoul:"宠魂", ShareDefine.Def_MFPType_HorseSoul:"骑魂", ShareDefine.Def_MFPType_FaQi:"法器", ShareDefine.Def_MFPType_Dogz:"神兽",
|
| | | ShareDefine.Def_MFPType_Coat:"时装", ShareDefine.Def_MFPType_Love:"情缘", ShareDefine.Def_MFPType_Charm:"魅力", ShareDefine.Def_MFPType_LianTi:"炼体",
|
| | | ShareDefine.Def_MFPType_Enchant:"附魔", ShareDefine.Def_MFPType_Gubao:"古宝", ShareDefine.Def_MFPType_Shentong:"神通", ShareDefine.Def_MFPType_FamilyZhenfa:"阵法",
|
| | | ShareDefine.Def_MFPType_GatherTheSoul:"聚魂新", ShareDefine.Def_MFPType_Face:"头像", ShareDefine.Def_MFPType_FacePic:"头像框", ShareDefine.Def_MFPType_Other:"其他",
|
| | | ShareDefine.Def_MFPType_GatherTheSoul:"聚魂新", ShareDefine.Def_MFPType_Face:"头像", ShareDefine.Def_MFPType_FacePic:"头像框", ShareDefine.Def_MFPType_ChatBox:"气泡框", |
| | | ShareDefine.Def_MFPType_Other:"其他",
|
| | | }
|
| | |
|
| | | FuncIndexName = {
|
| | |
| | | Def_CalcAttrFunc_LoveRing:"情戒基础", Def_CalcAttrFunc_LoveRingCouple:"情戒仙侣", Def_CalcAttrFunc_Charm:"魅力", Def_CalcAttrFunc_LianTi:"炼体",
|
| | | Def_CalcAttrFunc_Enchant:"附魔", Def_CalcAttrFunc_LingQiEnchant:"灵器附魔", Def_CalcAttrFunc_Gubao:"古宝", Def_CalcAttrFunc_Shentong:"神通",
|
| | | Def_CalcAttrFunc_HorseStar:"坐骑星级", Def_CalcAttrFunc_PetStar:"宠物星级", Def_CalcAttrFunc_TitleStar:"称号星级", Def_CalcAttrFunc_FamilyZhenfa:"阵法",
|
| | | Def_CalcAttrFunc_GatherTheSoul:"聚魂新", Def_CalcAttrFunc_GubaoResonance:"古宝共鸣", Def_CalcAttrFunc_Face:"头像", Def_CalcAttrFunc_FacePic:"头像框",
|
| | | Def_CalcAttrFunc_GatherTheSoul:"聚魂新", Def_CalcAttrFunc_GubaoResonance:"古宝共鸣", Def_CalcAttrFunc_Face:"头像", Def_CalcAttrFunc_FacePic:"头像框", Def_CalcAttrFunc_ChatBox:"气泡框",
|
| | | }
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A2 36 聊天气泡框升星 #tagCMChatBubbleBoxStarUP
|
| | |
|
| | | class tagCMChatBubbleBoxStarUP(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("BoxID", c_ubyte), #气泡ID
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xA2
|
| | | self.SubCmd = 0x36
|
| | | 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 = 0xA2
|
| | | self.SubCmd = 0x36
|
| | | self.BoxID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMChatBubbleBoxStarUP)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A2 36 聊天气泡框升星 //tagCMChatBubbleBoxStarUP:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | BoxID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.BoxID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMChatBubbleBoxStarUP=tagCMChatBubbleBoxStarUP()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMChatBubbleBoxStarUP.Cmd,m_NAtagCMChatBubbleBoxStarUP.SubCmd))] = m_NAtagCMChatBubbleBoxStarUP
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A2 10 清除副本CD#tagCMClearFBCD
|
| | |
|
| | | class tagCMClearFBCD(Structure):
|
| | |
| | | #------------------------------------------------------
|
| | | # A7 17 聊天气泡框状态 #tagMCChatBubbleBoxState
|
| | |
|
| | | class tagMCChatBubbleBoxState(Structure):
|
| | | class tagMCChatBubbleBox(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("BoxState", c_int), # 按二进制位存储代表是否已开启,暂支持31位,以后有需要再加
|
| | | ("BoxID", c_ubyte), #气泡ID
|
| | | ("State", c_ubyte), #是否已激活
|
| | | ("EndTime", c_int), #到期时间戳,0为永久
|
| | | ("Star", c_ubyte), #星级
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xA7
|
| | | self.SubCmd = 0x17
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | |
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xA7
|
| | | self.SubCmd = 0x17
|
| | | self.BoxState = 0
|
| | | self.BoxID = 0
|
| | | self.State = 0
|
| | | self.EndTime = 0
|
| | | self.Star = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCChatBubbleBoxState)
|
| | | return sizeof(tagMCChatBubbleBox)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A7 17 聊天气泡框状态 //tagMCChatBubbleBoxState:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | BoxState:%d
|
| | | BoxID:%d,
|
| | | State:%d,
|
| | | EndTime:%d,
|
| | | Star:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.BoxState
|
| | | self.BoxID,
|
| | | self.State,
|
| | | self.EndTime,
|
| | | self.Star
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCChatBubbleBoxState(Structure):
|
| | | Head = tagHead()
|
| | | Count = 0 #(BYTE Count)
|
| | | BoxList = list() #(vector<tagMCChatBubbleBox> BoxList)
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x17
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.Count):
|
| | | temBoxList = tagMCChatBubbleBox()
|
| | | _pos = temBoxList.ReadData(_lpData, _pos)
|
| | | self.BoxList.append(temBoxList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x17
|
| | | self.Count = 0
|
| | | self.BoxList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | for i in range(self.Count):
|
| | | length += self.BoxList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.Count)
|
| | | for i in range(self.Count):
|
| | | data = CommFunc.WriteString(data, self.BoxList[i].GetLength(), self.BoxList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Count:%d,
|
| | | BoxList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Count,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCChatBubbleBoxState=tagMCChatBubbleBoxState()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChatBubbleBoxState.Cmd,m_NAtagMCChatBubbleBoxState.SubCmd))] = m_NAtagMCChatBubbleBoxState
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChatBubbleBoxState.Head.Cmd,m_NAtagMCChatBubbleBoxState.Head.SubCmd))] = m_NAtagMCChatBubbleBoxState
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 21 表情包信息 #tagMCEmojiPackInfo
|
| | |
|
| | | class tagMCEmojiPack(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("PackID", c_ubyte), #表情包ID
|
| | | ("State", c_ubyte), #是否已激活
|
| | | ("EndTime", c_int), #到期时间戳,0为永久
|
| | | ]
|
| | |
|
| | | 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.PackID = 0
|
| | | self.State = 0
|
| | | self.EndTime = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagMCEmojiPack)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// A7 21 表情包信息 //tagMCEmojiPackInfo:
|
| | | PackID:%d,
|
| | | State:%d,
|
| | | EndTime:%d
|
| | | '''\
|
| | | %(
|
| | | self.PackID,
|
| | | self.State,
|
| | | self.EndTime
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | class tagMCEmojiPackInfo(Structure):
|
| | | Head = tagHead()
|
| | | Count = 0 #(BYTE Count)
|
| | | EmojiPackList = list() #(vector<tagMCEmojiPack> EmojiPackList)
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x21
|
| | | return
|
| | |
|
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.Count):
|
| | | temEmojiPackList = tagMCEmojiPack()
|
| | | _pos = temEmojiPackList.ReadData(_lpData, _pos)
|
| | | self.EmojiPackList.append(temEmojiPackList)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | | self.Head = tagHead()
|
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xA7
|
| | | self.Head.SubCmd = 0x21
|
| | | self.Count = 0
|
| | | self.EmojiPackList = list()
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | for i in range(self.Count):
|
| | | length += self.EmojiPackList[i].GetLength()
|
| | |
|
| | | return length
|
| | |
|
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.Count)
|
| | | for i in range(self.Count):
|
| | | data = CommFunc.WriteString(data, self.EmojiPackList[i].GetLength(), self.EmojiPackList[i].GetBuffer())
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | Count:%d,
|
| | | EmojiPackList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.Count,
|
| | | "..."
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagMCEmojiPackInfo=tagMCEmojiPackInfo()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCEmojiPackInfo.Head.Cmd,m_NAtagMCEmojiPackInfo.Head.SubCmd))] = m_NAtagMCEmojiPackInfo
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # A7 15 通知仙盟抢Boss伤血信息 #tagMCFamilyBossHurtList
|
| | |
|
| | | class tagMCFamilyBossHurt(Structure):
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package GM.Commands.ChatBox
|
| | | #
|
| | | # @todo:聊天框
|
| | | # @author hxp
|
| | | # @date 2024-09-13
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 聊天框
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-09-13 16:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GameWorld
|
| | | import IpyGameDataPY
|
| | | import PlayerControl
|
| | | import PlayerChatBox
|
| | | import ChConfig
|
| | |
|
| | | #逻辑实现
|
| | | ## GM命令执行入口
|
| | | # @param curPlayer 当前玩家
|
| | | # @param msgList 参数列表
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def OnExec(curPlayer, msgList):
|
| | | |
| | | if not msgList:
|
| | | GameWorld.DebugAnswer(curPlayer, "---------- %s" % GameWorld.GetCurrentDataTimeStr())
|
| | | GameWorld.DebugAnswer(curPlayer, "添加气泡框: ChatBox b1 气泡框ID [有效秒]")
|
| | | GameWorld.DebugAnswer(curPlayer, "删除气泡框: ChatBox b0 [气泡框ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "气泡框星级: ChatBox bs 气泡框ID 星级")
|
| | | GameWorld.DebugAnswer(curPlayer, "添加表情包: ChatBox e1 表情包ID [有效秒]")
|
| | | GameWorld.DebugAnswer(curPlayer, "删除表情包: ChatBox e0 [表情包ID]")
|
| | | GameWorld.DebugAnswer(curPlayer, "有效秒:不填读表,0-永久,>0指定有效秒")
|
| | | return
|
| | | |
| | | syncBoxIDList = []
|
| | | packIDList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | value1 = msgList[0]
|
| | | |
| | | # 删除气泡框
|
| | | if value1 == "b0":
|
| | | boxID = msgList[1] if len(msgList) > 1 else 0
|
| | | if not boxID:
|
| | | for index in range(ipyDataMgr.GetChatBubbleBoxCount()):
|
| | | ipyData = ipyDataMgr.GetChatBubbleBoxByIndex(index)
|
| | | boxID = ipyData.GetBoxID()
|
| | | if ipyData.GetUnlockDefault():
|
| | | continue
|
| | | if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID):
|
| | | continue
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxEndTime % boxID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxStar % boxID, 0)
|
| | | syncBoxIDList.append(boxID)
|
| | | else:
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBox", boxID)
|
| | | if not ipyData:
|
| | | GameWorld.DebugAnswer(curPlayer, "该气泡框不存在:%s" % boxID)
|
| | | return
|
| | | if ipyData.GetUnlockDefault():
|
| | | GameWorld.DebugAnswer(curPlayer, "该气泡框默认激活:%s" % boxID)
|
| | | return
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxEndTime % boxID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxStar % boxID, 0)
|
| | | syncBoxIDList.append(boxID)
|
| | | GameWorld.DebugAnswer(curPlayer, "删除气泡框:%s" % syncBoxIDList)
|
| | | |
| | | # 添加气泡框
|
| | | elif value1 == "b1":
|
| | | boxID = msgList[1] if len(msgList) > 1 else 0
|
| | | expireTimes = msgList[2] if len(msgList) > 2 else None
|
| | | if PlayerChatBox.AddChatBox(curPlayer, boxID, expireTimes):
|
| | | endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxEndTime % boxID)
|
| | | endTimeStr = "永久" if not endTime else GameWorld.ChangeTimeNumToStr(endTime)
|
| | | GameWorld.DebugAnswer(curPlayer, "添加气泡框成功:%s,到期:%s" % (boxID, endTimeStr))
|
| | | else:
|
| | | GameWorld.DebugAnswer(curPlayer, "添加气泡框失败:%s" % (boxID))
|
| | | |
| | | # 气泡框星级
|
| | | elif value1 == "bs":
|
| | | boxID = msgList[1] if len(msgList) > 1 else 0
|
| | | boxStar = msgList[2] if len(msgList) > 2 else 0
|
| | | if boxStar:
|
| | | starIpyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBoxStar", boxID, boxStar)
|
| | | if not starIpyData:
|
| | | GameWorld.DebugAnswer(curPlayer, "气泡框星级不存在:%s,star:%s" % (boxID, boxStar))
|
| | | return
|
| | | GameWorld.DebugAnswer(curPlayer, "设置气泡框星级:%s,星:%s" % (boxID, boxStar))
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxStar % boxID, boxStar)
|
| | | syncBoxIDList.append(boxID)
|
| | | |
| | | # 删除表情包
|
| | | elif value1 == "e0":
|
| | | packID = msgList[1] if len(msgList) > 1 else 0
|
| | | if not packID:
|
| | | for index in range(ipyDataMgr.GetEmojiPackCount()):
|
| | | ipyData = ipyDataMgr.GetEmojiPackByIndex(index)
|
| | | packID = ipyData.GetEmojiPackID()
|
| | | if ipyData.GetUnlockDefault():
|
| | | continue
|
| | | if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID):
|
| | | continue
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EmojiPackEndTime % packID, 0)
|
| | | packIDList.append(packID)
|
| | | else:
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("EmojiPack", packID)
|
| | | if not ipyData:
|
| | | GameWorld.DebugAnswer(curPlayer, "该表情包不存在:%s" % packID)
|
| | | return
|
| | | if ipyData.GetUnlockDefault():
|
| | | GameWorld.DebugAnswer(curPlayer, "该表情包默认激活:%s" % packID)
|
| | | return
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EmojiPackEndTime % packID, 0)
|
| | | packIDList.append(packID)
|
| | | GameWorld.DebugAnswer(curPlayer, "删除表情包:%s" % packIDList)
|
| | | |
| | | # 添加表情包
|
| | | elif value1 == "e1":
|
| | | packID = msgList[1] if len(msgList) > 1 else 0
|
| | | expireTimes = msgList[2] if len(msgList) > 2 else None
|
| | | if PlayerChatBox.AddEmojiPack(curPlayer, packID, expireTimes):
|
| | | endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EmojiPackEndTime % packID)
|
| | | endTimeStr = "永久" if not endTime else GameWorld.ChangeTimeNumToStr(endTime)
|
| | | GameWorld.DebugAnswer(curPlayer, "添加表情包成功:%s,到期:%s" % (packID, endTimeStr))
|
| | | else:
|
| | | GameWorld.DebugAnswer(curPlayer, "添加表情包失败:%s" % (packID))
|
| | | |
| | | if syncBoxIDList:
|
| | | PlayerChatBox.RefreshBoxAttr(curPlayer)
|
| | | PlayerChatBox.SyncChatBoxInfo(curPlayer, syncBoxIDList)
|
| | | |
| | | if packIDList:
|
| | | PlayerChatBox.SyncEmojiPackInfo(curPlayer, packIDList)
|
| | | return
|
| | |
| | | ("BYTE", "BoxID", 1),
|
| | | ("WORD", "NeedLV", 0),
|
| | | ("BYTE", "NeedVIPLVGift", 0),
|
| | | ("BYTE", "UnlockDefault", 0),
|
| | | ("DWORD", "ExpireMinutes", 0),
|
| | | ("list", "LightAttrType", 0),
|
| | | ("list", "LightAttrValue", 0),
|
| | | ("DWORD", "LightFightPower", 0),
|
| | | ),
|
| | |
|
| | | "ChatBubbleBoxStar":(
|
| | | ("BYTE", "BoxID", 1),
|
| | | ("BYTE", "BoxStar", 1),
|
| | | ("list", "StarUpNeedItemList", 0),
|
| | | ("list", "StarAttrType", 0),
|
| | | ("list", "StarAttrValue", 0),
|
| | | ),
|
| | |
|
| | | "EmojiPack":(
|
| | | ("DWORD", "EmojiPackID", 1),
|
| | | ("BYTE", "UnlockDefault", 0),
|
| | | ("DWORD", "ExpireMinutes", 0),
|
| | | ),
|
| | |
|
| | | "ActRechargePrize":(
|
| | |
| | | |
| | | def GetFaceID(self): return self.attrTuple[0] # 头像ID DWORD
|
| | | def GetFaceStar(self): return self.attrTuple[1] # 头像星级 BYTE
|
| | | def GetStarUpNeedItemList(self): return self.attrTuple[2] # 升下一星所需道具 [[物品ID,个数], ...] list
|
| | | def GetStarUpNeedItemList(self): return self.attrTuple[2] # 升该星所需物品 [[物品ID,个数], ...] list
|
| | | def GetStarAttrType(self): return self.attrTuple[3] # 累计总属性类型 list
|
| | | def GetStarAttrValue(self): return self.attrTuple[4] # 累计总属性值 list |
| | | |
| | |
| | | |
| | | def GetFacePicID(self): return self.attrTuple[0] # 头像框ID DWORD
|
| | | def GetFacePicStar(self): return self.attrTuple[1] # 头像框星级 BYTE
|
| | | def GetStarUpNeedItemList(self): return self.attrTuple[2] # 升下一星所需道具 [[物品ID,个数], ...] list
|
| | | def GetStarUpNeedItemList(self): return self.attrTuple[2] # 升该星所需物品 [[物品ID,个数], ...] list
|
| | | def GetStarAttrType(self): return self.attrTuple[3] # 累计总属性类型 list
|
| | | def GetStarAttrValue(self): return self.attrTuple[4] # 累计总属性值 list |
| | | |
| | |
| | | def GetBoxID(self): return self.attrTuple[0] # 气泡框ID BYTE
|
| | | def GetNeedLV(self): return self.attrTuple[1] # 所需等级 WORD
|
| | | def GetNeedVIPLVGift(self): return self.attrTuple[2] # 所需购买VIP等级礼包 BYTE |
| | | def GetUnlockDefault(self): return self.attrTuple[3] # 是否默认激活 BYTE
|
| | | def GetExpireMinutes(self): return self.attrTuple[4] # 时效分钟,0永久 DWORD
|
| | | def GetLightAttrType(self): return self.attrTuple[5] # 点亮属性类型 list
|
| | | def GetLightAttrValue(self): return self.attrTuple[6] # 点亮属性值 list
|
| | | def GetLightFightPower(self): return self.attrTuple[7] # 点亮附加战力 DWORD |
| | | |
| | | # 聊天气泡升星表 |
| | | class IPY_ChatBubbleBoxStar(): |
| | | |
| | | def __init__(self): |
| | | self.attrTuple = None |
| | | return |
| | | |
| | | def GetBoxID(self): return self.attrTuple[0] # 气泡框ID BYTE
|
| | | def GetBoxStar(self): return self.attrTuple[1] # 气泡框星级 BYTE
|
| | | def GetStarUpNeedItemList(self): return self.attrTuple[2] # 升该星所需物品 [[物品ID,个数], ...] list
|
| | | def GetStarAttrType(self): return self.attrTuple[3] # 累计总属性类型 list
|
| | | def GetStarAttrValue(self): return self.attrTuple[4] # 累计总属性值 list |
| | | |
| | | # 表情包表 |
| | | class IPY_EmojiPack(): |
| | | |
| | | def __init__(self): |
| | | self.attrTuple = None |
| | | return |
| | | |
| | | def GetEmojiPackID(self): return self.attrTuple[0] # 表情包ID DWORD
|
| | | def GetUnlockDefault(self): return self.attrTuple[1] # 是否默认激活 BYTE
|
| | | def GetExpireMinutes(self): return self.attrTuple[2] # 时效分钟,0永久 DWORD |
| | | |
| | | # 充值返利活动表 |
| | | class IPY_ActRechargePrize(): |
| | |
| | | self.__LoadFileData("WishingWell", onlyCheck)
|
| | | self.__LoadFileData("FunctionForecast", onlyCheck)
|
| | | self.__LoadFileData("ChatBubbleBox", onlyCheck)
|
| | | self.__LoadFileData("ChatBubbleBoxStar", onlyCheck)
|
| | | self.__LoadFileData("EmojiPack", onlyCheck)
|
| | | self.__LoadFileData("ActRechargePrize", onlyCheck)
|
| | | self.__LoadFileData("RechargePrizeTemplate", onlyCheck)
|
| | | self.__LoadFileData("ActTotalRecharge", onlyCheck)
|
| | |
| | | self.CheckLoadData("ChatBubbleBox") |
| | | return self.ipyChatBubbleBoxCache[index]
|
| | | |
| | | def GetChatBubbleBoxStarCount(self): |
| | | self.CheckLoadData("ChatBubbleBoxStar") |
| | | return self.ipyChatBubbleBoxStarLen
|
| | | def GetChatBubbleBoxStarByIndex(self, index): |
| | | self.CheckLoadData("ChatBubbleBoxStar") |
| | | return self.ipyChatBubbleBoxStarCache[index]
|
| | | |
| | | def GetEmojiPackCount(self): |
| | | self.CheckLoadData("EmojiPack") |
| | | return self.ipyEmojiPackLen
|
| | | def GetEmojiPackByIndex(self, index): |
| | | self.CheckLoadData("EmojiPack") |
| | | return self.ipyEmojiPackCache[index]
|
| | | |
| | | def GetActRechargePrizeCount(self): |
| | | self.CheckLoadData("ActRechargePrize") |
| | | return self.ipyActRechargePrizeLen
|
| | |
| | | ChConfig.Def_Effect_AddKillBossCnt:"Item_AddKillBossCnt", # 增加BOSS可击杀次数
|
| | | ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # 增加法宝升星经验
|
| | | ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # 激活聊天气泡框
|
| | | ChConfig.Def_Effect_EmojiPack:"Item_EmojiPack",
|
| | | ChConfig.Def_Effect_ItemGiveWeekPartyPoint:"Item_WeekPartyPoint", # 增加活动巡礼积分
|
| | | ChConfig.Def_Effect_ItemGiveWeekPartyPoint1:"Item_WeekPartyPoint", # 增加活动巡礼积分
|
| | | ChConfig.Def_Effect_AddRealmExpRate:"Item_AddRealmExpRate", # 增加聚灵效率
|
| | |
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ItemCommon
|
| | | import PlayerChatBox
|
| | | import ChConfig
|
| | | import ChPlayer
|
| | |
|
| | |
|
| | | def BatchUseItem(curPlayer, curRoleItem, tick, useCnt, exData):
|
| | | ##批量使用物品
|
| | |
| | | if not bubbleBoxID:
|
| | | return
|
| | |
|
| | | if not ChPlayer.DoActivateChatBubbleBox(curPlayer, bubbleBoxID):
|
| | | if not PlayerChatBox.AddChatBox(curPlayer, bubbleBoxID):
|
| | | return
|
| | |
|
| | | ItemCommon.DelItem(curPlayer, curRoleItem, useCnt, True, ChConfig.ItemDel_ChatBubbleBox)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package UseItem.Item_EmojiPack
|
| | | #
|
| | | # @todo:表情包
|
| | | # @author hxp
|
| | | # @date 2024-09-13
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 表情包
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-09-13 16:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ItemCommon
|
| | | import PlayerChatBox
|
| | |
|
| | | def UseItem(curPlayer, curRoleItem, tick):
|
| | | useItemEff = curRoleItem.GetEffectByIndex(0)
|
| | | effectA1 = useItemEff.GetEffectValue(0) |
| | | if effectA1 == 0:
|
| | | return
|
| | | if not PlayerChatBox.AddEmojiPack(curPlayer, effectA1):
|
| | | return
|
| | | ItemCommon.DelItem(curPlayer, curRoleItem, 1)
|
| | | return True
|
| | |
|
| | |
| | | import PlayerChangeJob
|
| | | import PlayerGuaji
|
| | | import PlayerFace
|
| | | import PlayerChatBox
|
| | | import PlayerXiangong
|
| | | import PlayerMineArea
|
| | | import PlayerActLoginNew
|
| | |
| | | PlayerLuckyTreasure.OnLogin(curPlayer)
|
| | | # 小助手
|
| | | SyncLittleHelper(curPlayer)
|
| | | # 聊天气泡框
|
| | | SyncChatBubbleBoxState(curPlayer)
|
| | | # 副本助战
|
| | | FBHelpBattle.DoPlayerLogin(curPlayer)
|
| | | # 聚魂
|
| | |
| | | pass
|
| | |
|
| | | else:
|
| | | PlayerChatBox.OnPlayerLogin(curPlayer)
|
| | | PlayerFace.OnPlayerLogin(curPlayer)
|
| | | PlayerXiangong.OnPlayerLogin(curPlayer)
|
| | | PlayerGubao.OnPlayerLogin(curPlayer)
|
| | |
| | | return
|
| | |
|
| | | curPlayer.SetSetting(setting)
|
| | | return
|
| | |
|
| | | #// A2 30 设置聊天气泡框 #tagCMSetChatBubbleBox
|
| | | #
|
| | | #struct tagCMSetChatBubbleBox
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE BubbleBoxType; //气泡框类型
|
| | | #};
|
| | | def OnSetChatBubbleBox(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | useBoxID = clientData.BubbleBoxType
|
| | | GameWorld.DebugLog("设置使用的聊天气泡框ID: useBoxID=%s" % useBoxID, curPlayer.GetPlayerID())
|
| | | |
| | | ipyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBox", useBoxID)
|
| | | if not ipyData:
|
| | | return
|
| | | |
| | | curBoxState = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, useBoxID)
|
| | | if not curBoxState:
|
| | | needLV = ipyData.GetNeedLV()
|
| | | if needLV and curPlayer.GetLV() < needLV:
|
| | | GameWorld.DebugLog(" 等级不足,无法使用该气泡框!needLV=%s" % needLV, curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | needVIPLVGift = ipyData.GetNeedVIPLVGift() # 兼容已购买VIP礼包的老号用
|
| | | if needVIPLVGift:
|
| | | record = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipAwardRecord)
|
| | | hasBuy = record & pow(2, needVIPLVGift)
|
| | | if not hasBuy:
|
| | | GameWorld.DebugLog(" 未购买VIP礼包,无法使用该气泡框!needVIPLVGift=%s" % needVIPLVGift, curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | PlayerControl.SetChatBubbleBox(curPlayer, useBoxID)
|
| | | return
|
| | |
|
| | | def DoActivateChatBubbleBox(curPlayer, boxID):
|
| | | ## 激活聊天气泡框
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBox", boxID)
|
| | | if not ipyData:
|
| | | return
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID, 1)
|
| | | SyncChatBubbleBoxState(curPlayer)
|
| | | return True
|
| | |
|
| | | def SyncChatBubbleBoxState(curPlayer):
|
| | | ## 同步聊天气泡框状态
|
| | | boxState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBubbleBoxState % 0)
|
| | | if not boxState:
|
| | | return
|
| | | boxStatePack = ChPyNetSendPack.tagMCChatBubbleBoxState()
|
| | | boxStatePack.BoxState = boxState
|
| | | NetPackCommon.SendFakePack(curPlayer, boxStatePack)
|
| | | return
|
| | |
|
| | | #// A2 29 设置小助手 #tagCMSetLittleHelper
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Player.PlayerChatBox
|
| | | #
|
| | | # @todo:聊天气泡表情
|
| | | # @author hxp
|
| | | # @date 2024-09-13
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 聊天气泡表情
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-09-13 16:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GameWorld
|
| | | import ShareDefine
|
| | | import PlayerControl
|
| | | import IPY_GameWorld
|
| | | import ChPyNetSendPack
|
| | | import IpyGameDataPY
|
| | | import NetPackCommon
|
| | | import ItemCommon
|
| | | import ChConfig
|
| | |
|
| | | import time
|
| | |
|
| | | def OnPlayerLogin(curPlayer):
|
| | | SyncChatBoxInfo(curPlayer)
|
| | | SyncEmojiPackInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def OnMinute(curPlayer):
|
| | | curTime = int(time.time())
|
| | | delBoxList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetChatBubbleBoxCount()):
|
| | | ipyData = ipyDataMgr.GetChatBubbleBoxByIndex(index)
|
| | | boxID = ipyData.GetBoxID()
|
| | | if ipyData.GetUnlockDefault():
|
| | | # 默认激活的不处理
|
| | | continue
|
| | | if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID):
|
| | | # 未激活的不处理
|
| | | continue
|
| | | endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxEndTime % boxID)
|
| | | if not endTime or endTime > curTime:
|
| | | # 永久或未过期
|
| | | continue
|
| | | if DelChatBox(curPlayer, boxID, False, "ChatBoxTimeout"):
|
| | | delBoxList.append(boxID)
|
| | | |
| | | if delBoxList:
|
| | | RefreshBoxAttr(curPlayer)
|
| | | |
| | | # 表情包
|
| | | for index in range(ipyDataMgr.GetEmojiPackCount()):
|
| | | ipyData = ipyDataMgr.GetEmojiPackByIndex(index)
|
| | | packID = ipyData.GetEmojiPackID()
|
| | | if ipyData.GetUnlockDefault():
|
| | | # 默认激活的不处理
|
| | | continue
|
| | | if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID):
|
| | | # 未激活的不处理
|
| | | continue
|
| | | endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EmojiPackEndTime % packID)
|
| | | if not endTime or endTime > curTime:
|
| | | # 永久或未过期
|
| | | continue
|
| | | DelEmojiPack(curPlayer, packID, "EmojiPackTimeout")
|
| | | |
| | | return
|
| | |
|
| | | def AddChatBox(curPlayer, boxID, setExpireTimes=None):
|
| | | if boxID <= 0:
|
| | | return
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBox", boxID)
|
| | | if not ipyData:
|
| | | return
|
| | | if ipyData.GetUnlockDefault():
|
| | | GameWorld.DebugLog("气泡框默认解锁的不用添加: boxID=%s" % (boxID), playerID)
|
| | | return
|
| | | ipyExpireSeconds = ipyData.GetExpireMinutes() * 60
|
| | | |
| | | curTime = int(time.time())
|
| | | state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID)
|
| | | endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxEndTime % boxID)
|
| | | GameWorld.Log("添加气泡框: boxID=%s,setExpireTimes=%s,state=%s,endTime=%s,ipyExpireSeconds=%s,curTime=%s" |
| | | % (boxID, setExpireTimes, state, endTime, ipyExpireSeconds, curTime), playerID)
|
| | | updEndTime = endTime
|
| | | |
| | | # 指定时长的,如GM指定
|
| | | if setExpireTimes >= 0:
|
| | | updEndTime = curTime + setExpireTimes
|
| | | GameWorld.Log(" 指定气泡框时长: boxID=%s,updEndTime=%s" % (boxID, updEndTime), playerID)
|
| | | |
| | | # 永久
|
| | | elif ipyExpireSeconds == 0:
|
| | | updEndTime = 0
|
| | | GameWorld.Log(" 添加永久气泡框: boxID=%s,updEndTime=%s" % (boxID, updEndTime), playerID)
|
| | | |
| | | else:
|
| | | # 未过期
|
| | | if endTime > curTime:
|
| | | updEndTime = endTime + ipyExpireSeconds
|
| | | GameWorld.Log(" 累加气泡框时长: boxID=%s,updEndTime=%s" % (boxID, updEndTime), playerID)
|
| | | else:
|
| | | updEndTime = curTime + ipyExpireSeconds
|
| | | GameWorld.Log(" 重新激活气泡框: boxID=%s,updEndTime=%s" % (boxID, updEndTime), playerID)
|
| | | |
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID, 1)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxEndTime % boxID, updEndTime)
|
| | | RefreshBoxAttr(curPlayer)
|
| | | SyncChatBoxInfo(curPlayer, [boxID])
|
| | | return True
|
| | |
|
| | | def DelChatBox(curPlayer, boxID, isRefreshAttr=True, notifyMail=""):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBox", boxID)
|
| | | if not ipyData:
|
| | | return
|
| | | if ipyData.GetUnlockDefault():
|
| | | return
|
| | | GameWorld.Log("删除玩家聊天气泡框: boxID=%s,notifyMail=%s" % (boxID, notifyMail), playerID)
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxEndTime % boxID, 0)
|
| | | # 星级不重置,重新激活后再次生效
|
| | | |
| | | if PlayerControl.GetChatBubbleBox(curPlayer) == boxID:
|
| | | canUseID = GetCanUseBoxID(curPlayer)
|
| | | PlayerControl.SetChatBubbleBox(curPlayer, canUseID)
|
| | | GameWorld.DebugLog("玩家聊天气泡框被删除,重新设置可用ID=%s" % canUseID, playerID)
|
| | | |
| | | if isRefreshAttr:
|
| | | RefreshBoxAttr(curPlayer)
|
| | | SyncChatBoxInfo(curPlayer, [boxID])
|
| | | if notifyMail:
|
| | | PlayerControl.SendMailByKey(notifyMail, [playerID], [], [boxID])
|
| | | return True
|
| | |
|
| | | def GetCanUseBoxID(curPlayer):
|
| | | ## 获取一个可用的气泡框
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetChatBubbleBoxCount())[::-1]:
|
| | | ipyData = ipyDataMgr.GetChatBubbleBoxByIndex(index)
|
| | | boxID = ipyData.GetBoxID()
|
| | | if IsBoxCanUse(curPlayer, boxID, ipyData):
|
| | | return boxID
|
| | | return 0
|
| | |
|
| | | def IsBoxCanUse(curPlayer, boxID, ipyData=None):
|
| | | ## 气泡框是否可用
|
| | | state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID)
|
| | | if state:
|
| | | return True
|
| | | |
| | | if not ipyData:
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBox", boxID)
|
| | | if ipyData:
|
| | | if ipyData.GetUnlockDefault():
|
| | | return True
|
| | | |
| | | needLV = ipyData.GetNeedLV()
|
| | | if needLV and curPlayer.GetLV() < needLV:
|
| | | #GameWorld.DebugLog(" 等级不足,无法使用该气泡框!needLV=%s" % needLV, curPlayer.GetPlayerID())
|
| | | return False
|
| | | |
| | | needVIPLVGift = ipyData.GetNeedVIPLVGift() # 兼容已购买VIP礼包的老号用
|
| | | if needVIPLVGift:
|
| | | record = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipAwardRecord)
|
| | | hasBuy = record & pow(2, needVIPLVGift)
|
| | | if not hasBuy:
|
| | | #GameWorld.DebugLog(" 未购买VIP礼包,无法使用该气泡框!needVIPLVGift=%s" % needVIPLVGift, curPlayer.GetPlayerID())
|
| | | return False
|
| | | |
| | | if needLV or needVIPLVGift:
|
| | | return True
|
| | | |
| | | return False
|
| | |
|
| | | def RefreshBoxAttr(curPlayer):
|
| | | CalcBoxAttr(curPlayer)
|
| | | PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
| | | return
|
| | |
|
| | | def CalcBoxAttr(curPlayer):
|
| | | |
| | | fightPowerEx = 0
|
| | | allAttrList = [{} for i in range(4)]
|
| | | |
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetChatBubbleBoxCount()):
|
| | | ipyData = ipyDataMgr.GetChatBubbleBoxByIndex(index)
|
| | | boxID = ipyData.GetBoxID()
|
| | | if not IsBoxCanUse(curPlayer, boxID, ipyData):
|
| | | continue
|
| | | |
| | | fightPowerEx += ipyData.GetLightFightPower()
|
| | | # 激活属性
|
| | | lightAttrType = ipyData.GetLightAttrType()
|
| | | lightAttrValue = ipyData.GetLightAttrValue()
|
| | | for i, attrID in enumerate(lightAttrType):
|
| | | attrValue = lightAttrValue[i]
|
| | | PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
| | | |
| | | # 星级属性
|
| | | boxStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxStar % boxID)
|
| | | starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("ChatBubbleBoxStar", boxID, boxStar)
|
| | | if starIpyData:
|
| | | starAttrType = starIpyData.GetStarAttrType()
|
| | | starAttrValue = starIpyData.GetStarAttrValue()
|
| | | for i, attrID in enumerate(starAttrType):
|
| | | attrValue = starAttrValue[i]
|
| | | PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
|
| | | |
| | | # 保存计算值
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ChatBox, allAttrList)
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_ChatBox, fightPowerEx)
|
| | | return
|
| | |
|
| | | #// A2 30 设置聊天气泡框 #tagCMSetChatBubbleBox
|
| | | #
|
| | | #struct tagCMSetChatBubbleBox
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE BubbleBoxType; //气泡框类型
|
| | | #};
|
| | | def OnSetChatBubbleBox(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | useBoxID = clientData.BubbleBoxType
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if not IsBoxCanUse(curPlayer, useBoxID):
|
| | | GameWorld.DebugLog("聊天气泡框不可用,无法设置! useBoxID=%s" % useBoxID, playerID) |
| | | return
|
| | | GameWorld.DebugLog("设置使用的聊天气泡框ID: useBoxID=%s" % useBoxID, playerID) |
| | | PlayerControl.SetChatBubbleBox(curPlayer, useBoxID)
|
| | | return
|
| | |
|
| | | #// A2 36 聊天气泡框升星 #tagCMChatBubbleBoxStarUP
|
| | | #
|
| | | #struct tagCMChatBubbleBoxStarUP
|
| | | #{
|
| | | # tagHead Head;
|
| | | # WORD BoxID; //气泡ID
|
| | | #};
|
| | | def OnChatBubbleBoxStarUP(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | boxID = clientData.BoxID
|
| | | |
| | | if not IsBoxCanUse(curPlayer, boxID):
|
| | | GameWorld.DebugLog("聊天气泡框不可用! boxID=%s" % (boxID), playerID)
|
| | | return
|
| | | |
| | | curStar = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxStar % boxID) |
| | | nextStar = curStar + 1
|
| | | nextIpyData = IpyGameDataPY.GetIpyGameData("ChatBubbleBoxStar", boxID, nextStar)
|
| | | if not nextIpyData:
|
| | | GameWorld.DebugLog("不存在该气泡框星级! boxID=%s,nextStar=%s" % (boxID, nextStar), playerID)
|
| | | return
|
| | | needItemList = nextIpyData.GetStarUpNeedItemList()
|
| | | if not needItemList:
|
| | | return
|
| | | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
| | | lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
|
| | | if lackItemDict:
|
| | | GameWorld.DebugLog("气泡框升星所需物品不足! boxID=%s,nextStar=%s,needItemList=%s,lackItemDict=%s" |
| | | % (boxID, nextStar, needItemList, lackItemDict), playerID)
|
| | | return
|
| | | ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "ChatBoxStarUP")
|
| | | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBoxStar % boxID, nextStar)
|
| | | |
| | | GameWorld.DebugLog("气泡框升星! boxID=%s,curStar=%s,nextStar=%s" % (boxID, curStar, nextStar), playerID)
|
| | | |
| | | RefreshBoxAttr(curPlayer)
|
| | | SyncChatBoxInfo(curPlayer, [boxID])
|
| | | return
|
| | |
|
| | | def SyncChatBoxInfo(curPlayer, boxIDList=None):
|
| | | if boxIDList == None:
|
| | | syncIDList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetChatBubbleBoxCount()):
|
| | | ipyData = ipyDataMgr.GetChatBubbleBoxByIndex(index)
|
| | | syncIDList.append(ipyData.GetBoxID())
|
| | | else:
|
| | | syncIDList = boxIDList
|
| | | |
| | | boxList = []
|
| | | for boxID in syncIDList:
|
| | | state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxState, boxID)
|
| | | if not state and boxIDList == None:
|
| | | continue
|
| | | box = ChPyNetSendPack.tagMCChatBubbleBox()
|
| | | box.BoxID = boxID
|
| | | box.State = state
|
| | | box.EndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxEndTime % boxID)
|
| | | box.Star = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBoxStar % boxID)
|
| | | boxList.append(box)
|
| | | |
| | | if not boxList:
|
| | | return
|
| | | |
| | | clientPack = ChPyNetSendPack.tagMCChatBubbleBoxState()
|
| | | clientPack.BoxList = boxList
|
| | | clientPack.Count = len(clientPack.BoxList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | ##-------------------------------------------------------------------------------------------------
|
| | |
|
| | | def AddEmojiPack(curPlayer, packID, setExpireTimes=None):
|
| | | if packID <= 0:
|
| | | return
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("EmojiPack", packID)
|
| | | if not ipyData:
|
| | | return
|
| | | if ipyData.GetUnlockDefault():
|
| | | GameWorld.DebugLog("表情包默认解锁的不用添加: packID=%s" % (packID), playerID)
|
| | | return
|
| | | ipyExpireSeconds = ipyData.GetExpireMinutes() * 60
|
| | | |
| | | curTime = int(time.time())
|
| | | state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID)
|
| | | endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EmojiPackEndTime % packID)
|
| | | GameWorld.Log("添加表情包: packID=%s,setExpireTimes=%s,state=%s,endTime=%s,ipyExpireSeconds=%s,curTime=%s" |
| | | % (packID, setExpireTimes, state, endTime, ipyExpireSeconds, curTime), playerID)
|
| | | updEndTime = endTime
|
| | | |
| | | # 指定时长的,如GM指定
|
| | | if setExpireTimes >= 0:
|
| | | updEndTime = curTime + setExpireTimes
|
| | | GameWorld.Log(" 指定表情包时长: packID=%s,updEndTime=%s" % (packID, updEndTime), playerID)
|
| | | |
| | | # 永久
|
| | | elif ipyExpireSeconds == 0:
|
| | | updEndTime = 0
|
| | | GameWorld.Log(" 添加永久表情包: packID=%s,updEndTime=%s" % (packID, updEndTime), playerID)
|
| | | |
| | | else:
|
| | | # 未过期
|
| | | if endTime > curTime:
|
| | | updEndTime = endTime + ipyExpireSeconds
|
| | | GameWorld.Log(" 累加表情包时长: packID=%s,updEndTime=%s" % (packID, updEndTime), playerID)
|
| | | else:
|
| | | updEndTime = curTime + ipyExpireSeconds
|
| | | GameWorld.Log(" 重新激活表情包: packID=%s,updEndTime=%s" % (packID, updEndTime), playerID)
|
| | | |
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID, 1)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EmojiPackEndTime % packID, updEndTime)
|
| | | |
| | | SyncEmojiPackInfo(curPlayer, [packID])
|
| | | return True
|
| | |
|
| | | def DelEmojiPack(curPlayer, packID, notifyMail=""):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("EmojiPack", packID)
|
| | | if not ipyData:
|
| | | return
|
| | | if ipyData.GetUnlockDefault():
|
| | | return
|
| | | GameWorld.Log("删除玩家聊天表情包: packID=%s,notifyMail=%s" % (packID, notifyMail), playerID)
|
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EmojiPackEndTime % packID, 0)
|
| | | |
| | | SyncEmojiPackInfo(curPlayer, [packID])
|
| | | if notifyMail:
|
| | | PlayerControl.SendMailByKey(notifyMail, [playerID], [], [packID])
|
| | | return True
|
| | |
|
| | | def SyncEmojiPackInfo(curPlayer, packIDList=None):
|
| | | if packIDList == None:
|
| | | syncIDList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetEmojiPackCount()):
|
| | | ipyData = ipyDataMgr.GetEmojiPackByIndex(index)
|
| | | syncIDList.append(ipyData.GetEmojiPackID())
|
| | | else:
|
| | | syncIDList = packIDList
|
| | | |
| | | packList = []
|
| | | for packID in syncIDList:
|
| | | state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EmojiPackState, packID)
|
| | | if not state and packIDList == None:
|
| | | continue
|
| | | pack = ChPyNetSendPack.tagMCEmojiPack()
|
| | | pack.PackID = packID
|
| | | pack.State = state
|
| | | pack.EndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EmojiPackEndTime % packID)
|
| | | packList.append(pack)
|
| | | |
| | | if not packList:
|
| | | return
|
| | | |
| | | clientPack = ChPyNetSendPack.tagMCEmojiPackInfo()
|
| | | clientPack.EmojiPackList = packList
|
| | | clientPack.Count = len(clientPack.EmojiPackList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
| | | import FormulaControl
|
| | | import PlayerGoldGift
|
| | | import PlayerFlashSale
|
| | | import PlayerChatBox
|
| | | import PlayerFace
|
| | | import PlayerWing
|
| | | import ChEquip
|
| | |
| | | PlayerDienstgrad.CheckDienstgradTimeout(curPlayer)
|
| | | # 时效头像
|
| | | PlayerFace.OnMinute(curPlayer)
|
| | | # 聊天气泡
|
| | | PlayerChatBox.OnMinute(curPlayer)
|
| | | return
|
| | |
|
| | | # 一定时间自动释放的被动技能
|
| | |
| | | )=range(5)
|
| | |
|
| | | # 战斗力模块类型
|
| | | Def_MFPType_Max = 36
|
| | | Def_MFPType_Max = 37
|
| | | ModuleFightPowerTypeList = (
|
| | | Def_MFPType_Role, # 角色 0
|
| | | Def_MFPType_Equip, # 装备(装备本身) 1
|
| | |
| | | Def_MFPType_GatherTheSoul, # 聚魂新 32
|
| | | Def_MFPType_Face, # 头像 33
|
| | | Def_MFPType_FacePic, # 头像框 34
|
| | | Def_MFPType_ChatBox, # 气泡框 35
|
| | | Def_MFPType_Other, # 其他
|
| | | ) = range(Def_MFPType_Max)
|
| | |
|