SVN r258 (trunk)

This commit is contained in:
Christoph Oelckers 2006-07-16 09:10:45 +00:00
parent 1391b28643
commit ecce60e8f9
90 changed files with 326 additions and 309 deletions

View file

@ -1,3 +1,16 @@
July 16, 2006 (Changes by Graf Zahl)
- Fixed: PlayerStartItem created a duplicate of the item's class name before
converting it into an FName.
- Removed game check for Doom from P_BloodSplatter. The BloodSplatter actor
is compatible with all games now so the explicit handling is no longer needed.
- Moved replacement handling back into AActor::StaticSpawn but controlled
by a (mandatory) parameter. Also added replacement to most other
instances in the game where non-inventory items are spawned. Replacement is safe
nearly everywhere except for inventory related spawns.
- Fixed: Due to the player class inclusion A_NoBlocking never called
NoBlockingSet for monsters.
- Changed: Sounds can be specified by full path now in SNDINFO and S_SKIN.
July 15, 2006 July 15, 2006
- Fixed: Makefile.mgw was mysteriously missing some targets. After fixing that, - Fixed: Makefile.mgw was mysteriously missing some targets. After fixing that,
I also removed some of GCC's warnings. I also removed some of GCC's warnings.

View file

@ -352,6 +352,13 @@ enum ERenderStyle
#define HX_SHADOW (0x9800) #define HX_SHADOW (0x9800)
#define HX_ALTSHADOW (0x6800) #define HX_ALTSHADOW (0x6800)
// This could easily be a bool but then it'd be much harder to find later. ;)
enum replace_t
{
NO_REPLACE = 0,
ALLOW_REPLACE = 1
};
// [RH] Like msecnode_t, but for the blockmap // [RH] Like msecnode_t, but for the blockmap
struct FBlockNode struct FBlockNode
{ {
@ -421,7 +428,7 @@ public:
void Serialize (FArchive &arc); void Serialize (FArchive &arc);
static AActor *StaticSpawn (const PClass *type, fixed_t x, fixed_t y, fixed_t z); static AActor *StaticSpawn (const PClass *type, fixed_t x, fixed_t y, fixed_t z, replace_t allowreplacement);
inline AActor *GetDefault () const inline AActor *GetDefault () const
{ {
@ -788,20 +795,20 @@ public:
} }
}; };
inline AActor *Spawn (const PClass *type, fixed_t x, fixed_t y, fixed_t z) inline AActor *Spawn (const PClass *type, fixed_t x, fixed_t y, fixed_t z, replace_t allowreplacement)
{ {
return AActor::StaticSpawn (type, x, y, z); return AActor::StaticSpawn (type, x, y, z, allowreplacement);
} }
inline AActor *Spawn (const char *type, fixed_t x, fixed_t y, fixed_t z) inline AActor *Spawn (const char *type, fixed_t x, fixed_t y, fixed_t z, replace_t allowreplacement)
{ {
return AActor::StaticSpawn (PClass::FindClass(type), x, y, z); return AActor::StaticSpawn (PClass::FindClass(type), x, y, z, allowreplacement);
} }
template<class T> template<class T>
inline T *Spawn (fixed_t x, fixed_t y, fixed_t z) inline T *Spawn (fixed_t x, fixed_t y, fixed_t z, replace_t allowreplacement)
{ {
return static_cast<T *>(AActor::StaticSpawn (RUNTIME_CLASS(T), x, y, z)); return static_cast<T *>(AActor::StaticSpawn (RUNTIME_CLASS(T), x, y, z, allowreplacement));
} }
#define S_FREETARGMOBJ 1 #define S_FREETARGMOBJ 1

View file

