source: binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs@ 330

Last change on this file since 330 was 326, checked in by alloc, 6 years ago

More cleanup, allocation improvements

File size: 4.7 KB
Line 
1using System;
2using System.Runtime.Serialization;
3using UnityEngine;
4
5namespace AllocsFixes.PersistentData {
6 [Serializable]
7 public class Player {
8 private readonly string steamId;
9 private int entityId;
10 private string name;
11 private string ip;
12 private long totalPlayTime;
13
14 [OptionalField] private DateTime lastOnline;
15
16 private Inventory inventory;
17
18 [OptionalField] private int lastPositionX, lastPositionY, lastPositionZ;
19
20 [OptionalField] [Obsolete ("experience no longer available, use level and expToNextLevel instead")]
21 private uint experience;
22
23 [OptionalField] private bool chatMuted;
24 [OptionalField] private int maxChatLength;
25 [OptionalField] private string chatColor;
26 [OptionalField] private bool chatName;
27 [OptionalField] private uint expToNextLevel;
28 [OptionalField] private int level;
29
30 [NonSerialized] private ClientInfo clientInfo;
31
32 public string SteamID {
33 get { return steamId; }
34 }
35
36 public int EntityID {
37 get { return entityId; }
38 }
39
40 public string Name {
41 get { return name == null ? string.Empty : name; }
42 }
43
44 public string IP {
45 get { return ip == null ? string.Empty : ip; }
46 }
47
48 public Inventory Inventory {
49 get {
50 if (inventory == null) {
51 inventory = new Inventory ();
52 }
53
54 return inventory;
55 }
56 }
57
58 public bool IsOnline {
59 get { return clientInfo != null; }
60 }
61
62 public ClientInfo ClientInfo {
63 get { return clientInfo; }
64 }
65
66 public EntityPlayer Entity {
67 get {
68 if (IsOnline) {
69 return GameManager.Instance.World.Players.dict [clientInfo.entityId];
70 }
71
72 return null;
73 }
74 }
75
76 public long TotalPlayTime {
77 get {
78 if (IsOnline) {
79 return totalPlayTime + (long) (DateTime.Now - lastOnline).TotalSeconds;
80 }
81
82 return totalPlayTime;
83 }
84 }
85
86 public DateTime LastOnline {
87 get {
88 if (IsOnline) {
89 return DateTime.Now;
90 }
91
92 return lastOnline;
93 }
94 }
95
96 public Vector3i LastPosition {
97 get {
98 if (IsOnline) {
99 return new Vector3i (Entity.GetPosition ());
100 }
101
102 return new Vector3i (lastPositionX, lastPositionY, lastPositionZ);
103 }
104 }
105
106 public bool LandProtectionActive {
107 get {
108 return GameManager.Instance.World.IsLandProtectionValidForPlayer (GameManager.Instance
109 .GetPersistentPlayerList ().GetPlayerData (SteamID));
110 }
111 }
112
113 public float LandProtectionMultiplier {
114 get {
115 return GameManager.Instance.World.GetLandProtectionHardnessModifierForPlayer (GameManager.Instance
116 .GetPersistentPlayerList ().GetPlayerData (SteamID));
117 }
118 }
119
120
121 [Obsolete ("Experience no longer available, use Level instead")]
122 public uint Experience {
123 get { return 0; }
124 }
125
126 public float Level {
127 get {
128 float expForNextLevel =
129 (int) Math.Min (Progression.BaseExpToLevel * Mathf.Pow (Progression.ExpMultiplier, level + 1),
130 int.MaxValue);
131 float fLevel = level + 1f - expToNextLevel / expForNextLevel;
132 return fLevel;
133 }
134 }
135
136 public bool IsChatMuted {
137 get { return chatMuted; }
138 set { chatMuted = value; }
139 }
140
141 public int MaxChatLength {
142 get {
143 if (maxChatLength == 0) {
144 maxChatLength = 255;
145 }
146
147 return maxChatLength;
148 }
149 set { maxChatLength = value; }
150 }
151
152 public string ChatColor {
153 get {
154 if (chatColor == null || chatColor == "") {
155 chatColor = "";
156 }
157
158 return chatColor;
159 }
160
161 set { chatColor = value; }
162 }
163
164 public bool ChatName {
165 get { return chatName; }
166
167 set { chatName = value; }
168 }
169
170 public Player (string steamId) {
171 this.steamId = steamId;
172 inventory = new Inventory ();
173 }
174
175 public void SetOffline () {
176 if (clientInfo == null) {
177 return;
178 }
179
180 Log.Out ("Player set to offline: " + steamId);
181 lastOnline = DateTime.Now;
182 try {
183 Vector3i lastPos = new Vector3i (Entity.GetPosition ());
184 lastPositionX = lastPos.x;
185 lastPositionY = lastPos.y;
186 lastPositionZ = lastPos.z;
187 totalPlayTime += (long) (Time.timeSinceLevelLoad - Entity.CreationTimeSinceLevelLoad);
188 } catch (NullReferenceException) {
189 Log.Out ("Entity not available. Something seems to be wrong here...");
190 }
191
192 clientInfo = null;
193 }
194
195 public void SetOnline (ClientInfo ci) {
196 Log.Out ("Player set to online: " + steamId);
197 clientInfo = ci;
198 entityId = ci.entityId;
199 name = ci.playerName;
200 ip = ci.ip;
201 lastOnline = DateTime.Now;
202 }
203
204 public void Update (PlayerDataFile _pdf) {
205 UpdateProgression (_pdf);
206 inventory.Update (_pdf);
207 }
208
209 private void UpdateProgression (PlayerDataFile _pdf) {
210 if (_pdf.progressionData.Length <= 0) {
211 return;
212 }
213
214 using (PooledBinaryReader pbr = MemoryPools.poolBinaryReader.AllocSync (false)) {
215 pbr.SetBaseStream (_pdf.progressionData);
216 Progression p = Progression.Read (pbr, null);
217 expToNextLevel = (uint) p.ExpToNextLevel;
218 level = p.Level;
219 }
220 }
221 }
222}
Note: See TracBrowser for help on using the repository browser.