Hikayeler

Reklam vermek için turkmmo@gmail.com

başka oyuncunun atını çalma sistemi

apikomt2

Level 6
Uzman
Developer
Katılım
11 May 2023
Konular
237
Mesajlar
1,018
Online süresi
1ay 22g
Reaksiyon Skoru
674
Altın Konu
1
Başarım Puanı
176
TM Yaşı
2 Yıl 11 Ay 14 Gün
MmoLira
491
DevLira
315

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

kullanım önreği

/at_kullan atıolanoyuncunu nnicki
oyuncu at binerken yada binmeden deneyin


Kod:
cmd.cpp

{ "at_kullan", do_at_kullan, 0, POS_DEAD, GM_PLAYER },
{ "atimi_kurtar", do_atimi_kurtar, 0, POS_DEAD, GM_PLAYER },
{ "at_takip_etsin", do_at_takip_etsin, 0, POS_DEAD, GM_PLAYER },
{ "at_ayart", do_at_ayart, 0, POS_DEAD, GM_PLAYER },
    // ADD_COMMAND_SLOW_STUN

ACMD(do_at_kullan);
ACMD(do_atimi_kurtar);
ACMD(do_at_takip_etsin);
ACMD(do_at_ayart);


cmd_generall






#include <string_view>
#include "event.h"

// --- TAK?P EVENT? ?C?N GEREKL? YAPI ---
EVENTINFO(HorseFollowEventInfo)
{
    uint32_t owner_pid;
    uint32_t thief_pid;
    
    HorseFollowEventInfo() : owner_pid{0}, thief_pid{0} {}
};

EVENTFUNC(horse_follow_event_func)
{
    auto* info{static_cast<HorseFollowEventInfo*>(event->info)};
    if (!info)
        return 0;

    auto* owner{CHARACTER_MANAGER::instance().FindByPID(info->owner_pid)};
    auto* thief{CHARACTER_MANAGER::instance().FindByPID(info->thief_pid)};

    // E?er oyunculardan biri koptuysa, hırsız attan indiyse veya sahip takip i?lemini iptal ettiyse eventi bitir
    if (!owner || !thief || thief->GetMountVnum() == 0 ||
        static_cast<uint32_t>(thief->GetQuestFlag("troll.sahip_pid")) != info->owner_pid)
    {
        if (owner)
            owner->ChatPacket(CHAT_TYPE_INFO, "Atının seni takip etme eylemi sona erdi.");
        return 0;
    }

    constexpr int max_distance{700}; // Yakla?ık 7 metrelik bir kopma mesafesi

    if (owner->GetMapIndex() != thief->GetMapIndex())
    {
        // Harita de?i?tirilirse hırsızı pe?inden ı?ınla
        thief->WarpSet(owner->GetX(), owner->GetY(), owner->GetMapIndex());
    }
    else if (DISTANCE_APPROX(owner->GetX() - thief->GetX(), owner->GetY() - thief->GetY()) > max_distance)
    {
        // Uzakla?tı?ında zorla sahibinin arkasına cek
        thief->WarpSet(owner->GetX(), owner->GetY(), owner->GetMapIndex());
    }

    return PASSES_PER_SEC(2); // Her 2 saniyede bir konumu kontrol et
}

