hxp
5 天以前 26958aff1b844a743a805b4f9075bee800b72a46
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
@@ -6,132 +6,110 @@
#
# @todo:坐骑
# @author hxp
# @date 2019-12-17
# @date 2025-11-04
# @version 1.0
#
# 详细描述: 坐骑
#
#-------------------------------------------------------------------------------
#"""Version = 2019-12-17 18:30"""
#"""Version = 2025-11-04 14:30"""
#-------------------------------------------------------------------------------
import GameWorld
import ChConfig
import IpyGameDataPY
import PlayerControl
import PlayerHorse
import IpyGameDataPY
import time
import ChConfig
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param msgList 参数列表
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
    
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "重置所有: Horse 0")
        GameWorld.DebugAnswer(curPlayer, "设置进阶: Horse 等阶 丹数")
        GameWorld.DebugAnswer(curPlayer, "设置培养: Horse 培养类型 等阶 丹数")
        GameWorld.DebugAnswer(curPlayer, "全部幻化: Horse skin 1")
        GameWorld.DebugAnswer(curPlayer, "重置幻化: Horse skin 0")
        GameWorld.DebugAnswer(curPlayer, "设置幻化: Horse skin 幻化ID 状态")
        GameWorld.DebugAnswer(curPlayer, "设置星级: Horse star 坐骑ID 星级")
        GameWorld.DebugAnswer(curPlayer, "设置阶级: Horse 阶 [等级 经验]")
        GameWorld.DebugAnswer(curPlayer, "重置外观: Horse s0 [外观ID]")
        GameWorld.DebugAnswer(curPlayer, "添加外观: Horse s1 外观ID [有效秒]")
        GameWorld.DebugAnswer(curPlayer, "外观星级: Horse s2 外观ID 星级")
        return
    
    if msgList[0] == "skin":
        if len(msgList) == 2:
            skinState = msgList[1]
            ipyDataMgr = IpyGameDataPY.IPY_Data()
            for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
                skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
                skinID = skinPlusIpyData.GetID()
                __GMSetHorseSkinState(curPlayer, skinID, skinState, skinPlusIpyData.GetSkinValidTime())
        elif len(msgList) == 3:
            skinID = msgList[1]
            skinState = msgList[2]
            skinPlusIpyData = IpyGameDataPY.GetIpyGameData("HorseSkinPlus", skinID)
            if not skinPlusIpyData:
                GameWorld.DebugAnswer(curPlayer, "坐骑幻化ID不存在! skinID=%s" % skinID)
                return
            __GMSetHorseSkinState(curPlayer, skinID, skinState, skinPlusIpyData.GetSkinValidTime())
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    syncSkinIDList = []
    value1 = msgList[0]
    if value1 == 0:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseClassLV, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseLV, PlayerHorse.HorseLVStart)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseExp, 0)
        PlayerControl.SetHorseSkinID(curPlayer, PlayerHorse.GetDefaultHorseSkinID())
        syncSkinIDList = __ResetHorseSkin(curPlayer, 0)
    elif value1 == "s0":
        horseSkinID = msgList[1] if len(msgList) > 1 else 0
        syncSkinIDList = __ResetHorseSkin(curPlayer, horseSkinID)
    elif value1 == "s1":
        horseSkinID = msgList[1] if len(msgList) > 1 else 0
        expireTimes = msgList[2] if len(msgList) > 2 else None
        if PlayerHorse.AddHorseSkin(curPlayer, horseSkinID, expireTimes, True):
            endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorseSkinEndTime % horseSkinID)
            endTimeStr = "永久" if not endTime else GameWorld.ChangeTimeNumToStr(endTime)
            GameWorld.DebugAnswer(curPlayer, "添加外观成功:%s,到期:%s" % (horseSkinID, endTimeStr))
        else:
            return
    elif msgList[0] == "star":
        horseID = msgList[1] if len(msgList) > 1 else 0
        horseStar = msgList[2] if len(msgList) > 2 else 0
        if not horseID or not horseStar:
            return
        skinID = 0
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
            skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
            if horseID != skinPlusIpyData.GetHorseID():
                continue
            if PlayerHorse.CheckHorseSkinState(curPlayer, skinPlusIpyData):
                skinID = skinPlusIpyData.GetID()
            break
        if not skinID:
            GameWorld.DebugAnswer(curPlayer, "该坐骑不存在或未激活:horseID=%s" % horseID)
            return
        if not IpyGameDataPY.GetIpyGameData("HorseStarUp", horseID, horseStar):
            GameWorld.DebugAnswer(curPlayer, "不存在该坐骑星级:horseID=%s,star=%s" % (horseID, horseStar))
            return
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserStar % horseID, horseStar)
        GameWorld.DebugAnswer(curPlayer, "设置坐骑星级:horseID=%s,star=%s,skinID=%s" % (horseID, horseStar, skinID))
    elif len(msgList) == 1:
        if msgList[0] == 0:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, 1)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, 0)
            for trainType in xrange(1, PlayerHorse.GetHorseTrainTypes() + 1):
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainLV % trainType, 1)
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainItemCount % trainType, 0)
            ipyDataMgr = IpyGameDataPY.IPY_Data()
            for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
                skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
                skinID = skinPlusIpyData.GetID()
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0)
                GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
            for index in range(ipyDataMgr.GetHorseCount()):
                ipyData = ipyDataMgr.GetHorseByIndex(index)
                horseID = ipyData.GetHorseID()
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserStar % horseID, 0)
    elif len(msgList) == 2:
        lv, eatItemCount = msgList
        if lv < 1:
            GameWorld.DebugAnswer(curPlayer, "等级不能小于1")
            return
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, lv)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, eatItemCount)
    elif len(msgList) == 3:
        trainType, trainLV, eatItemCount = msgList
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainLV % trainType, trainLV)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserTrainItemCount % trainType, eatItemCount)
    else:
            GameWorld.DebugAnswer(curPlayer, "添加外观失败:%s" % (horseSkinID))
        return
    elif value1 == "s2":
        horseSkinID = msgList[1] if len(msgList) > 1 else 0
        setStar = msgList[2] if len(msgList) > 2 else 0
        ipyData = IpyGameDataPY.GetIpyGameData("HorseSkin", horseSkinID)
        if not ipyData:
            GameWorld.DebugAnswer(curPlayer, "该外观不存在:%s" % horseSkinID)
            return
        setStar = min(setStar, ipyData.GetStarMax())
        GameWorld.DebugAnswer(curPlayer, "设置外观:%s,星:%s" % (horseSkinID, setStar))
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseSkinStar % horseSkinID, setStar)
        syncSkinIDList.append(horseSkinID)
        
    # 设置阶级: Horse 阶 [等级 经验]
    else:
        classLV = msgList[0] if len(msgList) > 0 else 0
        horseLV = msgList[1] if len(msgList) > 1 else 0
        exp = msgList[2] if len(msgList) > 2 else 0
        maxIpyData = ipyDataMgr.GetHorseClassByIndex(-1)
        classLV = min(classLV, maxIpyData.GetClassLV())
        classIpyData = IpyGameDataPY.GetIpyGameData("HorseClass", classLV)
        horseLV = max(PlayerHorse.HorseLVStart, min(horseLV, classIpyData.GetMaxHorseLV()))
        exp = min(exp, classIpyData.GetLVUPItemCnt())
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseClassLV, classLV)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseLV, horseLV)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseExp, exp)
        GameWorld.DebugAnswer(curPlayer, "设置坐骑阶:%s,等级:%s,经验:%s" % (classLV, horseLV, exp))
    PlayerHorse.SyncHorseClassInfo(curPlayer)
    syncSkinIDList and PlayerHorse.SyncHorseSkinInfo(curPlayer, syncSkinIDList)
    PlayerHorse.RefreshHorseAttr(curPlayer)
    PlayerHorse.PlayerHorseLogin(curPlayer)
    return
