Page 1 of 1

How to find a weapon's ammo type?

Posted: Tue Sep 16, 2025 8:18 am
by Baysha
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

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;
	}
}
However, this code, which spawns the weapon class itself, DOES 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()))
		{
			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;
	}
}