Здесь он сначала запоминается:
uint32
ItemId = GetProto()->ItemId;
а потом уже удаляется айтем:
owner->DestroyItem(bagSlot, slot, true);
И удаляется он только из сумки. Мы же в Item объекте находимся
Текущий объект будет удалён на следующем тике обновления.
Можно и так написать:
owner->DestroyItem(bagSlot, slot, true);
if (GetProto()->ItemId == 39878 || GetProto()->ItemId == 44717)
но предпочитаю сначала переменные обозначать.