Witam,
Zrobiłem czar, który tymczasowo zwiększa pancerz, inspirując się instrukcjami
@Toworish a z tego wątku:
https://themodders.org/index.php?topic=26931.0 Nie próbowałem jeszcze sposobu, który proponował
@Siemekk , ale mam następujący problem, który związany jest z wczytywaniem zapisanego stanu gry. Jeśli efekt czasowy przeminie normalnie, to wszystko jest ok. Jednak problem pojawia w dwóch przypadkach:
1) rzucam czar, wtedy zapisuję grę i ją wczytuje
2) zapisuję grę, rzucam czar, wczytuje zapis sprzed rzucenia czaru (podczas gdy czar jeszcze trwa)
Problem jest taki, że efekt zostaje na stałe w pierwszym przypadku (bo po wczytaniu gry funkcja timera przestaje działać i nie odejmuje mi dodanego wcześniej pancerza), a w drugim przypadku, po ponownym rzuceniu czaru nie ma efektu zwiększenia pancerza, jest natomiast efekt odjęcia punktów, gdy czar przestaje działać (więc de facto permanentnie postać dostaje minus do pancerza).
Oto skrypt funkcji timera
Spoiler
const int SPL_Cost_ImproveArmour = 1; // Koszt czaru - mana
const int SPL_Improve_ImproveArmour = 10; // Sila czaru - o ile zwieksza armour
const int SPL_Duration_ImproveArmour = 15; // Czas trwania czaru
const int SPL_Time_ImproveArmour = 0; // To tylko potrzebne do funkcji timera
const int SPL_Stop_ImproveArmour = 0; // Tez potrzebne do timera
// ****************
// Improve Spells Functions
// ****************
func void TimerImproveArmour() //Funkcja timera
{
SPL_Time_ImproveArmour = SPL_Time_ImproveArmour + 1; // Czyli co sekunde licznik timera bedzie dodawal sekunde
print(IntToString(SPL_Time_ImproveArmour)); // To tylko taki print - testowe, zeby sprawdzac czy kod dziala i jak liczy
if(SPL_Stop_ImproveArmour == 0) // Czyli tylko jesli parametr Stop_ r˘wna sie 0 (wyjasnienie nizej), wywola to zwiekszenie pancerza
&&(SPL_Time_ImproveArmour == 1)
{
print("Teraz sie powinno zw o 5"); // Testowe
B_RaiseProtection (hero, PROT_BLUNT, 5);
B_RaiseProtection (hero, PROT_POINT, 5);
}
if(SPL_Time_ImproveArmour == 2) // W pierwszej sekundzie...
{
SPL_Stop_ImproveArmour = 1; // ...ustawia parametr Stop_ na 1 (dzieki temu nie doda nam to pancerza co sekunde, lecz tylko raz - po to powyzej jest ze tylko gdy Stop_ = 0
print("Stop_ImproveArmour = 1"); // Testowe
};
if(SPL_Time_ImproveArmour == SPL_Duration_ImproveArmour) // Jesli uplynie 10 sec, tzn czas zdefiniowany na poczatku jako czas trwania zaklecia
{
print("Prot - 5"); // Testowe, chociaz mozna tez zostawic jako informacje, gdy sie skonczy czar
B_RaiseProtectionBack (hero, PROT_BLUNT, 5); // Pancerz sie zmniejsza do poczatkowego...
B_RaiseProtectionBack (hero, PROT_POINT, 5);
SPL_Stop_ImproveArmour = 0; // ...resetuje sie parametr Stop_ na 0...
};
};
func void TimerImproveArmourApply() //funkcja wywolujaca timer
{
FF_ApplyOnceExt (TimerImproveArmour, 1000, -1); // wywoluje timer, co 1 sek, na stałe
};
i mojego czaru:
Spoiler
if ( Npc_GetActiveSpell(self) == SPL_ImproveArmour )
{
if (Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_ImproveArmour;
};
SPL_Time_ImproveArmour = 0; // ...resetuje sie parametr Time_ na 0...
TimerImproveArmourApply(); // Czyli czar wywoluje funkcje, kt˘ra wywoluje timer :D
return;
};
Pytanie jak to zrobić, żeby po zapisie i wczytaniu gry wszystko działało normalnie? Nie wiem czy jest jakaś funkcja, która uruchamia się bezpośrednio po zapisaniu gry, jeśli jest, to myślę, że to by rozwiązało problem. Jeśli nie, to nie mam innego pomysłu
