Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Mewdoom

Zdoom - how to fix the collision detection on walls ?

Recommended Posts

Hello guys,

I try to modify the Archvile with afrit hellfire. It work fine but I want to fix two bugs and I dont see how to fix them. I notice when the archvile is just beside a wall that have a top floor, the fire may appear on top of that floor and fall down the wall beside. Does projectile supposed to explode when hitting a Wall ? I suspect maybe that is because of the spawning offsett of the hellfire ...

The other bug is, when archvile is in the fire, he get stuck, cannot walk until the fire disapear. I try to use -SOLID flag on hellfire, no luck.

//===========================================================================
//
// Arch Vile
//
//===========================================================================

ACTOR New_Archvile replaces Archvile
{
Health 700
Radius 20
Height 56
Mass 500
Speed 15
PainChance 10
PainChance "HellFire", 0
Damagefactor "HellFire", 0.0
Monster
+AvoidMelee
MaxTargetRange 896
+QUICKTORETALIATE
+FLOORCLIP
+NOTARGET
SeeSound "vile/sight"
PainSound "vile/pain"
DeathSound "vile/death"
ActiveSound "vile/active"
//MeleeSound "vile/stop"
Obituary "$OB_VILE"
States
{
Spawn:
VILE AB 10 A_Look
Loop
See:
VILE AABBCCDDEEFF 2 A_VileChase
Loop
Missile:
VILE G 0 BRIGHT A_VileStart
VILE G 10 BRIGHT A_FaceTarget
VILE H 0 BRIGHT A_CustomMissile("Archvile_HellFire", 44)
VILE H 8 BRIGHT A_CustomMissile("Archvile_HellFire", 44)
VILE IJKLMN 8 BRIGHT A_FaceTarget
VILE O 8 BRIGHT //A_VileTarget("New_ArchvileFire")
VILE P 20 BRIGHT
Goto See
Heal:
VILE "[\]" 10 BRIGHT
Goto See
Pain:
VILE Q 5
VILE Q 5 A_Pain
Goto See
Death:
VILE Q 7
VILE R 7 A_Scream
VILE S 7 A_NoBlocking
VILE TUVWXY 7
VILE Z -1
Stop
}
}

Actor Archvile_HellFire
{
+NoBlockMap
+Painless
+BloodlessImpact
//+NoExplodeFloor
+Missile
+DropOff
States
{
Spawn:
TNT1 A 1
Loop
Death:
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 0, -180)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 16, -175)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 32, -170)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -16, -185)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -32, -190)
TNT1 A 10 Bright A_PlaySound("Afrit/Hellfire")
Stop
}
}

Actor Archvile_HellFire1
{
+Ripper
+NoExplodeFloor
+Painless
+BloodlessImpact
+Missile
+DropOff
Speed 2
States
{
Spawn:
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
Stop
}
}

Actor Archvile_HellFire2
{
+Ripper
+NoExplodeFloor
+BloodlessImpact
+DropOff
+Randomize
Scale 1.5
Speed 1
RenderStyle Add
Alpha 0.67
Damagetype "HellFire"
Obituary "%o was scorched by an Archvile"
States
{
Spawn:
TNT1 A 8
FRTF A 3 Bright
FRTF BC 3 Bright A_Explode(2, 64)
TNT1 A 0 A_Explode(2, 64)
TNT1 A 0 A_Jump(191, 4)
TNT1 A 0 A_CustomMissile("Archvile_HellFire2", 0, 24, 0)
TNT1 A 0 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 0 A_CustomMissile("Archvile_HellFire2", 0, -24, 0)
FRTF DEFGHIJKLMNO 3 Bright
Stop
}
}


//===========================================================================
//
// Arch Vile Fire
//
//===========================================================================

ACTOR New_ArchvileFire
{
RenderStyle Add
Alpha 1
Projectile
+RANDOMIZE
+SEEKERMISSILE // Tracer pointer
States
{
Spawn:
TNT1 A 0 BRIGHT A_RearrangePointers (AAPTR_TRACER, AAPTR_DEFAULT, AAPTR_TARGET, 0)
TNT1 A 0 BRIGHT A_CustomMissile("Archvile_HellFireBurn", 0, 0, 0, CMF_AIMDIRECTION, 0, AAPTR_TARGET)
TNT1 A 0 BRIGHT A_RearrangePointers (AAPTR_TRACER, AAPTR_DEFAULT, AAPTR_TARGET, 0)

Stop
}
}


