Hikayeler

Reklam vermek için turkmmo@gmail.com

Mini Haritada istediğiniz yere ışınlanın

5.00 yıldız(lar) 1 Değerlendirme Değerlendirenler

Shorty

Teknik Sorumlu
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Teknik
VIP Üye
Katılım
31 May 2009
Konular
772
Mesajlar
4,174
Online süresi
4g 29299s
Reaksiyon Skoru
3,477
Altın Konu
1
Başarım Puanı
337
Yaş
33
TM Yaşı
16 Yıl 10 Ay 28 Gün
MmoLira
1,221
DevLira
3

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

Merhaba Gamemasterların oyuna daha hakim olup belirli kordinatlara hızlıca ışınlanabilmeleri için hazırladığım küçük bir yardımcıdır kendi sunucunuza göre düzenlemeniz gerekmektedir sadece basit halini ekliyorum.

M bastığınızda açılan haritada Mouse ile tıkladığınız kordinata ışınlanmanızı sağlar.

17.01.2021 Tarihinde Güncellendi
  • Işınlanma sonrası yaşanan donma/kasma sorunları düzeltildi.

Screenshot_7.png


uiminimap.py içerisinde bulun

Python:
self.SetPosition(wndMgr.GetScreenWidth() - 136 - 256 - 10, 0)

Altına ekleyin.

Python:
self.board.SetOnMouseLeftButtonUpEvent(ui.__mem_func__(self.OnMouseLeftButtonUpEvent))

uiminimap.py içerisinde bulun

Python:
    def SetCenterPositionAdjust(self, x, y):
        self.SetPosition((wndMgr.GetScreenWidth() - self.GetWidth()) / 2 + x, (wndMgr.GetScreenHeight() - self.GetHeight()) / 2 + y)

Altına ekleyin

Python:
    def OnMouseLeftButtonUpEvent(self):
        (mouseX, mouseY) = wndMgr.GetMousePosition()
        (bFind, sName, iPosX, iPosY, dwTextColor, dwGuildID) = miniMap.GetAtlasInfo(mouseX, mouseY)
        net.SendChatPacket("/go %s %s" % (str(iPosX), str(iPosY)))

PythonMinimap.cpp içerisinde bulun

C++:
bool CPythonMiniMap::GetAtlasInfo(float fScreenX, float fScreenY, std::string & rReturnString, float * pReturnPosX, float * pReturnPosY, DWORD * pdwTextColor, DWORD * pdwGuildID)
{
    float fRealX = (fScreenX - m_fAtlasScreenX) * (m_fAtlasMaxX / m_fAtlasImageSizeX);
    float fRealY = (fScreenY - m_fAtlasScreenY) * (m_fAtlasMaxY / m_fAtlasImageSizeY);

Altına ekleyin

C++:
    *pReturnPosX = fRealX;
    *pReturnPosY = fRealY;

NetworkActorManager.cpp dosyası içerisinde bulun --------- YENİ 17.01.2021

C++:
bool CNetworkActorManager::__IsVisiblePos(LONG lPosX, LONG lPosY)

Methodun tamamını bununla değiştirin --------- YENİ 17.01.2021

C++:
bool CNetworkActorManager::__IsVisiblePos(LONG lPosX, LONG lPosY)
{
    LONG dx = lPosX - m_lMainPosX;
    LONG dy = lPosY - m_lMainPosY;
    LONG len = (LONG)sqrtf((float(dx) * float(dx) + float(dy) * float(dy)));

    extern int CHAR_STAGE_VIEW_BOUND;
    if (len < CHAR_STAGE_VIEW_BOUND && len > -CHAR_STAGE_VIEW_BOUND)
        return true;

    return false;
}

NetworkActorManager.cpp dosyası içerisinde bulun --------- YENİ 17.01.2021

C++:
if (rkActorEach->IsPC() || rkActorEach->IsNPC() || rkActorEach->IsEnemy())

Bununla değiştirin --------- YENİ 17.01.2021

C++:
if (rkActorEach->IsPC() || rkActorEach->IsNPC() || rkActorEach->IsEnemy() || rkActorEach->IsStone() )

@ssembol61 Teşekkürler

oyuncular haritaya tıkladığında bu düzenleme mevcut değil diyecek
BUNUN önüne nasıl geçebiliriz
Python:
#uiminimap.py
net.SendChatPacket("/go %s %s" % (str(iPosX), str(iPosY))) # arat

#değiştir
        if chr.IsGameMaster(player.GetMainCharacterIndex()):
            net.SendChatPacket("/go %s %s" % (str(iPosX), str(iPosY)))

import chr
import player
#eğer importlarda yoksa ekle

Artık "M" bastığınızda açılan büyük haritada GM yetkisine sahip olan kişi haritada tıkladığı herhangi bir yere ışınlanabilir bununla beraber yönetimi dahada kolaylaştırmak için sectree_manager.cpp SendNPCPosition fonksiyonundaki örnekten yola çıkarak x haritada çevrimiçi gamemastera oyuncuların kordinat bilgilerini gönderip slotlar da kasan oyuncuları haritadan görerek üstüne tıklayıp takip edebilirsiniz hile takibinde çok güzel işe yarıyor :)
 
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

Oyuna girişte oyuncuların yerlerini görebilmek için SendNPCPosition fonksiyonunu aşağıdaki gibi değişebilirsiniz. Sadece gmler görebilir, oyuncunun direk x,y koordinatlarını alacak fonksiyonu bulamadığım için aşağıdaki gibi yaptım.

