From 1296e35a96fb8a26993c73516f5ceefe8490e8a4 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 13 九月 2024 16:23:17 +0800
Subject: [PATCH] 10261 【越南】【砍树】【英文】仙盟徽章增加定制仙盟ID支持; 增加聊天气泡,聊天表情;
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ChatBox.py | 144 ++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py | 404 ++++++++++++++++++
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 4
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_EmojiPack.py | 30 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 3
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 52 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 210 ++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py | 1
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 52 ++
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 210 ++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py | 3
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py | 12
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 18
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 66 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 57 --
PySysDB/PySysDBPY.h | 25 +
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 3
PySysDB/PySysDBG.h | 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 14
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py | 5
20 files changed, 1,213 insertions(+), 101 deletions(-)
diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index fa31ed2..9aa97df 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -73,6 +73,7 @@
BYTE _EmblemID; //徽章ID
BYTE UnlockFamilyLV; //解锁仙盟等级,为0时代表其他方式解锁
DWORD ExpireMinutes; //有效时长,分钟
+ DWORD CustomFamilyID; //定制仙盟ID
};
//仙盟试炼伤血奖励表
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 0ca77f1..d92310a 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -2287,6 +2287,31 @@
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永久
};
//充值返利活动表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index b32ec8f..e0356cc 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -6240,6 +6240,58 @@
#------------------------------------------------------
+# 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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 369ee95..6743105 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -30636,18 +30636,17 @@
#------------------------------------------------------
# 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):
@@ -30656,33 +30655,98 @@
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
#------------------------------------------------------
@@ -30984,6 +31048,118 @@
#------------------------------------------------------
+# 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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 7b88456..fabe4d6 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -84,6 +84,7 @@
("BYTE", "EmblemID", 1),
("BYTE", "UnlockFamilyLV", 0),
("DWORD", "ExpireMinutes", 0),
+ ("DWORD", "CustomFamilyID", 0),
),
"FamilyBossHurtAward":(
@@ -1272,7 +1273,8 @@
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 GetExpireMinutes(self): return self.attrTuple[2] # 有效时长,分钟 DWORD
+ def GetCustomFamilyID(self): return self.attrTuple[3] # 定制仙盟ID DWORD
# 仙盟试炼伤血奖励表
class IPY_FamilyBossHurtAward():
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
index da087bb..50df712 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyEmblem.py
@@ -123,6 +123,9 @@
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))
@@ -180,8 +183,15 @@
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)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 26cd0af..961d8b8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1805,7 +1805,7 @@
)=range(5)
# 战斗力模块类型
-Def_MFPType_Max = 36
+Def_MFPType_Max = 37
ModuleFightPowerTypeList = (
Def_MFPType_Role, # 角色 0
Def_MFPType_Equip, # 装备(装备本身) 1
@@ -1842,6 +1842,7 @@
Def_MFPType_GatherTheSoul, # 聚魂新 32
Def_MFPType_Face, # 头像 33
Def_MFPType_FacePic, # 头像框 34
+Def_MFPType_ChatBox, # 气泡框 35
Def_MFPType_Other, # 其他
) = range(Def_MFPType_Max)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 0e693f8..a116533 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -323,6 +323,22 @@
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
@@ -554,7 +570,7 @@
PacketCMD_18=0xA2
PacketSubCMD_18=0x30
-PacketCallFunc_18=OnSetChatBubbleBox
+PacketCallFunc_18=
PacketCMD_19=0xA1
PacketSubCMD_19=0x08
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 5dd5a34..177193b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -520,6 +520,7 @@
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 #使用道具给予符印精华
@@ -4040,6 +4041,10 @@
#聊天气泡
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" #星级奖励领奖记录
@@ -5093,7 +5098,8 @@
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]
@@ -5138,6 +5144,7 @@
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],
}
@@ -5149,7 +5156,8 @@
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 = {
@@ -5168,7 +5176,7 @@
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:"气泡框",
}
#-------------------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index b32ec8f..e0356cc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -6240,6 +6240,58 @@
#------------------------------------------------------
+# 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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 369ee95..6743105 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -30636,18 +30636,17 @@
#------------------------------------------------------
# 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):
@@ -30656,33 +30655,98 @@
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
#------------------------------------------------------
@@ -30984,6 +31048,118 @@
#------------------------------------------------------
+# 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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ChatBox.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ChatBox.py
new file mode 100644
index 0000000..fb48fe7
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ChatBox.py
@@ -0,0 +1,144 @@
+#!/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 9e3c2e6..ad62a5e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1811,6 +1811,25 @@
("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":(
@@ -5151,7 +5170,36 @@
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 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():
@@ -6547,6 +6595,8 @@
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)
@@ -8003,6 +8053,20 @@
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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
index 17c0566..d5a8d3c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -737,6 +737,7 @@
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", # 增加聚灵效率
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py
index 192a518..ff2f1b6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py
@@ -16,9 +16,8 @@
#-------------------------------------------------------------------------------
import ItemCommon
+import PlayerChatBox
import ChConfig
-import ChPlayer
-
def BatchUseItem(curPlayer, curRoleItem, tick, useCnt, exData):
##批量使用物品
@@ -27,7 +26,7 @@
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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_EmojiPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_EmojiPack.py
new file mode 100644
index 0000000..c1448a2
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_EmojiPack.py
@@ -0,0 +1,30 @@
+#!/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
+
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 4189dc5..402d15f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -163,6 +163,7 @@
import PlayerChangeJob
import PlayerGuaji
import PlayerFace
+import PlayerChatBox
import PlayerXiangong
import PlayerMineArea
import PlayerActLoginNew
@@ -927,8 +928,6 @@
PlayerLuckyTreasure.OnLogin(curPlayer)
# 小助手
SyncLittleHelper(curPlayer)
- # 聊天气泡框
- SyncChatBubbleBoxState(curPlayer)
# 副本助战
FBHelpBattle.DoPlayerLogin(curPlayer)
# 聚魂
@@ -988,6 +987,7 @@
pass
else:
+ PlayerChatBox.OnPlayerLogin(curPlayer)
PlayerFace.OnPlayerLogin(curPlayer)
PlayerXiangong.OnPlayerLogin(curPlayer)
PlayerGubao.OnPlayerLogin(curPlayer)
@@ -3186,59 +3186,6 @@
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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py
new file mode 100644
index 0000000..eec6f21
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerChatBox.py
@@ -0,0 +1,404 @@
+#!/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
index 22be231..7d131bd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -55,6 +55,7 @@
import FormulaControl
import PlayerGoldGift
import PlayerFlashSale
+import PlayerChatBox
import PlayerFace
import PlayerWing
import ChEquip
@@ -1303,6 +1304,8 @@
PlayerDienstgrad.CheckDienstgradTimeout(curPlayer)
# 时效头像
PlayerFace.OnMinute(curPlayer)
+ # 聊天气泡
+ PlayerChatBox.OnMinute(curPlayer)
return
# 一定时间自动释放的被动技能
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 26cd0af..961d8b8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1805,7 +1805,7 @@
)=range(5)
# 战斗力模块类型
-Def_MFPType_Max = 36
+Def_MFPType_Max = 37
ModuleFightPowerTypeList = (
Def_MFPType_Role, # 角色 0
Def_MFPType_Equip, # 装备(装备本身) 1
@@ -1842,6 +1842,7 @@
Def_MFPType_GatherTheSoul, # 聚魂新 32
Def_MFPType_Face, # 头像 33
Def_MFPType_FacePic, # 头像框 34
+Def_MFPType_ChatBox, # 气泡框 35
Def_MFPType_Other, # 其他
) = range(Def_MFPType_Max)
--
Gitblit v1.8.0