Actor Archvile_HellFireBurn
{
+NoBlockMap
+Painless
+BloodlessImpact
+Missile
+DropOff
States
{
Spawn:
TNT1 A 1
Loop
Death:
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 0, -180)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 16, -175)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 32, -170)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -16, -185)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -32, -190)
TNT1 A 10 Bright A_PlaySound("Afrit/Hellfire")
Stop
}
}

Share this post


Link to post
Mewdoom said:

I notice when the archvile is just beside a wall that have a top floor, the fire may appear on top of that floor and fall down the wall beside. Does projectile supposed to explode when hitting a Wall ? I suspect maybe that is because of the spawning offsett of the hellfire ...

The spawning offsets, and the NoExplodeFloor flag (which makes the missile not explode upon hitting a floor), are both doing it.

Mewdoom said:

The other bug is, when archvile is in the fire, he get stuck, cannot walk until the fire disapear.

Try giving NoBlockMap flag to all of the fire actors, including Archvile_HellFire1 and Archvile_HellFire2.

Also, I'm not sure if it's a good idea to let Archvile_HellFire2 spawn more instances of itself.

Share this post


Link to post

I found the solution :)

for the fire that fall from high ceiling, I put +Missille on the Archvile_HellFire2, when hit a wall, it die.

for the wakling bug, it seem that was the A_Explode cause him to be blocked, so I just make the damage more simple by adding Damage property in the Archvile_HellFire2

I just have one other bug, when he attack other monsters, like the zombieman, the zombieman constanly stay on pain and the sound if is pain state loop constanly while is he stuck in fire. It is very annoying. I would like to fire to damage other monsters but without the loop of the sound constanly.

Share this post


Link to post

That strange because I add this and the zombieMan is still in pain ...

ACTOR New_ZombieMan : ZombieMan replaces ZombieMan
{
PainChance "HellFire", 0
Damagefactor "HellFire", 0.0
}

Share this post


Link to post

From one of your previous threads, I remember you were already replacing the Zombieman with another actor. If that's so, you should modify that actor, not make yet another one, because there can only be one actor to replace an existing one. If that's not the case, I don't know what the problem is, sorry.

Share this post


Link to post

Yes I checked that :)

is is very strange, because

PainChance 0 work but not:

PainChance "HellFire", 0

Could it be a bug ? I use zdoom 2.8.1

Share this post


Link to post

Seems like the fire's effective DamageType isn't really "HellFire". Try setting DamageType "HellFire" to all the fire's actors that are missiles, even those that don't deal any damage (because they might still be causing pain upon impact).

Share this post


Link to post

I found the bug, that's because the hellfire actor's use lot of missile and one of the defined actor didnt have the +painless flag :)

now everything work just fine.

thankks for your help :) if this topic can be usefull for someone that have the same problem ..

I wonder how the vile attack work ? My script doest make fire appear while the player is on upper ceilling ? It work fine if the player is on the same floor as the archvile..

Share this post


Link to post
Mewdoom said:

I wonder how the vile attack work ?

Assuming you're still using the same code that you've posted in the OP, New_Archvile fires Archvile_HellFire, which then falls onto the ground, dies and spawns Archvile_HellFire1, which then spawns Archvile_HellFire2. So, if no fire appears, the problem has to be that Archvile_HellFire never falls onto the ground for some reason.

Share this post


Link to post

I found the bug, but I dont know how to fix it.

By addind +Missile flag it prevent the fire to appear up ceiling and fall down when archvile is just beside a wall. But it also prevent the fire to appear if the target is on a small platform with a wall beside. The missile explode when hitting a wall but how to make it enter in death state when hit high ceilling but not wall

Share this post


Link to post

You could put a block-monsters line far enough from the wall to keep the monster from getting too close to the wall. That's more of a work-around than a fix, though, and it makes the monster work as intended only on maps made for it, or maps that don't use high floors as walls.

Share this post


Link to post

I found a trick, I keep the missile flag so it explode hitting walls and I check in the deatch state if is on floor and jump back to spawn :)

Death:
TNT1 A 0 A_CheckFloor("Spawn")

Share this post


Link to post

I have another idea in mind. I notice that custommissile (because of the Vile_Target) is spawning in the front of the player and with the custommissile function we just have the choice of changing horizontal offset and I still dont get what the angle param do exactly, I change it to 0 or whatever and the fire spawn at the same place.

I would like to make a circle of fire around the player with custommissile, but how to do it if we just have the horizontal and height param ?

Share this post


Link to post

I got the idea to use A_SpawnItemEx to spawn a bunch of dummy item actor all around the player to make the circle and then each of them will shoot the projectile of fire.

