‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
containers_shared.gsc
Go to the documentation of this file.
1 
2 #using scripts\codescripts\struct;
3 
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\doors_shared;
7 #using scripts\shared\flag_shared;
8 #using scripts\shared\flagsys_shared;
9 #using scripts\shared\scene_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\visionset_mgr_shared;
13 
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\shared\version.gsh;
16 
17 
18 #namespace containers;
19 
20 
21 #define STR_OPEN_CONTAINER_MESSAGE "Press [{+activate}] to open"
22 
23 
25 {
28 
30 
31  var ‪m_e_container; // Container Ent
32 
34  {
35  }
36 
38  {
39  }
40 
41  function ‪init_xmodel( str_xmodel, v_origin, v_angles )
42  {
43  if( !IsDefined(str_xmodel) )
44  {
45  str_xmodel = "script_origin";
46  //ASSERTMSG( "No model found in Container Script Bundle" );
47  //return;
48  }
49 
50  ‪m_e_container = ‪util::spawn_model( str_xmodel, v_origin, v_angles );
51  return( ‪m_e_container );
52  }
53 }
54 
55 
56 //*****************************************************************************
57 //*****************************************************************************
58 
59 ‪REGISTER_SYSTEM( "containers", &‪__init__, undefined )
60 
61 function ‪__init__()
62 {
63  a_containers = ‪struct::get_array( "scriptbundle_containers", "classname" ); // "_containers" auto generates from the TYPE field in the bundle
64  foreach ( s_instance in a_containers )
65  {
66  c_container = s_instance ‪init();
67  if( IsDefined(c_container) )
68  {
69  s_instance.c_container = c_container;
70  }
71  }
72 }
73 
74 
75 //*****************************************************************************
76 //*****************************************************************************
77 // Setup Container Instances
78 //*****************************************************************************
79 //*****************************************************************************
80 
81 // self = container instance
82 function ‪init()
83 {
84  if( !IsDefined(self.angles) )
85  {
86  self.angles = ( 0, 0 ,0 );
87  }
88 
89  s_bundle = ‪struct::get_script_bundle( "containers", self.scriptbundlename );
90 
91  return ‪setup_container_scriptbundle( s_bundle, self );
92 }
93 
94 
95 //*****************************************************************************
96 //*****************************************************************************
97 
98 // self = container bundle
99 function ‪setup_container_scriptbundle( s_bundle, s_container_instance )
100 {
101  c_container = new ‪cContainer();
102 
103  c_container.m_s_container_bundle = s_bundle; // Container bundle
104  c_container.m_s_fxanim_bundle = ‪struct::get_script_bundle( "scene", s_bundle.TheEffectBundle ); // Get fxanim bundle
105  c_container.m_s_container_instance = s_container_instance;
106 
107  // Setup
108  //[[ c_container ]]->init_xmodel( c_container.m_s_container_bundle.model, s_container_instance.origin, s_container_instance.angles );
109 
110  // The init function makes the container appear...
111  self ‪scene::init( s_bundle.theeffectbundle, c_container.m_e_container );
112 
113  level thread ‪container_update( c_container );
114 
115  return( c_container );
116 }
117 
118 
119 //*****************************************************************************
120 //*****************************************************************************
121 
122 // Problems:-
123 // - im playing the scene on the bundle not the instance
124 // - whats the best way to spawn the ent, i'm currently spawning two ents
125 // - what do i play the notify on for the pickup etc......
126 // - can I get the ent back from the scene::play?
127 // DOES IT WORK WITH TWO SCRIPTBUNDLES OF THE SAME TYPE?????
128 
129 // NOTE - DONT FORGET TO SET "auto-run" KVP to init
130 
131 // self = level
132 function ‪container_update( c_container )
133 {
134  e_ent = c_container.m_e_container;
135 
136 #if 0
137  //wait( 10 );
138  //level thread scene::play( c_container.m_s_container_bundle.theeffectbundle, e_ent );
139  //c_container.m_s_container_bundle.theeffectbundle thread scene::play( c_container.m_s_container_bundle.theeffectbundle, e_ent );
140  //c_container.m_e_container scene::play( c_container.m_s_fxanim_bundle.name );
141  //level thread scene::play( "test_container_bundle", "targetname" );
142  //wait( 1000 );
143 #endif
144 
145 
146  s_bundle = c_container.m_s_container_bundle;
147 
148  targetname = c_container.m_s_container_instance.targetname;
149 
150 
151 #if 0
152  //self scene::init( c_container.m_s_container_bundle );
153 
154  wait( 1000 );
155  //self scene::play( c_container.m_s_container_bundle );
156  //wait( 1000 );
157 
158  // Store the container class on the entity
159  // e_ent.c_container = c_container;
160 
161  if( IsDefined(s_bundle.loot_offset_x) )
162  {
163  v_loot_offset = ( s_bundle.loot_offset_x, s_bundle.loot_offset_y, s_bundle.loot_offset_z );
164  }
165  else
166  {
167  v_loot_offset = ( 0, 0, 0 );
168  }
169 #endif
170 
171  // Wait fot the container to be opened
172  n_radius = s_bundle.trigger_radius;
173  e_trigger = ‪containers::create_locker_trigger( c_container.m_s_container_instance.origin, n_radius, ‪STR_OPEN_CONTAINER_MESSAGE );
174  e_trigger waittill( "trigger", e_who );
175  e_trigger delete();
176 
177 
178  ‪scene::play( targetname, "targetname" );
179 
180  // Play the open animation - from the containers fxanim bundle
181  //c_container.m_e_container scene::play( c_container.m_s_fxanim_bundle.name );
182 
183  // ERROR - using a scene name 'container_pickup_medium' that doesn't exist.
184  //level thread scene::play( "test_container_bundle", "targetname" );
185 
186 
187  // Notify script the container has been opened
188  // You can use a targetname on the container if you want to grab this instance and spawn a model inside
189  //e_ent notify(s_bundle.open_notify );
190 }
191 
192 
193 //*****************************************************************************
194 //*****************************************************************************
195 
196 function ‪create_locker_trigger( v_pos, n_radius, str_message )
197 {
198  // Its a look at trigger, so move the base of the trigger off the ground
199  v_pos = ( v_pos[0], v_pos[1], v_pos[2]+50 );
200 
201  e_trig = ‪spawn( "trigger_radius_use", v_pos, 0, n_radius, 100 );
202  e_trig TriggerIgnoreTeam();
203 
204  e_trig SetVisibleToAll();
205  e_trig SetTeamForTrigger( "none" );
206  e_trig UseTriggerRequireLookAt();
207  e_trig SetCursorHint( "HINT_NOICON" );
208  e_trig SetHintString( str_message );
209 
210  return( e_trig );
211 }
212 
213 
214 //*****************************************************************************
215 //*****************************************************************************
216 // General purpose locker bundles
217 //*****************************************************************************
218 //*****************************************************************************
219 
220 function ‪setup_general_container_bundle( str_targetname, str_intel_vo, str_narrative_collectable_model, force_open )
221 {
222  s_struct = ‪struct::get( str_targetname, "targetname" );
223  if( !IsDefined(s_struct) )
224  {
225  return;
226  }
227 
228  //level thread doors::door_debug_line( s_struct.origin );
229 
230  //level waittill( "prematch_over" );
231  //level flag::wait_till( "start_coop_logic" );
232  //level flag::wait_till( "all_players_connected" );
233  level ‪flag::wait_till( "all_players_spawned" );
234 
235  e_trigger = ‪containers::create_locker_trigger( s_struct.origin, 64, "Press [{+activate}] to open" );
236  if( !IsDefined(force_open) || (force_open == false) ) // Force locker into open state?
237  {
238  e_trigger waittill( "trigger", e_who );
239  }
240  else
241  {
242  // TODO: Why is this wait needed, without the anim doesn't play
243  rand_time = RandomFloatRange( 1.0, 1.5 );
244  wait( rand_time );
245  }
246 
247  e_trigger delete();
248 
249  // Open the container lid
250  level thread ‪scene::play( str_targetname , "targetname" );
251 
252  // Notify the scene entities
253  if( IsDefined(s_struct.a_entity) )
254  {
255  for( i=0; i<s_struct.a_entity.size; i++ )
256  {
257  s_struct.a_entity[i] notify( "opened" );
258  }
259  }
260 
261  // If we have a narrative collectable, wait for the player to pick it up
262  if( IsDefined(str_narrative_collectable_model) )
263  {
264  v_pos = s_struct.origin + ( 0, 0, 30 );
265 
266  if( !IsDefined(s_struct.angles) )
267  {
268  v_angles = ( 0, 0, 0 );
269  }
270  else
271  {
272  v_angles = s_struct.angles;
273  }
274 
275  v_angles = ( v_angles[0], v_angles[1]+90, v_angles[2] );
276 
277  e_collectable = ‪spawn( "script_model", v_pos );
278  e_collectable setModel( "p7_int_narrative_collectable" );
279  e_collectable.angles = v_angles;
280 
281  wait( 1 );
282 
283  e_trigger = ‪containers::create_locker_trigger( s_struct.origin, 64, "Press [{+activate}] to pickup collectable" );
284  e_trigger waittill( "trigger", e_who );
285  e_trigger delete();
286 
287  e_collectable delete();
288  }
289 
290  if( IsDefined(str_intel_vo) )
291  {
292  e_who PlaySound( str_intel_vo );
293  }
294 }
295 
296 
297 //*****************************************************************************
298 //*****************************************************************************
299 // General purpose locked scripts
300 //*****************************************************************************
301 //*****************************************************************************
302 
303 function ‪setup_locker_double_doors( str_left_door_name, str_right_door_name, center_point_offset )
304 {
305  // Get all the left door instances
306  a_left_doors = getentarray( str_left_door_name, "targetname" );
307  if( !IsDefined(a_left_doors) )
308  {
309  return;
310  }
311 
312  // Get all the right door instances
313  a_right_doors = getentarray( str_right_door_name, "targetname" );
314  if( !IsDefined(a_right_doors) )
315  {
316  return;
317  }
318 
319  // For each left door instance
320  // - Find the closest right door instance, - link them, create an activation trigger
321  for( i=0; i<a_left_doors.size; i++ )
322  {
323  e_left_door = a_left_doors[i];
324 
325  if( IsDefined(center_point_offset) )
326  {
327  v_forward = AnglesToForward( e_left_door.angles );
328  v_search_pos = e_left_door.origin + ( v_forward * center_point_offset );
329  }
330  else
331  {
332  v_search_pos = e_left_door.origin;
333  }
334 
335  e_right_door = ‪get_closest_ent_from_array( v_search_pos, a_right_doors );
336  level thread ‪create_locker_doors( e_left_door, e_right_door, 120, 0.4 );
337  }
338 }
339 
340 
341 //*****************************************************************************
342 //*****************************************************************************
343 
345 {
346  e_closest = undefined;
347  n_closest_dist = 9999999;
348 
349  for( i=0; i<‪a_ents.size; i++ )
350  {
351  dist = distance( v_pos, ‪a_ents[i].origin );
352  if( dist < n_closest_dist )
353  {
354  n_closest_dist = dist;
355  e_closest = ‪a_ents[i];
356  }
357  }
358 
359  return( e_closest );
360 }
361 
362 
363 //*****************************************************************************
364 //*****************************************************************************
365 
366 function ‪create_locker_doors( e_left_door, e_right_door, door_open_angle, door_open_time )
367 {
368  // Locker door trigger
369  v_locker_pos = ( e_left_door.origin + e_right_door.origin ) / 2;
370  n_trigger_radius = 48;
371  e_trigger = ‪create_locker_trigger( v_locker_pos, n_trigger_radius, "Press [{+activate}] to open" );
372  e_trigger waittill( "trigger" );
373 
374 
375  e_left_door playsound( "evt_cabinet_open" );
376 
377  // Open the locker
378  v_angle = ( e_left_door.angles[0], e_left_door.angles[1]-door_open_angle, e_left_door.angles[2] );
379  e_left_door RotateTo( v_angle, door_open_time );
380  v_angle = ( e_right_door.angles[0], e_right_door.angles[1]+door_open_angle, e_right_door.angles[2] );
381  e_right_door RotateTo( v_angle, door_open_time );
382 
383  // Cleanup
384  e_trigger delete();
385 }
386 
387 
‪get_closest_ent_from_array
‪function get_closest_ent_from_array(v_pos, a_ents)
Definition: containers_shared.gsc:344
‪setup_locker_double_doors
‪function setup_locker_double_doors(str_left_door_name, str_right_door_name, center_point_offset)
Definition: containers_shared.gsc:303
‪cContainer::m_s_container_bundle
‪var m_s_container_bundle
Definition: containers_shared.gsc:26
‪play
‪function play(animation, v_origin_or_ent, v_angles_or_tag, n_rate=1, n_blend_in=.2, n_blend_out=.2, n_lerp, b_link=false)
Definition: animation_shared.csc:44
‪cContainer::m_s_fxanim_bundle
‪var m_s_fxanim_bundle
Definition: containers_shared.gsc:27
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪cContainer::destructor
‪destructor()
Definition: containers_shared.gsc:37
‪setup_general_container_bundle
‪function setup_general_container_bundle(str_targetname, str_intel_vo, str_narrative_collectable_model, force_open)
Definition: containers_shared.gsc:220
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪create_locker_doors
‪function create_locker_doors(e_left_door, e_right_door, door_open_angle, door_open_time)
Definition: containers_shared.gsc:366
‪spawn_model
‪function spawn_model(n_client, str_model, origin=(0, 0, 0), angles=(0, 0, 0))
Definition: util_shared.csc:92
‪cContainer::init_xmodel
‪function init_xmodel(str_xmodel, v_origin, v_angles)
Definition: containers_shared.gsc:41
‪container_update
‪function container_update(c_container)
Definition: containers_shared.gsc:132
‪init
‪function init()
Definition: containers_shared.gsc:82
‪cContainer::m_s_container_instance
‪var m_s_container_instance
Definition: containers_shared.gsc:29
‪create_locker_trigger
‪function create_locker_trigger(v_pos, n_radius, str_message)
Definition: containers_shared.gsc:196
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪cContainer::m_e_container
‪var m_e_container
Definition: containers_shared.gsc:31
‪a_ents
‪function _query_ents_by_substring_helper a_ents
Definition: util_shared.gsc:3334
‪cContainer
Definition: containers_shared.gsc:24
‪setup_container_scriptbundle
‪function setup_container_scriptbundle(s_bundle, s_container_instance)
Definition: containers_shared.gsc:99
‪cContainer::constructor
‪constructor()
Definition: containers_shared.gsc:33
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪STR_OPEN_CONTAINER_MESSAGE
‪#define STR_OPEN_CONTAINER_MESSAGE
Definition: containers_shared.gsc:21
‪__init__
‪class cContainer __init__()
Definition: containers_shared.gsc:61