33using Exiled . Events . EventArgs . Player ;
44using Exiled . Events . Features ;
55using MEC ;
6+ using System ;
67using System . Collections . Generic ;
7- using System . Linq ;
88using YongAnFrame . Events . EventArgs . FramePlayer ;
99using YongAnFrame . Roles ;
10+ using static YongAnFrame . Players . HintManager ;
1011
1112namespace YongAnFrame . Players
1213{
13- public sealed class FramePlayer
14+ public sealed class FramePlayer : ICustomAlgorithm
1415 {
1516 private PlayerTitle usingTitles = null ;
1617 private PlayerTitle usingRankTitles = null ;
@@ -31,7 +32,8 @@ public sealed class FramePlayer
3132 /// <summary>
3233 /// 实例拥有的自定义角色
3334 /// </summary>
34- public CustomRolePlus CustomRolePlus {
35+ public CustomRolePlus CustomRolePlus
36+ {
3537 get
3638 {
3739 if ( ExPlayer . GetCustomRoles ( ) . Count != 0 )
@@ -45,11 +47,25 @@ public CustomRolePlus CustomRolePlus {
4547 /// 提示系统管理器
4648 /// </summary>
4749 public HintManager HintManager { get ; private set ; }
50+
51+ /// <summary>
52+ /// 正在使用的主要自定义算法
53+ /// </summary>
54+ public ICustomAlgorithm CustomAlgorithm { get ; set ; }
55+
4856 /// <summary>
4957 /// 玩家等级
5058 /// </summary>
5159 public ulong Level { get ; set ; }
5260 /// <summary>
61+ /// 玩家经验
62+ /// </summary>
63+ public ulong Exp { get ; set ; }
64+ /// <summary>
65+ /// 玩家经验倍率
66+ /// </summary>
67+ public float ExpMultiplier { get ; set ; }
68+ /// <summary>
5369 /// 玩家批准绕过DNT
5470 /// </summary>
5571 public bool IsBDNT { get ; set ; }
@@ -104,9 +120,36 @@ internal FramePlayer(Player player)
104120 ExPlayer = player ;
105121 HintManager = new HintManager ( this ) ;
106122 dictionary . Add ( ExPlayer . Id , this ) ;
123+ CustomAlgorithm = this ;
107124 Events . Handlers . FramePlayer . OnFramePlayerCreated ( new FramePlayerCreatedEventArgs ( this ) ) ;
108125 }
109126
127+ public void AddExp ( ulong exp , string name = "未知原因" )
128+ {
129+ float globalExpMultiplier = YongAnFramePlugin . Instance . Config . GlobalExpMultiplier ;
130+ float expMultiplier = ExpMultiplier * globalExpMultiplier ;
131+ ulong addExp = ( ulong ) ( exp * expMultiplier ) ;
132+
133+ Exp += addExp ;
134+ HintManager . MessageTexts . Add ( new Text ( $ "{ name } ,获得{ exp } +{ addExp - exp } 经验({ expMultiplier } 倍经验)", 5 ) ) ;
135+
136+ ulong needExp = CustomAlgorithm . GetNeedUpLevel ( Level ) ;
137+ ulong oldLevel = Level ;
138+ while ( Exp >= needExp )
139+ {
140+ Log . Debug ( $ "{ Exp } /{ needExp } ") ;
141+ Level ++ ;
142+ Exp -= needExp ;
143+ needExp = CustomAlgorithm . GetNeedUpLevel ( Level ) ;
144+ }
145+ if ( oldLevel < Level )
146+ {
147+ UpdateShowInfoList ( ) ;
148+ HintManager . MessageTexts . Add ( new Text ( $ "恭喜你从{ oldLevel } 级到达{ Level } 级,距离下一级需要{ Exp } /{ needExp } 经验", 8 ) ) ;
149+ }
150+ }
151+
152+
110153 #region ShowRank
111154
112155 private readonly CoroutineHandle [ ] coroutines = new CoroutineHandle [ 2 ] ;
@@ -236,6 +279,11 @@ private IEnumerator<float> DynamicTitlesShow()
236279 }
237280 #endregion
238281
282+ public ulong GetNeedUpLevel ( ulong level )
283+ {
284+ return ( ulong ) ( 100 + Math . Floor ( level / 10f ) * 100 ) ;
285+ }
286+
239287 /// <summary>
240288 /// 获取框架玩家
241289 /// </summary>
0 commit comments