DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
ActionFishingNew.c
См. документацию.
1class FishingActionReceiveData : ActionReciveData
2{
4}
5
6class FishingActionData : ActionData
7{
9 int m_FishingResult = -1; //use for hashed name?
10 bool m_IsSignalActive = false;
11
13
15
17 {
19 Class.CastTo(component,m_ActionComponent);
20
21 m_IsSignalActive = false; //redundant?
22 if (m_ContextData.RollCatch())
23 {
25 }
26 else
27 {
28 component.SetNewSignalData(-1,-1);
29 }
30 }
31
32 //signal methods
33 protected void RandomizeSignalValues()
34 {
36 Class.CastTo(component,m_ActionComponent);
37
38 component.SetNewSignalData(m_ContextData.RandomizeSignalStartTime(),m_ContextData.RandomizeSignalDuration());
39 }
40
41 void AnimateRod(float phase, bool instant = false)
42 {
44 rod.AnimateFishingRodEx(phase,instant);
45 }
46
47 //------------------------------------------------------------------
48 //DEPRECATED
49 //------------------------------------------------------------------
50 const float FISHING_SUCCESS = 0.2;
51 const float FISHING_BAIT_LOSS = 0.02;
52 const float FISHING_HOOK_LOSS = 0.015;
53 const float FISHING_DAMAGE = 1.5;
54 const float FISHING_GARBAGE_CHANCE = 0.2;
58 void InitBait(ItemBase item)
59 {
60 m_Bait = item;
61 m_IsBaitAnEmptyHook = !m_Bait.ConfigIsExisting("hookType");
62 }
64 {
66 }
67}
68
70{
71 FishingActionData m_ActionDataFishing;
72
73 override void CreateActionComponent()
74 {
76 float cycleTime = UAFishingConstants.CYCLE_LENGTH_BASE; //redundant?
78 {
79 cycleTime = m_ActionDataFishing.m_ContextData.GetActionCycleTime();
80 }
81 m_ActionData.m_ActionComponent = new CAContinuousRepeatFishing(cycleTime);
82 }
83
84 override void InitActionComponent()
85 {
86 super.InitActionComponent();
87
90 }
91
92 override void EndActionComponent()
93 {
94 bool animateRod = false;
95 if (m_ActionDataFishing.m_State == UA_CANCEL)
96 m_Canceled = true;
97
98 if (m_ActionDataFishing.m_State == UA_FINISHED)
99 {
100 if (m_ActionDataFishing.m_FishingResult == 1)
101 {
102 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_END);
103 }
104 else
105 {
106 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_FINISH);
107 animateRod = true;
108 }
109 }
110 else
111 {
112 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_INTERRUPT);
113 animateRod = true;
114 }
115
116 animateRod |= m_Canceled;
117 if (animateRod)
118 {
119 m_ActionDataFishing.AnimateRod(false,m_Canceled);
120 }
121
123 }
124
125 override void OnStateChange(int pOldState, int pCurrentState)
126 {
127 super.OnStateChange(pOldState,pCurrentState);
128
129 if (pOldState == STATE_NONE && pCurrentState == STATE_LOOP_IN)
130 {
131 m_ActionDataFishing.AnimateRod(true);
132 }
133 }
134
136 {
138 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_ACTIONLOOP);
139 }
140
143 {
144 if (g_Game.IsServer() && m_ActionDataFishing.m_SplashUniqueID >= 0)
145 {
147 m_ActionDataFishing.m_SplashUniqueID = -1;
148 }
149 }
150
151 //DEPRECATED
155};
156
158{
159 private const string ALLOWED_WATER_SURFACES = string.Format("%1|%2", UAWaterType.SEA, UAWaterType.FRESH);
160
162 {
164 m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_MEDIUM;
165 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_FISHING;
166 m_FullBody = true;
167 m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH;
168 m_Text = "#start_fishing";
169 }
170
176
177 override bool HasTarget()
178 {
179 return true;
180 }
181
183 {
184 return true;
185 }
186
187 override bool CanBeUsedInFreelook()
188 {
189 return false;
190 }
191
192 override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item )
193 {
195 CCTLiquid cctLiquid = CCTLiquid.Cast(m_ConditionTarget);
196 int waterSourceType = cctLiquid.GetWaterSourceType();
197 int liquidSourceType = cctLiquid.GetLiquidSourceType();
198 if (waterSourceType != EWaterSourceObjectType.NONE || liquidSourceType != ELiquidSourceObjectType.NONE)
199 return false;
200
201 ItemBase hook = ItemBase.Cast(item.FindAttachmentBySlotName("Hook"));
202 return hook && !hook.IsRuined() && !hook.IsPendingDeletion();
203 }
204
206 {
207 FishingActionData actionData = new FishingActionData();
208 return actionData;
209 }
210
211 override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = null)
212 {
213 if (super.SetupAction(player, target, item, action_data, extra_data))
214 {
215 FishingActionData data;
216 if (Class.CastTo(data,action_data))
217 {
219 return true;
220 }
221 }
222 return false;
223 }
224
225 protected void ComposeLocalContextData(FishingActionData data)
226 {
227 #ifndef SERVER
228 data.m_IsSurfaceSea = CheckForSea(data); //already synced from client by this point
229 #endif
230 Param2<EntityAI,bool> par = new Param2<EntityAI,bool>(data.m_MainItem,data.m_IsSurfaceSea);
231 data.m_ContextData = new CatchingContextFishingRodAction(par);
232
233 data.m_ContextData.GenerateResult(); //call only once
234
235 #ifdef DEVELOPER
236 data.m_ContextData.SetResultChanceOverride(data.m_Player.IsQuickFishing(),1.0); //active override sets chance to 100% for the action duration
237 #endif
238 }
239
240 override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
241 {
242 super.WriteToContext(ctx, action_data);
243 FishingActionData data
244 if (Class.CastTo(data,action_data))
245 {
246 ctx.Write(data.m_IsSurfaceSea);
247 }
248 }
249
250 override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
251 {
252 if (!action_recive_data)
253 {
254 action_recive_data = new FishingActionReceiveData;
255 }
256
257 super.ReadFromContext(ctx, action_recive_data);
258
259 FishingActionReceiveData receiveDataFishing;
260 if (Class.CastTo(receiveDataFishing,action_recive_data))
261 {
262 if (!ctx.Read(receiveDataFishing.m_IsSurfaceSea))
263 return false;
264
265 return true;
266 }
267
268 return false;
269 }
270
271 override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
272 {
273 super.HandleReciveData(action_recive_data, action_data);
274
275 FishingActionReceiveData receiveDataFishing = FishingActionReceiveData.Cast(action_recive_data);
276 FishingActionData fishingData = FishingActionData.Cast(action_data);
277
278 fishingData.m_IsSurfaceSea = receiveDataFishing.m_IsSurfaceSea;
279 }
280
281 override protected void CreateAndSetupActionCallback(ActionData action_data)
282 {
283 super.CreateAndSetupActionCallback(action_data);
284
285 FishingActionData data;
286 if (Class.CastTo(data,action_data))
287 {
288 data.RollNextResultChance(); //performed here so that component exists
289 }
290 }
291
292 override void OnAnimationEvent( ActionData action_data )
293 {
294 super.OnAnimationEvent(action_data);
295 FishingActionData actionDataFishing = FishingActionData.Cast(action_data);
296
297 switch (action_data.m_DelayedAnimationEventID)
298 {
300 PlaySplashEffectSynced(actionDataFishing);
301 break;
302
304 actionDataFishing.AnimateRod(false,false);
305 break;
306 }
307 }
308
309 override void OnUpdate(ActionData action_data)
310 {
311 super.OnUpdate(action_data);
312
313 vector dir = vector.Direction(action_data.m_Player.GetPosition(), action_data.m_Target.GetCursorHitPos());
314 dir[1] = 0;
315 dir.Normalize();
316 action_data.m_Player.AlignDirectionWS(dir);
317 }
318
319 void PlaySplashEffectSynced(FishingActionData actionDataFishing)
320 {
321 if (g_Game.IsServer())
322 {
323 int particleId = actionDataFishing.m_ContextData.GetResultParticleId();
324 if (actionDataFishing.m_SplashUniqueID < 0)
325 {
326 actionDataFishing.m_SplashUniqueID = SEffectManager.CreateParticleServer(actionDataFishing.m_Target.GetCursorHitPos(), new ParticleEffecterParameters("ParticleEffecter", EffecterBase.NOT_DEFINED_LIFESPAN, particleId));
327 }
328 else
329 {
330 SEffectManager.ReinitParticleServer(actionDataFishing.m_SplashUniqueID, new ParticleEffecterParameters("ParticleEffecter", EffecterBase.NOT_DEFINED_LIFESPAN, particleId)); //reinit here, since particleId might differ
331 SEffectManager.ReactivateParticleServer(actionDataFishing.m_SplashUniqueID);
332 }
333 }
334 }
335
336 protected bool CheckForSea(ActionData action_data)
337 {
338 bool ret = false;
339 vector cursorPosition = action_data.m_Target.GetCursorHitPos();
340
341 if (g_Game.SurfaceIsSea(cursorPosition[0], cursorPosition[2]))
342 {
343 ret = true;
344 }
345
346 return ret;
347 }
348
349 //------------------------------------------------------
350
351 override void OnFinishProgress(ActionData action_data)
352 {
353 super.OnFinishProgress(action_data);
354
355 FishingActionData data;
356 if (Class.CastTo(data,action_data))
357 {
358 data.RollNextResultChance();
359 }
360 }
361
362 override void OnEndInput(ActionData action_data)
363 {
364 ActionContinuousBaseCB callback;
365 if (Class.CastTo(callback, action_data.m_Callback))
366 {
367 switch (callback.GetState())
368 {
369 case HumanCommandActionCallback.STATE_LOOP_ACTION:
370 case HumanCommandActionCallback.STATE_LOOP_LOOP:
371 case HumanCommandActionCallback.STATE_LOOP_LOOP2:
372 FishingActionData data;
373 if (Class.CastTo(data,action_data))
374 {
375 data.m_FishingResult = EvaluateFishingResult(action_data);
376 if (data.m_FishingResult != -1)
377 data.m_State = UA_FINISHED;
378 }
379 break;
380
381 default:
382 super.OnEndInput(action_data);
383 callback.EndActionComponent(); //think about putting this everywhere, interrupts HumanCommandActionCallback.STATE_LOOP_IN neatly
384 break;
385 }
386 }
387 }
388
389 override void OnEnd(ActionData action_data)
390 {
391 super.OnEnd(action_data);
392
393 FishingActionData fad;
394 if (Class.CastTo(fad,action_data))
395 fad.AnimateRod(false,true); //just in case
396 }
397
400 {
401 FishingActionData fad;
402 if (Class.CastTo(fad,action_data))
403 {
404 //legacy stuff
405 ActionFishingNewCB legacyCB = ActionFishingNewCB.Cast(fad.m_Callback);
406 if (fad.m_IsSignalActive)//catch
407 {
408 fad.m_ContextData.OnBeforeSpawnSignalHit();
409
410 if (!g_Game.IsMultiplayer() || g_Game.IsDedicatedServer())
411 TrySpawnCatch(fad);
412
413 fad.m_ContextData.OnAfterSpawnSignalHit();
414 if (legacyCB)
416
417 EntityAI hookCheck = action_data.m_MainItem.FindAttachmentBySlotName("Hook");
418 return hookCheck != null && !hookCheck.IsPendingDeletion(); //success animation only if hook loss didn't prevent catch (local)
419 }
420 else//fail
421 {
422 fad.m_ContextData.OnSignalMiss();
423 if (legacyCB)
425
426 return false;
427 }
428 }
429
430 return -1;
431 }
432
433 //------------------------------------------------------
434 void OnSignalStart(FishingActionData action_data)
435 {
436 action_data.m_IsSignalActive = true;
437 ActionFishingNewCB fishingCB;
438 if (Class.CastTo(fishingCB,action_data.m_Callback))
439 fishingCB.ToggleFishBiting();
440 }
441
442 void OnSignalEnd(FishingActionData action_data)
443 {
444 action_data.m_IsSignalActive = false;
445 ActionFishingNewCB fishingCB;
446 if (Class.CastTo(fishingCB,action_data.m_Callback))
447 fishingCB.ToggleFishBiting();
448
449 action_data.m_ContextData.OnSignalPass();
450 }
451
452 protected EntityAI TrySpawnCatch(FishingActionData action_data)
453 {
454 vector spawnPos = vector.Direction(action_data.m_Player.GetPosition(),action_data.m_Target.GetCursorHitPos()); //direction first
455 spawnPos = MiscGameplayFunctions.GetRandomizedPositionVerified(action_data.m_Player.GetPosition(),action_data.m_Player.GetPosition() + spawnPos * 0.1,0.15,action_data.m_Player);
456
457 int idx;
458 return action_data.m_ContextData.SpawnAndSetupCatch(idx,spawnPos);
459 }
460}
bool m_FullBody
Определения ActionBase.c:60
string m_Text
Определения ActionBase.c:57
ref CCIBase m_ConditionItem
Определения ActionBase.c:63
float m_SpecialtyWeight
Определения ActionBase.c:77
ref CCTBase m_ConditionTarget
Определения ActionBase.c:64
int m_StanceMask
Определения ActionBase.c:61
ItemBase m_Bait
Определения ActionFishingNew.c:57
const float FISHING_GARBAGE_CHANCE
Определения ActionFishingNew.c:54
FishingActionReceiveData m_IsSurfaceSea
float m_RodQualityModifier
Определения ActionFishingNew.c:56
const float FISHING_HOOK_LOSS
Определения ActionFishingNew.c:52
bool m_IsSignalActive
Определения ActionFishingNew.c:10
int m_FishingResult
Определения ActionFishingNew.c:9
void RollNextResultChance()
Определения ActionFishingNew.c:16
void AnimateRod(float phase, bool instant=false)
Определения ActionFishingNew.c:41
int m_SplashUniqueID
Определения ActionFishingNew.c:12
const float FISHING_BAIT_LOSS
Определения ActionFishingNew.c:51
const float FISHING_SUCCESS
Определения ActionFishingNew.c:50
const float FISHING_DAMAGE
Определения ActionFishingNew.c:53
void RandomizeSignalValues()
Определения ActionFishingNew.c:33
bool IsBaitEmptyHook()
Определения ActionFishingNew.c:63
bool m_IsBaitAnEmptyHook
Определения ActionFishingNew.c:55
void InitBait(ItemBase item)
Определения ActionFishingNew.c:58
ref CatchingContextFishingRodAction m_ContextData
Определения ActionFishingNew.c:14
void ActionTarget(Object object, Object parent, int componentIndex, vector cursorHitPos, float utility, string surfaceName="")
Определения ActionTargets.c:125
class BaitData m_MainItem
class DayZCreatureAnimInterface RegisterAnimationEvent(string event_name, string function_name)
DayZGame g_Game
Определения DayZGame.c:4074
ELiquidSourceObjectType
Определения ELiquidSourceObjectType.c:2
EWaterSourceObjectType
Определения EWaterSourceObjectType.c:2
void EffecterBase()
Определения EffectManager.c:704
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
SurfaceDetectionType
Определения SurfaceInfo.c:86
bool m_Canceled
Определения AnimatedActionBase.c:5
void SetCommand(int command_uid)
Определения AnimatedActionBase.c:56
ActionData m_ActionData
Определения AnimatedActionBase.c:3
void ActionContinuousBase()
Определения ActionContinuousBase.c:124
override void EndActionComponent()
Определения ActionContinuousBase.c:79
PlayerBase m_Player
Определения ActionBase.c:40
ActionBaseCB m_Callback
Определения ActionBase.c:36
ref ActionTarget m_Target
Определения ActionBase.c:39
ItemBase m_MainItem
Определения ActionBase.c:35
int m_DelayedAnimationEventID
Определения ActionBase.c:45
Определения ActionBase.c:22
int EvaluateFishingResult(ActionData action_data)
Player input reaction evaluation.
Определения ActionFishingNew.c:399
override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
Определения ActionFishingNew.c:250
override void OnEndInput(ActionData action_data)
Определения ActionFishingNew.c:362
EntityAI TrySpawnCatch(FishingActionData action_data)
Определения ActionFishingNew.c:452
void OnSignalEnd(FishingActionData action_data)
Определения ActionFishingNew.c:442
void CreateAndSetupActionCallback(ActionData action_data)
Определения ActionFishingNew.c:281
override void CreateConditionComponents()
Определения ActionFishingNew.c:171
override void OnUpdate(ActionData action_data)
Определения ActionFishingNew.c:309
void ActionFishingNew()
Определения ActionFishingNew.c:161
override bool CanBeUsedInFreelook()
Определения ActionFishingNew.c:187
override void OnAnimationEvent(ActionData action_data)
Определения ActionFishingNew.c:292
const string ALLOWED_WATER_SURFACES
Определения ActionFishingNew.c:159
override void OnFinishProgress(ActionData action_data)
Определения ActionFishingNew.c:351
void ComposeLocalContextData(FishingActionData data)
Определения ActionFishingNew.c:225
override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
Определения ActionFishingNew.c:240
override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
Определения ActionFishingNew.c:192
override void OnEnd(ActionData action_data)
Определения ActionFishingNew.c:389
override bool HasTarget()
Определения ActionFishingNew.c:177
override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
Определения ActionFishingNew.c:271
void PlaySplashEffectSynced(FishingActionData actionDataFishing)
Определения ActionFishingNew.c:319
override bool HasAlternativeInterrupt()
Определения ActionFishingNew.c:182
override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data=null)
Определения ActionFishingNew.c:211
void OnSignalStart(FishingActionData action_data)
Определения ActionFishingNew.c:434
bool CheckForSea(ActionData action_data)
Определения ActionFishingNew.c:336
override ActionData CreateActionData()
Определения ActionFishingNew.c:205
void ToggleFishBiting()
Определения ActionFishingNew.c:135
override void EndActionComponent()
Определения ActionFishingNew.c:92
ref array< string > m_JunkTypes
Определения ActionFishingNew.c:152
override void OnStateChange(int pOldState, int pCurrentState)
Определения ActionFishingNew.c:125
void HandleFishingResultSuccess()
void HandleFishingResultFailure()
override void InitActionComponent()
Определения ActionFishingNew.c:84
override void CreateActionComponent()
Определения ActionFishingNew.c:73
void DestroySplashEffectSynced()
Destroys the effecter, but lets the rest of the particle play out.
Определения ActionFishingNew.c:142
FishingActionData m_ActionDataFishing
Определения ActionFishingNew.c:71
int m_CommandUID
Определения AnimatedActionBase.c:147
Определения CCINonRuined.c:2
int GetWaterSourceType()
Определения CCTLiquid.c:1014
int GetLiquidSourceType()
Определения CCTLiquid.c:1019
Определения CCTLiquid.c:2
Super root of all classes in Enforce script.
Определения EnScript.c:11
bool m_IsSurfaceSea
Определения ActionFishingNew.c:3
void AnimateFishingRodEx(float phase, bool instant=false)
Определения FishingRod_Base.c:34
Определения PPEConstants.c:68
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Определения param.c:12
Определения PlayerBaseClient.c:2
static void DestroyEffecterParticleServer(int effecterID)
Определения EffectManager.c:639
static int CreateParticleServer(vector pos, EffecterParameters parameters)
returns unique effecter ID
Определения EffectManager.c:586
static void ReinitParticleServer(int effecterID, EffecterParameters parameters)
allows re-initializing existing effecter with new parameters (extept m_EffecterType,...
Определения EffectManager.c:602
static void ReactivateParticleServer(int effecterID)
Определения EffectManager.c:611
Manager class for managing Effect (EffectParticle, EffectSound)
Определения EffectManager.c:6
proto bool Write(void value_out)
proto bool Read(void value_in)
const int EVENT_SPLASH_SIGNAL
Определения ActionConstants.c:205
const int EVENT_ANIMATE_ROD_CLOSE
Определения ActionConstants.c:206
const float CYCLE_LENGTH_BASE
Определения ActionConstants.c:185
const float FISHING
Определения ActionConstants.c:119
const string FRESH
fake
Определения ActionConstants.c:166
const string SEA
Определения ActionConstants.c:165
Определения ActionConstants.c:164
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto float Normalize()
Normalizes vector. Returns length.
static vector Direction(vector p1, vector p2)
Returns direction vector from point p1 to point p2.
Определения EnConvert.c:254
Определения EnConvert.c:119
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
const int LIQUID_FRESHWATER
Определения 3_Game/DayZ/constants.c:588
const int LIQUID_SALTWATER
Определения 3_Game/DayZ/constants.c:587
const int UA_FINISHED
Определения 3_Game/DayZ/constants.c:498
const int UA_CANCEL
Определения 3_Game/DayZ/constants.c:499
static const int STATE_NONE
undef state - not running anymore
Определения human.c:369
static const int STATE_LOOP_IN
looped state
Определения human.c:372
proto native void EnableStateChangeCallback()
enables state change callback OnStateChange
static const int STATE_LOOP_LOOP
Определения human.c:373
proto native int GetState()
returns one of STATE_...
Определения StaminaHandler.c:31
static const int STATE_LOOP_LOOP2
Определения human.c:376