// --- 1. KOMUT: AT CALMA (/at_kullan) ---
ACMD(do_at_kullan)
{
    if (!ch)
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    std::string_view target_name{arg1};

    if (target_name.empty())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /at_kullan <oyuncu_ismi>");
        return;
    }

    auto* target_ch{CHARACTER_MANAGER::instance().FindPC(target_name.data())};

    if (!target_ch)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hedef oyuncu bulunamadı veya cevrimdı?ı.");
        return;
    }

    if (ch == target_ch)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kendi atına binmek icin normal yolları kullanmalısın.");
        return;
    }

    constexpr int max_distance{1000};
    if (DISTANCE_APPROX(ch->GetX() - target_ch->GetX(), ch->GetY() - target_ch->GetY()) > max_distance)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Oyuncu bine?ini almak icin cok uzakta.");
        return;
    }

    uint32_t mount_vnum{0};

    if (target_ch->GetMountVnum() != 0)
    {
        mount_vnum = target_ch->GetMountVnum();
        target_ch->RemoveAffect(AFFECT_MOUNT);
        target_ch->RemoveAffect(AFFECT_MOUNT_BONUS);
        target_ch->MountVnum(0);
    }
    else if (auto* horse{target_ch->GetHorse()}; horse != nullptr)
    {
        mount_vnum = horse->GetRaceNum();
        target_ch->HorseSummon(false, true);
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bu oyuncunun etrafta kullanılabilecek bir atı veya bine?i yok.");
        return;
    }

    if (ch->GetMountVnum() != 0)
    {
        ch->RemoveAffect(AFFECT_MOUNT);
        ch->RemoveAffect(AFFECT_MOUNT_BONUS);
        ch->MountVnum(0);
    }

    constexpr uint32_t mount_duration{60 * 60 * 24};
    ch->AddAffect(AFFECT_MOUNT, POINT_MOUNT, mount_vnum, AFF_NONE, mount_duration, 0, true);
    ch->MountVnum(mount_vnum);

    // K?M?N ATININ K?MDE OLDU?UNU KAYDETME (Event icin gerekli)
    target_ch->SetQuestFlag("troll.hirsiz_pid", ch->GetPlayerID());
    ch->SetQuestFlag("troll.sahip_pid", target_ch->GetPlayerID());

    ch->ChatPacket(CHAT_TYPE_INFO, "%s adlı oyuncunun bine?ini aldın! (CTRL+G ile inebilirsin)", target_ch->GetName());
    target_ch->ChatPacket(CHAT_TYPE_INFO, "Dikkat! %s bine?ini aldı!", ch->GetName());
}

// --- 2. KOMUT: ATIMI KURTAR (/atimi_kurtar) ---
ACMD(do_atimi_kurtar)
{
    if (!ch)
        return;

    const uint32_t thief_pid{static_cast<uint32_t>(ch->GetQuestFlag("troll.hirsiz_pid"))};

    if (thief_pid == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Atını kimse calmamı?.");
        return;
    }

    auto* thief_ch{CHARACTER_MANAGER::instance().FindByPID(thief_pid)};

    if (!thief_ch || static_cast<uint32_t>(thief_ch->GetQuestFlag("troll.sahip_pid")) != ch->GetPlayerID() || thief_ch->GetMountVnum() == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hırsız attan coktan inmi? veya oyunda de?il. Atın zaten guvende.");
        ch->SetQuestFlag("troll.hirsiz_pid", 0);
        if (thief_ch) thief_ch->SetQuestFlag("troll.sahip_pid", 0);
        return;
    }

    // Hırsızı zorla attan indir
    thief_ch->RemoveAffect(AFFECT_MOUNT);
    thief_ch->RemoveAffect(AFFECT_MOUNT_BONUS);
    thief_ch->MountVnum(0);
    
    // Kayıtları temizle
    ch->SetQuestFlag("troll.hirsiz_pid", 0);
    thief_ch->SetQuestFlag("troll.sahip_pid", 0);

    // Kendi atımızı yanımıza ca?ır
    ch->HorseSummon(true, true);

    thief_ch->ChatPacket(CHAT_TYPE_INFO, "Atın gercek sahibi atını geri ca?ırdı! Yere du?tun.");
    ch->ChatPacket(CHAT_TYPE_INFO, "Atını hırsızın elinden kurtardın ve yanına ca?ırdın!");
}

// --- 3. KOMUT: ATIM BEN? TAK?P ETS?N (/at_takip_etsin) ---
ACMD(do_at_takip_etsin)
{
    if (!ch)
        return;

    const uint32_t thief_pid{static_cast<uint32_t>(ch->GetQuestFlag("troll.hirsiz_pid"))};

    if (thief_pid == 0)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Atını kimse calmamı?.");
        return;
    }

    auto* thief_ch{CHARACTER_MANAGER::instance().FindByPID(thief_pid)};

    if (!thief_ch || thief_ch->GetMountVnum() == 0 || static_cast<uint32_t>(thief_ch->GetQuestFlag("troll.sahip_pid")) != ch->GetPlayerID())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hırsız attan inmi? veya oyunda de?il, takip edilemez.");
        return;
    }

    // Takip eventini ba?latıyoruz
    auto* info{AllocEventInfo<HorseFollowEventInfo>()};
    info->owner_pid = ch->GetPlayerID();
    info->thief_pid = thief_pid;

    event_create(horse_follow_event_func, info, PASSES_PER_SEC(1));

    ch->ChatPacket(CHAT_TYPE_INFO, "Atına emir verdin: Hırsızla beraber pe?inden suruklenecek!");
    thief_ch->ChatPacket(CHAT_TYPE_INFO, "Eyvah! At asıl sahibini dinliyor ve seni onun pe?inden surukluyor!");
}







