| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package OperControlManager  | 
| # ¼òҪ˵Ã÷  | 
| # @todo: ¿ØÖÆÐÐΪ¹ÜÀí  | 
| # @author: Alee  | 
| # @date: 2010-11-22 12:15  | 
| # @version 1.3  | 
| # ÏêϸÃèÊö  | 
| # Î»²Ù×÷˵Ã÷: I¡¢ ÔÚ¼¼ÄܱíÖРÏÞÖÆ×ֶΠ1 ´ú±í×èÖ¹£¬0 ´ú±í²»Ó°Ïì  | 
| #           II¡¢¼¼ÄܱíÖеĠËùÊôϵ×ֶΠ1 ´ú±í¸Ã¼¼ÄÜËùÊôϵ£¬0·´Ö®  | 
| #           III¡¢×´Ì¬¶¨ÒåÖР1 ´ú±íÒªÖ´ÐУ¨¸ÃλËù´ú±íµÄ£©ÐÐΪ£¬0 ´ú±í²»Ö´ÐÐ  | 
| #  | 
| # ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ  | 
| #  | 
| # @change: "2010-12-07 12:00" Alee Ìí¼Óº¯ÊýÓɶ¯×÷»ñµÃ¶¯×÷λ  | 
| # @change: "2011-01-26 15:30" Alee Á¢¼´×èÖ¹½øÐÐÖе͝×÷  | 
| # @change: "2011-06-20 17:40" Alee ÏÞÖÆÆï³ËÌí¼ÓÏÂÂíÂß¼  | 
| # @change: "2011-12-28 17:00" jiang ÏÞÖÆÌí¼Ó´ò¶Ï´«Ëͽø¶ÈÌõ  | 
| #---------------------------------------------------------------------  | 
| """Version = 2011-06-20 17:40"""  | 
| #µ¼Èë  | 
| import ChConfig  | 
| import GameWorld  | 
| import IPY_GameWorld  | 
| import PlayerHorse  | 
| import ShareDefine  | 
| import SkillCommon  | 
|   | 
| #GameObj×Öµä-----------------------------------------------------------  | 
|   | 
| #===============================================================================  | 
| # //¶ÔÏóÐÐΪÏÞÖÆ  | 
| # enum    EOjbActionLimit  | 
| # {  | 
| #    oalMove =     0x0001,    Òƶ¯  | 
| #    oalRide =     0x0002,    ÆïÂí  | 
| #    oalCollect =  0x0004,    ²É¼¯  | 
| #    oalSit =      0x0008,    ´ò×ø  | 
| #    oalCatch =    0x0010,    ²¶×½  | 
| #    oalFish =     0x0020,    µöÓã  | 
| #    oalDance =    0x0040,    ÌøÎè  | 
| #    oalLook =     0x0080,    ±íÇé  | 
| #    oalUseItem =  0x0100,    Ê¹ÓÃÎïÆ·  | 
| #    oalTransmit = 0x0200,    ´«ËÍ  | 
| # };  | 
| # ¶¨ÒåÓÃÓÚ Def_Obj_ActState_ClientAct£¬ Def_Obj_ActState_ServerAct  | 
| #===============================================================================  | 
|   | 
|   | 
| #===============================================================================  | 
| # #ÓÃÓÚ¿ØÖÆÎïÌåµÄÐÐΪ¶¯×÷£¬ËäÈ»¼Ì³ÐÓÚGameObj, ´úÂëÖв»ÒªÓÃÓÚ ËÀÎÎïÆ·£©  | 
| # #¶ÔÏó£¨Íæ¼Ò£¬NPC£©µÄÐÐΪ×Öµä  | 
| # Def_Obj_ActState_ClientAct = "ClientActState"            # ¿Í»§¶Ë¶¯×÷ÏÞÖÆ  | 
| # Def_Obj_ActState_ServerAct = "ServerActState"            # ·þÎñ¶Ë¶¯×÷ÏÞÖÆ  | 
| # Def_Obj_ActState_ClientSkill = "ClientSkillActState"     # ¿Í»§¶Ë¼¼ÄÜÏÞÖÆ  | 
| # Def_Obj_ActState_ServerSkill = "ServerSkillActState"     # ·þÎñ¶Ë¼¼ÄÜÏÞÖÆ  | 
| #===============================================================================  | 
|   | 
| KeyTypeList = [  | 
|                ChConfig.Def_Obj_ActState_ClientAct, ChConfig.Def_Obj_ActState_ServerAct,  | 
|                ChConfig.Def_Obj_ActState_ClientSkill, ChConfig.Def_Obj_ActState_ServerSkill  | 
|                ]  | 
|   | 
| #===============================================================================  | 
|   | 
| ## ÅжÏÊÇ·ñ¿ÉÖ´ÐвÙ×÷µ¥Ö¸Áî £¨Óë½á¹û È¡·´£©  | 
| # @param curActionState Ëù³ÖÓÐ״̬  | 
| # @param curOperState ÇëÇó״̬  | 
| # @return boolÖµ  | 
| # @remarks ÅжÏÊÇ·ñ¿ÉÖ´ÐвÙ×÷µ¥Ö¸Áî £¨Óë½á¹û È¡·´£©  | 
| def IsCanDoAction(curActionState, curOperState):  | 
|     if curActionState & curOperState == 0:  | 
|         #GameWorld.Log("ͨ¹ý")  | 
|         return True  | 
|     else:  | 
|         #GameWorld.Log("²»Í¨¹ý")  | 
|         return False  | 
|   | 
|   | 
| ## ¸üÐÂÐÐΪ״̬£¬·µ»ØÓ°ÏìºóµÄ״̬ (»ò)  | 
| # @param curActionState Ëù³ÖÓÐ״̬  | 
| # @param curOperState ÇëÇó״̬  | 
| # @return ÇëÇóºóµÄ״̬  | 
| # @remarks ¸üÐÂÐÐΪ״̬£¬·µ»ØÓ°ÏìºóµÄ״̬ (»ò)  | 
| def UpdateActionState(curActionState, curOperState):  | 
|     return curActionState | curOperState  | 
|   | 
|   | 
| #===============================================================================  | 
| ## Åж϶ÔÏóÊÇ·ñ¿ÉÖ´ÐвÙ×÷  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @param keyType ÇëÇóÓò×ÖµäÀàÐÍ  | 
| # @param curOperState ÇëÇó״̬  | 
| # @return boolÖµ  | 
| # @remarks Åж϶ÔÏóÊÇ·ñ¿ÉÖ´ÐвÙ×÷  | 
| def IsObjCanDoAction(curObj, keyType, curOperState):  | 
|     if SkillCommon.GetUsingPassiveSkill(curObj):  | 
|         # ±»¶¯¼¼Äܲ»ÏÞÖÆ  | 
|         return True  | 
|     curActionState = GetObjActStateByType(curObj, keyType)  | 
|     #GameWorld.Log("Íæ¼Ò µ±Ç°×´Ì¬%s,ÅжÏÐÐΪ %s, ÔÚ %s¶ËµÄÑéÖ¤ÊÇ·ñͨ¹ý"%\  | 
|     #(curActionState, curOperState, keyType), curObj.GetID())  | 
|     return IsCanDoAction(curActionState, curOperState)  | 
|   | 
|   | 
| ##ͨ¹ýÀàÐÍ»ñÈ¡¶ÔÏóÐÐΪ״̬  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @param keyType ÇëÇóÓò×ÖµäÀàÐÍ  | 
| # @return ¶ÔÏóµ±Ç°×´Ì¬Óò  | 
| # @remarks Í¨¹ýÀàÐÍ»ñÈ¡¶ÔÏóÐÐΪ״̬  | 
| def GetObjActStateByType(curObj, keyType):  | 
|     return curObj.GetDictByKey(keyType)  | 
|   | 
| ##ÉèÖöÔÏóµÄÐÐΪ״̬  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @param curSkill Ó°Ïì¶ÔÏó״̬µÄ¼¼ÄÜ  | 
| # @return ÎÞ·µ»ØÖµ  | 
| # @remarks ÉèÖöÔÏóµÄÐÐΪ״̬  | 
| def SetObjActState(curObj, curSkill):  | 
|     operStateList = [  | 
|                      curSkill.GetClientActionLimit(),  | 
|                      curSkill.GetServerActionLimit(),  | 
|                      curSkill.GetClientSkillSeriesLimit(),  | 
|                      curSkill.GetServerSkillSeriesLimit()  | 
|                      ]      | 
|       | 
|     for index in range(len(KeyTypeList)):  | 
|         SetObjActStateByType(curObj,   | 
|                              GetObjActStateByType(curObj, KeyTypeList[index]),  | 
|                              operStateList[index],  | 
|                              KeyTypeList[index]  | 
|                              )  | 
|       | 
|     #Á¢¼´ÖÕÖ¹½øÐÐÖеÄÐÐΪºÍÓÃÓڽű¾ÎÞʱ»ú¸Ä±ä  | 
|     StopObjProcessingAction(curObj)  | 
|   | 
| ##Á¢¼´ÖÕÖ¹½øÐÐÖеÄÐÐΪºÍÓÃÓڽű¾ÎÞʱ»ú¸Ä±ä  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @return ÎÞ·µ»ØÖµ  | 
| # @remarks Á¢¼´ÖÕÖ¹½øÐÐÖеÄÐÐΪºÍÓÃÓڽű¾ÎÞʱ»ú¸Ä±ä  | 
| def StopObjProcessingAction(curObj):  | 
|     #·þÎñ¶Ë¶¯×÷״̬  | 
|     curServerActionState = GetObjActStateByType(curObj, ChConfig.Def_Obj_ActState_ServerAct)  | 
|       | 
|     #Í£Ö¹ÒÆ¶¯  | 
|     if not IsCanDoAction(curServerActionState, IPY_GameWorld.oalMove):  | 
|         curObj.StopMove()  | 
|       | 
|     #Íæ¼ÒרÓд¦Àí  | 
|     PlayerLimitAct(curObj, curServerActionState)  | 
|           | 
|     return  | 
|   | 
|   | 
| ##Íæ¼ÒÏÞÖÆ²Ù×÷רÓÐ  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @param curServerActionState ¶¯×÷λ  | 
| # @return ÎÞÒâÒå  | 
| def PlayerLimitAct(curObj, curServerActionState):  | 
|     if curObj.GetGameObjType() != IPY_GameWorld.gotPlayer:  | 
|         return  | 
|   | 
|     #ÏÂÂí  | 
|     if not IsCanDoAction(curServerActionState, IPY_GameWorld.oalRide):  | 
|         #ÊÇ·ñ¿ÉÒÔÏÂÂí  | 
|         if PlayerHorse.CheckPlayerRideHorseDown(curObj) == True:  | 
|             PlayerHorse.PlayerRideHorseDown(curObj, True)  | 
|       | 
|     if not IsCanDoAction(curServerActionState, IPY_GameWorld.oalTransmit):  | 
|         #ÊÇ·ñÔÚ´«Ë͵Ľø¶ÈÌõÖÐ  | 
|         if curObj.GetPrepareState() == ShareDefine.Def_PstTrans:  | 
|             curObj.SetPlayerAction(IPY_GameWorld.paNull)  | 
|                            | 
|   | 
| ##ÉèÖöÔÏóµÄÖ¸¶¨ÀàÐ͵ÄÐÐΪ״̬  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @param curActionState Ëù³ÖÓÐ״̬  | 
| # @param curOperState ÇëÇó״̬  | 
| # @param keyType ÇëÇóÓò×ÖµäÀàÐÍ  | 
| # @return ÎÞ·µ»ØÖµ  | 
| # @remarks ÉèÖöÔÏóµÄÖ¸¶¨ÀàÐ͵ÄÐÐΪ״̬  | 
| def SetObjActStateByType(curObj, curActionState, curOperState, keyType):  | 
|     #GameWorld.Log("¸Ä±äǰ״̬£¨%s = %s£©£¬½«Ö´ÐеÄÐÐΪ %s"%(keyType, curActionState, curOperState), curObj.GetID())  | 
|     curActionState = UpdateActionState(curActionState, curOperState)  | 
|     curObj.SetDict(keyType, curActionState)  | 
|       | 
|     #GameWorld.Log("¸Ä±äºó״̬£¨%s = %s£©"%(keyType, GetObjActStateByType(curObj, keyType)), curObj.GetID())  | 
|       | 
|       | 
| ##Çå³ý¶ÔÏóµÄÐÐΪ״̬  | 
| # @param curObj ¶ÔÏóʵÀý  | 
| # @return ÎÞ·µ»ØÖµ  | 
| # @remarks Çå³ý¶ÔÏóµÄÐÐΪ״̬  | 
| def ClearObjActionState(curObj):  | 
|     for keyType in KeyTypeList:  | 
|         curObj.SetDict(keyType, 0)  | 
|       | 
| ##ͨ¹ýÐÐΪ»ñµÃÐÐΪ±êʶλ  | 
| # @param actModule ¶¯×÷Ä£¿é  | 
| # @param actType ¶¯×÷ÀàÐÍ  | 
| # @return None»òö¾ÙÖµ  | 
| # @remarks Í¨¹ýÐÐΪ»ñµÃÐÐΪ±êʶλ  | 
| def GetActBitByAction(actModule, actType):  | 
|     curActModuleDict = ChConfig.Def_ActBit_Action.get(actModule)  | 
|       | 
|     if curActModuleDict == None:  | 
|         return None  | 
|       | 
|     curActBit = curActModuleDict.get(actType)  | 
|       | 
|     return curActBit  | 
|       | 
|   |