I dont understand why, the fire just appear when I use the loop (but the engine become unstable) if I use Stop, nothing appear.

my calling of the dummy item:
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 0)

Actor Archvile_DamageSpawn
{
States
{

Spawn:
TNT1 A 0
TNT1 A 6 Bright A_CustomMissile("Archvile_HellFireBurn1", 0, 16, -175)
Stop // If I use Loop it appear ....

}
}

Share this post


Link to post

Thanks I will try that :)

I still dont understand because all the script use lot of custommissile in actors that arent monsters and it work..

And If I use that:

TNT1 A 6 Bright A_CustomMissile("SoulSphere", 0, 16, -175)

instead of

TNT1 A 6 Bright A_CustomMissile("Archvile_HellFireBurn1", 0, 16, -175)

the soulsphere appear ....

and Archvile_HellFireBurn1 should working fine because If I call it from the other actor where I call SpawnItemEx, it work just fine.

I fixed it :)

here is the complete script if anyone want to use this modified archvile.. just use it with the same arcvile sprites in doom2 and just copy the sprite of fire and the sound of fire into your wad.

The improvement:
1. make a circle of fire around the player instead of raise him in the air with the original flame.
2. Have two attack near him of flame, one that just around him and the second that is trying to reach his target at the speed of 20.


//===========================================================================
//
// Arch Vile
//
//===========================================================================
ACTOR New_Archvile replaces Archvile
{
Health 700
Radius 20
Height 56
Mass 500
Speed 15
PainChance 10
PainChance "HellFire", 0
Damagefactor "HellFire", 0.0
Monster
+AvoidMelee
MaxTargetRange 896
+QUICKTORETALIATE
+FLOORCLIP
+NOTARGET
SeeSound "vile/sight"
PainSound "vile/pain"
DeathSound "vile/death"
ActiveSound "vile/active"
//MeleeSound "vile/stop"
Obituary "$OB_VILE"
States
{
Spawn:
VILE AB 10 A_Look
Loop
See:
VILE AABBCCDDEEFF 2 A_VileChase
Loop
Missile:
VILE G 0 BRIGHT A_VileStart
VILE H 0 BRIGHT A_CustomMissile("Archvile_HellFire", 44)
VILE H 0 BRIGHT A_Jump(128, 2)
VILE H 0 BRIGHT A_CustomMissile("Archvile_MeleeFire", 44)
VILE G 20 BRIGHT A_FaceTarget // Debout les 2 bras en l'air

//VILE H 0 BRIGHT A_CustomMissile("Archvile_MeleeFire", 44)
//VILE G 20 BRIGHT A_FaceTarget // Debout les 2 bras en l'air
VILE IJKLMN 8 BRIGHT A_FaceTarget
VILE O 8 BRIGHT A_VileTarget("New_ArchvileFire")
VILE P 20 BRIGHT A_Playsound("weapons/rocklx")
Goto See
Heal:
VILE "[\]" 10 BRIGHT
Goto See
Pain:
VILE Q 5
VILE Q 5 A_Pain
Goto See
Death:
VILE Q 7
VILE R 7 A_Scream
VILE S 7 A_NoBlocking
VILE TUVWXY 7
VILE Z -1
Stop
}
}

Actor Archvile_MeleeFire
{
+NoBlockMap
+Painless
+BloodlessImpact
+Missile
+DropOff
Speed 15
States
{
Spawn:
TNT1 A 1
Loop
Death:
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 0, -180)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 16, -175)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 32, -170)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -16, -185)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -32, -190)
TNT1 A 10 Bright A_PlaySound("Afrit/Hellfire")
Stop
}
}


Actor Archvile_HellFire
{
+NoBlockMap
+Painless
+BloodlessImpact
+Missile
+DropOff
States
{
Spawn:
TNT1 A 1
Loop
Death:
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 0, -180)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 16, -175)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, 32, -170)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -16, -185)
TNT1 A 0 Bright A_CustomMissile("Archvile_HellFire1", 0, -32, -190)
TNT1 A 10 Bright A_PlaySound("Afrit/Hellfire")
Stop
}
}

Actor Archvile_HellFire1
{
+Ripper
+NoExplodeFloor
+Painless
+BloodlessImpact
+Missile
+DropOff
Speed 2
States
{
Spawn:
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, 16, 0)
TNT1 A 10 A_CustomMissile("Archvile_HellFire2", 0, -16, 0)
Stop
}
}