def __GMSetHorseSkinState(curPlayer, skinID, skinState, validTime=0):
    if not skinState:
        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, 0)
def __ResetHorseSkin(curPlayer, horseSkinID=0):
    syncSkinIDList = []
    if not horseSkinID:
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetHorseSkinCount()):
            ipyData = ipyDataMgr.GetHorseSkinByIndex(index)
            horseSkinID = ipyData.GetSkinID()
            if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorseSkinState, horseSkinID):
                continue
            GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorseSkinState, horseSkinID, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseSkinEndTime % horseSkinID, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseSkinStar % horseSkinID, 0)
            syncSkinIDList.append(horseSkinID)
    else:
        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, skinID, 1)
        if validTime > 0:
            updSkinEndTime = int(time.time()) + validTime
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinEndTime % skinID, updSkinEndTime)
    return
        ipyData = IpyGameDataPY.GetIpyGameData("HorseSkin", horseSkinID)
        if not ipyData:
            GameWorld.DebugAnswer(curPlayer, "该外观不存在:%s" % horseSkinID)
            return
        GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_HorseSkinState, horseSkinID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseSkinEndTime % horseSkinID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorseSkinStar % horseSkinID, 0)
        syncSkinIDList.append(horseSkinID)
    GameWorld.DebugAnswer(curPlayer, "删除外观:%s" % syncSkinIDList)
    return syncSkinIDList