Sosyal açıldı! Bir göz at → Hemen gir →

KAYNAK KOD Slave Priest Hk.

Slepperx

KY Uzman Üye
KAYIT
2 Eki 2025
Mesajlar
143
Çözümler
1
Tepki puanı
103
Konum
Macedonia
Slave Priest karakterimiz oyuncuya çok yakın hareket ediyor ve oyuncu durduğunda içine giriyorsa realistik bir görüntü için
DOLAYLI ama ücretsiz %100 çalışan kod aşağıdadır.

CharacterMovementHandler.cpp içerisinde kodu bulup aşağıdaki ile değiştirin.

Kod:
if (hasPriestBot)
{
    CBot* pPriest = g_pMain->m_MapBotList.GetData(m_bUserPriestBotID);
    if (pPriest == nullptr) return;

    float speedBot = 150.0f;
    uint16 soketid = m_bUserPriestBotID;
    uint8 echo = 1;

    float playerX = GetSPosX() / 10.0f;
    float playerY = GetSPosY() / 10.0f;
    float playerZ = GetSPosZ() / 10.0f;

    float botX = pPriest->GetSPosX() / 10.0f;
    float botZ = pPriest->GetSPosZ() / 10.0f;

    float followDistance = 3.0f;      // istenen uzaklık
    const float moveThreshold = 0.02f;

    uint32_t playerId = GetID();

    // Önceki pozisyonu al / oluştur
    auto it = g_prevPos.find(playerId);
    if (it == g_prevPos.end()) g_prevPos[playerId] = { playerX, playerY, playerZ };
    auto prev = g_prevPos[playerId];

    // Hareket vektöründen (veya bot->player yönünden) forward açısını al
    float dx = playerX - prev[0];
    float dz = playerZ - prev[2];
    float moveLen = sqrtf(dx*dx + dz*dz);

    float forwardAngle;
    if (moveLen > moveThreshold) {
        forwardAngle = atan2f(dz, dx); // oyuncu hareket ediyorsa bu onun ileri yönü olur
    } else {
        // sabit duruyorsa bot ile oyuncu arasındaki doğrultuyu kullan
        forwardAngle = atan2f(playerZ - botZ, playerX - botX);
    }

    // Botu oyuncunun arkasına koy: player - forward * distance
    float targetX = playerX - cosf(forwardAngle) * followDistance;
    float targetZ = playerZ - sinf(forwardAngle) * followDistance;
    float targetY = playerY;

    // Önceki pozisyonu güncelle
    g_prevPos[playerId] = { playerX, playerY, playerZ };

    pPriest->SendMoveResult(targetX, targetY, targetZ, echo, speedBot, soketid);
}

hata alırsanız
if bloğunun hemen üzerine

Kod:
#include <unordered_map>
#include <array>
static std::unordered_map<uint32_t, std::array<float,3>> g_prevPos; // playerId -> {x,y,z}

bu kodu ekleyin ve derleyin.

CharacterMovementHandler.cpp' kaynağına odaklanmamda yardımcı olduğu için
Yönlendirme için @LupaLanD'a teşekkürler
 

Aakinci

Co-Admin
Premium Üye
KY Saygın Üye
Coder
ACS Sağlayıcısı
Yardımsever
KY Kod Editörü
KAYIT
5 Tem 2021
Mesajlar
865
Çözümler
127
Tepki puanı
547
Yaş
34
Basitçe bir öneri,
Önceki pozisyon vs gibi verileri soketid ye göre yapmayın. Oyundan çıkan başkasının verisi kalır ve siz girdiğinizde boştaki soket size tanımlanır ve ona göre bir pozisyon alımı yapabilir. Bu da karışıklık yaşatabilir. 10/20 kişi ile anlaşılmaz ama çok oyunculu sistemde sorun oluşturabilir. Ya logout olunca clear ile map i temizleyin, ya da username ye göre bir map yapın. Örneğin aynı sorun zamanında tag sisteminde de vardı ve bu yüzden çözüm isme göre listeleme yapılarak çözüldü.
 

