Âşık der inci tenden,
İncinme incitenden,
Kemâlde noksân imiş,
İncinen incitenden...
Lûtfî (Alvarlı Efe)
entity_view.cpp
Bu kod bloğu, sunucu performansını optimize etmek amacıyla oyundaki nesnelerin (oyuncu, canavar, NPC, yerdeki eşya) birbirini görüş listesine (ViewInsert) alma kurallarını filtreler. Canavarların ve nesnelerin birbirini gereksiz yere takip etmesini engelleyerek CPU ve ağ paket yükünü düşürür.
- Oyuncu Karakterleri (chMe->IsPC()): Görüş alanındaki tüm varlıkları (canavar, NPC, item, diğer oyuncular) kısıtlamasız olarak görüş listesine ekler. Oyuncunun ekranındaki görsellikte hiçbir eksilme olmaz.
- Canavarlar ve NPC'ler (chMe->IsNPC()): Canavarların birbirini görüşe eklemesi engellenmiştir. Bir canavar veya NPC sadece şu 4 durumda hedefi görüşüne alır:
- Oyuncular: Hedef bir oyuncu (IsPC()) ise (saldırmak veya takip etmek için).
- Şifacı Yaratıklar: Yaratık şifacı mantığına (AIFLAG_HEALER) sahipse ve hedef kendi grubundaysa (can basabilmek için).
- Gemi Savunması (Hidra): Hedef Hidra direği (20434) ise (direğe saldırmak için).
- Köy Korumaları: Gardiyan NPC'leri (IsGuardNPC()) etraftaki canavarları görür (şehre giren moblara vurmak için).
- Karakter Dışı Varlıklar (!m_me->IsType(ENTITY_CHARACTER)): Yerdeki eşyalar veya harita objeleri sadece etraftaki oyuncuları (IsPC()) görüş listesine kaydeder. Canavarlar yerdeki eşyaların matrisine hiç dahil edilmez.
- Makro Kapalıyken (#else): Klasik Metin2 mantığı çalışır; kapsama alanındaki tüm varlıklar istisnasız birbirini görüş alanına ekler.
#define ENABLE_REDUCED_ENTITY_VIEW
Kod:
#ifdef ENABLE_REDUCED_ENTITY_VIEW
if (m_me->IsType(ENTITY_CHARACTER))
{
const auto chMe = (LPCHARACTER) m_me;
// players view every entity
if (chMe->IsPC())
m_me->ViewInsert(ent);
// npcs view only a restricted amount of entities
else if (chMe->IsNPC() && ent->IsType(ENTITY_CHARACTER))
{
constexpr auto DefenseWaveMast = 20434;
const auto chEnt = (LPCHARACTER) ent;
// mobs view every player
if (chEnt->IsPC())
m_me->ViewInsert(ent);
// aiflag healers view their party
else if (IS_SET(chMe->GetAIFlag(), AIFLAG_HEALER) && chMe->GetParty() && chMe->GetParty() == chEnt->GetParty())
m_me->ViewInsert(ent);
// hydra mast is seen by other mobs
else if (chEnt->GetRaceNum() == DefenseWaveMast)
m_me->ViewInsert(ent);
// city guardians see all mobs
else if (chMe->IsGuardNPC())
m_me->ViewInsert(ent);
}
}
else if (ent->IsType(ENTITY_CHARACTER))
{
const auto chEnt = (LPCHARACTER) ent;
// other entities see every player
if (chEnt->IsPC())
m_me->ViewInsert(ent);
}
#else
m_me->ViewInsert(ent);
#endif
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 9
- Görüntüleme
- 647
- Cevaplar
- 20
- Görüntüleme
- 920
- Cevaplar
- 7
- Görüntüleme
- 543
- Cevaplar
- 15
- Görüntüleme
- 876