@ -464,14 +464,14 @@ void DCajunMaster::SetBodyAt (fixed_t x, fixed_t y, fixed_t z, int hostnum)
if (body1) if (body1)
body1->SetOrigin (x, y, z); body1->SetOrigin (x, y, z);
else else
body1 = Spawn<ACajunBodyNode> (x, y, z); body1 = Spawn<ACajunBodyNode> (x, y, z, NO_REPLACE);
} }
else if (hostnum == 2) else if (hostnum == 2)
{ {
if (body2) if (body2)
body2->SetOrigin (x, y, z); body2->SetOrigin (x, y, z);
else else
body2 = Spawn<ACajunBodyNode> (x, y, z); body2 = Spawn<ACajunBodyNode> (x, y, z, NO_REPLACE);
} }
} }
@ -499,7 +499,7 @@ END_DEFAULTS
//Emulates missile travel. Returns distance travelled. //Emulates missile travel. Returns distance travelled.
fixed_t DCajunMaster::FakeFire (AActor *source, AActor *dest, ticcmd_t *cmd) fixed_t DCajunMaster::FakeFire (AActor *source, AActor *dest, ticcmd_t *cmd)
{ {
AActor *th = Spawn<ACajunTrace> (source->x, source->y, source->z + 4*8*FRACUNIT); AActor *th = Spawn<ACajunTrace> (source->x, source->y, source->z + 4*8*FRACUNIT, NO_REPLACE);
th->target = source; // where it came from th->target = source; // where it came from

View file

@ -2595,7 +2595,7 @@ void A_SpawnDehackedPickup (AActor *actor)
{ {
if ((size_t)actor->health < DehackedPickups.Size()) if ((size_t)actor->health < DehackedPickups.Size())
{ {
AActor *real = Spawn (DehackedPickups[actor->health], actor->x, actor->y, actor->z); AActor *real = Spawn (DehackedPickups[actor->health], actor->x, actor->y, actor->z, NO_REPLACE);
if (real != NULL) if (real != NULL)
{ {
// Copy properties from the original item to the dehacked pickup it spawns // Copy properties from the original item to the dehacked pickup it spawns
@ -2621,7 +2621,7 @@ bool ADehackedPickup::TryPickup (AActor *toucher)
{ {
return false; return false;
} }
RealPickup = static_cast<AInventory *>(Spawn (type, x, y, z)); RealPickup = static_cast<AInventory *>(Spawn (type, x, y, z, NO_REPLACE));
if (RealPickup != NULL) if (RealPickup != NULL)
{ {
if (!(flags & MF_DROPPED)) if (!(flags & MF_DROPPED))

View file

@ -2112,9 +2112,6 @@ void Net_DoCommand (int type, byte **stream, int player)
typeinfo = PClass::FindClass (s); typeinfo = PClass::FindClass (s);
if (typeinfo != NULL && typeinfo->ActorInfo != NULL) if (typeinfo != NULL && typeinfo->ActorInfo != NULL)
{ {
// Handle decorate replacements.
typeinfo = typeinfo->ActorInfo->GetReplacement()->Class;
AActor *source = players[player].mo; AActor *source = players[player].mo;
if (source != NULL) if (source != NULL)
{ {
@ -2128,7 +2125,7 @@ void Net_DoCommand (int type, byte **stream, int player)
AActor *spawned = Spawn (typeinfo, AActor *spawned = Spawn (typeinfo,
source->x + FixedMul (def->radius * 2 + source->radius, finecosine[source->angle>>ANGLETOFINESHIFT]), source->x + FixedMul (def->radius * 2 + source->radius, finecosine[source->angle>>ANGLETOFINESHIFT]),
source->y + FixedMul (def->radius * 2 + source->radius, finesine[source->angle>>ANGLETOFINESHIFT]), source->y + FixedMul (def->radius * 2 + source->radius, finesine[source->angle>>ANGLETOFINESHIFT]),
source->z + 8 * FRACUNIT); source->z + 8 * FRACUNIT, ALLOW_REPLACE);
if (spawned != NULL && type == DEM_SUMMONFRIEND) if (spawned != NULL && type == DEM_SUMMONFRIEND)
{ {
spawned->FriendPlayer = player + 1; spawned->FriendPlayer = player + 1;

View file

@ -354,7 +354,7 @@ void A_VileTarget (AActor *actor)
A_FaceTarget (actor); A_FaceTarget (actor);
fog = Spawn<AArchvileFire> (actor->target->x, actor->target->x, fog = Spawn<AArchvileFire> (actor->target->x, actor->target->x,
actor->target->z); actor->target->z, ALLOW_REPLACE);
actor->tracer = fog; actor->tracer = fog;
fog->target = actor; fog->target = actor;

View file

@ -184,7 +184,7 @@ void A_BrainPain (AActor *self)
static void BrainishExplosion (fixed_t x, fixed_t y, fixed_t z) static void BrainishExplosion (fixed_t x, fixed_t y, fixed_t z)
{ {
AActor *boom = Spawn<ARocket> (x, y, z); AActor *boom = Spawn<ARocket> (x, y, z, NO_REPLACE);
if (boom != NULL) if (boom != NULL)
{ {
boom->momz = pr_brainscream() << 9; boom->momz = pr_brainscream() << 9;
@ -281,7 +281,7 @@ void A_SpawnFly (AActor *self)
targ = self->target; targ = self->target;
// First spawn teleport fire. // First spawn teleport fire.
fog = Spawn<ASpawnFire> (targ->x, targ->y, targ->z); fog = Spawn<ASpawnFire> (targ->x, targ->y, targ->z, ALLOW_REPLACE);
S_Sound (fog, CHAN_BODY, "brain/spawn", 1, ATTN_NORM); S_Sound (fog, CHAN_BODY, "brain/spawn", 1, ATTN_NORM);
// Randomly select monster to spawn. // Randomly select monster to spawn.
@ -301,7 +301,7 @@ void A_SpawnFly (AActor *self)
else if (r < 246) type = "HellKnight"; else if (r < 246) type = "HellKnight";
else type = "BaronOfHell"; else type = "BaronOfHell";
newmobj = Spawn (type, targ->x, targ->y, targ->z); newmobj = Spawn (type, targ->x, targ->y, targ->z, ALLOW_REPLACE);
if (newmobj != NULL) if (newmobj != NULL)
{ {
// Make the new monster hate what the boss eye hates // Make the new monster hate what the boss eye hates

View file

@ -22,7 +22,7 @@ public:
{ {
player_t *player = Owner->player; player_t *player = Owner->player;
ABasicArmorPickup *armor = static_cast<ABasicArmorPickup *> (Spawn ("BlueArmor", 0,0,0)); ABasicArmorPickup *armor = static_cast<ABasicArmorPickup *> (Spawn ("BlueArmor", 0,0,0, NO_REPLACE));
if (!armor->TryPickup (Owner)) if (!armor->TryPickup (Owner))
{ {
armor->Destroy (); armor->Destroy ();

View file

@ -81,7 +81,7 @@ void A_BarrelRespawn (AActor *actor)
actor->flags2 = defs->flags2; actor->flags2 = defs->flags2;
actor->SetState (actor->SpawnState); actor->SetState (actor->SpawnState);
actor->renderflags &= ~RF_INVISIBLE; actor->renderflags &= ~RF_INVISIBLE;
Spawn<ATeleportFog> (x, y, actor->z + TELEFOGHEIGHT); Spawn<ATeleportFog> (x, y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
} }
else else
{ {

View file

@ -1080,7 +1080,7 @@ void A_BFGSpray (AActor *mo)
continue; continue;
Spawn (spraytype, linetarget->x, linetarget->y, Spawn (spraytype, linetarget->x, linetarget->y,
linetarget->z + (linetarget->height>>2)); linetarget->z + (linetarget->height>>2), ALLOW_REPLACE);
damage = 0; damage = 0;
for (j = 0; j < damagecnt; ++j) for (j = 0; j < damagecnt; ++j)

View file

@ -167,7 +167,7 @@ void A_PainShootSkull (AActor *self, angle_t angle)
return; return;
} }
other = Spawn (spawntype, x, y, z); other = Spawn (spawntype, x, y, z, ALLOW_REPLACE);
// Check to see if the new Lost Soul's z value is above the // Check to see if the new Lost Soul's z value is above the

View file

@ -207,7 +207,7 @@ void A_Tracer (AActor *self)
P_SpawnPuff (RUNTIME_CLASS(ABulletPuff), self->x, self->y, self->z, 0, 3); P_SpawnPuff (RUNTIME_CLASS(ABulletPuff), self->x, self->y, self->z, 0, 3);
smoke = Spawn<ARevenantTracerSmoke> (self->x - self->momx, smoke = Spawn<ARevenantTracerSmoke> (self->x - self->momx,
self->y - self->momy, self->z); self->y - self->momy, self->z, ALLOW_REPLACE);
smoke->momz = FRACUNIT; smoke->momz = FRACUNIT;
smoke->tics -= pr_tracer()&3; smoke->tics -= pr_tracer()&3;

View file

@ -211,6 +211,6 @@ void A_BeastPuff (AActor *actor)
x = actor->x + (pr_beastpuff.Random2 () << 10); x = actor->x + (pr_beastpuff.Random2 () << 10);
y = actor->y + (pr_beastpuff.Random2 () << 10); y = actor->y + (pr_beastpuff.Random2 () << 10);
z = actor->z + (pr_beastpuff.Random2 () << 10); z = actor->z + (pr_beastpuff.Random2 () << 10);
Spawn<APuffy> (x, y, z); Spawn<APuffy> (x, y, z, ALLOW_REPLACE);
} }
} }

View file

@ -420,7 +420,7 @@ void A_Feathers (AActor *actor)
} }
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
mo = Spawn<AFeather> (actor->x, actor->y, actor->z+20*FRACUNIT); mo = Spawn<AFeather> (actor->x, actor->y, actor->z+20*FRACUNIT, NO_REPLACE);
mo->target = actor; mo->target = actor;
mo->momx = pr_feathers.Random2() << 8; mo->momx = pr_feathers.Random2() << 8;
mo->momy = pr_feathers.Random2() << 8; mo->momy = pr_feathers.Random2() << 8;

View file

@ -511,7 +511,7 @@ void A_SorcererRise (AActor *actor)
AActor *mo; AActor *mo;
actor->flags &= ~MF_SOLID; actor->flags &= ~MF_SOLID;
mo = Spawn<ASorcerer2> (actor->x, actor->y, actor->z); mo = Spawn<ASorcerer2> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (&ASorcerer2::States[S_SOR2_RISE]); mo->SetState (&ASorcerer2::States[S_SOR2_RISE]);
mo->angle = actor->angle; mo->angle = actor->angle;
mo->CopyFriendliness (actor, true); mo->CopyFriendliness (actor, true);
@ -563,7 +563,7 @@ void P_DSparilTeleport (AActor *actor)
prevZ = actor->z; prevZ = actor->z;
if (P_TeleportMove (actor, spot->x, spot->y, spot->z, false)) if (P_TeleportMove (actor, spot->x, spot->y, spot->z, false))
{ {
mo = Spawn<ASorcerer2Telefade> (prevX, prevY, prevZ); mo = Spawn<ASorcerer2Telefade> (prevX, prevY, prevZ, ALLOW_REPLACE);
S_Sound (mo, CHAN_BODY, "misc/teleport", 1, ATTN_NORM); S_Sound (mo, CHAN_BODY, "misc/teleport", 1, ATTN_NORM);
actor->SetState (&ASorcerer2::States[S_SOR2_TELE]); actor->SetState (&ASorcerer2::States[S_SOR2_TELE]);
S_Sound (actor, CHAN_BODY, "misc/teleport", 1, ATTN_NORM); S_Sound (actor, CHAN_BODY, "misc/teleport", 1, ATTN_NORM);
@ -648,7 +648,7 @@ void A_BlueSpark (AActor *actor)
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
mo = Spawn<ASorcerer2FXSpark> (actor->x, actor->y, actor->z); mo = Spawn<ASorcerer2FXSpark> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->momx = pr_bluespark.Random2() << 9; mo->momx = pr_bluespark.Random2() << 9;
mo->momy = pr_bluespark.Random2() << 9; mo->momy = pr_bluespark.Random2() << 9;
mo->momz = FRACUNIT + (pr_bluespark()<<8); mo->momz = FRACUNIT + (pr_bluespark()<<8);
@ -665,7 +665,7 @@ void A_GenWizard (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<AWizard> (actor->x, actor->y, actor->z - GetDefault<AWizard>()->height/2); mo = Spawn<AWizard> (actor->x, actor->y, actor->z - GetDefault<AWizard>()->height/2, ALLOW_REPLACE);
if (mo != NULL) if (mo != NULL)
{ {
if (!P_TestMobjLocation (mo)) if (!P_TestMobjLocation (mo))
@ -682,7 +682,7 @@ void A_GenWizard (AActor *actor)
actor->flags &= ~MF_MISSILE; actor->flags &= ~MF_MISSILE;
mo->master = actor->target; mo->master = actor->target;
// Heretic did not offset it by TELEFOGHEIGHT, so I won't either. // Heretic did not offset it by TELEFOGHEIGHT, so I won't either.
Spawn<ATeleportFog> (actor->x, actor->y, actor->z); Spawn<ATeleportFog> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
} }
} }
} }

View file

@ -118,7 +118,7 @@ bool AArtiTimeBomb::Use (bool pickup)
AActor *mo = Spawn<AActivatedTimeBomb> ( AActor *mo = Spawn<AActivatedTimeBomb> (
Owner->x + 24*finecosine[angle], Owner->x + 24*finecosine[angle],
Owner->y + 24*finesine[angle], Owner->y + 24*finesine[angle],
Owner->z - Owner->floorclip); Owner->z - Owner->floorclip, ALLOW_REPLACE);
mo->target = Owner; mo->target = Owner;
return true; return true;
} }

View file

@ -233,12 +233,12 @@ void A_ImpExplode (AActor *self)
self->flags &= ~MF_NOGRAVITY; self->flags &= ~MF_NOGRAVITY;
chunk = Spawn<AHereticImpChunk1> (self->x, self->y, self->z); chunk = Spawn<AHereticImpChunk1> (self->x, self->y, self->z, ALLOW_REPLACE);
chunk->momx = pr_imp.Random2 () << 10; chunk->momx = pr_imp.Random2 () << 10;
chunk->momy = pr_imp.Random2 () << 10; chunk->momy = pr_imp.Random2 () << 10;
chunk->momz = 9*FRACUNIT; chunk->momz = 9*FRACUNIT;
chunk = Spawn<AHereticImpChunk2> (self->x, self->y, self->z); chunk = Spawn<AHereticImpChunk2> (self->x, self->y, self->z, ALLOW_REPLACE);
chunk->momx = pr_imp.Random2 () << 10; chunk->momx = pr_imp.Random2 () << 10;
chunk->momy = pr_imp.Random2 () << 10; chunk->momy = pr_imp.Random2 () << 10;
chunk->momz = 9*FRACUNIT; chunk->momz = 9*FRACUNIT;

View file

@ -103,7 +103,7 @@ void A_InitKeyGizmo (AActor *gizmo)
{ {
AActor *floater; AActor *floater;
floater = Spawn<AKeyGizmoFloat> (gizmo->x, gizmo->y, gizmo->z+60*FRACUNIT); floater = Spawn<AKeyGizmoFloat> (gizmo->x, gizmo->y, gizmo->z+60*FRACUNIT, NO_REPLACE);
floater->SetState (&AKeyGizmoFloat:: floater->SetState (&AKeyGizmoFloat::
States[static_cast<AKeyGizmo *>(gizmo)->GetFloatState ()]); States[static_cast<AKeyGizmo *>(gizmo)->GetFloatState ()]);
} }

View file

@ -158,7 +158,7 @@ void A_PodPain (AActor *actor)
} }
for (count = chance > 240 ? 2 : 1; count; count--) for (count = chance > 240 ? 2 : 1; count; count--)
{ {
goo = Spawn<APodGoo> (actor->x, actor->y, actor->z + 48*FRACUNIT); goo = Spawn<APodGoo> (actor->x, actor->y, actor->z + 48*FRACUNIT, ALLOW_REPLACE);
goo->target = actor; goo->target = actor;
goo->momx = pr_podpain.Random2() << 9; goo->momx = pr_podpain.Random2() << 9;
goo->momy = pr_podpain.Random2() << 9; goo->momy = pr_podpain.Random2() << 9;
@ -207,7 +207,7 @@ void A_MakePod (AActor *actor)
x = actor->x; x = actor->x;
y = actor->y; y = actor->y;
z = actor->z; z = actor->z;
mo = Spawn<APod> (x, y, ONFLOORZ); mo = Spawn<APod> (x, y, ONFLOORZ, ALLOW_REPLACE);
if (P_CheckPosition (mo, x, y) == false) if (P_CheckPosition (mo, x, y) == false)
{ // Didn't fit { // Didn't fit
mo->Destroy (); mo->Destroy ();
@ -322,7 +322,7 @@ void A_SpawnTeleGlitter (AActor *actor)
fixed_t y = actor->y+((pr_teleg()&31)-16)*FRACUNIT; fixed_t y = actor->y+((pr_teleg()&31)-16)*FRACUNIT;
mo = Spawn<ATeleGlitter1> (x, y, mo = Spawn<ATeleGlitter1> (x, y,
actor->Sector->floorplane.ZatPoint (actor->x, actor->y)); actor->Sector->floorplane.ZatPoint (actor->x, actor->y), ALLOW_REPLACE);
mo->momz = FRACUNIT/4; mo->momz = FRACUNIT/4;
} }
@ -339,7 +339,7 @@ void A_SpawnTeleGlitter2 (AActor *actor)
fixed_t y = actor->y+((pr_teleg2()&31)-16)*FRACUNIT; fixed_t y = actor->y+((pr_teleg2()&31)-16)*FRACUNIT;
mo = Spawn<ATeleGlitter2> (x, y, mo = Spawn<ATeleGlitter2> (x, y,
actor->Sector->floorplane.ZatPoint (actor->x, actor->y)); actor->Sector->floorplane.ZatPoint (actor->x, actor->y), ALLOW_REPLACE);
mo->momz = FRACUNIT/4; mo->momz = FRACUNIT/4;
} }
@ -493,7 +493,7 @@ void A_VolcanoBlast (AActor *volcano)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
blast = Spawn<AVolcanoBlast> (volcano->x, volcano->y, blast = Spawn<AVolcanoBlast> (volcano->x, volcano->y,
volcano->z + 44*FRACUNIT); volcano->z + 44*FRACUNIT, ALLOW_REPLACE);
blast->target = volcano; blast->target = volcano;
angle = pr_blast () << 24; angle = pr_blast () << 24;
blast->angle = angle; blast->angle = angle;
@ -528,7 +528,7 @@ void A_VolcBallImpact (AActor *ball)
P_RadiusAttack (ball, ball->target, 25, 25, MOD_FIRE, true); P_RadiusAttack (ball, ball->target, 25, 25, MOD_FIRE, true);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
tiny = Spawn<AVolcanoTBlast> (ball->x, ball->y, ball->z); tiny = Spawn<AVolcanoTBlast> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
tiny->target = ball; tiny->target = ball;
angle = i*ANG90; angle = i*ANG90;
tiny->angle = angle; tiny->angle = angle;

View file

@ -203,7 +203,7 @@ void A_SkullPop (AActor *actor)
spawntype = RUNTIME_CLASS (ABloodySkull); spawntype = RUNTIME_CLASS (ABloodySkull);
actor->flags &= ~MF_SOLID; actor->flags &= ~MF_SOLID;
mo = (APlayerPawn *)Spawn (spawntype, actor->x, actor->y, actor->z + 48*FRACUNIT); mo = (APlayerPawn *)Spawn (spawntype, actor->x, actor->y, actor->z + 48*FRACUNIT, NO_REPLACE);
//mo->target = actor; //mo->target = actor;
mo->momx = pr_skullpop.Random2() << 9; mo->momx = pr_skullpop.Random2() << 9;
mo->momy = pr_skullpop.Random2() << 9; mo->momy = pr_skullpop.Random2() << 9;

View file

@ -779,7 +779,7 @@ void A_BoltSpark (AActor *bolt)
if (pr_boltspark() > 50) if (pr_boltspark() > 50)
{ {
spark = Spawn<ACrossbowFX4> (bolt->x, bolt->y, bolt->z); spark = Spawn<ACrossbowFX4> (bolt->x, bolt->y, bolt->z, ALLOW_REPLACE);
spark->x += pr_boltspark.Random2() << 10; spark->x += pr_boltspark.Random2() << 10;
spark->y += pr_boltspark.Random2() << 10; spark->y += pr_boltspark.Random2() << 10;
} }
@ -1093,7 +1093,7 @@ void A_SpawnMace (AActor *self)
{ // Sometimes doesn't show up if not in deathmatch { // Sometimes doesn't show up if not in deathmatch
return; return;
} }
mace = Spawn<AMace> (self->x, self->y, self->z); mace = Spawn<AMace> (self->x, self->y, self->z, ALLOW_REPLACE);
if (mace) if (mace)
{ {
mace->FirstSpot = firstSpot; mace->FirstSpot = firstSpot;
@ -1150,7 +1150,7 @@ void A_FireMacePL1B (AActor *actor)
} }
pmo = player->mo; pmo = player->mo;
ball = Spawn<AMaceFX2> (pmo->x, pmo->y, pmo->z + 28*FRACUNIT ball = Spawn<AMaceFX2> (pmo->x, pmo->y, pmo->z + 28*FRACUNIT
- pmo->floorclip); - pmo->floorclip, ALLOW_REPLACE);
ball->momz = 2*FRACUNIT+/*((player->lookdir)<<(FRACBITS-5))*/ ball->momz = 2*FRACUNIT+/*((player->lookdir)<<(FRACBITS-5))*/
finetangent[FINEANGLES/4-(pmo->pitch>>ANGLETOFINESHIFT)]; finetangent[FINEANGLES/4-(pmo->pitch>>ANGLETOFINESHIFT)];
angle = pmo->angle; angle = pmo->angle;
@ -1295,7 +1295,7 @@ void A_MaceBallImpact2 (AActor *ball)
ball->momz = (ball->momz * 192) >> 8; ball->momz = (ball->momz * 192) >> 8;
ball->SetState (ball->SpawnState); ball->SetState (ball->SpawnState);
tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z); tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
angle = ball->angle+ANG90; angle = ball->angle+ANG90;
tiny->target = ball->target; tiny->target = ball->target;
tiny->angle = angle; tiny->angle = angle;
@ -1307,7 +1307,7 @@ void A_MaceBallImpact2 (AActor *ball)
tiny->momz = ball->momz; tiny->momz = ball->momz;
P_CheckMissileSpawn (tiny); P_CheckMissileSpawn (tiny);
tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z); tiny = Spawn<AMaceFX3> (ball->x, ball->y, ball->z, ALLOW_REPLACE);
angle = ball->angle-ANG90; angle = ball->angle-ANG90;
tiny->target = ball->target; tiny->target = ball->target;
tiny->angle = angle; tiny->angle = angle;
@ -2020,7 +2020,7 @@ void A_SpawnRippers (AActor *actor)
for(i = 0; i < 8; i++) for(i = 0; i < 8; i++)
{ {
ripper = Spawn<ARipper> (actor->x, actor->y, actor->z); ripper = Spawn<ARipper> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
angle = i*ANG45; angle = i*ANG45;
ripper->target = actor->target; ripper->target = actor->target;
ripper->angle = angle; ripper->angle = angle;
@ -2084,7 +2084,7 @@ void ABlasterFX1::Tick ()
} }
if (changexy && (pr_bfx1t() < 64)) if (changexy && (pr_bfx1t() < 64))
{ {
Spawn<ABlasterSmoke> (x, y, MAX<fixed_t> (z - 8 * FRACUNIT, floorz)); Spawn<ABlasterSmoke> (x, y, MAX<fixed_t> (z - 8 * FRACUNIT, floorz), ALLOW_REPLACE);
} }
} }
} }
@ -2526,7 +2526,7 @@ void A_SkullRodStorm (AActor *actor)
} }
x = actor->x + ((pr_storm()&127) - 64) * FRACUNIT; x = actor->x + ((pr_storm()&127) - 64) * FRACUNIT;
y = actor->y + ((pr_storm()&127) - 64) * FRACUNIT; y = actor->y + ((pr_storm()&127) - 64) * FRACUNIT;
mo = Spawn<ARainPillar> (x, y, ONCEILINGZ); mo = Spawn<ARainPillar> (x, y, ONCEILINGZ, ALLOW_REPLACE);
mo->Translation = multiplayer ? mo->Translation = multiplayer ?
TRANSLATION(TRANSLATION_PlayersExtra,actor->special2) : 0; TRANSLATION(TRANSLATION_PlayersExtra,actor->special2) : 0;
mo->target = actor->target; mo->target = actor->target;
@ -2830,13 +2830,13 @@ void A_PhoenixPuff (AActor *actor)
//[RH] Heretic never sets the target for seeking //[RH] Heretic never sets the target for seeking
//P_SeekerMissile (actor, ANGLE_1*5, ANGLE_1*10); //P_SeekerMissile (actor, ANGLE_1*5, ANGLE_1*10);
puff = Spawn<APhoenixPuff> (actor->x, actor->y, actor->z); puff = Spawn<APhoenixPuff> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
angle = actor->angle + ANG90; angle = actor->angle + ANG90;
angle >>= ANGLETOFINESHIFT; angle >>= ANGLETOFINESHIFT;
puff->momx = FixedMul (FRACUNIT*13/10, finecosine[angle]); puff->momx = FixedMul (FRACUNIT*13/10, finecosine[angle]);
puff->momy = FixedMul (FRACUNIT*13/10, finesine[angle]); puff->momy = FixedMul (FRACUNIT*13/10, finesine[angle]);
puff->momz = 0; puff->momz = 0;
puff = Spawn<APhoenixPuff> (actor->x, actor->y, actor->z); puff = Spawn<APhoenixPuff> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
angle = actor->angle - ANG90; angle = actor->angle - ANG90;
angle >>= ANGLETOFINESHIFT; angle >>= ANGLETOFINESHIFT;
puff->momx = FixedMul (FRACUNIT*13/10, finecosine[angle]); puff->momx = FixedMul (FRACUNIT*13/10, finecosine[angle]);
@ -2903,7 +2903,7 @@ void A_FirePhoenixPL2 (AActor *actor)
z = pmo->z + 26*FRACUNIT + finetangent[FINEANGLES/4-(pmo->pitch>>ANGLETOFINESHIFT)]; z = pmo->z + 26*FRACUNIT + finetangent[FINEANGLES/4-(pmo->pitch>>ANGLETOFINESHIFT)];
z -= pmo->floorclip; z -= pmo->floorclip;
slope = finetangent[FINEANGLES/4-(pmo->pitch>>ANGLETOFINESHIFT)] + (FRACUNIT/10); slope = finetangent[FINEANGLES/4-(pmo->pitch>>ANGLETOFINESHIFT)] + (FRACUNIT/10);
mo = Spawn<APhoenixFX2> (x, y, z); mo = Spawn<APhoenixFX2> (x, y, z, ALLOW_REPLACE);
mo->target = pmo; mo->target = pmo;
mo->angle = angle; mo->angle = angle;
mo->momx = pmo->momx + FixedMul (mo->Speed, finecosine[angle>>ANGLETOFINESHIFT]); mo->momx = pmo->momx + FixedMul (mo->Speed, finecosine[angle>>ANGLETOFINESHIFT]);

View file

@ -321,7 +321,7 @@ void A_LichAttack (AActor *actor)
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
{ {
fire = Spawn<AHeadFX3> (baseFire->x, baseFire->y, fire = Spawn<AHeadFX3> (baseFire->x, baseFire->y,
baseFire->z); baseFire->z, ALLOW_REPLACE);
if (i == 0) if (i == 0)
{ {
S_Sound (actor, CHAN_BODY, "ironlich/attack1", 1, ATTN_NORM); S_Sound (actor, CHAN_BODY, "ironlich/attack1", 1, ATTN_NORM);
@ -394,7 +394,7 @@ void A_LichIceImpact (AActor *ice)
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
shard = Spawn<AHeadFX2> (ice->x, ice->y, ice->z); shard = Spawn<AHeadFX2> (ice->x, ice->y, ice->z, ALLOW_REPLACE);
angle = i*ANG45; angle = i*ANG45;
shard->target = ice->target; shard->target = ice->target;
shard->angle = angle; shard->angle = angle;

View file

@ -188,7 +188,7 @@ void A_DripBlood (AActor *actor)
x = actor->x + (pr_dripblood.Random2 () << 11); x = actor->x + (pr_dripblood.Random2 () << 11);
y = actor->y + (pr_dripblood.Random2 () << 11); y = actor->y + (pr_dripblood.Random2 () << 11);
mo = Spawn<ABlood> (x, y, actor->z); mo = Spawn<ABlood> (x, y, actor->z, ALLOW_REPLACE);
mo->momx = pr_dripblood.Random2 () << 10; mo->momx = pr_dripblood.Random2 () << 10;
mo->momy = pr_dripblood.Random2 () << 10; mo->momy = pr_dripblood.Random2 () << 10;
mo->flags2 |= MF2_LOGRAV; mo->flags2 |= MF2_LOGRAV;

View file

@ -282,7 +282,7 @@ void A_MummySoul (AActor *mummy)
{ {
AActor *mo; AActor *mo;
mo = Spawn<AMummySoul> (mummy->x, mummy->y, mummy->z+10*FRACUNIT); mo = Spawn<AMummySoul> (mummy->x, mummy->y, mummy->z+10*FRACUNIT, ALLOW_REPLACE);
mo->momz = FRACUNIT; mo->momz = FRACUNIT;
} }

View file

@ -375,7 +375,7 @@ void A_BishopSpawnBlur (AActor *actor)
actor->SetState (actor->MissileState); actor->SetState (actor->MissileState);
} }
} }
mo = Spawn<ABishopBlur> (actor->x, actor->y, actor->z); mo = Spawn<ABishopBlur> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->angle = actor->angle; mo->angle = actor->angle;
@ -405,7 +405,7 @@ void A_BishopPuff (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<ABishopPuff> (actor->x, actor->y, actor->z + 40*FRACUNIT); mo = Spawn<ABishopPuff> (actor->x, actor->y, actor->z + 40*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momz = FRACUNIT/2; mo->momz = FRACUNIT/2;
@ -430,7 +430,7 @@ void A_BishopPainBlur (AActor *actor)
fixed_t x = actor->x + (pr_pain.Random2()<<12); fixed_t x = actor->x + (pr_pain.Random2()<<12);
fixed_t y = actor->y + (pr_pain.Random2()<<12); fixed_t y = actor->y + (pr_pain.Random2()<<12);
fixed_t z = actor->z + (pr_pain.Random2()<<11); fixed_t z = actor->z + (pr_pain.Random2()<<11);
mo = Spawn<ABishopPainBlur> (x, y, z); mo = Spawn<ABishopPainBlur> (x, y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->angle = actor->angle; mo->angle = actor->angle;

View file

@ -181,7 +181,7 @@ void AArtiBlastRadius::BlastActor (AActor *victim, fixed_t strength)
x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]); x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]);
y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]); y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]);
z = victim->z - victim->floorclip + (victim->height>>1); z = victim->z - victim->floorclip + (victim->height>>1);
mo = Spawn<ABlastEffect> (x, y, z); mo = Spawn<ABlastEffect> (x, y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momx = victim->momx; mo->momx = victim->momx;

View file

@ -49,7 +49,7 @@ bool AArtiBoostArmor::Use (bool pickup)
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
armor = Spawn<AHexenArmor> (0,0,0); armor = Spawn<AHexenArmor> (0,0,0, NO_REPLACE);
armor->flags |= MF_DROPPED; armor->flags |= MF_DROPPED;
armor->health = i; armor->health = i;
armor->Amount = 1; armor->Amount = 1;
@ -66,7 +66,7 @@ bool AArtiBoostArmor::Use (bool pickup)
} }
else else
{ {
ABasicArmorBonus *armor = Spawn<ABasicArmorBonus> (0,0,0); ABasicArmorBonus *armor = Spawn<ABasicArmorBonus> (0,0,0, NO_REPLACE);
armor->flags |= MF_DROPPED; armor->flags |= MF_DROPPED;
armor->SaveAmount = 50; armor->SaveAmount = 50;
armor->MaxSaveAmount = 300; armor->MaxSaveAmount = 300;

View file

@ -307,7 +307,7 @@ void A_CentaurDropStuff (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn (DropTypes[i], actor->x, actor->y, actor->z+45*FRACUNIT); mo = Spawn (DropTypes[i], actor->x, actor->y, actor->z+45*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
angle_t angle = actor->angle + (i ? ANGLE_90 : ANGLE_270); angle_t angle = actor->angle + (i ? ANGLE_90 : ANGLE_270);

View file

@ -348,7 +348,7 @@ void ACFlameMissile::Tick ()
{ {
newz = floorz; newz = floorz;
} }
mo = Spawn<ACFlameFloor> (x, y, newz); mo = Spawn<ACFlameFloor> (x, y, newz, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->angle = angle; mo->angle = angle;
@ -434,7 +434,7 @@ void A_CFlameMissile (AActor *actor)
an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT; an90 = (i*ANG45+ANG90)>>ANGLETOFINESHIFT;
mo = Spawn<ACircleFlame> (BlockingMobj->x+FixedMul(dist, finecosine[an]), mo = Spawn<ACircleFlame> (BlockingMobj->x+FixedMul(dist, finecosine[an]),
BlockingMobj->y+FixedMul(dist, finesine[an]), BlockingMobj->y+FixedMul(dist, finesine[an]),
BlockingMobj->z+5*FRACUNIT); BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->angle = an<<ANGLETOFINESHIFT; mo->angle = an<<ANGLETOFINESHIFT;
@ -445,7 +445,7 @@ void A_CFlameMissile (AActor *actor)
} }
mo = Spawn<ACircleFlame> (BlockingMobj->x-FixedMul(dist, finecosine[an]), mo = Spawn<ACircleFlame> (BlockingMobj->x-FixedMul(dist, finecosine[an]),
BlockingMobj->y-FixedMul(dist, finesine[an]), BlockingMobj->y-FixedMul(dist, finesine[an]),
BlockingMobj->z+5*FRACUNIT); BlockingMobj->z+5*FRACUNIT, ALLOW_REPLACE);
if(mo) if(mo)
{ {
mo->angle = ANG180+(an<<ANGLETOFINESHIFT); mo->angle = ANG180+(an<<ANGLETOFINESHIFT);

View file

@ -363,7 +363,7 @@ bool AHolySpirit::Slam (AActor *thing)
P_DamageMobj (thing, this, target, dam, MOD_HIT); P_DamageMobj (thing, this, target, dam, MOD_HIT);
if (pr_spiritslam() < 128) if (pr_spiritslam() < 128)
{ {
Spawn<AHolyPuff> (x, y, z); Spawn<AHolyPuff> (x, y, z, ALLOW_REPLACE);
S_Sound (this, CHAN_WEAPON, "SpiritAttack", 1, ATTN_NORM); S_Sound (this, CHAN_WEAPON, "SpiritAttack", 1, ATTN_NORM);
if (thing->flags3&MF3_ISMONSTER && pr_spiritslam() < 128) if (thing->flags3&MF3_ISMONSTER && pr_spiritslam() < 128)
{ {
@ -481,7 +481,7 @@ void A_CHolyAttack2 (AActor *actor)
for (j = 0; j < 4; j++) for (j = 0; j < 4; j++)
{ {
mo = Spawn<AHolySpirit> (actor->x, actor->y, actor->z); mo = Spawn<AHolySpirit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (!mo) if (!mo)
{ {
continue; continue;
@ -533,11 +533,11 @@ void SpawnSpiritTail (AActor *spirit)
AActor *tail, *next; AActor *tail, *next;
int i; int i;
tail = Spawn<AHolyTail> (spirit->x, spirit->y, spirit->z); tail = Spawn<AHolyTail> (spirit->x, spirit->y, spirit->z, ALLOW_REPLACE);
tail->target = spirit; // parent tail->target = spirit; // parent
for (i = 1; i < 3; i++) for (i = 1; i < 3; i++)
{ {
next = Spawn<AHolyTailTrail> (spirit->x, spirit->y, spirit->z); next = Spawn<AHolyTailTrail> (spirit->x, spirit->y, spirit->z, ALLOW_REPLACE);
tail->tracer = next; tail->tracer = next;
tail = next; tail = next;
} }
@ -868,7 +868,7 @@ void A_CHolyCheckScream (AActor *actor)
void A_CHolySpawnPuff (AActor *actor) void A_CHolySpawnPuff (AActor *actor)
{ {
Spawn<AHolyMissilePuff> (actor->x, actor->y, actor->z); Spawn<AHolyMissilePuff> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
} }
void AClericWeaponPiece::BeginPlay () void AClericWeaponPiece::BeginPlay ()
@ -894,7 +894,7 @@ void A_DropWraithvergePieces (AActor *actor)
for (int i = 0, j = 0, fineang = 0; i < 3; ++i) for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{ {
AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z); AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL) if (piece != NULL)
{ {
piece->momx = actor->momx + finecosine[fineang]; piece->momx = actor->momx + finecosine[fineang];

View file

@ -645,7 +645,7 @@ static void TossChunks (AActor *actor, const PClass *const chunks[])
for (i = 4; i >= 0; --i) for (i = 4; i >= 0; --i)
{ {
mo = Spawn (chunks[i], actor->x, actor->y, actor->z+45*FRACUNIT); mo = Spawn (chunks[i], actor->x, actor->y, actor->z+45*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
angle = actor->angle + (i<4 ? ANGLE_270 : ANGLE_90); angle = actor->angle + (i<4 ? ANGLE_270 : ANGLE_90);

View file

@ -430,7 +430,7 @@ void A_DragonFX2 (AActor *actor)
fixed_t y = actor->y+((pr_dragonfx2()-128)<<14); fixed_t y = actor->y+((pr_dragonfx2()-128)<<14);
fixed_t z = actor->z+((pr_dragonfx2()-128)<<12); fixed_t z = actor->z+((pr_dragonfx2()-128)<<12);
mo = Spawn<ADragonExplosion> (x, y, z); mo = Spawn<ADragonExplosion> (x, y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->tics = delay+(pr_dragonfx2()&3)*i*2; mo->tics = delay+(pr_dragonfx2()&3)*i*2;

View file

@ -173,7 +173,7 @@ void A_DropMace (AActor *actor)
AEttinMace *mo; AEttinMace *mo;
mo = Spawn<AEttinMace> (actor->x, actor->y, mo = Spawn<AEttinMace> (actor->x, actor->y,
actor->z + (actor->height>>1)); actor->z + (actor->height>>1), ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momx = (pr_dropmace()-128) << 11; mo->momx = (pr_dropmace()-128) << 11;

View file

@ -454,7 +454,7 @@ void P_BloodSplatter2 (fixed_t x, fixed_t y, fixed_t z, AActor *originator)
x += ((pr_splat()-128)<<11); x += ((pr_splat()-128)<<11);
y += ((pr_splat()-128)<<11); y += ((pr_splat()-128)<<11);
mo = Spawn<AAxeBlood> (x, y, z); mo = Spawn<AAxeBlood> (x, y, z, ALLOW_REPLACE);
mo->target = originator; mo->target = originator;
// colorize the blood! // colorize the blood!

View file

@ -356,7 +356,7 @@ bool AFighterPlayer::DoHealingRadius (APlayerPawn *other)
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
AHexenArmor *armor = Spawn<AHexenArmor> (0,0,0); AHexenArmor *armor = Spawn<AHexenArmor> (0,0,0, NO_REPLACE);
armor->health = i; armor->health = i;
armor->Amount = 1; armor->Amount = 1;
if (!armor->TryPickup (player->mo)) if (!armor->TryPickup (player->mo))

View file

@ -347,7 +347,7 @@ void A_FSwordFlames (AActor *actor)
fixed_t x = actor->x+((pr_fswordflame()-128)<<12); fixed_t x = actor->x+((pr_fswordflame()-128)<<12);
fixed_t y = actor->y+((pr_fswordflame()-128)<<12); fixed_t y = actor->y+((pr_fswordflame()-128)<<12);
fixed_t z = actor->z+((pr_fswordflame()-128)<<11); fixed_t z = actor->z+((pr_fswordflame()-128)<<11);
Spawn<AFSwordFlame> (x, y, z); Spawn<AFSwordFlame> (x, y, z, ALLOW_REPLACE);
} }
} }
@ -368,7 +368,7 @@ void A_DropQuietusPieces (AActor *actor)
for (int i = 0, j = 0, fineang = 0; i < 3; ++i) for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{ {
AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z); AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL) if (piece != NULL)
{ {
piece->momx = actor->momx + finecosine[fineang]; piece->momx = actor->momx + finecosine[fineang];

View file

@ -373,7 +373,7 @@ void A_FiredSpawnRock (AActor *actor)
x = actor->x + ((pr_firedemonrock() - 128) << 12); x = actor->x + ((pr_firedemonrock() - 128) << 12);
y = actor->y + ((pr_firedemonrock() - 128) << 12); y = actor->y + ((pr_firedemonrock() - 128) << 12);
z = actor->z + ( pr_firedemonrock() << 11); z = actor->z + ( pr_firedemonrock() << 11);
mo = Spawn (rtype, x, y, z); mo = Spawn (rtype, x, y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->target = actor; mo->target = actor;
@ -519,14 +519,14 @@ void A_FiredSplotch (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<AFireDemonSplotch1> (actor->x, actor->y, actor->z); mo = Spawn<AFireDemonSplotch1> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momx = (pr_firedemonsplotch() - 128) << 11; mo->momx = (pr_firedemonsplotch() - 128) << 11;
mo->momy = (pr_firedemonsplotch() - 128) << 11; mo->momy = (pr_firedemonsplotch() - 128) << 11;
mo->momz = (pr_firedemonsplotch() << 10) + FRACUNIT*3; mo->momz = (pr_firedemonsplotch() << 10) + FRACUNIT*3;
} }
mo = Spawn<AFireDemonSplotch2> (actor->x, actor->y, actor->z); mo = Spawn<AFireDemonSplotch2> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momx = (pr_firedemonsplotch() - 128) << 11; mo->momx = (pr_firedemonsplotch() - 128) << 11;

View file

@ -186,7 +186,7 @@ bool AArtiPoisonBag1::Use (bool pickup)
mo = Spawn<APoisonBag> ( mo = Spawn<APoisonBag> (
Owner->x+16*finecosine[angle], Owner->x+16*finecosine[angle],
Owner->y+24*finesine[angle], Owner->z- Owner->y+24*finesine[angle], Owner->z-
Owner->floorclip+8*FRACUNIT); Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->target = Owner; mo->target = Owner;
@ -216,7 +216,7 @@ bool AArtiPoisonBag2::Use (bool pickup)
mo = Spawn<AFireBomb> ( mo = Spawn<AFireBomb> (
Owner->x+16*finecosine[angle], Owner->x+16*finecosine[angle],
Owner->y+24*finesine[angle], Owner->z- Owner->y+24*finesine[angle], Owner->z-
Owner->floorclip+8*FRACUNIT); Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->target = Owner; mo->target = Owner;
@ -243,7 +243,7 @@ bool AArtiPoisonBag3::Use (bool pickup)
AActor *mo; AActor *mo;
mo = Spawn<AThrowingBomb> (Owner->x, Owner->y, mo = Spawn<AThrowingBomb> (Owner->x, Owner->y,
Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0)); Owner->z-Owner->floorclip+35*FRACUNIT + (Owner->player? Owner->player->crouchoffset : 0), ALLOW_REPLACE);
if (mo) if (mo)
{ {
angle_t pitch = (angle_t)Owner->pitch >> ANGLETOFINESHIFT; angle_t pitch = (angle_t)Owner->pitch >> ANGLETOFINESHIFT;
@ -339,7 +339,7 @@ AInventory *AArtiPoisonBag::CreateCopy (AActor *other)
{ {
spawntype = RUNTIME_CLASS(AArtiPoisonBag3); spawntype = RUNTIME_CLASS(AArtiPoisonBag3);
} }
copy = static_cast<AInventory *>(Spawn (spawntype, 0, 0, 0)); copy = static_cast<AInventory *>(Spawn (spawntype, 0, 0, 0, NO_REPLACE));
copy->Amount = Amount; copy->Amount = Amount;
copy->MaxAmount = MaxAmount; copy->MaxAmount = MaxAmount;
GoAwayAndDie (); GoAwayAndDie ();
@ -476,7 +476,7 @@ void A_PoisonBagInit (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<APoisonCloud> (actor->x, actor->y, actor->z+28*FRACUNIT); mo = Spawn<APoisonCloud> (actor->x, actor->y, actor->z+28*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->target = actor->target; mo->target = actor->target;

View file

@ -165,7 +165,7 @@ void A_FogSpawn (AActor *actor)
actor->special1 = actor->args[2]; // Reset frequency count actor->special1 = actor->args[2]; // Reset frequency count
mo = Spawn (fogs[pr_fogspawn()%3], actor->x, actor->y, actor->z); mo = Spawn (fogs[pr_fogspawn()%3], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {

View file

@ -672,15 +672,15 @@ void A_SorcSpinBalls(AActor *actor)
actor->special1 = ANGLE_1; actor->special1 = ANGLE_1;
z = actor->z - actor->floorclip + actor->height; z = actor->z - actor->floorclip + actor->height;
mo = Spawn<ASorcBall1> (actor->x, actor->y, z); mo = Spawn<ASorcBall1> (actor->x, actor->y, z, NO_REPLACE);
if (mo) if (mo)
{ {
mo->target = actor; mo->target = actor;
mo->special2 = SORCFX4_RAPIDFIRE_TIME; mo->special2 = SORCFX4_RAPIDFIRE_TIME;
} }
mo = Spawn<ASorcBall2> (actor->x, actor->y, z); mo = Spawn<ASorcBall2> (actor->x, actor->y, z, NO_REPLACE);
if (mo) mo->target = actor; if (mo) mo->target = actor;
mo = Spawn<ASorcBall3> (actor->x, actor->y, z); mo = Spawn<ASorcBall3> (actor->x, actor->y, z, NO_REPLACE);
if (mo) mo->target = actor; if (mo) mo->target = actor;
} }
@ -968,7 +968,7 @@ void ASorcBall2::CastSorcererSpell ()
AActor *mo; AActor *mo;
fixed_t z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT; fixed_t z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT;
mo = Spawn<ASorcFX2> (x, y, z); mo = Spawn<ASorcFX2> (x, y, z, ALLOW_REPLACE);
parent->flags2 |= MF2_REFLECTIVE|MF2_INVULNERABLE; parent->flags2 |= MF2_REFLECTIVE|MF2_INVULNERABLE;
parent->args[0] = SORC_DEFENSE_TIME; parent->args[0] = SORC_DEFENSE_TIME;
if (mo) mo->target = parent; if (mo) mo->target = parent;
@ -1134,7 +1134,7 @@ void A_SpawnFizzle(AActor *actor)
z = actor->z - actor->floorclip + (actor->height>>1); z = actor->z - actor->floorclip + (actor->height>>1);
for (ix=0; ix<5; ix++) for (ix=0; ix<5; ix++)
{ {
mo = Spawn<ASorcSpark1> (x, y, z); mo = Spawn<ASorcSpark1> (x, y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
rangle = angle + ((pr_heresiarch()%5) << 1); rangle = angle + ((pr_heresiarch()%5) << 1);
@ -1181,7 +1181,7 @@ void A_SorcFX2Split(AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<ASorcFX2> (actor->x, actor->y, actor->z); mo = Spawn<ASorcFX2> (actor->x, actor->y, actor->z, NO_REPLACE);
if (mo) if (mo)
{ {
mo->target = actor->target; mo->target = actor->target;
@ -1189,7 +1189,7 @@ void A_SorcFX2Split(AActor *actor)
mo->special1 = actor->angle; // Set angle mo->special1 = actor->angle; // Set angle
mo->SetStateNF (&ASorcFX2::States[S_SORCFX2_ORBIT1]); mo->SetStateNF (&ASorcFX2::States[S_SORCFX2_ORBIT1]);
} }
mo = Spawn<ASorcFX2> (actor->x, actor->y, actor->z); mo = Spawn<ASorcFX2> (actor->x, actor->y, actor->z, NO_REPLACE);
if (mo) if (mo)
{ {
mo->target = actor->target; mo->target = actor->target;
@ -1249,7 +1249,7 @@ void A_SorcFX2Orbit (AActor *actor)
z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT; z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT;
z += FixedMul(15*FRACUNIT,finecosine[angle]); z += FixedMul(15*FRACUNIT,finecosine[angle]);
// Spawn trailer // Spawn trailer
Spawn<ASorcFX2T1> (x, y, z); Spawn<ASorcFX2T1> (x, y, z, ALLOW_REPLACE);
} }
else // Clock wise else // Clock wise
{ {
@ -1260,7 +1260,7 @@ void A_SorcFX2Orbit (AActor *actor)
z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT; z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT;
z += FixedMul(20*FRACUNIT,finesine[angle]); z += FixedMul(20*FRACUNIT,finesine[angle]);
// Spawn trailer // Spawn trailer
Spawn<ASorcFX2T1> (x, y, z); Spawn<ASorcFX2T1> (x, y, z, ALLOW_REPLACE);
} }
actor->SetOrigin (x, y, z); actor->SetOrigin (x, y, z);
@ -1279,7 +1279,7 @@ void A_SorcFX2Orbit (AActor *actor)
void A_SpawnBishop(AActor *actor) void A_SpawnBishop(AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<ABishop> (actor->x, actor->y, actor->z); mo = Spawn<ABishop> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
if (!P_TestMobjLocation(mo)) if (!P_TestMobjLocation(mo))
@ -1304,7 +1304,7 @@ void A_SpawnBishop(AActor *actor)
void A_SorcererBishopEntry(AActor *actor) void A_SorcererBishopEntry(AActor *actor)
{ {
Spawn<ASorcFX3Explosion> (actor->x, actor->y, actor->z); Spawn<ASorcFX3Explosion> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
S_SoundID (actor, CHAN_VOICE, actor->SeeSound, 1, ATTN_NORM); S_SoundID (actor, CHAN_VOICE, actor->SeeSound, 1, ATTN_NORM);
} }

View file

@ -187,7 +187,7 @@ void A_PotteryExplode (AActor *actor)
for(i = (pr_pottery()&3)+3; i; i--) for(i = (pr_pottery()&3)+3; i; i--)
{ {
mo = Spawn<APotteryBit> (actor->x, actor->y, actor->z); mo = Spawn<APotteryBit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (mo->SpawnState + (pr_pottery()%5)); mo->SetState (mo->SpawnState + (pr_pottery()%5));
if (mo) if (mo)
{ {
@ -203,7 +203,7 @@ void A_PotteryExplode (AActor *actor)
|| !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER)) || !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER))
{ // Only spawn monsters if not -nomonsters { // Only spawn monsters if not -nomonsters
Spawn (SpawnableThings[actor->args[0]], Spawn (SpawnableThings[actor->args[0]],
actor->x, actor->y, actor->z); actor->x, actor->y, actor->z, ALLOW_REPLACE);
} }
} }
} }
@ -288,7 +288,7 @@ END_DEFAULTS
void AZCorpseLynchedNoHeart::PostBeginPlay () void AZCorpseLynchedNoHeart::PostBeginPlay ()
{ {
Super::PostBeginPlay (); Super::PostBeginPlay ();
Spawn<ABloodPool> (x, y, ONFLOORZ); Spawn<ABloodPool> (x, y, ONFLOORZ, ALLOW_REPLACE);
} }
// CorpseBloodDrip ---------------------------------------------------------- // CorpseBloodDrip ----------------------------------------------------------
@ -331,7 +331,7 @@ void A_CorpseBloodDrip (AActor *actor)
{ {
if (pr_drip() <= 128) if (pr_drip() <= 128)
{ {
Spawn<ACorpseBloodDrip> (actor->x, actor->y, actor->z + actor->height/2); Spawn<ACorpseBloodDrip> (actor->x, actor->y, actor->z + actor->height/2, ALLOW_REPLACE);
} }
} }
@ -400,7 +400,7 @@ void A_CorpseExplode (AActor *actor)
for (i = (pr_foo()&3)+3; i; i--) for (i = (pr_foo()&3)+3; i; i--)
{ {
mo = Spawn<ACorpseBit> (actor->x, actor->y, actor->z); mo = Spawn<ACorpseBit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (mo->SpawnState + (pr_foo()%3)); mo->SetState (mo->SpawnState + (pr_foo()%3));
if (mo) if (mo)
{ {
@ -410,7 +410,7 @@ void A_CorpseExplode (AActor *actor)
} }
} }
// Spawn a skull // Spawn a skull
mo = Spawn<ACorpseBit> (actor->x, actor->y, actor->z); mo = Spawn<ACorpseBit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
mo->SetState (mo->SpawnState + 3); mo->SetState (mo->SpawnState + 3);
if (mo) if (mo)
{ {
@ -537,7 +537,7 @@ void A_LeafSpawn (AActor *actor)
mo = Spawn (pr_leaf()&1 ? RUNTIME_CLASS(ALeaf1) : RUNTIME_CLASS(ALeaf2), mo = Spawn (pr_leaf()&1 ? RUNTIME_CLASS(ALeaf1) : RUNTIME_CLASS(ALeaf2),
actor->x + (pr_leaf.Random2()<<14), actor->x + (pr_leaf.Random2()<<14),
actor->y + (pr_leaf.Random2()<<14), actor->y + (pr_leaf.Random2()<<14),
actor->z + (pr_leaf()<<14)); actor->z + (pr_leaf()<<14), ALLOW_REPLACE);
if (mo) if (mo)
{ {
P_ThrustMobj (mo, actor->angle, (pr_leaf()<<9)+3*FRACUNIT); P_ThrustMobj (mo, actor->angle, (pr_leaf()<<9)+3*FRACUNIT);
@ -720,7 +720,7 @@ void A_SoAExplode (AActor *actor)
{ {
mo = Spawn<AZArmorChunk> (actor->x+((pr_soaexplode()-128)<<12), mo = Spawn<AZArmorChunk> (actor->x+((pr_soaexplode()-128)<<12),
actor->y+((pr_soaexplode()-128)<<12), actor->y+((pr_soaexplode()-128)<<12),
actor->z+(pr_soaexplode()*actor->height/256)); actor->z+(pr_soaexplode()*actor->height/256), ALLOW_REPLACE);
mo->SetState (mo->SpawnState + i); mo->SetState (mo->SpawnState + i);
if (mo) if (mo)
{ {
@ -735,7 +735,7 @@ void A_SoAExplode (AActor *actor)
|| !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER)) || !(GetDefaultByType (SpawnableThings[actor->args[0]])->flags3 & MF3_ISMONSTER))
{ // Only spawn monsters if not -nomonsters { // Only spawn monsters if not -nomonsters
Spawn (SpawnableThings[actor->args[0]], Spawn (SpawnableThings[actor->args[0]],
actor->x, actor->y, actor->z); actor->x, actor->y, actor->z, ALLOW_REPLACE);
} }
} }
S_SoundID (actor, CHAN_BODY, actor->DeathSound, 1, ATTN_NORM); S_SoundID (actor, CHAN_BODY, actor->DeathSound, 1, ATTN_NORM);

View file

@ -289,7 +289,7 @@ void A_IceGuyLook (AActor *actor)
Spawn (WispTypes[pr_iceguylook()&1], Spawn (WispTypes[pr_iceguylook()&1],
actor->x+FixedMul(dist, finecosine[an]), actor->x+FixedMul(dist, finecosine[an]),
actor->y+FixedMul(dist, finesine[an]), actor->y+FixedMul(dist, finesine[an]),
actor->z+60*FRACUNIT); actor->z+60*FRACUNIT, ALLOW_REPLACE);
} }
} }
@ -314,7 +314,7 @@ void A_IceGuyChase (AActor *actor)
mo = Spawn (WispTypes[pr_iceguychase()&1], mo = Spawn (WispTypes[pr_iceguychase()&1],
actor->x+FixedMul(dist, finecosine[an]), actor->x+FixedMul(dist, finecosine[an]),
actor->y+FixedMul(dist, finesine[an]), actor->y+FixedMul(dist, finesine[an]),
actor->z+60*FRACUNIT); actor->z+60*FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momx = actor->momx; mo->momx = actor->momx;
@ -361,7 +361,7 @@ void A_IceGuyAttack (AActor *actor)
void A_IceGuyMissilePuff (AActor *actor) void A_IceGuyMissilePuff (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<AIceFXPuff> (actor->x, actor->y, actor->z+2*FRACUNIT); mo = Spawn<AIceFXPuff> (actor->x, actor->y, actor->z+2*FRACUNIT, ALLOW_REPLACE);
} }
//============================================================================ //============================================================================

View file

@ -434,7 +434,7 @@ void A_KoraxCommand (AActor *actor)
x = actor->x + KORAX_COMMAND_OFFSET * finecosine[ang]; x = actor->x + KORAX_COMMAND_OFFSET * finecosine[ang];
y = actor->y + KORAX_COMMAND_OFFSET * finesine[ang]; y = actor->y + KORAX_COMMAND_OFFSET * finesine[ang];
z = actor->z + KORAX_COMMAND_HEIGHT*FRACUNIT; z = actor->z + KORAX_COMMAND_HEIGHT*FRACUNIT;
Spawn<AKoraxBolt> (x, y, z); Spawn<AKoraxBolt> (x, y, z, ALLOW_REPLACE);
if (actor->health <= (actor->GetDefault()->health >> 1)) if (actor->health <= (actor->GetDefault()->health >> 1))
{ {
@ -656,7 +656,7 @@ void A_KBoltRaise (AActor *actor)
if ((z + KORAX_BOLT_HEIGHT) < actor->ceilingz) if ((z + KORAX_BOLT_HEIGHT) < actor->ceilingz)
{ {
mo = Spawn<AKoraxBolt> (actor->x, actor->y, z); mo = Spawn<AKoraxBolt> (actor->x, actor->y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->special1 = KORAX_BOLT_LIFETIME; mo->special1 = KORAX_BOLT_LIFETIME;
@ -682,7 +682,7 @@ AActor *P_SpawnKoraxMissile (fixed_t x, fixed_t y, fixed_t z,
int dist; int dist;
z -= source->floorclip; z -= source->floorclip;
th = Spawn (type, x, y, z); th = Spawn (type, x, y, z, ALLOW_REPLACE);
if (th->SeeSound) if (th->SeeSound)
{ {
S_SoundID (th, CHAN_BODY, th->SeeSound, 1, ATTN_NORM); S_SoundID (th, CHAN_BODY, th->SeeSound, 1, ATTN_NORM);

View file

@ -451,7 +451,7 @@ void A_LightningZap (AActor *actor)
} }
mo = Spawn<ALightningZap> (actor->x+((pr_zap()-128)*actor->radius/256), mo = Spawn<ALightningZap> (actor->x+((pr_zap()-128)*actor->radius/256),
actor->y+((pr_zap()-128)*actor->radius/256), actor->y+((pr_zap()-128)*actor->radius/256),
actor->z+deltaZ); actor->z+deltaZ, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->lastenemy = actor; mo->lastenemy = actor;
@ -554,7 +554,7 @@ void A_LastZap (AActor *actor)
{ {
AActor *mo; AActor *mo;
mo = Spawn<ALightningZap> (actor->x, actor->y, actor->z); mo = Spawn<ALightningZap> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->SetState (&ALightningZap::States[S_LIGHTNING_ZAP_X1]); mo->SetState (&ALightningZap::States[S_LIGHTNING_ZAP_X1]);

View file

@ -488,7 +488,7 @@ void A_DropBloodscourgePieces (AActor *actor)
for (int i = 0, j = 0, fineang = 0; i < 3; ++i) for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{ {
AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z); AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL) if (piece != NULL)
{ {
piece->momx = actor->momx + finecosine[fineang]; piece->momx = actor->momx + finecosine[fineang];

View file

@ -171,7 +171,7 @@ void AMageWandMissile::Tick ()
{ {
hitz = floorz; hitz = floorz;
} }
Spawn<AMageWandSmoke> (x, y, hitz); Spawn<AMageWandSmoke> (x, y, hitz, ALLOW_REPLACE);
} }
} }
} }

View file

@ -607,7 +607,7 @@ void A_SerpentMissileAttack (AActor *actor)
void A_SerpentHeadPop (AActor *actor) void A_SerpentHeadPop (AActor *actor)
{ {
Spawn<ASerpentHead> (actor->x, actor->y, actor->z+45*FRACUNIT); Spawn<ASerpentHead> (actor->x, actor->y, actor->z+45*FRACUNIT, ALLOW_REPLACE);
} }
//============================================================================ //============================================================================
@ -631,7 +631,7 @@ void A_SerpentSpawnGibs (AActor *actor)
mo = Spawn (GibTypes[i], mo = Spawn (GibTypes[i],
actor->x+((pr_serpentgibs()-128)<<12), actor->x+((pr_serpentgibs()-128)<<12),
actor->y+((pr_serpentgibs()-128)<<12), actor->y+((pr_serpentgibs()-128)<<12),
actor->floorz+FRACUNIT); actor->floorz+FRACUNIT, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momx = (pr_serpentgibs()-128)<<6; mo->momx = (pr_serpentgibs()-128)<<6;

View file

@ -185,27 +185,27 @@ END_DEFAULTS
void AThrustFloor::Activate (AActor *activator) void AThrustFloor::Activate (AActor *activator)
{ {
if (args[0] == 0) if (args[0] == 0)
{ {
S_Sound (this, CHAN_BODY, "ThrustSpikeLower", 1, ATTN_NORM); S_Sound (this, CHAN_BODY, "ThrustSpikeLower", 1, ATTN_NORM);
renderflags &= ~RF_INVISIBLE; renderflags &= ~RF_INVISIBLE;
if (args[1]) if (args[1])
SetState (&States[S_BTHRUSTRAISE]); SetState (&States[S_BTHRUSTRAISE]);
else else
SetState (&States[S_THRUSTRAISE]); SetState (&States[S_THRUSTRAISE]);
} }
} }
void AThrustFloor::Deactivate (AActor *activator) void AThrustFloor::Deactivate (AActor *activator)
{ {
if (args[0] == 1) if (args[0] == 1)
{ {
S_Sound (this, CHAN_BODY, "ThrustSpikeRaise", 1, ATTN_NORM); S_Sound (this, CHAN_BODY, "ThrustSpikeRaise", 1, ATTN_NORM);
if (args[1]) if (args[1])
SetState (&States[S_BTHRUSTLOWER]); SetState (&States[S_BTHRUSTLOWER]);
else else
SetState (&States[S_THRUSTLOWER]); SetState (&States[S_THRUSTLOWER]);
} }
} }
// Spike up ----------------------------------------------------------------- // Spike up -----------------------------------------------------------------
@ -264,7 +264,7 @@ void A_ThrustInitDn (AActor *actor)
actor->flags2 = MF2_NOTELEPORT|MF2_FLOORCLIP; actor->flags2 = MF2_NOTELEPORT|MF2_FLOORCLIP;
actor->renderflags = RF_INVISIBLE; actor->renderflags = RF_INVISIBLE;
static_cast<AThrustFloor *>(actor)->DirtClump = static_cast<AThrustFloor *>(actor)->DirtClump =
Spawn<ADirtClump> (actor->x, actor->y, actor->z); Spawn<ADirtClump> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
} }

View file

@ -129,13 +129,13 @@ void A_Summon (AActor *actor)
{ {
AMinotaurFriend *mo; AMinotaurFriend *mo;
mo = Spawn<AMinotaurFriend> (actor->x, actor->y, actor->z); mo = Spawn<AMinotaurFriend> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
if (P_TestMobjLocation(mo) == false || !actor->tracer) if (P_TestMobjLocation(mo) == false || !actor->tracer)
{ // Didn't fit - change back to artifact { // Didn't fit - change back to artifact
mo->Destroy (); mo->Destroy ();
AActor *arti = Spawn<AArtiDarkServant> (actor->x, actor->y, actor->z); AActor *arti = Spawn<AArtiDarkServant> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (arti) arti->flags |= MF_DROPPED; if (arti) arti->flags |= MF_DROPPED;
return; return;
} }
@ -148,7 +148,7 @@ void A_Summon (AActor *actor)
else else
{ {
mo->tracer = actor->tracer; // Pointer to master mo->tracer = actor->tracer; // Pointer to master
AInventory *power = Spawn<APowerMinotaur> (0, 0, 0); AInventory *power = Spawn<APowerMinotaur> (0, 0, 0, NO_REPLACE);
power->TryPickup (actor->tracer); power->TryPickup (actor->tracer);
if (actor->tracer->player != NULL) if (actor->tracer->player != NULL)
{ {
@ -157,7 +157,7 @@ void A_Summon (AActor *actor)
} }
// Make smoke puff // Make smoke puff
Spawn<AMinotaurSmoke> (actor->x, actor->y, actor->z); Spawn<AMinotaurSmoke> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
S_SoundID (actor, CHAN_VOICE, mo->ActiveSound, 1, ATTN_NORM); S_SoundID (actor, CHAN_VOICE, mo->ActiveSound, 1, ATTN_NORM);
} }
} }

View file

@ -164,7 +164,7 @@ static void TeloSpawn (AActor *source, const PClass *type)
{ {
AActor *fx; AActor *fx;
fx = Spawn (type, source->x, source->y, source->z); fx = Spawn (type, source->x, source->y, source->z, ALLOW_REPLACE);
if (fx) if (fx)
{ {
fx->special1 = TELEPORT_LIFE; // Lifetime countdown fx->special1 = TELEPORT_LIFE; // Lifetime countdown

View file

@ -138,7 +138,7 @@ bool AFourthWeaponPiece::TryPickup (AActor *toucher)
if (gaveWeapon) if (gaveWeapon)
{ {
TempFourthWeapon = static_cast<AInventory *>(Spawn (FourthWeaponClass, x, y, z)); TempFourthWeapon = static_cast<AInventory *>(Spawn (FourthWeaponClass, x, y, z, NO_REPLACE));
if (TempFourthWeapon != NULL) if (TempFourthWeapon != NULL)
{ {
gaveWeapon = TempFourthWeapon->TryPickup (toucher); gaveWeapon = TempFourthWeapon->TryPickup (toucher);

View file

@ -416,7 +416,7 @@ void A_WraithFX2 (AActor *actor)
for (i = 2; i; --i) for (i = 2; i; --i)
{ {
mo = Spawn<AWraithFX2> (actor->x, actor->y, actor->z); mo = Spawn<AWraithFX2> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if(mo) if(mo)
{ {
if (pr_wraithfx2 ()<128) if (pr_wraithfx2 ()<128)
@ -453,7 +453,7 @@ void A_WraithFX3 (AActor *actor)
while (numdropped-- > 0) while (numdropped-- > 0)
{ {
mo = Spawn<AWraithFX3> (actor->x, actor->y, actor->z); mo = Spawn<AWraithFX3> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->x += (pr_wraithfx3()-128)<<11; mo->x += (pr_wraithfx3()-128)<<11;
@ -501,7 +501,7 @@ void A_WraithFX4 (AActor *actor)
if (spawn4) if (spawn4)
{ {
mo = Spawn<AWraithFX4> (actor->x, actor->y, actor->z); mo = Spawn<AWraithFX4> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->x += (pr_wraithfx4()-128)<<12; mo->x += (pr_wraithfx4()-128)<<12;
@ -512,7 +512,7 @@ void A_WraithFX4 (AActor *actor)
} }
if (spawn5) if (spawn5)
{ {
mo = Spawn<AWraithFX5> (actor->x, actor->y, actor->z); mo = Spawn<AWraithFX5> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->x += (pr_wraithfx4()-128)<<11; mo->x += (pr_wraithfx4()-128)<<11;

View file

@ -54,7 +54,7 @@ bool P_MorphPlayer (player_t *p, const PClass *spawntype)
return false; return false;
} }
morphed = static_cast<APlayerPawn *>(Spawn (spawntype, actor->x, actor->y, actor->z)); morphed = static_cast<APlayerPawn *>(Spawn (spawntype, actor->x, actor->y, actor->z, NO_REPLACE));
DObject::PointerSubstitution (actor, morphed); DObject::PointerSubstitution (actor, morphed);
morphed->angle = actor->angle; morphed->angle = actor->angle;
morphed->target = actor->target; morphed->target = actor->target;
@ -69,7 +69,7 @@ bool P_MorphPlayer (player_t *p, const PClass *spawntype)
morphed->flags |= actor->flags & (MF_SHADOW|MF_NOGRAVITY); morphed->flags |= actor->flags & (MF_SHADOW|MF_NOGRAVITY);
morphed->flags2 |= actor->flags2 & MF2_FLY; morphed->flags2 |= actor->flags2 & MF2_FLY;
morphed->flags3 |= actor->flags3 & MF3_GHOST; morphed->flags3 |= actor->flags3 & MF3_GHOST;
Spawn<ATeleportFog> (actor->x, actor->y, actor->z + TELEFOGHEIGHT); Spawn<ATeleportFog> (actor->x, actor->y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
actor->player = NULL; actor->player = NULL;
actor->flags &= ~(MF_SOLID|MF_SHOOTABLE); actor->flags &= ~(MF_SOLID|MF_SHOOTABLE);
actor->flags |= MF_UNMORPHED; actor->flags |= MF_UNMORPHED;
@ -163,7 +163,7 @@ bool P_UndoPlayerMorph (player_t *player, bool force)
} }
angle = mo->angle >> ANGLETOFINESHIFT; angle = mo->angle >> ANGLETOFINESHIFT;
Spawn<ATeleportFog> (pmo->x + 20*finecosine[angle], Spawn<ATeleportFog> (pmo->x + 20*finecosine[angle],
pmo->y + 20*finesine[angle], pmo->z + TELEFOGHEIGHT); pmo->y + 20*finesine[angle], pmo->z + TELEFOGHEIGHT, ALLOW_REPLACE);
beastweap = player->ReadyWeapon; beastweap = player->ReadyWeapon;
if (player->PremorphWeapon != NULL) if (player->PremorphWeapon != NULL)
{ {
@ -205,7 +205,7 @@ bool P_MorphMonster (AActor *actor, const PClass *spawntype)
return false; return false;
} }
morphed = Spawn (spawntype, actor->x, actor->y, actor->z); morphed = Spawn (spawntype, actor->x, actor->y, actor->z, NO_REPLACE);
DObject::PointerSubstitution (actor, morphed); DObject::PointerSubstitution (actor, morphed);
morphed->tid = actor->tid; morphed->tid = actor->tid;
morphed->angle = actor->angle; morphed->angle = actor->angle;
@ -230,7 +230,7 @@ bool P_MorphMonster (AActor *actor, const PClass *spawntype)
actor->flags &= ~(MF_SOLID|MF_SHOOTABLE); actor->flags &= ~(MF_SOLID|MF_SHOOTABLE);
actor->flags |= MF_UNMORPHED; actor->flags |= MF_UNMORPHED;
actor->renderflags |= RF_INVISIBLE; actor->renderflags |= RF_INVISIBLE;
Spawn<ATeleportFog> (actor->x, actor->y, actor->z + TELEFOGHEIGHT); Spawn<ATeleportFog> (actor->x, actor->y, actor->z + TELEFOGHEIGHT, ALLOW_REPLACE);
return true; return true;
} }
@ -285,7 +285,7 @@ bool P_UpdateMorphedMonster (AActor *beast, int tics)
beast->tracer = NULL; beast->tracer = NULL;
DObject::PointerSubstitution (beast, actor); DObject::PointerSubstitution (beast, actor);
beast->Destroy (); beast->Destroy ();
Spawn<ATeleportFog> (beast->x, beast->y, beast->z + TELEFOGHEIGHT); Spawn<ATeleportFog> (beast->x, beast->y, beast->z + TELEFOGHEIGHT, ALLOW_REPLACE);
return true; return true;
} }

View file

@ -598,7 +598,7 @@ void A_MinotaurCharge (AActor *actor)
{ {
type = PClass::FindClass ("PunchPuff"); type = PClass::FindClass ("PunchPuff");
} }
puff = Spawn (type, actor->x, actor->y, actor->z); puff = Spawn (type, actor->x, actor->y, actor->z, ALLOW_REPLACE);
puff->momz = 2*FRACUNIT; puff->momz = 2*FRACUNIT;
actor->special1--; actor->special1--;
} }
@ -714,7 +714,7 @@ void A_MntrFloorFire (AActor *actor)
actor->z = actor->floorz; actor->z = actor->floorz;
x = actor->x + (pr_fire.Random2 () << 10); x = actor->x + (pr_fire.Random2 () << 10);
y = actor->y + (pr_fire.Random2 () << 10); y = actor->y + (pr_fire.Random2 () << 10);
mo = Spawn<AMinotaurFX3> (x, y, ONFLOORZ); mo = Spawn<AMinotaurFX3> (x, y, ONFLOORZ, ALLOW_REPLACE);
mo->target = actor->target; mo->target = actor->target;
mo->momx = 1; // Force block checking mo->momx = 1; // Force block checking
P_CheckMissileSpawn (mo); P_CheckMissileSpawn (mo);
@ -967,5 +967,5 @@ void A_SmokePuffEntry(mobj_t *actor)
void A_SmokePuffExit (AActor *actor) void A_SmokePuffExit (AActor *actor)
{ {
Spawn<AMinotaurSmokeExit> (actor->x, actor->y, actor->z); Spawn<AMinotaurSmokeExit> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
} }

View file

@ -100,19 +100,22 @@ void A_NoBlocking (AActor *actor)
{ {
FDropItem *di = GetDropItems(actor); FDropItem *di = GetDropItems(actor);
while (di != NULL) if (di != NULL)
{ {
if (di->Name != NAME_None) while (di != NULL)
{ {
const PClass *ti = PClass::FindClass(di->Name); if (di->Name != NAME_None)
if (ti) P_DropItem (actor, ti, di->amount, di->probability); {
const PClass *ti = PClass::FindClass(di->Name);
if (ti) P_DropItem (actor, ti, di->amount, di->probability);
}
di = di->Next;
} }
di = di->Next;
} }
} else
else {
{ actor->NoBlockingSet ();
actor->NoBlockingSet (); }
} }
} }
@ -260,7 +263,7 @@ void A_FreezeDeathChunks (AActor *actor)
mo = Spawn<AIceChunk> ( mo = Spawn<AIceChunk> (
actor->x + (((pr_freeze()-128)*actor->radius)>>7), actor->x + (((pr_freeze()-128)*actor->radius)>>7),
actor->y + (((pr_freeze()-128)*actor->radius)>>7), actor->y + (((pr_freeze()-128)*actor->radius)>>7),
actor->z + (pr_freeze()*actor->height/255)); actor->z + (pr_freeze()*actor->height/255), ALLOW_REPLACE);
mo->SetState (mo->SpawnState + (pr_freeze()%3)); mo->SetState (mo->SpawnState + (pr_freeze()%3));
if (mo) if (mo)
{ {
@ -274,7 +277,8 @@ void A_FreezeDeathChunks (AActor *actor)
} }
if (actor->player) if (actor->player)
{ // attach the player's view to a chunk of ice { // attach the player's view to a chunk of ice
AIceChunkHead *head = Spawn<AIceChunkHead> (actor->x, actor->y, actor->z + actor->player->mo->ViewHeight); AIceChunkHead *head = Spawn<AIceChunkHead> (actor->x, actor->y,
actor->z + actor->player->mo->ViewHeight, ALLOW_REPLACE);
head->momz = FixedDiv(head->z-actor->z, actor->height)<<2; head->momz = FixedDiv(head->z-actor->z, actor->height)<<2;
head->momx = pr_freeze.Random2 () << (FRACBITS-7); head->momx = pr_freeze.Random2 () << (FRACBITS-7);
head->momy = pr_freeze.Random2 () << (FRACBITS-7); head->momy = pr_freeze.Random2 () << (FRACBITS-7);

View file

@ -42,7 +42,7 @@ IMPLEMENT_ABSTRACT_ACTOR (APowerup)
bool APowerupGiver::Use (bool pickup) bool APowerupGiver::Use (bool pickup)
{ {
APowerup *power = static_cast<APowerup *> (Spawn (PowerupType, 0, 0, 0)); APowerup *power = static_cast<APowerup *> (Spawn (PowerupType, 0, 0, 0, NO_REPLACE));
if (EffectTics != 0) if (EffectTics != 0)
{ {
@ -966,7 +966,7 @@ void APowerSpeed::DoEffect ()
if (P_AproxDistance (Owner->momx, Owner->momy) <= 12*FRACUNIT) if (P_AproxDistance (Owner->momx, Owner->momy) <= 12*FRACUNIT)
return; return;
AActor *speedMo = Spawn<APlayerSpeedTrail> (Owner->x, Owner->y, Owner->z); AActor *speedMo = Spawn<APlayerSpeedTrail> (Owner->x, Owner->y, Owner->z, NO_REPLACE);
if (speedMo) if (speedMo)
{ {
speedMo->angle = Owner->angle; speedMo->angle = Owner->angle;

View file

@ -124,15 +124,15 @@ void A_BridgeInit (AActor *self)
self->special1 = 0; self->special1 = 0;
// Spawn triad into world // Spawn triad into world
ball1 = Spawn<ABridgeBall> (cx, cy, cz); ball1 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
ball1->angle = startangle; ball1->angle = startangle;
ball1->target = self; ball1->target = self;
ball2 = Spawn<ABridgeBall> (cx, cy, cz); ball2 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
ball2->angle = startangle + ANGLE_45/32*85; ball2->angle = startangle + ANGLE_45/32*85;
ball2->target = self; ball2->target = self;
ball3 = Spawn<ABridgeBall> (cx, cy, cz); ball3 = Spawn<ABridgeBall> (cx, cy, cz, ALLOW_REPLACE);
ball3->angle = startangle + (angle_t)ANGLE_45/32*170; ball3->angle = startangle + (angle_t)ANGLE_45/32*170;
ball3->target = self; ball3->target = self;

View file

@ -45,7 +45,7 @@ void P_SpawnDirt (AActor *actor, fixed_t radius)
dtype = PClass::FindClass(fmt); dtype = PClass::FindClass(fmt);
if (dtype) if (dtype)
{ {
mo = Spawn (dtype, x, y, z); mo = Spawn (dtype, x, y, z, ALLOW_REPLACE);
if (mo) if (mo)
{ {
mo->momz = pr_dirt()<<10; mo->momz = pr_dirt()<<10;

View file

@ -144,16 +144,12 @@ AInventory *AAmmo::CreateCopy (AActor *other)
{ {
const PClass *type = GetParentAmmo(); const PClass *type = GetParentAmmo();
assert (type->ActorInfo != NULL); assert (type->ActorInfo != NULL);
FActorInfo *replacesave = type->ActorInfo->Replacement;
if (!GoAway ()) if (!GoAway ())
{ {
Destroy (); Destroy ();
} }
// If the base ammo class has a replacement defined, the replacement
// must not be used in the inventory. copy = static_cast<AInventory *>(Spawn (type, 0, 0, 0, NO_REPLACE));
type->ActorInfo->Replacement = NULL;
copy = static_cast<AInventory *>(Spawn (type, 0, 0, 0));
type->ActorInfo->Replacement = replacesave;
copy->Amount = amount; copy->Amount = amount;
copy->BecomeItem (); copy->BecomeItem ();
} }
@ -318,7 +314,7 @@ void A_RestoreSpecialDoomThing (AActor *self)
{ {
self->SetState (self->SpawnState); self->SetState (self->SpawnState);
S_Sound (self, CHAN_VOICE, "misc/spawn", 1, ATTN_IDLE); S_Sound (self, CHAN_VOICE, "misc/spawn", 1, ATTN_IDLE);
Spawn<AItemFog> (self->x, self->y, self->z); Spawn<AItemFog> (self->x, self->y, self->z, ALLOW_REPLACE);
} }
} }
@ -594,7 +590,7 @@ bool AInventory::GoAway ()
{ {
if (ItemFlags & IF_PICKUPFLASH) if (ItemFlags & IF_PICKUPFLASH)
{ {
Spawn<APickupFlash> (x, y, z); Spawn<APickupFlash> (x, y, z, ALLOW_REPLACE);
} }
return false; return false;
} }
@ -603,7 +599,7 @@ bool AInventory::GoAway ()
{ {
if (ItemFlags & IF_PICKUPFLASH) if (ItemFlags & IF_PICKUPFLASH)
{ {
Spawn<APickupFlash> (x, y, z); Spawn<APickupFlash> (x, y, z, ALLOW_REPLACE);
} }
Hide (); Hide ();
if (ShouldRespawn ()) if (ShouldRespawn ())
@ -649,7 +645,7 @@ AInventory *AInventory::CreateCopy (AActor *other)
if (GoAway ()) if (GoAway ())
{ {
copy = static_cast<AInventory *>(Spawn (GetClass(), 0, 0, 0)); copy = static_cast<AInventory *>(Spawn (GetClass(), 0, 0, 0, NO_REPLACE));
copy->Amount = Amount; copy->Amount = Amount;
copy->MaxAmount = MaxAmount; copy->MaxAmount = MaxAmount;
} }
@ -693,7 +689,7 @@ AInventory *AInventory::CreateTossable ()
return this; return this;
} }
copy = static_cast<AInventory *>(Spawn (GetClass(), Owner->x, copy = static_cast<AInventory *>(Spawn (GetClass(), Owner->x,
Owner->y, Owner->z)); Owner->y, Owner->z, NO_REPLACE));
if (copy != NULL) if (copy != NULL)
{ {
copy->MaxAmount = MaxAmount; copy->MaxAmount = MaxAmount;
@ -1365,7 +1361,7 @@ bool ABasicArmorPickup::Use (bool pickup)
if (armor == NULL) if (armor == NULL)
{ {
armor = Spawn<ABasicArmor> (0,0,0); armor = Spawn<ABasicArmor> (0,0,0, NO_REPLACE);
armor->BecomeItem (); armor->BecomeItem ();
armor->SavePercent = SavePercent; armor->SavePercent = SavePercent;
armor->Amount = armor->MaxAmount = SaveAmount; armor->Amount = armor->MaxAmount = SaveAmount;
@ -1436,7 +1432,7 @@ bool ABasicArmorBonus::Use (bool pickup)
} }
if (armor == NULL) if (armor == NULL)
{ {
armor = Spawn<ABasicArmor> (0,0,0); armor = Spawn<ABasicArmor> (0,0,0, NO_REPLACE);
armor->BecomeItem (); armor->BecomeItem ();
armor->SavePercent = SavePercent; armor->SavePercent = SavePercent;
armor->Amount = saveAmount; armor->Amount = saveAmount;
@ -1518,7 +1514,7 @@ AInventory *ABasicArmor::CreateCopy (AActor *other)
{ {
// BasicArmor that is in use is stored in the inventory as BasicArmor. // BasicArmor that is in use is stored in the inventory as BasicArmor.
// BasicArmor that is in reserve is not. // BasicArmor that is in reserve is not.
ABasicArmor *copy = Spawn<ABasicArmor> (0, 0, 0); ABasicArmor *copy = Spawn<ABasicArmor> (0, 0, 0, NO_REPLACE);
copy->SavePercent = SavePercent != 0 ? SavePercent : FRACUNIT/3; copy->SavePercent = SavePercent != 0 ? SavePercent : FRACUNIT/3;
copy->Amount = Amount; copy->Amount = Amount;
copy->MaxAmount = MaxAmount; copy->MaxAmount = MaxAmount;
@ -1622,7 +1618,7 @@ AInventory *AHexenArmor::CreateCopy (AActor *other)
// Like BasicArmor, HexenArmor is used in the inventory but not the map. // Like BasicArmor, HexenArmor is used in the inventory but not the map.
// health is the slot this armor occupies. // health is the slot this armor occupies.
// Amount is the quantity to give (0 = normal max). // Amount is the quantity to give (0 = normal max).
AHexenArmor *copy = Spawn<AHexenArmor> (0, 0, 0); AHexenArmor *copy = Spawn<AHexenArmor> (0, 0, 0, NO_REPLACE);
copy->AddArmorToSlot (other, health, Amount); copy->AddArmorToSlot (other, health, Amount);
GoAwayAndDie (); GoAwayAndDie ();
return copy; return copy;
@ -1948,7 +1944,7 @@ AInventory *ABackpack::CreateCopy (AActor *other)
AAmmo *ammo = static_cast<AAmmo *>(other->FindInventory (type)); AAmmo *ammo = static_cast<AAmmo *>(other->FindInventory (type));
if (ammo == NULL) if (ammo == NULL)
{ // The player did not have the ammo. Add it. { // The player did not have the ammo. Add it.
ammo = static_cast<AAmmo *>(Spawn (type, 0, 0, 0)); ammo = static_cast<AAmmo *>(Spawn (type, 0, 0, 0, NO_REPLACE));
ammo->Amount = bDepleted ? 0 : ammo->BackpackAmount; ammo->Amount = bDepleted ? 0 : ammo->BackpackAmount;
ammo->MaxAmount = ammo->BackpackMaxAmount; ammo->MaxAmount = ammo->BackpackMaxAmount;
ammo->AttachToOwner (other); ammo->AttachToOwner (other);

View file

@ -147,7 +147,7 @@ void ASoundSequence::PostBeginPlay ()
} }
if (master == NULL) if (master == NULL)
{ {
master = Spawn<ASoundSequenceSlot> (0, 0, 0); master = Spawn<ASoundSequenceSlot> (0, 0, 0, NO_REPLACE);
master->Sequence = SN_StartSequence (master, slot, 0); master->Sequence = SN_StartSequence (master, slot, 0);
} }
master->Sequence->AddChoice (args[0], SEQ_ENVIRONMENT); master->Sequence->AddChoice (args[0], SEQ_ENVIRONMENT);

View file

@ -64,7 +64,7 @@ bool AWeaponPiece::TryPickup (AActor *toucher)
} }
if (!hold) if (!hold)
{ {
hold=static_cast<AWeaponHolder*>(Spawn(RUNTIME_CLASS(AWeaponHolder), 0, 0, 0)); hold=static_cast<AWeaponHolder*>(Spawn(RUNTIME_CLASS(AWeaponHolder), 0, 0, 0, NO_REPLACE));
hold->BecomeItem(); hold->BecomeItem();
hold->AttachToOwner(toucher); hold->AttachToOwner(toucher);
hold->PieceMask=0; hold->PieceMask=0;
@ -105,7 +105,7 @@ bool AWeaponPiece::TryPickup (AActor *toucher)
{ {
if (!toucher->FindInventory (WeaponClass)) if (!toucher->FindInventory (WeaponClass))
{ {
FullWeapon= static_cast<AWeapon*>(Spawn(WeaponClass, 0, 0, 0)); FullWeapon= static_cast<AWeapon*>(Spawn(WeaponClass, 0, 0, 0, NO_REPLACE));
// The weapon itself should not give more ammo to the player! // The weapon itself should not give more ammo to the player!
FullWeapon->AmmoGive1=0; FullWeapon->AmmoGive1=0;

View file

@ -253,7 +253,7 @@ AAmmo *AWeapon::AddAmmo (AActor *other, const PClass *ammotype, int amount)
ammo = static_cast<AAmmo *>(other->FindInventory (ammotype)); ammo = static_cast<AAmmo *>(other->FindInventory (ammotype));
if (ammo == NULL) if (ammo == NULL)
{ {
ammo = static_cast<AAmmo *>(Spawn (ammotype, 0, 0, 0)); ammo = static_cast<AAmmo *>(Spawn (ammotype, 0, 0, 0, NO_REPLACE));
ammo->Amount = MIN (amount, ammo->MaxAmount); ammo->Amount = MIN (amount, ammo->MaxAmount);
ammo->AttachToOwner (other); ammo->AttachToOwner (other);
} }
@ -309,7 +309,7 @@ AWeapon *AWeapon::AddWeapon (const PClass *weapontype)
weap = static_cast<AWeapon *>(Owner->FindInventory (weapontype)); weap = static_cast<AWeapon *>(Owner->FindInventory (weapontype));
if (weap == NULL) if (weap == NULL)
{ {
weap = static_cast<AWeapon *>(Spawn (weapontype, 0, 0, 0)); weap = static_cast<AWeapon *>(Spawn (weapontype, 0, 0, 0, NO_REPLACE));
weap->AttachToOwner (Owner); weap->AttachToOwner (Owner);
} }
return weap; return weap;

View file

@ -343,7 +343,7 @@ END_DEFAULTS
static void GenericSpectreSpawn (AActor *actor, const PClass *type) static void GenericSpectreSpawn (AActor *actor, const PClass *type)
{ {
AActor *spectre = Spawn (type, actor->x, actor->y, actor->z); AActor *spectre = Spawn (type, actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (spectre != NULL) if (spectre != NULL)
{ {
spectre->momz = pr_spectrespawn() << 9; spectre->momz = pr_spectrespawn() << 9;
@ -377,7 +377,7 @@ void A_SpawnSpectre5 (AActor *actor)
void A_212e4 (AActor *self) void A_212e4 (AActor *self)
{ {
AActor *foo = Spawn<AAlienChunkSmall> (self->x, self->y, self->z + 10*FRACUNIT); AActor *foo = Spawn<AAlienChunkSmall> (self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE);
if (foo != NULL) if (foo != NULL)
{ {
@ -395,7 +395,7 @@ void A_212e4 (AActor *self)
void A_2134c (AActor *self) void A_2134c (AActor *self)
{ {
AActor *foo = Spawn<AAlienChunkLarge> (self->x, self->y, self->z + 10*FRACUNIT); AActor *foo = Spawn<AAlienChunkLarge> (self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE);
if (foo != NULL) if (foo != NULL)
{ {
@ -464,7 +464,7 @@ void A_20334 (AActor *self)
if (self->target == NULL) if (self->target == NULL)
return; return;
AActor *foo = Spawn<ASpectralLightningV2> (self->x, self->y, self->z + 32*FRACUNIT); AActor *foo = Spawn<ASpectralLightningV2> (self->x, self->y, self->z + 32*FRACUNIT, ALLOW_REPLACE);
foo->momz = -12*FRACUNIT; foo->momz = -12*FRACUNIT;
foo->target = self; foo->target = self;

View file

@ -69,7 +69,7 @@ AInventory *ACoin::CreateCopy (AActor *other)
{ {
return Super::CreateCopy (other); return Super::CreateCopy (other);
} }
AInventory *copy = Spawn<ACoin> (0,0,0); AInventory *copy = Spawn<ACoin> (0,0,0, NO_REPLACE);
copy->Amount = Amount; copy->Amount = Amount;
copy->BecomeItem (); copy->BecomeItem ();
GoAwayAndDie (); GoAwayAndDie ();
@ -185,22 +185,22 @@ AInventory *ACoin::CreateTossable ()
if (Amount >= 50) if (Amount >= 50)
{ {
Amount -= 50; Amount -= 50;
tossed = Spawn<AGold50> (Owner->x, Owner->y, Owner->z); tossed = Spawn<AGold50> (Owner->x, Owner->y, Owner->z, NO_REPLACE);
} }
else if (Amount >= 25) else if (Amount >= 25)
{ {
Amount -= 25; Amount -= 25;
tossed = Spawn<AGold25> (Owner->x, Owner->y, Owner->z); tossed = Spawn<AGold25> (Owner->x, Owner->y, Owner->z, NO_REPLACE);
} }
else if (Amount >= 10) else if (Amount >= 10)
{ {
Amount -= 10; Amount -= 10;
tossed = Spawn<AGold10> (Owner->x, Owner->y, Owner->z); tossed = Spawn<AGold10> (Owner->x, Owner->y, Owner->z, NO_REPLACE);
} }
else if (Amount > 1) else if (Amount > 1)
{ {
Amount -= 1; Amount -= 1;
tossed = Spawn<ACoin> (Owner->x, Owner->y, Owner->z); tossed = Spawn<ACoin> (Owner->x, Owner->y, Owner->z, NO_REPLACE);
} }
else else
{ {

View file

@ -295,7 +295,7 @@ void A_200e0 (AActor *self)
case 0: case 0:
if (self->target != NULL) if (self->target != NULL)
{ {
bar = Spawn<ASpectralLightningSpot> (self->x, self->y, ONFLOORZ); bar = Spawn<ASpectralLightningSpot> (self->x, self->y, ONFLOORZ, ALLOW_REPLACE);
bar->threshold = 25; bar->threshold = 25;
bar->target = self; bar->target = self;
bar->tracer = self->target; bar->tracer = self->target;
@ -347,7 +347,7 @@ void A_200e0 (AActor *self)
void A_SpawnEntity (AActor *self) void A_SpawnEntity (AActor *self)
{ {
AActor *entity = Spawn<AEntityBoss> (self->x, self->y, self->z + 70*FRACUNIT); AActor *entity = Spawn<AEntityBoss> (self->x, self->y, self->z + 70*FRACUNIT, ALLOW_REPLACE);
if (entity != NULL) if (entity != NULL)
{ {
entity->angle = self->angle; entity->angle = self->angle;
@ -365,7 +365,7 @@ void A_20c74 (AActor *selfa)
an = self->angle >> ANGLETOFINESHIFT; an = self->angle >> ANGLETOFINESHIFT;
second = Spawn<AEntitySecond> (self->SpawnX + FixedMul (secondRadius, finecosine[an]), second = Spawn<AEntitySecond> (self->SpawnX + FixedMul (secondRadius, finecosine[an]),
self->SpawnY + FixedMul (secondRadius, finesine[an]), self->SpawnZ); self->SpawnY + FixedMul (secondRadius, finesine[an]), self->SpawnZ, ALLOW_REPLACE);
second->target = self->target; second->target = self->target;
A_FaceTarget (second); A_FaceTarget (second);
an = second->angle >> ANGLETOFINESHIFT; an = second->angle >> ANGLETOFINESHIFT;
@ -374,7 +374,7 @@ void A_20c74 (AActor *selfa)
an = (self->angle + ANGLE_90) >> ANGLETOFINESHIFT; an = (self->angle + ANGLE_90) >> ANGLETOFINESHIFT;
second = Spawn<AEntitySecond> (self->SpawnX + FixedMul (secondRadius, finecosine[an]), second = Spawn<AEntitySecond> (self->SpawnX + FixedMul (secondRadius, finecosine[an]),
self->SpawnY + FixedMul (secondRadius, finesine[an]), self->SpawnZ); self->SpawnY + FixedMul (secondRadius, finesine[an]), self->SpawnZ, ALLOW_REPLACE);
second->target = self->target; second->target = self->target;
second->momx = FixedMul (secondRadius, finecosine[an]) << 2; second->momx = FixedMul (secondRadius, finecosine[an]) << 2;
second->momy = FixedMul (secondRadius, finesine[an]) << 2; second->momy = FixedMul (secondRadius, finesine[an]) << 2;
@ -382,7 +382,7 @@ void A_20c74 (AActor *selfa)
an = (self->angle - ANGLE_90) >> ANGLETOFINESHIFT; an = (self->angle - ANGLE_90) >> ANGLETOFINESHIFT;
second = Spawn<AEntitySecond> (self->SpawnX + FixedMul (secondRadius, finecosine[an]), second = Spawn<AEntitySecond> (self->SpawnX + FixedMul (secondRadius, finecosine[an]),
self->SpawnY + FixedMul (secondRadius, finesine[an]), self->SpawnZ); self->SpawnY + FixedMul (secondRadius, finesine[an]), self->SpawnZ, ALLOW_REPLACE);
second->target = self->target; second->target = self->target;
second->momx = FixedMul (secondRadius, finecosine[an]) << 2; second->momx = FixedMul (secondRadius, finecosine[an]) << 2;
second->momy = FixedMul (secondRadius, finesine[an]) << 2; second->momy = FixedMul (secondRadius, finesine[an]) << 2;

View file

@ -287,7 +287,7 @@ void A_InquisitorCheckLand (AActor *self)
void A_TossArm (AActor *self) void A_TossArm (AActor *self)
{ {
AActor *foo = Spawn<AInquisitorArm> (self->x, self->y, self->z + 24*FRACUNIT); AActor *foo = Spawn<AInquisitorArm> (self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE);
foo->angle = self->angle - ANGLE_90 + (pr_inq.Random2() << 22); foo->angle = self->angle - ANGLE_90 + (pr_inq.Random2() << 22);
foo->momx = FixedMul (foo->Speed, finecosine[foo->angle >> ANGLETOFINESHIFT]) >> 3; foo->momx = FixedMul (foo->Speed, finecosine[foo->angle >> ANGLETOFINESHIFT]) >> 3;
foo->momy = FixedMul (foo->Speed, finesine[foo->angle >> ANGLETOFINESHIFT]) >> 3; foo->momy = FixedMul (foo->Speed, finesine[foo->angle >> ANGLETOFINESHIFT]) >> 3;

View file

@ -205,7 +205,7 @@ void A_20598 (AActor *self)
void A_205b0 (AActor *self) void A_205b0 (AActor *self)
{ {
S_Sound (self, CHAN_BODY, "loremaster/active", 1, ATTN_NORM); S_Sound (self, CHAN_BODY, "loremaster/active", 1, ATTN_NORM);
Spawn<ALoreShot2> (self->x, self->y, self->z); Spawn<ALoreShot2> (self->x, self->y, self->z, ALLOW_REPLACE);
Spawn<ALoreShot2> (self->x - (self->momx >> 1), self->y - (self->momy >> 1), self->z - (self->momz >> 1)); Spawn<ALoreShot2> (self->x - (self->momx >> 1), self->y - (self->momy >> 1), self->z - (self->momz >> 1), ALLOW_REPLACE);
Spawn<ALoreShot2> (self->x - self->momx, self->y - self->momy, self->z - self->momz); Spawn<ALoreShot2> (self->x - self->momx, self->y - self->momy, self->z - self->momz, ALLOW_REPLACE);
} }

View file

@ -247,7 +247,7 @@ void A_SpotLightning (AActor *self)
if (self->target == NULL) if (self->target == NULL)
return; return;
spot = Spawn<ASpectralLightningSpot> (self->target->x, self->target->y, ONFLOORZ); spot = Spawn<ASpectralLightningSpot> (self->target->x, self->target->y, ONFLOORZ, ALLOW_REPLACE);
if (spot != NULL) if (spot != NULL)
{ {
spot->threshold = 25; spot->threshold = 25;
@ -265,7 +265,7 @@ void A_SpotLightning (AActor *self)
void A_SpawnProgrammerBase (AActor *self) void A_SpawnProgrammerBase (AActor *self)
{ {
AActor *foo = Spawn<AProgrammerBase> (self->x, self->y, self->z + 24*FRACUNIT); AActor *foo = Spawn<AProgrammerBase> (self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE);
if (foo != NULL) if (foo != NULL)
{ {
foo->angle = self->angle + ANGLE_180 + (pr_prog.Random2() << 22); foo->angle = self->angle + ANGLE_180 + (pr_prog.Random2() << 22);

View file

@ -279,7 +279,7 @@ void A_Beacon (AActor *self)
ARebel *rebel; ARebel *rebel;
angle_t an; angle_t an;
rebel = Spawn<ARebel1> (self->x, self->y, ONFLOORZ); rebel = Spawn<ARebel1> (self->x, self->y, ONFLOORZ, ALLOW_REPLACE);
if (!P_TryMove (rebel, rebel->x, rebel->y, true)) if (!P_TryMove (rebel, rebel->x, rebel->y, true))
{ {
rebel->Destroy (); rebel->Destroy ();
@ -313,7 +313,7 @@ void A_Beacon (AActor *self)
rebel->SetState (rebel->SeeState); rebel->SetState (rebel->SeeState);
rebel->angle = self->angle; rebel->angle = self->angle;
an = self->angle >> ANGLETOFINESHIFT; an = self->angle >> ANGLETOFINESHIFT;
Spawn<ATeleportFog> (rebel->x + 20*finecosine[an], rebel->y + 20*finesine[an], rebel->z + TELEFOGHEIGHT); Spawn<ATeleportFog> (rebel->x + 20*finecosine[an], rebel->y + 20*finesine[an], rebel->z + TELEFOGHEIGHT, ALLOW_REPLACE);
if (--self->health < 0) if (--self->health < 0)
{ {
self->Destroy (); self->Destroy ();

View file

@ -163,7 +163,7 @@ void A_SentinelAttack (AActor *self)
trail = Spawn<ASentinelFX1> ( trail = Spawn<ASentinelFX1> (
self->x + FixedMul (missile->radius * i, finecosine[missile->angle >> ANGLETOFINESHIFT]), self->x + FixedMul (missile->radius * i, finecosine[missile->angle >> ANGLETOFINESHIFT]),
self->y + FixedMul (missile->radius * i, finesine[missile->angle >> ANGLETOFINESHIFT]), self->y + FixedMul (missile->radius * i, finesine[missile->angle >> ANGLETOFINESHIFT]),
missile->z + (missile->momz / 4 * i)); missile->z + (missile->momz / 4 * i), ALLOW_REPLACE);
if (trail != NULL) if (trail != NULL)
{ {
trail->target = self; trail->target = self;

View file

@ -149,7 +149,7 @@ END_DEFAULTS
void A_2046c (AActor *self) void A_2046c (AActor *self)
{ {
AActor *foo = Spawn<ASpectralLightningHTail> (self->x - self->momx, self->y - self->momy, self->z); AActor *foo = Spawn<ASpectralLightningHTail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
foo->angle = self->angle; foo->angle = self->angle;
foo->health = self->health; foo->health = self->health;
@ -290,13 +290,13 @@ void A_201fc (AActor *self)
y = self->y + pr_zap5.Random2(3) * FRACUNIT * 50; y = self->y + pr_zap5.Random2(3) * FRACUNIT * 50;
flash = Spawn (self->threshold > 25 ? RUNTIME_CLASS(ASpectralLightningV2) : flash = Spawn (self->threshold > 25 ? RUNTIME_CLASS(ASpectralLightningV2) :
RUNTIME_CLASS(ASpectralLightningV1), x, y, ONCEILINGZ); RUNTIME_CLASS(ASpectralLightningV1), x, y, ONCEILINGZ, ALLOW_REPLACE);
flash->target = self->target; flash->target = self->target;
flash->momz = -18*FRACUNIT; flash->momz = -18*FRACUNIT;
flash->health = self->health; flash->health = self->health;
flash = Spawn<ASpectralLightningV2> (self->x, self->y, ONCEILINGZ); flash = Spawn<ASpectralLightningV2> (self->x, self->y, ONCEILINGZ, ALLOW_REPLACE);
flash->target = self->target; flash->target = self->target;
flash->momz = -18*FRACUNIT; flash->momz = -18*FRACUNIT;

View file

@ -155,7 +155,7 @@ bool AHealthTraining::TryPickup (AActor *toucher)
if (Super::TryPickup (toucher)) if (Super::TryPickup (toucher))
{ {
toucher->GiveInventoryType (RUNTIME_CLASS(AGunTraining)); toucher->GiveInventoryType (RUNTIME_CLASS(AGunTraining));
AInventory *coin = Spawn<ACoin> (0,0,0); AInventory *coin = Spawn<ACoin> (0,0,0, NO_REPLACE);
if (coin != NULL) if (coin != NULL)
{ {
coin->Amount = toucher->player->accuracy*5 + 300; coin->Amount = toucher->player->accuracy*5 + 300;

View file

@ -768,7 +768,7 @@ END_DEFAULTS
void A_TossGib (AActor *self) void A_TossGib (AActor *self)
{ {
const PClass *gibtype = (self->flags & MF_NOBLOOD) ? RUNTIME_CLASS(AJunk) : RUNTIME_CLASS(AMeat); const PClass *gibtype = (self->flags & MF_NOBLOOD) ? RUNTIME_CLASS(AJunk) : RUNTIME_CLASS(AMeat);
AActor *gib = Spawn (gibtype, self->x, self->y, self->z + 24*FRACUNIT); AActor *gib = Spawn (gibtype, self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE);
angle_t an; angle_t an;
int speed; int speed;
@ -965,7 +965,7 @@ void A_ItBurnsItBurns (AActor *self)
void A_DropFire (AActor *self) void A_DropFire (AActor *self)
{ {
AActor *drop = Spawn<AFireDroplet> (self->x, self->y, self->z + 24*FRACUNIT); AActor *drop = Spawn<AFireDroplet> (self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE);
drop->momz = -FRACUNIT; drop->momz = -FRACUNIT;
P_RadiusAttack (self, self, 64, 64, MOD_FIRE, false); P_RadiusAttack (self, self, 64, 64, MOD_FIRE, false);
} }

View file

@ -746,7 +746,7 @@ END_DEFAULTS
AInventory *AAssaultGunStanding::CreateCopy (AActor *other) AInventory *AAssaultGunStanding::CreateCopy (AActor *other)
{ {
AAssaultGun *copy = Spawn<AAssaultGun> (0,0,0); AAssaultGun *copy = Spawn<AAssaultGun> (0,0,0, NO_REPLACE);
copy->AmmoGive1 = AmmoGive1; copy->AmmoGive1 = AmmoGive1;
copy->AmmoGive2 = AmmoGive2; copy->AmmoGive2 = AmmoGive2;
GoAwayAndDie (); GoAwayAndDie ();
@ -933,7 +933,7 @@ void A_RocketInFlight (AActor *self)
S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM); S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM);
P_SpawnPuff (RUNTIME_CLASS(AMiniMissilePuff), self->x, self->y, self->z, self->angle - ANGLE_180, 2, true); P_SpawnPuff (RUNTIME_CLASS(AMiniMissilePuff), self->x, self->y, self->z, self->angle - ANGLE_180, 2, true);
trail = Spawn<ARocketTrail> (self->x - self->momx, self->y - self->momy, self->z); trail = Spawn<ARocketTrail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
if (trail != NULL) if (trail != NULL)
{ {
trail->momz = FRACUNIT; trail->momz = FRACUNIT;
@ -1396,7 +1396,7 @@ void A_MaulerTorpedoWave (AActor *self)
AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target) AActor *P_SpawnSubMissile (AActor *source, PClass *type, AActor *target)
{ {
AActor *other = Spawn (type, source->x, source->y, source->z); AActor *other = Spawn (type, source->x, source->y, source->z, ALLOW_REPLACE);
if (other == NULL) if (other == NULL)
{ {
@ -1576,7 +1576,7 @@ int APhosphorousFire::DoSpecialDamage (AActor *target, int damage)
void A_SpawnBurn (AActor *self) void A_SpawnBurn (AActor *self)
{ {
Spawn<APhosphorousFire> (self->x, self->y, self->z); Spawn<APhosphorousFire> (self->x, self->y, self->z, ALLOW_REPLACE);
} }
void A_BurnArea (AActor *self) void A_BurnArea (AActor *self)
@ -1627,7 +1627,7 @@ void A_Burnination (AActor *self)
AActor *drop = Spawn<APhosphorousFire> ( AActor *drop = Spawn<APhosphorousFire> (
x, y, x, y,
self->z + 4*FRACUNIT); self->z + 4*FRACUNIT, ALLOW_REPLACE);
if (drop != NULL) if (drop != NULL)
{ {
drop->momx = self->momx + ((pr_phburn.Random2 (7)) << FRACBITS); drop->momx = self->momx + ((pr_phburn.Random2 (7)) << FRACBITS);
@ -2047,7 +2047,7 @@ bool ASigil::HandlePickup (AInventory *item)
AInventory *ASigil::CreateCopy (AActor *other) AInventory *ASigil::CreateCopy (AActor *other)
{ {
ASigil *copy = Spawn<ASigil> (0,0,0); ASigil *copy = Spawn<ASigil> (0,0,0, NO_REPLACE);
copy->Amount = Amount; copy->Amount = Amount;
copy->MaxAmount = MaxAmount; copy->MaxAmount = MaxAmount;
copy->NumPieces = NumPieces; copy->NumPieces = NumPieces;
@ -2199,7 +2199,7 @@ void A_FireSigil1 (AActor *actor)
P_BulletSlope (actor); P_BulletSlope (actor);
if (linetarget != NULL) if (linetarget != NULL)
{ {
spot = Spawn<ASpectralLightningSpot> (linetarget->x, linetarget->y, ONFLOORZ); spot = Spawn<ASpectralLightningSpot> (linetarget->x, linetarget->y, ONFLOORZ, ALLOW_REPLACE);
if (spot != NULL) if (spot != NULL)
{ {
spot->tracer = linetarget; spot->tracer = linetarget;
@ -2207,7 +2207,7 @@ void A_FireSigil1 (AActor *actor)
} }
else else
{ {
spot = Spawn<ASpectralLightningSpot> (actor->x, actor->y, actor->z); spot = Spawn<ASpectralLightningSpot> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (spot != NULL) if (spot != NULL)
{ {
spot->momx += 28 * finecosine[actor->angle >> ANGLETOFINESHIFT]; spot->momx += 28 * finecosine[actor->angle >> ANGLETOFINESHIFT];
@ -2380,7 +2380,7 @@ int ASigil::GiveSigilPiece (AActor *receiver)
sigil = receiver->FindInventory<ASigil> (); sigil = receiver->FindInventory<ASigil> ();
if (sigil == NULL) if (sigil == NULL)
{ {
sigil = Spawn<ASigil1> (0,0,0); sigil = Spawn<ASigil1> (0,0,0, NO_REPLACE);
if (!sigil->TryPickup (receiver)) if (!sigil->TryPickup (receiver))
{ {
sigil->Destroy (); sigil->Destroy ();

View file

@ -60,7 +60,7 @@ void A_Bang4Cloud (AActor *self)
spawnx = self->x + (pr_bang4cloud.Random2() & 3) * 10240; spawnx = self->x + (pr_bang4cloud.Random2() & 3) * 10240;
spawny = self->y + (pr_bang4cloud.Random2() & 3) * 10240; spawny = self->y + (pr_bang4cloud.Random2() & 3) * 10240;
Spawn<ABang4Cloud> (spawnx, spawny, self->z); Spawn<ABang4Cloud> (spawnx, spawny, self->z, ALLOW_REPLACE);
} }
// Piston ------------------------------------------------------------------- // Piston -------------------------------------------------------------------
@ -74,7 +74,7 @@ void A_GiveQuestItem (AActor *self)
{ {
if (playeringame[i]) if (playeringame[i])
{ {
AInventory *item = static_cast<AInventory *>(Spawn (QuestItemClasses[questitem-1], 0,0,0)); AInventory *item = static_cast<AInventory *>(Spawn (QuestItemClasses[questitem-1], 0,0,0, NO_REPLACE));
if (!item->TryPickup (players[i].mo)) if (!item->TryPickup (players[i].mo))
{ {
item->Destroy (); item->Destroy ();
@ -272,7 +272,7 @@ void A_LightGoesOut (AActor *self)
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {
foo = Spawn("Rubble1", self->x, self->y, self->z); foo = Spawn("Rubble1", self->x, self->y, self->z, ALLOW_REPLACE);
if (foo != NULL) if (foo != NULL)
{ {
int t = pr_lightout() & 15; int t = pr_lightout() & 15;

View file

@ -418,7 +418,7 @@ void GiveSpawner (player_t *player, const PClass *type, int amount)
} }
AInventory *item = static_cast<AInventory *> AInventory *item = static_cast<AInventory *>
(Spawn (type, player->mo->x, player->mo->y, player->mo->z)); (Spawn (type, player->mo->x, player->mo->y, player->mo->z, NO_REPLACE));
if (item != NULL) if (item != NULL)
{ {
if (amount > 0) if (amount > 0)
@ -533,7 +533,7 @@ void cht_Give (player_t *player, char *name, int amount)
AInventory *ammo = player->mo->FindInventory (type); AInventory *ammo = player->mo->FindInventory (type);
if (ammo == NULL) if (ammo == NULL)
{ {
ammo = static_cast<AInventory *>(Spawn (type, 0, 0, 0)); ammo = static_cast<AInventory *>(Spawn (type, 0, 0, 0, NO_REPLACE));
ammo->AttachToOwner (player->mo); ammo->AttachToOwner (player->mo);
ammo->Amount = ammo->MaxAmount; ammo->Amount = ammo->MaxAmount;
} }
@ -552,7 +552,7 @@ void cht_Give (player_t *player, char *name, int amount)
{ {
if (gameinfo.gametype != GAME_Hexen) if (gameinfo.gametype != GAME_Hexen)
{ {
ABasicArmorPickup *armor = Spawn<ABasicArmorPickup> (0,0,0); ABasicArmorPickup *armor = Spawn<ABasicArmorPickup> (0,0,0, NO_REPLACE);
armor->SaveAmount = 100*deh.BlueAC; armor->SaveAmount = 100*deh.BlueAC;
armor->SavePercent = gameinfo.gametype != GAME_Heretic ? FRACUNIT/2 : FRACUNIT*3/4; armor->SavePercent = gameinfo.gametype != GAME_Heretic ? FRACUNIT/2 : FRACUNIT*3/4;
if (!armor->TryPickup (player->mo)) if (!armor->TryPickup (player->mo))
@ -564,7 +564,7 @@ void cht_Give (player_t *player, char *name, int amount)
{ {
for (i = 0; i < 4; ++i) for (i = 0; i < 4; ++i)
{ {
AHexenArmor *armor = Spawn<AHexenArmor> (0,0,0); AHexenArmor *armor = Spawn<AHexenArmor> (0,0,0, NO_REPLACE);
armor->health = i; armor->health = i;
armor->Amount = 0; armor->Amount = 0;
if (!armor->TryPickup (player->mo)) if (!armor->TryPickup (player->mo))
@ -587,7 +587,7 @@ void cht_Give (player_t *player, char *name, int amount)
AKey *key = (AKey *)GetDefaultByType (PClass::m_Types[i]); AKey *key = (AKey *)GetDefaultByType (PClass::m_Types[i]);
if (key->KeyNumber != 0) if (key->KeyNumber != 0)
{ {
key = static_cast<AKey *>(Spawn (PClass::m_Types[i], 0,0,0)); key = static_cast<AKey *>(Spawn (PClass::m_Types[i], 0,0,0, NO_REPLACE));
if (!key->TryPickup (player->mo)) if (!key->TryPickup (player->mo))
{ {
key->Destroy (); key->Destroy ();

View file

@ -175,7 +175,7 @@ static void DoGiveInv (AActor *actor, const PClass *info, int amount)
? actor->player->PendingWeapon : NULL; ? actor->player->PendingWeapon : NULL;
bool hadweap = actor->player != NULL ? actor->player->ReadyWeapon != NULL : true; bool hadweap = actor->player != NULL ? actor->player->ReadyWeapon != NULL : true;
AInventory *item = static_cast<AInventory *>(Spawn (info, 0,0,0)); AInventory *item = static_cast<AInventory *>(Spawn (info, 0,0,0, NO_REPLACE));
// This shouldn't count for the item statistics! // This shouldn't count for the item statistics!
if (item->flags & MF_COUNTITEM) if (item->flags & MF_COUNTITEM)
@ -1840,9 +1840,7 @@ int DLevelScript::DoSpawn (int type, fixed_t x, fixed_t y, fixed_t z, int tid, i
if (info != NULL) if (info != NULL)
{ {
// Handle decorate replacements. actor = Spawn (info, x, y, z, ALLOW_REPLACE);
info = info->ActorInfo->GetReplacement()->Class;
actor = Spawn (info, x, y, z);
if (actor != NULL) if (actor != NULL)
{ {
if (P_TestMobjLocation (actor)) if (P_TestMobjLocation (actor))

View file

@ -903,7 +903,7 @@ static void PickConversationReply ()
if (takestuff) if (takestuff)
{ {
AInventory *item = static_cast<AInventory *> (Spawn (reply->GiveType, 0, 0, 0)); AInventory *item = static_cast<AInventory *> (Spawn (reply->GiveType, 0, 0, 0, NO_REPLACE));
// Items given here should not count as items! // Items given here should not count as items!
if (item->flags & MF_COUNTITEM) if (item->flags & MF_COUNTITEM)
{ {

View file

@ -2210,10 +2210,7 @@ AInventory *P_DropItem (AActor *source, const PClass *type, int special, int cha
spawnz += source->height / 2; spawnz += source->height / 2;
} }
} }
// Handle decorate replacements. mo = Spawn (type, source->x, source->y, spawnz, ALLOW_REPLACE);
type = type->ActorInfo->GetReplacement()->Class;
mo = Spawn (type, source->x, source->y, spawnz);
mo->flags |= MF_DROPPED; mo->flags |= MF_DROPPED;
mo->flags &= ~MF_NOGRAVITY; // [RH] Make sure it is affected by gravity mo->flags &= ~MF_NOGRAVITY; // [RH] Make sure it is affected by gravity
if (mo->IsKindOf (RUNTIME_CLASS(AInventory))) if (mo->IsKindOf (RUNTIME_CLASS(AInventory)))

View file

@ -2591,7 +2591,7 @@ FUNC(LS_GlassBreak)
for (int i = 0; i < 7; ++i) for (int i = 0; i < 7; ++i)
{ {
glass = Spawn<AGlassJunk> (x, y, ONFLOORZ); glass = Spawn<AGlassJunk> (x, y, ONFLOORZ, ALLOW_REPLACE);
glass->z += 24 * FRACUNIT; glass->z += 24 * FRACUNIT;
glass->SetState (&AGlassJunk::States[3 + pr_glass() % 3]); glass->SetState (&AGlassJunk::States[3 + pr_glass() % 3]);

View file

@ -3053,7 +3053,7 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
} }
if (trace.CrossedWater) if (trace.CrossedWater)
{ {
AActor *puff = Spawn<ABulletPuff> (0, 0, 0); AActor *puff = Spawn<ABulletPuff> (0, 0, 0, ALLOW_REPLACE);
if (puff != NULL) if (puff != NULL)
{ {
SpawnDeepSplash (source, trace, puff, vx, vy, vz); SpawnDeepSplash (source, trace, puff, vx, vy, vz);
@ -3858,7 +3858,7 @@ void P_DoCrunch (AActor *thing)
} }
if (!(thing->flags & MF_NOBLOOD)) if (!(thing->flags & MF_NOBLOOD))
{ {
AActor *gib = Spawn<ARealGibs> (thing->x, thing->y, thing->z); AActor *gib = Spawn<ARealGibs> (thing->x, thing->y, thing->z, ALLOW_REPLACE);
gib->RenderStyle = thing->RenderStyle; gib->RenderStyle = thing->RenderStyle;
gib->alpha = thing->alpha; gib->alpha = thing->alpha;
gib->height = 0; gib->height = 0;
@ -3921,7 +3921,7 @@ void P_DoCrunch (AActor *thing)
AActor *mo; AActor *mo;
mo = Spawn<ABlood> (thing->x, thing->y, mo = Spawn<ABlood> (thing->x, thing->y,
thing->z + thing->height/2); thing->z + thing->height/2, ALLOW_REPLACE);
mo->momx = pr_crunch.Random2 () << 12; mo->momx = pr_crunch.Random2 () << 12;
mo->momy = pr_crunch.Random2 () << 12; mo->momy = pr_crunch.Random2 () << 12;

View file

@ -813,7 +813,7 @@ AInventory *AActor::GiveInventoryType (const PClass *type)
{ {
AInventory *item; AInventory *item;
item = static_cast<AInventory *>(Spawn (type, 0,0,0)); item = static_cast<AInventory *>(Spawn (type, 0,0,0, NO_REPLACE));
if (!item->TryPickup (this)) if (!item->TryPickup (this))
{ {
item->Destroy (); item->Destroy ();
@ -832,7 +832,7 @@ AInventory *AActor::GiveInventoryType (const PClass *type)
bool AActor::GiveAmmo (const PClass *type, int amount) bool AActor::GiveAmmo (const PClass *type, int amount)
{ {
AInventory *item = static_cast<AInventory *>(Spawn (type, 0, 0, 0)); AInventory *item = static_cast<AInventory *>(Spawn (type, 0, 0, 0, NO_REPLACE));
item->Amount = amount; item->Amount = amount;
item->flags |= MF_DROPPED; item->flags |= MF_DROPPED;
if (!item->TryPickup (this)) if (!item->TryPickup (this))
@ -2147,7 +2147,7 @@ void P_NightmareRespawn (AActor *mobj)
// spawn it // spawn it
x = mobj->SpawnPoint[0] << FRACBITS; x = mobj->SpawnPoint[0] << FRACBITS;
y = mobj->SpawnPoint[1] << FRACBITS; y = mobj->SpawnPoint[1] << FRACBITS;
mo = Spawn (RUNTIME_TYPE(mobj), x, y, z); mo = Spawn (RUNTIME_TYPE(mobj), x, y, z, NO_REPLACE);
if (z == ONFLOORZ) if (z == ONFLOORZ)
mo->z += mo->SpawnPoint[2] << FRACBITS; mo->z += mo->SpawnPoint[2] << FRACBITS;
@ -2179,14 +2179,14 @@ void P_NightmareRespawn (AActor *mobj)
mo->Translation = mobj->Translation; mo->Translation = mobj->Translation;
// spawn a teleport fog at old spot because of removal of the body? // spawn a teleport fog at old spot because of removal of the body?
mo = Spawn ("TeleportFog", mobj->x, mobj->y, mobj->z); mo = Spawn ("TeleportFog", mobj->x, mobj->y, mobj->z, ALLOW_REPLACE);
if (mo != NULL) if (mo != NULL)
{ {
mo->z += TELEFOGHEIGHT; mo->z += TELEFOGHEIGHT;
} }
// spawn a teleport fog at the new spot // spawn a teleport fog at the new spot
mo = Spawn ("TeleportFog", x, y, z); mo = Spawn ("TeleportFog", x, y, z, ALLOW_REPLACE);
if (mo != NULL) if (mo != NULL)
{ {
mo->z += TELEFOGHEIGHT; mo->z += TELEFOGHEIGHT;
@ -3014,7 +3014,7 @@ END_DEFAULTS
// //
//========================================================================== //==========================================================================
AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t iz) AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t iz, replace_t allowreplacement)
{ {
if (type == NULL) if (type == NULL)
{ {
@ -3026,6 +3026,10 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t
I_Error ("%s is not an actor\n", type->TypeName.GetChars()); I_Error ("%s is not an actor\n", type->TypeName.GetChars());
} }
if (allowreplacement)
type = type->ActorInfo->GetReplacement()->Class;
AActor *actor; AActor *actor;
actor = static_cast<AActor *>(const_cast<PClass *>(type)->CreateNew ()); actor = static_cast<AActor *>(const_cast<PClass *>(type)->CreateNew ());
@ -3359,7 +3363,7 @@ void P_SpawnPlayer (mapthing2_t *mthing, bool startenterscripts)
} }
mobj = static_cast<APlayerPawn *> mobj = static_cast<APlayerPawn *>
(Spawn (p->cls, mthing->x << FRACBITS, mthing->y << FRACBITS, ONFLOORZ)); (Spawn (p->cls, mthing->x << FRACBITS, mthing->y << FRACBITS, ONFLOORZ, NO_REPLACE));
mobj->FriendPlayer = playernum + 1; // [RH] players are their own friends mobj->FriendPlayer = playernum + 1; // [RH] players are their own friends
oldactor = p->mo; oldactor = p->mo;
@ -3457,7 +3461,7 @@ void P_SpawnPlayer (mapthing2_t *mthing, bool startenterscripts)
if (multiplayer) if (multiplayer)
{ {
unsigned an = ( ANG45 * (mthing->angle/45) ) >> ANGLETOFINESHIFT; unsigned an = ( ANG45 * (mthing->angle/45) ) >> ANGLETOFINESHIFT;
Spawn ("TeleportFog", mobj->x+20*finecosine[an], mobj->y+20*finesine[an], mobj->z + TELEFOGHEIGHT); Spawn ("TeleportFog", mobj->x+20*finecosine[an], mobj->y+20*finesine[an], mobj->z + TELEFOGHEIGHT, ALLOW_REPLACE);
} }
// "Fix" for one of the starts on exec.wad MAP01: If you start inside the ceiling, // "Fix" for one of the starts on exec.wad MAP01: If you start inside the ceiling,
@ -3710,7 +3714,8 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
// it to the unknown thing. // it to the unknown thing.
else else
{ {
// Handle decorate replacements. // Handle decorate replacements explicitly here
// to check for missing frames in the replacement object.
i = i->ActorInfo->GetReplacement()->Class; i = i->ActorInfo->GetReplacement()->Class;
const AActor *defaults = GetDefaultByType (i); const AActor *defaults = GetDefaultByType (i);
@ -3785,7 +3790,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position)
z = ONFLOORZ; z = ONFLOORZ;
SpawningMapThing = true; SpawningMapThing = true;
mobj = Spawn (i, x, y, z); mobj = Spawn (i, x, y, z, NO_REPLACE);
SpawningMapThing = false; SpawningMapThing = false;
if (z == ONFLOORZ) if (z == ONFLOORZ)
@ -3833,7 +3838,7 @@ AActor *P_SpawnPuff (const PClass *pufftype, fixed_t x, fixed_t y, fixed_t z, an
z += pr_spawnpuff.Random2 () << 10; z += pr_spawnpuff.Random2 () << 10;
puff = Spawn (pufftype, x, y, z); puff = Spawn (pufftype, x, y, z, ALLOW_REPLACE);
// If a puff has a crash state and an actor was not hit, // If a puff has a crash state and an actor was not hit,
// it will enter the crash state. This is used by the StrifeSpark // it will enter the crash state. This is used by the StrifeSpark
@ -3905,7 +3910,7 @@ void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, angle_t dir, int damage, AAc
if (cl_bloodtype <= 1) if (cl_bloodtype <= 1)
{ {
z += pr_spawnblood.Random2 () << 10; z += pr_spawnblood.Random2 () << 10;
th = Spawn<ABlood> (x, y, z); th = Spawn<ABlood> (x, y, z, ALLOW_REPLACE);
th->momz = FRACUNIT*2; th->momz = FRACUNIT*2;
th->angle = dir; th->angle = dir;
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype == GAME_Doom)
@ -3967,14 +3972,7 @@ void P_BloodSplatter (fixed_t x, fixed_t y, fixed_t z, AActor *originator)
{ {
AActor *mo; AActor *mo;
if (gameinfo.gametype == GAME_Doom) mo = Spawn<ABloodSplatter> (x, y, z, ALLOW_REPLACE);
{
mo = Spawn<ABlood> (x, y, z);
}
else
{
mo = Spawn<ABloodSplatter> (x, y, z);
}
mo->target = originator; mo->target = originator;
mo->momx = pr_splatter.Random2 () << 10; mo->momx = pr_splatter.Random2 () << 10;
mo->momy = pr_splatter.Random2 () << 10; mo->momy = pr_splatter.Random2 () << 10;
@ -4006,7 +4004,7 @@ void P_RipperBlood (AActor *mo, AActor *bleeder)
if (cl_bloodtype <= 1) if (cl_bloodtype <= 1)
{ {
AActor *th; AActor *th;
th = Spawn<ABlood> (x, y, z); th = Spawn<ABlood> (x, y, z, ALLOW_REPLACE);
if (gameinfo.gametype == GAME_Heretic) if (gameinfo.gametype == GAME_Heretic)
th->flags |= MF_NOGRAVITY; th->flags |= MF_NOGRAVITY;
th->momx = mo->momx >> 1; th->momx = mo->momx >> 1;
@ -4093,14 +4091,14 @@ bool P_HitWater (AActor *thing, sector_t *sec)
if (smallsplash && splash->SmallSplash) if (smallsplash && splash->SmallSplash)
{ {
mo = Spawn (splash->SmallSplash, thing->x, thing->y, z); mo = Spawn (splash->SmallSplash, thing->x, thing->y, z, ALLOW_REPLACE);
if (mo) mo->floorclip += splash->SmallSplashClip; if (mo) mo->floorclip += splash->SmallSplashClip;
} }
else else
{ {
if (splash->SplashChunk) if (splash->SplashChunk)
{ {
mo = Spawn (splash->SplashChunk, thing->x, thing->y, z); mo = Spawn (splash->SplashChunk, thing->x, thing->y, z, ALLOW_REPLACE);
mo->target = thing; mo->target = thing;
if (splash->ChunkXVelShift != 255) if (splash->ChunkXVelShift != 255)
{ {
@ -4114,7 +4112,7 @@ bool P_HitWater (AActor *thing, sector_t *sec)
} }
if (splash->SplashBase) if (splash->SplashBase)
{ {
mo = Spawn (splash->SplashBase, thing->x, thing->y, z); mo = Spawn (splash->SplashBase, thing->x, thing->y, z, ALLOW_REPLACE);
} }
if (thing->player && !splash->NoAlert) if (thing->player && !splash->NoAlert)
{ {
@ -4264,7 +4262,7 @@ AActor *P_SpawnMissileXYZ (fixed_t x, fixed_t y, fixed_t z,
z -= source->floorclip; z -= source->floorclip;
} }
AActor *th = Spawn (type, x, y, z); AActor *th = Spawn (type, x, y, z, ALLOW_REPLACE);
if (th->SeeSound) if (th->SeeSound)
S_SoundID (th, CHAN_VOICE, th->SeeSound, 1, ATTN_NORM); S_SoundID (th, CHAN_VOICE, th->SeeSound, 1, ATTN_NORM);
@ -4392,7 +4390,7 @@ AActor *P_SpawnMissileAngleZSpeed (AActor *source, fixed_t z,
{ {
z -= source->floorclip; z -= source->floorclip;
} }
mo = Spawn (type, source->x, source->y, z); mo = Spawn (type, source->x, source->y, z, ALLOW_REPLACE);
if (mo->SeeSound) if (mo->SeeSound)
{ {
S_SoundID (mo, CHAN_VOICE, mo->SeeSound, 1, ATTN_NORM); S_SoundID (mo, CHAN_VOICE, mo->SeeSound, 1, ATTN_NORM);
@ -4467,7 +4465,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
{ {
z += 4*8*FRACUNIT - source->floorclip + (source->player? source->player->crouchoffset : 0); z += 4*8*FRACUNIT - source->floorclip + (source->player? source->player->crouchoffset : 0);
} }
MissileActor = Spawn (type, x, y, z); MissileActor = Spawn (type, x, y, z, ALLOW_REPLACE);
if (MissileActor->SeeSound) if (MissileActor->SeeSound)
{ {

View file

@ -227,14 +227,14 @@ bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
if (sourceFog) if (sourceFog)
{ {
fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT; fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT;
Spawn<ATeleportFog> (oldx, oldy, oldz + fogDelta); Spawn<ATeleportFog> (oldx, oldy, oldz + fogDelta, ALLOW_REPLACE);
} }
if (useFog) if (useFog)
{ {
fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT; fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT;
an = angle >> ANGLETOFINESHIFT; an = angle >> ANGLETOFINESHIFT;
Spawn<ATeleportFog> (x + 20*finecosine[an], Spawn<ATeleportFog> (x + 20*finecosine[an],
y + 20*finesine[an], thing->z + fogDelta); y + 20*finesine[an], thing->z + fogDelta, ALLOW_REPLACE);
if (thing->player) if (thing->player)
{ {
// [RH] Zoom player's field of vision // [RH] Zoom player's field of vision

View file

@ -64,7 +64,6 @@ bool P_Thing_Spawn (int tid, int type, angle_t angle, bool fog, int newtid)
if ( (kind = SpawnableThings[type]) == NULL) if ( (kind = SpawnableThings[type]) == NULL)
return false; return false;
// Handle decorate replacements. // Handle decorate replacements.
kind = kind->ActorInfo->GetReplacement()->Class; kind = kind->ActorInfo->GetReplacement()->Class;
@ -73,7 +72,7 @@ bool P_Thing_Spawn (int tid, int type, angle_t angle, bool fog, int newtid)
while ( (spot = iterator.Next ()) ) while ( (spot = iterator.Next ()) )
{ {
mobj = Spawn (kind, spot->x, spot->y, spot->z); mobj = Spawn (kind, spot->x, spot->y, spot->z, ALLOW_REPLACE);
if (mobj != NULL) if (mobj != NULL)
{ {
@ -85,7 +84,7 @@ bool P_Thing_Spawn (int tid, int type, angle_t angle, bool fog, int newtid)
mobj->angle = (angle != ANGLE_MAX ? angle : spot->angle); mobj->angle = (angle != ANGLE_MAX ? angle : spot->angle);
if (fog) if (fog)
{ {
Spawn<ATeleportFog> (spot->x, spot->y, spot->z + TELEFOGHEIGHT); Spawn<ATeleportFog> (spot->x, spot->y, spot->z + TELEFOGHEIGHT, ALLOW_REPLACE);
} }
if (mobj->flags & MF_SPECIAL) if (mobj->flags & MF_SPECIAL)
mobj->flags |= MF_DROPPED; // Don't respawn mobj->flags |= MF_DROPPED; // Don't respawn
@ -131,8 +130,8 @@ bool P_MoveThing(AActor * source, fixed_t x, fixed_t y, fixed_t z, bool fog)
{ {
if (fog) if (fog)
{ {
Spawn<ATeleportFog> (x, y, z + TELEFOGHEIGHT); Spawn<ATeleportFog> (x, y, z + TELEFOGHEIGHT, ALLOW_REPLACE);
Spawn<ATeleportFog> (oldx, oldy, oldz + TELEFOGHEIGHT); Spawn<ATeleportFog> (oldx, oldy, oldz + TELEFOGHEIGHT, ALLOW_REPLACE);
} }
return true; return true;
} }
@ -213,7 +212,7 @@ bool P_Thing_Projectile (int tid, int type, const char * type_name, angle_t angl
{ {
z -= spot->floorclip; z -= spot->floorclip;
} }
mobj = Spawn (kind, spot->x, spot->y, z); mobj = Spawn (kind, spot->x, spot->y, z, ALLOW_REPLACE);
if (mobj) if (mobj)
{ {

View file

@ -666,7 +666,7 @@ void APlayerPawn::GiveDeathmatchInventory()
AKey *key = (AKey *)GetDefaultByType (PClass::m_Types[i]); AKey *key = (AKey *)GetDefaultByType (PClass::m_Types[i]);
if (key->KeyNumber != 0) if (key->KeyNumber != 0)
{ {
key = static_cast<AKey *>(Spawn (PClass::m_Types[i], 0,0,0)); key = static_cast<AKey *>(Spawn (PClass::m_Types[i], 0,0,0, NO_REPLACE));
if (!key->TryPickup (this)) if (!key->TryPickup (this))
{ {
key->Destroy (); key->Destroy ();
@ -876,7 +876,7 @@ void APlayerPawn::GiveDefaultInventory ()
} }
else else
{ {
AInventory *item = static_cast<AInventory *>(Spawn (ti, 0,0,0)); AInventory *item = static_cast<AInventory *>(Spawn (ti, 0,0,0, NO_REPLACE));
item->Amount = di->amount; item->Amount = di->amount;
if (item->IsKindOf (RUNTIME_CLASS (AWeapon))) if (item->IsKindOf (RUNTIME_CLASS (AWeapon)))
{ {

View file

@ -566,7 +566,8 @@ void R_InitSkins (void)
int lump = Wads.CheckNumForName (sc_String, skins[i].namespc); int lump = Wads.CheckNumForName (sc_String, skins[i].namespc);
if (lump == -1) if (lump == -1)
{ {
lump = Wads.CheckNumForName (sc_String, ns_sounds); lump = Wads.CheckNumForFullName (sc_String);
if (lump == -1) lump = Wads.CheckNumForName (sc_String, ns_sounds);
} }
if (lump != -1) if (lump != -1)
{ {
@ -599,7 +600,8 @@ void R_InitSkins (void)
sndlumps[j] = Wads.CheckNumForName (sc_String, skins[i].namespc); sndlumps[j] = Wads.CheckNumForName (sc_String, skins[i].namespc);
if (sndlumps[j] == -1) if (sndlumps[j] == -1)
{ // Replacement not found, try finding it in the global namespace { // Replacement not found, try finding it in the global namespace
sndlumps[j] = Wads.CheckNumForName (sc_String, ns_sounds); sndlumps[j] = Wads.CheckNumForFullName (sc_String);
if (sndlumps[j] == -1) sndlumps[j] = Wads.CheckNumForName (sc_String, ns_sounds);
} }
} }
} }

View file

@ -439,8 +439,9 @@ int S_FindSoundTentative (const char *name)
int S_AddSound (const char *logicalname, const char *lumpname) int S_AddSound (const char *logicalname, const char *lumpname)
{ {
return S_AddSound (logicalname, int lump = Wads.CheckNumForFullName (lumpname);
lumpname ? Wads.CheckNumForName (lumpname, ns_sounds) : -1); if (lump == -1) lump = Wads.CheckNumForName (lumpname, ns_sounds);
return S_AddSound (logicalname, lump);
} }
static int S_AddSound (const char *logicalname, int lumpnum) static int S_AddSound (const char *logicalname, int lumpnum)
@ -493,8 +494,15 @@ static int S_AddSound (const char *logicalname, int lumpnum)
int S_AddPlayerSound (const char *pclass, int gender, int refid, int S_AddPlayerSound (const char *pclass, int gender, int refid,
const char *lumpname) const char *lumpname)
{ {
return S_AddPlayerSound (pclass, gender, refid, int lump;
lumpname ? Wads.CheckNumForName (lumpname, ns_sounds) : -1);
if (lumpname)
{
lump = Wads.CheckNumForFullName (lumpname);
if (lump == -1) lump = Wads.CheckNumForName (lumpname, ns_sounds);
}
return S_AddPlayerSound (pclass, gender, refid, lump);
} }
int S_AddPlayerSound (const char *pclass, int gender, int refid, int lumpnum, bool fromskin) int S_AddPlayerSound (const char *pclass, int gender, int refid, int lumpnum, bool fromskin)

View file

@ -3641,7 +3641,7 @@ static void PlayerStartItem (APlayerPawn *defaults, Baggage &bag)
FDropItem * di=new FDropItem; FDropItem * di=new FDropItem;
SC_MustGetString(); SC_MustGetString();
di->Name=strdup(sc_String); di->Name = sc_String;
di->probability=255; di->probability=255;
di->amount=0; di->amount=0;
if (SC_CheckNumber()) if (SC_CheckNumber())

View file

@ -1025,7 +1025,7 @@ static void DoGiveInventory(AActor * self, AActor * receiver)
const PClass * mi=PClass::FindClass(item); const PClass * mi=PClass::FindClass(item);
if (mi) if (mi)
{ {
AInventory *item = static_cast<AInventory *>(Spawn (mi, 0, 0, 0)); AInventory *item = static_cast<AInventory *>(Spawn (mi, 0, 0, 0, NO_REPLACE));
if (item->IsKindOf(RUNTIME_CLASS(AHealth))) if (item->IsKindOf(RUNTIME_CLASS(AHealth)))
{ {
item->Amount *= amount; item->Amount *= amount;
@ -1143,13 +1143,10 @@ void A_SpawnItem(AActor * self)
if (useammo && !weapon->DepleteAmmo(weapon->bAltFire)) return; if (useammo && !weapon->DepleteAmmo(weapon->bAltFire)) return;
} }
// Handle decorate replacements.
missile = missile->ActorInfo->GetReplacement()->Class;
AActor * mo = Spawn( missile, AActor * mo = Spawn( missile,
self->x + FixedMul(distance, finecosine[self->angle>>ANGLETOFINESHIFT]), self->x + FixedMul(distance, finecosine[self->angle>>ANGLETOFINESHIFT]),
self->y + FixedMul(distance, finesine[self->angle>>ANGLETOFINESHIFT]), self->y + FixedMul(distance, finesine[self->angle>>ANGLETOFINESHIFT]),
self->z - self->floorclip + zheight); self->z - self->floorclip + zheight, ALLOW_REPLACE);
if (mo) if (mo)
{ {
@ -1236,7 +1233,8 @@ void A_ThrowGrenade(AActor * self)
AActor * bo; AActor * bo;
bo = Spawn(missile, self->x, self->y, bo = Spawn(missile, self->x, self->y,
self->z - self->floorclip + zheight + 35*FRACUNIT + (self->player? self->player->crouchoffset : 0)); self->z - self->floorclip + zheight + 35*FRACUNIT + (self->player? self->player->crouchoffset : 0),
ALLOW_REPLACE);
if (bo) if (bo)
{ {
int pitch = self->pitch; int pitch = self->pitch;
@ -1407,7 +1405,7 @@ void A_SpawnDebris(AActor * self)
{ {
mo = Spawn(debris, self->x+((pr_spawndebris()-128)<<12), mo = Spawn(debris, self->x+((pr_spawndebris()-128)<<12),
self->y+((pr_spawndebris()-128)<<12), self->y+((pr_spawndebris()-128)<<12),
self->z+(pr_spawndebris()*self->height/256)); self->z+(pr_spawndebris()*self->height/256), ALLOW_REPLACE);
if (mo && i < mo->GetClass()->ActorInfo->NumOwnedStates) if (mo && i < mo->GetClass()->ActorInfo->NumOwnedStates)
{ {
mo->SetState (mo->GetClass()->ActorInfo->OwnedStates + i); mo->SetState (mo->GetClass()->ActorInfo->OwnedStates + i);
@ -1636,7 +1634,7 @@ void A_Burst (AActor *actor)
mo = Spawn(chunk, mo = Spawn(chunk,
actor->x + (((pr_burst()-128)*actor->radius)>>7), actor->x + (((pr_burst()-128)*actor->radius)>>7),
actor->y + (((pr_burst()-128)*actor->radius)>>7), actor->y + (((pr_burst()-128)*actor->radius)>>7),
actor->z + (pr_burst()*actor->height/255)); actor->z + (pr_burst()*actor->height/255), ALLOW_REPLACE);
if (mo) if (mo)
{ {

View file

@ -785,7 +785,7 @@ static ExpData *ParseExpressionA ()
{ {
if (!stricmp (sc_String, ExpVars[i].name)) if (!stricmp (sc_String, ExpVars[i].name))
{ {
varid = i; varid = (int)i;
break; break;
} }
} }