Çok eski bir web tarayıcısı kullanıyorsunuz. Bu veya diğer siteleri görüntülemekte sorunlar yaşayabilirsiniz.. Tarayıcınızı güncellemeli veya alternatif bir tarayıcı kullanmalısınız.
Yardımpy veya c++ tabanlı merak ettiğim birkaç sorgu
mini haritadaki(m ile açılanı kast ediyorum) partideki x bir oyuncuya tıklandığında yanına ışınlanmak ister misiniz sorusuna evet denilirse ışınlanmalı bir olay üstünde çalışıyorum, eski bir pvp oyuncusu olarak böyle açıklardan yararlanıp item kopyalama yapardım, ışınlanırken itemleri sıralaya tıklamak, offline shop a item koyarken ticaret atarken ışınlanmaya çalışmak vb. gibi, ticaret penceresi/ envanter açıkken ışınlanma işlemini engellemek istiyorum sorguyu nasıl kurgulamam gerekir, oyuncunun ticaret penceresi açık olması veya envanterin açık olmasını kontrol eden bir fonksiyon var mı? varsa bir iki örnek kod fırlatabilir misiniz
mini haritadaki(m ile açılanı kast ediyorum) partideki x bir oyuncuya tıklandığında yanına ışınlanmak ister misiniz sorusuna evet denilirse ışınlanmalı bir olay üstünde çalışıyorum, eski bir pvp oyuncusu olarak böyle açıklardan yararlanıp item kopyalama yapardım, ışınlanırken itemleri sıralaya tıklamak, offline shop a item koyarken ticaret atarken ışınlanmaya çalışmak vb. gibi, ticaret penceresi/ envanter açıkken ışınlanma işlemini engellemek istiyorum sorguyu nasıl kurgulamam gerekir, oyuncunun ticaret penceresi açık olması veya envanterin açık olmasını kontrol eden bir fonksiyon var mı? varsa bir iki örnek kod fırlatabilir misiniz
Evet, bu tür bir sorun için genellikle oyuncunun ticaret penceresi veya envanteri açık olup olmadığını kontrol etmeniz gerekecektir. Bu tür özellikler genellikle oyun motoruna veya kullanılan sistemin API'sine bağlı olarak değişir, ancak genel bir kontrol yöntemi sunabilirim. Aşağıda, ticaret penceresi veya envanterin açık olup olmadığını kontrol eden bazı örnek fonksiyonlar ve bunun ışınlanma işlemine entegre edilmesi için temel bir yapıyı bulabilirsiniz:
1. Ticaret Penceresi ve Envanter Kontrolü
İlk olarak, oyuncunun ticaret penceresinin ve envanterinin açık olup olmadığını kontrol eden fonksiyonları yazalım. Bu fonksiyonlar oyun motorunuzun API'sine veya veritabanına bağlı olarak değişebilir. Bu yüzden, burada genel bir yaklaşım sergiliyorum:
Ticaret Penceresi ve Envanter Kontrolü Fonksiyonları
C++:
// Ticaret penceresinin açık olup olmadığını kontrol etme
bool isTradeWindowOpen(Player* player) {
// Bu fonksiyon, oyuncunun ticaret penceresinin açık olup olmadığını kontrol eder
return player->tradeWindowOpen();
}
// Envanterin açık olup olmadığını kontrol etme
bool isInventoryOpen(Player* player) {
// Bu fonksiyon, oyuncunun envanterinin açık olup olmadığını kontrol eder
return player->inventoryOpen();
}
// Işınlanmanın yapılabilmesi için gerekli kontrol fonksiyonu
bool canTeleport(Player* player) {
// Eğer ticaret penceresi veya envanter açıksa ışınlanma yapılmaz
if (isTradeWindowOpen(player)) {
player->sendMessage("Ticaret penceresi açıkken ışınlanamazsınız!");
return false;
}
if (isInventoryOpen(player)) {
player->sendMessage("Envanter açıkken ışınlanamazsınız!");
return false;
}
// Eğer her şey uygun ise ışınlanma yapılabilir
return true;
}
Bu fonksiyonlar, oyuncunun ticaret penceresinin veya envanterinin açık olup olmadığını kontrol eder ve ışınlanma işlemini engeller.
2. Işınlanma İşlemi
Eğer oyuncu ticaret penceresi veya envanteri açık değilse, ışınlanma işlemi yapılabilir. Bu işlemde, oyuncuyu yeni bir lokasyona taşımayı sağlayacak fonksiyonları kullanabilirsiniz.
Işınlanma Fonksiyonu
C++:
void teleportPlayer(Player* player, const Location& targetLocation) {
// Işınlanmadan önce kontrol
if (!canTeleport(player)) {
return; // Eğer ışınlanma engellenmişse işlemi sonlandır
}
// Işınlanma işlemi
player->teleport(targetLocation);
player->sendMessage("Başarıyla ışınlandınız!");
}
3. Olay Tetikleyici (Mini Harita Tıklama)
Mini harita üzerinden bir oyuncuya tıklandığında ışınlanma işlemi başlatılabilir. Aşağıda, bir oyuncu mini haritada tıkladığında ışınlanma işleminin nasıl yapılabileceğini gösteren bir örnek yer alıyor:
Mini Harita Tıklama Olayı
C++:
void onPlayerClick(Player* player, const MapBlock* clickedBlock) {
// Eğer mini harita üzerinden bir oyuncuya tıklanmışsa
if (isPlayerOnMiniMap(clickedBlock)) {
// Tıklanan oyuncunun lokasyonunu al
Location targetLocation = getPlayerLocationFromMiniMap(clickedBlock);
// Işınlanma işlemini başlat
teleportPlayer(player, targetLocation);
}
}
4. Genel Yapı
Bu yapıyı birleştirerek, oyuncunun ticaret penceresi veya envanteri açıksa ışınlanma işlemini engelleyebilir ve aksi takdirde ışınlanmayı gerçekleştirebilirsiniz. Burada kullanılan Player, Location, MapBlock gibi türler, oyun motoruna göre özelleştirilebilir ve fonksiyonlar oyun motorunun sunduğu API'lere göre şekillendirilebilir.
Özetle, C++ dilinde bu tür bir olay mantığı şu şekilde çalışır:
Oyuncunun ticaret penceresi veya envanteri açık mı? Kontrol edilir.
Eğer açıksa, ışınlanma engellenir ve oyuncuya bir mesaj gönderilir.
Eğer her şey uygunsa, oyuncu belirtilen lokasyona ışınlanır.
Bu yapıyı kullandığınız oyun motorunun API'sine göre özelleştirebilirsiniz.
Evet kontroller sağlayabileceğin fonksiyonlar bulunmakta altta örnekler paylaştım. Bunların listesini @Whistle paylaşmıştı diye bir hatırlamam var ama bulamadım.
Evet kontroller sağlayabileceğin fonksiyonlar bulunmakta altta örnekler paylaştım. Bunların listesini @Whistle paylaşmıştı diye bir hatırlamam var ama bulamadım.
böyle bir liste varsa çok işime yarar,
isopensafebox() sanırım depo kontrolü,
getShopOwner() kişisel pazar kontrollerinden biri
getMyShop() kişisel pazar a erişimle ilgili kontrol ?
isCubeOpen() cube penceresi kontrolü sanırım.
hocam envanter ve ticaret penceresi kontrollerini biliyor musunuz veyahut genel olarak pencere açıksa diye bir kontrol var mı oyunda
Envanter penceresi GUI olarak statik çalışır, dolayısıyla varsayılan olarak serverle bir ilişkisi olmadığı için server tarafında açık olup olmadığını kontrol edemezsin. İstenildiği takdirde yapılabilir ancak "envanter için" sürekli servere komut göndermek bence mantıksız olur. Bunun yerine pythondan envanterin açık olup olmadığını kontrol ederek (IsShow veya IsOpen) client src'ye bool türünde argüman göndererek engel koyabilirsin. Veya sadece pythondan da yapabilirsin.
Envanter penceresi GUI olarak statik çalışır, dolayısıyla varsayılan olarak serverle bir ilişkisi olmadığı için server tarafında açık olup olmadığını kontrol edemezsin. İstenildiği takdirde yapılabilir ancak "envanter için" sürekli servere komut göndermek bence mantıksız olur. Bunun yerine pythondan envanterin açık olup olmadığını kontrol ederek (IsShow veya IsOpen) client src'ye bool türünde argüman göndererek engel koyabilirsin. Veya sadece pythondan da yapabilirsin.
Evet, bu tür bir sorun için genellikle oyuncunun ticaret penceresi veya envanteri açık olup olmadığını kontrol etmeniz gerekecektir. Bu tür özellikler genellikle oyun motoruna veya kullanılan sistemin API'sine bağlı olarak değişir, ancak genel bir kontrol yöntemi sunabilirim. Aşağıda, ticaret penceresi veya envanterin açık olup olmadığını kontrol eden bazı örnek fonksiyonlar ve bunun ışınlanma işlemine entegre edilmesi için temel bir yapıyı bulabilirsiniz:
1. Ticaret Penceresi ve Envanter Kontrolü
İlk olarak, oyuncunun ticaret penceresinin ve envanterinin açık olup olmadığını kontrol eden fonksiyonları yazalım. Bu fonksiyonlar oyun motorunuzun API'sine veya veritabanına bağlı olarak değişebilir. Bu yüzden, burada genel bir yaklaşım sergiliyorum:
Ticaret Penceresi ve Envanter Kontrolü Fonksiyonları
C++:
// Ticaret penceresinin açık olup olmadığını kontrol etme
bool isTradeWindowOpen(Player* player) {
// Bu fonksiyon, oyuncunun ticaret penceresinin açık olup olmadığını kontrol eder
return player->tradeWindowOpen();
}
// Envanterin açık olup olmadığını kontrol etme
bool isInventoryOpen(Player* player) {
// Bu fonksiyon, oyuncunun envanterinin açık olup olmadığını kontrol eder
return player->inventoryOpen();
}
// Işınlanmanın yapılabilmesi için gerekli kontrol fonksiyonu
bool canTeleport(Player* player) {
// Eğer ticaret penceresi veya envanter açıksa ışınlanma yapılmaz
if (isTradeWindowOpen(player)) {
player->sendMessage("Ticaret penceresi açıkken ışınlanamazsınız!");
return false;
}
if (isInventoryOpen(player)) {
player->sendMessage("Envanter açıkken ışınlanamazsınız!");
return false;
}
// Eğer her şey uygun ise ışınlanma yapılabilir
return true;
}
Bu fonksiyonlar, oyuncunun ticaret penceresinin veya envanterinin açık olup olmadığını kontrol eder ve ışınlanma işlemini engeller.
2. Işınlanma İşlemi
Eğer oyuncu ticaret penceresi veya envanteri açık değilse, ışınlanma işlemi yapılabilir. Bu işlemde, oyuncuyu yeni bir lokasyona taşımayı sağlayacak fonksiyonları kullanabilirsiniz.
Işınlanma Fonksiyonu
C++:
void teleportPlayer(Player* player, const Location& targetLocation) {
// Işınlanmadan önce kontrol
if (!canTeleport(player)) {
return; // Eğer ışınlanma engellenmişse işlemi sonlandır
}
// Işınlanma işlemi
player->teleport(targetLocation);
player->sendMessage("Başarıyla ışınlandınız!");
}
3. Olay Tetikleyici (Mini Harita Tıklama)
Mini harita üzerinden bir oyuncuya tıklandığında ışınlanma işlemi başlatılabilir. Aşağıda, bir oyuncu mini haritada tıkladığında ışınlanma işleminin nasıl yapılabileceğini gösteren bir örnek yer alıyor:
Mini Harita Tıklama Olayı
C++:
void onPlayerClick(Player* player, const MapBlock* clickedBlock) {
// Eğer mini harita üzerinden bir oyuncuya tıklanmışsa
if (isPlayerOnMiniMap(clickedBlock)) {
// Tıklanan oyuncunun lokasyonunu al
Location targetLocation = getPlayerLocationFromMiniMap(clickedBlock);
// Işınlanma işlemini başlat
teleportPlayer(player, targetLocation);
}
}
4. Genel Yapı
Bu yapıyı birleştirerek, oyuncunun ticaret penceresi veya envanteri açıksa ışınlanma işlemini engelleyebilir ve aksi takdirde ışınlanmayı gerçekleştirebilirsiniz. Burada kullanılan Player, Location, MapBlock gibi türler, oyun motoruna göre özelleştirilebilir ve fonksiyonlar oyun motorunun sunduğu API'lere göre şekillendirilebilir.
Özetle, C++ dilinde bu tür bir olay mantığı şu şekilde çalışır:
Oyuncunun ticaret penceresi veya envanteri açık mı? Kontrol edilir.
Eğer açıksa, ışınlanma engellenir ve oyuncuya bir mesaj gönderilir.
Eğer her şey uygunsa, oyuncu belirtilen lokasyona ışınlanır.
Bu yapıyı kullandığınız oyun motorunun API'sine göre özelleştirebilirsiniz.
Evet kontroller sağlayabileceğin fonksiyonlar bulunmakta altta örnekler paylaştım. Bunların listesini @Whistle paylaşmıştı diye bir hatırlamam var ama bulamadım.
mini haritadaki(m ile açılanı kast ediyorum) partideki x bir oyuncuya tıklandığında yanına ışınlanmak ister misiniz sorusuna evet denilirse ışınlanmalı bir olay üstünde çalışıyorum, eski bir pvp oyuncusu olarak böyle açıklardan yararlanıp item kopyalama yapardım, ışınlanırken itemleri sıralaya tıklamak, offline shop a item koyarken ticaret atarken ışınlanmaya çalışmak vb. gibi, ticaret penceresi/ envanter açıkken ışınlanma işlemini engellemek istiyorum sorguyu nasıl kurgulamam gerekir, oyuncunun ticaret penceresi açık olması veya envanterin açık olmasını kontrol eden bir fonksiyon var mı? varsa bir iki örnek kod fırlatabilir misiniz
Herhangi bir pencere açıkken engellemek gibi bir kontrol oldukça gereksiz olur hocam, belirli işlemleri server tarafından engellemek yeterlidir, envanter açık olabilir ama örneğin itemin yeri değiştirildiğinde, ticaret başladığında, depo açıldığında, pazar açıldığında, cube açıldığında, observer modda, karakter öldüğünde vs. belirli şeylerin yapılması engellenilebilir, bu durum olası dupe problemlerinin önüne geçmek için yeterli olur (çoğu zaman), benim altyapıda biraz da paranoyak olmam sebebiyle bunlardan yüzlercesi var, sana fikir vermesi için örnek;
input_main dosyasından engelleyebilirsiniz, direkt olarak fonksiyonlarının içinden engelleyebilirsiniz, ruh hastasıysanız ikisinden birden engelleyebilirsiniz (merhaba ), örnek;
input_main.cpp:
void CInputMain::Refine (LPCHARACTER ch, const char* c_pData)
{
const TPacketCGRefine* p = reinterpret_cast<const TPacketCGRefine*> (c_pData);
if (!ch) // DevFix 111
{
sys_err ("<CInputMain::Refine> CH is a NULL pointer!");
ch->ClearRefineMode();
return;
}
if (ch->IsPC() == false) // DevFix 111
{
sys_err ("<CInputMain::Refine> CH is a NOT PC!");
ch->ClearRefineMode();
return;
}
if (ch->GetExchange() || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->GetMyShop() || ch->IsCubeOpen() || ch->IsObserverMode()) // DevFix 27
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("창고,거래창등이 열린 상태에서는 개량을 할수가 없습니다"));
ch->ClearRefineMode();
return;
}
//xxx
}
Bunun dışında oyundaki tüm ch değiştirme, karakter atma, oyunu kapatma işlemlerini mutlaka TimedEvent olarak kullanın yani bu ne demek, oyuncu oyunu kapatmak, çıkış yapmak, karakter atmak veya hızlı CH sistemini kullanmak istediğinde mutlaka en az 3'den geri saysın, bu sayım öncesi belirli durumlarda çıkışı engellemek için örnek (yine fonksiyon içlerinden de yapılabilir, tercihinize kalmış);
Hızlı CH ve offline shop sistemlerinde yıllar içinde çıkan onlarca dupe açığının sebebi %99 eksik kontrollerdir, gerekli her nokta server tarafında kontrol edildiği sürece oyuncunun bunu aşması çoğu zaman imkansızdır, paranoyak olup her yere kontrol koyun, merak etmeyin güncel derleyiciler ile bu kontroller performans olarak neredeyse hiç olumsuz etki etmeyecektir, sevgiler.
Herhangi bir pencere açıkken engellemek gibi bir kontrol oldukça gereksiz olur hocam, belirli işlemleri server tarafından engellemek yeterlidir, envanter açık olabilir ama örneğin itemin yeri değiştirildiğinde, ticaret başladığında, depo açıldığında, pazar açıldığında, cube açıldığında, observer modda, karakter öldüğünde vs. belirli şeylerin yapılması engellenilebilir, bu durum olası dupe problemlerinin önüne geçmek için yeterli olur (çoğu zaman), benim altyapıda biraz da paranoyak olmam sebebiyle bunlardan yüzlercesi var, sana fikir vermesi için örnek;
input_main dosyasından engelleyebilirsiniz, direkt olarak fonksiyonlarının içinden engelleyebilirsiniz, ruh hastasıysanız ikisinden birden engelleyebilirsiniz (merhaba ), örnek;
input_main.cpp:
void CInputMain::Refine (LPCHARACTER ch, const char* c_pData)
{
const TPacketCGRefine* p = reinterpret_cast<const TPacketCGRefine*> (c_pData);
if (!ch) // DevFix 111
{
sys_err ("<CInputMain::Refine> CH is a NULL pointer!");
ch->ClearRefineMode();
return;
}
if (ch->IsPC() == false) // DevFix 111
{
sys_err ("<CInputMain::Refine> CH is a NOT PC!");
ch->ClearRefineMode();
return;
}
if (ch->GetExchange() || ch->IsOpenSafebox() || ch->GetShopOwner() || ch->GetMyShop() || ch->IsCubeOpen() || ch->IsObserverMode()) // DevFix 27
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("창고,거래창등이 열린 상태에서는 개량을 할수가 없습니다"));
ch->ClearRefineMode();
return;
}
//xxx
}
Bunun dışında oyundaki tüm ch değiştirme, karakter atma, oyunu kapatma işlemlerini mutlaka TimedEvent olarak kullanın yani bu ne demek, oyuncu oyunu kapatmak, çıkış yapmak, karakter atmak veya hızlı CH sistemini kullanmak istediğinde mutlaka en az 3'den geri saysın, bu sayım öncesi belirli durumlarda çıkışı engellemek için örnek (yine fonksiyon içlerinden de yapılabilir, tercihinize kalmış);
Hızlı CH ve offline shop sistemlerinde yıllar içinde çıkan onlarca dupe açığının sebebi %99 eksik kontrollerdir, gerekli her nokta server tarafında kontrol edildiği sürece oyuncunun bunu aşması çoğu zaman imkansızdır, paranoyak olup her yere kontrol koyun, merak etmeyin güncel derleyiciler ile bu kontroller performans olarak neredeyse hiç olumsuz etki etmeyecektir, sevgiler.
hocam dediklerinizi inceleyeceğim py tarafında pencere kontrolü yapmanın mantığı nasıl, bir ufak örnek gösterebilir misiniz? O hızlı ch ve envanter düzenleme eklentisiyle çokça bug/dupe yapıldığını bire bir kendi gözlerimle gördüm malesef :d
hocam dediklerinizi inceleyeceğim py tarafında pencere kontrolü yapmanın mantığı nasıl, bir ufak örnek gösterebilir misiniz? O hızlı ch ve envanter düzenleme eklentisiyle çokça bug/dupe yapıldığını bire bir kendi gözlerimle gördüm malesef :d
reis python ile yapacağın kontrol clientta olur, zaten kaynak kodu açık clientin hile yapmak çok kolay oraya engel koyduğunu göre hile yapımcısının onun üzerine gidecek serverda valide etmeyip clientta ettiğin için patlayacaksın