2021-04-08 20:09:59 +08:00
|
|
|
|
using MongoDB.Bson;
|
|
|
|
|
using MongoDB.Bson.Serialization.Attributes;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace ET
|
|
|
|
|
{
|
|
|
|
|
namespace EventType
|
|
|
|
|
{
|
|
|
|
|
public struct NumbericChange
|
|
|
|
|
{
|
|
|
|
|
public Entity Parent;
|
|
|
|
|
public NumericType NumericType;
|
|
|
|
|
public float Old;
|
|
|
|
|
public float New;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class NumericComponentAwakeSystem : AwakeSystem<NumericComponent>
|
|
|
|
|
{
|
|
|
|
|
public override void Awake(NumericComponent self)
|
|
|
|
|
{
|
|
|
|
|
self.Awake();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class NumericComponentDestroySystem : DestroySystem<NumericComponent>
|
|
|
|
|
{
|
|
|
|
|
public override void Destroy(NumericComponent self)
|
|
|
|
|
{
|
|
|
|
|
self.NumericDic.Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class NumericComponent : Entity, ISerializeToEntity
|
|
|
|
|
{
|
|
|
|
|
[BsonRepresentation(BsonType.Double, AllowTruncation = true)]
|
|
|
|
|
[MongoDB.Bson.Serialization.Attributes.BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfDocuments)]
|
|
|
|
|
public Dictionary<int, float> NumericDic = new Dictionary<int, float>();
|
|
|
|
|
|
|
|
|
|
public void Awake()
|
|
|
|
|
{
|
|
|
|
|
// 这里初始化base值
|
|
|
|
|
}
|
|
|
|
|
public float Get(NumericType numericType)
|
|
|
|
|
{
|
|
|
|
|
return GetByKey((int)numericType);
|
|
|
|
|
}
|
|
|
|
|
public float Get(int numericType)
|
|
|
|
|
{
|
|
|
|
|
return GetByKey(numericType);
|
|
|
|
|
}
|
|
|
|
|
#if UNITY
|
|
|
|
|
public int GetAsInt(NumericType numericType)
|
|
|
|
|
{
|
|
|
|
|
return UnityEngine.Mathf.RoundToInt(GetByKey((int)numericType));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
2021-04-20 00:25:04 +08:00
|
|
|
|
#if SERVER || ROBOT
|
2021-04-08 20:09:59 +08:00
|
|
|
|
public int GetAsInt(NumericType numericType)
|
|
|
|
|
{
|
|
|
|
|
return MathHelper.RoundToInt(GetByKey((int)numericType));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int GetAsInt(int numericType)
|
|
|
|
|
{
|
|
|
|
|
return MathHelper.RoundToInt(GetByKey(numericType));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public long GetAsLong(int numericType)
|
|
|
|
|
{
|
|
|
|
|
return MathHelper.RoundToLong(GetByKey(numericType));
|
|
|
|
|
}
|
|
|
|
|
public long GetAsLong(NumericType numericType)
|
|
|
|
|
{
|
|
|
|
|
return MathHelper.RoundToLong(GetByKey((int)numericType));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
public void Set(NumericType nt, float value, bool canMulti = true)
|
|
|
|
|
{
|
|
|
|
|
this[nt, canMulti] = value;
|
|
|
|
|
}
|
|
|
|
|
public void AddSet(NumericType nt, float value, bool canMulti = true)
|
|
|
|
|
{
|
|
|
|
|
if (value == 0) return;
|
|
|
|
|
this[nt, canMulti] += value;
|
|
|
|
|
}
|
|
|
|
|
public void ReduceSet(NumericType nt, float value, bool canMulti = true)
|
|
|
|
|
{
|
|
|
|
|
if (value == 0) return;
|
|
|
|
|
this[nt, canMulti] -= value;
|
|
|
|
|
}
|
|
|
|
|
private float this[NumericType numericType, bool isCanMultiSet]
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return this.GetByKey((int)numericType);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
float v = this.GetByKey((int)numericType);
|
|
|
|
|
if (Math.Abs(v - value) < 0.00001f)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NumericDic[(int)numericType] = value;
|
|
|
|
|
|
|
|
|
|
Update(numericType, v, isCanMultiSet);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private float GetByKey(int key)
|
|
|
|
|
{
|
|
|
|
|
this.NumericDic.TryGetValue(key, out float value);
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
private void Update(NumericType numericType, float old, bool isCanMultiSet)
|
|
|
|
|
{
|
|
|
|
|
int final = (int)numericType;
|
|
|
|
|
float result = this.GetByKey(final);
|
|
|
|
|
|
|
|
|
|
//如果不是直接操作最终值,需要发送两次事件,一次是修改的值,一次是最终值
|
|
|
|
|
if (numericType > NumericType.Max)
|
|
|
|
|
{
|
|
|
|
|
final = (int)numericType / 10;
|
|
|
|
|
int bas = final * 10 + 1;
|
|
|
|
|
int add = final * 10 + 2;
|
|
|
|
|
|
|
|
|
|
//取得最终值,由基础xxx+额外xxx值组成
|
|
|
|
|
result = this.GetByKey(bas) + GetByKey(add);
|
|
|
|
|
//更新最终值
|
|
|
|
|
Set((NumericType)final, result, false);
|
|
|
|
|
old = GetByKey(final);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//将改变的值以事件的形式发送出去
|
|
|
|
|
if (isCanMultiSet)
|
|
|
|
|
Game.EventSystem.Publish(new EventType.NumbericChange()
|
|
|
|
|
{
|
|
|
|
|
Parent = this.Parent,
|
|
|
|
|
NumericType = (NumericType)final,
|
|
|
|
|
Old = old,
|
|
|
|
|
New = result
|
|
|
|
|
}).Coroutine();
|
|
|
|
|
}
|
|
|
|
|
public void ReSetAddNum()
|
|
|
|
|
{
|
|
|
|
|
List<int> removeList = new List<int>();
|
|
|
|
|
foreach (var kv in NumericDic)
|
|
|
|
|
{
|
|
|
|
|
if (kv.Key > (int)NumericType.Max)
|
|
|
|
|
{
|
|
|
|
|
int final = kv.Key / 10;
|
|
|
|
|
int add = final * 10 + 2;
|
|
|
|
|
if (GetByKey(add) != 0)
|
|
|
|
|
removeList.Add(add);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-04-11 19:50:39 +08:00
|
|
|
|
foreach (int key in removeList)
|
2021-04-08 20:09:59 +08:00
|
|
|
|
{
|
|
|
|
|
Set((NumericType)key, 0, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|