Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PlayerStats.cs
浏览该文件的文档.
1using System.Globalization;
2using System.Reflection;
3using System.Text;
4using Engine;
6
7namespace Game {
8 public class PlayerStats {
9 public class StatAttribute : Attribute { }
10
11 public struct DeathRecord {
12 public DeathRecord() { }
13
14 public DeathRecord(double day, Vector3 location, string cause) {
15 Day = day;
16 Location = location;
17 Cause = cause;
18 }
19
20 public double Day;
21
23
24 public string Cause;
25
26 public void Load(string s) {
27 string[] array = s.Split(',', StringSplitOptions.RemoveEmptyEntries);
28 if (array.Length != 5) {
29 throw new InvalidOperationException("Invalid death record.");
30 }
31 Day = double.Parse(array[0], CultureInfo.InvariantCulture);
32 Location.X = float.Parse(array[1], CultureInfo.InvariantCulture);
33 Location.Y = float.Parse(array[2], CultureInfo.InvariantCulture);
34 Location.Z = float.Parse(array[3], CultureInfo.InvariantCulture);
35 Cause = array[4];
36 }
37
38 public string Save() {
39 StringBuilder stringBuilder = new();
40 stringBuilder.Append(Day.ToString("R", CultureInfo.InvariantCulture));
41 stringBuilder.Append(',');
42 stringBuilder.Append(Location.X.ToString("R", CultureInfo.InvariantCulture));
43 stringBuilder.Append(',');
44 stringBuilder.Append(Location.Y.ToString("R", CultureInfo.InvariantCulture));
45 stringBuilder.Append(',');
46 stringBuilder.Append(Location.Z.ToString("R", CultureInfo.InvariantCulture));
47 stringBuilder.Append(',');
48 stringBuilder.Append(Cause);
49 return stringBuilder.ToString();
50 }
51
57 }
58
59 public List<DeathRecord> m_deathRecords = [];
60
61 [Stat] public double DistanceTravelled;
62
63 [Stat] public double DistanceWalked;
64
65 [Stat] public double DistanceFallen;
66
67 [Stat] public double DistanceClimbed;
68
69 [Stat] public double DistanceFlown;
70
71 [Stat] public double DistanceSwam;
72
73 [Stat] public double DistanceRidden;
74
75 [Stat] public double LowestAltitude = 1.0 / 0.0;
76
77 [Stat] public double HighestAltitude = -1.0 / 0.0;
78
79 [Stat] public double DeepestDive;
80
81 [Stat] public long Jumps;
82
83 [Stat] public long BlocksDug;
84
85 [Stat] public long BlocksPlaced;
86
87 [Stat] public long BlocksInteracted;
88
89 [Stat] public long PlayerKills;
90
91 [Stat] public long LandCreatureKills;
92
93 [Stat] public long WaterCreatureKills;
94
95 [Stat] public long AirCreatureKills;
96
97 [Stat] public long MeleeAttacks;
98
99 [Stat] public long MeleeHits;
100
101 [Stat] public long RangedAttacks;
102
103 [Stat] public long RangedHits;
104
105 [Stat] public long HitsReceived;
106
107 [Stat] public long StruckByLightning;
108
109 [Stat] public double TotalHealthLost;
110
111 [Stat] public long FoodItemsEaten;
112
113 [Stat] public long TimesWasSick;
114
115 [Stat] public long TimesHadFlu;
116
117 [Stat] public long TimesPuked;
118
119 [Stat] public long TimesWentToSleep;
120
121 [Stat] public double TimeSlept;
122
123 [Stat] public long ItemsCrafted;
124
125 [Stat] public long FurnitureItemsMade;
126
127 [Stat] public GameMode EasiestModeUsed = (GameMode)2147483647;
128
129 [Stat] public float HighestLevel;
130
131 [Stat] public string DeathRecordsString;
132
133 public IEnumerable<FieldInfo> Stats {
134 get {
135 foreach (FieldInfo item in from f in typeof(PlayerStats).GetRuntimeFields()
136 where f.GetCustomAttribute<StatAttribute>() != null
137 select f) {
138 yield return item;
139 }
140 }
141 }
142
143 public ReadOnlyList<DeathRecord> DeathRecords => new(m_deathRecords);
144
150
151 public void AddDeathRecord(DeathRecord deathRecord) {
152 m_deathRecords.Add(deathRecord);
153 }
154
155 public void Load(ValuesDictionary valuesDictionary) {
156 foreach (FieldInfo stat in Stats) {
157 if (valuesDictionary.ContainsKey(stat.Name)) {
158 object value = valuesDictionary.GetValue<object>(stat.Name);
159 stat.SetValue(this, value);
160 }
161 }
162 if (!string.IsNullOrEmpty(DeathRecordsString)) {
163 string[] array = DeathRecordsString.Split(';', StringSplitOptions.RemoveEmptyEntries);
164 foreach (string s in array) {
165 DeathRecord item = default;
166 item.Load(s);
167 m_deathRecords.Add(item);
168 }
169 }
170 }
171
172 public void Save(ValuesDictionary valuesDictionary) {
173 StringBuilder stringBuilder = new();
174 foreach (DeathRecord deathRecord in m_deathRecords) {
175 stringBuilder.Append(deathRecord.Save());
176 stringBuilder.Append(';');
177 }
178 DeathRecordsString = stringBuilder.ToString();
179 foreach (FieldInfo stat in Stats) {
180 object value = stat.GetValue(this);
181 valuesDictionary.SetValue(stat.Name, value);
182 }
183 }
184 }
185}
List< DeathRecord > m_deathRecords
void Load(ValuesDictionary valuesDictionary)
IEnumerable< FieldInfo > Stats
void AddDeathRecord(DeathRecord deathRecord)
ReadOnlyList< DeathRecord > DeathRecords
void Save(ValuesDictionary valuesDictionary)
ValuesDictionary ValuesDictionaryForMods
模组如果需要添加或使用额外信息,可以在这个ValuesDictionary读写元素 目前API暂不支持直接保存到存档中,建议模组自行保存额外信息到自己的Subsystem中
DeathRecord(double day, Vector3 location, string cause)
ValuesDictionary ValuesDictionaryForMods
模组如果需要添加或使用额外信息,可以在这个ValuesDictionary读写元素 目前API暂不支持直接保存到存档死亡信息中,建议模组自行保存额外死亡信息到自己的Subsystem中