[C++/Client] l MobScale l Saltanat Tipi Serverler İçin Ejderleri Küçültme

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Herkese merhabalar 👋.

Konuya geçmeden önce evet buda önceden açıldı fakat araştırmam ve konular biri editlenmiş biri ise de virüs olduğu için kapatılmış bulunmakta. Eğer benim görmediğim bir konu varsa konu linki verilip kapatılabilir.

Konu geçecek olursak. Bu mob scale nedir? Siz ejder pet eklediğinizde o koskocaman gelir :suspicious:. Bunu nasıl küçülteceğiz diye sorarsanız da işte bu mob scale ile :thumb:. Şimdi başlıkta saltanat tipi serverler için yazdım ama siz istediğiniz peti genede küçültebilirsiniz 🕵️.

Kodlara gelelim.

Client Sourcenizden EterGrnLib/ThingInstance.cpp Açın ve aratın.

Kod:
void CGraphicThingInstance::DeformNoSkin()

kod bloğu tamamen aşağıda ki kodla değiştirilir.

Kod:
void CGraphicThingInstance::DeformNoSkin() {     m_bUpdated = true;     for (std::vector<CGrannyLODController*>::size_type i = 0; i != m_LODControllerVector.size(); i++)     {         CGrannyLODController* pkLOD = m_LODControllerVector[i];         if (pkLOD->isModelInstance())             pkLOD->DeformNoSkin(&m_matAbsoluteTrans);     } }

tekrar aratın.

Kod:
void CGraphicThingInstance::OnDeform()

kod bloğunu aşağıda ki ile değiştirin.

Kod:
void CGraphicThingInstance::OnDeform() {     m_bUpdated = true;     for (std::vector<CGrannyLODController*>::size_type i = 0; i != m_LODControllerVector.size(); i++)     {         CGrannyLODController* pkLOD = m_LODControllerVector[i];         if (pkLOD->isModelInstance())             pkLOD->Deform(&m_matAbsoluteTrans);     } }

Sonra Client dosyalarınız içinden /EterLib/GrpObjectInstance.cpp açın ve aratın

Kod:
m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f;     m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f;     //m_fRotation = 0.0f;     m_fYaw = m_fPitch = m_fRoll = 0.0f;     D3DXMatrixIdentity(&m_worldMatrix);

kod bloğunun sonuna aşağıda ki kodu ekleyin

Kod:
m_vecScalePos.x = m_vecScalePos.y = m_vecScalePos.z = 0.0f;     m_vecScaleNew.x = m_vecScaleNew.y = m_vecScaleNew.z = 0.0f;     D3DXMatrixIdentity(&m_matAbsoluteTrans);     D3DXMatrixIdentity(&m_matScale);     D3DXMatrixIdentity(&m_matPositon);

tekrar aratın.

Kod:
void CGraphicObjectInstance::Transform()

ve kod bloğunu aşağıda ki kodlar ile değiştirin.

Kod:
void CGraphicObjectInstance::Transform() {     D3DXMATRIX temp;     D3DXMatrixMultiply(&temp, &m_matPositon, &m_mRotation);     m_worldMatrix = temp;     m_worldMatrix._41 += m_v3Position.x;     m_worldMatrix._42 += m_v3Position.y;     m_worldMatrix._43 += m_v3Position.z;     D3DXMatrixMultiply(&temp, &m_matPositon, &m_matScale);     D3DXMATRIX temp2;     D3DXMatrixMultiply(&temp2, &temp, &m_mRotation);     m_matAbsoluteTrans = temp2;     m_matAbsoluteTrans._41 = m_vecScalePos.x + m_v3Position.x + m_matAbsoluteTrans._41;     m_matAbsoluteTrans._42 = m_vecScalePos.y + m_v3Position.y + m_matAbsoluteTrans._42;     m_matAbsoluteTrans._43 = m_vecScalePos.z + m_v3Position.z + m_matAbsoluteTrans._43; }

tekrar aratın

