DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
ReplaceItemWithNewLambdaBase.c
Go to the documentation of this file.
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 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
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];
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 }
114 {
116 }
117
124 {
126 {
128 EntityAI new_item;
129
130 switch (m_NewLocation.GetType())
131 {
132 case InventoryLocationType.GROUND:
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
145 break;
146 default:
148 break;
149 }
150
151 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 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 hndDebugPrint("[inv] ReplaceItemWithNewLambdaBase Step E) Copying props " + old_item + " --> " + new_item);
188 }
189
193 protected void DeleteOldEntity()
194 {
195 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 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 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 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 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
const int ECE_OBJECT_SWAP
const int ECE_LOCAL
const int ECE_PLACE_ON_SURFACE
void hndDebugPrint(string s)
Definition HandFSM.c:1
InventoryLocationType
types of Inventory Location
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 native bool ConfigIsExisting(string path)
proto native void RemoteObjectTreeCreate(Object obj)
RemoteObjectCreate - postponed registration of network object (and creation of remote object)....
proto int GetTime()
returns mission time in milliseconds
script counterpart to engine's class Inventory
Definition Inventory.c:77
static proto native bool LocationAddEntity(notnull InventoryLocation inv_loc)
adds item to inventory location
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 LocationRemoveEntity(notnull InventoryLocation inv_loc)
removes item from inventory location
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 bool LocationCanRemoveEntity(notnull InventoryLocation inv_loc)
queries if the entity contained in inv_loc.m_item can be removed from ground/attachment/cargo/hands/....
HumanInventory... with FSM (synchronous, no anims)
InventoryLocation.
proto native int GetType()
returns type of InventoryLocation
proto native vector GetPos()
returns position of item in world if type is Ground
proto native void SetGroundEx(EntityAI e, vector pos, float dir[4])
sets current inventory location type to Ground with transformation mat
proto native InventoryLocation CopyLocationFrom(notnull InventoryLocation rhs, bool copyFlip)
copies location to another location without m_item member
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
proto native EntityAI GetParent()
returns parent of current inventory location
proto native void SetAttachment(notnull EntityAI parent, EntityAI e, int slotId)
sets current inventory location type to Attachment with slot id set to <slotId>
proto native void GetDir(out float dir[4])
returns direction of item in world if type is Ground
proto native int GetSlot()
returns slot id if current type is Attachment
static string DumpToStringNullSafe(InventoryLocation loc)
base class for transformation operations (creating one item from another)
protected void DeleteOldEntity()
Step F. - deletes physically old item.
void ReplaceItemWithNewLambdaBase(EntityAI old_item, string new_item_type)
protected void RemoveNetworkObjectInfo()
Step C. - remove network part of the object @NOTE this operation does not delete the object,...
protected void CreateNetworkObjectInfo(EntityAI new_item)
Step G. - create NetworkObjectInfo for new item.
void Execute(HumanInventoryWithFSM fsm_to_notify=null)
protected void OnSuccess(EntityAI new_item)
Step H. - notification on finish.
protected bool PrepareLocations()
Step A. - prepare inventory locations.
protected EntityAI CreateNewEntity()
Step D. - create new entity (LOCAL) with specified type.
void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
Step E. copy properties from old object to the created one.
void OverrideNewLocation(InventoryLocation newLocation)
protected ref InventoryLocation m_NewLocation
protected void OnAbort()
Step Out - notification on abort.
protected ref InventoryLocation m_OldLocation
protected void RemoveOldItemFromLocation()
Step B. - free location for new item @NOTE this operation does not delete the object,...
proto native CGame GetGame()
void Error(string err)
Messagebox with error message.
Definition 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.
Definition EnMath3D.c:233
const string CFG_VEHICLESPATH
Definition constants.c:195
static const string Empty
Definition EnString.c:7