From 26958aff1b844a743a805b4f9075bee800b72a46 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 04 十一月 2025 14:35:37 +0800
Subject: [PATCH] 332 【主界面】座骑系统-服务端

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py |  186 ++++++++++++++++++++--------------------------
 1 files changed, 82 insertions(+), 104 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
index df771fc..de8c400 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
+++ b/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
 

--
Gitblit v1.8.0