Kod:
void CGraphicObjectInstance::SetScale(float x, float y, float z) {     m_v3Scale.x = x;     m_v3Scale.y = y;     m_v3Scale.z = z; }

kod bloğunun altına aşağıda ki kodu ekleyin

Kod:
void CGraphicObjectInstance::SetScaleNew(float x, float y, float z) {     m_vecScaleNew.x = x;     m_vecScaleNew.y = y;     m_vecScaleNew.z = z;     D3DXMatrixScaling(&m_matScale, x, y, z); } void CGraphicObjectInstance::SetScaleNew(const D3DXVECTOR3 & newscale) {     m_vecScaleNew = newscale;     D3DXMatrixScaling(&m_matScale, m_vecScaleNew.x, m_vecScaleNew.y, m_vecScaleNew.z); } void CGraphicObjectInstance::SetScalePosition(float x, float y, float z) {     m_vecScalePos.x = x;     m_vecScalePos.y = y;     m_vecScalePos.z = z; } void CGraphicObjectInstance::SetScalePosition(const D3DXVECTOR3 & newposition) {     m_vecScalePos = newposition; }

tekrar aratın ve aşağıda ki kod bloğunu bulun

Kod:
m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f;     m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f;     m_fYaw = m_fPitch = m_fRoll = 0.0f;     D3DXMatrixIdentity(&m_worldMatrix);     D3DXMatrixIdentity(&m_mRotation);

altına aşağıda ki kodları ekleyin.

Kod:
m_vecScalePos.x = m_vecScalePos.y = m_vecScalePos.z = 0.0f;     m_vecScaleNew.x = m_vecScaleNew.y = m_vecScaleNew.z = 0.0f;     D3DXMatrixIdentity(&m_matAbsoluteTrans);     D3DXMatrixIdentity(&m_matScale);     D3DXMatrixIdentity(&m_matPositon);

Client Sourcenizden EterLib/GrpObjectInstance.h Açın ve aratın.

Kod:
void                    SetRotationQuaternion(const D3DXQUATERNION &q);         void                    SetRotationMatrix(const D3DXMATRIX & m);

altına aşağıda ki kodları ekleyin

Kod:
void                    SetScaleNew(float x, float y, float z);         void                    SetScaleNew(const D3DXVECTOR3 & newscale);         void                    SetScalePosition(float x, float y, float z);         void                    SetScalePosition(const D3DXVECTOR3 & newposition);

tekrar aratın ve kod bloğunu bulun

Kod:
// Bounding Box         D3DXVECTOR4                m_v4TBBox[8];         D3DXVECTOR3                m_v3TBBoxMin, m_v3TBBoxMax;         D3DXVECTOR3                m_v3BBoxMin, m_v3BBoxMax;         // Portal         BYTE                    m_abyPortalID[PORTAL_ID_MAX_NUM];

altına aşağıda ki kodları ekleyin

Kod:
D3DXVECTOR3                m_vecScalePos;         D3DXVECTOR3                m_vecScaleNew;         D3DXMATRIX                m_matAbsoluteTrans;         D3DXMATRIX                m_matScale;         D3DXMATRIX                m_matPositon;

Client Sourcenizder Client/UserInterface/InstanceBase.cpp açın ve aratın

Kod:
SetPKMode(c_rkCreateData.m_byPKMode);     SetMoveSpeed(c_rkCreateData.m_dwMovSpd);     SetAttackSpeed(c_rkCreateData.m_dwAtkSpd);

altına aşağıda ki kodları ekleyin

