spraycan: use permanent decals

instead of using auto decals, letting them time out and just Not
replacing them when they're meant to be gone, this spawns a permanent
decal (not affected by decal limit) and explicitly deletes it when
necessary.
as a consequence of this, spraying more than 11 decals Immediately
removes the oldest spray.

Addresses issue #1
This commit is contained in:
emmie 2023-09-11 03:20:14 +00:00 committed by Kiri
parent f4bf7a793e
commit 56a46d0790
2 changed files with 58 additions and 41 deletions

View File

@ -1,20 +1,12 @@
fader KiriInstantFade
{
DecayStart 60.0
DecayTime 0.0
}
decal KiriTestDecal decal KiriTestDecal
{ {
pic KSPYA0 pic KSPYA0
animator KiriInstantFade
randomflipx randomflipx
} }
decal SnekSpray_TransPride decal SnekSpray_TransPride
{ {
pic KSPYA0 pic KSPYA0
animator KiriInstantFade
randomflipx randomflipx
translucent 0.8 translucent 0.8
} }
@ -22,7 +14,6 @@ decal SnekSpray_TransPride
decal SnekSpray_LesbianPride decal SnekSpray_LesbianPride
{ {
pic KSPYB0 pic KSPYB0
animator KiriInstantFade
randomflipx randomflipx
translucent 0.8 translucent 0.8
} }
@ -30,7 +21,6 @@ decal SnekSpray_LesbianPride
decal SnekSpray_NBPride decal SnekSpray_NBPride
{ {
pic KSPYC0 pic KSPYC0
animator KiriInstantFade
randomflipx randomflipx
translucent 0.8 translucent 0.8
} }
@ -38,7 +28,6 @@ decal SnekSpray_NBPride
decal SnekSpray_AcePride decal SnekSpray_AcePride
{ {
pic KSPYD0 pic KSPYD0
animator KiriInstantFade
randomflipx randomflipx
translucent 0.8 translucent 0.8
} }
@ -46,34 +35,29 @@ decal SnekSpray_AcePride
decal SnekSpray_ProgressPride decal SnekSpray_ProgressPride
{ {
pic KSPYE0 pic KSPYE0
animator KiriInstantFade
translucent 0.8 translucent 0.8
} }
decal SnekSpray_DemiPride decal SnekSpray_DemiPride
{ {
pic KSPYF0 pic KSPYF0
animator KiriInstantFade
translucent 0.8 translucent 0.8
} }
decal SnekSpray_PanPride decal SnekSpray_PanPride
{ {
pic KSPYG0 pic KSPYG0
animator KiriInstantFade
translucent 0.8 translucent 0.8
} }
decal SnekSpray_SwitchPride decal SnekSpray_SwitchPride
{ {
pic KSPYH0 pic KSPYH0
animator KiriInstantFade
} }
decal SnekSpray_BiPride decal SnekSpray_BiPride
{ {
pic KSPYI0 pic KSPYI0
animator KiriInstantFade
translucent 0.8 translucent 0.8
randomflipx randomflipx
} }
@ -81,7 +65,6 @@ decal SnekSpray_BiPride
decal SnekSpray_GayPride decal SnekSpray_GayPride
{ {
pic KSPYJ0 pic KSPYJ0
animator KiriInstantFade
translucent 0.8 translucent 0.8
randomflipx randomflipx
} }

View File

@ -113,8 +113,6 @@ class SnekTechSprayer : HDWeapon
} else { } else {
Actor spawnedThing;
bool success;
float zOffset = GunHeight() * 0.8; float zOffset = GunHeight() * 0.8;
FLineTraceData lineTraceData; FLineTraceData lineTraceData;
@ -154,15 +152,12 @@ class SnekTechSprayer : HDWeapon
"kiri/spraycan_spray", "kiri/spraycan_spray",
CHAN_WEAPON); CHAN_WEAPON);
[success, spawnedThing] = A_SpawnItemEx( let normal = lineTraceData.HitDir;
"SnekTechSprayerDecalSpawner", let spawnedThing = Actor.Spawn("SnekTechSprayerDecalSpawner", lineTraceData.HitLocation - normal);
xofs : 0, yofs : 0, zofs : zOffset);
SnekTechSprayerDecalSpawner spawner = SnekTechSprayerDecalSpawner(spawnedThing); SnekTechSprayerDecalSpawner spawner = SnekTechSprayerDecalSpawner(spawnedThing);
if(success && spawner) { if(spawner) {
spawner.A_SetPitch(pitch); spawner.angle = VectorAngle(-normal.x, -normal.y);
spawner.A_SetAngle(angle);
spawner.actualDecalName = actualDecalName; spawner.actualDecalName = actualDecalName;
spawner.master = invoker.owner; spawner.master = invoker.owner;
@ -362,7 +357,7 @@ class SnekTechSprayer : HDWeapon
} }
} }
class SnekTechSprayerDecalSpawner : Actor class SnekTechSprayerDecalSpawner : Decal
{ {
default default
{ {
@ -376,14 +371,65 @@ class SnekTechSprayerDecalSpawner : Actor
stop; stop;
} }
int timeSinceLastSpray;
int thisSprayerId; int thisSprayerId;
String actualDecalName; String actualDecalName;
Array<Thinker> decals;
void SpawnDecal()
{
Thinker think;
array<thinker> seen;
// find every decal that Isn't ours
let iter = ThinkerIterator.Create('Thinker', STAT_DECAL);
while (think = iter.Next()) {
// BaseDecal isn't exported to zscript so we have to filter this manually
if (think.GetClassName() == 'BaseDecal') {
seen.Push(think);
}
}
// pass the decal name as a map editor type of argument
args[0] = -int(name(actualDecalName));
// spawn the decal
Super.SpawnDecal();
// then find every decal that we spawned
iter.Reinit();
while (think = iter.Next()) {
if (think.GetClassName() == 'BaseDecal' &&
seen.Find(think) == seen.Size())
{
decals.Push(think);
}
}
}
override void OnDestroy()
{
for (let i = 0; i < decals.Size(); i++) {
if (decals[i]) {
decals[i].Destroy();
}
}
}
// Decal::BeginPlay deletes the actor
override void BeginPlay() {Actor.BeginPlay();}
override void PostBeginPlay() override void PostBeginPlay()
{ {
Super.PostBeginPlay(); Super.PostBeginPlay();
A_SprayDecal(actualDecalName, KIRI_SPRAY_DISTANCE);
// copy A_SprayDecal z offset
setz(pos.z + height / 2);
SpawnDecal();
if (decals.Size() == 0) {
Destroy();
return;
}
// Figure out a new ID number. // Figure out a new ID number.
ThinkerIterator iter = ThinkerIterator.Create("SnekTechSprayerDecalSpawner"); ThinkerIterator iter = ThinkerIterator.Create("SnekTechSprayerDecalSpawner");
@ -421,18 +467,6 @@ class SnekTechSprayerDecalSpawner : Actor
} }
} }
} }
override void Tick()
{
super.Tick();
timeSinceLastSpray++;
if(timeSinceLastSpray >= 35 * 60) {
A_SprayDecal(actualDecalName, KIRI_SPRAY_DISTANCE);
timeSinceLastSpray = 0;
}
}
} }
class SnekTechSprayerPattern : Actor class SnekTechSprayerPattern : Actor