Dayz Build 1.29.163047, Scripts Rev. 123548
Dayz Code Explorer by Zeroy
Loading...
Searching...
No Matches
displaystatus.c
Go to the documentation of this file.
2{
3 NORMAL = 0,//no bit, default
4 WARNING = 1,//first bit
5 CRITICAL = 2,//second bit
6 BLINKING = 3,//first + second bit
7 EXTRA = 4,//third bit
8}
9
10enum DSLevelsTemp
11{
12 NORMAL = 0,//no bit, default
19}
20
21class VirtualHud
22{
23 const int NUMBER_OF_MASKS = 2;//how many INT numbers we need to accommodate all elements
25 //ref map<int, ref DisplayElement> m_Elements;
26 const int NUMBER_OF_ELEMENTS = eDisplayElements.COUNT;
32 string m_System = "VirtualHud";
33
35
37 {
38 m_Player = player;
39 m_LastTick = 0;
40
41 RegisterElement(new BadgeStuffed(m_Player));
42 RegisterElement(new BadgeWet(m_Player));
43 RegisterElement(new BadgeSick(m_Player));
44 RegisterElement(new BadgePills(m_Player));
45 RegisterElement(new BadgePoisoned(m_Player));
46 RegisterElement(new BadgeFracture(m_Player));
47 RegisterElement(new TendencyHealth(m_Player));
48 RegisterElement(new TendencyBlood(m_Player));
49 RegisterElement(new TendencyTemperature(m_Player));
50
51 RegisterElement(new TendencyHunger(m_Player));
52 RegisterElement(new TendencyThirst(m_Player));
53 RegisterElement(new TendencyBacteria(m_Player));
54 RegisterElement(new BadgeHeartbeat(m_Player));
55 RegisterElement(new BadgeLegs(m_Player));
56
57
58 RegisterElement(new ElementStance(m_Player));// client only
59 RegisterElement(new BadgeBleeding(m_Player));// client only
60
61
62 mission = g_Game.GetMission();
63 if ( mission )
64 {
65 m_Hud = mission.GetHud();
66 }
67 //UpdateStatus();
68 }
69
70
72 {
73 if ( g_Game.IsServer() )
74 {
75 int currentTime = g_Game.GetTime();
76 if (currentTime > (m_LastTick + VIRTUAL_HUD_UPDATE_INTERVAL))
77 {
78 SendRPC();
79 m_LastTick = currentTime;
80 }
81 }
82 if ( !g_Game.IsDedicatedServer() )
83 {
85 //DisplayPresence();
86 }
87 }
88
90 {
91 int id = element.GetType();
92 m_Elements[id] = element;
93 //Log("adding element:"+id.ToString());
94 }
95
96 DisplayElementBase GetElement(eDisplayElements element_id)
97 {
98 if ( element_id < 0 || element_id >= NUMBER_OF_ELEMENTS )
99 {
100 return null;
101 }
102 return m_Elements[element_id];
103 }
104
105 //this will serialize all elements and 'compresses' them into integer(s) through bit shifting, these integers are placed into an array
107 {
108 int offset = 0;
109 int mask = 0;
110
111 for (int i = 0; i < NUMBER_OF_ELEMENTS; ++i)
112 {
113 DisplayElementBase element = GetElement(i);
114
115 if (element && !element.IsClientOnly() )
116 {
117 if ((element.GetNumberOfBits() + offset) > BIT_INT_SIZE)
118 {
119 mask_array.Insert(mask);
120 offset = 0;
121 mask = 0;
122 }
123 mask = mask | (element.GetValue() << offset);
124 offset = offset + element.GetNumberOfBits();
125 }
126 }
127 mask_array.Insert(mask);
128 }
129
130 void DeserializeElements(array<int> mask_array)//extracts elements from mask
131 {
132 int maskArrayIndex = 0;
133 int offset = 0;
134 int mask = 0;
135
136 for (int i = 0; i < NUMBER_OF_ELEMENTS;i++)
137 {
138 DisplayElementBase element = GetElement(i);
139
140 if (element && !element.IsClientOnly())
141 {
142 //Log("entity> " + ToString(GetElement(i)) );
143 if (offset + element.GetNumberOfBits() > BIT_INT_SIZE)
144 {
145 maskArrayIndex++;
146 offset = 0;
147 }
148 mask = mask_array.Get(maskArrayIndex);
149 int value = BitToDec( mask, offset, element.GetCompareMask() );
150 offset = offset + element.GetNumberOfBits();
151 element.SetValue(value);
152 }
153 }
154 }
155
156 int BitToDec(int mask, int index, int compareMask)
157 {
158 int value = mask & (compareMask << index);
159 value = value >> index;
160 return value;
161 }
162
164 {
165 for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
166 {
167 PrintString(i.ToString() +": "+ GetElement(i).m_Value.ToString() );
168 }
169 }
170
171 void SendRPC()
172 {
173 PlayerIdentity identity = m_Player.GetIdentity();
174 if (!identity)
175 return;
176
177 array<int> mask_array = new array<int>;
178 SerializeElements(mask_array);
179 if (!m_LastSentArray || !AreArraysSame(m_LastSentArray, mask_array))
180 {
181 ScriptRPC rpc = new ScriptRPC();
182 rpc.Write(mask_array);
183 rpc.Send(m_Player, ERPCs.RPC_SYNC_DISPLAY_STATUS, false, identity);
184 m_LastSentArray = mask_array;
185 }
186 }
187
188 bool AreArraysSame( notnull array<int> array_a, notnull array<int> array_b )
189 {
190 if ( array_a.Count() != array_b.Count() ) return false;
191 for (int i = 0; i <array_a.Count(); i++)
192 {
193 if ( array_a.Get(i) != array_b.Get(i) )
194 {
195 return false;
196 }
197 }
198 return true;
199 }
200
202 {
203 for (int i = 0; i < NUMBER_OF_ELEMENTS;i++)
204 {
205 DisplayElementBase element = GetElement(i);
206 if (element && element.IsClientOnly() && element.IsValueChanged())
207 element.UpdateHUD();
208 }
209 }
210
212 {
213 //Log("UpdateStatus called for entity: "+ToString(m_Player));
214 for (int i = 0; i < NUMBER_OF_ELEMENTS; ++i)
215 {
216 DisplayElementBase element = GetElement(i);
217 if (element && !element.IsClientOnly() && element.IsValueChanged())
218 {
219 element.UpdateHUD();
220 }
221 }
222 }
223
224 void OnRPC(ParamsReadContext ctx)//on Client
225 {
226 //Log("OnRPC called");
227 array<int> mask_array = new array<int>;
228 ctx.Read(mask_array);
229 DeserializeElements(mask_array);
230 UpdateStatus();
231 }
232
233 void Debug()
234 {
235 Log("debug");
236 PluginPlayerStatus m_ModulePlayerStatus = PluginPlayerStatus.Cast(GetPlugin(PluginPlayerStatus));
237 m_ModulePlayerStatus.DisplayTendency(NTFKEY_HUNGRY, 2);
238 }
239}
VIRTUAL_HUD_UPDATE_INTERVAL
how often virtual hud checks if there is a difference since last sync
const int NTFKEY_HUNGRY
Definition _constants.c:34
const int BIT_INT_SIZE
Definition bitarray.c:4
map m_Player
string Debug()
override void UpdateHUD()
Mission class.
Definition gameplay.c:686
The class that will be instanced (moddable).
Definition gameplay.c:389
proto native void Send(Object target, int rpc_type, bool guaranteed, PlayerIdentity recipient=NULL)
Initiate remote procedure call.
proto bool Write(void value_out)
proto bool Read(void value_in)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
DayZGame g_Game
Definition dayzgame.c:3942
void DeserializeElements(array< int > mask_array)
void RegisterElement(DisplayElementBase element)
void PrintElements()
ref DisplayElementBase m_Elements[NUMBER_OF_ELEMENTS]
const int NUMBER_OF_ELEMENTS
enum DSLevels WARNING_MINUS
enum DSLevels NUMBER_OF_MASKS
int m_LastTick
void ImmediateUpdate()
enum DSLevels CRITICAL_PLUS
Hud m_Hud
enum DSLevels BLINKING_PLUS
void SendRPC()
void SerializeElements(array< int > mask_array)
ref array< ref Param > rpcParams
enum DSLevels BLINKING_MINUS
DisplayElementBase GetElement(eDisplayElements element_id)
Mission mission
enum DSLevels WARNING_PLUS
DSLevels
@ BLINKING
void UpdateStatus()
ref array< int > m_LastSentArray
bool AreArraysSame(notnull array< int > array_a, notnull array< int > array_b)
void VirtualHud(PlayerBase player)
enum DSLevels CRITICAL_MINUS
int BitToDec(int mask, int index, int compareMask)
@ NORMAL
ERPCs
Definition erpcs.c:2
@ CRITICAL
Definition estatlevels.c:7
Serializer ParamsReadContext
Definition gameplay.c:15
WARNING
Definition endebug.c:1
class array< Class T > PrintString
string m_Value
Definition enentity.c:808
@ EXTRA
Definition enentity.c:98
class LogTemplates Log(string message, LogTemplateID template_id=0)
Creates debug log (optional) from LogTemplate which are registred.
string m_System
the manager instance
PluginPlayerStatus m_ModulePlayerStatus
max 32 synced modifiers supported, 0 == no sync
void OnScheduledTick()
override void OnRPC(ParamsReadContext ctx)
PluginBase GetPlugin(typename plugin_type)