Cześć👋
Podczas walki z potworami, czasami mogą nad nimi pojawiać się nazwy sklepów. Zdarza się to głównie na serwerach z dużą ilością graczy. Nawet jeśli gracz nie założył własnego sklepu nad postacią mogą pojawiać się nazwy sklepów innych graczy. Ten błąd również istniał na oficjalnych serwerach dawno temu. Rozwiązanie błędu dotyczy tylko zwykłych sklepów wystawianych przez graczy. Możesz na podstawie tego rozwiązania wdrożyć poprawkę również w sklepach offline. Jeśli dokonasz poniższych zmian w swoim kodzie, rozwiążesz ten problem. Uwaga bez odpowiednich modyfikacji w sklepach offline mogą występować problemy z nazwami sklepów!
Wyjaśnienie problemu:
Funkcja 'GetMyShop' zwraca pointer na sklep przypisany do postaci. W przypadku błędnej obsługi, gdy zwrócony pointer jest null i gdy w okolicy pojawia się wiele potworów, trudno jest określić, która postać do czego się odnosi. Funkcja 'EncodeInsertPacket' jest nieco problematyczna i powoduje opóźnienia rzędu 1 - 2 sekundy w obszarach z dużą ilością potworów. Kolejnym problemem jest wyświetlanie nazw sklepów nad postaciami, które tak naprawdę nie mają własnego sklepu.
🧩 Rozwiązanie:
📁 Lokalizacja pliku: 'game -> char.cpp'
🔍 Szukaj:
void CHARACTER::EncodeInsertPacket(LPENTITY entity)
if (GetMyShop())
{
TPacketGCShopSign p;
p.bHeader = HEADER_GC_SHOP_SIGN;
p.dwVID = GetVID();
strlcpy(p.szSign, m_stShopSign.c_str(), sizeof(p.szSign));
d->Packet(&p, sizeof(TPacketGCShopSign));
}
♻️ Zamień:
if (IsPC() && GetMyShop())
{
TPacketGCShopSign p;
p.bHeader = HEADER_GC_SHOP_SIGN;
p.dwVID = GetVID();
strncpy(p.szSign, m_stShopSign.c_str(), sizeof(p.szSign) - 1);
p.szSign[sizeof(p.szSign) - 1] = '\0';
d->Packet(&p, sizeof(TPacketGCShopSign));
}
🔍 Szukaj:
void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount)
char szSign[SHOP_SIGN_MAX_LEN+1];
strlcpy(szSign, c_pszSign, sizeof(szSign));
m_stShopSign = szSign;
if (m_stShopSign.length() == 0)
return;
if (LC_IsCanada() == false)
{
if (CBanwordManager::instance().CheckString(m_stShopSign.c_str(), m_stShopSign.length()))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("비속어나 은어가 포함된 상점 이름으로 상점을 열 수 없습니다."));
return;
}
}
♻️ Zamień:
char szSign[SHOP_SIGN_MAX_LEN+1];
strlcpy(szSign, c_pszSign, sizeof(szSign));
//m_stShopSign = szSign; - opóźniamy przepisanie szSign do m_stShopSign do momentu wysłania pakietu.
if (strlen(szSign) == 0)
{
return;
}
if (LC_IsCanada() == false)
{
if (CBanwordManager::instance().CheckString(szSign, strlen(szSign)))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("비속어나 은어가 포함된 상점 이름으로 상점을 열 수 없습니다."));
return;
}
}
🔍 Szukamy nadal w funkcji 'OpenMyShop':
TPacketGCShopSign p;
p.bHeader = HEADER_GC_SHOP_SIGN;
p.dwVID = GetVID();
strlcpy(p.szSign, c_pszSign, sizeof(p.szSign));
PacketAround(&p, sizeof(TPacketGCShopSign));
♻️ Zamień:
m_stShopSign = szSign;
TPacketGCShopSign packet{};
packet.bHeader = HEADER_GC_SHOP_SIGN;
packet.dwVID = GetVID();
strncpy(packet.szSign, szSign, sizeof(packet.szSign) - 1);
packet.szSign[sizeof(packet.szSign) - 1] = '\0';
PacketAround(&packet, sizeof(TPacketGCShopSign));