Раньше чтобы поддерживать разные версии SAMP, приходилось трижды переделывать одно и то же, сейчас с такими штуками как samp-api можно хоть как-то автоматизировать этот геморрой. Но всё равно, не получится обойтись без мелких правок под каждую версию, проще делать адаптивный код, чем городить кучу разных проектов.
Да, такие штуки как samp-api реально спасают от многократного переписывания. Особенно кайф, что можно базу одну держать и в ней уже подхватывать разные версии с минимальными правками, а не отдельные проекты плодить. Ну а без «костылей» под каждую ревизию пока никуда, но уже значительно проще стало автоматизировать часть работы. Раньше просто в могилу загоняло, теперь хоть чуть облегчённый путь есть.
Самое главное — аккуратно замапить функции и структуры под конкретные версии, чтобы API ловил правильные адреса и сигнатуры. В остальном, да, универсальность достигается через общие интерфейсы и небольшие вариации внутри, где версии расходятся. Это реально упрощает поддержку, хотя без пару «флажков» под разные ревизии не обойтись. Главное — не забивать всю логику разраба на версии, а выносить версионные моменты в отдельный модуль.