Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Event StartUp czyli when podczas odpalania game


Inix

Rekomendowane odpowiedzi

Opublikowano

Event który jest wywoływany przy uruchamianiu game (prościej jest to "when" które zostanie wywołane przy uruchamianiu game). Wykorzystać wywoływania globalnych timerów (np. respenie metinów/bossów).

quest.h

poniżej:

QUEST_ITEM_INFORMER_EVENT,

dodać:

QUEST_STARTUP_EVENT,

questmanager.cpp

poniżej

m_mapEventName.insert(TEventNameMap::value_type("item_informer", QUEST_ITEM_INFORMER_EVENT));

dodać:

m_mapEventName.insert(TEventNameMap::value_type("startup", QUEST_STARTUP_EVENT));

nad:

void CQuestManager::LoadStartQuest(const string& quest_name, unsigned int idx)

dodać:

void CQuestManager::StartUp()
{
    sys_log(0, "STARTUP NPC %p", GetPCForce(0));
    m_pCurrentPC = GetPCForce(0);
    m_pCurrentCharacter = NULL;
    m_pSelectedDungeon = NULL;
    m_mapNPC[QUEST_NO_NPC].OnStartUp(*m_pCurrentPC);
}

questmanager.h

poniżej

void ItemInformer(unsigned int pc, unsigned int vnum);

dodać:

void StartUp();

questnpc.cpp

poniżej

bool NPC::OnItemInformer(PC& pc, unsigned int vnum)
{
    return HandleEvent(pc, QUEST_ITEM_INFORMER_EVENT);
}

dodać:

bool NPC::OnStartUp(PC& pc)
{
    return HandleEvent(pc, QUEST_STARTUP_EVENT);
}

questnpc.h

poniżej:

boolOnItemInformer(PC& pc,unsigned int vnum);

dodać:

boolOnStartUp(PC& pc);

main.cpp

na końcu bloku warunku (nad klamrą zamykająca warunek)


if (!g_bAuthServer)

dodać

quest_manager.StartUp();

Przykład użycia:

quest test begin
    state start begin
        when startup begin
            -- co ma się dziać po uruchomieniu game
        end
    end
end

Mam nadzieję, że ktoś skorzysta.

"Proste, że czuję różnice do reszty i pewnie dlatego ich drażni mój śmiech."

  • 6 miesięcy temu...
Opublikowano

na końcu bloku warunku (nad klamrą zamykająca warunek)

if (!g_bAuthServer)  // sprecyzuj która to linia , bo jest kilka warunków o tej nazwie :) :) [Linia 662(w tej znajduje sie warunek do którego trzeba dodać tą funkcję) [dla wygody lepiej dopisać do tematu :P]

dodać

quest_manager.StartUp();

7plz01.jpg

  • 3 tygodnie później...
Opublikowano

 

na końcu bloku warunku (nad klamrą zamykająca warunek)

if (!g_bAuthServer)  // sprecyzuj która to linia , bo jest kilka warunków o tej nazwie :) :) [Linia 662(w tej znajduje sie warunek do którego trzeba dodać tą funkcję) [dla wygody lepiej dopisać do tematu :P]

dodać

quest_manager.StartUp();

 

 

Właściwie to lepiej to dodać na końcu metody, w pliku questmanager.cpp

