Skocz do zawartości

Jak działa komunikacja pakietów client -> game na przykładzie SendItemUsePacket?

Opublikowano

Witam, przychodzę z pytaniem odnośnie pakietów, po stronie klienta zostanie wysłany pakiet -> SendItemUsePackiet:
 

bool CPythonNetworkStream::SendItemUsePacket(TItemPos pos)
{
    Tracen("Item use packet sent successfully.");
    if (!__CanActMainInstance())
        return true;

    if (__IsEquipItemInSlot(pos))
    {
        if (CPythonExchange::Instance().isTrading())
        {
            PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_EXCHANGE"));
            return true;
        }

        if (CPythonShop::Instance().IsOpen())
        {
            PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_SHOP"));
            return true;
        }

        if (__IsPlayerAttacking())
            return true;
    }

    __PlayInventoryItemUseSound(pos);

    TPacketCGItemUse itemUsePacket;
    itemUsePacket.header = HEADER_CG_ITEM_USE;
    itemUsePacket.pos = pos;

    if (!Send(itemUsePacket))
    {
        Tracen("SendItemUsePacket Error");
        return false;
    }

    return SendSequence();
}


No i powiedzmy że pakiet wysłał się poprawnie, w którym miejscu na serwerze znajduje się kod który odczyta ten pakiet?

Moje kolejne pytania to o mechanikę działania, bo skąd serwer niby ma wiedzieć że to akurat ten gracz to użył, skoro wysyłam tylko idSlota w ekwipunku, znalezienie odpowiedniego kodu po stronie serwera pewnie odpowie na moje pytania. 🙂

Rozwiązane przez Sevence

Przejdź do rozwiązania

Featured Replies

Opublikowano
  • Rozwiązanie

Klient gry wysyła pakiet HEADER_CG_ITEM_USE poprzez funkcję SendItemUsePacket, a na serwerze w item_main.cpp jest obsługiwany odbiór pakietów z klienta gry, dokładnie funkcja ItemUse. 

void CInputMain::ItemUse(LPCHARACTER ch, const char * data)
{
    TPacketCGItemUse * p = (TPacketCGItemUse *)data;
    ch->UseItem(p->pos); 
}

 

Odnośnie identyfikacji gracza to działa tak, że socket jest powiązany z konkretnym DESC, który zawiera informację połączeniu gracza. Gdy pakiet już przychodzi na serwer do ItemUse to deskryptor zawiera już wskaźnik na postać LPCHARACTER ch, więc serwer wie dla którego gracza jest wysyłany pakiet. I wtedy nie potrzebujesz przesyłać w każdej funkcji dane identyfikujące, wystarczy np. w tym przypadku sam pos bo wskaźnik na postać masz już w DESC. 

  • Sevence zmienił(a) tytuł na Jak działa komunikacja pakietów client -> game na przykładzie SendItemUsePacket?
  • Sevence zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.