| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| ##@package  | 
| #  | 
| # @todo: Íæ¼ÒÁÄÌìÂß¼ Ö§³ÖÓïÒô  | 
| #  | 
| # @author: Alee  | 
| # @date 2018-4-24 ÏÂÎç07:36:28  | 
| # @version 1.0  | 
| #  | 
| # @note:   | 
| #  | 
| #---------------------------------------------------------------------  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import PlayerControl  | 
| import ChConfig  | 
| import FBLogic  | 
| #import ReadChConfig  | 
| import ShareDefine  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import EventReport  | 
| import PlayerSuccess  | 
| import IpyGameDataPY  | 
| import ItemCommon  | 
| import ChItem  | 
| import PlayerTJG  | 
| #---------------------------------------------------------------------  | 
|   | 
|   | 
| ## ÇøÓòƵµÀ(·â°ü²ÎÊý)   | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| #  Õû¸öµØÍ¼µÄÈ˶¼¿ÉÒÔÌýµ½  | 
| def TalkArea(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #»ñµÃÇøÓòƵ·â°ü  | 
|     sendPack = IPY_GameWorld.IPY_CTalkArea()  | 
|     #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     content = sendPack.GetContent()  | 
|       | 
|     #ͨÓÃÅÐ¶Ï  | 
|     if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick):  | 
|         return  | 
|       | 
|     #ͨÓÃÉèÖà  | 
|     SetTalkTime(curPlayer, content, IPY_GameWorld.tcArea, tick)  | 
|       | 
|       | 
|     #Èç¹ûÔÚÆÕͨµØÍ¼, ¾Í¹ã²¥, Èç¹ûÔÚ¸±±¾¾Íµ¥¸ö֪ͨ  | 
|     if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:  | 
|         #¹ã²¥  | 
|         extras = GetTalkExtraValue(curPlayer)  | 
|         curPlayer.ChatArea(content, 0, extras)  | 
|     else:  | 
|         __DoLogic_FB_TalkArea(curPlayer, content)  | 
|       | 
|     return True  | 
|   | 
| ## ¸±±¾ÖÐ˵»°  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param content ½²»°µÄÄÚÈÝ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __DoLogic_FB_TalkArea(curPlayer, content):  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|       | 
|     for index in range(0 , playerManager.GetPlayerCount()):  | 
|         #¹ã²¥Íæ¼Ò  | 
|         tempPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not tempPlayer.GetPlayerID():  | 
|             continue  | 
|           | 
|         #µ¥¸ö¹ã²¥Ëµ»°  | 
|         extras = GetTalkExtraValue(curPlayer)  | 
|         tempPlayer.Sync_ChatArea(curPlayer.GetPlayerID(), content, 0, extras)  | 
|           | 
|     return  | 
|   | 
| ## ÊÀ½çƵµÀ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TalkWorld(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CTalkGong()  | 
|     #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     content = sendPack.GetContent()  | 
|       | 
|     #ͨÓüì²â  | 
|     if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, checkSameMsg = False):  | 
|         return  | 
|               | 
|     #ͨÓÃÉèÖà  | 
|     SetTalkTime(curPlayer, content, IPY_GameWorld.tcWorld, tick)  | 
|     #·¢ËÍÁÄÌìÄÚÈÝ  | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|     curPlayer.ChatGong(content, 0, extras)  | 
|     #ÊÀ½çƵµÀ·¢ÑÔ³É¾Í  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalkWorld, 1)  | 
|     return  | 
|   | 
| ## ¹ú¼ÒƵµÀ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TalkCountry(index, tick):  | 
|     #===========================================================================  | 
|     # #20150918 hxpĿǰ×÷Ϊ¿ç·þÕóÓªÁÄÌìÆµµÀ  | 
|     # #20151009 hxpÔö¼Ópy×Ô¶¨ÒåÁÄÌìÆµµÀ  | 
|     # return  | 
|     # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     #   | 
|     #   | 
|     # #µÈ¼¶ÅÐ¶Ï  | 
|     # #if curPlayer.GetLV() < ChConfig.Def_PlayerTalkCountryLV:  | 
|     # #    PlayerControl.NotifyCode(curPlayer, "PlayerCall_Error_NoCountry")  | 
|     # #    return  | 
|     #   | 
|     # #»ñµÃ¹ú¼ÒƵ·â°ü  | 
|     # sendPack = IPY_GameWorld.IPY_CTalkCountry()  | 
|     # #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     # content = sendPack.GetContent()  | 
|     #   | 
|     # #ͨÓÃÅÐ¶Ï  | 
|     # if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick):  | 
|     #    return  | 
|     #   | 
|     # #¹úÍõ˵»°Ãâ·Ñ  | 
|     # #if PlayerCountry.CheckIsCountryKing(curPlayer.GetCountry() , curPlayer.GetID()):  | 
|     # #    PlayerControl.NotifyCode(curPlayer , "C16615EF-FDBC-49AF-9285668F7C8930AA")  | 
|     # #else:  | 
|     # #    moneyType = curPlayer.GetUseSilverType()  | 
|     # #    #½ðÇ®Åж¨  | 
|     # #    if not PlayerControl.PayMoney(curPlayer, moneyType, ChConfig.Def_PlayerTalkCoutryMoney):  | 
|     # #        return False  | 
|     #   | 
|     # #ͨÓÃÉèÖà  | 
|     # SetTalkTime(curPlayer, content, IPY_GameWorld.tcCountry, tick)  | 
|     #   | 
|     # #˵»°  | 
|     # extraValue = GetTalkExtraValue(curPlayer)  | 
|     # extras = ''  | 
|     # curPlayer.ChatCountry(content, extraValue, extras)  | 
|     #===========================================================================  | 
|     return  | 
|   | 
| ## ÁªÃ˼Ò×寵µÀ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TalkFamily(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if curPlayer.GetFamilyID() == 0:  | 
|         PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_0 ")  | 
|         return  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CTalkBang()  | 
|     #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     content = sendPack.GetContent()  | 
|       | 
|     if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick):  | 
|         return  | 
|       | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|     curPlayer.ChatFamily(content, 0, extras)  | 
|     #ÏÉÃËÆµµÀ·¢ÑÔ³É¾Í  | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_TalkFamily, 1)  | 
|     return  | 
|   | 
| ## ¶ÓÎ鯵µÀ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TalkTeam(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     if curPlayer.GetTeam() == None:  | 
|         PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_161795 ")  | 
|         return  | 
|       | 
|     sendPack = IPY_GameWorld.IPY_CTalkDui()  | 
|     #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     content = sendPack.GetContent()  | 
|       | 
|     if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick):  | 
|         return  | 
|       | 
|     #ͨÓÃÉèÖà  | 
|     SetTalkTime(curPlayer, content, IPY_GameWorld.tcTeam, tick)  | 
|     #˵»°  | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|     curPlayer.ChatTeam(content, 0, extras)  | 
|     return  | 
|   | 
|   | 
| ## Ë½ÁÄÆµµÀ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TalkPrivate(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CTalkMiFix()  | 
|       | 
|     #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     content = sendPack.GetContent()  | 
|       | 
|     if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick):  | 
|         return  | 
|       | 
|     #ͨÓÃÉèÖà  | 
|     SetTalkTime(curPlayer, content, IPY_GameWorld.tcPrivate, tick)  | 
|     #˵»°  | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|     curPlayer.ChatMiByID(sendPack.GetTalkType(), sendPack.GetPlayerID(), content, 0, extras)  | 
|     return  | 
|   | 
|   | 
| ## Ë½ÁÄÆµµÀ(·â°ü²ÎÊý)  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def TalkPrivateName(index, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     sendPack = IPY_GameWorld.IPY_CTalkMi()  | 
|     #Íæ¼ÒÁÄÌìÄÚÈÝ  | 
|     content = sendPack.GetContent()  | 
|       | 
|     if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick):  | 
|         return  | 
|       | 
|     #ͨÓÃÉèÖà  | 
|     SetTalkTime(curPlayer, content, IPY_GameWorld.tcPrivate, tick)  | 
|     #˵»°  | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|     curPlayer.ChatMiByName(sendPack.GetTalkType(), sendPack.GetTargetName(), content, 0, extras)  | 
|     return  | 
|   | 
|       | 
| #-3ÃëÖØ¸´,;ÁÄÌìÐÅϢ̫³¤  | 
| ## ÁÄÌìͨÓüì²é   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò   | 
| #  @param content ÁÄÌìÄÚÈÝ   | 
| #  @param length ÁÄÌ쳤¶È   | 
| #  @param tick µ±Ç°Ê±¼ä   | 
| #  @param checkGMForbidenTalk ¼ì²éÊÇ·ñ½ûÑÔ   | 
| #  @param checkSameMsg ÊÇ·ñ¼ì²éÏàͬÐÅÏ¢  | 
| #  @return True or False  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __CheckTalk(curPlayer, content, length, tick, checkGMForbidenTalk = True, checkSameMsg = True):  | 
|     if checkGMForbidenTalk and GetGMToolForbidTalk(curPlayer):  | 
|         #GeRen_chenxin_921745 ¶Ô²»Æð£¬ÄúÒѱ»GM½ûÑÔ£¬·¢ËÍÐÅϢʧ°Ü  | 
|         #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_921745")  | 
|         return False  | 
|       | 
|     #¼ä¸ôʱ¼ä  | 
|     if tick - curPlayer.GetLastChatTick() < ChConfig.Def_PlayerTalkTick:  | 
|         #PlayerControl.NotifyCode(curPlayer, "CanootTalk02")  | 
|         return False  | 
|       | 
|     #ÁÄÌìÐÅϢ̫³¤  | 
|     if length > ChConfig.Def_PlayerTalkMaxCount :  | 
|         PlayerControl.NotifyCode(curPlayer, "CanootTalk13")  | 
|         return False  | 
|       | 
|     #²»ÄÜÖ»·¢¿Õ¸ñ  | 
|     if content.strip() == '':  | 
|         PlayerControl.NotifyCode(curPlayer, "CanootTalk14")  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## »ñµÃÍæ¼ÒÊÇ·ñ±»½ûÑÔ   | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @return ÊÇ·ñ½ûÑÔ  | 
| def GetGMToolForbidTalk(curPlayer):  | 
|       | 
|     #accIDForbid = (curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalk)) > 0  | 
|       | 
|     return curPlayer.GetGMForbidenTalk()# or accIDForbid  | 
|   | 
|   | 
| ## ÁÄÌìʱ¼äͨÓÃÉèÖà  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param content ÁÄÌìÄÚÈÝ  | 
| #  @param type ÀàÐÍ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def SetTalkTime(curPlayer, content, type, tick):  | 
|     #ÉèÖõ±Ç°Ê±¼äÎªÍæ¼Ò¿ªÊ¼ÁÄÌìʱ¼ä  | 
|     curPlayer.SetLastChatTick(tick)  | 
|     #ÉèÖõ±Ç°ÁÄÌìÄÚÈÝÎªÍæ¼Ò±¾´ÎÁÄÌìÄÚÈÝ  | 
|     #curPlayer.SetLastChatContent(content)  | 
|     #ÉèÖõ±Ç°ÆµµÀʱ¼ä  | 
|     #curPlayer.SetTalkTick(type, tick)  | 
|     return  | 
|   | 
| ## Ðżþ2B·â°ü  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def GBLetter(index, tick):  | 
|     #===========================================================================  | 
|     # curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     # sendPack = IPY_GameWorld.IPY_CGBLetter()  | 
|     #   | 
|     # if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_GBLetter) <= ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_GBLetter]:  | 
|     #    #·¢ÐÅ1Ãë¼ä¸ô  | 
|     #    return  | 
|     #   | 
|     # curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_GBLetter, tick)  | 
|     #   | 
|     # #Ðżþ±êÌâºÍÄÚÈÝ  | 
|     # titleStr = sendPack.GetTitle()  | 
|     # contentStr = sendPack.GetContent()  | 
|     #   | 
|     # #·¢¸øGM  | 
|     # curPlayer.Interface_SendGMLetter(titleStr, contentStr)  | 
|     #===========================================================================  | 
|     return  | 
|       | 
| ## ¼ÇÂ¼Íæ¼ÒÁÄÌìÄÚÈÝ  | 
| #  @param messageStr ÁÄÌìÀàÐÍ  | 
| #  @param curPlayer ÁÄÌìµÄÍæ¼Ò  | 
| #  @param tagPlayer None  | 
| #  @param content ÁÄÌìÄÚÈÝ  | 
| #  @param addinfo ¶îÍâÐÅÏ¢  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def __LogInDBPlayerTalk(messageStr , curPlayer , tagPlayer , content, addinfo=""):  | 
|     # Óɿͻ§¶ËÏòºǫ́·¢ËÍ  | 
|     return  | 
|     #===========================================================================  | 
|     # tagName = "" if not tagPlayer else tagPlayer.GetName()  | 
|     # #EventReport.WriteEvent_chat_log(curPlayer, content, messageStr, tagName, addinfo)  | 
|     # gameWorld = GameWorld.GetGameWorld()  | 
|     # #¿ª¹ØÎ´¿ªÆô  | 
|     # if not gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_PurTalk):  | 
|     #    return  | 
|     #   | 
|     # #½«ÁÄÌìÄÚÈÝ´æÈëÊý¾Ý¿â  | 
|     # gameWorld.DataServer_TalkTrace('%s'%(messageStr), curPlayer, tagPlayer, content)  | 
|     # return  | 
|     #===========================================================================  | 
|   | 
|   | 
| ## »ñÈ¡ÁÄÌìÄÚÈݸ½¼ÓÖµ  | 
| #  @param objTalk: ÁÄÌì¶ÔÏó  | 
| #  @return: ÁÄÌìÄÚÈݸ½¼ÓÖµ  | 
| def GetTalkExtraValue(objTalk):  | 
|     vipLv = objTalk.GetVIPLv()  # Íæ¼ÒvipµÈ¼¶  | 
|     GMLevel = objTalk.GetGMLevel()  | 
|     job = objTalk.GetJob()  | 
|     #mergeWarRank = PlayerControl.GetMergeWarRank(objTalk)   | 
|     #freshmanGuiderDay = PlayerFreshmanGuide.GetFreshmanGuiderDay(objTalk)  | 
|       | 
|     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  | 
|     # ÆøÅÝ¿ò  | 
|     extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_BubbleBox) % PlayerControl.GetChatBubbleBox(objTalk)  | 
|       | 
|     # ¿ç·þԤѡÈüÅÅλ(³Æºô)  | 
|     #extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_MergeWarRank)%mergeWarRank  | 
|     # ÐÂÊÖÖ¸µ¼Ô±  | 
|     #extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_NewGuider)% (freshmanGuiderDay > 0)  | 
|     # QQ»áÔ±  | 
|     #operateInfo = int(objTalk.GetOperateInfo())  | 
|     #extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_QQOperate)% (operateInfo)  | 
|     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"  | 
|   | 
|   | 
| #// A2 17 À®°ÈÁÄÌì #tagCMPYSpeaker  | 
| #  | 
| #struct    tagCMPYSpeaker  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        SpeakerType;        //1-±¾·þ£»2-¿ç·þ  | 
| #    BYTE        IsUseGold;        //ÊÇ·ñʹÓÃ×êʯ  | 
| #    BYTE        ItemIndex;        //ʹÓÃÎïÆ·Ëµ»°Ê±, ÎïÆ·Index  | 
| #    BYTE        TextLen;        //×Ö·û³¤¶È  | 
| #    char        Text[TextLen];        //size = TextLen  | 
| #};  | 
| def OnUsePYSpeaker(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     SpeakerType = clientData.SpeakerType  | 
|     IsUseGold = clientData.IsUseGold  | 
|     ItemIndex = clientData.ItemIndex  | 
|     TextLen = clientData.TextLen  | 
|     Text = clientData.Text  | 
|       | 
|     #GameWorld.Log("Íæ¼ÒÀ®°ÈÁÄÌì: SpeakerType=%s,IsUseGold=%s,ItemIndex=%s"   | 
|     #              % (SpeakerType, IsUseGold, ItemIndex), playerID)  | 
|     if not __CheckTalk(curPlayer, Text, TextLen, tick):  | 
|         return  | 
|       | 
|   | 
|     if IsUseGold:  | 
|         bugleItemID = IpyGameDataPY.GetFuncCfg('BugleItem', SpeakerType)  | 
|         if not bugleItemID:  | 
|             GameWorld.ErrLog("¹¦ÄÜÅäÖñíûÓÐÅäÖöÔÓ¦À®°ÈÀàÐÍÎïÆ·ÏûºÄ£¡SpeakerType=%s,Çë¼ì²éBugleItem!" % SpeakerType)  | 
|             return  | 
|         costMoney = ItemCommon.GetAutoBuyItemNeedGold({bugleItemID:1})  | 
|         if not costMoney:  | 
|             return  | 
|         moneyType = IPY_GameWorld.TYPE_Price_Gold_Money  | 
|         infoDict = {"SpeakerType":SpeakerType, ChConfig.Def_Cost_Reason_SonKey:bugleItemID}  | 
|         if not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, ChConfig.Def_Cost_UseSpeaker, infoDict, 1):  | 
|             return  | 
|       | 
|     # ¼ì²éʹÓÃÀ®°ÈµÀ¾ß  | 
|     elif not ChItem.DoSpeaker_UseItem(curPlayer, ItemIndex, SpeakerType):  | 
|         GameWorld.Log("    À®°ÈµÀ¾ß²»¿ÉÓã¡", playerID)  | 
|         return  | 
|       | 
|     #֪ͨÊÀ½ç·þÎñÆ÷,ʹÓÃСÀ®°È  | 
|     extraValue = 0  | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|     msgList = str([SpeakerType, Text, extraValue, extras])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, 'PYSpeaker', msgList, len(msgList))  | 
|   | 
|     return  | 
|   | 
|   | 
|   | 
| #// A2 16 ×Ô¶¨ÒåÍæ¼ÒÁÄÌì #tagCMPyTalk  | 
| #  | 
| #struct    tagCMPyTalk  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        TalkType;        // ×Ô¶¨ÒåÁÄÌìÀàÐÍ  | 
| #    WORD        Len;  | 
| #    char        Content[Len];        //size = Len  | 
| #};  | 
| ## ×Ô¶¨ÒåÍæ¼ÒÁÄÌì  | 
| #  @param index  | 
| #  @param clientData  | 
| #  @param tick  | 
| #  @return  | 
| def OnPyTalk(index, clientData, tick):  | 
|     return  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     #GameWorld.DebugLog("OnPyTalk, Name:%s" % curPlayer.GetPlayerName())  | 
|       | 
|     talkType = clientData.TalkType  | 
|     contentLen = clientData.Len  | 
|     content = clientData.Content  | 
|       | 
|     if talkType not in ShareDefine.TalkTypeList:  | 
|         GameWorld.ErrLog("OnPyTalk talkType(%s) is not define!" % talkType, curPlayer.GetPlayerID())  | 
|         return  | 
|       | 
|     #ͨÓÃÅÐ¶Ï  | 
|     if not __CheckTalk(curPlayer, content, contentLen, tick):  | 
|         return  | 
|       | 
|     #˵»°  | 
|     extraValue = 0  | 
|     extras = GetTalkExtraValue(curPlayer)  | 
|       | 
|     isChatOK = False  | 
|     if talkType == ShareDefine.Def_TalkType_FBFaction:  | 
|         isChatOK = __ChatFBFaction(curPlayer, talkType, content, extraValue, extras)  | 
|           | 
|     if not isChatOK:  | 
|         return  | 
|       | 
|     #ÉèÖõ±Ç°Ê±¼äÎªÍæ¼Ò¿ªÊ¼ÁÄÌìʱ¼ä  | 
|     curPlayer.SetLastChatTick(tick)  | 
|     #ÉèÖõ±Ç°ÁÄÌìÄÚÈÝÎªÍæ¼Ò±¾´ÎÁÄÌìÄÚÈÝ  | 
|     curPlayer.SetLastChatContent(content)  | 
|       | 
|     return True  | 
|   | 
| ## py×Ô¶¨ÒåÁÄÌìÍÆËͰü  | 
| def __GetPyTalkPack(curPlayer, talkType, content, extraValue, extras):  | 
|     pyTalk = ChPyNetSendPack.tagMCPyTalk()  | 
|     pyTalk.Clear()  | 
|     pyTalk.TalkType = talkType  | 
|     pyTalk.Name = curPlayer.GetPlayerName()  | 
|     pyTalk.NameLen = len(pyTalk.Name)  | 
|     pyTalk.PlayerID = curPlayer.GetPlayerID()  | 
|     pyTalk.Len = len(content)  | 
|     pyTalk.Content = content  | 
|     pyTalk.ExtraValue = extraValue  | 
|     pyTalk.Extras = extras  | 
|     return pyTalk  | 
|   | 
| ## ¸±±¾ÕóÓªÁÄÌì  | 
| def __ChatFBFaction(curPlayer, talkType, content, extraValue, extras):  | 
|     curFaction = curPlayer.GetFaction()  | 
|     if not curFaction:  | 
|         return False  | 
|       | 
|     pyTalkPack = __GetPyTalkPack(curPlayer, talkType, content, extraValue, extras)  | 
|       | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for index in range(playerManager.GetPlayerCount()):  | 
|         player = playerManager.GetPlayerByIndex(index)  | 
|         if not player:  | 
|             continue  | 
|           | 
|         if player.GetFaction() != curFaction:  | 
|             continue  | 
|           | 
|         if PlayerTJG.GetIsTJG(player):  | 
|             continue  | 
|           | 
|         NetPackCommon.SendFakePack(player, pyTalkPack)  | 
|           | 
|     return True  | 
|   | 
|   | 
| #===============================================================================  | 
| # //A2 26 ÓïÒôÁÄÌì #tagCMVoiceChat  | 
| #   | 
| # struct    tagCMVoiceChat  | 
| # {  | 
| #    tagHead        Head;  | 
| #    BYTE        ChannelType;     //  5 ÇøÓò --- ²é¿´·â°ütagCGVoiceChat 1 ÊÀ½ç 2 ÏÉÃË 3 Ë½ÁÄ(ºÃÓÑ) 4 ¶ÓÎé  | 
| #    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 GetGMToolForbidTalk(curPlayer):  | 
|         return  | 
|     if clientPack.ChannelType != ShareDefine.Def_ChannelChat_Area:  | 
|         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)  | 
|       | 
|     # ÇøÓòƵµÀ  | 
|       | 
|     #Èç¹ûÔÚÆÕͨµØÍ¼, ¾Í¹ã²¥, Èç¹ûÔÚ¸±±¾¾Íµ¥¸ö֪ͨ  | 
|     if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull:  | 
|         curPlayer.BroadCastAll(sendPack.GetBuffer(), len(sendPack.GetBuffer()))  | 
|     else:  | 
|         playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|           | 
|         for index in range(0 , playerManager.GetPlayerCount()):  | 
|             #¹ã²¥Íæ¼Ò  | 
|             tempPlayer = playerManager.GetPlayerByIndex(index)  | 
|             if not tempPlayer.GetPlayerID():  | 
|                 continue  | 
|               | 
|             if PlayerTJG.GetIsTJG(tempPlayer):  | 
|                 continue  | 
|                   | 
|             NetPackCommon.SendFakePack(tempPlayer, sendPack)  | 
|     return  | 
|   |