1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// weapon.cpp: all shooting and effects code
#include "cube.h"
#import "Command.h"
#import "DynamicEntity.h"
#import "Monster.h"
#import "OFString+Cube.h"
#import "Projectile.h"
static const int MONSTERDAMAGEFACTOR = 4;
#define SGRAYS 20
static const float SGSPREAD = 2;
static OFVector3D sg[SGRAYS];
|
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// weapon.cpp: all shooting and effects code
#include "cube.h"
#import "Command.h"
#import "DynamicEntity.h"
#import "Monster.h"
#import "OFString+Cube.h"
#import "Player.h"
#import "Projectile.h"
static const int MONSTERDAMAGEFACTOR = 4;
#define SGRAYS 20
static const float SGSPREAD = 2;
static OFVector3D sg[SGRAYS];
|
︙ | | | ︙ | |
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
void
selectgun(int a, int b, int c)
{
if (a < -1 || b < -1 || c < -1 || a >= NUMGUNS || b >= NUMGUNS ||
c >= NUMGUNS)
return;
int s = player1.gunSelect;
if (a >= 0 && s != a && player1.ammo[a])
s = a;
else if (b >= 0 && s != b && player1.ammo[b])
s = b;
else if (c >= 0 && s != c && player1.ammo[c])
s = c;
|
>
>
|
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
void
selectgun(int a, int b, int c)
{
if (a < -1 || b < -1 || c < -1 || a >= NUMGUNS || b >= NUMGUNS ||
c >= NUMGUNS)
return;
Player *player1 = Player.player1;
int s = player1.gunSelect;
if (a >= 0 && s != a && player1.ammo[a])
s = a;
else if (b >= 0 && s != b && player1.ammo[b])
s = b;
else if (c >= 0 && s != c && player1.ammo[c])
s = c;
|
︙ | | | ︙ | |
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
OFString *
playerincrosshair()
{
if (demoplayback)
return NULL;
for (id player in players) {
if (player == [OFNull null])
continue;
OFVector3D o = player1.origin;
if (intersect(player, o, worldpos))
return [player name];
}
return nil;
}
|
>
|
|
<
|
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
OFString *
playerincrosshair()
{
if (demoplayback)
return NULL;
OFVector3D o = Player.player1.origin;
for (Player *player in players) {
if (![Player isKindOfClass:Player.class])
continue;
if (intersect(player, o, worldpos))
return [player name];
}
return nil;
}
|
︙ | | | ︙ | |
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
}
}
static void
hit(int target, int damage, __kindof DynamicEntity *d, DynamicEntity *at)
{
OFVector3D o = d.origin;
if (d == player1)
selfdamage(damage, at == player1 ? -1 : -2, at);
else if ([d isKindOfClass:Monster.class])
[d incurDamage:damage fromEntity:at];
else {
addmsg(1, 4, SV_DAMAGE, target, damage, d.lifeSequence);
playsound(S_PAIN1 + rnd(5), &o);
}
particle_splash(3, damage, 1000, o);
demodamage(damage, o);
}
const float RL_RADIUS = 5;
|
|
|
|
|
>
|
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
}
}
static void
hit(int target, int damage, __kindof DynamicEntity *d, DynamicEntity *at)
{
OFVector3D o = d.origin;
if (d == Player.player1)
selfdamage(damage, (at == Player.player1) ? -1 : -2, at);
else if ([d isKindOfClass:Monster.class])
[d incurDamage:damage fromEntity:at];
else if ([d isKindOfClass:Player.class]) {
addmsg(1, 4, SV_DAMAGE, target, damage,
((Player *)d).lifeSequence);
playsound(S_PAIN1 + rnd(5), &o);
}
particle_splash(3, damage, 1000, o);
demodamage(damage, o);
}
const float RL_RADIUS = 5;
|
︙ | | | ︙ | |
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
playsound(S_RLHIT, &v);
newsphere(v, RL_RADIUS, 0);
dodynlight(vold, v, 0, 0, p.owner);
if (!p.local)
return;
radialeffect(player1, v, -1, qdam, p.owner);
[players enumerateObjectsUsingBlock:^(
id player, size_t i, bool *stop) {
if (i == notthisplayer)
return;
if (player == [OFNull null])
|
|
|
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
playsound(S_RLHIT, &v);
newsphere(v, RL_RADIUS, 0);
dodynlight(vold, v, 0, 0, p.owner);
if (!p.local)
return;
radialeffect(Player.player1, v, -1, qdam, p.owner);
[players enumerateObjectsUsingBlock:^(
id player, size_t i, bool *stop) {
if (i == notthisplayer)
return;
if (player == [OFNull null])
|
︙ | | | ︙ | |
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
|
v = OFMultiplyVector3D(v, time / dtime);
v = OFAddVectors3D(v, po);
if (p.local) {
for (id player in players)
if (player != [OFNull null])
projdamage(player, p, v, i, -1, qdam);
if (p.owner != player1)
projdamage(player1, p, v, -1, -1, qdam);
for (Monster *monster in Monster.monsters)
if (!vreject(monster.origin, v, 10.0f) &&
monster != p.owner)
projdamage(monster, p, v, -1, i, qdam);
}
if (p.inuse) {
|
|
|
|
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
v = OFMultiplyVector3D(v, time / dtime);
v = OFAddVectors3D(v, po);
if (p.local) {
for (id player in players)
if (player != [OFNull null])
projdamage(player, p, v, i, -1, qdam);
if (p.owner != Player.player1)
projdamage(Player.player1, p, v, -1, -1, qdam);
for (Monster *monster in Monster.monsters)
if (!vreject(monster.origin, v, 10.0f) &&
monster != p.owner)
projdamage(monster, p, v, -1, i, qdam);
}
if (p.inuse) {
|
︙ | | | ︙ | |
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
}
// create visual effect from a shot
void
shootv(int gun, OFVector3D from, OFVector3D to, DynamicEntity *d, bool local)
{
OFVector3D loc = d.origin;
playsound(guns[gun].sound, d == player1 ? NULL : &loc);
int pspeed = 25;
switch (gun) {
case GUN_FIST:
break;
case GUN_SG: {
for (int i = 0; i < SGRAYS; i++)
|
|
|
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
|
}
// create visual effect from a shot
void
shootv(int gun, OFVector3D from, OFVector3D to, DynamicEntity *d, bool local)
{
OFVector3D loc = d.origin;
playsound(guns[gun].sound, (d == Player.player1) ? NULL : &loc);
int pspeed = 25;
switch (gun) {
case GUN_FIST:
break;
case GUN_SG: {
for (int i = 0; i < SGRAYS; i++)
|
︙ | | | ︙ | |
434
435
436
437
438
439
440
441
442
|
}];
for (Monster *monster in Monster.monsters)
if (monster != d)
raydamage(monster, from, to, d, -2);
if ([d isKindOfClass:Monster.class])
raydamage(player1, from, to, d, -1);
}
|
|
|
438
439
440
441
442
443
444
445
446
|
}];
for (Monster *monster in Monster.monsters)
if (monster != d)
raydamage(monster, from, to, d, -2);
if ([d isKindOfClass:Monster.class])
raydamage(Player.player1, from, to, d, -1);
}
|