1
2
3
4
5
6
7
8
9
10
11
12
|
// weapon.cpp: all shooting and effects code
#include "cube.h"
#import "DynamicEntity.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
|
// weapon.cpp: all shooting and effects code
#include "cube.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];
|
︙ | | | ︙ | |
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
p.owner = owner;
p.gun = gun;
return;
}
}
void
hit(int target, int damage, DynamicEntity *d, DynamicEntity *at)
{
OFVector3D o = d.origin;
if (d == player1)
selfdamage(damage, at == player1 ? -1 : -2, at);
else if (d.monsterState)
monsterpain(d, damage, 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);
}
|
|
|
|
|
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
p.owner = owner;
p.gun = gun;
return;
}
}
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);
}
|
︙ | | | ︙ | |
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
|
if (player == [OFNull null])
return;
radialeffect(player, v, i, qdam, p.owner);
}];
[getmonsters() enumerateObjectsUsingBlock:^(
DynamicEntity *monster, size_t i, bool *stop) {
if (i != notthismonster)
radialeffect(monster, v, i, qdam, p.owner);
}];
}
}
static inline void
|
|
|
|
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
if (player == [OFNull null])
return;
radialeffect(player, v, i, qdam, p.owner);
}];
[Monster.monsters enumerateObjectsUsingBlock:^(
Monster *monster, size_t i, bool *stop) {
if (i != notthismonster)
radialeffect(monster, v, i, qdam, p.owner);
}];
}
}
static inline void
|
︙ | | | ︙ | |
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
|
for (size_t i = 0; i < MAXPROJ; i++) {
Projectile *p = projs[i];
if (!p.inuse)
continue;
int qdam = guns[p.gun].damage * (p.owner.quadMillis ? 4 : 1);
if (p.owner.monsterState)
qdam /= MONSTERDAMAGEFACTOR;
vdist(dist, v, p.o, p.to);
float dtime = dist * 1000 / p.speed;
if (time > dtime)
dtime = time;
vmul(v, time / dtime);
vadd(v, p.o);
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 (DynamicEntity *monster in getmonsters())
if (!vreject(monster.origin, v, 10.0f) &&
monster != p.owner)
projdamage(monster, p, &v, -1, i, qdam);
}
if (p.inuse) {
OFVector3D po = p.o;
|
|
|
|
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
for (size_t i = 0; i < MAXPROJ; i++) {
Projectile *p = projs[i];
if (!p.inuse)
continue;
int qdam = guns[p.gun].damage * (p.owner.quadMillis ? 4 : 1);
if ([p.owner isKindOfClass:Monster.class])
qdam /= MONSTERDAMAGEFACTOR;
vdist(dist, v, p.o, p.to);
float dtime = dist * 1000 / p.speed;
if (time > dtime)
dtime = time;
vmul(v, time / dtime);
vadd(v, p.o);
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) {
OFVector3D po = p.o;
|
︙ | | | ︙ | |
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
break;
case GUN_RL:
case GUN_FIREBALL:
case GUN_ICEBALL:
case GUN_SLIMEBALL:
pspeed = guns[gun].projspeed;
if (d.monsterState)
pspeed /= 2;
newprojectile(from, to, (float)pspeed, local, d, gun);
break;
case GUN_RIFLE:
particle_splash(0, 50, 200, to);
particle_trail(1, 500, from, to);
|
|
|
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
|
break;
case GUN_RL:
case GUN_FIREBALL:
case GUN_ICEBALL:
case GUN_SLIMEBALL:
pspeed = guns[gun].projspeed;
if ([d isKindOfClass:Monster.class])
pspeed /= 2;
newprojectile(from, to, (float)pspeed, local, d, gun);
break;
case GUN_RIFLE:
particle_splash(0, 50, 200, to);
particle_trail(1, 500, from, to);
|
︙ | | | ︙ | |
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
|
DynamicEntity *d, int i)
{
if (o.state != CS_ALIVE)
return;
int qdam = guns[d.gunSelect].damage;
if (d.quadMillis)
qdam *= 4;
if (d.monsterState)
qdam /= MONSTERDAMAGEFACTOR;
if (d.gunSelect == GUN_SG) {
int damage = 0;
loop(r, SGRAYS) if (intersect(o, from, &sg[r])) damage += qdam;
if (damage)
hitpush(i, damage, o, d, from, to);
} else if (intersect(o, from, to))
|
|
|
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
|
DynamicEntity *d, int i)
{
if (o.state != CS_ALIVE)
return;
int qdam = guns[d.gunSelect].damage;
if (d.quadMillis)
qdam *= 4;
if ([d isKindOfClass:Monster.class])
qdam /= MONSTERDAMAGEFACTOR;
if (d.gunSelect == GUN_SG) {
int damage = 0;
loop(r, SGRAYS) if (intersect(o, from, &sg[r])) damage += qdam;
if (damage)
hitpush(i, damage, o, d, from, to);
} else if (intersect(o, from, to))
|
︙ | | | ︙ | |
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
|
}
if (d.gunSelect == GUN_SG)
createrays(&from, &to);
if (d.quadMillis && attacktime > 200)
playsoundc(S_ITEMPUP);
shootv(d.gunSelect, &from, &to, d, true);
if (!d.monsterState)
addmsg(1, 8, SV_SHOT, d.gunSelect, (int)(from.x * DMF),
(int)(from.y * DMF), (int)(from.z * DMF), (int)(to.x * DMF),
(int)(to.y * DMF), (int)(to.z * DMF));
d.gunWait = guns[d.gunSelect].attackdelay;
if (guns[d.gunSelect].projspeed)
return;
[players enumerateObjectsUsingBlock:^(id player, size_t i, bool *stop) {
if (player != [OFNull null])
raydamage(player, &from, &to, d, i);
}];
for (DynamicEntity *monster in getmonsters())
if (monster != d)
raydamage(monster, &from, &to, d, -2);
if (d.monsterState)
raydamage(player1, &from, &to, d, -1);
}
|
|
|
|
|
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
|
}
if (d.gunSelect == GUN_SG)
createrays(&from, &to);
if (d.quadMillis && attacktime > 200)
playsoundc(S_ITEMPUP);
shootv(d.gunSelect, &from, &to, d, true);
if (![d isKindOfClass:Monster.class])
addmsg(1, 8, SV_SHOT, d.gunSelect, (int)(from.x * DMF),
(int)(from.y * DMF), (int)(from.z * DMF), (int)(to.x * DMF),
(int)(to.y * DMF), (int)(to.z * DMF));
d.gunWait = guns[d.gunSelect].attackdelay;
if (guns[d.gunSelect].projspeed)
return;
[players enumerateObjectsUsingBlock:^(id player, size_t i, bool *stop) {
if (player != [OFNull null])
raydamage(player, &from, &to, d, i);
}];
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);
}
|