‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_perplayer.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #insert scripts\shared\shared.gsh;
4 
5 // calls a callback every time a player starts playing (spawns),
6 // and another callback every time they stop (die / switch teams / disconnect).
7 // handles the annoying logic of players joining and leaving the game,
8 // so that other scripts don't have to.
9 
10 /* Usage example:
11 
12 // init() must be called during loading, or players already connected won't be considered!
13 function objectiveCreator = perplayer::init("objective_creator",&showObjective,&hideObjective);
14 
15 ...
16 
17 // calls showObjective for all players in game
18 // (this can safely be called immediately after init(), if desired)
19 function perplayer::enable(objectiveCreator);
20 
21 ... // during this time, showObjective and hideObjective will be called for players as they join and leave gameplay
22 
23 // calls hideObjective for all players in game
24 function perplayer::disable(objectiveCreator);
25 
26 
27 // the function playerBeginCallback takes no arguments. self = the player.
28 // the function playerEndCallback takes one argument, a boolean which says whether the player has disconnected.
29 // if the player has disconnected, it is not safe to change properties of the player.
30 
31 */
32 
33 #precache( "material","objpoint_default");
34 
35 #namespace perplayer;
36 
37 // set id to be some unique string indicating the purpose of the callbacks.
38 function ‪init(id, playerBeginCallback, playerEndCallback)
39 {
40  handler = spawnstruct();
41  handler.id = id;
42  handler.playerBeginCallback = playerBeginCallback;
43  handler.playerEndCallback = playerEndCallback;
44  handler.enabled = false;
45  handler.players = [];
46 
47  thread ‪onPlayerConnect(handler);
48 
49  level.handlerGlobalFlagVal = 0;
50 
51  return handler;
52 }
53 
54 function ‪enable(handler)
55 {
56  if (handler.enabled)
57  return;
58  handler.enabled = true;
59 
60  level.handlerGlobalFlagVal++;
61  // mark all players with the global flag value; if a player isn't marked later on, we know they're not in the game.
62  // this could happen if they disconnected, causing this function to be called from elsewhere in script, but we haven't
63  // yet recieved the disconnect notify so they're still in the handler.players array.
64  players = GetPlayers();
65  for (i = 0; i < players.size; i++)
66  players[i].handlerFlagVal = level.handlerGlobalFlagVal;
67 
68  // handle all players who are ready to be handled
69  players = handler.players;
70 
71  ‪for (i = 0; i < players.size; i++) {
72  if (players[i].handlerFlagVal != level.handlerGlobalFlagVal)
73  continue;
74 
75  if (players[i].handlers[handler.id].ready)
76  players[i] ‪handlePlayer(handler);
77  }
78 }
79 function ‪disable(handler)
80 {
81  if (!handler.enabled)
82  return;
83  handler.enabled = false;
84 
85  level.handlerGlobalFlagVal++;
86  // mark all players with the global flag value; if a player isn't marked later on, we know they're not in the game.
87  // this could happen if they disconnected, causing this function to be called from elsewhere in script, but we haven't
88  // yet recieved the disconnect notify so they're still in the handler.players array.
89  players = GetPlayers();
90  for (i = 0; i < players.size; i++)
91  players[i].handlerFlagVal = level.handlerGlobalFlagVal;
92 
93  // unhandle all players who are being handled
94  players = handler.players;
95 
96  ‪for (i = 0; i < players.size; i++) {
97  if (players[i].handlerFlagVal != level.handlerGlobalFlagVal)
98  continue;
99 
100  if (players[i].handlers[handler.id].ready)
101  players[i] ‪unHandlePlayer(handler, false, false); // first false means don't set ready to false
102  }
103 }
104 
105 function ‪onPlayerConnect(handler)
106 {
107  for(;;)
108  {
109  level waittill("connecting", player);
110 
111  if (!isdefined(player.handlers))
112  player.handlers = [];
113  player.handlers[handler.id] = spawnstruct();
114  player.handlers[handler.id].ready = false;
115  player.handlers[handler.id].handled = false;
116  player.handlerFlagVal = -1;
117 
118  handler.players[handler.players.size] = player;
119 
120  player thread ‪onPlayerDisconnect(handler);
121 
122  player thread ‪onPlayerSpawned(handler);
123  player thread ‪onJoinedTeam(handler);
124  player thread ‪onJoinedSpectators(handler);
125  player thread ‪onPlayerKilled(handler);
126  }
127 }
128 function ‪onPlayerDisconnect(handler)
129 {
130  self waittill("disconnect");
131 
132  newplayers = [];
133  for (i = 0; i < handler.players.size; i++)
134  if (handler.players[i] != self)
135  newplayers[newplayers.size] = handler.players[i];
136  handler.players = newplayers;
137 
138  self thread ‪unHandlePlayer(handler, true, true);
139 }
140 
141 function ‪onJoinedTeam(handler)
142 {
143  self endon("disconnect");
144 
145  for(;;)
146  {
147  self waittill("joined_team");
148  self thread ‪unHandlePlayer(handler, true, false);
149  }
150 }
151 function ‪onJoinedSpectators(handler)
152 {
153  self endon("disconnect");
154 
155  for(;;)
156  {
157  self waittill("joined_spectators");
158  self thread ‪unHandlePlayer(handler, true, false);
159  }
160 }
161 function ‪onPlayerSpawned(handler)
162 {
163  self endon("disconnect");
164 
165  for(;;)
166  {
167  self waittill("spawned_player");
168  self thread ‪handlePlayer(handler);
169  }
170 }
171 function ‪onPlayerKilled(handler)
172 {
173  self endon("disconnect");
174 
175  for(;;)
176  {
177  self waittill("killed_player");
178  self thread ‪unHandlePlayer(handler, true, false);
179  }
180 }
181 
182 // ["_perplayer handler " + handler.id + " ready"] is set to true
183 // if this player would be handled, even if the handler is disabled.
184 // ["_perplayer handler " + handler.id + " handled"] is only set to true
185 // when the player is being handled *and* the handler is enabled
186 function ‪handlePlayer(handler)
187 {
188  self.handlers[handler.id].ready = true;
189 
190  if (!handler.enabled)
191  return;
192 
193  // if player already handled, stop
194  if (self.handlers[handler.id].handled)
195  return;
196  self.handlers[handler.id].handled = true;
197 
198  self thread [[handler.playerBeginCallback]]();
199 }
200 function ‪unHandlePlayer(handler, unsetready, disconnected)
201 {
202  if (!disconnected && unsetready)
203  self.handlers[handler.id].ready = false;
204 
205 
206 
207  // if player not handled, stop
208  if (!self.handlers[handler.id].handled)
209  return;
210  if (!disconnected)
211  self.handlers[handler.id].handled = false;
212 
213  self thread [[handler.playerEndCallback]](disconnected);
214 }
‪onPlayerKilled
‪function onPlayerKilled(handler)
Definition: _perplayer.gsc:171
‪enable
‪function enable(handler)
Definition: _perplayer.gsc:54
‪onJoinedTeam
‪function onJoinedTeam(handler)
Definition: _perplayer.gsc:141
‪unHandlePlayer
‪function unHandlePlayer(handler, unsetready, disconnected)
Definition: _perplayer.gsc:200
‪disable
‪function disable(handler)
Definition: _perplayer.gsc:79
‪for
‪for(i=a_keys.size - 1;i >=0;i--)
Definition: array_shared.gsc:79
‪onJoinedSpectators
‪function onJoinedSpectators(handler)
Definition: _perplayer.gsc:151
‪handlePlayer
‪function handlePlayer(handler)
Definition: _perplayer.gsc:186
‪onPlayerSpawned
‪function onPlayerSpawned(handler)
Definition: _perplayer.gsc:161
‪onPlayerConnect
‪function onPlayerConnect(handler)
Definition: _perplayer.gsc:105
‪onPlayerDisconnect
‪function onPlayerDisconnect(handler)
Definition: _perplayer.gsc:128
‪init
‪function init(id, playerBeginCallback, playerEndCallback)
Definition: _perplayer.gsc:38