It's because you're referencing the woodenSwordProjectile before it's created. Just reorder your datablocks:
datablock ProjectileData(WoodenSwordProjectile : swordProjectile)
{
directDamage = 10;
};
datablock ShapeBaseImageData(WoodenSwordImage : swordImage)
{
item = WoodenSwordItem;
projectile = WoodenSwordProjectile;
doColorShift = true;
colorShiftColor = "0.392 0.196 0.000 1.000";
};
datablock ItemData(WoodenSwordItem : swordItem)
{
iconName = "./ItemIcons/sword";
doColorShift = true;
colorShiftColor = WoodenSwordImage.colorShift;
image = WoodenSwordImage;
};
function WoodenSwordImage::onPreFire(%this, %obj, %slot)
{
%obj.playthread(2, armattack);
}
function WoodenSwordImage::onStopFire(%this, %obj, %slot)
{
%obj.playthread(2, root);
}