From 3d2d9d29a5ce766956abb44ceab3e445ce6ac0d9 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期二, 14 四月 2026 18:51:05 +0800
Subject: [PATCH] 602 坐骑优化-客户端
---
Main/Config/Configs/HorseSkinConfig.cs | 11
Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs | 14
Main/System/Horse/HorseCarouselView.cs.meta | 11
Main/Config/ConfigManager.cs | 3
Main/System/Horse/HorseManager.cs | 206 ++++++++++
Main/System/Horse/HorseItem.cs | 43 ++
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs | 20 +
Main/System/Horse/GetHorseWin.cs.meta | 11
Main/System/Horse/HorseSkinWin.cs | 26
Main/System/Guild/GuildBossWin.cs | 2
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs | 11
Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta | 11
Main/System/Horse/HorseSkinCell.cs | 2
Main/System/Main/HomeWin.cs | 17
Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta | 11
Main/System/Tip/ConfirmCancel.cs | 1
Main/System/Horse/HorseSuccessWin.cs | 74 +++
Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta | 11
Main/System/Horse/HorseCarouselView.cs | 229 ++++++++++++
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs | 1
Main/Config/Configs/HorseIDConfig.cs.meta | 11
Main/Config/Configs/HorseIDConfig.cs | 53 ++
Main/Config/PartialConfigs/HorseSkinConfig.cs | 8
Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs | 19 +
Main/System/Horse/GetHorseWin.cs | 38 ++
Main/System/Horse/HorseWin.cs | 210 ++++++++++
Main/System/Horse/HorseItem.cs.meta | 11
Main/System/Horse/HorseRankUPWin.cs | 56 ++
28 files changed, 1,048 insertions(+), 73 deletions(-)
diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index d3cf7bd..9c732d4 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -79,6 +79,7 @@
typeof(HeroQualityLVConfig),
typeof(HeroSkinAttrConfig),
typeof(HorseClassConfig),
+ typeof(HorseIDConfig),
typeof(HorseSkinConfig),
typeof(ItemCompoundConfig),
typeof(ItemConfig),
@@ -350,6 +351,8 @@
ClearConfigDictionary<HeroSkinAttrConfig>();
// 娓呯┖ HorseClassConfig 瀛楀吀
ClearConfigDictionary<HorseClassConfig>();
+ // 娓呯┖ HorseIDConfig 瀛楀吀
+ ClearConfigDictionary<HorseIDConfig>();
// 娓呯┖ HorseSkinConfig 瀛楀吀
ClearConfigDictionary<HorseSkinConfig>();
// 娓呯┖ ItemCompoundConfig 瀛楀吀
diff --git a/Main/Config/Configs/HorseIDConfig.cs b/Main/Config/Configs/HorseIDConfig.cs
new file mode 100644
index 0000000..0b55719
--- /dev/null
+++ b/Main/Config/Configs/HorseIDConfig.cs
@@ -0,0 +1,53 @@
+锘�//--------------------------------------------------------
+// [Author]: YYL
+// [ Date ]: Monday, April 13, 2026
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class HorseIDConfig : ConfigBase<int, HorseIDConfig>
+{
+ static HorseIDConfig()
+ {
+ // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+ visit = true;
+ }
+
+ public int HorseID;
+ public int UnlockWay;
+ public int UnlockValue;
+ public int UnlockNeedCnt;
+ public int AttrID;
+ public float AttrMultiValue;
+
+ public override int LoadKey(string _key)
+ {
+ int key = GetKey(_key);
+ return key;
+ }
+
+ public override void LoadConfig(string input)
+ {
+ try {
+ string[] tables = input.Split('\t');
+ int.TryParse(tables[0],out HorseID);
+
+ int.TryParse(tables[1],out UnlockWay);
+
+ int.TryParse(tables[2],out UnlockValue);
+
+ int.TryParse(tables[3],out UnlockNeedCnt);
+
+ int.TryParse(tables[4],out AttrID);
+
+ float.TryParse(tables[5],out AttrMultiValue);
+ }
+ catch (Exception exception)
+ {
+ Debug.LogError(exception);
+ }
+ }
+}
diff --git a/Main/Config/Configs/HorseIDConfig.cs.meta b/Main/Config/Configs/HorseIDConfig.cs.meta
new file mode 100644
index 0000000..e033c49
--- /dev/null
+++ b/Main/Config/Configs/HorseIDConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d3c2fe448c55f7c4a82cd8dc635934d6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/Config/Configs/HorseSkinConfig.cs b/Main/Config/Configs/HorseSkinConfig.cs
index b2bfe44..07f4660 100644
--- a/Main/Config/Configs/HorseSkinConfig.cs
+++ b/Main/Config/Configs/HorseSkinConfig.cs
@@ -1,6 +1,6 @@
锘�//--------------------------------------------------------
// [Author]: YYL
-// [ Date ]: 2025骞�11鏈�23鏃�
+// [ Date ]: Monday, April 13, 2026
//--------------------------------------------------------
using System.Collections.Generic;
@@ -31,6 +31,9 @@
public int[] Poses;
public int heroFirst;
public string getWay;
+ public string Icon;
+ public int showType;
+ public int sortOrder;
public override int LoadKey(string _key)
{
@@ -119,6 +122,12 @@
int.TryParse(tables[13],out heroFirst);
getWay = tables[14];
+
+ Icon = tables[15];
+
+ int.TryParse(tables[16],out showType);
+
+ int.TryParse(tables[17],out sortOrder);
}
catch (Exception exception)
{
diff --git a/Main/Config/PartialConfigs/HorseSkinConfig.cs b/Main/Config/PartialConfigs/HorseSkinConfig.cs
index 216784e..a4ffee8 100644
--- a/Main/Config/PartialConfigs/HorseSkinConfig.cs
+++ b/Main/Config/PartialConfigs/HorseSkinConfig.cs
@@ -2,6 +2,8 @@
public partial class HorseSkinConfig : ConfigBase<int, HorseSkinConfig>
{
public static List<int> itemsList = new List<int>(); //鐨偆閬撳叿瑙i攣/鍗囨槦
+ //鍧愰獞ID,鐨偆ID
+ public static Dictionary<int, int> horseIDTohorseSkinIDDict = new();
protected override void OnConfigParseCompleted()
{
@@ -13,7 +15,11 @@
}
}
+ if (UnlockWay == 3)
+ {
+ horseIDTohorseSkinIDDict[UnlockValue] = SkinID;
+ }
}
-
+
}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs
new file mode 100644
index 0000000..8aa87d6
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs
@@ -0,0 +1,20 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 04 鍧愰獞ID鎿嶄綔 #tagCSHorseIDOP
+
+public class CB204_tagCSHorseIDOP : GameNetPackBasic {
+ public byte OPType; // 鎿嶄綔 1-婵�娲伙紱2-浣╂埓锛�
+ public byte HorseID;
+
+ public CB204_tagCSHorseIDOP () {
+ combineCmd = (ushort)0x03FE;
+ _cmd = (ushort)0xB204;
+ }
+
+ public override void WriteToBytes () {
+ WriteBytes (OPType, NetDataType.BYTE);
+ WriteBytes (HorseID, NetDataType.BYTE);
+ }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta
new file mode 100644
index 0000000..fe8b561
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB204_tagCSHorseIDOP.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 89a08c975b158c54eac484cba180a62b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs
new file mode 100644
index 0000000..717442d
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs
@@ -0,0 +1,14 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 05 鍧愰獞ID淇℃伅 #tagSCHorseIDInfo
+
+public class DTCA305_tagSCHorseIDInfo : DtcBasic
+{
+ public override void Done(GameNetPackBasic vNetPack)
+ {
+ base.Done(vNetPack);
+ HA305_tagSCHorseIDInfo vNetData = vNetPack as HA305_tagSCHorseIDInfo;
+ HorseManager.Instance.UpdateHorseIDInfo(vNetData);
+ }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta
new file mode 100644
index 0000000..2eaa2a8
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA305_tagSCHorseIDInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 24c3deaa0b65c2f45a4f0d7a0cfda6ee
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 13e25bb..2fdaf6a 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -162,6 +162,7 @@
Register(typeof(HA924_tagSCQunyingMatchList), typeof(DTCA924_tagSCQunyingMatchList));
Register(typeof(HA925_tagSCQunyingPlayerInfo), typeof(DTCA925_tagSCQunyingPlayerInfo));
Register(typeof(HC010_tagSCCrossZoneInfo), typeof(DTCC010_tagSCCrossZoneInfo));
+ Register(typeof(HA305_tagSCHorseIDInfo), typeof(DTCA305_tagSCHorseIDInfo));
}
//涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs
new file mode 100644
index 0000000..7446554
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 05 鍧愰獞ID淇℃伅 #tagSCHorseIDInfo
+
+public class HA305_tagSCHorseIDInfo : GameNetPackBasic {
+ public uint HorseIDState; // 鍧愰獞ID瑙i攣鐘舵�侊紝鎸変簩杩涘埗浣嶈繍绠楀垽鏂潗楠慖D鏄惁宸茶В閿�
+ public byte HorseID; // 褰撳墠浣╂埓鐨勫潗楠慖D
+
+ public HA305_tagSCHorseIDInfo () {
+ _cmd = (ushort)0xA305;
+ }
+
+ public override void ReadFromBytes (byte[] vBytes) {
+ TransBytes (out HorseIDState, vBytes, NetDataType.DWORD);
+ TransBytes (out HorseID, vBytes, NetDataType.BYTE);
+ }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta
new file mode 100644
index 0000000..d21f5a6
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA305_tagSCHorseIDInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 38ac993795b713545bc24a1fce151d67
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/System/Guild/GuildBossWin.cs b/Main/System/Guild/GuildBossWin.cs
index 7c57f73..e8d0f75 100644
--- a/Main/System/Guild/GuildBossWin.cs
+++ b/Main/System/Guild/GuildBossWin.cs
@@ -525,7 +525,7 @@
void InitAttack()
{
- var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(false));
+ var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
heroModel.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID(), 1.2f);
heroModel.GetHero().SetSpeed(heroAtkSpeed);
for (int i = 0; i < hurtValues.Length; i++)
diff --git a/Main/System/Horse/GetHorseWin.cs b/Main/System/Horse/GetHorseWin.cs
new file mode 100644
index 0000000..2ee5b2f
--- /dev/null
+++ b/Main/System/Horse/GetHorseWin.cs
@@ -0,0 +1,38 @@
+using System;
+using UnityEngine;
+
+public class GetHorseWin : UIBase
+{
+ [SerializeField] ImageEx iconImg;
+ [SerializeField] TextEx nameTxt;
+ [SerializeField] TextEx attrTxt;
+ [SerializeField] ButtonEx okBtn;
+
+ protected override void InitComponent()
+ {
+ okBtn.AddListener(CloseWindow);
+ }
+
+ protected override void OnPreOpen()
+ {
+ int horseID = HorseManager.Instance.unLockHorseID;
+ int skinID = HorseManager.Instance.unLockSkinID;
+
+ var horseIDConfig = HorseIDConfig.Get(horseID);
+ if (horseIDConfig == null)
+ return;
+
+ var horseSkinConfig = HorseSkinConfig.Get(skinID);
+ if (horseSkinConfig == null)
+ return;
+
+ nameTxt.text = horseSkinConfig.Name;
+ iconImg.overrideSprite = UILoader.LoadSprite("HorseIcon", horseSkinConfig.Icon);
+ iconImg.SetNativeSize();
+
+ attrTxt.text = StringUtility.Concat(PlayerPropertyConfig.Get(horseIDConfig.AttrID).ShowName, " ", "+", PlayerPropertyConfig.GetValueDescription(horseIDConfig.AttrID, HorseManager.Instance.GetNowAttrValue(horseIDConfig.AttrID)));
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Main/System/Horse/GetHorseWin.cs.meta b/Main/System/Horse/GetHorseWin.cs.meta
new file mode 100644
index 0000000..cba1bb8
--- /dev/null
+++ b/Main/System/Horse/GetHorseWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3a845cc8515c95b4bafd63b59c6d7a0e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/System/Horse/HorseCarouselView.cs b/Main/System/Horse/HorseCarouselView.cs
new file mode 100644
index 0000000..ef0914e
--- /dev/null
+++ b/Main/System/Horse/HorseCarouselView.cs
@@ -0,0 +1,229 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using UnityEngine.Events;
+using UnityEngine.UI;
+using System;
+using System.Linq;
+
+public class HorseCarouselView : MonoBehaviour, IDragHandler, IEndDragHandler, IBeginDragHandler
+{
+ /// 褰撳墠閫変腑绱㈠紩鍙樺寲鏃惰Е鍙�
+ public event Action OnSelectedIndexChanged;
+
+ [Header("UI References")]
+ public RectTransform content; // 瀛樻斁Item鐨勭埗鑺傜偣
+ public GameObject horseItemPrefab; // 鍧愰獞Item棰勫埗浣�
+
+ [Header("Carousel Settings")]
+ List<HorseIDConfig> horseConfigs; // 鍧愰獞閰嶇疆鍒楄〃
+ public float itemSpacing = 150f; // 姣忎釜鍧愰獞鐨勯棿璺�
+ public float scaleMax = 1.3f; // 灞呬腑鏃剁殑鏈�澶х缉鏀�
+ public float scaleMin = 0.8f; // 杈圭紭鏃剁殑鏈�灏忕缉鏀�
+
+ private List<HorseItem> items = new List<HorseItem>();
+
+ // 褰撳墠閫昏緫涓績鐨勫亸绉婚噺 (娴偣鏁帮紝鐢ㄤ簬骞虫粦婊戝姩)
+ private float currentCenterOffset = 0f;
+ private float targetCenterOffset = 0f;
+
+ private bool isDragging = false;
+ private int currentSelectedIndex = 0;
+
+ /// <summary>
+ /// 褰撳墠閫変腑鐨勫潗楠慖D
+ /// </summary>
+ public int CurrentHorseId
+ {
+ get
+ {
+ if (horseConfigs != null && horseConfigs.Count > 0 && currentSelectedIndex >= 0)
+ {
+ int realIndex = (currentSelectedIndex % horseConfigs.Count + horseConfigs.Count) % horseConfigs.Count;
+ return horseConfigs[realIndex].HorseID;
+ }
+ return 0;
+ }
+ }
+
+ void Start()
+ {
+ // 鍒濆鍖栨睜瀛愶細涓轰簡淇濊瘉宸﹀彸婊戝姩涓嶇┛甯紝瑙嗛噹鍐呮樉绀�5涓紝姹犲瓙鍙互寤�7涓� (5 + 宸﹀彸鍚勫1涓紦鍐�)
+ int poolSize = 7;
+ for (int i = 0; i < poolSize; i++)
+ {
+ GameObject go = Instantiate(horseItemPrefab, content);
+ HorseItem item = go.GetComponent<HorseItem>();
+ items.Add(item);
+ }
+ // 鍔ㄦ�佽幏鍙栨墍鏈夊潗楠戦厤缃�
+ horseConfigs = HorseIDConfig.GetValues();
+ // 鎸塇orseSkinConfig鐨剆ortOrder鍜孲kinID鎺掑簭
+ horseConfigs = horseConfigs.OrderBy(c =>
+ {
+ int skinID = HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var id) ? id : int.MaxValue;
+ var skinConfig = HorseSkinConfig.Get(skinID);
+ return skinConfig?.sortOrder ?? int.MaxValue;
+ }).ThenBy(c =>
+ {
+ return HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var skinID) ? skinID : int.MaxValue;
+ }).ToList();
+
+ // 鑾峰彇褰撳墠楠戜箻鍧愰獞鐨勭储寮�
+ int currentHorseID = HorseManager.Instance.horseID;
+ int index = horseConfigs.FindIndex(c => c.HorseID == currentHorseID);
+ InitWithHorse(index >= 0 ? index : 0);
+ }
+
+ // 鐣岄潰鎵撳紑鏃惰皟鐢紝浼犲叆褰撳墠楠戜箻鐨勫潗楠慖D鎴栧簭鍙�
+ public void InitWithHorse(int horseIndex)
+ {
+ currentSelectedIndex = horseIndex;
+ currentCenterOffset = horseIndex;
+ targetCenterOffset = horseIndex;
+ UpdateItems();
+ }
+
+ // 鐐瑰嚮閫変腑鎸囧畾绱㈠紩鐨勫潗楠�
+ public void SelectIndex(int index)
+ {
+ int oldIndex = currentSelectedIndex;
+ currentSelectedIndex = index;
+ targetCenterOffset = index;
+ currentCenterOffset = index;
+ UpdateItems();
+
+ if (oldIndex != currentSelectedIndex)
+ {
+ OnSelectedIndexChanged?.Invoke();
+ }
+ }
+
+ /// <summary>
+ /// 鍒囨崲鍒颁笂涓�涓潗楠�
+ /// </summary>
+ public void SelectPrevious()
+ {
+ int newIndex = (currentSelectedIndex - 1 + horseConfigs.Count) % horseConfigs.Count;
+ SelectIndex(newIndex);
+ }
+
+ /// <summary>
+ /// 鍒囨崲鍒颁笅涓�涓潗楠�
+ /// </summary>
+ public void SelectNext()
+ {
+ int newIndex = (currentSelectedIndex + 1) % horseConfigs.Count;
+ SelectIndex(newIndex);
+ }
+
+ /// <summary>
+ /// 鍒锋柊鎵�鏈塇orseItem鐨勬樉绀猴紙澶栭儴璋冪敤鎺ュ彛锛�
+ /// </summary>
+ public void RefreshAllItems()
+ {
+ if (horseConfigs != null && horseConfigs.Count > 0)
+ {
+ UpdateItems();
+ }
+ }
+
+ void Update()
+ {
+ // 娌″湪鎷栨嫿鏃讹紝骞虫粦鍚搁檮鍒扮洰鏍囦綅缃�
+ if (!isDragging && Mathf.Abs(currentCenterOffset - targetCenterOffset) > 0.001f)
+ {
+ currentCenterOffset = Mathf.Lerp(currentCenterOffset, targetCenterOffset, Time.deltaTime * 10f);
+ UpdateItems();
+ }
+ }
+
+ // 鏍稿績鍒锋柊閫昏緫
+ private void UpdateItems()
+ {
+ int poolSize = items.Count;
+ // 璁$畻褰撳墠涓績浣嶇疆宸︿晶搴旇浠庡摢涓亸绉婚噺寮�濮嬫覆鏌�
+ int startOffset = Mathf.FloorToInt(currentCenterOffset) - (poolSize / 2);
+
+ for (int i = 0; i < poolSize; i++)
+ {
+ // 1. 璁$畻閫昏緫绱㈠紩 (鍖呭惈璐熸暟鎯呭喌)
+ int logicIndex = startOffset + i;
+
+ // 2. 灏嗛�昏緫绱㈠紩鏄犲皠鍒板疄闄呯殑鍧愰獞搴忓彿 (鏍稿績锛氬疄鐜伴灏剧浉杩炵殑鏃犻檺寰幆)
+ // 姣斿 horseConfigs.Count=10锛屽綋 logicIndex=-1鏃讹紝realIndex=9 (鏈綅)
+ int realIndex = (logicIndex % horseConfigs.Count + horseConfigs.Count) % horseConfigs.Count;
+
+ // 3. 璁$畻璇� Item 搴旇鍦ㄧ殑 X 鍧愭爣浣嶇疆
+ // logicIndex - currentCenterOffset 琛ㄧず璇� item 璺濈涓績鐨勯�昏緫璺濈
+ float distanceToCenter = logicIndex - currentCenterOffset;
+ float posX = distanceToCenter * itemSpacing;
+
+ // 4. 鏇存柊 UI 鏄剧ず
+ HorseItem itemUI = items[i];
+ itemUI.rectTransform.anchoredPosition = new Vector2(posX, 0);
+
+ // 5. 璁$畻缂╂斁涓庨�変腑鐘舵�� (鏍规嵁璺濈涓績鐨勭粷瀵硅窛绂�)
+ float absDist = Mathf.Abs(distanceToCenter);
+ // 璺濈灏忎簬1鏃跺紑濮嬫斁澶э紝澶т簬绛変簬1鏃朵负鏈�灏忕缉鏀�
+ float scaleProgress = Mathf.Clamp01(1f - absDist);
+ float currentScale = Mathf.Lerp(scaleMin, scaleMax, scaleProgress);
+ itemUI.rectTransform.localScale = Vector3.one * currentScale;
+
+ // 6. 鏁版嵁涓庤〃鐜版洿鏂� (鍒锋柊澶村儚銆佸悕瀛楃瓑)
+ itemUI.UpdateData(horseConfigs[realIndex], realIndex);
+ itemUI.onItemClick = SelectIndex;
+ }
+ }
+
+ #region 鎷栨嫿涓庡惛闄勯�昏緫
+
+ public void OnBeginDrag(PointerEventData eventData)
+ {
+ isDragging = true;
+ }
+
+ public void OnDrag(PointerEventData eventData)
+ {
+ // 灏嗛紶鏍�/鎵嬫寚鐨勬粦鍔ㄥ儚绱犺浆鍖栦负閫昏緫鍋忕Щ閲�
+ float dragDeltaX = eventData.delta.x;
+ // 闃诲凹绯绘暟锛屾帶鍒舵粦鍔ㄩ�熷害
+ currentCenterOffset -= dragDeltaX / itemSpacing;
+ UpdateItems();
+ }
+
+ public void OnEndDrag(PointerEventData eventData)
+ {
+ isDragging = false;
+
+ // 鏉炬墜鏃讹紝璁$畻搴旇鍚搁檮鍒板摢涓�涓暣鏁扮储寮�
+ // 鍔犲叆鎯�у垽鏂細濡傛灉婊戝姩閫熷害澶熷揩锛岀洿鎺ヨ繘涓�浣嶆垨閫�涓�浣�
+ float speedX = eventData.delta.x;
+ if (speedX > 5f)
+ {
+ targetCenterOffset = Mathf.Floor(currentCenterOffset);
+ }
+ else if (speedX < -5f)
+ {
+ targetCenterOffset = Mathf.Ceil(currentCenterOffset);
+ }
+ else
+ {
+ // 鍚﹀垯灏辫繎鍥涜垗浜斿叆鍚搁檮
+ targetCenterOffset = Mathf.Round(currentCenterOffset);
+ }
+
+ // 鏇存柊鏈�缁堥�変腑鐨勭湡瀹炵储寮�
+ int oldIndex = currentSelectedIndex;
+ currentSelectedIndex = (Mathf.RoundToInt(targetCenterOffset) % horseConfigs.Count + horseConfigs.Count) % horseConfigs.Count;
+
+ if (oldIndex != currentSelectedIndex)
+ {
+ OnSelectedIndexChanged?.Invoke();
+ }
+
+ Debug.Log("褰撳墠閫変腑鍧愰獞搴忓彿: " + currentSelectedIndex);
+ }
+
+ #endregion
+}
\ No newline at end of file
diff --git a/Main/System/Horse/HorseCarouselView.cs.meta b/Main/System/Horse/HorseCarouselView.cs.meta
new file mode 100644
index 0000000..5fbc2e6
--- /dev/null
+++ b/Main/System/Horse/HorseCarouselView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b1022553a62dd7d47afae33bd87625e3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/System/Horse/HorseItem.cs b/Main/System/Horse/HorseItem.cs
new file mode 100644
index 0000000..7aa429e
--- /dev/null
+++ b/Main/System/Horse/HorseItem.cs
@@ -0,0 +1,43 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+public class HorseItem : MonoBehaviour
+{
+ public RectTransform rectTransform;
+ public Image iconImg;
+ public Image attrNameBg;
+ public TextEx attrName;
+ public Image lockImg;
+ public TextEx useTxt;
+ public ButtonEx clickBtn;
+
+ // 鐐瑰嚮鍥炶皟锛屼紶閫掕Item瀵瑰簲鐨剅ealIndex
+ public System.Action<int> onItemClick;
+ public int realIndex;
+
+ // 鍒锋柊鏁版嵁
+ public void UpdateData(HorseIDConfig config, int index)
+ {
+ if (config == null)
+ return;
+ if (!HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(config.HorseID, out int skinID))
+ return;
+ var horseSkinConfig = HorseSkinConfig.Get(skinID);
+ if (horseSkinConfig == null)
+ return;
+
+ iconImg.overrideSprite = UILoader.LoadSprite("HorseIcon", horseSkinConfig.Icon);
+ iconImg.SetNativeSize();
+
+ bool hasArrtId = PlayerPropertyConfig.HasKey(config.AttrID);
+ attrNameBg.SetActive(hasArrtId);
+ attrName.text = hasArrtId ? PlayerPropertyConfig.Get(config.AttrID).Name : string.Empty;
+
+ lockImg.SetActive(!HorseManager.Instance.IsHorseUnlocked(config.HorseID));
+ useTxt.SetActive(config.HorseID == HorseManager.Instance.horseID);
+
+ realIndex = index;
+ clickBtn.onClick.RemoveAllListeners();
+ clickBtn.onClick.AddListener(() => onItemClick?.Invoke(realIndex));
+ }
+}
\ No newline at end of file
diff --git a/Main/System/Horse/HorseItem.cs.meta b/Main/System/Horse/HorseItem.cs.meta
new file mode 100644
index 0000000..4219927
--- /dev/null
+++ b/Main/System/Horse/HorseItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e7860cf1649b57e479b5a50f0058a8c8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Main/System/Horse/HorseManager.cs b/Main/System/Horse/HorseManager.cs
index 73ac403..b4b60d4 100644
--- a/Main/System/Horse/HorseManager.cs
+++ b/Main/System/Horse/HorseManager.cs
@@ -1,11 +1,13 @@
using System;
-using LitJson;
-
using System.Collections.Generic;
using System.Linq;
public class HorseManager : GameSystemManager<HorseManager>
{
+
+ public int unLockSkinID;
+ public int unLockHorseID;
+
public int classLV; //褰撳墠闃剁骇锛屼粠0寮�濮�
public int horseLV; //褰撳墠闃剁瓑绾э紝浠�1寮�濮�
public int exp; //褰撳墠闃剁瓑绾х粡楠岋紝姣忕骇浠�0寮�濮�
@@ -35,6 +37,8 @@
public int lvUPItemID;
public int rankUPItemID;
public int quickRankLV;
+ public int defaultSkinID;
+
public override void Init()
{
@@ -52,12 +56,15 @@
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
}
+
+
void ParseConfig()
{
var config = FuncConfigConfig.Get("HorseUpItem");
lvUPItemID = int.Parse(config.Numerical1);
rankUPItemID = int.Parse(config.Numerical2);
quickRankLV = int.Parse(config.Numerical3);
+ defaultSkinID = int.Parse(config.Numerical4);
}
void OnBeforePlayerDataInitialize()
@@ -66,6 +73,8 @@
horseLV = 0;
exp = 0;
skinDic.Clear();
+ horseIDState = 0;
+ horseID = 0;
}
void OnPlayerLoginOk()
@@ -90,14 +99,15 @@
}
//鑾峰彇褰撳墠浣跨敤鍧愰獞鐨偆ID
- public int GetUsingHorseSkinID(bool useDefault = false)
+ public int GetUsingHorseSkinID(bool useDefault = true)
{
var id = (int)PlayerDatas.Instance.baseData.equipShowSwitch % 1000;
- if (id == 0)
+ // 0 鏈够鍖�
+ if (id == 0 || !HorseSkinConfig.HasKey(id))
{
if (useDefault)
{
- return 1;
+ return defaultSkinID;
}
}
return id;
@@ -106,9 +116,29 @@
//鑾峰彇鍏朵粬鐜╁浣跨敤鍧愰獞鐨偆ID
public int GetOtherPlayerHorseSkinID(int value)
{
- return value % 1000;
+ int id = value % 1000;
+ if (id == 0 || !HorseSkinConfig.HasKey(id))
+ return defaultSkinID;
+ return id;
}
+ //鏄惁澶勪簬骞诲寲鐘舵��
+ public bool IsChangeState(int skinID)
+ {
+ if (skinID == 0) return false;
+ if (!HorseSkinConfig.HasKey(skinID)) return false;
+
+ var config = HorseSkinConfig.Get(skinID);
+ if (config == null) return false;
+ return config.showType == 1;
+ }
+
+ public bool IsHorseIDSkin(int skinID)
+ {
+ var config = HorseSkinConfig.Get(skinID);
+ if (config == null) return false;
+ return config.showType == 2;
+ }
public void UpdateHorseInfo(HA303_tagSCHorseClassInfo netPack)
{
@@ -153,6 +183,87 @@
UIManager.Instance.OpenWindow<HorseSkinGetWin>(netPack.HorseSkinList[0].HorseSkinID);
}
+ }
+ public void SendHorseIDOP(int horseID, int opType)
+ {
+ CB204_tagCSHorseIDOP pack = new CB204_tagCSHorseIDOP()
+ {
+ HorseID = (byte)horseID,
+ OPType = (byte)opType
+ };
+ GameNetSystem.Instance.SendInfo(pack);
+ }
+
+ //鍧愰獞ID淇℃伅
+ public uint horseIDState;
+ public int horseID;
+ public event Action OnUpdateHorseIDInfoEvent;
+ /// <summary>鏂拌В閿佸潗楠戜簨浠讹紝鍙傛暟锛氭柊瑙i攣鐨勫潗楠慖D (0-31)</summary>
+ public event Action<int> OnHorseUnlockedEvent;
+ /// <summary>浣╂埓鍧愰獞鍙樺寲浜嬩欢锛屽弬鏁帮細(鏃D, 鏂癐D)</summary>
+ public event Action<int, int> OnHorseChangedEvent;
+ public void UpdateHorseIDInfo(HA305_tagSCHorseIDInfo netPack)
+ {
+ // 1. 妫�娴嬫柊瑙i攣鐨勫潗楠� (horseID 浠� 0 寮�濮�)
+ uint diff = horseIDState ^ netPack.HorseIDState; // 宸紓浣�
+ uint newUnlock = netPack.HorseIDState & diff; // 鏂板瑙i攣鐨勪綅
+
+ if (newUnlock != 0)
+ {
+ for (int i = 0; i < 32; i++)
+ {
+ if ((newUnlock & (1u << i)) != 0)
+ {
+ OnHorseUnlockedEvent?.Invoke(i); // i 灏辨槸鍧愰獞ID (0-31)
+ }
+ }
+ }
+
+ // 2. 妫�娴嬩僵鎴碔D鍙樺寲
+ if (horseID != netPack.HorseID)
+ {
+ byte oldID = (byte)horseID;
+ horseID = netPack.HorseID;
+ OnHorseChangedEvent?.Invoke(oldID, horseID);
+ }
+
+ // 鏇存柊鐘舵��
+ horseIDState = netPack.HorseIDState;
+ RefreshAttr();
+ OnUpdateHorseIDInfoEvent?.Invoke();
+ }
+
+ /// <summary>
+ /// 鍒ゆ柇鍧愰獞ID鏄惁宸茶В閿� (horseID 浠� 0 寮�濮�)
+ /// </summary>
+ /// <param name="horseID">鍧愰獞ID (0-31)</param>
+ public bool IsHorseUnlocked(int horseID)
+ {
+ var config = HorseIDConfig.Get(horseID);
+ if (config == null) return false;
+
+ if (config.UnlockWay == 1) return true;
+
+ if (horseID < 0 || horseID > 31) return false;
+ return (horseIDState & (1u << horseID)) != 0;
+ }
+ public int GetNowAttrValue(int attrID)
+ {
+ int totalValue = 0;
+ // 浠�0闃剁疮鍔犲埌褰撳墠闃�
+ for (int lv = 0; lv <= classLV; lv++)
+ {
+ var config = HorseClassConfig.Get(lv);
+ if (config.ClassSpecAttrIDList != null)
+ {
+ int index = Array.IndexOf(config.ClassSpecAttrIDList, attrID);
+ if (index >= 0 && config.ClassSpecAttrValueList != null && index < config.ClassSpecAttrValueList.Length)
+ {
+ totalValue += config.ClassSpecAttrValueList[index];
+ }
+ }
+ }
+ return totalValue;
}
#region 绾㈢偣
@@ -203,9 +314,13 @@
}
+
//鍗囨槦/瑙i攣绾㈢偣
foreach (var skin in HorseSkinConfig.GetValues())
{
+ if (skin.showType != 1)
+ continue;
+
if (IsSkinActive(skin.SkinID))
{
if (skin.StarMax > 0)
@@ -225,7 +340,7 @@
if (skin.UnlockWay == 1)
{
- if (classLV >= skin.UnlockValue && skin.UnlockValue > 0)
+ if (classLV >= skin.UnlockValue && skin.UnlockValue > 0)
{
skinRedpoint.state = RedPointState.Simple;
return;
@@ -272,7 +387,8 @@
public bool IsShowTheHorseRedImg(int skinID)
{
var skin = HorseSkinConfig.Get(skinID);
-
+ if (skin.showType != 1)
+ return false;
if (IsSkinActive(skin.SkinID))
{
if (skin.StarMax > 0)
@@ -305,7 +421,7 @@
{
return true;
}
- }
+ }
}
return false;
}
@@ -342,6 +458,7 @@
{
specialAttrDic.Clear();
attrDic.Clear();
+
for (int lv = 0; lv <= classLV; lv++)
{
//鎸夐樁鍔犳垚
@@ -385,6 +502,7 @@
}
}
}
+
}
//鍒锋柊鐨偆灞炴��
@@ -431,6 +549,53 @@
}
}
+
+ public Dictionary<int, long> GetMergedAttrDic()
+ {
+
+ Dictionary<int, long> resultDic = new Dictionary<int, long>();
+ // 鍚堝苟 specialAttrDic
+ foreach (var kvp in specialAttrDic)
+ {
+ resultDic[kvp.Key] = kvp.Value;
+ }
+
+
+ HorseIDConfig horseIDConfig = HorseIDConfig.Get(horseID);
+ int horseIDAttrID = horseIDConfig.AttrID;
+ float attrMultiValue = horseIDConfig.AttrMultiValue;
+ var keys = resultDic.Keys.ToList();
+ foreach (var key in keys)
+ {
+ if (key == horseIDAttrID)
+ {
+ resultDic[key] = (long)(resultDic[key] * attrMultiValue);
+ }
+ }
+
+
+ // 鍚堝苟 attrDic
+ foreach (var kvp in attrDic)
+ {
+ if (resultDic.ContainsKey(kvp.Key))
+ resultDic[kvp.Key] += kvp.Value;
+ else
+ resultDic[kvp.Key] = kvp.Value;
+ }
+
+ // 鍚堝苟 skinAttrDic
+ foreach (var kvp in skinAttrDic)
+ {
+ if (resultDic.ContainsKey(kvp.Key))
+ resultDic[kvp.Key] += kvp.Value;
+ else
+ resultDic[kvp.Key] = kvp.Value;
+ }
+
+ return resultDic;
+ }
+
+
public long GetAttrValue(int attrID)
{
attrDic.TryGetValue(attrID, out long value);
@@ -458,7 +623,15 @@
public List<int> sortSkinList = new List<int>();
public void SortHorseSkinList()
{
- sortSkinList = HorseSkinConfig.GetKeys();
+ sortSkinList.Clear();
+ var temp = HorseSkinConfig.GetValues();
+ foreach (var config in temp)
+ {
+ if (config.showType == 1)
+ {
+ sortSkinList.Add(config.SkinID);
+ }
+ }
sortSkinList.Sort((a, b) =>
{
var isActiveA = IsSkinActive(a);
@@ -469,9 +642,19 @@
}
var skinA = HorseSkinConfig.Get(a);
var skinB = HorseSkinConfig.Get(b);
+
+ // isActive 鐩稿悓鏃讹紝鍏堟寜 sortOrder 鎺掑簭
+ if (skinA.sortOrder != skinB.sortOrder)
+ {
+ return skinA.sortOrder - skinB.sortOrder;
+ }
+
+ // sortOrder 鐩稿悓鏃讹紝鍐嶆寜 SkinID 鎺掑簭
return skinA.SkinID - skinB.SkinID;
});
}
+
+
public Dictionary<int, long> GetAttrBySkinID(HorseSkinConfig config)
{
@@ -524,7 +707,8 @@
}
}
-public class HorseSkin {
+public class HorseSkin
+{
public int State; //鏄惁宸叉縺娲�
public int EndTime; //鍒版湡鏃堕棿鎴筹紝0涓烘案涔�
public int Star; //鏄熺骇
diff --git a/Main/System/Horse/HorseRankUPWin.cs b/Main/System/Horse/HorseRankUPWin.cs
index e21a8db..b7602ac 100644
--- a/Main/System/Horse/HorseRankUPWin.cs
+++ b/Main/System/Horse/HorseRankUPWin.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
@@ -11,14 +12,17 @@
{
[SerializeField] Text curLVText;
[SerializeField] Text nextLVText;
- [SerializeField] Text[] attrNameTexts;
- [SerializeField] Text[] attrValueTexts;
- [SerializeField] Text[] nextAttrValueTexts;
[SerializeField] Transform[] specialAttrRect;
[SerializeField] Text[] specialAttrNameTexts;
[SerializeField] Text[] specialAttrValueTexts;
[SerializeField] Text[] specialNextAttrValueTexts;
+
+ [SerializeField] Transform riderAttrRect;
+ [SerializeField] Text riderAttrNameText;
+ [SerializeField] Text riderAttrValueText;
+ [SerializeField] Text riderNextAttrValueText;
+ [SerializeField] Text noRiderText;
[SerializeField] Text costText;
[SerializeField] Image costItemImg;
@@ -50,18 +54,6 @@
var keys = HorseManager.Instance.attrDic.Keys.ToList();
keys.Sort();
- for (int i = 0; i < attrNameTexts.Length; i++)
- {
- if (i < keys.Count)
- {
- var curValue = HorseManager.Instance.attrDic[keys[i]];
- attrNameTexts[i].text = PlayerPropertyConfig.Get(keys[i]).Name;
- attrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], curValue, 2);
-
- nextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i],
- curValue + nextConfig.ClassAttrValueList[i] + nextConfig.PerLVAttrValueList[i], 2);
- }
- }
var nextKeys = HorseManager.Instance.specialAttrDic.Keys.ToList();
nextKeys.Sort();
@@ -92,6 +84,38 @@
costText.text = UIHelper.ShowUseItem(PackType.Item, HorseManager.Instance.rankUPItemID, HorseClassConfig.Get(HorseManager.Instance.classLV).ClassUPItemCnt);
costItemImg.SetItemSprite(HorseManager.Instance.rankUPItemID);
+ int nowhorseID = HorseManager.Instance.horseID;
+ HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(nowhorseID, out int horseSkinID);
+ var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+ var horseIDConfig = HorseIDConfig.Get(nowhorseID);
+ if (horseIdSkinConfig == null || horseIDConfig == null) return;
+ int attrID = horseIDConfig.AttrID;
+ int attrValue = HorseManager.Instance.GetNowAttrValue(attrID);
+
+ // 妫�鏌ュ睘鎬ф槸鍚﹀瓨鍦�
+ var propConfig = PlayerPropertyConfig.Get(attrID);
+ if (propConfig == null)
+ {
+ // 娌℃湁灞炴��
+ noRiderText.SetActive(true);
+ riderAttrRect.SetActive(false);
+ }
+ else
+ {
+ // 鏈夊睘鎬�
+ noRiderText.SetActive(false);
+ riderAttrRect.SetActive(true);
+ riderAttrNameText.text = propConfig.Name;
+ riderAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, (long)(attrValue * horseIDConfig.AttrMultiValue), 2);
+
+ // 涓嬩竴闃剁殑灞炴�у��
+ int index = Array.IndexOf(nextConfig.ClassSpecAttrIDList, attrID);
+ if (index < 0 || index > nextConfig.ClassSpecAttrIDList.Length)
+ return;
+ long nextAttrValue = (long)((attrValue + nextConfig.ClassSpecAttrValueList[index]) * horseIDConfig.AttrMultiValue);
+ riderNextAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, nextAttrValue, 2);
+ }
+
}
//鍗囬樁
@@ -107,7 +131,7 @@
var pack = new CB202_tagCSHorseClassUP();
GameNetSystem.Instance.SendInfo(pack);
CloseWindow();
-
+
if (!TimingGiftManager.Instance.TryAddWhenExactConsumption(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt))
{
TimingGiftManager.Instance.TryAddWithFixedProbabilityWhenSufficient(12, PackType.Item, HorseManager.Instance.rankUPItemID, config.ClassUPItemCnt);
diff --git a/Main/System/Horse/HorseSkinCell.cs b/Main/System/Horse/HorseSkinCell.cs
index 013193b..8711af6 100644
--- a/Main/System/Horse/HorseSkinCell.cs
+++ b/Main/System/Horse/HorseSkinCell.cs
@@ -31,7 +31,7 @@
{
skinID = _skinID;
horseModel.Create(skinID, 0, 0.6f);
- emptyImg.SetActive(skinID == 0);
+ emptyImg.SetActive(skinID == 999);
usingObj.SetActive(HorseManager.Instance.GetUsingHorseSkinID() == skinID);
bool isShowRed = HorseManager.Instance.IsShowTheHorseRedImg(skinID);
redObj.SetActive(isShowRed);
diff --git a/Main/System/Horse/HorseSkinWin.cs b/Main/System/Horse/HorseSkinWin.cs
index 10d1ec7..1a46207 100644
--- a/Main/System/Horse/HorseSkinWin.cs
+++ b/Main/System/Horse/HorseSkinWin.cs
@@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
+using System.Linq;
using UnityEngine;
using UnityEngine.UI;
@@ -22,8 +23,7 @@
[SerializeField] Image lvUpItemImg;
[SerializeField] Button changeSkinBtn;
[SerializeField] Text timeText;
- [SerializeField] Transform inSkinMarkObj; //骞诲寲涓�
-
+ [SerializeField] Button removeBtn; //瑙i櫎骞诲寲
[SerializeField] Button unlockBtn;
[SerializeField] Text unlockCostText;
[SerializeField] Image unlockItemImg;
@@ -34,11 +34,15 @@
lvUpBtn.AddListener(OnLvUpBtnClick);
changeSkinBtn.AddListener(OnChangeSkinBtnClick);
unlockBtn.AddListener(OnUnlockBtnClick);
+ removeBtn.AddListener(OnRemoveBtnClick);
}
protected override void OnPreOpen()
{
- HorseManager.Instance.selectSkinID = HorseManager.Instance.GetUsingHorseSkinID();
+ HorseManager.Instance.SortHorseSkinList();
+
+ int usingHorseSkinID = HorseManager.Instance.GetUsingHorseSkinID();
+ HorseManager.Instance.selectSkinID = usingHorseSkinID == 0 || !HorseManager.Instance.sortSkinList.Contains(usingHorseSkinID) ? HorseManager.Instance.sortSkinList[0] : usingHorseSkinID;
HorseManager.Instance.SortHorseSkinList();
HorseManager.Instance.OnSkinUpdateEvent += OnSkinUpdateEvent;
HorseManager.Instance.OnSelectEvent += OnSelectEvent;
@@ -140,12 +144,12 @@
if (HorseManager.Instance.selectSkinID == HorseManager.Instance.GetUsingHorseSkinID())
{
changeSkinBtn.SetActive(false);
- inSkinMarkObj.SetActive(true);
+ removeBtn.SetActive(true);
}
else
{
changeSkinBtn.SetActive(true);
- inSkinMarkObj.SetActive(false);
+ removeBtn.SetActive(false);
}
ShowTime();
@@ -210,12 +214,14 @@
var _cell = cell as HorseSkinLineCell;
_cell.Display(cell.index);
}
-
+
void OnSeeAttrBtnClick()
{
- AttributeManager.Instance.OpenSimpleAttributeWin(HorseManager.Instance.skinAttrDic, "AttributeTitle04");
+ Dictionary<int, long> totalAttrDic = HorseManager.Instance.GetMergedAttrDic();
+ AttributeManager.Instance.OpenSimpleAttributeWin(totalAttrDic, "AttributeTitle04");
}
+
string GetSkinAttrSring(HorseSkinConfig config)
@@ -279,5 +285,9 @@
HorseManager.Instance.SendSkinOP(1, HorseManager.Instance.selectSkinID);
}
}
-
+
+ void OnRemoveBtnClick()
+ {
+ HorseManager.Instance.SendSkinOP(2, 0);
+ }
}
\ No newline at end of file
diff --git a/Main/System/Horse/HorseSuccessWin.cs b/Main/System/Horse/HorseSuccessWin.cs
index f21c45d..82ccbf7 100644
--- a/Main/System/Horse/HorseSuccessWin.cs
+++ b/Main/System/Horse/HorseSuccessWin.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
@@ -11,9 +12,6 @@
{
[SerializeField] Text curLVText;
[SerializeField] Text nextLVText;
- [SerializeField] Text[] attrNameTexts;
- [SerializeField] Text[] attrValueTexts;
- [SerializeField] Text[] nextAttrValueTexts;
[SerializeField] Transform[] specialAttrRect;
[SerializeField] Text[] specialAttrNameTexts;
@@ -21,6 +19,11 @@
[SerializeField] Text[] specialNextAttrValueTexts;
[SerializeField] Button okBtn;
+ [SerializeField] Transform riderAttrRect;
+ [SerializeField] Text riderAttrNameText;
+ [SerializeField] Text riderAttrValueText;
+ [SerializeField] Text riderNextAttrValueText;
+ [SerializeField] Text noRiderText;
protected override void InitComponent()
@@ -49,17 +52,6 @@
var keys = HorseManager.Instance.attrDic.Keys.ToList();
keys.Sort();
- for (int i = 0; i < attrNameTexts.Length; i++)
- {
- if (i < keys.Count)
- {
- var curValue = HorseManager.Instance.attrDic[keys[i]];
- attrNameTexts[i].text = PlayerPropertyConfig.Get(keys[i]).Name;
- attrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i],
- curValue - nextConfig.ClassAttrValueList[i] - nextConfig.PerLVAttrValueList[i], 2);
- nextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(keys[i], curValue, 2);
- }
- }
var nextKeys = HorseManager.Instance.specialAttrDic.Keys.ToList();
nextKeys.Sort();
@@ -72,9 +64,9 @@
specialAttrNameTexts[i].text = PlayerPropertyConfig.Get(id).Name;
if (i < nextKeys.Count)
{
- specialAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id,
+ specialAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id,
HorseManager.Instance.specialAttrDic[nextKeys[i]] - nextConfig.ClassSpecAttrValueList[i], 2);
- specialNextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id,
+ specialNextAttrValueTexts[i].text = PlayerPropertyConfig.GetValueDescription(id,
HorseManager.Instance.specialAttrDic[nextKeys[i]], 2);
}
else
@@ -88,8 +80,56 @@
specialAttrRect[i].SetActive(false);
}
}
+ int nowhorseID = HorseManager.Instance.horseID;
+ HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(nowhorseID, out int horseSkinID);
+ var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+ var horseIDConfig = HorseIDConfig.Get(nowhorseID);
+ if (horseIdSkinConfig == null || horseIDConfig == null) return;
+ int attrID = horseIDConfig.AttrID;
+ // 銆愭敞鎰忋�戝洜涓哄凡缁忚繘闃舵垚鍔燂紝姝ゅ鑾峰彇鐨勬槸杩涢樁銆愬悗銆戠殑鏈�鏂版�诲��
+ int newAttrValue = HorseManager.Instance.GetNowAttrValue(attrID);
+
+ // 妫�鏌ュ睘鎬ф槸鍚﹀瓨鍦�
+ var propConfig = PlayerPropertyConfig.Get(attrID);
+ if (propConfig == null)
+ {
+ // 娌℃湁灞炴��
+ noRiderText.SetActive(true);
+ riderAttrRect.SetActive(false);
+ }
+ else
+ {
+ // 鏈夊睘鎬�
+ noRiderText.SetActive(false);
+ riderAttrRect.SetActive(true);
+ riderAttrNameText.text = propConfig.Name;
+
+ // 璁$畻杩涢樁鍓嶇殑鏃у��
+ int oldAttrValue = newAttrValue; // 榛樿濡傛灉娌℃湁澧為噺锛屾棫鍊肩瓑浜庢柊鍊�
+
+ // nextConfig 鍙橀噺鍦ㄨ繖閲屽叾瀹炰唬琛ㄧ殑鏄�滃垰杈惧埌鐨勬柊闃剁骇閰嶇疆鈥�
+ if (nextConfig.ClassSpecAttrIDList != null)
+ {
+ // 鍦� ID 鍒楄〃涓鎵惧搴斿睘鎬х殑绱㈠紩
+ int index = Array.IndexOf(nextConfig.ClassSpecAttrIDList, attrID);
+
+ // 纭繚鎵惧埌浜嗭紝涓旂储寮曟病鏈夎秺鐣岋紙閬垮厤鐩存帴return瀵艰嚧UI娌″埛鏂帮級
+ if (index >= 0 && nextConfig.ClassSpecAttrValueList != null && index < nextConfig.ClassSpecAttrValueList.Length)
+ {
+ // 鏃у�� = 鏈�鏂版�诲�� - 鏈杩涢樁澧炲姞鐨勬暟鍊�
+ oldAttrValue = newAttrValue - nextConfig.ClassSpecAttrValueList[index];
+ }
+ }
+
+ float multi = horseIDConfig.AttrMultiValue;
+
+ // 宸﹁竟鏄剧ず鍗囬樁鍓嶇殑鏃у��
+ riderAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, (long)(oldAttrValue * multi), 2);
+
+ // 鍙宠竟鏄剧ず鍗囬樁鍚庣殑鏂板��
+ riderNextAttrValueText.text = PlayerPropertyConfig.GetValueDescription(attrID, (long)(newAttrValue * multi), 2);
+ }
}
-
}
\ No newline at end of file
diff --git a/Main/System/Horse/HorseWin.cs b/Main/System/Horse/HorseWin.cs
index 4400858..134a9eb 100644
--- a/Main/System/Horse/HorseWin.cs
+++ b/Main/System/Horse/HorseWin.cs
@@ -13,7 +13,6 @@
[SerializeField] HorseController modelImg;
[SerializeField] UIEffectPlayer lvUPEffect;
[SerializeField] Text nameText;
- [SerializeField] Text specialAttrText;
[SerializeField] Button skinBtn;
[SerializeField] Text[] attrNameTexts;
[SerializeField] Text[] attrValueTexts;
@@ -29,8 +28,20 @@
[SerializeField] Text needUPText;
[SerializeField] Button rankUpBtn;
+ [SerializeField] TextEx[] specialAttrNameTexts;
+ [SerializeField] TextEx[] specialAttrValueTexts;
-
+ [SerializeField] Button lastHorseBtn;
+ [SerializeField] Button nextHorseBtn;
+ [SerializeField] HorseCarouselView carouselView;
+ [SerializeField] ImageEx attrImg;
+ [SerializeField] TextEx attrTxt;
+ [SerializeField] TextEx noAttrTxt;
+ [SerializeField] ButtonEx unlockBtn;
+ [SerializeField] TextEx moneyTxt;
+ [SerializeField] ImageEx moneyImg;
+ [SerializeField] ButtonEx useBtn;
+ [SerializeField] TextEx usingTxt;
int beforeLV;
protected override void InitComponent()
@@ -43,6 +54,64 @@
lvupBtn.onPress.AddListener(HorseUpgrade);
quickUpToggle.onValueChanged.AddListener((bool value) => { OnToggle(value); });
rankUpBtn.AddListener(HorseRankUpgrade);
+ lastHorseBtn.AddListener(OnLastHorse);
+ nextHorseBtn.AddListener(OnNextHorse);
+ useBtn.AddListener(() =>
+ {
+ HorseManager.Instance.SendHorseIDOP(carouselView.CurrentHorseId, 2);
+
+ if (!HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(carouselView.CurrentHorseId, out var skinID))
+ return;
+ bool isChangeState = HorseManager.Instance.IsChangeState(HorseManager.Instance.GetUsingHorseSkinID(false));
+ if (!isChangeState)
+ {
+ HorseManager.Instance.SendSkinOP(2, skinID);
+ }
+ });
+ unlockBtn.AddListener(() =>
+ {
+ if (!HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(carouselView.CurrentHorseId, out var skinID))
+ return;
+ var skinConfig = HorseSkinConfig.Get(skinID);
+ if (skinConfig == null)
+ return;
+
+ var horseConfig = HorseIDConfig.Get(carouselView.CurrentHorseId);
+ if (horseConfig == null)
+ return;
+
+ ConfirmCancel.MoneyIconToggleConfirmByType(
+ ToggleCheckType.Horse,
+ horseConfig.UnlockNeedCnt,
+ horseConfig.UnlockValue,
+ Language.Get("Horse20", UIHelper.GetIconNameWithMoneyType(horseConfig.UnlockValue), horseConfig.UnlockNeedCnt),
+ () =>
+ {
+ if (!UIHelper.CheckMoneyCount(horseConfig.UnlockValue, horseConfig.UnlockNeedCnt, 2))
+ {
+ return;
+ }
+
+ HorseManager.Instance.unLockHorseID = carouselView.CurrentHorseId;
+ HorseManager.Instance.SendHorseIDOP(carouselView.CurrentHorseId, 1);
+ HorseManager.Instance.unLockSkinID = skinID;
+ bool isChangeState = HorseManager.Instance.IsChangeState(HorseManager.Instance.GetUsingHorseSkinID(false));
+ if (!isChangeState)
+ {
+ HorseManager.Instance.SendSkinOP(2, skinID);
+ }
+ });
+ });
+ }
+
+ void OnLastHorse()
+ {
+ carouselView?.SelectPrevious();
+ }
+
+ void OnNextHorse()
+ {
+ carouselView?.SelectNext();
}
protected override void OnPreOpen()
@@ -53,6 +122,30 @@
HorseManager.Instance.OnHorseUpdateEvent += OnHorseUpdateEvent;
PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
PackManager.Instance.RefreshItemEvent += OnRefreshItemEvent;
+ HorseManager.Instance.OnUpdateHorseIDInfoEvent += OnUpdateHorseIDInfoEvent;
+ carouselView.OnSelectedIndexChanged += OnSelectedIndexChanged;
+ HorseManager.Instance.OnHorseUnlockedEvent += OnHorseUnlockedEvent;
+
+ // 姣忔鎵撳紑鏃讹紝鎭㈠鍒板綋鍓嶉獞涔樼殑鍧愰獞
+ if (carouselView != null)
+ {
+ int currentHorseID = HorseManager.Instance.horseID;
+ // 鍔ㄦ�佽幏鍙栨墍鏈夊潗楠戦厤缃�
+ var horseConfigs = HorseIDConfig.GetValues();
+ // 鎸塇orseSkinConfig鐨剆ortOrder鍜孲kinID鎺掑簭
+ horseConfigs = horseConfigs.OrderBy(c =>
+ {
+ int skinID = HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var id) ? id : int.MaxValue;
+ var skinConfig = HorseSkinConfig.Get(skinID);
+ return skinConfig?.sortOrder ?? int.MaxValue;
+ }).ThenBy(c =>
+ {
+ return HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(c.HorseID, out var skinID) ? skinID : int.MaxValue;
+ }).ToList();
+
+ int index = horseConfigs.FindIndex(c => c.HorseID == currentHorseID);
+ carouselView.InitWithHorse(index >= 0 ? index : 0);
+ }
Display();
}
@@ -62,6 +155,28 @@
HorseManager.Instance.OnHorseUpdateEvent -= OnHorseUpdateEvent;
PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
PackManager.Instance.RefreshItemEvent -= OnRefreshItemEvent;
+ HorseManager.Instance.OnUpdateHorseIDInfoEvent -= OnUpdateHorseIDInfoEvent;
+ carouselView.OnSelectedIndexChanged -= OnSelectedIndexChanged;
+ HorseManager.Instance.OnHorseUnlockedEvent -= OnHorseUnlockedEvent;
+ }
+
+ private void OnHorseUnlockedEvent(int horseID)
+ {
+ if (!UIManager.Instance.IsOpened<GetHorseWin>())
+ {
+ UIManager.Instance.OpenWindow<GetHorseWin>();
+ }
+ }
+
+ private void OnUpdateHorseIDInfoEvent()
+ {
+ Display();
+ carouselView.RefreshAllItems();
+ }
+
+ private void OnSelectedIndexChanged()
+ {
+ DisplayModel();
}
void OnHorseUpdateEvent()
@@ -112,12 +227,69 @@
UIManager.Instance.OpenWindow<HorseRankUPWin>();
}
+ void DisplayModel()
+ {
+ int nowSkinID = HorseManager.Instance.GetUsingHorseSkinID(false);
+
+ int nowhorseID = HorseManager.Instance.horseID;
+ int showHorseID = carouselView.CurrentHorseId;
+ HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(showHorseID, out int horseSkinID);
+ var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+
+ bool isChangeState = HorseManager.Instance.IsChangeState(nowSkinID);
+ modelImg.Create(isChangeState ? nowSkinID : horseSkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID());
+ nameText.text = isChangeState ? HorseSkinConfig.Get(nowSkinID).Name : horseIdSkinConfig.Name;
+ HorseIDConfig horseIDConfig = HorseIDConfig.Get(showHorseID);
+
+ float attrMultiValue = horseIDConfig.AttrMultiValue;
+ var attrConfig = PlayerPropertyConfig.Get(horseIDConfig.AttrID);
+ bool hasAttr = attrConfig != null;
+
+ attrImg.SetActive(hasAttr);
+ noAttrTxt.SetActive(!hasAttr);
+ if (hasAttr)
+ {
+ attrTxt.text = StringUtility.Concat(attrConfig.ShowName, " ", "+", PlayerPropertyConfig.GetValueDescription(horseIDConfig.AttrID, GetAttrValue(horseIDConfig.AttrID, attrMultiValue)));
+ }
+ useBtn.SetActive(carouselView.CurrentHorseId != nowhorseID && HorseManager.Instance.IsHorseUnlocked(carouselView.CurrentHorseId));
+ usingTxt.SetActive(carouselView.CurrentHorseId == nowhorseID);
+
+ bool isUnlock = HorseManager.Instance.IsHorseUnlocked(carouselView.CurrentHorseId);
+ unlockBtn.SetActive(!isUnlock);
+ if (!isUnlock)
+ {
+ moneyImg.SetIconWithMoneyType(horseIDConfig.UnlockValue);
+ moneyTxt.text = horseIDConfig.UnlockNeedCnt.ToString();
+ }
+
+ }
+
+ public int GetAttrValue(int attrID, float attrMultiValue)
+ {
+ int totalValue = 0;
+ int currentClassLV = HorseManager.Instance.classLV;
+
+ // 浠�0闃剁疮鍔犲埌褰撳墠闃�
+ for (int lv = 0; lv <= currentClassLV; lv++)
+ {
+ var config = HorseClassConfig.Get(lv);
+ if (config.ClassSpecAttrIDList != null)
+ {
+ int index = Array.IndexOf(config.ClassSpecAttrIDList, attrID);
+ if (index >= 0 && config.ClassSpecAttrValueList != null && index < config.ClassSpecAttrValueList.Length)
+ {
+ totalValue += config.ClassSpecAttrValueList[index];
+ }
+ }
+ }
+ return totalValue * (int)attrMultiValue;
+ }
+
+
void Display()
{
- var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
- modelImg.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID());
- nameText.text = skinConfig.Name;
- specialAttrText.text = GetSpecialAttr();
+ DisplayModel();
+ DisplaySpecialAttr();
var config = HorseClassConfig.Get(HorseManager.Instance.classLV);
lvText.text = Language.Get("Horse8", HorseManager.Instance.classLV, HorseManager.Instance.horseLV);
@@ -194,17 +366,27 @@
}
}
- string GetSpecialAttr()
+ public void DisplaySpecialAttr()
{
- if (HorseManager.Instance.specialAttrDic.Count == 0)
- return "";
+ var specialAttrDic = HorseManager.Instance.specialAttrDic;
+ var attrs = specialAttrDic.Keys.ToList();
+ int arrtCnt = attrs.Count;
- List<string> attrList = new List<string>();
- foreach (var attrID in HorseManager.Instance.specialAttrDic.Keys)
+ for (int i = 0; i < specialAttrNameTexts.Length; i++)
{
- attrList.Add(UIHelper.AppendColor(TextColType.itemchuanqi, PlayerPropertyConfig.GetFullDescription(attrID, HorseManager.Instance.specialAttrDic[attrID])));
+ if (i < arrtCnt)
+ {
+ specialAttrNameTexts[i].SetActive(true);
+ specialAttrValueTexts[i].SetActive(true);
+ specialAttrNameTexts[i].text = PlayerPropertyConfig.Get(attrs[i]).Name;
+ specialAttrValueTexts[i].text = StringUtility.Concat("+", PlayerPropertyConfig.GetValueDescription(attrs[i], specialAttrDic.ContainsKey(attrs[i]) ? specialAttrDic[attrs[i]] : 0, 2));
+ }
+ else
+ {
+ specialAttrNameTexts[i].SetActive(false);
+ specialAttrValueTexts[i].SetActive(false);
+ }
}
- return Language.Get("L1100", Language.Get("herocard55"), string.Join(Language.Get("L1112"), attrList));
}
void OnToggle(bool value)
@@ -235,7 +417,7 @@
switch (type)
{
case PlayerDataType.EquipShowSwitch:
- var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
+ var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(true));
modelImg.Create(skinConfig.SkinID, PhantasmPavilionManager.Instance.GetMyModelSkinID());
nameText.text = skinConfig.Name;
break;
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index 1356e65..d0abef8 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -877,8 +877,21 @@
{
horseBGImg.SetActive(true);
//equipShowSwitch;//褰撳墠閰嶇疆鐨勫潗楠戝瑙侷D瀛樺偍鍦紙鏈�澶ф敮鎸� 1~999锛�
- var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID(true));
- horseImg.Create(skinConfig.SkinID, 0, 0.6f);
+ var skinConfig = HorseSkinConfig.Get(HorseManager.Instance.GetUsingHorseSkinID());
+ if (skinConfig.SkinID == 999)
+ {
+ int nowhorseID = HorseManager.Instance.horseID;
+ HorseSkinConfig.horseIDTohorseSkinIDDict.TryGetValue(nowhorseID, out int horseSkinID);
+ var horseIdSkinConfig = HorseSkinConfig.Get(horseSkinID);
+ horseImg.Create(horseIdSkinConfig.SkinID, 0, 0.6f);
+ }
+ else
+ {
+ horseImg.Create(skinConfig.SkinID, 0, 0.6f);
+ }
+
+
+
horseLVText.text = Language.Get("Horse8", HorseManager.Instance.classLV, HorseManager.Instance.horseLV);
}
else
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
index 39e82b0..c30e4ef 100644
--- a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -191,7 +191,16 @@
if (horseData != null)
{
txtHorseLV.text = Language.Get("Horse8", horseData.ClassLV, horseData.LV);
- horseController.Create(horseSkinID <= 0 ? 1 : horseSkinID, scale: 0.6f);
+
+ if (horseSkinID == 999)
+ {
+ horseController.Create(HorseManager.Instance.defaultSkinID, scale: 0.6f);
+ }
+ else
+ {
+ horseController.Create(horseSkinID, scale: 0.6f);
+ }
+
}
}
diff --git a/Main/System/Tip/ConfirmCancel.cs b/Main/System/Tip/ConfirmCancel.cs
index 6492c47..bc382ab 100644
--- a/Main/System/Tip/ConfirmCancel.cs
+++ b/Main/System/Tip/ConfirmCancel.cs
@@ -358,6 +358,7 @@
GoldRush = 2, //娣橀噾
BoneField = 3, //鐧介鐩堥噹
FuncPreset = 4, //鍔熻兘(娴佹淳)棰勮
+ Horse = 5,//鍧愰獞璐拱
}
--
Gitblit v1.8.0