Öğeyi görmek için üye olmalısınız.

C++:
void SECTREE_MANAGER::SendNPCPosition(LPCHARACTER ch)
{
    LPDESC d = ch->GetDesc();
    if (!d)
        return;

    long lMapIndex = ch->GetMapIndex();

    if (m_mapNPCPosition[lMapIndex].empty())
        return;

    TEMP_BUFFER buf;
    TPacketGCNPCPosition p;
    p.header = HEADER_GC_NPC_POSITION;
    p.count = m_mapNPCPosition[lMapIndex].size();

    TNPCPosition np;

    // TODO m_mapNPCPosition[lMapIndex] ¸¦ º¸³»ÁÖ¼¼¿ä
    itertype(m_mapNPCPosition[lMapIndex]) it;

    for (it = m_mapNPCPosition[lMapIndex].begin(); it != m_mapNPCPosition[lMapIndex].end(); ++it)
    {
        np.bType = it->bType;
        strlcpy(np.name, it->name, sizeof(np.name));
        np.x = it->x;
        np.y = it->y;
        buf.write(&np, sizeof(np));
    }
    
    
    if (ch->IsGM())
    {
        const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet();

        for (itertype(c_ref_set) it2 = c_ref_set.begin(); it2 != c_ref_set.end(); ++it2)
        {
            LPCHARACTER pkChar = (*it2)->GetCharacter();
            if (!pkChar)
                continue;
                
            if (pkChar->GetMapIndex() == lMapIndex && pkChar->GetPlayerID() != ch->GetPlayerID())
            {
                PIXEL_POSITION posBase;
                if (!SECTREE_MANAGER::instance().GetMapBasePositionByMapIndex(ch->GetMapIndex(), posBase))
                {
                    continue;
                }
                DWORD mapX = posBase.x;
                DWORD mapY = posBase.y;
                const PIXEL_POSITION & vpos = pkChar->GetXYZ();
                DWORD playerX = vpos.x;
                DWORD playerY = vpos.y;
                DWORD finalX = (playerX- mapX)/100;
                DWORD finalY = (playerY- mapY)/100;
                finalX *= 100;
                finalY *= 100;
                np.bType = 1;
                strlcpy(np.name, pkChar->GetName(), sizeof(np.name));
                np.x = finalX;
                np.y = finalY;
                p.count += 1;
                buf.write(&np, sizeof(np));
            }           
        }
    }
    
    p.size = sizeof(p) + buf.size();

    if (buf.size())
    {
        d->BufferedPacket(&p, sizeof(TPacketGCNPCPosition));
        d->Packet(buf.read_peek(), buf.size());
    }
    else
        d->Packet(&p, sizeof(TPacketGCNPCPosition));
}
Sectree'ye yeni bir Öğeyi görmek için üye olmalısınız.açıyoruz (protected olması önemli)

Anahtarımız VID, değerimiz PIXEL_POSITION

C++:
void CInputLogin::Entergame(LPDESC d, const char * data)

Bu fonksiyonun içerisin de Sectree ye ben oyundayım VID bu Pozisyonum bu kaydı giriliyor.

Oyuncu girdiği gibi çıkabilir bunu unutmuyoruz tabi

C++:
void CHARACTER::Disconnect(const char * c_pszReason)

Onuda burdan siliyoruz.

Geriye kalan sadece

C++:
const DESC_MANAGER::DESC_SET & set = DESC_MANAGER::instance().GetClientSet();

ve aktif gm yetkisine sahip cliente (istemci) asenkron bağlantı ile aktarımı sağlanır, çok fazla online var olur mu öyle şey bilgisayar bilimlerinde kullanılmıyor smart pointerları containera alırsanız uçulurduğunda yok olursunuz.

Hatırladığım kadarıyla GetXYZ gibi bir fonksiyon olması lazım zaten hali hazırda direk PIXEL_POSITION structı dönen, VID zaten mevcut. aynı zamanda gm listeside mevcut diye hatırlıyorum yani bu hali ile hazırda mevcut yeniden tanımlamalara gerek yok.

GetClientSet den dönen listeyi direk timer eventine bağlayarak kullanarak x saniyede bir gm clientlerine iletilir.

Bu işi fazlasıyla iyi bir şekilde yapan admin manager isminde bir eklenti olan sourceler paylaşılmıştı zaten rubinum ya da global olması lazım direk ordan çok daha iyi hali hazır olarak da alınabilir.
Hatırladığım kadarıyla GetXYZ gibi bir fonksiyon olması lazım zaten hali hazırda direk PIXEL_POSITION structı dönen, VID zaten mevcut. aynı zamanda gm listeside mevcut diye hatırlıyorum yani bu hali ile hazırda mevcut yeniden tanımlamalara gerek yok.

GetClientSet den dönen listeyi direk timer eventine bağlayarak kullanarak x saniyede bir gm clientlerine iletilir.

Bu işi fazlasıyla iyi bir şekilde yapan admin manager isminde bir eklenti olan sourceler paylaşılmıştı zaten rubinum ya da global olması lazım direk ordan çok daha iyi hali hazır olarak da alınabilir.

Genel olarak rubinum files (nedemekse) oradan yürümek istemiştim :)
teşekkürler abi
 
Teşekkürler
 
basit ama bir o kadar da yararlı teşekkürler.
 
Teşekkürler.
 

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

Geri
Üst