shrpnl 1
shrpnl
YusufŞimşek14 1
YusufŞimşek14
berzahx 2
berzahx
xranzei 1
xranzei
Agora Metin2 1
Agora Metin2
Bvural41 1
Bvural41
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Metin2 Teleport Sistemi

  • Konuyu başlatan Konuyu başlatan lTJA
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 2
  • Görüntüleme Görüntüleme 604
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

lTJA

Level 3
Banlı
TM Üye
Katılım
2 Eyl 2023
Konular
28
Mesajlar
108
Online süresi
6d 22h
Reaksiyon Skoru
85
Altın Konu
0
Başarım Puanı
59
MmoLira
965
DevLira
15
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

3 FARKLI TELEPORT SİSTEMİ VARDIR TEK BİR SİSTEM DEĞİLDİR İSTEDİĞİNİZ 3 FARKLI SİSTEMDEN BİR TANESİNİ OYUNUNUZA KURABİLİRSİNİZ. KAFANIZA GÖRE


C++:
// teleport_command.cpp
#include "char.h"
#include "command.h"
#include "desc.h"

ACMD(do_teleport_to_player)
{
    if (!ch)
        return;

    if (!argument || strlen(argument) < 2) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /git <oyuncu_ismi>");
        return;
    }

    LPCHARACTER target_char = CHARACTER_MANAGER::instance().FindPC(argument);
    if (!target_char) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Oyuncu bulunamadı.");
        return;
    }

    // İzin kontrolleri (örn. PvP bölgesi kontrolü)
    if (ch->IsDead() || target_char->IsDead()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Ölü iken ışınlanamazsınız.");
        return;
    }

    if (ch->GetMapIndex() != target_char->GetMapIndex()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Şu an farklı haritalardasınız, ışınlanma yapılamıyor.");
        return;
    }

    // Teleport işlemi
    int x = target_char->GetX();
    int y = target_char->GetY();

    ch->WarpSet(x, y, ch->GetMapIndex());
    ch->ChatPacket(CHAT_TYPE_INFO, "%s oyuncusunun yanına ışınlandınız.", target_char->GetName());
}

Komut Kaydı

C++:
void RegisterCommands()
{
    command_info.insert(std::make_pair("git", do_teleport_to_player));
}

Özet​


Oyuncu oyunda /git oyuncu_ismi yazar.
Eğer izin varsa, direkt olarak o oyuncunun koordinatlarına ışınlanır.
Güvenlik ve sınırlar kontrol edilir.



İSTEĞE BAĞLI Haritalar arası ışınlanma izni (map)



Öncelikle, hangi haritalar arasında ışınlanmaya izin verileceğini belirle
C++:
#include <set>

static const std::set<int> allowedTeleportMaps = {
    0,  // Örnek: a BAYRAK
    1,  // Örnek: a BAYRAK
    2,  // Örnek: a BAYRAK
    10, // Başka bir harita
    // İzin verilen diğer harita indeksleri...
};

inline bool IsTeleportAllowedInMap(int mapIndex) {
    return allowedTeleportMaps.find(mapIndex) != allowedTeleportMaps.end();
}

Harita İzin Kontrolünü Güncelleme​


CanTeleport() fonksiyonunu aşağıdaki şekilde güncelle:
C++:
bool CHARACTER::CanTeleport() const {
    if (IsDead())
        return false;

    if (!IsTeleportAllowedInMap(GetMapIndex()))
        return false;

    if (IsInArena() || IsInBattleZone())
        return false;

    return true;
}

Komut Fonksiyonunu Haritalar Arası Işınlanmayı Destekleyecek Şekilde Güncelle

C++:
ACMD(do_teleport_to_player)
{
    if (!ch)
        return;

    if (!argument || strlen(argument) < 2) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /git <oyuncu_ismi>");
        return;
    }

    if (!ch->CanTeleport()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bu bölgede ışınlanamazsınız.");
        return;
    }

    if (!ch->CanUseTeleport()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Işınlanma komutunu çok sık kullandınız. Lütfen bekleyin.");
        return;
    }

    LPCHARACTER target_char = CHARACTER_MANAGER::instance().FindPC(argument);
    if (!target_char) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Oyuncu bulunamadı.");
        return;
    }

    if (!target_char->CanTeleport()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hedef oyuncu şu an ışınlanmaya uygun değil.");
        return;
    }

    // Harita izin kontrolü (hedef harita)
    if (!IsTeleportAllowedInMap(target_char->GetMapIndex())) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hedef haritada ışınlanma izni yok.");
        return;
    }

    // Işınlanma işlemi
    ch->SetTeleporting(true);

    int x = target_char->GetX();
    int y = target_char->GetY();
    int targetMap = target_char->GetMapIndex();

    ch->WarpSet(x, y, targetMap);

    ch->SetTeleporting(false);
    ch->SetLastTeleportTime(get_dword_time());

    ch->ChatPacket(CHAT_TYPE_INFO, "%s oyuncusunun yanına ışınlandınız.", target_char->GetName());
}