Actor Archvile_HellFire2
{
+Ripper
+NoExplodeFloor
+Painless
+BloodlessImpact
+DropOff
+Randomize
Gravity 9999
+Missile
Scale 1.5
Speed 1
RenderStyle Add
Alpha 0.5
States
{
Spawn:
TNT1 A 8 A_ScaleVelocity(-2.95)
FRTF A 3 Bright
FRTF BC 3 Bright //A_Explode(2, 0)
TNT1 A 0 //A_Explode(2, 64)
TNT1 A 0 A_Jump(191, 4)
TNT1 A 0 A_CustomMissile("Archvile_HellFire2", 0, 24, 0)
TNT1 A 0 A_CustomMissile("Archvile_HellFire2", 0, 0, 0)
TNT1 A 0 A_CustomMissile("Archvile_HellFire2", 0, -24, 0)
FRTF DEFGHIJKLMNO 3 Bright
TNT1 A 0 A_Jump(100, 2)
TNT1 A 0 A_CustomMissile("Archvile_HellFireDamage", 0, 0, 0)
TNT1 A 0
Stop
Death:
TNT1 A 0 A_CheckFloor("Spawn")
Stop
}
}

Actor Archvile_HellFireDamage
{
+Ripper
+NoExplodeFloor
+BloodlessImpact
+DropOff
+Missile
Speed 1
Damage 1
Damagetype "HellFire"
Obituary "%o was scorched by an Archvile"
States
{
Spawn:
FRTF D 0
Stop
}
}




//===========================================================================
//
// Arch Vile Fire
//
//===========================================================================

ACTOR New_ArchvileFire
{
RenderStyle Add
Alpha 1
Projectile
+RANDOMIZE
+PAINLESS
+SEEKERMISSILE // Tracer pointer
States
{
Spawn:
TNT1 A 0 BRIGHT A_RearrangePointers (AAPTR_TRACER, AAPTR_DEFAULT, AAPTR_TARGET, 0)
TNT1 A 0 BRIGHT A_CustomMissile("Archvile_HellFireBurn", 44, 0, 0, CMF_AIMDIRECTION, 0, AAPTR_TARGET)
TNT1 A 0 BRIGHT A_RearrangePointers (AAPTR_TRACER, AAPTR_DEFAULT, AAPTR_TARGET, 0)

Stop
}
}

Actor Archvile_DamageSpawn
{

+NoBlockMap
+Painless
+BloodlessImpact
+Missile
+DropOff
States
{
Spawn:
TNT1 A 1
Loop

Death:

TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)

Stop

}
}

Actor Archvile_HellFireBurn
{
+NoBlockMap
+Painless
+BloodlessImpact
+Missile
+DropOff
States
{
Spawn:
TNT1 A 1
Loop
Death:

TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 0)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 45)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 90)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 135)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 180)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 225)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 270)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -64, 0, 0, 0, 0, 315)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 0)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 45)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 90)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 135)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 180)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 225)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 270)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -32, 0, 0, 0, 0, 315)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 0)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 45)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 90)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 135)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 180)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 225)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 270)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -16, 0, 0, 0, 0, 315)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 0)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 45)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 90)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 135)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 180)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 225)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 270)
TNT1 A 0 Bright A_SpawnItemEx ("Archvile_DamageSpawn", 0, -8, 0, 0, 0, 0, 315)

TNT1 A 10 Bright A_PlaySound("Afrit/Hellfire")
Stop
}
}

Actor Archvile_HellFireBurnDamage
{
+Ripper
+NoExplodeFloor
+Painless
+BloodlessImpact
+DropOff
+Randomize
+Missile
Gravity 9999
Scale 1.5
Speed 1
RenderStyle Add
Alpha 0.5
States
{
Spawn:
TNT1 A 8 A_ScaleVelocity(-2.95)

FRTF A 3 Bright A_Explode(2, 64)

TNT1 A 0 A_Jump(191, 4)
TNT1 A 0 A_CustomMissile("Archvile_HellFireBurnDamage", 0, 16, 0)
TNT1 A 0 A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 0 A_CustomMissile("Archvile_HellFireBurnDamage", 0, -16, 0)
FRTF DEFGHIJKLMNO 3 Bright
TNT1 A 0 A_Jump(100, 2)
TNT1 A 0 A_CustomMissile("Archvile_HellFireDamage2", 0, 0, 0)
TNT1 A 0
Stop
Death:
TNT1 A 0 A_CheckFloor("Spawn")
Stop
}
}

