Minimap Grup Takip Sistemi [MT2Shop]

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 64

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Konularımı takip edenler bilir, fazla uzatmayı sevmiyorum direk konuya geçelim.
Not: Sistem kendi tarafımca henüz denenmemiştir. Deneyen olursa yazdığı taktirde konuya eklerim.
ff91a055d1e3cec85677793e6109e5bc.gif

Kod:
Uygun bir yere ekle #define ENABLE_PARTY_MAP
Kod:
Bul; HEADER_GC_MARK_IDXLIST                        = 102, Altına ekle; #ifdef ENABLE_PARTY_MAP        HEADER_GC_PARTY_POSITION_INFO                = 105, #endif Bul; typedef struct packet_party_add Satır sonuna ekle; #ifdef ENABLE_PARTY_MAP    typedef struct SPacketGCPartyPositionInfo {     unsigned char    header;     DWORD    pid;     DWORD    x;     DWORD    y;     float    rot; } TPacketGCPartyPositionInfo; #endif

Kod:
Arat; #include "../eterPythonLib/PythonWindowManager.h" Altına ekle; #ifdef ENABLE_PARTY_MAP void CPythonMiniMap::AddPartyMember(DWORD dwPID, const char* szName) {    TPartyMember& rkPartyMember = m_kMap_dwPID_kPartyMember[dwPID];    ZeroMemory(&rkPartyMember, sizeof(TPartyMember));     rkPartyMember.pid = dwPID;    strncpy(rkPartyMember.szName, szName, sizeof(rkPartyMember.szName));    rkPartyMember.szName[CHARACTER_NAME_MAX_LEN] = '\0'; } void CPythonMiniMap::MovePartyMember(DWORD dwPID, long lX, long lY, float fRot) {    auto it = m_kMap_dwPID_kPartyMember.find(dwPID);    if (it == m_kMap_dwPID_kPartyMember.end())        return;     if (lX < m_dwAtlasBaseX)        return;    if (lY < m_dwAtlasBaseY)        return;    if (lX > m_dwAtlasBaseX + DWORD(m_fAtlasMaxX))        return;    if (lY > m_dwAtlasBaseY + DWORD(m_fAtlasMaxY))        return;     /*char szBuf[256];    snprintf(szBuf, sizeof(szBuf), "MovePartyMember %u (%s) to %ldx%ld (rot %f)",    dwPID, it->second.szName, lX, lY, fRot);    CPythonChat::Instance().AppendChat(CHAT_TYPE_INFO, szBuf);    */     it->second.lX = lX - m_dwAtlasBaseX;    it->second.lY = lY - m_dwAtlasBaseY;    it->second.fRotation = fRot; } void CPythonMiniMap::RemovePartyMember(DWORD dwPID) {    m_kMap_dwPID_kPartyMember.erase(dwPID); } void CPythonMiniMap::ClearPartyMember() {    m_kMap_dwPID_kPartyMember.clear(); } #endif Arat; bool CPythonMiniMap::LoadAtlas() { Satır içine ekle; #ifdef ENABLE_PARTY_MAP    ClearPartyMember(); #endif Arat; m_AtlasPlayerMark.Destroy(); Altına ekle; #ifdef ENABLE_PARTY_MAP    m_AtlasPartyPlayerMark.Destroy(); #endif Arat; m_AtlasPlayerMark.SetImagePointer((CGraphicSubImage *) CResourceManager::Instance().GetResourcePointer(playerMarkFileName)); Altına ekle; #ifdef ENABLE_PARTY_MAP    m_AtlasPartyPlayerMark.SetImagePointer((CGraphicSubImage *)CResourceManager::Instance().GetResourcePointer(playerMarkFileName)); #endif UpdateAtlas() İçinde arat; __GlobalPositionToAtlasPosition(rInfo.lx+rInfo.lwidth, rInfo.ly+rInfo.lheight, &rInfo.fexRender, &rInfo.feyRender);         }     } Altına ekle; #ifdef ENABLE_PARTY_MAP         {             auto itor = m_kMap_dwPID_kPartyMember.begin();             for (; itor != m_kMap_dwPID_kPartyMember.end(); ++itor)             {                 TPartyMember & rInfo = itor->second;                 __GlobalPositionToAtlasPosition(rInfo.lX, rInfo.lY, &rInfo.fScreenX, &rInfo.fScreenY);             }         } #endif Arat; if ((ELTimer_GetMSec() / 500) % 2) m_AtlasPlayerMark.Render(); Değiştir; #ifdef ENABLE_PARTY_MAP     if ((ELTimer_GetMSec() / 500) % 2)     {         for (auto itor = m_kMap_dwPID_kPartyMember.begin(); itor != m_kMap_dwPID_kPartyMember.end(); ++itor)         {             //TraceError("PartyPosition %ld %ld (screen %f %f)", itor->second.lX, itor->second.lY, itor->second.fScreenX, itor->second.fScreenY);             m_AtlasPartyPlayerMark.SetPosition(itor->second.fScreenX - (float)m_AtlasPartyPlayerMark.GetWidth() / 2.0f,                 itor->second.fScreenY - (float)m_AtlasPartyPlayerMark.GetHeight() / 2.0f);             m_AtlasPartyPlayerMark.SetRotation(itor->second.fRotation);             m_AtlasPartyPlayerMark.Render();         }         m_AtlasPlayerMark.Render(); } #else     if ((ELTimer_GetMSec() / 500) % 2)         m_AtlasPlayerMark.Render(); #endif
Kod:
Arat; bool GetAtlasSize(float * pfSizeX, float * pfSizeY); Altına ekle; #ifdef ENABLE_PARTY_MAP         void AddPartyMember(DWORD dwPID, const char* szName);         void MovePartyMember(DWORD dwPID, long lX, long lY, float fRot);         void RemovePartyMember(DWORD dwPID);         void ClearPartyMember(); #endif Arat; struct SObserver         {}; Satır sonuna ekle; #ifdef ENABLE_PARTY_MAP         typedef struct         {             DWORD pid;             char szName[CHARACTER_NAME_MAX_LEN + 1];             long lX;             long lY;             float fScreenX;             float fScreenY;             float fRotation;         } TPartyMember; #endif Arat; TInstanceMarkPositionVector        m_WarpPositionVector; Altına ekle; #ifdef ENABLE_PARTY_MAP         std::map<DWORD, TPartyMember>    m_kMap_dwPID_kPartyMember; #endif Arat; CGraphicExpandedImageInstance    m_AtlasPlayerMark; Altına ekle; #ifdef ENABLE_PARTY_MAP         CGraphicExpandedImageInstance    m_AtlasPartyPlayerMark; #endif
Kod:
Arat; Set(HEADER_GC_PARTY_UPDATE, Altına ekle; #ifdef ENABLE_PARTY_MAP                Set(HEADER_GC_PARTY_POSITION_INFO, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCPartyPositionInfo), STATIC_SIZE_PACKET)); #endif
Kod:
Arat; bool RecvPartyUpdate(); Altına ekle; #ifdef ENABLE_PARTY_MAP         bool RecvPartyPositionInfo(); #endif
Kod:
Arat; case HEADER_GC_PARTY_UPDATE: Üstüne ekle; #ifdef ENABLE_PARTY_MAP             case HEADER_GC_PARTY_POSITION_INFO:                 ret = RecvPartyPositionInfo();                 break; #endif Arat; bool CPythonNetworkStream::RecvPartyAdd() {          ...       return false; Altına ekle; #ifdef ENABLE_PARTY_MAP     if (strcmp(kPartyAddPacket.name, CPythonPlayer::Instance().GetName()))         CPythonMiniMap::Instance().AddPartyMember(kPartyAddPacket.pid, kPartyAddPacket.name); #endif Arat; bool CPythonNetworkStream::RecvPartyRemove() Üstüne ekle; #ifdef ENABLE_PARTY_MAP bool CPythonNetworkStream::RecvPartyPositionInfo() {     TPacketGCPartyPositionInfo kPartyPositionInfoPacket;     if (!Recv(sizeof(kPartyPositionInfoPacket), &kPartyPositionInfoPacket))         return false;     CPythonMiniMap::Instance().MovePartyMember(kPartyPositionInfoPacket.pid, kPartyPositionInfoPacket.x,         kPartyPositionInfoPacket.y, kPartyPositionInfoPacket.rot);     return true; } #endif Arat; if (!Recv(sizeof(kPartyRemovePacket), &kPartyRemovePacket))         return false; Altına ekle; #ifdef ENABLE_PARTY_MAP     CPythonMiniMap::Instance().RemovePartyMember(kPartyRemovePacket.pid); #endif Arat; if (CPythonPlayer::Instance().IsMainCharacterIndex(kPartyUnlinkPacket.vid)) Altına ekle; #ifdef ENABLE_PARTY_MAP         CPythonMiniMap::Instance().ClearPartyMember(); #endif
Kod:
Arat; mining_cancel(); Altına ekle; #ifdef ENABLE_PARTY_MAP     if (IsPC() && GetParty())         GetParty()->SendPartyPositionOneToAll(this); #endif
Kod:
Arat; HEADER_GC_MARK_IDXLIST            = 102, Altına ekle; #ifdef ENABLE_PARTY_MAP        HEADER_GC_PARTY_POSITION_INFO    =105, #endif Arat; typedef struct packet_party_update Satır sonuna ekle; #ifdef ENABLE_PARTY_MAP typedef struct SPacketGCPartyPositionInfo {     unsigned char    header;     DWORD    pid;     DWORD    x;     DWORD    y;     float    rot; } TPacketGCPartyPositionInfo; #endif
Kod:
Arat; SendPartyInfoOneToAll(pkChr); Altına ekle; #ifdef ENABLE_PARTY_MAP         SendPartyPositionAllToOne(pkChr);         SendPartyPositionOneToAll(pkChr); #endif Arat; void CParty::SendPartyInfoAllToOne(LPCHARACTER ch) Üstüne ekle; #ifdef ENABLE_PARTY_MAP    void CParty::SendPartyPositionOneToAll(LPCHARACTER ch) {     if (!ch->GetDesc())         return;     TMemberMap::iterator it;     TPacketGCPartyPositionInfo p;     p.header = HEADER_GC_PARTY_POSITION_INFO;     p.pid = ch->GetPlayerID();     p.x = ch->GetX();     p.y = ch->GetY();     p.rot = ch->GetRotation();     for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it)     {         if ((it->second.pCharacter) && (it->second.pCharacter->GetDesc()) && (it->second.pCharacter->GetMapIndex() == ch->GetMapIndex()))             it->second.pCharacter->GetDesc()->Packet(&p, sizeof(p));     } } void CParty::SendPartyPositionAllToOne(LPCHARACTER ch) {     TMemberMap::iterator it;     TPacketGCPartyPositionInfo p;     for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it)     {         if (it->second.pCharacter && it->second.pCharacter->GetMapIndex() == ch->GetMapIndex())         {             DWORD pid = it->first;             memset(&p, 0, sizeof(p));             p.header = HEADER_GC_PARTY_POSITION_INFO;             p.pid = pid;             p.x = it->second.pCharacter->GetX();             p.y = it->second.pCharacter->GetX();             p.rot = it->second.pCharacter->GetRotation();             ch->GetDesc()->Packet(&p, sizeof(p));         }     } } #endif
Kod:
Arat;         void        SendPartyUnlinkOneToAll(LPCHARACTER ch); Altına ekle; #ifdef ENABLE_PARTY_MAP            void        SendPartyPositionOneToAll(LPCHARACTER ch);         void        SendPartyPositionAllToOne(LPCHARACTER ch); #endif
Kod:
Uygun bir yere ekle; #define ENABLE_PARTY_MAP

Minimap Grup Takip Sistemi [MT2Shop]


Metin2 özel sunucularında grup oyun deneyimini artırmak için geliştirilmiş olan Minimap Grup Takip Sistemi, oyuncuların takımdaki diğer üyelerini kolayca takip edebilmesini sağlar. Bu sistem, özellikle PvP odaklı sunucularda stratejik hareketler için oldukça faydalıdır. Bu yazıda, MT2Shop tarafından sunulan bu sistemi detaylı olarak ele alacağız.

Sistem Nedir?
Minimap Grup Takip Sistemi, oyuncuların takım arkadaşlarını minimap üzerinde belirgin şekilde gösteren ve gerçek zamanlı konumlarını takip edebilmelerine olanak tanıyan gelişmiş bir özelliktir. Sistem, C++ tabanlı sunucu tarafında entegre edilir ve istemci tarafında Python GUI (py ui) ile desteklenir.

Nasıl Çalışır?
Sistem, game server üzerinden aktif oyuncuların konum verilerini alır ve bunu takım üyeleriyle paylaşır. Her takım üyesi, minimap üzerinde farklı bir simgeyle temsil edilir. Oyuncular, takım arkadaşlarının nerede olduğunu görebilir ve buna göre stratejiler geliştirebilirler.

Kurulum ve Entegrasyon
Kurulum işlemi, hem server-side hem de client-side değişiklikler içerir. Sunucu tarafında, takım verilerini güncellemek ve göndermek için özel bir C++ sistem dosyası entegre edilir. Client tarafında ise Python GUI (py ui) dosyaları düzenlenerek simgeler ve arayüz öğeleri eklenir. Bu sistem, uiscript ve py root yapılarıyla uyumlu çalışır.

Avantajları Nelerdir?
  • Takım koordinasyonunu artırır
  • PvP savaşlarında stratejik üstünlük sağlar
  • Oyuncu deneyimini ciddi anlamda geliştirir
  • Kolay kurulum ve entegrasyon sunar

Sunucu Geliştirme Açısından Önemi
Bu sistem, Metin2 özel sunucu geliştiricileri için büyük bir kolaylık sağlar. Özellikle PvP sistem odaklı sunucularda, oyuncuların birlikte daha verimli hareket etmesini sağlar. Martysama gibi geliştiricilerin dikkatini çekecek niteliktedir. Ayrıca, source edit ve server src üzerinde yapılan çalışmalarla daha da özelleştirilebilir.

Sonuç
Minimap Grup Takip Sistemi, Metin2 özel sunucularında grup oyunlarını daha keyifli ve stratejik hale getiren önemli bir özelliktir. MT2Shop tarafından sunulan bu sistem, C++ ve Python tabanlı geliştirme süreçlerine entegre olarak sunuculara yüksek düzeyde fonksiyonalite kazandırır.


Minimap Group Tracking System [MT2Shop]


The Minimap Group Tracking System, designed to enhance group gameplay experience on Metin2 private servers, allows players to easily track other team members. This system is especially beneficial for PvP-focused servers where strategic movement is essential. In this article, we will examine in detail this system offered by MT2Shop.

What Is The System?
The Minimap Group Tracking System is an advanced feature that displays teammates clearly on the minimap and enables real-time tracking of their locations. The system integrates with the server side using C++ and is supported on the client side with Python GUI (py ui).

How Does It Work?
The system retrieves location data of active players from the game server and shares it among team members. Each team member is represented by a unique icon on the minimap. Players can see where their teammates are located and develop strategies accordingly.

Installation and Integration
Installation involves both server-side and client-side modifications. On the server side, a custom C++ system file is integrated to update and send team data. On the client side, Python GUI (py ui) files are modified to add icons and interface elements. This system works compatibly with uiscript and py root structures.

Advantages
  • Increases team coordination
  • Provides strategic advantage during PvP battles
  • Significantly improves player experience
  • Offers easy installation and integration

Importance for Server Development
This system provides significant convenience for Metin2 private server developers. Particularly on PvP system-focused servers, it enables more efficient teamwork. It is of interest to developers like Martysama. Additionally, it can be customized further through work on source edit and server src.

Conclusion
The Minimap Group Tracking System is an important feature that makes group games more enjoyable and strategic on Metin2 private servers. This system provided by MT2Shop integrates into C++ and Python-based development processes, adding high-level functionality to servers.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt