замечательно. Теперь осталось понять что и при каких условиях у тебя запускается, так как например наличие функции MoonshineVarka запускающий набор из действий, включая функцию DeleteRPRZVodka, которая ищет аттачмент и запускает действие RPRZ_VodkaDestroy в его классе.
Грубо говоря надо смотреть точку входа действия, добавить принты после каждого запуска экшена или проверки и посмотреть какие из них перестают срабатывать. И уже смотреть.
Например,
FindAttachmentBySlotName( ATTACHMENT_SLOT_VODKA )
может не найти объекта, но пороверки на это нету.
Также, не вижу логики запуска
GetGame().ObjectDelete( this );
из класса того же объекта я бы не рекоммендовал выполнять, как минимум в одном потоке вычислений.
Да и если вы строите код так, проще уж вместо DeleteRPRZVodka() вызывать сразу
if(FindAttachmentBySlotName( ATTACHMENT_SLOT_VODKA ))
{
GetGame().ObjectDelete( FindAttachmentBySlotName( ATTACHMENT_SLOT_VODKA ) );
}