hxp
2025-10-24 3432541b467d53ffe4ed3872c734e76638e30df8
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -46,7 +46,6 @@
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import PlayerSuccess
import PyGameData
import NPCCommon
import FBCommon
@@ -147,7 +146,7 @@
#  @param tick 当前时间
#  @return None or True
#  @remarks 函数详细说明.
def __DoPickup(curPlayer, mapItemID, tick, isGuard):
def __DoPickup(curPlayer, mapItemID, tick):
    
    playerID = curPlayer.GetPlayerID()
    mapItemManager = GameWorld.GetMapItemManager()
@@ -165,7 +164,7 @@
    posX, posY, itemPosX, itemPosY = curPlayer.GetPosX(), curPlayer.GetPosY(), mapItem.GetPosX(), mapItem.GetPosY()
    pickDist = GameWorld.GetDist(posX, posY, itemPosX, itemPosY)
    # 守护拾取不验证拾取范围
    if not isGuard and pickDist > curPlayer.GetPickupDist():
    if pickDist > curPlayer.GetPickupDist():
        #距离过远, 不能捡起
        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_805889")
        GameWorld.Log("当前距离过远, mapItemID=%s,dropItemNPCID=%s,玩家(%d,%d)-物品(%d,%d),pickDist=%s > playerPickupDist=%s" 
@@ -189,8 +188,6 @@
    mapItemCount = singItem.GetCount()
    singItemGUID = singItem.GetGUID()
    curEffID = singItem.GetEffectByIndex(0).GetEffectID()
    playerTeam = curPlayer.GetTeam()
    #isTeamNotify = (ownerType == ChConfig.Def_NPCHurtTypeTeam and playerTeam != None)
    isTeamNotify = False
    # 拾取金钱
    if mapItemType == ChConfig.Def_ItemType_Money:
@@ -198,10 +195,6 @@
                                       ChConfig.Def_GiveMoney_Pickup, {}, not isTeamNotify):
            return
        
        # 提示获得金钱数量
        if isTeamNotify:
            PlayerControl.TeamNotify(playerTeam.GetTeamID(), "GeRen_lhs_295695", [curPlayer.GetName(),
                                                                                   mapItemCount])
        # 副本拾取金钱
        FBLogic.OnFBPickUpItem(curPlayer, singItem, tick)
        singItem.Clear()
@@ -263,8 +256,8 @@
            mapID = GameWorld.GetGameWorld().GetMapID()
            lineID = 0 if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtNull else PlayerControl.GetFBFuncLineID(curPlayer)
            #合并地图的,使用前端lineID,即 FBID
            if mapID in [ChConfig.Def_FBMapID_BossHome]:
                lineID = curPlayer.GetClientLineID()
            #if mapID in [ChConfig.Def_FBMapID_BossHome]:
            #    lineID = curPlayer.GetClientLineID()
            NPCCommon.SendGameServerGoodItemRecord(curPlayer, mapID, lineID, dropItemNPCID, curItemID, equipInfo)
            
        # 不需要队伍提示
@@ -276,9 +269,6 @@
        #    PickupItemSysNotify(curPlayer, isTeamNotify, itemMsgList, isEquip)
        #=======================================================================
        
        #成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PickUpItem, curItemCount, [curItemID])
    #物品已经被捡起, 把物品指针置为空
    mapItem.SetDropItem(None)
    #通知客户端, 人物捡起该物品, 以及回收物品的逻辑
@@ -305,20 +295,6 @@
    return
