Skocz do zawartości
Opublikowano

Cześć,

 

Tym razem mam pytanie odnośnie dodawania tych samych stałych bonusów do questów, ogarnąłem sobie dla przykładu poniższy kod dla testów, nie wiem czy to występuje tylko w moich plikach czy tak jest w zamyśle.

Dwa pierwsze logowania w przypadku add_collect się ze sobą zsumują (będę miał +4K HP), później nic się nie dzieje, w przypadku affect.add() występuje to tylko raz, nie dodadzą się do siebie.

 

quest perm_attribute begin
    state start begin
        when login begin
            affect.add(apply.MAX_HP, 2000, 60 * 60 * 24 * 365 * 8) // tą "metodą" można tylko raz dodać stały bonus
            
            // lub
            
            affect.add_collect(apply.MAX_HP, 2000, 60 * 60 * 24 * 365 * 8) // tutaj pozwala nam z tego co zauważyłem na zapis dwóch tych samych stałych bonusów, każda kolejna próba logowania nie skutkuje dodaniem 2000 HP.
        end
    end
end

 

I teraz mam problem, co gdyby np. w moich questach występowała 10 razy nagroda w postaci MAX_HP? Nie można wtedy w 10 miejscach wkleić affect.add() albo add_collect(), bo będzie nadpisywać?

 

Trzeba by ciut edytować src, zrobić jakąś tabelę w bazie danych z zakończonymi zadaniami w których był dany atrybut, i na podstawie niej obliczać finalnie ile tego affect zaaplikować?

 

Myślałem też nad opcją edycji src w taki sposób aby dodawało każdy affect (tym affect.add dla przykładu), później finalnie żeby sobie kumulował wszystkie wpisy i ustawiał je na postaci.

 

Aż tak dobrze się w plikach Metina jeszcze nie odnajduje, czy byłaby szansa zrobić o tym jakiś poradnik? Nie musi być mega obszerny, zresztą nie wiem czy tu jest co opisywać, chodzi mi tylko o opcję gdy tych affectów będzie występować więcej niż jeden/dwa, dla przykładu gdy będą w 10 innych questach - jak wtedy do tego podejść?

Edytowane przez Bartosz

Rozwiązane przez Sevence

Przejdź do rozwiązania

Featured Replies

Opublikowano
  • Rozwiązanie

Cześć Bartosz, 

 

Te funkcje będą nadpisywać bonusy i niestety nie umożliwiają stackowania się.

Stworzyłem dla Ciebie nową funkcję, która dodaje nowy stały bonus jako perm affect. 

 

Lokalizacja pliku: game -> questlua_affect.cpp

 

Pod ostatnią funkcją dodaj nową:

int32_t add_character_affect(lua_State* L) 
{
	auto& questManager = CQuestManager::instance();
	auto* character = questManager.GetCurrentCharacterPtr();

	if (character == nullptr) 
	{
		return 0;
	}

	auto affectType = static_cast<int32_t>(lua_tonumber(L, 1));
	auto applyInfoIndex = static_cast<uint8_t>(lua_tonumber(L, 2));
	auto pointType = aApplyInfo[applyInfoIndex].bPointType;
	auto affectValue = static_cast<int32_t>(lua_tonumber(L, 3));
	auto affectDuration = static_cast<int32_t>(lua_tonumber(L, 4));

	character->AddAffect(affectType, pointType, affectValue, 0, affectDuration, 0, false);
	return 0;
}

 

Do void RegisterAffectFunctionTable() dodaj:

{"add_character_affect", add_character_affect},

 

Dodaj do poland -> quest -> quest_function

affect.add_character_affect

 

Nową funkcję używasz w ten sposób:

affect.add_character_affect(580, 1, 2000, 60*60*24*365*60) -- (580 - unikalny identyfikator affectu), 1 - id bonusu w tym przypadku hp, 2000 wartość, czas)

 

Działenie:

new_func.gif

 

Myślę, że o taki efekt Ci chodziło. 

Opublikowano
  • Autor