Actor Archvile_HellFireDamage2
{
+Ripper
+NoExplodeFloor
+BloodlessImpact
+DropOff
+Missile
Speed 1
Damage 2
Damagetype "HellFire"
Obituary "%o was scorched by an Archvile"
States
{
Spawn:
FRTF D 0
Stop
}
}

Share this post


Link to post

I misunderstood and thought you wanted the player to surround himself with fire as an attack.
A_CustomMissile is for anything that is not a player, not only monsters. If you want a player to fire a custom missile, you use A_FireCustomMissile instead.

Share this post


Link to post

I still dont understand how it work for that part.

Why if I remove all the flags and put the custommissile into spawn, it doesnt work ? I understand why it is work with the flag missile with the death state, because when a missile enter into something it explode and then enter in death state. But there is a way to write that part more simple ?

Actor Archvile_DamageSpawn
{

+NoBlockMap
+Painless
+BloodlessImpact
+Missile
+DropOff
States
{
Spawn:
TNT1 A 1
Loop

Death:

TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)

Stop

}
}

Share this post


Link to post
Mewdoom said:

Why if I remove all the flags and put the custommissile into spawn, it doesnt work ?

Can you post the code where you "remove all the flags and put the custommissile into spawn" that doesn't work?

Share this post


Link to post

Sure :)

here it is:

Actor Archvile_DamageSpawn
{

States
{
Spawn:
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
TNT1 A 10 Bright A_CustomMissile("Archvile_HellFireBurnDamage", 0, 0, 0)
Stop

}
}

Note: If I put "Soulsphere" instead of Archivile_HellFireBurnDamage, the soulsphere appear ...

Maybe I miss something with States, how it work ..

Share this post


Link to post

NoBlockMap flag is necessary to make it spawn in a place that is already occupied by another thing.

Also, once again, the very first state in Spawn doesn't execute its action, so that you are actually calling A_CustomMissile only 3 times, not 4 times.

Share this post


Link to post

Understood, I just put the example but I also try with TNT1 A 0 as first state and still doesnt work.

I will try with noblockmap :) I dont catch because if its the 1st spawn, why it need noblockmap to work ? the soulsphere appear with noblockmap flag ....

Share this post


Link to post

Give NoBlockMap flag to Archvile_HellFireBurnDamage (the thing that's being spawned by Archvile_DamageSpawn).

Share this post


Link to post

Thanks I will try it later when I get back to home :)

I wonder, how I could make the fire appear when archvile just walking ? I put the

A_CustomMissile("Archvile_HellFire", 44)

into see state, but nothing happen ?? And I put the TNT1 A 0 on the first line too...

Share this post


Link to post

Can you post the whole See state of the New_Archvile? Also, the action-less state wouldn't matter in this case, because it only matters in the very first entering of the very first state immediately after the actor is spawned. Even if his very first state is re-entered later, for example via looping Spawn state, the state will actually execute its action in later calls - just not the very first time it's entered.

Share this post


Link to post

Sure, here it is :)

Obituary "$OB_VILE"
States
{
Spawn:
VILE AB 10 A_Look
Loop
See:
VILE A 2
VILE A 2 A_CustomMissile("Archvile_HellFire", 44)
VILE BBCCDDEEFF 2 A_VileChase
Loop

Share this post


Link to post

Are you sure that firing "Archvile_HellFire" actually works within the "Missile" state too? Couldn't it be that only the "Archvile_MeleeFire" works, due to having a speed (therefore hitting something by moving into it)? What if you fire "Archvile_MeleeFire" instead of "Archvile_HellFire", respectively give a speed to "Archvile_HellFire"? What if you try number "44.0" instead of "44" (as 44 might actually mean 44/65536 map units above the ground, not 44 map units above the ground)?

Share this post


Link to post

Yes I am absolutely sure, I test it many times by making them in comment with // each of them to test it independently :)

I found something interesting, if there is an enemy, because I spawn it friendly to test it, the fire appear, I think it have to do with target pointer... That may be the cause, since its a missile so there must be a target ..

Share this post


Link to post

Actually (and somewhat counter-intuitively), a missile's target is the actor who fired the missile (if it was fired by A_CustomMissile or another specifically projectile-firing function, but not if it was fired by a generic actor spawning function like A_SpawnItemEx).

EDIT:

Mewdoom said:

I spawn it friendly to test it,

Yeah, that explains why the fire doesn't spawn - the monster has no target yet, therefore A_CustomMissile wouldn't fire anything. The CMF_AIMDIRECTION flag for A_CustomMissile should allow firing missiles without having a target. In fact, you should make the custom fire spawners use the flag too in their calls of A_CustomMissile.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×