- 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
/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
kod mayın tarlası gibi ama;
Öğeyi görmek için üye olmalısınız.
tekrardan at kitabını okuyunca başka at geliyor.
- 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
tekrardan at kitabını okuyunca başka at geliyor.
- Katılım
- 25 Eki 2023
- Konular
- 322
- Mesajlar
- 772
- Online süresi
- 28g 5989s
- Reaksiyon Skoru
- 917
- Altın Konu
- 145
- Başarım Puanı
- 182
- TM Yaşı
- 2 Yıl 5 Ay 26 Gün
- MmoLira
- 5,511
- DevLira
- 9
Paylaşım için teşekkürler.
- 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
gemini pro ücretli sürümü yazdı
Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)
Benzer konular
- Cevaplar
- 12
- Görüntüleme
- 917
- Cevaplar
- 2
- Görüntüleme
- 451
- Cevaplar
- 18
- Görüntüleme
- 1K










