‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
All Data Structures Files Functions Variables Macros
hackable.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #namespace hackable;
11 
12 ‪REGISTER_SYSTEM( "hackable", &‪init, undefined )
13 
14 #define DEFAULT_HACKABLE_HACK_TIME GetDvarFloat("scr_hacker_default_hack_time")
15 #define DEFAULT_HACKABLE_DISTANCE GetDvarFloat("scr_hacker_default_distance")
16 #define DEFAULT_HACKABLE_ANGLEDOT GetDvarFloat("scr_hacker_default_angledot")
17 #define DEFAULT_HACKABLE_TIMEOUT GetDvarFloat("scr_hacker_default_timeout")
18 #define DEFAULT_HACKABLE_COST_MULT 1.0
19 #define DEFAULT_HACKABLE_PROMPT &"WEAPON_HACKING"
20 
21 #define DEFAULT_HACKING_BASE_SPEED GetDvarFloat("scr_hacker_default_base_speed")
22 
23 
24 function ‪init()
25 {
26  ‪DEFAULT( level.hackable_items, []);
27 }
28 
29 function ‪add_hackable_object( obj, test_callback, start_callback, fail_callback, complete_callback )
30 {
32  ‪ARRAY_ADD( level.hackable_items, obj );
34  ‪DEFAULT(obj.hackable_angledot,‪DEFAULT_HACKABLE_ANGLEDOT);
35  ‪DEFAULT(obj.hackable_timeout,‪DEFAULT_HACKABLE_TIMEOUT);
36  ‪DEFAULT(obj.hackable_progress_prompt, ‪DEFAULT_HACKABLE_PROMPT);
37  ‪DEFAULT(obj.hackable_cost_mult, ‪DEFAULT_HACKABLE_COST_MULT);
38  ‪DEFAULT(obj.hackable_hack_time, ‪DEFAULT_HACKABLE_HACK_TIME);
39 
40  obj.hackable_test_callback = test_callback;
41  obj.hackable_start_callback = start_callback;
42  obj.hackable_fail_callback = fail_callback;
43  obj.hackable_hacked_callback = complete_callback;
44 }
45 
47 {
48  ArrayRemoveValue( level.hackable_items, obj );
50 }
51 
53 {
54  level.hackable_items = array::filter( level.hackable_items, false, &‪filter_deleted );
55 }
56 
57 function ‪filter_deleted( val )
58 {
59  return IsDefined( val );
60 }
61 
62 
64 {
66  candidates = [];
67  origin = self.origin;
68  forward = AnglesToForward( self.angles );
69  foreach( obj in level.hackable_items )
70  {
71  if ( self ‪is_object_hackable( obj, origin, forward ) )
72  {
73  ‪ARRAY_ADD(candidates,obj);
74  }
75  }
76  if ( candidates.size > 0 )
77  {
78  return ArrayGetClosest( self.origin, candidates );
79  }
80  return undefined;
81 }
82 
83 function ‪is_object_hackable( obj, origin, forward )
84 {
85  if ( DistanceSquared( origin, obj.origin ) < obj.hackable_distance_sq )
86  {
87  to_obj = obj.origin-origin;
88  to_obj = ( to_obj[0], to_obj[1], 0 );
89  to_obj = VectorNormalize( to_obj );
90  dot = VectorDot( to_obj, forward );
91  if ( dot >= obj.hackable_angledot )
92  {
93  if ( IsDefined(obj.hackable_test_callback) )
94  {
95  return obj [[obj.hackable_test_callback]](self);
96  }
97  return true;
98  }
99  else
100  {
101  /#
102  //Println( "Not hackable dot = "+dot+" targ = "+obj.hackable_angledot+" fwd = "+forward+" to obj = "+to_obj+"\n" );
103  #/
104 
105  }
106  }
107  return false;
108 }
109 
110 
111 
112 function ‪start_hacking_object( obj )
113 {
114  obj.hackable_being_hacked = true;
115  obj.hackable_hacked_amount = 0.0;
116  if ( IsDefined(obj.hackable_start_callback) )
117  {
118  obj thread [[obj.hackable_start_callback]](self);
119  }
120 }
121 
122 function ‪fail_hacking_object( obj )
123 {
124  if ( IsDefined(obj.hackable_fail_callback) )
125  {
126  obj thread [[obj.hackable_fail_callback]](self);
127  }
128  obj.hackable_hacked_amount = 0.0;
129  obj.hackable_being_hacked = false;
130  obj notify("hackable_watch_timeout");
131 }
132 
134 {
135  obj notify("hackable_watch_timeout");
136  if ( IsDefined(obj.hackable_hacked_callback) )
137  {
138  obj thread [[obj.hackable_hacked_callback]](self);
139  }
140  obj.hackable_hacked_amount = 0.0;
141  obj.hackable_being_hacked = false;
142 }
143 
144 function ‪watch_timeout( obj, time )
145 {
146  obj notify("hackable_watch_timeout");
147  obj endon("hackable_watch_timeout");
148  wait time;
149  if ( IsDefined(obj) )
150  ‪fail_hacking_object( obj );
151 }
152 
154 {
155  origin = self.origin;
156  forward = AnglesToForward( self.angles );
157  if ( self ‪is_object_hackable( obj, origin, forward ) )
158  {
159  if (!‪IS_TRUE(obj.hackable_being_hacked))
160  {
161  self ‪start_hacking_object( obj );
162  }
163  if (IsDefined(obj.hackable_timeout) && obj.hackable_timeout > 0 )
164  {
165  self thread ‪watch_timeout( obj, obj.hackable_timeout );
166  }
167 
168  amt = 1.0 / ( 20 * obj.hackable_hack_time );
169 
170  obj.hackable_hacked_amount += amt; //( DEFAULT_HACKING_BASE_SPEED * obj.hackable_speed_mult);
171 
172  if ( obj.hackable_hacked_amount > 1.0 )
173  {
174  self ‪complete_hacking_object( obj );
175  }
176 
177  if (‪IS_TRUE(obj.hackable_being_hacked))
178  return obj.hackable_hacked_amount;
179  }
180  if (‪IS_TRUE(obj.hackable_being_hacked))
181  {
182  // this made the hacking feel too touchy
183  // it may feel better if we just let the timeout handle it
184  //fail_hacking_object( obj );
185  }
186  return -1;
187 }
188 
189 
‪cleanup_hackable_objects
‪function cleanup_hackable_objects()
Definition: hackable.gsc:52
‪remove_hackable_object
‪function remove_hackable_object(obj)
Definition: hackable.gsc:46
‪filter_deleted
‪function filter_deleted(val)
Definition: hackable.gsc:57
‪start_hacking_object
‪function start_hacking_object(obj)
Definition: hackable.gsc:112
‪fail_hacking_object
‪function fail_hacking_object(obj)
Definition: hackable.gsc:122
‪DEFAULT_HACKABLE_COST_MULT
‪#define DEFAULT_HACKABLE_COST_MULT
Definition: hackable.gsc:18
‪DEFAULT_HACKABLE_TIMEOUT
‪#define DEFAULT_HACKABLE_TIMEOUT
Definition: hackable.gsc:17
‪complete_hacking_object
‪function complete_hacking_object(obj)
Definition: hackable.gsc:133
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪continue_hacking_object
‪function continue_hacking_object(obj)
Definition: hackable.gsc:153
‪is_object_hackable
‪function is_object_hackable(obj, origin, forward)
Definition: hackable.gsc:83
‪DEFAULT_HACKABLE_HACK_TIME
‪#define DEFAULT_HACKABLE_HACK_TIME
Definition: hackable.gsc:14
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪DEFAULT_HACKABLE_DISTANCE
‪#define DEFAULT_HACKABLE_DISTANCE
Definition: hackable.gsc:15
‪DEFAULT_HACKABLE_PROMPT
‪#define DEFAULT_HACKABLE_PROMPT
Definition: hackable.gsc:19
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪add_hackable_object
‪function add_hackable_object(obj, test_callback, start_callback, fail_callback, complete_callback)
Definition: hackable.gsc:29
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪DEFAULT_HACKABLE_ANGLEDOT
‪#define DEFAULT_HACKABLE_ANGLEDOT
Definition: hackable.gsc:16
‪find_hackable_object
‪function find_hackable_object()
Definition: hackable.gsc:63
‪init
‪function init()
Definition: hackable.gsc:24
‪watch_timeout
‪function watch_timeout(obj, time)
Definition: hackable.gsc:144