Slepperx

KY Uzman Üye
KAYIT
2 Eki 2025
Mesajlar
143
Çözümler
1
Tepki puanı
103
Konum
Macedonia
Basitçe bir öneri,
Önceki pozisyon vs gibi verileri soketid ye göre yapmayın. Oyundan çıkan başkasının verisi kalır ve siz girdiğinizde boştaki soket size tanımlanır ve ona göre bir pozisyon alımı yapabilir. Bu da karışıklık yaşatabilir. 10/20 kişi ile anlaşılmaz ama çok oyunculu sistemde sorun oluşturabilir. Ya logout olunca clear ile map i temizleyin, ya da username ye göre bir map yapın. Örneğin aynı sorun zamanında tag sisteminde de vardı ve bu yüzden çözüm isme göre listeleme yapılarak çözüldü.
Öneriniz için çok teşekkürler hocam. farklı soruna odaklanınca o kısmı gözden kaçırmışım, o kısmı da stabil çalışır hale getirip paylaşırım yeniden.
 

Slepperx

KY Uzman Üye
KAYIT
2 Eki 2025
Mesajlar
143
Çözümler
1
Tepki puanı
103
Konum
Macedonia
Slave Priest Oyuncuya Özel bir sistem olduğu için çok sık olmasada @Aakinci hocamın bahsettiği gibi bir sorun yaşamamak için
Eğer kodlarınız arasında ekli değilse

User.cpp içerisinde
void CUser::LogOut() // kısmını buluyoruz if bloğundan hemen sonra yeni bir blokla


Kod:
if (hasPriestBot == true)
{
    CBot* pPriest = nullptr;
    pPriest = g_pMain->m_MapBotList.GetData(m_bUserPriestBotID);
    if (pPriest)
        pPriest->UserInOut(INOUT_OUT);

    m_bUserPriestBotID = -1;
    hasPriestBot = false;
    RemoveSavedMagic(495146);
}

g_prevPos.erase(GetID());

g_prevPos tanımlı değil gibi bir hata alırsanız yukarıdaki void Cuser'den hemen önceki satıra

std::unordered_map<uint32_t, std::array<float, 3>> g_prevPos; // tanımlama ekleyin
 

Mstk59

KY Saygın Üye
Coder
Yardımsever
Server Sahibi
KAYIT
12 May 2021
Mesajlar
483
Çözümler
9
Tepki puanı
520
Yaş
32
dolaylı olması zaten chatgpt kodlamasından belli dostum ve tam realistik değil neyse yinede birilerini işine yarar belki
 

Slepperx

KY Uzman Üye
KAYIT
2 Eki 2025
Mesajlar
143
Çözümler
1
Tepki puanı
103
Konum
Macedonia
dolaylı olması zaten chatgpt kodlamasından belli dostum ve tam realistik değil neyse yinede birilerini işine yarar belki
Öncelikle değerli yorumunuz için teşekkür ederim hocam. ben burada dostluk ya da rekabet arayışında değilim ticari kaygılarınızı anlıyorum ama ben sadece bilgi paylaşıyorum. Kim ne şekilde üretirse üretsin, önemli olan fayda sağlayabilmek değil mi ?
 

Mstk59

KY Saygın Üye
Coder
Yardımsever
Server Sahibi
KAYIT
12 May 2021
Mesajlar
483
Çözümler
9
Tepki puanı
520
Yaş
32
Öncelikle değerli yorumunuz için teşekkür ederim hocam. ben burada dostluk ya da rekabet arayışında değilim ticari kaygılarınızı anlıyorum ama ben sadece bilgi paylaşıyorum. Kim ne şekilde üretirse üretsin, önemli olan fayda sağlayabilmek değil mi ?
tabiki doğru elinize sağlık fakat bir zaman sonra kod olarak insanlara yardım etmemeniz gerektiğini mutlaka anlayacaksınız hocam
 
Anasayfa Kayıt ol Giriş yap
Üst Alt