Wiesz co, wkleiłem kod do swoich plików, wszystkie się dobrze skompilowało, ale i tak coś chyba nie gra.

 

Mógłbyś zobaczyć jak zachowa się ten kod u Ciebie?

 

quest perm_attribute begin
    state start begin
        when login begin
            timer("spell", 1)
        end

        when spell.timer begin
            affect.add_character_affect(508, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
            affect.add_character_affect(509, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
            affect.add_character_affect(510, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
        end
    end
end

 

Dalej mi tworzy tylko jeden affect, przed chwilą nawet usunąłem 510 i 508 z questa, mając już 510 w bazie zostawiłem samo 509 w quescie (mówię może mi go dopisze tam, bo nie mogę mieć np. 3 linijek jedna pod drugą bo nie ma czasu na wykonanie się), nic się nie stało. To znaczy odpaliłem sobie od razu na szybko C bo quest i tak się wykonuje dopiero po sekundzie, wskoczyło na 12K hp, po czym wróciło na 10 (czyli ten affect 510 działa, ale 509 który zostawiłem się nie dodaje permamentnie, coś go tam blokuje, na chwile wskoczy na 12K hp a później znów powrót do 10). Ciekawy przypadek, ale i tak dziękuję za pomoc 🤔

Edytowane przez Bartosz

Opublikowano

Nie dodawaj ich w tym samym momencie. 

 

quest test begin
    state start begin
        when login begin
            timer("spell", 1)
		  timer("spell1", 3)
		  timer("spell2", 5)
        end

        when spell.timer begin
            affect.add_character_affect(510, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
        end
	    when spell1.timer begin
			affect.add_character_affect(511, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
		end
	    when spell2.timer begin
			affect.add_character_affect(512, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
		end		
    end
end

 

Opublikowano
  • Autor
7 minut temu, Sevence napisał(a):

Nie dodawaj ich w tym samym momencie. 

 

quest test begin
    state start begin
        when login begin
            timer("spell", 1)
		  timer("spell1", 3)
		  timer("spell2", 5)
        end

        when spell.timer begin
            affect.add_character_affect(510, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
        end
	    when spell1.timer begin
			affect.add_character_affect(511, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
		end
	    when spell2.timer begin
			affect.add_character_affect(512, apply.MAX_HP, 2000, 60 * 60 * 24 * 365)
		end		
    end
end

 

Faktycznie śmiga, dzięki wielkie! 🍻

Podrzucisz jeszcze na szybko jak dodać nowy affect? Bo przykładowo u mnie w questlib.lua brakuje załóżmy średnich obrażeń, a to też by było spoko mieć, albo jakikolwiek inny. Chyba, że warto ogarnąć w tym temacie jakiś poradnik to poczekam. 😉

Opublikowano

Możesz po prostu po identyfikatorze dodawać. 

 

Np. dla średnich obrażeń:

affect.add_character_affect(512, 72, 10, 60 * 60 * 24 * 365)

 

A jeśli brakuje ci w questlib.lua i chcesz dodawać po nazwach to wystarczy je tam dodać. 

Listę wszystkich atrybutów masz w constants.cpp -> c_aApplyTypeNames

 

Opublikowano
  • Autor
22 minuty temu, Sevence napisał(a):

Możesz po prostu po identyfikatorze dodawać. 

 

Np. dla średnich obrażeń:

affect.add_character_affect(512, 72, 10, 60 * 60 * 24 * 365)

 

A jeśli brakuje ci w questlib.lua i chcesz dodawać po nazwach to wystarczy je tam dodać. 

Listę wszystkich atrybutów masz w constants.cpp -> c_aApplyTypeNames

 

Właśnie to ogarnąłem przed chwilą, szukałem gdzie dokładnie na serwerze jest lista z identyfikatorami, tak czy siak dzięki za pomoc! 🍻

Warto by było zrobić na to jakiś prosty tutorial? Mógłbym coś machnąć.

Opublikowano

Śmiało, zawsze komuś się może przydać. 🙂

  • Sevence zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.