Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
catchingcontextbase.c
Go to the documentation of this file.
2{
3 float m_BaseProbability;
4 EntityAI m_Owner;
5
6 void BaitData(float value, EntityAI owner)
7 {
8 m_BaseProbability = value;
9 m_Owner = owner;
10 }
11}
12
13class CatchingContextBase
14{
15 protected EntityAI m_MainItem;
17 protected bool m_IsValid;
18 protected int m_MethodMask;
19 protected int m_EnviroMask;
20 protected float m_QualityBaseMod; //base quality
21 protected float m_QualityDispersionMinMod; //extra added quality, min
22 protected float m_QualityDispersionMaxMod; //extra added quality, max
24 protected ref array<YieldItemBase> m_CompatibleItems; //list of all useful yields (initial evaluation based on masks)
26 protected ref array<int> m_ProbabilityArray; //actual probability list
28
30 {
31 Init(par);
32 }
33
34 protected void Init(Param par)
35 {
36 m_IsValid = true;
37 m_YieldsMapAll = GetGame().GetMission().GetWorldData().GetCatchYieldBank().GetYieldsMap();
38 DeserializeData(par);
44 }
45
46 protected void DeserializeData(Param par);
47
55
56 protected void SetupInitialTypes()
57 {
60 else
61 m_CompatibleItems.Clear();
62
63 if (!m_ExcludedItems)
65 else
66 m_ExcludedItems.Clear();
67
68
69 ParseYieldItemsForCompatibility({ECatchingBaitCategories.BAIT_TYPE_EMPTY});
70 if (m_CompatibleItems.Count() == 0)
72
73 if (m_CompatibleItems.Count() == 0)
74 {
75 ErrorEx("Empty m_CompatibleItems for item: " + m_MainItem,ErrorExSeverity.INFO);
76 m_IsValid = false;
77 }
78 }
79
81 {
82 YieldItemBase yItem;
83 int count = m_YieldsMapAll.Count();
84 for (int i = 0; i < count; i++)
85 {
86 yItem = m_YieldsMapAll.GetElement(i);
87 if (m_ExcludedItems.Find(yItem) != -1) //skip already excluded yitems
88 continue;
89
90 if (CheckMaskCompatibility(yItem) && CheckBaitCompatibility(yItem,excludedTypes))
91 {
92 m_CompatibleItems.Insert(yItem);
93 }
94 }
95 }
96
97 protected void SetupProbabilityArray()
98 {
101 m_ProbabilityArray.Clear();
102
103 int count = m_CompatibleItems.Count();
104 YieldItemBase yItem;
105
106 for (int i = 0; i < count; i++)
107 {
108 yItem = m_CompatibleItems[i];
109 string type = yItem.GetType();
110 int weight = yItem.GetYieldWeight(this);
111
112 for (int j = 0; j < weight; j++)
113 {
114 m_ProbabilityArray.Insert(type.Hash());
115 }
116 }
117
118 if (m_ProbabilityArray.Count() == 0)
119 {
120 ErrorEx("Empty m_ProbabilityArray for item: " + m_MainItem,ErrorExSeverity.INFO);
121 m_IsValid = false;
122 }
123 }
124
126 {
127 return m_YieldsMapAll;
128 }
129
132 {
133 //m_Result = new CatchingResultSomethingSomethingCustom(someItem);
134
135 if (!m_Result)
136 {
137 ErrorEx("Failed to create 'm_Result' structure for item: " + m_MainItem,ErrorExSeverity.INFO);
138 m_IsValid = false;
139 }
140 }
141
142 protected void InitCatchMasks()
143 {
146 }
147
148 protected void InitCatchMethodMask()
149 {
150 m_MethodMask = 0;
151 }
152
153 protected void InitCatchEnviroMask()
154 {
155 m_EnviroMask = 0;
156 }
157
159 protected int GetCatchMethodMask()
160 {
161 return m_MethodMask;
162 }
163
164 protected int GetCatchEnviroMask()
165 {
166 return m_EnviroMask;
167 }
168
170 {
171 return (yItem.GetMethodMask() & GetCatchMethodMask()) && (yItem.GetEnviroMask() & GetCatchEnviroMask());
172 }
173
174 protected bool CheckBaitCompatibility(YieldItemBase yItem, array<ECatchingBaitCategories> excludedTypes = null)
175 {
176 float highestSensitivity = 0.0;
177 float sensitivity = 0.0;
178 int count = m_BaitCompatibilityMap.Count();
179 ECatchingBaitCategories baitCategoryType;
180
181 for (int i = 0; i < count; i++)
182 {
183 baitCategoryType = m_BaitCompatibilityMap.GetKey(i);
184 if (excludedTypes && excludedTypes.Find(baitCategoryType) != -1) //skip ignored bait types in the first run
185 continue;
186
187 sensitivity = yItem.GetBaitTypeSensitivity(baitCategoryType);
188 if (sensitivity < 0)
189 {
190 if (m_ExcludedItems.Find(yItem) != -1)
191 m_ExcludedItems.Insert(yItem);
192 return false;
193 }
194
195 highestSensitivity = Math.Max(highestSensitivity,sensitivity);
196 }
197
198 #ifdef DEVELOPER
199 if (IsCLIParam("catchingLogs"))
200 {
201 if (count == 0)
202 Print("dbgTrapz | " + yItem + " compatible due to unspecified bait compatibility!");
203 else if (highestSensitivity > 0.0)
204 Print("dbgTrapz | " + yItem + " compatible with highestSensitivity: " + highestSensitivity);
205 }
206 #endif
207
208 return count == 0 || highestSensitivity > 0.0;
209 }
210
216
217 protected void InitCatchingItemData()
218 {
219 if (!m_MainItem)
220 {
221 ErrorEx("No item defined for 'InitCatchingItemData'. Skipping.");
222 m_IsValid = false;
223 return;
224 }
225
228
229 //bruteforce, but should be done sparingly enough..
230 array<EntityAI> children = new array<EntityAI>();
231 m_MainItem.GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,children);
232 foreach (EntityAI child: children)
233 {
234 InitItemValues(child);
235 }
236 }
237
239 protected void InitItemValues(EntityAI item);
241 protected void ClearCatchingItemData()
242 {
243 m_QualityBaseMod = 0.0;
246 }
247
250
251 bool IsValid()
252 {
253 return m_IsValid;
254 }
255
256 //result-related methods
258 {
259 YieldItemBase yItem;
260 if (m_IsValid)
261 {
262 Class.CastTo(yItem,m_YieldsMapAll.Get(m_ProbabilityArray.GetRandomElement()));
263 m_Result.SetYieldItem(yItem);
265 }
266 }
267
270
271 bool ModifySignalProbability(inout float probability)
272 {
273 return false;
274 }
275
277 {
278 float ret = m_QualityBaseMod + Math.RandomFloatInclusive(m_QualityDispersionMinMod,m_QualityDispersionMaxMod);//server only, this is fine
279 return ret;
280 }
281
282 void SetResultChanceOverride(bool ovrd, float val = 0.0)
283 {
285 }
286
287 void SetResultQualityOverride(bool ovrd, float val = 0.0)
288 {
290 }
291
292 //done independently to help guide fishing action flow
294 {
296 return m_Result.RollChance();
297 }
298
299 //done independently to help guide fishing action flow
300 EntityAI SpawnAndSetupCatch(out int yItemIdx, vector v = vector.Zero)
301 {
302 if (!m_IsValid)
303 {
304 ErrorEx("Could not spawn catch for item: " + m_MainItem,ErrorExSeverity.INFO);
305 return null;
306 }
308
309 return m_Result.SpawnAndSetup(yItemIdx,v);
310 }
311};
proto bool IsValid()
Checks if the ScriptCaller is valid.
void SetupInitialTypes()
void InitBaitCompatibilityMap()
void ClearCatchingItemData()
called before actual item data initialization
ref array< YieldItemBase > m_ExcludedItems
bool RollCatch()
void UpdateCatchingItemData()
int GetCatchEnviroMask()
void ParseYieldItemsForCompatibility(array< ECatchingBaitCategories > excludedTypes=null)
float m_QualityBaseMod
void InitCatchMethodMask()
void DeserializeData(Param par)
ref map< int, ref BaitData > m_BaitCompatibilityMap
class BaitData m_MainItem
Definition actionbase.c:36
ref CatchingResultBasic m_Result
void GenerateResult()
void InitItemValues(EntityAI item)
override to init context-specific values
int GetCatchMethodMask()
override using 'ECatchMethodMask'
bool ModifySignalProbability(inout float probability)
int m_MethodMask
void SetResultQualityOverride(bool ovrd, float val=0.0)
float m_QualityDispersionMinMod
ref array< YieldItemBase > m_CompatibleItems
ref array< int > m_ProbabilityArray
void CreateResultDataStructure()
override if using another result
void InitCatchingItemData()
EntityAI SpawnAndSetupCatch(out int yItemIdx, vector v=vector.Zero)
void CatchingContextBase(Param par)
float m_QualityDispersionMaxMod
YieldsMap m_YieldsMapAll
void SetResultChanceOverride(bool ovrd, float val=0.0)
void InitCatchMasks()
float GetQualityModifier()
void InitCatchEnviroMask()
bool m_IsValid
bool CheckBaitCompatibility(YieldItemBase yItem, array< ECatchingBaitCategories > excludedTypes=null)
int m_EnviroMask
bool CheckMaskCompatibility(YieldItemBase yItem)
void RecalculateProcessingData()
Calculates and sets all data used in ongoing calculations.
void UpdateBaseProbability(YieldItemBase yItem)
updates base probability when catching the specific item (some context subclasses only)
YieldsMap GetYieldsMap()
void SetupProbabilityArray()
map< int, ref YieldItemBase > YieldsMap
YieldsMap GetYieldsMap()
void UpdateCatchQuality(CatchingContextBase ctx)
void UpdateCatchChance(CatchingContextBase ctx)
void SetCatchChanceOverride(bool ovrd, float val=0.0)
EntityAI SpawnAndSetup(out int yItemIdx, vector v=vector.Zero)
void SetQualityOverride(bool ovrd, float val=0.0)
void SetYieldItem(YieldItemBase yItem)
Super root of all classes in Enforce script.
Definition enscript.c:11
Definition enmath.c:7
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Definition param.c:12
CatchYieldBank GetCatchYieldBank()
Definition worlddata.c:387
int GetYieldWeight(CatchingContextBase ctx)
float GetBaitTypeSensitivity(ECatchingBaitCategories type)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
override Widget Init()
Definition dayzgame.c:127
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Definition gameplay.c:6
proto native CGame GetGame()
ErrorExSeverity
Definition endebug.c:62
proto void Print(void var)
Prints content of variable to console/log.
enum ShapeType ErrorEx
proto native bool IsCLIParam(string param)
Returns if command line argument is present.
enum ProcessDirectDamageFlags m_Owner