Fethi Polat 1
Fethi Polat
xranzei 1
xranzei
Bvural41 1
Bvural41
kralhakan2009 1
kralhakan2009
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Vahsi Uzman 1
Vahsi Uzman
Cannn6161 1
Cannn6161
B 1
berione65
sen272 1
sen272
Mt2Hizmet 1
Mt2Hizmet
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Altın Konu [C++] Prevent Ride in War (PvP) Maps

  • Konuyu başlatan Konuyu başlatan MT2Dev
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 7
  • Görüntüleme Görüntüleme 2K
  • Etiketler Etiketler
    c++ fix mt2dev
5.00 yıldız(lar) 1 Değerlendirme Değerlendirenler

MT2Dev

Cplusplus
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Fahri Üye
TM Üye
Katılım
30 Ocak 2020
Konular
50
Mesajlar
812
Çözüm
6
Online süresi
26d 15h
Reaksiyon Skoru
735
Altın Konu
1
Başarım Puanı
184
MmoLira
8,746
DevLira
123
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!

GİRİŞ & PROBLEM

Merhaba, bu sefer üstünde çalışacağımız konu aslında önemli, oyuncuların çeşitli PvP (Lonca savaşı, Arena, PvP Event Mapleri vs. -bunlara ek olarak OX ve Düğün mapi de yasaklı haritalar arasında-) maplerinde binek/at kullanmasını engelleyecek veya bir binek/at üzerinde bu haritalara giriş yaptıklarında binekten/attan inmelerini sağlayacağız. Çeşitli yerlerde bununla ilgili pek çok konu olmasına rağmen hiçbiri tam ve eksiksiz bir çözüm sunmuyor dolayısıyla kendi altyapım için yaptığım tüm kontrolleri sizlerle paylaşıyorum.

NEDEN & NELERİ DEĞİŞTİRDİK ?

Özellikle Lonca Savaşları gibi PvP odaklı haritalarda oyuncuların binek/at kullanarak kendine avantaj sağlaması çoğunlukla istenmeyen bir durum, bunun önüne geçmek için doğru yerlere gerekli kontrolleri ekleyeceğiz ve karakterlerin binek/at kullanmasını istemediğimiz haritaları içeren bir fonksiyon oluşturacağız. (Bu fonksiyon içerisine yeni bir case oluşturup, ekstra olarak listeye dahil etmek istediğiniz map index kodunu ekleyebilirsiniz, böylece istediğiniz mapte bu engeli aktif etmeniz çok kolay olacaktır.)

!!! DİKKAT !!!

1-
Kendi altyapımda COSTUME_MOUNT sistemini kullanmıyorum, dolayısıyla bu konuyu oluştururken kodları buna göre yazdım o yüzden eğer siz bu sistemi kullanıyorsanız, bu sistemin içine de gerekli kontrolleri eklemeli ve benim verdiğim bazı kontrolleri kendinize göre düzenlemelisiniz (çünkü bazı bölümler eski mount sistemi baz alınarak yazıldı), aksi takdirde doğru veya efektif çalışmayabilir !

2- Anlatım esnasında söylediğim şekilde aradığınız kodun altına veya üstüne (anlatımda hangisini söylemişsem) ekleme yapın, konumları önemli ! Bir çok kod farklı yerleşimlere sahip o yüzden bu rehberi takip ederken altına veya üstüne diye belirttiğim kısımlarda hata yapmadığınıza emin olun..

NASIL YAPILIR ?

Öncelikle "char.h" dosyası açılır.

[CODE lang="cpp" title="char.h"]// BULUNUR;

bool Show (long lMapIndex, long x, long y, long z = LONG_MAX, bool bShowSpawnMotion = false);

// HEMEN ÜSTÜNE EKLENİR;

bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115[/CODE]

Sonrasında "char_horse.cpp" dosyası açılır.

[CODE lang="cpp" title="char_horse.cpp"]// BULUNUR;

bool CHARACTER::StartRiding()

// ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!)

extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115

// BULUNUR;

if (IsPolymorphed())
{
ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("변신 상태에서는 말에 탈 수 없습니다."));
return false;
}

// ALTINA EKLENİR;

if (false == IS_RIDEABLE_ZONE (GetMapIndex())) // DevFix 115
{
ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return false;
}

// BULUNUR;

if (IsRiding())
{
return;
}

// ALTINA EKLENİR;