bool CQuestManager::Initialize()
    {
        if (g_bAuthServer)
            return true;

        if (!InitializeLua())
            return false;

        m_pSelectedDungeon = NULL;

        m_mapEventName.insert(TEventNameMap::value_type("click", QUEST_CLICK_EVENT));        // NPC를 클릭
        m_mapEventName.insert(TEventNameMap::value_type("kill", QUEST_KILL_EVENT));        // Mob을 사냥
        m_mapEventName.insert(TEventNameMap::value_type("timer", QUEST_TIMER_EVENT));        // 미리 지정해둔 시간이 지남
        m_mapEventName.insert(TEventNameMap::value_type("levelup", QUEST_LEVELUP_EVENT));    // 레벨업을 함
        m_mapEventName.insert(TEventNameMap::value_type("login", QUEST_LOGIN_EVENT));        // 로그인 시
        m_mapEventName.insert(TEventNameMap::value_type("logout", QUEST_LOGOUT_EVENT));        // 로그아웃 시
        m_mapEventName.insert(TEventNameMap::value_type("button", QUEST_BUTTON_EVENT));        // 퀘스트 버튼을 누름
        m_mapEventName.insert(TEventNameMap::value_type("info", QUEST_INFO_EVENT));        // 퀘스트 정보창을 염
        m_mapEventName.insert(TEventNameMap::value_type("chat", QUEST_CHAT_EVENT));        // 특정 키워드로 대화를 함
        m_mapEventName.insert(TEventNameMap::value_type("in", QUEST_ATTR_IN_EVENT));        // 맵의 특정 속성에 들어감
        m_mapEventName.insert(TEventNameMap::value_type("out", QUEST_ATTR_OUT_EVENT));        // 맵의 특정 속성에서 나옴
        m_mapEventName.insert(TEventNameMap::value_type("use", QUEST_ITEM_USE_EVENT));        // 퀘스트 아이템을 사용
        m_mapEventName.insert(TEventNameMap::value_type("server_timer", QUEST_SERVER_TIMER_EVENT));    // 서버 타이머 (아직 테스트 안됐음)
        m_mapEventName.insert(TEventNameMap::value_type("enter", QUEST_ENTER_STATE_EVENT));    // 현재 스테이트가 됨
        m_mapEventName.insert(TEventNameMap::value_type("leave", QUEST_LEAVE_STATE_EVENT));    // 현재 스테이트에서 다른 스테이트로 바뀜
        m_mapEventName.insert(TEventNameMap::value_type("letter", QUEST_LETTER_EVENT));        // 로긴 하거나 스테이트가 바껴 새로 정보를 세팅해줘야함
        m_mapEventName.insert(TEventNameMap::value_type("take", QUEST_ITEM_TAKE_EVENT));    // 아이템을 받음
        m_mapEventName.insert(TEventNameMap::value_type("target", QUEST_TARGET_EVENT));        // 타겟
        m_mapEventName.insert(TEventNameMap::value_type("party_kill", QUEST_PARTY_KILL_EVENT));    // 파티 멤버가 몬스터를 사냥 (리더에게 옴)
        m_mapEventName.insert(TEventNameMap::value_type("unmount", QUEST_UNMOUNT_EVENT));
        m_mapEventName.insert(TEventNameMap::value_type("pick", QUEST_ITEM_PICK_EVENT));    // 떨어져있는 아이템을 습득함.
        m_mapEventName.insert(TEventNameMap::value_type("sig_use", QUEST_SIG_USE_EVENT));        // Special item group에 속한 아이템을 사용함.
        m_mapEventName.insert(TEventNameMap::value_type("item_informer", QUEST_ITEM_INFORMER_EVENT));    // 독일선물기능테스트
                m_mapEventName.insert(TEventNameMap::value_type("startup", QUEST_STARTUP_EVENT));
        m_bNoSend = false;

        m_iCurrentSkin = QUEST_SKIN_NORMAL;

        {
            ifstream inf((g_stQuestDir + "/questnpc.txt").c_str());
            int line = 0;

            if (!inf.is_open())
                sys_err( "QUEST Cannot open 'questnpc.txt'");
            else
                sys_log(0, "QUEST can open 'questnpc.txt' (%s)", g_stQuestDir.c_str() );

            while (1)
            {
                unsigned int vnum;

                inf >> vnum;

                line++;

                if (inf.fail())
                    break;

                string s;
                getline(inf, s);
                unsigned int li = 0, ri = s.size()-1;
                while (li < s.size() && isspace(s[li])) li++;
                while (ri > 0 && isspace(s[ri])) ri--;

                if (ri < li)
                {
                    sys_err("QUEST questnpc.txt:%d:npc name error",line);
                    continue;
                }

                s = s.substr(li, ri-li+1);

                int    n = 0;
                str_to_number(n, s.c_str());
                if (n)
                    continue;

                //cout << '-' << s << '-' << endl;
                if ( test_server )
                    sys_log(0, "QUEST reading script of %s(%d)", s.c_str(), vnum);
                m_mapNPC[vnum].Set(vnum, s);
                m_mapNPCNameID[s] = vnum;
            }

            // notarget quest
            m_mapNPC[0].Set(0, "notarget");
        }

        if (g_iUseLocale)
        {
            SetEventFlag("guild_withdraw_delay", 1);
            SetEventFlag("guild_disband_delay", 1);
        }
        else
        {
            SetEventFlag("guild_withdraw_delay", 3);
            SetEventFlag("guild_disband_delay", 7);
        }
                
        StartUp();
                
        return true;
    }

"Proste, że czuję różnice do reszty i pewnie dlatego ich drażni mój śmiech."

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...