#include <string_view>
#include "event.h"

// --- AT AYARTMA (CHARMING) EVENT B?LG?LER? ---
EVENTINFO(HorseCharmEventInfo)
{
    uint32_t charmer_pid;
    uint32_t owner_pid;

    HorseCharmEventInfo() : charmer_pid{0}, owner_pid{0} {}
};

// --- AT AYARTMA EVENT DONGUSU ---
EVENTFUNC(horse_charm_event_func)
{
    auto* info{static_cast<HorseCharmEventInfo*>(event->info)};
    if (!info)
        return 0;

    auto* charmer{CHARACTER_MANAGER::instance().FindByPID(info->charmer_pid)};
    auto* owner{CHARACTER_MANAGER::instance().FindByPID(info->owner_pid)};

    // Guvenlik kontrolleri
    if (!charmer || !owner)
        return 0;

    auto* horse{owner->GetHorse()};

    // IsHorse() kontrolu kaldırıldı (GetHorse zaten atı hedefler)
    if (!horse || horse->GetRider())
    {
        return 0;
    }

    // Harita kontrolu ve ı?ınlanma
    if (charmer->GetMapIndex() != horse->GetMapIndex())
    {
        horse->Show(charmer->GetMapIndex(), charmer->GetX(), charmer->GetY(), charmer->GetZ());
        return PASSES_PER_SEC(1);
    }

    // Mesafe hesaplama
    const int dist{DISTANCE_APPROX(charmer->GetX() - horse->GetX(), charmer->GetY() - horse->GetY())};

    // Hareket Parametreleri
    constexpr int min_dist{300};  // 3 metre
    constexpr int max_dist{2500}; // 25 metre

    if (dist > max_dist)
    {
        // Cok uzaksa direkt arkasına ı?ınla
        horse->Show(charmer->GetMapIndex(), charmer->GetX() + 100, charmer->GetY() + 100, charmer->GetZ());
        horse->Stop();
    }
    else if (dist > min_dist)
    {
        // Onceki rotayı sıfırla
        horse->Stop();
        
        // Atı hedefe yurut (Goto rotasyonu otomatik hesaplar)
        horse->Goto(charmer->GetX(), charmer->GetY());
    }

    return PASSES_PER_SEC(1);
}

// --- KOMUT: AT AYART (/at_ayart) ---
ACMD(do_at_ayart)
{
    if (!ch)
        return;

    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    std::string_view target_name{arg1};

    if (target_name.empty())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /at_ayart <oyuncu_ismi>");
        return;
    }

    auto* target_ch{CHARACTER_MANAGER::instance().FindPC(target_name.data())};

    if (!target_ch)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hedef oyuncu bulunamadı veya cevrimdı?ı.");
        return;
    }

    if (ch == target_ch)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kendi atına fısıldamana gerek yok, o zaten sana sadık.");
        return;
    }

    // Hedefin ca?rılmı? bir atı var mı kontrol et (Binek uzerinde olmaması lazım, NPC olarak durmalı)
    auto* horse{target_ch->GetHorse()};

    if (!horse)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bu oyuncunun etrafta dola?an (ca?rılmı?) bir atı yok.");
        return;
    }

    // Takip eventini ba?latıyoruz
    auto* info{AllocEventInfo<HorseCharmEventInfo>()};
    info->charmer_pid = ch->GetPlayerID();
    info->owner_pid = target_ch->GetPlayerID();

    event_create(horse_charm_event_func, info, PASSES_PER_SEC(1));

    // Bildirimler
    ch->ChatPacket(CHAT_TYPE_INFO, "%s adlı oyuncunun atına fısıldadın, at artık seni takip edecek!", target_ch->GetName());
    target_ch->ChatPacket(CHAT_TYPE_INFO, "Hey! Birisi atını ayarttı! Atın ba?kasını takip ediyor!");
}
 
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

tekrardan at kitabını okuyunca başka at geliyor.
 
Paylaşım için teşekkürler.
 
gemini pro ücretli sürümü yazdı
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst