From 0c27822ef5e6c67782ed143a4ff03ecfbdfda1fb Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 23 五月 2022 16:52:58 +0800 Subject: [PATCH] 9415 【BT】【后端】古神战场(副本内功能完整版本) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py | 125 ++++++++++++++++++++++++++++++++++++++--- 1 files changed, 116 insertions(+), 9 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py index 2a3f49c..7484a3f 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Pet.py @@ -18,11 +18,30 @@ import ChConfig import GameWorld import PlayerControl +import IpyGameDataPY +import ShareDefine +import PetControl import PlayerPet -import PetClear +import OpenFunc -#--------------------------------------------------------------------- -#逻辑实现 + +def __Help(curPlayer, petNumNameDict): + GameWorld.DebugAnswer(curPlayer, "------------------") + GameWorld.DebugAnswer(curPlayer, "重置灵宠: Pet 0 [可选第几只]") + GameWorld.DebugAnswer(curPlayer, "激活所有: Pet 99 [可选是否满阶]") + GameWorld.DebugAnswer(curPlayer, "激活指定: Pet 第几只 阶级") + GameWorld.DebugAnswer(curPlayer, "培养灵宠: Pet 培养类型 等阶 丹数") + GameWorld.DebugAnswer(curPlayer, "注:重置灵宠需重登") + + petNumList = petNumNameDict.keys() + petNameNumInfo = "" + for i, petNum in enumerate(petNumList, 1): + petNameNumInfo += "%s-%s;" % (petNumNameDict[petNum], petNum) + if petNum % 3 == 0 or i == len(petNumList): + GameWorld.DebugAnswer(curPlayer, petNameNumInfo) + petNameNumInfo = "" + + return ## GM命令执行入口 # @param curPlayer 当前玩家 @@ -31,29 +50,117 @@ # @remarks 函数详细说明. def OnExec(curPlayer, msgList): + petNumNameDict = {} + petNPCIDNumDict = {} + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in xrange(ipyDataMgr.GetPetInfoCount()): + ipyData = ipyDataMgr.GetPetInfoByIndex(index) + needItemID = ipyData.GetUnLockNeedItemID() + curItem = GameWorld.GetGameData().GetItemByTypeID(needItemID) + if not curItem: + continue + itemName = curItem.GetName() + petName = itemName.replace("灵宠:", "") + petNum = index + 1 + + petNPCID = ipyData.GetID() + petNPCIDNumDict[petNPCID] = petNum + petNumNameDict[petNum] = petName + petNumList = sorted(petNumNameDict.keys()) + if not msgList: - GameWorld.DebugAnswer(curPlayer, "重置所有灵宠: Pet 0") - GameWorld.DebugAnswer(curPlayer, "设置培养灵宠: Pet 培养类型 等阶 丹数") + __Help(curPlayer, petNumNameDict) return + + # 重置灵宠 if msgList[0] == 0: - if len(msgList) > 1 and msgList[1] == 1: - PetClear.OnExec(curPlayer, []) - + clearNumList = msgList[1:] if len(msgList) > 1 else None + clearOKList = __ClearPet(curPlayer, petNPCIDNumDict, clearNumList) + for trainType in xrange(1, PlayerPet.GetPetTrainTypes() + 1): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainLV % trainType, 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainItemCount % trainType, 0) + GameWorld.DebugAnswer(curPlayer, "重置灵宠编号:%s" % sorted(clearOKList)) + + # 激活所有 + elif msgList[0] == 99: + isFullLV = msgList[1] if len(msgList) > 1 else None + classLV = 999 if isFullLV else None + OpenFunc.DoGMOpenFunc(curPlayer, ShareDefine.GameFuncID_Pet) + activeOKList = [] + petNumList = petNPCIDNumDict.values() + for i, petNum in enumerate(petNumList): + index = msgList[0] + refresh = i >= (len(petNumList) - 1) + if PlayerPet.DoPetActivate(curPlayer, petNum, classLV, refresh=refresh): + activeOKList.append(petNum) + + GameWorld.DebugAnswer(curPlayer, "激活灵宠编号:%s" % sorted(activeOKList)) + + # 激活指定 + elif len(msgList) == 2: + petNum = msgList[0] + classLV = msgList[1] + OpenFunc.DoGMOpenFunc(curPlayer, ShareDefine.GameFuncID_Pet) + if PlayerPet.DoPetActivate(curPlayer, petNum, classLV): + GameWorld.DebugAnswer(curPlayer, "激活灵宠: %s(%s), %s阶" % (petNumNameDict.get(petNum, petNum), petNum, classLV)) + + # 培养灵宠 elif len(msgList) == 3: trainType, trainLV, eatItemCount = msgList PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainLV % trainType, trainLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PetTrainItemCount % trainType, eatItemCount) else: + __Help(curPlayer, petNumNameDict) return PlayerPet.RefreshPetItemAddAttr(curPlayer, True) PlayerPet.OnPlayerPetLogin(curPlayer) return - +def __ClearPet(curPlayer, petNPCIDNumDict, clearNumList=None): + + clearOKList = [] + #获得战斗的宠物 + fightPetNPCID = 0 + curPetMgr = curPlayer.GetPetMgr() + fightPet = curPetMgr.GetFightPet() + if fightPet != None: + fightPetNPCID = fightPet.GetRolePet().NPCID + + fightPetNum = petNPCIDNumDict.get(fightPetNPCID) + #---如果有出战中的宠物需要先召回--- + if not clearNumList or fightPetNum in clearNumList: + PetControl.ReCallFightPet(curPlayer) + + #获得玩家宠物信息 + petList = [] + petListCount = curPetMgr.PetList_Cnt() + for i in range(petListCount): + pet = curPetMgr.PetList_At(i) + petNPCID = pet.GetRolePet().NPCID + petNum = petNPCIDNumDict.get(petNPCID) + if not clearNumList or petNum in clearNumList: + petList.append(pet) + + for pet in petList: + curPetMgr.PetList_SetFree(pet.GetRolePet().PetID) + + # 宠物数据物品背包清除 + petPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet) + for i in range(petPack.GetCount())[::-1]: + petItem = petPack.GetAt(i) + + if not petItem or petItem.IsEmpty(): + continue + + petNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID) + petNum = petNPCIDNumDict.get(petNPCID) + if not clearNumList or petNum in clearNumList: + petItem.Clear() + clearOKList.append(petNum) + + return clearOKList -- Gitblit v1.8.0