How to find a weapon's ammo type?
Posted: Tue Sep 16, 2025 8:18 am
Hi. I'm trying to create a dynamic ammo spawner that spawns the ammo type of the closest weapon. I got the code for looking through all the weapons in the map and picking the closest one working, but whenever I try to find the weapon's ammo type, I get the error "Left side of Weapon is not a struct or class." The code works if I try to spawn the weapon directly. How do I fix this?
This DOES NOT work
However, this code, which spawns the weapon class itself, DOES work
This DOES NOT work
Code: Select all
Class Level1Ammo : Actor
{
States
{
Spawn:
TNT1 A 0 NODELAY
{
ThinkerIterator WeaponFinder = ThinkerIterator.Create("DoomWeapon");
Actor mo;
Actor ClosestWeapon;
Array <actor> MapWeapons;
while (mo = DoomWeapon(WeaponFinder.Next()))
{
if(mo.GetClass().Weapon.Ammotype)
{
MapWeapons.Push(mo);
}
}
if(MapWeapons.size()>0)
{
For (int i=0; i < MapWeapons.size(); i++)
{
let CurrentWeapon = MapWeapons[i];
if (ClosestWeapon && Distance2D(CurrentWeapon)<Distance2D(ClosestWeapon))
{
ClosestWeapon=CurrentWeapon;
}
else if (!ClosestWeapon)
{
ClosestWeapon=CurrentWeapon;
}
}
}
if(ClosestWeapon)
{
A_SpawnItemEX(ClosestWeapon.GetClass().Weapon.AmmoType.GetClass(),0,0,0,0,0,0,0,SXF_NOCHECKPOSITION);
}
else
{
A_SpawnItemEX("Clip",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION);
}
}
Stop;
}
}
Code: Select all
Class Level1Ammo : Actor
{
States
{
Spawn:
TNT1 A 0 NODELAY
{
ThinkerIterator WeaponFinder = ThinkerIterator.Create("DoomWeapon");
Actor mo;
Actor ClosestWeapon;
Array <actor> MapWeapons;
while (mo = DoomWeapon(WeaponFinder.Next()))
{
MapWeapons.Push(mo);
}
if(MapWeapons.size()>0)
{
For (int i=0; i < MapWeapons.size(); i++)
{
let CurrentWeapon = MapWeapons[i];
if (ClosestWeapon && Distance2D(CurrentWeapon)<Distance2D(ClosestWeapon))
{
ClosestWeapon=CurrentWeapon;
}
else if (!ClosestWeapon)
{
ClosestWeapon=CurrentWeapon;
}
}
}
if(ClosestWeapon)
{
A_SpawnItemEX(ClosestWeapon.GetClass(),0,0,0,0,0,0,0,SXF_NOCHECKPOSITION);
}
else
{
A_SpawnItemEX("Clip",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION);
}
}
Stop;
}
}