#---------------------------------------------------------------------
#// A3 12 守护拾取物品 #tagCMGuardPickupItem
#
#struct    tagCMGuardPickupItem
#{
#    tagHead        Head;
#    WORD        ItemCount;
#    WORD        MapItemID[ItemCount];    //size = ItemCount
#};
def OnGuardPickupItem(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    mapItemIDList = clientData.MapItemID
    __DoPickupItem(curPlayer, mapItemIDList, tick, True)
    return
## 玩家拾取物品(封包参数)
#  @param index 当前玩家索引
#  @param tick 当前时间
@@ -329,103 +305,23 @@
    #玩家捡起物品
    pickPack = IPY_GameWorld.IPY_PickUpItem()
    mapItemID = pickPack.GetMapItemID()
    __DoPickupItem(curPlayer, [mapItemID], tick, False)
    __DoPickupItem(curPlayer, [mapItemID], tick)
    return
def __DoPickupItem(curPlayer, mapItemIDList, tick, isGuard):
    # @param isGuard: 是否守护拾取
    if isGuard and GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
        mapID = curPlayer.GetMapID()
        fbIpyData = FBCommon.GetFBIpyData(mapID)
        if fbIpyData and not fbIpyData.GetGuardPick():
            GameWorld.Log("该地图守护无法拾取物品! mapID=%s" % mapID, curPlayer.GetPlayerID())
            return
#    #单人副本一键拾取
#    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtSingle:
#        SingleFBTPickUP(curPlayer, mapItemID, tick)
#        return
def __DoPickupItem(curPlayer, mapItemIDList, tick):
    if not mapItemIDList:
        GameWorld.ErrLog("没有指定要拾取的地图物品ID!", curPlayer.GetPlayerID())
        return
    
    succMapItemIDList = [] # 成功拾取的地图物品
    for mapItemID in mapItemIDList:
        if __DoPickup(curPlayer, mapItemID, tick, isGuard):
        if __DoPickup(curPlayer, mapItemID, tick):
            succMapItemIDList.append(mapItemID)
            
    if succMapItemIDList:
        GameWorld.Log("成功拾取地图物品, succMapItemIDList=%s" % (succMapItemIDList), curPlayer.GetPlayerID())
    # 守护拾取的,附加同步守护拾取结果
    if isGuard and succMapItemIDList:
        guradPickupSucc = ChPyNetSendPack.tagMCGuradPickupItemSucc()
        guradPickupSucc.MapItemID = succMapItemIDList
        guradPickupSucc.ItemCount = len(guradPickupSucc.MapItemID)
        NetPackCommon.SendFakePack(curPlayer, guradPickupSucc)
# 玩家拾取结果目前客户端暂时无用,不通知
#    if not __DoPickup(curPlayer, mapItemID, tick):
#        curPlayer.Notify_PickupItemResult(mapItemID, 0)
#    else:
#        curPlayer.Notify_PickupItemResult(mapItemID, 1)
    return
###单人副本一键拾取
## @param curPlayer mapItemID
## @return None
#def SingleFBTPickUP(curPlayer, mapItemID, tick):
#    mapItemManager = GameWorld.GetMapItemManager()
#    curMapItem = mapItemManager.GetItemByID(mapItemID)
#    if curMapItem == None or curMapItem.IsEmpty():
#        return
#
#    posX = curPlayer.GetPosX()
#    posY = curPlayer.GetPosY()
#    itemPosX = curMapItem.GetPosX()
#    itemPosY = curMapItem.GetPosY()
#
#    pickDist = GameWorld.GetDist(posX, posY, itemPosX, itemPosY)
#
#    if pickDist > curPlayer.GetPickupDist():
#        #距离过远, 不能捡起
#        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_805889")
#        return
#
#    mapItemIDList = [curMapItem.GetID()]
#    #拾取当前格子周围的物品
#    mapItemManager = GameWorld.GetMapItemManager()
#    for index in range(mapItemManager.GetMapItemCount()):
#        mapItem = mapItemManager.GetMapItemByIndex(index)
#        if not mapItem or mapItem.IsEmpty():
#            continue
#
#        mapItemObjID = mapItem.GetID()
#        if mapItemObjID in mapItemIDList:
#            continue
#
#        curItem = mapItem.GetItem()
#        # 只一键拾取金钱
#        if curItem.GetType() != ChConfig.Def_ItemType_Money:
#            continue
#
#        pickDist = GameWorld.GetDist(posX, posY, mapItem.GetPosX(), mapItem.GetPosY())
#
#        if pickDist > curPlayer.GetPickupDist():
#            continue
#
#        mapItemIDList.append(mapItemObjID)
#
#    for mapItemID in mapItemIDList:
#        if not __DoPickup(curPlayer, mapItemID, tick):
#            curPlayer.Notify_PickupItemResult(mapItemID, 0)
#        else:
#            curPlayer.Notify_PickupItemResult(mapItemID, 1)
#
#    return
#---------------------------------------------------------------------
## 玩家使用物品 ->自身效果(封包参数)
#  @param index 当前玩家索引
@@ -461,12 +357,12 @@
def __DoLogic_PlayerUseItemSelf(curPlayer, useItemIndex, tick, useCnt=1, exData=0):
    
    #使用物品行为状态, 判断客户端限制
    if not OperControlManager.IsObjCanDoAction(
                                        curPlayer,
                                        ChConfig.Def_Obj_ActState_ClientAct,
                                        IPY_GameWorld.oalUseItem
                                        ):
        return False
    #if not OperControlManager.IsObjCanDoAction(
    #                                    curPlayer,
    #                                    ChConfig.Def_Obj_ActState_ClientAct,
    #                                    IPY_GameWorld.oalUseItem
    #                                    ):
    #    return False
    #------------------封包参数 获得 玩家物品
    backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
@@ -496,9 +392,6 @@
                       % (curItemTypeID, useResult, isOK, successCnt))    
    if not isOK:
        return False
    #------------使用物品成功, 执行相关操作
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_UseItem, successCnt, [curItemTypeID])
    
    curPlayer.Sync_UseItem(curItemTypeID, useItemIndex)
    curPlayer.SetItemCD(curItemCDType, tick)
@@ -567,13 +460,13 @@
        return -1
    curItemID = curItem.GetItemTypeID()
    useCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % curItemID)
    for itemIDList in IpyGameDataPY.GetFuncEvalCfg('ShareUseCntItem'):
        if curItemID not in itemIDList:
            continue
        for itemID in itemIDList:
            if itemID == curItemID:
                continue
            useCnt += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
    #for itemIDList in IpyGameDataPY.GetFuncEvalCfg('ShareUseCntItem'):
    #    if curItemID not in itemIDList:
    #        continue
    #    for itemID in itemIDList:
    #        if itemID == curItemID:
    #            continue
    #        useCnt += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
    
    canUseCnt = max(0, maxCnt - useCnt)
    