if (false == IS_RIDEABLE_ZONE (GetMapIndex())) // DevFix 115
{
ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return;
}[/CODE]

Sonrasında "char_item.cpp" dosyası açılır.

[CODE lang="cpp" title="char_item.cpp"]// BULUNUR;

static bool FN_check_item_socket (LPITEM item)

// ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!)

static bool IS_MOUNT_ITEM (int MountItemVnum) // DevFix 115
{
if ((MountItemVnum >= 52001 && MountItemVnum <= 52120) || (MountItemVnum >= 71114 && MountItemVnum <= 71121)) // Old Mounts.
{
return true;
}

switch (MountItemVnum) // New Mounts.
{
// If you add new mounts in the game, make sure add their vnums here too ! - [MT2Dev Note] - 27/06/2024
case 71124:
case 71125:
case 71126:
case 71127:
case 71128:
case 71131:
case 71132:
case 71133:
case 71134:
case 71137:
case 71138:
case 71139:
case 71140:
case 71141:
case 71142:
case 71161:
case 71164:
case 71165:
case 71166:
case 71171:
case 71172:
case 71176:
case 71177:
return true;
}

return false;
}

bool IS_RIDEABLE_ZONE (int map_index) // DevFix 115
{
switch (map_index)
{
case 64: // 3Way War
case 81: // Wedding
case 103: // Guild I
case 105: // Guild II
case 110: // Guild III
case 111: // Guild IV
case 112: // Duel
case 113: // OX
case 114: // Sungzi
case 121: // Sungzi Snow
case 125: // Sungzi Desert
case 181: // Empire War I
case 182: // Empire War II
case 183: // Empire War III
return false;
}

// NOTE: Actually we don't need under this, cuz i already added the map index above, (Except Battle Arena)
// but this extras don't hurt anyone so i'm gonna leave it like this. - [MT2Dev Note] - 27/06/2024

// War
if (CWarMapManager::instance().IsWarMap (map_index))
{
return false;
}

// Arena
if (CArenaManager::instance().IsArenaMap (map_index))
{
return false;
}

// Battle Arena
if (CBattleArena::IsBattleArenaMap (map_index))
{
return false;
}

return true;
}

// BULUNUR;

if (false == FN_check_item_sex (this, item))
{
ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("성별이 맞지않아 이 아이템을 사용할 수 없습니다."));
return false;
}

// ALTINA EKLENİR;

if (IS_MOUNT_ITEM (item->GetVnum())) // DevFix 115
{
if (false == IS_RIDEABLE_ZONE (GetMapIndex()))
{
ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return false;
}
}[/CODE]

Sonrasında "cmd_general.cpp" dosyası açılır.

[CODE lang="cpp" title="cmd_general.cpp"]// BULUNUR;

ACMD (do_user_horse_ride)

// ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!)

extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115

// ACMD (do_user_horse_ride) İÇERİSİNDE BULUNUR;

if (ch->IsDead() || ch->IsStun())
{
return;
}

// ALTINA EKLENİR;

if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return;
}

// ACMD (do_ride) İÇERİSİNDE BULUNUR;

if (ch->IsDead() || ch->IsStun())
{
return;
}

// ALTINA EKLENİR;

if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return;
}[/CODE]

Sonrasında "cmd_gm.cpp" dosyası açılır.
[CODE lang="cpp" title="cmd_gm.cpp"]// BULUNUR;

void Command_ApplyAffect (LPCHARACTER ch, const char* argument, const char* affectName, int cmdAffect)

// ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!)

extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115

// BULUNUR;

if (ch->IsHorseRiding())
{
ch->StopRiding();
}
else
{
ch->StartRiding();
}

// ÜSTÜNE EKLENİR;

if (ch->GetGMLevel() < GM_WIZARD) // DevFix 115
{
if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex()))
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return;
}
}

// BULUNUR;

ch->HorseSummon (true, true);

// ÜSTÜNE EKLENİR;

if (ch->GetGMLevel() < GM_WIZARD) // DevFix 115
{
if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex()))
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP"));
return;
}
}[/CODE]

Sonrasında "input_login.cpp" dosyası açılır.
[CODE lang="cpp" title="input_login.cpp"]// BULUNUR;

static void _send_bonus_info (LPCHARACTER ch)

// ÜSTÜNE EKLENİR; (Fonksiyonun dışına, dikkat!)

extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115

// BULUNUR;

