public override void RulesetLoaded(Ruleset rules, ActorInfo ai)
        {
            if (PortOffsets.Length == 0)
            {
                throw new YamlException("PortOffsets must have at least one entry.");
            }

            if (PortYaws.Length != PortOffsets.Length)
            {
                throw new YamlException("PortYaws must define an angle for each port.");
            }

            if (PortCones.Length != PortOffsets.Length)
            {
                throw new YamlException("PortCones must define an angle for each port.");
            }

            Ports = new FirePort[PortOffsets.Length];

            for (var i = 0; i < PortOffsets.Length; i++)
            {
                Ports[i] = new FirePort
                {
                    Offset = PortOffsets[i],
                    Yaw    = PortYaws[i],
                    Cone   = PortCones[i],
                };
            }

            base.RulesetLoaded(rules, ai);
        }
        WVec PortOffset(Actor self, FirePort p)
        {
            var bodyOrientation = coords.Value.QuantizeOrientation(self, self.Orientation);

            return(coords.Value.LocalToWorld(p.Offset.Rotate(bodyOrientation)));
        }