From 95fcaaafe13a1c0a2ff7706fe7cc1964f921b7c3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 02 十一月 2018 14:04:26 +0800
Subject: [PATCH] 4399 【后端】【1.2.0】聊天新增支持气泡框选择功能
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 58 +++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 23 ++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 48 +++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py | 1
PySysDB/PySysDBPY.h | 11 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 4
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 58 +++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 9 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py | 35 +++++++
9 files changed, 238 insertions(+), 9 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index c7485d2..bb66ee7 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1340,4 +1340,13 @@
{
DWORD _FuncID; //功能ID
dict Award; //属性类型
-};
\ No newline at end of file
+};
+
+//聊天气泡表
+
+struct tagChatBubbleBox
+{
+ BYTE _BoxID; //气泡框ID
+ WORD NeedLV; //所需等级
+ BYTE NeedVIPLVGift; //所需购买VIP等级礼包
+};
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 9d6d46a..7cb7891 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -6594,7 +6594,7 @@
("SubCmd", c_ubyte),
("MapID", c_int), # 请求进入的地图ID
("AskType", c_ubyte), # 请求类型: 0-匹配请求;1-进入请求
- ("Reason", c_ubyte), # 失败原因:
+ ("Reason", c_ubyte), # 失败原因:2-次数不足;3-进入CD中;6-门票不足
]
def __init__(self):
@@ -16778,6 +16778,62 @@
#------------------------------------------------------
+# A7 17 聊天气泡框状态 #tagMCChatBubbleBoxState
+
+class tagMCChatBubbleBoxState(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("UseBoxID", c_ubyte), # 当前使用的气泡框ID
+ ("BoxState", c_int), # 按二进制位存储代表是否已开启,暂支持31位,以后有需要再加
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA7
+ self.SubCmd = 0x17
+ 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 = 0xA7
+ self.SubCmd = 0x17
+ self.UseBoxID = 0
+ self.BoxState = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagMCChatBubbleBoxState)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A7 17 聊天气泡框状态 //tagMCChatBubbleBoxState:
+ Cmd:%s,
+ SubCmd:%s,
+ UseBoxID:%d,
+ BoxState:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.UseBoxID,
+ self.BoxState
+ )
+ return DumpString
+
+
+m_NAtagMCChatBubbleBoxState=tagMCChatBubbleBoxState()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChatBubbleBoxState.Cmd,m_NAtagMCChatBubbleBoxState.SubCmd))] = m_NAtagMCChatBubbleBoxState
+
+
+#------------------------------------------------------
# A7 13 动态障碍物状态 #tagMCDynamicBarrierState
class tagMCDynamicBarrier(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index aaa490d..e09a05d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -420,6 +420,7 @@
Def_Effect_AddKillBossCnt = 234 # 增加BOSS可击杀次数
Def_Effect_DogzEquipPlusExp = 235 # 神兽强化材料经验效果,A值基础经验,B值双倍强化消耗仙玉
Def_Effect_AddMagicWeaponUpExp = 236 # 增加法宝升星经验 A值法宝ID B值X经验
+Def_Effect_ChatBubbleBox = 237 # 激活聊天气泡框,A值气泡框ID
#----以下未使用或代码依然存在的---
Def_Effect_ItemGiveGongXun = 1920 #使用道具给予功勋
Def_Effect_ItemGiveHonorPoint = 1922 #使用道具给予荣誉积分
@@ -3631,6 +3632,11 @@
Def_PDict_WishingWellRefreshCnt = "WishingWellRefreshCnt" # 付费刷新次数
Def_PDict_WishingWellItem = "WishingWellItem_%s_%s" # 物品ID,是否极品、是否绑定信息 参数(类型,物品数据)
Def_PDict_WishingWellItemCnt = "WishingWellItemCnt_%s_%s" # 物品数量记录 参数(类型,物品数据)
+
+#聊天气泡
+Def_PDict_ChatBubbleBoxUseID = "ChatBubbleBoxUseID" # 聊天气泡当前使用的气泡框ID
+Def_PDict_ChatBubbleBoxState = "ChatBubbleBoxState_%s" # 聊天气泡状态, 参数(key编号)
+
#-------------------------------------------------------------------------------
#类型 Def_PDictType_OnlinePrize
Def_PDict1_OnlinePrizeCnt = "OnlinePrizeCnt" # 新手在线已领取奖励次数
@@ -4730,7 +4736,8 @@
ItemDel_AddFBCnt, # 增加副本可进入次数 31
ItemDel_AddKillBossCnt, # 增加BOSS可击杀次数 32
ItemDel_DogzEquipPlus, # 神兽装备强化
-) = range(2000, 2000 + 34)
+ItemDel_ChatBubbleBox, # 激活聊天气泡框
+) = range(2000, 2000 + 35)
# 物品扣除类型对应信息 {类型:eventName, ...}
ItemDelTypeDict = {
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 9d6d46a..7cb7891 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -6594,7 +6594,7 @@
("SubCmd", c_ubyte),
("MapID", c_int), # 请求进入的地图ID
("AskType", c_ubyte), # 请求类型: 0-匹配请求;1-进入请求
- ("Reason", c_ubyte), # 失败原因:
+ ("Reason", c_ubyte), # 失败原因:2-次数不足;3-进入CD中;6-门票不足
]
def __init__(self):
@@ -16778,6 +16778,62 @@
#------------------------------------------------------
+# A7 17 聊天气泡框状态 #tagMCChatBubbleBoxState
+
+class tagMCChatBubbleBoxState(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("UseBoxID", c_ubyte), # 当前使用的气泡框ID
+ ("BoxState", c_int), # 按二进制位存储代表是否已开启,暂支持31位,以后有需要再加
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA7
+ self.SubCmd = 0x17
+ 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 = 0xA7
+ self.SubCmd = 0x17
+ self.UseBoxID = 0
+ self.BoxState = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagMCChatBubbleBoxState)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A7 17 聊天气泡框状态 //tagMCChatBubbleBoxState:
+ Cmd:%s,
+ SubCmd:%s,
+ UseBoxID:%d,
+ BoxState:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.UseBoxID,
+ self.BoxState
+ )
+ return DumpString
+
+
+m_NAtagMCChatBubbleBoxState=tagMCChatBubbleBoxState()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCChatBubbleBoxState.Cmd,m_NAtagMCChatBubbleBoxState.SubCmd))] = m_NAtagMCChatBubbleBoxState
+
+
+#------------------------------------------------------
# A7 13 动态障碍物状态 #tagMCDynamicBarrierState
class tagMCDynamicBarrier(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index de04888..20f13c3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1064,6 +1064,12 @@
("DWORD", "FuncID", 1),
("dict", "Award", 0),
),
+
+ "ChatBubbleBox":(
+ ("BYTE", "BoxID", 1),
+ ("WORD", "NeedLV", 0),
+ ("BYTE", "NeedVIPLVGift", 0),
+ ),
}
@@ -3230,6 +3236,19 @@
def GetFuncID(self): return self.FuncID # 功能ID
def GetAward(self): return self.Award # 属性类型
+
+# 聊天气泡表
+class IPY_ChatBubbleBox():
+
+ def __init__(self):
+ self.BoxID = 0
+ self.NeedLV = 0
+ self.NeedVIPLVGift = 0
+ return
+
+ def GetBoxID(self): return self.BoxID # 气泡框ID
+ def GetNeedLV(self): return self.NeedLV # 所需等级
+ def GetNeedVIPLVGift(self): return self.NeedVIPLVGift # 所需购买VIP等级礼包
def Log(msg, playerID=0, par=0):
@@ -3451,6 +3470,8 @@
self.ipyWishingWellLen = len(self.ipyWishingWellCache)
self.ipyFunctionForecastCache = self.__LoadFileData("FunctionForecast", IPY_FunctionForecast)
self.ipyFunctionForecastLen = len(self.ipyFunctionForecastCache)
+ self.ipyChatBubbleBoxCache = self.__LoadFileData("ChatBubbleBox", IPY_ChatBubbleBox)
+ self.ipyChatBubbleBoxLen = len(self.ipyChatBubbleBoxCache)
Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
Log("IPY_DataMgr InitOK!")
return
@@ -3813,6 +3834,8 @@
def GetWishingWellByIndex(self, index): return self.ipyWishingWellCache[index]
def GetFunctionForecastCount(self): return self.ipyFunctionForecastLen
def GetFunctionForecastByIndex(self, index): return self.ipyFunctionForecastCache[index]
+ def GetChatBubbleBoxCount(self): return self.ipyChatBubbleBoxLen
+ def GetChatBubbleBoxByIndex(self, index): return self.ipyChatBubbleBoxCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
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 ed2f6f1..8e7645f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -713,6 +713,7 @@
ChConfig.Def_Effect_AddFBCnt:"Item_AddFBCnt", # 增加副本可进入次数
ChConfig.Def_Effect_AddKillBossCnt:"Item_AddKillBossCnt", # 增加BOSS可击杀次数
ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # 增加法宝升星经验
+ ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # 激活聊天气泡框
#ChConfig.Def_PhoneVip_EffID:"Item_AddPhoneVip", # 手机VIP物品卡
#ChConfig.Def_Effect_AddZhenQiByTimes:"Item_AddZhenQiByTimes", # 增加真气按一天使用次数减少
#ChConfig.Def_Effect_AddPrestige:"Item_AddPrestige", # 给人物威望
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
new file mode 100644
index 0000000..192a518
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/Item_ChatBubbleBox.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package UseItem.Item_ChatBubbleBox
+#
+# @todo:激活聊天气泡框
+# @author hxp
+# @date 2018-11-01
+# @version 1.0
+#
+# 详细描述: 激活聊天气泡框
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2018-11-01 21:30"""
+#-------------------------------------------------------------------------------
+
+import ItemCommon
+import ChConfig
+import ChPlayer
+
+
+def BatchUseItem(curPlayer, curRoleItem, tick, useCnt, exData):
+ ##批量使用物品
+ curEff = curRoleItem.GetEffectByIndex(0)
+ bubbleBoxID = curEff.GetEffectValue(0)
+ if not bubbleBoxID:
+ return
+
+ if not ChPlayer.DoActivateChatBubbleBox(curPlayer, bubbleBoxID):
+ return
+
+ ItemCommon.DelItem(curPlayer, curRoleItem, useCnt, True, ChConfig.ItemDel_ChatBubbleBox)
+ return True, useCnt
+
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 ba7d046..fe318e1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -552,6 +552,8 @@
curPlayer.SendDBQueryRecharge()
# 小助手
SyncLittleHelper(curPlayer)
+ # 聊天气泡框
+ SyncChatBubbleBoxState(curPlayer)
curPlayer.SetState(0) # 脱机挂恢复为正常上线
curPlayer.SetFacePic(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
@@ -2538,7 +2540,51 @@
#};
def OnSetChatBubbleBox(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- PlayerControl.SetChatBubbleBox(curPlayer, clientData.BubbleBoxType)
+ 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.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ChatBubbleBoxUseID, useBoxID)
+ SyncChatBubbleBoxState(curPlayer)
+ 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):
+ ## 同步聊天气泡框状态
+ useBoxID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBubbleBoxUseID)
+ boxState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ChatBubbleBoxState % 0)
+ if not useBoxID and not boxState:
+ return
+ boxStatePack = ChPyNetSendPack.tagMCChatBubbleBoxState()
+ boxStatePack.UseBoxID = useBoxID
+ boxStatePack.BoxState = boxState
+ NetPackCommon.SendFakePack(curPlayer, boxStatePack)
return
#// A2 29 设置小助手 #tagCMSetLittleHelper
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 5b3bbcc..7bc9b95 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -5641,10 +5641,6 @@
def GetVIPExpireTime(curPlayer): return curPlayer.GetExAttr9()
def SetVIPExpireTime(curPlayer, expireTime): return curPlayer.SetExAttr9(expireTime, False, True)
-##聊天气泡框
-def GetChatBubbleBox(curPlayer): return curPlayer.GetExAttr10()
-def SetChatBubbleBox(curPlayer, value): return curPlayer.SetExAttr10(value, False, False)
-
##获得玩家威望值
def GetPrestige(curPlayer): return 0
def SetPrestige(curPlayer, value): return
--
Gitblit v1.8.0