EK OLARAK YANINA IŞINLACAĞI KİŞİYE KABUL VEYA HAYIR İSTEĞİ GELSİN VE OYUNCU İSTEMEDEN KİMSE YANINA GELMESİN


oyuncu /kabul veya /reddet komutlarıyla cevap verecek
İstek gönderildiğinde oyuncuya bir onay mesajı gönderilecek.

Değişkenler ve Yapılar


C++:
// character.h

class CHARACTER {
private:
    LPCHARACTER m_lpPendingTeleportRequester; // Teleport isteği gönderen oyuncu
    bool m_bTeleportRequestPending;

public:
    void SetPendingTeleportRequester(LPCHARACTER requester) {
        m_lpPendingTeleportRequester = requester;
        m_bTeleportRequestPending = true;
    }

    void ClearPendingTeleportRequester() {
        m_lpPendingTeleportRequester = nullptr;
        m_bTeleportRequestPending = false;
    }

    LPCHARACTER GetPendingTeleportRequester() const {
        return m_lpPendingTeleportRequester;
    }

    bool HasTeleportRequestPending() const {
        return m_bTeleportRequestPending;
    }
};

Komutlar ve İşleyiş
/git <oyuncu_ismi> — Teleport İsteği Gönder

C++:
ACMD(do_teleport_request)
{
    if (!ch)
        return;

    if (!argument || strlen(argument) < 2) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kullanım: /git <oyuncu_ismi>");
        return;
    }

    LPCHARACTER target_char = CHARACTER_MANAGER::instance().FindPC(argument);
    if (!target_char) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Oyuncu bulunamadı.");
        return;
    }

    if (target_char == ch) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Kendinize ışınlanamazsınız.");
        return;
    }

    if (!ch->CanTeleport() || !target_char->CanTeleport()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Şu an ışınlanma işlemi yapılamıyor.");
        return;
    }

    if (target_char->HasTeleportRequestPending()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hedef oyuncunun bekleyen başka bir isteği var.");
        return;
    }

    // İstek gönder
    target_char->SetPendingTeleportRequester(ch);

    target_char->ChatPacket(CHAT_TYPE_NOTICE, "%s oyuncusu yanına ışınlanmak istiyor. Kabul etmek için /kabul, reddetmek için /reddet yazınız.", ch->GetName());
    ch->ChatPacket(CHAT_TYPE_INFO, "%s oyuncusuna ışınlanma isteği gönderildi.", target_char->GetName());
}


/kabul — İsteği Kabul Et

C++:
ACMD(do_teleport_accept)
{
    if (!ch)
        return;

    if (!ch->HasTeleportRequestPending()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hiçbir ışınlanma isteğiniz yok.");
        return;
    }

    LPCHARACTER requester = ch->GetPendingTeleportRequester();

    if (!requester || !requester->IsPC()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Geçersiz istek.");
        ch->ClearPendingTeleportRequester();
        return;
    }

    if (!requester->CanTeleport() || !ch->CanTeleport()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Şu an ışınlanma işlemi gerçekleştirilemiyor.");
        ch->ClearPendingTeleportRequester();
        return;
    }

    // Işınlanma işlemi
    int x = ch->GetX();
    int y = ch->GetY();
    int map = ch->GetMapIndex();

    requester->WarpSet(x, y, map);
    requester->SetLastTeleportTime(get_dword_time());

    requester->ChatPacket(CHAT_TYPE_INFO, "%s oyuncusunun yanına ışınlandınız.", ch->GetName());
    ch->ChatPacket(CHAT_TYPE_INFO, "%s oyuncusunu yanına kabul ettiniz.", requester->GetName());

    ch->ClearPendingTeleportRequester();
}

/reddet — İsteği Reddet

C++:
ACMD(do_teleport_reject)
{
    if (!ch)
        return;

    if (!ch->HasTeleportRequestPending()) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hiçbir ışınlanma isteğiniz yok.");
        return;
    }

    LPCHARACTER requester = ch->GetPendingTeleportRequester();

    if (requester) {
        requester->ChatPacket(CHAT_TYPE_INFO, "%s oyuncusu ışınlanma isteğinizi reddetti.", ch->GetName());
    }

    ch->ChatPacket(CHAT_TYPE_INFO, "Işınlanma isteği reddedildi.");

    ch->ClearPendingTeleportRequester();
}

Komut Kayıtları kısacsı komutlar

C++:
void RegisterCommands()
{
    command_info.insert(std::make_pair("git", do_teleport_request));
    command_info.insert(std::make_pair("kabul", do_teleport_accept));
    command_info.insert(std::make_pair("reddet", do_teleport_reject));
}
 
Son düzenleme:
Paylaşım için teşekkürler :)
 
Merhaba,

Konudaki kodlar bir anlam ifade etmiyor. Bu sebepten dolayı kapatıldı.

Çalıştığına dair kanıt'ı rapor olarak iletirseniz konunuz tekrar açılacaktır.

??
void RegisterCommands()
{
command_info.insert(std::make_pair("git", do_teleport_to_player));
}

??
SetTeleporting()

Teşekkürler,
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

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

Geri
Üst