#!/usr/bin/python # -*- coding: GBK -*- # ##@package # # @todo: Íæ¼ÒÁÄÌ죬ÓïÒô # # @author: Alee # @date 2018-4-25 ÏÂÎç02:30:25 # @version 1.0 # # @note: # #--------------------------------------------------------------------- import GameWorld import IPY_GameServer import PlayerControl import PyDataManager import ChConfig import EventReport import ChPyNetSendPack import NetPackCommon import PlayerFamilyParty import ChPyNetSendPack import ShareDefine import PlayerViewCache import ChNetSendPack import NetPackCommon import PlayerGeTui import re g_ChatMi = {} # ÀëÏßÁÄÌì¼Ç¼ {Íæ¼ÒID:[ÐÅÏ¢]} Ò»¸öÍæ¼Ò×î¶à8Ìõ def ChangeVoiceChat(content): #»ñÈ¡ÓïÒôÎÄ×ֵıêʶ #ÓïÒôĬÈÏ¿ªÍ·±ê¼Ç pat = re.compile(r'') keyStrList = pat.findall(content) if not keyStrList: return content lIndex = content.index(keyStrList[0]) if lIndex !=0: #±ê¼Ç±ØÐëÔÚ¿ªÍ· return content return content[len(keyStrList[0]):] ## ÃÜÆµ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatMi(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkMi() tagPlayer = GameWorld.GetPlayerManager().FindPlayerByName(sendPack.GetTargetName()) if tagPlayer == None: PlayerControl.NotifyCode(curPlayer, "CanootTalk10") return # ºÚÃûµ¥¼ì²é if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayer.GetID(), curPlayer): return talkType = sendPack.GetTalkType() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatMi(tagPlayer, talkType, content, extraValue, extras) PyDataManager.GetContactsManager().AddContactsBoth(curPlayer.GetID(), tagPlayer.GetID()) return ## ÃÜÆµÓÅ»¯(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatMiFix(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkMiFix() tagPlayerID = sendPack.GetPlayerID() tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) curCache = None tagPlayerName = "" if tagPlayer == None: curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID) if not curCache: PlayerControl.NotifyCode(curPlayer, "CanootTalk10") return else: tagPlayerName = tagPlayer.GetName() # ºÚÃûµ¥¼ì²é if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayerID, curPlayer): return if curCache: cacheDict = eval(curCache.GetPropData()) tagPlayerName = cacheDict["Name"] talkType = sendPack.GetTalkType() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() SendChatMi(curPlayer, tagPlayer, tagPlayerName, tagPlayerID, talkType, content, extraValue, extras) #curPlayer.ChatMi(tagPlayer, talkType, content, extraValue, extras) PyDataManager.GetContactsManager().AddContactsBoth(curPlayer.GetID(), tagPlayerID) return def SendChatMi(curPlayer, tagPlayer, tagPlayerName, tagPlayerID, talkType, content, extraValue, extras): global g_ChatMi sendPack = ChNetSendPack.tagTalkMi() sendPack.Clear() sendPack.TalkType = talkType #(BYTE TalkType)//0ΪĬÈÏ, 1Ϊ1¶Ô1ÁÄÌìÓà sendPack.SrcName = curPlayer.GetName() #(String SrcName)//size = SrcNameLen sendPack.SrcNameLen = len(sendPack.SrcName) #(BYTE SrcNameLen) sendPack.PlayerID = curPlayer.GetID() #(DWORD PlayerID) sendPack.ToNameLen = len(tagPlayerName) #(BYTE ToNameLen) sendPack.ToName = tagPlayerName #(String ToName)//size = ToNameLen sendPack.ToPlayerID = tagPlayerID #(DWORD ToPlayerID) sendPack.Len = len(content) #(WORD Len) sendPack.Content = content #(String Content)//size = Len sendPack.ExtraValue = extraValue #(DWORD ExtraValue)//¸½¼ÓÖµ sendPack.Extras = extras #(char Extras[256])//¸½¼ÓÖµÁбí NetPackCommon.SendFakePack(curPlayer, sendPack) if tagPlayer and not PlayerControl.GetIsTJG(tagPlayer): NetPackCommon.SendFakePack(tagPlayer, sendPack) else: # ÁôÑÔ ÉÏÏß֪ͨ£¬×î¶à8Ìõ,Ö±½Ó´æ´¢½á¹¹Ìå if tagPlayerID not in g_ChatMi: g_ChatMi[tagPlayerID] = [sendPack] else: g_ChatMi[tagPlayerID].append(sendPack) if len(g_ChatMi[tagPlayerID]) > 8: g_ChatMi[tagPlayerID].pop(0) return PlayerGeTui.ChatMiGeTui(tagPlayerID, tagPlayerName, curPlayer.GetName()) # µÇ¼ʱ½«ÀëÏßÏûϢϷ¢ def LoginChatMi(curPlayer): global g_ChatMi playerID = curPlayer.GetID() if playerID not in g_ChatMi: return chatList = g_ChatMi.pop(playerID) for chatPack in chatList: if not PyDataManager.GetContactsManager().FindContact(playerID, chatPack.PlayerID): # ÀëÏß˽ÁÄÌ«¶à£¬´ËÍæ¼Ò±»¼·³ö¶ÓÁÐ continue NetPackCommon.SendFakePack(curPlayer, chatPack) return ## ¹«Æµ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatGong(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkGong() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatGong(content, extraValue, extras) return ## ¶ÔƵ(·â°ü²ÎÊý) # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatTeam(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) sendPack = IPY_GameServer.IPY_GTalkDui() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatTeam(content, extraValue, extras) return ## ¼Ò×寵µÀÁÄÌì # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ChatFamily(index, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if curPlayer.GetFamilyID() == 0: GameWorld.Log("¼Ò×寵µÀÁÄÌì·â°ü´íÎó,Íæ¼ÒûÓмÒ×å" , curPlayer.GetPlayerID()) return sendPack = IPY_GameServer.IPY_GTalkBang() content = sendPack.GetContent() extraValue = sendPack.GetExtraValue() extras = sendPack.GetExtras() curPlayer.ChatFamily(content, extraValue, extras) #ÏÉÃËÑç»á´ðÌâ PlayerFamilyParty.OnTalkFamily(curPlayer, content, tick) return ## pyÀ®°È£¬Ö§³Ö¿ç·þ def ChatPYSpeaker(curPlayer, chatInfoList): SpeakerType, Text, extraValue, extras = chatInfoList accID = curPlayer.GetAccID() playerName = curPlayer.GetName() playerID = curPlayer.GetPlayerID() # ¿ç·þÀ®°È if SpeakerType == 2: pass #======================================================================= # playerName = PlayerControl.GetMergePlayerName(accID, playerName) # ת»¯Îª¿ç·þµÄÃû×Ö # dataMsg = [accID, 0, playerName, SpeakerType, Text, extraValue, extras] # MergeChildMsg.SendMergerChildToCenterStringData(ChConfig.Def_SendMergeLoudspeaker, dataMsg) # GameWorld.Log("·¢ËÍ¿ç·þÀ®°ÈÁÄÌì: accID=%s,Text=%s" % (accID, Text), playerID) #======================================================================= else: #GameWorld.DebugLog("·¢Ëͱ¾·þÀ®°ÈÁÄÌì: accID=%s,Text=%s" % (accID, Text), playerID) BroadCastPYSpeaker(accID, playerID, playerName, SpeakerType, Text, extraValue, extras) return ## ¹ã²¥À®°ÈÄÚÈÝ£¬Ö§³Ö¿ç·þ def BroadCastPYSpeaker(accID, playerID, playerName, SpeakerType, Text, extraValue, extras): if playerID == 0: player = GameWorld.GetPlayerManager().FindPlayerByAccID(accID) if player: playerID = player.GetPlayerID() speakerPack = ChPyNetSendPack.tagGCPYSpeakerContent() speakerPack.Clear() speakerPack.AccIDLen = len(accID) speakerPack.AccID = accID speakerPack.PlayerID = playerID speakerPack.NameLen = len(playerName) speakerPack.Name = playerName speakerPack.SpeakerType = SpeakerType speakerPack.TextLen = len(Text) speakerPack.Text = Text speakerPack.ExtraValue = extraValue speakerPack.Extras = extras # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò playerManager = GameWorld.GetPlayerManager() for i in range(playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(i) if player == None or not player.GetInitOK(): continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, speakerPack) return #----------ÓïÒô´¦Àí------------------------------------------------------ # ÔÝ×ö³ÉÍêȫת·¢£¬Èç¹ûºóÐøIOѹÁ¦¹ý´ó¸Ä³Éֻת·¢»ù±¾ÐÅÏ¢ ÈçÓïÒôÀ´Ô´¡¢Ê±³¤ºÍΨһ±êÖ¾ # ÓïÒôÊý¾ÝÉÏ´«×¨ÃÅ·þÎñÆ÷£¬½ÓÊÕÓû§¿É¸ù¾ÝΨһ±êÖ¾ÇëÇóÏÂÔØ£¬¿ÉÉ趨Êý¾Ý±£Áôʱ³¤ #=============================================================================== # //B3 07 ÓïÒôÁÄÌì #tagCGVoiceChat # # struct tagCGVoiceChat # { # tagHead Head; # BYTE ChannelType; // 1 ÊÀ½ç 2 ÏÉÃË 3 ˽ÁÄ(ºÃÓÑ) 4 ¶ÓÎé -------²é¿´·â°ütagCMVoiceChat 5 ÇøÓò # BYTE TargetNameLen; # char TargetName[TargetNameLen]; //size = TargetNameLen # DWORD TargetID; // ˽ÁÄĬÈÏ·¢Íæ¼ÒID£¬Ã»ÓÐID²Å·¢Ãû³Æ # WORD Len; # BYTE Content[Len]; //size = Len # }; #=============================================================================== def OnVoiceChat(index, clientPack, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if not CheckTalk(curPlayer, tick): return sendPack = ChPyNetSendPack.tagGCVoiceChat() sendPack.Clear() sendPack.ChannelType = clientPack.ChannelType sendPack.SrcName = curPlayer.GetName() sendPack.SrcNameLen = len(curPlayer.GetName()) sendPack.PlayerID = curPlayer.GetID() sendPack.Len = clientPack.Len sendPack.Content = clientPack.Content sendPack.Extras = GetTalkExtraValue(curPlayer) sendPack.ExtraValue = len(sendPack.Extras) playerManager = GameWorld.GetPlayerManager() if clientPack.ChannelType == ShareDefine.Def_ChannelChat_World: # ÊÀ½çƵµÀ curPlayer.BroadCastAll(sendPack.GetBuffer(), len(sendPack.GetBuffer())) elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Family: # ¼Ò×寵µÀ curFamily = curPlayer.GetFamily() if curFamily == None: return for i in range(0, curFamily.GetCount()): notifyMember = curFamily.GetAt(i) notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID()) if notifyPlayer == None or not notifyPlayer.GetInitOK(): continue if PlayerControl.GetIsTJG(notifyPlayer): continue #=================================================================== # if notifyPlayer.GetPlayerID() == curPlayer.GetPlayerID(): # #²»°üÀ¨×Ô¼º # continue #=================================================================== NetPackCommon.SendFakePack(notifyPlayer, sendPack) elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Team: # ¶ÓÎé curTeam = curPlayer.GetTeam() if curTeam == None: return for index in xrange(curTeam.GetMemberCount()): curMember = curTeam.GetMemberPlayer(index) if not curMember or not curMember.GetPlayerID(): continue #=================================================================== # if curMember.GetPlayerID() == curPlayer.GetPlayerID(): # #²»°üÀ¨×Ô¼º # continue #=================================================================== if PlayerControl.GetIsTJG(curMember): continue NetPackCommon.SendFakePack(curMember, sendPack) elif clientPack.ChannelType == ShareDefine.Def_ChannelChat_Private: # ˽ÁÄ tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(clientPack.TargetID) if not tagPlayer: tagPlayer = GameWorld.GetPlayerManager().FindPlayerByName(clientPack.TargetName) if tagPlayer == None: return # ºÚÃûµ¥¼ì²é if PyDataManager.GetBlacklistManager().CheckBlacklistBoth(curPlayer.GetID(), tagPlayer.GetID(), curPlayer): return sendPack.ToName = tagPlayer.GetName() sendPack.ToNameLen = len(tagPlayer.GetName()) sendPack.ToPlayerID = tagPlayer.GetID() NetPackCommon.SendFakePack(tagPlayer, sendPack) NetPackCommon.SendFakePack(curPlayer, sendPack) return ## »ñÈ¡ÁÄÌìÄÚÈݸ½¼ÓÖµ # @param player: ÁÄÌì¶ÔÏó # @return: ÁÄÌìÄÚÈݸ½¼ÓÖµ def GetTalkExtraValue(player): vipLv = player.GetVIPLv() # Íæ¼ÒvipµÈ¼¶ GMLevel = player.GetGMLevel() job = player.GetJob() extraValueStr = "" # vipµÈ¼¶ extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_VipLv)%vipLv # GM extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_GM)% (GMLevel > 0) # job extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_JOB)% job return extraValueStr ## ¸½¼ÓÐÅÏ¢µÄ³¤¶ÈÆ¥Åä # @param extraValueInfo: ¸½¼ÓÐÅÏ¢µÄ³¤¶È # @return: def GetTalkExtraValueStar(extraValueType): extraValueInfo = ShareDefine.Def_TalkExtraValue_LenDict.get(extraValueType) extraValueLen = extraValueInfo[1] - extraValueInfo[0] return "%0" + str(extraValueLen) + "d" def CheckTalk(curPlayer, tick): if PlayerControl.GetGMForbidenTalk(curPlayer): return False #¼ä¸ôʱ¼ä if tick - curPlayer.GetDictByKey(ChConfig.Def_TalkTick) < 1000: return False return True