Kod:
if (m_dwRace == 34030) //kendi pet kodunuzu yazın     {         float scale = c_rkCreateData.m_dwLevel * 0.005f + 0.40f;         m_GraphicThingInstance.SetScaleNew(scale, scale, scale);     }     else if (m_dwRace == 34031) //kendi pet kodunuzu yazın     {         float scale = c_rkCreateData.m_dwLevel * 0.005f + 0.75f;         m_GraphicThingInstance.SetScaleNew(scale, scale, scale);     }        else if (m_dwRace == 34032) //kendi pet kodunuzu yazın     {         float scale = c_rkCreateData.m_dwLevel * 0.005f + 0.50f;         m_GraphicThingInstance.SetScaleNew(scale, scale, scale);     }     else         m_GraphicThingInstance.SetScaleNew(1.0f,1.0f,1.0f);             // NOTE : Dress 를 입고 있으면 Alpha 를 넣지 않는다.     if (!IsWearingDress())     {         // NOTE : 반드시 Affect 셋팅 윗쪽에 있어야 함         m_GraphicThingInstance.SetAlphaValue(0.0f);         m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f);     }

Dipnot eğer yukarda ki kodda hata alırsanız şu kodu deneyin.
Kod:
if(m_dwRace == 34031 ||m_dwRace == 34032 || m_dwRace == 34049 ||m_dwRace == 34053){         float scale = c_rkCreateData.m_dwLevel * 0.005f + 0.75f;         m_GraphicThingInstance.SetScaleNew(5, 5, 5);     }     else         m_GraphicThingInstance.SetScaleNew(1.0f,1.0f,1.0f);
[/CENTER]
Ve bu kadar.

Kanıt:
aGDZq5.png


Teşekkür ederim :rockon:. Sağlıcakla kalın 🍵. Görüşmek dileğiyle :target:.
Metin2 Lobby
Metin2 özel sunucularında oyun deneyimini geliştirmek ve oyuncuların daha dengeli bir savaş ortamı yaşamasını sağlamak için birçok geliştirme yapılır. Bu sistemlerden biri de MobScale olarak bilinen ejderleri küçültme mekaniğidir. Bu sistem özellikle Saltanat tipi sunucularda büyük avantaj sağlar çünkü oyun içi kitle combatları sırasında devasa boyutlardaki ejderler hem görsel açıdan sorun yaratır hem de PvP esnasında performans düşüklüğüne neden olabilir. Bu yazıda C++ Client üzerinden MobScale sisteminin nasıl uygulanacağını ve hangi dosya düzenlemelerinin gerektiğini detaylıca inceleyeceğiz.

MobScale Nedir?
MobScale, Metin2 özel sunucularında kullanılan bir teknik sistemdir. Amacı ejder gibi büyük boyutlu canavarların oyun içindeki boyutlarını ayarlayarak daha küçük ve daha dengeli savaşlar yapılmasını sağlamaktır. Bu sayede hem oyun performansı artar hem de PvP ortamlarında dengesizlikler önlenir.

Neden MobScale Kullanılır?
Metin2 oyununda bazı ejder türleri oyun içi grafiksel olarak oldukça büyüktür. Özellikle Great Dragon, Blue Dragon veya Black Dragon gibi boss mobları, sahada fazla yer kaplayarak PvP esnasında görsel karmaşıklığa yol açabilir. Ayrıca bu büyük boyutlar nedeniyle sunucu tarafında rendering yükü artar. MobScale sistemi bu tür durumları minimize ederek daha stabil bir oyun ortamı sağlar.

C++ Client Tarafında Uygulama Adımları
MobScale sistemini C++ tabanlı bir client üzerinde uygulamak için öncelikle client-side dosyalarda bazı değişiklikler yapmanız gerekir. Genellikle bu işlem gr2 model dosyaları üzerinde boyut ayarı yapılarak gerçekleştirilir. Ancak daha gelişmiş bir uygulama için source code üzerinden dinamik olarak boyut ayarlamak da mümkündür.

1. Entity Sınıfında Boyut Ayarı
Client source kodunda bulunan entity sınıfında SetScale fonksiyonuna benzer bir yöntem ile belirli ID aralıklarındaki ejderlerin boyutları ayarlanabilir. Örneğin:

