#!/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 CrossRealmPlayer  
 | 
import NetPackCommon  
 | 
import EventReport  
 | 
import PlayerSuccess  
 | 
import IpyGameDataPY  
 | 
import ItemCommon  
 | 
import ChItem  
 | 
import PlayerTJG  
 | 
import EventShell  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
  
 | 
## ÇøÓòƵµÀ(·â°ü²ÎÊý)   
 | 
#  @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 and not GameWorld.IsCrossServer():  
 | 
        #¹ã²¥  
 | 
        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)  
 | 
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_TalkWorld, 1)  
 | 
    EventShell.EventRespons_Talk(curPlayer, 'talkworld')  
 | 
    return  
 | 
  
 | 
## ¹ú¼ÒƵµÀ(·â°ü²ÎÊý)  
 | 
#  @param index Íæ¼ÒË÷Òý  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def TalkCountry(index, tick):  
 | 
    ## ¿ç·þÊÀ½çƵµÀ  
 | 
    if GameWorld.IsCrossServer():  
 | 
        return  
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
      
 | 
    if not CrossRealmPlayer.IsCrossServerOpen():  
 | 
        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")  
 | 
        return  
 | 
      
 | 
    sendPack = IPY_GameWorld.IPY_CTalkCountry()  
 | 
    #Íæ¼ÒÁÄÌìÄÚÈÝ  
 | 
    content = sendPack.GetContent()  
 | 
      
 | 
    #ͨÓüì²â  
 | 
    if not __CheckTalk(curPlayer, content, sendPack.GetLen(), tick, checkSameMsg = False):  
 | 
        return  
 | 
      
 | 
    #ͨÓÃÉèÖà  
 | 
    SetTalkTime(curPlayer, content, IPY_GameWorld.tcCountry, tick)  
 | 
    #·¢ËÍÁÄÌìÄÚÈÝ  
 | 
    extras = GetTalkExtraValue(curPlayer)  
 | 
    curPlayer.ChatCountry(content, 0, 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)  
 | 
    EventShell.EventRespons_Talk(curPlayer, 'talkfamily')  
 | 
    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  
 | 
  
 | 
def TalkPrivateByID(curPlayer, tagPlayerID, content):  
 | 
    #˽ÁÄ 0ΪĬÈÏ 1Ϊ1¶Ô1ÁÄÌì  
 | 
    talkType = 1  
 | 
    extras = GetTalkExtraValue(curPlayer)  
 | 
    curPlayer.ChatMiByID(talkType, tagPlayerID, 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()  
 | 
      
 | 
    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)  
 | 
    # ·þÎñÆ÷×éID  
 | 
    extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_ServerGroupID) % PlayerControl.GetPlayerServerGroupID(objTalk)  
 | 
    # µÈ¼¶  
 | 
    extraValueStr += GetTalkExtraValueStar(ShareDefine.Def_TalkExtraValue_Bit_LV) % objTalk.GetLV()  
 | 
    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  
 | 
  
 |