ACMD(do_ride)
{
if (ch->IsObserverMode() || ch->IsDead() || ch->IsStun())
return;
// 1. Durum: Zaten binekteyse veya ata binmişse indir
if (ch->GetMountVnum() > 0 || ch->IsHorseRiding())
{
if (ch->IsHorseRiding())
ch->StopRiding(); // Atı durdur
if (ch->GetMountVnum() > 0)
do_unmount(ch, NULL, 0, 0); // Bineği indir (Hata veren yer burasıydı, düzelttik)
ch->RemoveAffect(AFFECT_MOUNT); // Binek etkisini temizle
return;
}
// 2. Durum: Dönüşüm Kontrolü (Güvenlik)
if (ch->IsPolymorphed())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Dönüşmüş haldeyken binemezsin.");
return;
}
// 3. Durum: Envanter Taraması
for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
{
LPITEM item = ch->GetInventoryItem(i);
// ITEM_QUEST (18) ve Value0'da mob kodu olanı bul
if (item && item->GetType() == 18 && item->GetValue(0) > 100)
{
DWORD mountVnum = item->GetValue(0);
DWORD mountTime = item->GetValue(1) * 60;
// BİNİŞ FİX: Sadece MountVnum yetmez, Affect (Etki) ekliyoruz
ch->RemoveAffect(AFFECT_MOUNT);
ch->MountVnum(mountVnum);
// Bu satır karakterin binekte kalmasını sağlar (Bin-İn hatasını çözer)
ch->AddAffect(AFFECT_MOUNT, POINT_MOUNT, mountVnum, AFF_NONE, mountTime, 0, true);
ch->ChatPacket(CHAT_TYPE_INFO, "[Sistem] Bineğe binildi.");
return;
}
}
// 4. Durum: At Kontrolü
if (ch->GetHorseLevel() > 0)
{
if (!ch->IsHorseRiding())
ch->StartRiding();
}
}