else if (ch->GetMapIndex() == 113)
{
if (COXEventManager::instance().Enter (ch) == false)
{
// Denied entry to OX map.. If player, send to town. - [Ymir Dev Note]
if (ch->GetGMLevel() == GM_PLAYER)
{
ch->WarpSet (EMPIRE_START_X (ch->GetEmpire()), EMPIRE_START_Y (ch->GetEmpire()));
}
}
}

// HEMEN BİTİMİNE YENİ BİR ELSE IF BLOĞU OLARAK EKLENİR;

else if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115
{
if (ch->IsHorseRiding())
{
ch->StopRiding();
ch->HorseSummon (false);
}

// IMPORTANT NOTE: We don't have costume mount system right now, if we add this in the future, we should be change some controls for sure. - [MT2Dev Note] - 28/06/2024
if (ch->GetMountVnum())
{
ch->UnEquipSpecialRideUniqueItem();
ch->RemoveAffect (AFFECT_MOUNT);
ch->RemoveAffect (AFFECT_MOUNT_BONUS);
ch->UpdatePacket();
}
}[/CODE]

Sonrasında "questlua_horse.cpp" dosyası açılır.

[CODE lang="cpp" title="questlua_horse.cpp"]// BULUNUR;

extern int (*check_name) (const char* str);

// ALTINA EKLENİR;

extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115

// BULUNUR;

ch->StartRiding();

// ÜSTÜNE EKLENİR;

if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115
{
return 0;
}

// BULUNUR;

bool bFromFar = lua_isboolean (L, 1) ? lua_toboolean (L, 1) : false;

// ÜSTÜNE EKLENİR;

if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115
{
return 0;
}[/CODE]

Sonrasında "questlua_pc.cpp" dosyası açılır.

[CODE lang="cpp" title="questlua_pc.cpp"]// BULUNUR;

namespace quest

// ÜSTÜNE EKLENİR; (Classın dışına, dikkat!)

extern bool IS_RIDEABLE_ZONE (int map_index); // DevFix 115

// BULUNUR;

int pc_mount (lua_State* L)

// FONKSİYONUN İÇİNDE BULUNUR;

ch->RemoveAffect (AFFECT_MOUNT);
ch->RemoveAffect (AFFECT_MOUNT_BONUS);

// ÜSTÜNE EKLENİR;

if (false == IS_RIDEABLE_ZONE (ch->GetMapIndex())) // DevFix 115
{
return 0;
}[/CODE]

Src ile işimiz bitti, şimdi SF tarafında düzenleme yapmamız gerek. Öncelikle quest dosyanızı açın ve başta "ride.quest" olmak üzere "ride_xxx.quest" tarzındaki tüm questlerinizi açın ve hepsinde aşağıdaki işlemi yapın.

[CODE lang="cpp" title="ride.quest"]-- AŞAĞIDAKİ KODU ARAYIN (Tam olarak aynı olmasa da benzer şekilde de bulunabilir);

if pc.level < ride_info[vnum][5] then
say("")
say(gameforge.ride._010_say)
say("")
else
if 112 == pc.get_map_index() then
return
end

-- EĞER BU VEYA BUNA BENZER BİR KOD BULURSANIZ ŞU ŞEKİLDE DÜZENLEYİN;

if pc.level < ride_info[vnum][5] then
say("")
say(gameforge.ride._010_say)
say("")
else
-- Fix for prevent mount&horse in PvP maps. - [MT2Dev Note] - 28/06/2024
local mapIndex = pc.get_map_index()
if mapIndex == 64 or mapIndex == 81 or mapIndex == 103 or
mapIndex == 105 or mapIndex == 110 or mapIndex == 111 or
mapIndex == 112 or mapIndex == 114 or mapIndex == 121 or
mapIndex == 125 or mapIndex == 181 or mapIndex == 182 or
mapIndex == 183 or mapIndex == 113 then
return
end[/CODE]

Son olarak "locale_string.txt" dosyanızı açın.

[CODE title="locale_string.txt"]"CANNOT_RIDE_HORSE_OR_MOUNT_IN_THIS_MAP";
"<Kontrol> Bu haritada at veya binek kullanamazsınız! ";[/CODE]
Kolay gelsin, MT2Dev.
 

En Çok Reaksiyon Alan Mesajlar

Paylaşım için teşekkürler.
 
Thank you
 

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

Geri
Üst