@@ -696,9 +589,6 @@
    #根据物品效果使用{物品效果ID:call的py名}
    itemEffIdCallFuncDic = {
                            ChConfig.Def_Effect_UseItemGiveZhenQi:"Item_UseItemGiveZhenQi", # 使用道具给予真气
                            ChConfig.Def_Effect_AddDienstgrad:"Item_AddDienstgrad", #道具获得称号
                            ChConfig.Def_Effect_Face:"Item_Face",
                            ChConfig.Def_Effect_FacePic:"Item_Face",
                            ChConfig.Def_Effect_ItemAddLV:"Item_AddLV", #升级道具
                            ChConfig.Def_Effect_GuajiAward:"Item_GuajiAward", #直接给挂机收益
                            ChConfig.Def_Effect_CleanGuilt:"Item_CleanGuilt", # 洗红名
@@ -706,14 +596,11 @@
                            ChConfig.Def_Effect_AddVIPExp:"Item_AddVIPExp", # 增加VIP经验
                            ChConfig.Def_Effect_VIPLVCard:"Item_VIPLVCard", # VIP等级直升卡
                            ChConfig.Def_Effect_TiandaoQiyun:"Item_TiandaoQiyun", # 天道树气运
                            ChConfig.Def_Effect_GubaoPiece:"Item_GubaoPiece", # 古宝碎片效果ID
                            ChConfig.Def_Effect_TrainRealmLV:"Item_TrainRealmLV", # 境界培养卡
                            ChConfig.Def_Effect_ResetBossKillCnt:"Item_ResetBossKillCnt", # 重置boss击杀疲劳
                            ChConfig.Def_Effect_AddFBCnt:"Item_AddFBCnt", # 增加副本可进入次数
                            ChConfig.Def_Effect_AddArenaBattleCount:"Item_AddArenaBattleCount", # 增加竞技场挑战次数
                            ChConfig.Def_Effect_AddKillBossCnt:"Item_AddKillBossCnt", # 增加BOSS可击杀次数
                            ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # 增加法宝升星经验
                            ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # 激活聊天气泡框
                            ChConfig.Def_Effect_EmojiPack:"Item_EmojiPack",
                            ChConfig.Def_Effect_FamilyEmblem:"Item_FamilyEmblem",
                            ChConfig.Def_Effect_ItemGiveWeekPartyPoint:"Item_WeekPartyPoint", # 增加活动巡礼积分
@@ -721,6 +608,8 @@
                            ChConfig.Def_Effect_AddRealmExpRate:"Item_AddRealmExpRate", # 增加聚灵效率
                            ChConfig.Def_Effect_TouchMission:"Item_TouchMission",  # 触发任务接口
                            ChConfig.Def_Effect_HeroSkin:"Item_HeroSkin",  # 武将皮肤
                            ChConfig.Def_Effect_FamilyTaofaCnt:"Item_FamilyTaofaCnt",  # 增加公会讨伐次数
                            #ChConfig.Def_Effect_AddArenaBattleCount:"Item_AddArenaBattleCount", # 增加竞技场挑战次数
                            #ChConfig.Def_Effect_FamilyImpeach:"Item_FamilyImpeach",  # 弹劾符
                            #ChConfig.Def_Effect_ClothesCoatSkin:"Item_ClothesCoatSkin", #激活时装皮肤
                            #ChConfig.Def_Effect_AddOfficialExp:"Item_AddOfficialExp", # 增加爵位经验
@@ -882,25 +771,25 @@
#  @return 布尔值
#  @remarks 检查使用物品的玩家属性.
def CheckUseItemSelf_Player(curPlayer):
    if GameObj.GetHP(curPlayer) <= 0 :
        return False
    #if GameObj.GetHP(curPlayer) <= 0 :
    #    return False
    
#    #眩晕时, 不可使用物品
#    if curPlayer.GetAbnormalState() == IPY_GameWorld.sctFaint:
#        return False
    
    #使用物品行为状态, 判断服务端限制
    if not OperControlManager.IsObjCanDoAction(
                                        curPlayer,
                                        ChConfig.Def_Obj_ActState_ServerAct,
                                        IPY_GameWorld.oalUseItem
                                        ):
        return False
    #if not OperControlManager.IsObjCanDoAction(
    #                                    curPlayer,
    #                                    ChConfig.Def_Obj_ActState_ServerAct,
    #                                    IPY_GameWorld.oalUseItem
    #                                    ):
    #    return False
    
    #交易状态, 不可使用物品
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paTrade:
        PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_372238")
        return False
    #if curPlayer.GetPlayerAction() == IPY_GameWorld.paTrade:
    #    PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_372238")
    #    return False
    
#    #GM禁止使用
#    if GameWorld.IsGM(curPlayer):