DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
HumanInventoryWithFSM.c
См. документацию.
1
6{
7 protected ref HandFSM m_FSM;
8 protected ref HandStateBase m_Empty;
9 protected ref HandStateBase m_Equipped;
10
12 {
13 m_FSM = new HandFSM();
14 }
15
17 {
18 // stable states are created only if they do not exist already (for example created by derived class like DayZPlayerInventory)
19 // @NOTE: this cannot be done in constructor, as there is NO owner set yet. GetManOwner() will therefore return NULL.
20 if (!m_Empty)
21 m_Empty = new HandStateEmpty(GetManOwner());
22 if (!m_Equipped)
24 }
25
26 override void Init ()
27 {
28 // setup state machine
29 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[hndfsm] Initializing Human Inventory FSM");
30
31 // basic states
33
34 // events
35 HandEventBase __T__ = new HandEventTake;
36 HandEventBase __D__ = new HandEventDrop;
37 HandEventBase __Tw_ = new HandEventThrow;
38 HandEventBase __M__ = new HandEventMoveTo;
39 HandEventBase __W__ = new HandEventSwap;
40 HandEventBase __F__ = new HandEventForceSwap;
41 HandEventBase __X__ = new HandEventDestroy;
42 HandEventBase __Xd_ = new HandEventDestroyed;
44 HandEventBase __Re_ = new HandEventDestroyAndReplaceWithNewElsewhere;
45 HandEventBase __Rh_ = new HandEventDestroyElsewhereAndReplaceWithNewInHands;
46 HandEventBase __Rd_ = new HandEventReplaced;
47 HandEventBase __Cd_ = new HandEventCreated;
48 HandEventBase _fin_ = new HandEventHumanCommandActionFinished;
49 HandEventBase _abt_ = new HandEventHumanCommandActionAborted;
50
51
52 HandReplacingItemInHands replacing = new HandReplacingItemInHands(GetManOwner());
53 HandReplacingItemInHands replacingElsewhere = new HandReplacingItemInHands(GetManOwner());
54 HandReplacingItemElsewhereWithNewInHands replacingElsewhere3 = new HandReplacingItemElsewhereWithNewInHands(GetManOwner());
55
56 // setup transitions
57 m_FSM.AddTransition(new HandTransition( m_Empty , __T__, m_Equipped, new HandActionTake, new HandGuardHasItemInEvent(GetManOwner())));
58 m_FSM.AddTransition(new HandTransition( m_Empty , __Cd_, m_Equipped, new HandActionCreated, new HandGuardHasItemInEvent(GetManOwner())));
59
60 m_FSM.AddTransition(new HandTransition(m_Equipped, __D__, m_Empty, new HandActionDrop, null));
61 m_FSM.AddTransition(new HandTransition(m_Equipped, __Tw_, m_Empty, new HandActionThrow, null));
62 m_FSM.AddTransition(new HandTransition(m_Equipped, __M__, m_Empty, new HandActionMoveTo, new HandGuardAnd(new HandGuardHasItemInHands(GetManOwner()), new HandGuardCanMove(GetManOwner()))));
63 m_FSM.AddTransition(new HandTransition(m_Equipped, __X__, m_Empty, new HandActionDestroy, new HandGuardHasItemInHands(GetManOwner())));
64 m_FSM.AddTransition(new HandTransition(m_Equipped, __Xd_, m_Empty, new HandActionDestroyed, new HandGuardHasDestroyedItemInHands(GetManOwner())));
65 m_FSM.AddTransition(new HandTransition(m_Equipped, __Xd_, m_Equipped, new HandActionDestroyed, new HandGuardNot(new HandGuardHasDestroyedItemInHands(GetManOwner()))));
66
67 m_FSM.AddTransition(new HandTransition(m_Equipped, __R__, replacing));
68 m_FSM.AddTransition(new HandTransition(replacing, _fin_, m_Equipped));
69 replacing.AddTransition(new HandTransition(replacing.m_Replacing, _abt_, m_Equipped));
70
71 m_FSM.AddTransition(new HandTransition(m_Equipped, __Re_, replacingElsewhere));
72 m_FSM.AddTransition(new HandTransition(replacingElsewhere, _fin_, m_Empty));
73 replacingElsewhere.AddTransition(new HandTransition(replacingElsewhere.m_Replacing, _abt_, m_Equipped));
74
75 m_FSM.AddTransition(new HandTransition(m_Empty, __Rh_, replacingElsewhere3));
76 m_FSM.AddTransition(new HandTransition(replacingElsewhere3, _fin_, m_Equipped));
77 replacingElsewhere3.AddTransition(new HandTransition(replacingElsewhere3.m_Replacing, _abt_, m_Empty));
78
79 m_FSM.AddTransition(new HandTransition(m_Equipped, __Rd_, m_Equipped, new HandActionReplaced, null));
80 m_FSM.AddTransition(new HandTransition(m_Equipped, __W__, m_Equipped, new HandActionSwap, new HandGuardAnd(new HandGuardHasItemInHands(GetManOwner()), new HandGuardCanSwap(GetManOwner()))));
81 m_FSM.AddTransition(new HandTransition(m_Equipped, __F__, m_Equipped, new HandActionForceSwap, new HandGuardAnd(new HandGuardHasItemInHands(GetManOwner()), new HandGuardCanForceSwap(GetManOwner()))));
82
83 // start FSM
84 m_FSM.SetInitialState(m_Empty);
85 m_FSM.Start();
86
87 super.Init();
88 }
89
90 bool CanProcessHandEvents () { return m_FSM && m_FSM.IsRunning(); }
91
97 {
98 //SyncRemote(e);
99 if (m_FSM.ProcessEvent(e) == ProcessEventResult.FSM_OK)
100 {
101 #ifdef ENABLE_LOGGING
103 {
104 Debug.InventoryHFSMLog("STS = " + GetManOwner().GetSimulationTimeStamp() , e.ToString(), "ProcessHandEvent", e.m_Player.ToString() );
105 }
106 #endif
107 return true;
108 }
109 else
110 {
111 //if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("FSM refused to process event (no transition): src=" + GetCurrentState().ToString() + " event=" + e.ToString());
112 return false;
113 }
114 }
115
117 {
118 //SyncRemote(e);
120 m_FSM.ProcessAbortEvent(e, aa);
121 if (aa == ProcessEventResult.FSM_OK)
122 {
123 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugSpam("[hndfsm] STS = " + GetManOwner().GetSimulationTimeStamp() + " Processed event e=" + e.ToString());
124 return true;
125 }
126 else
127 {
128 //if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("FSM refused to process event (no transition): src=" + GetCurrentState().ToString() + " event=" + e.ToString());
129 return false;
130 }
131 }
132
133
135 {
136 if (GetEntityInHands())
137 {
138 if (!m_FSM.IsRunning() || GetCurrentStateID() == HandStateID.Empty) //forcing when not running or in stable state only
139 m_FSM.SetCurrentState(m_Equipped);
140 }
141 else
142 {
143 if (!m_FSM.IsRunning() || GetCurrentStateID() == HandStateID.Equipped) //forcing when not running or in stable state only
144 m_FSM.SetCurrentState(m_Empty);
145 }
146 }
147
148 override bool OnStoreLoad (ParamsReadContext ctx, int version)
149 {
150 if ( !super.OnStoreLoad(ctx, version) )
151 return false;
152
153 //@TODO
154 //m_FSM.OnStoreLoad(ctx, version);
155
156 return true;
157 }
158
159 override void OnStoreSave (ParamsWriteContext ctx)
160 {
161 super.OnStoreSave(ctx);
162 //@TODO
163 //m_FSM.OnStoreSave(ctx, version);
164 }
165
169 int GetCurrentStateID () { return m_FSM.GetCurrentStateID(); }
170
171 bool IsIdle () { return m_FSM.GetCurrentState().IsIdle(); }
172
177 {
178 m_FSM.NetSyncCurrentStateID(id);
179 }
180};
181
ProcessEventResult
Определения FSMBase.c:41
HandStateID
states
Определения Hand_States.c:4
void hndDebugSpam(string s)
Определения HandFSM.c:9
void hndDebugPrint(string s)
Определения HandFSM.c:1
FSMTransition< HandStateBase, HandEventBase, HandActionBase, HandGuardBase > HandTransition
Определения HandFSM.c:28
static void InventoryHFSMLog(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Определения Debug.c:147
Определения Debug.c:2
Abstracted event, not to be used, only inherited.
Определения Hand_Events.c:209
Определения Hand_Events.c:679
Hand finite state machine.
represent hand state base
Определения HandAnimatedForceSwapping.c:4
Определения Hand_States.c:33
Man GetManOwner()
Определения HumanInventory.c:102
proto native EntityAI GetEntityInHands()
inventory for plain man/human
Определения HumanInventory.c:10
ref HandFSM m_FSM
Определения HumanInventoryWithFSM.c:7
bool CanProcessHandEvents()
Определения HumanInventoryWithFSM.c:90
override bool ProcessHandEvent(HandEventBase e)
hand's fsm handling of events @NOTE: warning: ProcessHandEvent can be called only within DayZPlayer::...
Определения HumanInventoryWithFSM.c:96
void CreateStableStates()
Определения HumanInventoryWithFSM.c:16
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения HumanInventoryWithFSM.c:148
override void Init()
Определения HumanInventoryWithFSM.c:26
ref HandStateBase m_Equipped
Определения HumanInventoryWithFSM.c:9
int GetCurrentStateID()
Определения HumanInventoryWithFSM.c:169
ref HandStateBase m_Empty
hand slot state machine
Определения HumanInventoryWithFSM.c:8
void NetSyncCurrentStateID(int id)
Engine callback - network synchronization of FSM's state. not intended to direct use.
Определения HumanInventoryWithFSM.c:176
void CheckFSMState()
Определения HumanInventoryWithFSM.c:134
void HumanInventoryWithFSM()
Определения HumanInventoryWithFSM.c:11
override void OnStoreSave(ParamsWriteContext ctx)
Определения HumanInventoryWithFSM.c:159
bool ProcessHandAbortEvent(HandEventBase e)
Определения HumanInventoryWithFSM.c:116
static bool IsInventoryHFSMLogEnable()
Определения Debug.c:668
Определения Debug.c:594
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16