Reklam
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);
}
#include <unordered_map>
#include <array>
static std::unordered_map<uint32_t, std::array<float,3>> g_prevPos; // playerId -> {x,y,z}
Ö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.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ü.
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());
Ö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 ?dolaylı olması zaten chatgpt kodlamasından belli dostum ve tam realistik değil neyse yinede birilerini işine yarar belki
tabiki doğru elinize sağlık fakat bir zaman sonra kod olarak insanlara yardım etmemeniz gerektiğini mutlaka anlayacaksınız hocamÖ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 ?
Katılıyorum. Bunu kötüye kullanıyorlartabiki doğru elinize sağlık fakat bir zaman sonra kod olarak insanlara yardım etmemeniz gerektiğini mutlaka anlayacaksınız hocam