DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
ReplaceItemWithNewLambdaBase.c
См. документацию.
1
5{
10 protected bool m_RemoveFromLocationPassed = false;
11 private bool m_RemoveNetworkObjectInfoPassed = false;
12
13 void ReplaceItemWithNewLambdaBase(EntityAI old_item, string new_item_type)
14 {
15 m_OldItem = old_item;
16 m_NewItemType = new_item_type;
17 }
18
20 {
21 m_NewLocation = newLocation;
22 }
23
25
26 protected bool WantCreateNewEntity()
27 {
28 return m_NewLocation && m_NewItemType != string.Empty;
29 }
30
31 protected bool CanExecuteLambda()
32 {
33 if (m_OldItem)
35 //if (WantCreateNewEntity() GameInventory.LocationTestAddEntityType(m_NewItemType, true, true, false, true))
36 return true;
37 return false;
38 }
39
43 protected bool PrepareLocations()
44 {
45 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step A) Prepare inventory locations, old_item=" + m_OldItem);
47 if (m_OldItem.GetInventory().GetCurrentInventoryLocation(m_OldLocation)) // A.1) store old location
48 {
49 if (m_NewLocation == null)
50 {
52 m_NewLocation.CopyLocationFrom(m_OldLocation, true); // A.2) prepare new location from old
53
54 //setting proper location type for ground pos
55 if (!m_NewLocation.GetParent())
56 {
57 vector m4[4];
59 m4[3] = m_NewLocation.GetPos();
60 string path = "" + CFG_VEHICLESPATH + " " + m_NewItemType + " inherit_rotation";
61 bool keep_rotation = GetGame().ConfigIsExisting(path) && GetGame().ConfigGetInt(path) > 0;
62
63 if (m_OldLocation.GetType() == InventoryLocationType.GROUND && keep_rotation)
64 {
65 float dir[4];
66 m_OldLocation.GetDir(dir);
67 m_NewLocation.SetGroundEx(null,m_NewLocation.GetPos(),dir);
68 }
69 else
70 {
71 m_NewLocation.SetGround(null,m4);
72 }
73 }
74 }
75 return true;
76 }
77 else
78 Error("[inv] ReplaceItemWithNewLambdaBase Step A.1) failed to get old_item inventory location");
79 return false;
80 }
81
87 {
88 if (!GameInventory.LocationRemoveEntity(m_OldLocation)) // B) remove entity from old inventory location (making it free for new item)
89 {
90 Error("[inv] ReplaceItemWithNewLambdaBase Step B) failed to remove old_item rom current inventory location");
92 }
93 Print("[inv] ReplaceItemWithNewLambdaBase Step B) remove OK, loc=" + InventoryLocation.DumpToStringNullSafe(m_OldLocation));
95 }
97 {
99 Error("[inv] ReplaceItemWithNewLambdaBase Step B) failed to undo remove");
100 Print("[inv] ReplaceItemWithNewLambdaBase Step B) undo remove OK, loc=" + InventoryLocation.DumpToStringNullSafe(m_OldLocation));
101 }
102
107 protected void RemoveNetworkObjectInfo()
108 {
109 GetGame().RemoteObjectTreeDelete(m_OldItem); // C) this forces server to send DeleteObject Message to client. This is needed for preserving the appearance of network operations on client (so that DeleteObject(old) arrives before CreateVehicle(new)). @NOTE: this does not delete the object on server, only it's network representation.
110 // @NOTE: the item is not deleted right now on server, but rather after copying the properties in Step E)
112 }
117
124 {
126 {
128 EntityAI new_item;
129
130 switch (m_NewLocation.GetType())
131 {
132 case InventoryLocationType.GROUND:
133 new_item = EntityAI.Cast(GetGame().CreateObjectEx(m_NewItemType,m_NewLocation.GetPos(),ECE_PLACE_ON_SURFACE|ECE_LOCAL));
134 string path = "" + CFG_VEHICLESPATH + " " + m_NewItemType + " inherit_rotation";
135 bool keep_rotation = GetGame().ConfigIsExisting(path) && GetGame().ConfigGetInt(path) > 0;
136 if (keep_rotation)
137 {
138 new_item.SetOrientation(m_OldItem.GetOrientation()); //this one actually works...debug InventoryLocation
139 }
140 break;
141 case InventoryLocationType.ATTACHMENT:
142 // forces rawlocation in C++ to make location Valid
143 m_NewLocation.SetAttachment(m_NewLocation.GetParent(), null, m_NewLocation.GetSlot());
145 break;
146 default:
148 break;
149 }
150
151 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step D) Created new new_item=" + new_item);
152 if (new_item)
153 {
154 return new_item;
155 }
156 else
157 {
158 return null;
159
160 /*InventoryLocation backupLocation = new InventoryLocation;
161 vector mtx[4];
162 Math3D.MatrixIdentity4(mtx);
163 mtx[3] = m_OldItem.GetPosition();
164 backupLocation.SetGround(null, mtx);
165 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step D) plan B - creating=" + m_NewItemType + " at bkp loc=" + backupLocation.DumpToString() + ", but failed");
166 new_item = GameInventory.LocationCreateLocalEntity(backupLocation, m_NewItemType,ECE_OBJECT_SWAP,RF_NONE); // create LOCAL new one on ground
167 if (!new_item)
168 {
169 Error("[inv] ReplaceItemWithNewLambdaBase Step D) plan B - wanted to create=" + m_NewItemType + " at bkp loc=" + backupLocation.DumpToString() + ", but failed");
170 return null;
171 }
172 return new_item;*/
173 }
174 }
175
176 // user did not asked for new entity
177 return null;
178 }
179
185 void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
186 {
187 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step E) Copying props " + old_item + " --> " + new_item);
188 }
189
193 protected void DeleteOldEntity()
194 {
195 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step F) delete old item=" + m_OldItem);
196 m_OldItem.DeleteSafe();
197 }
198
204 protected void CreateNetworkObjectInfo(EntityAI new_item)
205 {
206 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step G) CreateNetworkObjectInfo =" + new_item);
207 if (new_item)
208 GetGame().RemoteObjectTreeCreate(new_item); // G) this forces server to send CreateVehicle Message to client. This is needed for preserving the appearance of network operations on client (so that DeleteObject(old) arrives before CreateVehicle(new)). @NOTE: this does not delete the object on server, only it's network representation.
209 }
210
216 protected void OnSuccess(EntityAI new_item)
217 {
218 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step H) OnSuccess=" + new_item);
219 }
220
226 protected void OnAbort()
227 {
228 Print("Error [inv] ReplaceItemWithNewLambdaBase OnAbort");
229 }
230
231 void Execute(HumanInventoryWithFSM fsm_to_notify = null)
232 {
233 int t = GetGame().GetTime();
234 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[syncinv] t=" + t + " lambda.Execute start ");
235
236 // A) init
237 bool prepared = PrepareLocations();
238
239 if (prepared && CanExecuteLambda())
240 {
241 // B) rm old (and delete on client)
244 {
245 Error("[inv] ReplaceItemWithNewLambdaBase Step B) ABORT - failed while rm old item from loc=" + InventoryLocation.DumpToStringNullSafe(m_OldLocation));
246
247 if (fsm_to_notify)
248 fsm_to_notify.ProcessHandAbortEvent(new HandEventHumanCommandActionAborted(fsm_to_notify.GetManOwner()));
249 OnAbort();
250 return;
251 }
252
253 // C) rm NetworkObjectInfo from old item (+ send delete object tree to clients)
255
256 // D) mk new in place of old
257 EntityAI new_item = CreateNewEntity();
258 if (WantCreateNewEntity() && new_item == null)
259 {
260 //Error("[inv] ReplaceItemWithNewLambdaBase Step D) ABORT - wanted to create=" + m_NewItemType + " at loc=" + m_NewLocation.DumpToString() + ", but failed");
261 Print("Error [inv] ReplaceItemWithNewLambdaBase Step D) ABORT - wanted to create=" + m_NewItemType + " at loc=" + InventoryLocation.DumpToStringNullSafe(m_NewLocation) + ", but failed");
266
267 OnAbort();
268 if (fsm_to_notify)
269 fsm_to_notify.ProcessHandAbortEvent(new HandEventHumanCommandActionAborted(fsm_to_notify.GetManOwner()));
270 return;
271 }
272
273 // E) cpy props
275
276 // F) del old
278
279 // G) mk new NetworkObjectInfo
280 CreateNetworkObjectInfo(new_item);
281
282 // H) notification
283 OnSuccess(new_item);
284 }
285 else
286 {
287 Print("[syncinv] warning, lambda cannot be executed, skipping!");
288 if (fsm_to_notify)
289 fsm_to_notify.ProcessHandAbortEvent(new HandEventHumanCommandActionAborted(fsm_to_notify.GetManOwner()));
290 OnAbort();
291 return;
292 }
293 int te = GetGame().GetTime();
294 int dt = te - t;
295 if (LogManager.IsInventoryHFSMLogEnable()) hndDebugPrint("[syncinv] te=" + te + " lambda.Execute end, exec time=" + dt);
296 }
297
299 {
300 string s = "{ old=" + m_OldItem + " newType=" + m_NewItemType + "}";
301 return s;
302 }
303};
304
305
307{
308};
const int RF_NONE
Определения CentralEconomy.c:45
const int ECE_OBJECT_SWAP
Определения CentralEconomy.c:38
const int ECE_LOCAL
Определения CentralEconomy.c:24
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
void hndDebugPrint(string s)
Определения HandFSM.c:1
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
string path
Определения OptionSelectorMultistate.c:142
proto native bool ConfigIsExisting(string path)
proto native void RemoteObjectTreeDelete(Object obj)
RemoteObjectDelete - deletes only remote object (unregisters from network). do not use if not sure wh...
proto native int ConfigGetInt(string path)
Get int value from config on path.
proto int GetTime()
returns mission time in milliseconds
proto native void RemoteObjectTreeCreate(Object obj)
RemoteObjectCreate - postponed registration of network object (and creation of remote object)....
Определения Building.c:6
static proto native EntityAI LocationCreateLocalEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new local item directly at location @NOTE: the item is created localy, i.e....
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
static proto native bool LocationAddEntity(notnull InventoryLocation inv_loc)
adds item to inventory location
static proto native bool LocationCanRemoveEntity(notnull InventoryLocation inv_loc)
queries if the entity contained in inv_loc.m_item can be removed from ground/attachment/cargo/hands/....
static proto native bool LocationRemoveEntity(notnull InventoryLocation inv_loc)
removes item from inventory location
script counterpart to engine's class Inventory
Определения Inventory.c:79
HumanInventory... with FSM (synchronous, no anims)
Определения HumanInventoryWithFSM.c:6
static string DumpToStringNullSafe(InventoryLocation loc)
Определения InventoryLocation.c:226
InventoryLocation.
Определения InventoryLocation.c:29
static bool IsInventoryHFSMLogEnable()
Определения Debug.c:668
Определения Debug.c:594
Определения EnMath3D.c:28
void ReplaceItemWithNewLambdaBase(EntityAI old_item, string new_item_type)
Определения ReplaceItemWithNewLambdaBase.c:13
void DeleteOldEntity()
Step F. - deletes physically old item.
Определения ReplaceItemWithNewLambdaBase.c:193
void OverrideNewLocation(InventoryLocation newLocation)
Определения ReplaceItemWithNewLambdaBase.c:19
void OnAbort()
Step Out - notification on abort.
Определения ReplaceItemWithNewLambdaBase.c:226
ref InventoryLocation m_OldLocation
Определения ReplaceItemWithNewLambdaBase.c:8
void CreateNetworkObjectInfo(EntityAI new_item)
Step G. - create NetworkObjectInfo for new item.
Определения ReplaceItemWithNewLambdaBase.c:204
ref InventoryLocation m_NewLocation
Определения ReplaceItemWithNewLambdaBase.c:9
void RemoveOldItemFromLocation()
Step B. - free location for new item @NOTE this operation does not delete the object,...
Определения ReplaceItemWithNewLambdaBase.c:86
void Execute(HumanInventoryWithFSM fsm_to_notify=null)
Определения ReplaceItemWithNewLambdaBase.c:231
void OnSuccess(EntityAI new_item)
Step H. - notification on finish.
Определения ReplaceItemWithNewLambdaBase.c:216
void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
Step E. copy properties from old object to the created one.
Определения ReplaceItemWithNewLambdaBase.c:185
EntityAI CreateNewEntity()
Step D. - create new entity (LOCAL) with specified type.
Определения ReplaceItemWithNewLambdaBase.c:123
bool PrepareLocations()
Step A. - prepare inventory locations.
Определения ReplaceItemWithNewLambdaBase.c:43
void RemoveNetworkObjectInfo()
Step C. - remove network part of the object @NOTE this operation does not delete the object,...
Определения ReplaceItemWithNewLambdaBase.c:107
Определения EnConvert.c:106
proto native CGame GetGame()
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
proto void Print(void var)
Prints content of variable to console/log.
static void MatrixIdentity4(out vector mat[4])
Creates identity matrix.
Определения EnMath3D.c:256
const string CFG_VEHICLESPATH
Определения constants.c:220