Kod:
if (dwVnum >= DRAGON_MIN_VNUM && dwVnum <= DRAGON_MAX_VNUM)[BR][/BR]{[BR][/BR]    SetScale(0.7f); // Ejderlerin boyutunu %70'e düşür[BR][/BR]}


2. Client Config Dosyası
Bu tür ayarları daha esnek hale getirmek için config dosyasından da yönetilebilir. Örneğin userinterface/uisystem.py veya game.ini gibi dosyalara özel bir ayar eklenebilir:

Kod:
MOB_SCALE_ENABLED = TRUE[BR][/BR]DRAGON_SCALE_FACTOR = 0.7


Dikkat Edilmesi Gerekenler
- Bu tür değişiklikler sunucu-client senkronizasyonuna zarar verebilir. Oyuncular arasında farklı boyutlarda görünüyorsa hata vardır.
- Client-side değişiklikler sadece oynayan kişi tarafından görülür. Sunucu tarafında da desteklenmelidir.
- Bazı client modelleri gr2 formatında olmayabilir; bu durumda farklı çözümler geliştirilmelidir.

Sonuç
MobScale sistemi, Saltanat tipi Metin2 sunucularında oyun deneyimini ciddi anlamda iyileştirebilir. Görsel temizlik, performans artışı ve PvP dengesi açısından oldukça faydalıdır. Ancak doğru uygulanmadığında sunucu-client uyumsuzluklarına neden olabilir. Bu nedenle dikkatli ve test edilmiş sistemlerle entegre edilmelidir.

Metin2 Lobby olarak bizler, bu tarz gelişmiş sistemlerin nasıl çalıştığını ve uygulanacağını paylaşmaya devam ediyoruz.


Metin2 Lobby
In order to enhance the gaming experience on Metin2 private servers and provide players with a more balanced combat environment, many developments are made. One of these systems is the MobScale mechanism, which is known for reducing the size of dragons. This system offers significant advantages especially on Sultan-type servers, because the massive-sized dragons in-game can cause visual problems during mass combat and may also lead to performance drops during PvP. In this article, we will examine in detail how to implement the MobScale system via C++ Client and what file modifications are required.

What is MobScale?
MobScale is a technical system used on Metin2 private servers. Its purpose is to adjust the in-game sizes of large monsters such as dragons to create smaller and more balanced fights. This increases both game performance and prevents imbalances during PvP scenarios.

Why Use MobScale?
In Metin2, some dragon types are graphically very large in-game. Especially boss mobs like Great Dragon, Blue Dragon, or Black Dragon can cause visual clutter during PvP by occupying too much space on screen. Additionally, their large sizes increase rendering load on the server side. The MobScale system minimizes such issues and provides a more stable gaming environment.

Implementation Steps on C++ Client Side
To apply the MobScale system on a C++ based client, you first need to make certain changes in client-side files. Usually, this is done by adjusting the scale in the gr2 model files. However, a more advanced implementation allows dynamic scaling through source code.

1. Scale Setting in Entity Class
In the client source code, within the entity class, you can set the scale for specific mob IDs. For example:

Kod:
if (dwVnum >= DRAGON_MIN_VNUM && dwVnum <= DRAGON_MAX_VNUM)[BR][/BR]{[BR][/BR]    SetScale(0.7f); // Reduce dragon size to 70%[BR][/BR]}


2. Client Config File
To make such adjustments more flexible, you can manage them via a config file. For instance, special settings can be added to files like userinterface/uisystem.py or game.ini:

Kod:
MOB_SCALE_ENABLED = TRUE[BR][/BR]DRAGON_SCALE_FACTOR = 0.7


Important Considerations
- Such changes may cause desynchronization between server and client. If players see different sizes, there is an error.
- Client-side changes are only visible to the player. The server must also support the changes.
- Some client models may not be in gr2 format; in that case, alternative solutions must be developed.

Conclusion
The MobScale system can significantly improve the gameplay experience on Sultan-type Metin2 servers. It offers benefits in terms of visual clarity, performance improvement, and PvP balance. However, if implemented incorrectly, it may cause server-client compatibility issues. Therefore, it should be integrated carefully and with tested systems.

Metin2 Lobby, as always, continues to share how such advanced systems work and how they are implemented.​
 

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

Benzer konular

Geri
Üst Alt