Nowy czar nie działa 3726 4

O temacie

Autor pagi111

Zaczęty 12.10.2018 roku

Wyświetleń 3726

Odpowiedzi 4

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Witam,

Chciałem sobie stworzyć czar z zupełnie nowym efektem, tzn czasowym zwiększeniem pancerza. Powiem więcej, udało mi się :D Czar zrobiłem na podstawie czaru leczenia, z wykorzystaniem LeGo, ale to w zasadzie bez znaczenia. Chodzi o to, że o ile mi wiadomo, normalnie nowy czar robi się tworząc nowy plik Spell_MojCzar.d w folderze Spells (oczywiście pomijam tu inne kwestie typu stworzenie runy, dodanie czaru do pliku Text.d , Spell_ProcessMana.d, itp.) W moim przypadku jednak czar wtedy w ogóle nie działa, tzn nie mam żadnego błędu podczas włączania gry, ale w grze, gdy przywołam runę i użyję czaru, to odgrywa się animacja, jednak czar nie zabiera mi many i nie ma żadnego efektu.

Problem obszedłem w ten sposób, że zamiast tworzyć nowy plik z czarem, dodałem czar do pliku Spell_Heal_Alle.d. Tam wygląda to w ten sposób, że jest jakby jedna instancja czaru leczenia dla wszystkich zaklęć, a pod nią są funkcje dla poszczególnych czarów leczenia, np lekkiego, średniego, itd. Gdy dodam mój czar (który ma de facto inne działanie - czasowo zwiększa odporność na obrażenia) jako funkcję tego głównego czaru leczenia, wtedy wszystko działa. Jednak gdy tworzę go jako oddzielny czar, czy to w nowym pliku, czy nawet w Spell_Heal_Alle, to wtedy jest tak, jak mówiłem - nie ma efektu w grze.

Tak wygląda skrypt mojego czaru w pliku Spell_Heal_Alle. Mój czar jest w ostatnim "ifie".
Spoiler
func void Spell_Cast_Heal()
{
if ( Npc_GetActiveSpell(self) == SPL_LightHeal )
{
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_LightHeal;
};
Npc_ChangeAttribute (self,ATR_HITPOINTS, +SPL_Heal_LightHeal);
return;
};

if ( Npc_GetActiveSpell(self) == SPL_MediumHeal )
{
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_MediumHeal;
};
Npc_ChangeAttribute (self,ATR_HITPOINTS, +SPL_Heal_MediumHeal);
return;
};

if ( Npc_GetActiveSpell(self) == SPL_FullHeal )
{
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_FullHeal;
};
Npc_ChangeAttribute (self,ATR_HITPOINTS, + SPL_Heal_FullHeal);
return;
};

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;
};
B_RaiseProtection (self, PROT_BLUNT, SPL_Improve_ImproveArmour);
MyTimerApply();
return;
};

self.aivar[AIV_SelectSpell] += 1;
};

Tutaj z kolei jest mój czar jako nowy plik, czyli to co nie działa (oczywiście gdy próbuje używać tego pliku, to Spell_Heal_Alle przywracam do oryginalnej wersji):
Spoiler
// ****************
// Alle Improve Spells
// ****************

const int SPL_Cost_ImproveArmour = 5;
const int SPL_Improve_ImproveArmour = 8;
const int time = 0;
const int stop = 0;


INSTANCE Spell_ImproveArmour (C_Spell_Proto)
{
time_per_mana = 0;
spelltype = SPELL_NEUTRAL;
targetCollectAlgo = TARGET_COLLECT_CASTER;
canTurnDuringInvest = 0;
};


func void MyTimer()//Funkcja timera
{
  time = time + 1;//stała czasu równa się stała czasu dodać 1 i tak co sekundę
  print(IntToString(time));// to tylko taki print, do niczego nie potrzebny, do testów ale zostawiam go tak w razie "W"
if(time == 5)// tu zaś znaczy że jeśli upłynie 5 sekund
{
print("Powinno być prot + 5");
B_RaiseProtection (hero, PROT_BLUNT, 5);
time = 0;
};
};

func void MyTimerApply()//funkcja dzięki której wywołamy cały ten timer.
{
FF_ApplyOnceExt (MyTimer, 1000, 5);//FF_AppluOnceExt(funkcja którą chcesz wywołać, co ile ma się wywołać w tym przypadku co jedną sekundę, no i ile razy ma się wywołać zawsze daj tyle ile dajesz w if time
};


// ------ SPL_ImproveArmour -------
func int Spell_Logic_ImproveArmour (var int manaInvested)
{
if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
{
return SPL_SENDCAST;
}
else if (self.attribute[ATR_MANA] >= SPL_Cost_ImproveArmour)
{
return SPL_SENDCAST;
}
else //nicht genug Mana
{
return SPL_SENDSTOP;
};
};



func void Spell_Cast_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;
};
B_RaiseProtection (self, PROT_BLUNT, SPL_Improve_ImproveArmour);
MyTimerApply();
return;

self.aivar[AIV_SelectSpell] += 1;
};

Aha, ta funkcja timera jest na razie testowa, nie jest więc dopracowana i nie ma dokładnie takiego efektu, jak mam w planach, ale to nieistotne ;)

Teoretycznie nie jest to jakiś ogromny problem, bo ostatecznie wszystko w grze działa, jednak mam zamiar dodawać inne czary i po prostu będę miał straszny bałagan w plikach, jeśli wszystko będę musiał dodawać do już istniejących, zamiast tworzyć nowe pliki z konkretnymi czarami. Poza tym jestem po prostu bardzo ciekaw, co robię źle :)
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Gra odczytuje instance po nazwie. Heal_Alle jest tylko dla czarów, które zawierają w nazwie "heal". Twój czar nie ma prawa działać w Heal_Alle, bo nie nazywa się *Heal albo *Heal*.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy
Przeczytaj jeszcze raz, co napisałem ;) mój czar DZIAŁA w Heal_Alle. Nie działa, gdy tworzę go w innym, nowym pliku. Zresztą nawet w tym pliku próbowałem go stworzyć z "Heal" w nazwie, np. HealImprove czy coś w tym stylu - nic to nie zmieniło.
 

Krystian2222

Krystian2222

Użytkownicy
posty175
Propsy26
  • Użytkownicy
Spróbuj zrobić sobie osobne visualfxinst dla tego czaru.
 

pagi111

pagi111

Użytkownicy
posty51
Propsy2
Profesjabrak
  • Użytkownicy

pagi111

Nowy czar nie działa
#4 2018-10-15, 10:26(Ostatnia zmiana: 2018-10-15, 12:23)
Super, dzięki, działa ;)

Jednak chwilkę mi zajęło zanim się zorientowałem, co dokładnie muszę zrobić, więc napiszę co i jak zrobiłem, gdyby ktoś miał kiedyś podobny problem.

W \Scripts\System\VisualFX, plik VisualFxInst:

Skopiowałem skrypt czaru HEAL, czyli ten:
Spoiler
///    XXXXXXXXXXXXXXX
///    XX  H E A L  XX
///    XXXXXXXXXXXXXXX

instance spellFX_Heal(CFx_Base_Proto)
{
visname_S = "MFX_Heal_INIT";
emtrjmode_s = "FIXED";
emTrjOriginNode = "ZS_RIGHTHAND";

};

instance spellFX_Heal_KEY_INVEST_1 (C_ParticleFXEmitKey)
{
visname_S = "MFX_HEAL_CAST";
emCreateFXID = "spellFX_Heal_LEFTHAND";
};

instance spellFX_Heal_KEY_CAST (C_ParticleFXEmitKey)
{
// Noki: wieder aktiviert, da er an der Hand bliebt
pfx_ppsisloopingChg = 1;
emCreateFXID = "spellFX_Heal_ORIGIN";
};

instance spellFX_Heal_ORIGIN (CFx_Base_Proto)
{
visname_S = "MFX_Heal_HEAVENLIGHT";
emTrjOriginNode = "BIP01";
visAlpha = 1;
    emtrjmode_s = "FIXED";
    sfxid = "MFX_HEAL_CAST";
    sfxisambient = 1;
};

instance spellFX_Heal_LEFTHAND (CFx_Base_Proto)
{
visname_S = "MFX_HEAL_CAST";
emTrjOriginNode = "ZS_LEFTHAND";
visAlpha = 1;
    emtrjmode_s = "FIXED";
    LightPresetname = "AURA";
};

INSTANCE spellFX_Heal_LEFTHAND_KEY_INIT (C_ParticleFXEmitKey)
{
lightrange = 0.001;
};

INSTANCE spellFX_Heal_LEFTHAND_KEY_CAST (C_ParticleFXEmitKey)
{
lightrange = 150;
};

Wkleiłem go pod spodem i zamieniłem wszystkie spellFX_Heal na spellFX_ImproveArmour, więc wtedy skrypt wyglądał tak:
Spoiler
///    XXXXXXXXXXXXXXXXXXXXXXXXXX
///    XX  I M P R O V E A R M O U R  XX
///    XXXXXXXXXXXXXXXXXXXXXXXXXX

instance spellFX_ImproveArmour(CFx_Base_Proto)
{
visname_S = "MFX_HEAL_INIT";
emtrjmode_s = "FIXED";
emTrjOriginNode = "ZS_RIGHTHAND";

};

instance spellFX_ImproveArmour_KEY_INVEST_1 (C_ParticleFXEmitKey)
{
visname_S = "MFX_HEAL_CAST";
emCreateFXID = "spellFX_ImproveArmour_LEFTHAND";
};

instance spellFX_ImproveArmour_KEY_CAST (C_ParticleFXEmitKey)
{
// Noki: wieder aktiviert, da er an der Hand bliebt
pfx_ppsisloopingChg = 1;
emCreateFXID = "spellFX_ImproveArmour_ORIGIN";
};

instance spellFX_ImproveArmour_ORIGIN (CFx_Base_Proto)
{
visname_S = "MFX_HEAL_HEAVENLIGHT";
emTrjOriginNode = "BIP01";
visAlpha = 1;
    emtrjmode_s = "FIXED";
    sfxid = "MFX_HEAL_CAST";
    sfxisambient = 1;
};

instance spellFX_ImproveArmour_LEFTHAND (CFx_Base_Proto)
{
visname_S = "MFX_HEAL_CAST";
emTrjOriginNode = "ZS_LEFTHAND";
visAlpha = 1;
    emtrjmode_s = "FIXED";
    LightPresetname = "AURA";
};

INSTANCE spellFX_ImproveArmour_LEFTHAND_KEY_INIT (C_ParticleFXEmitKey)
{
lightrange = 0.001;
};

INSTANCE spellFX_ImproveArmour_LEFTHAND_KEY_CAST (C_ParticleFXEmitKey)
{
lightrange = 150;
};

Teraz jeszcze jedna bardzo ważna rzecz, o której nie wiedziałem na początku i przez to nie działało. W \Scripts\Content\_intern, plik Constants:
Pod const string spellFxInstanceNames w wierszu z naszym czarem wpisujemy w cudzysłowie to, co w poprzednim pliku mamy w instancji naszego czaru po spellFX_ , czyli w moim przypadku ImproveArmour. Oto fragment skryptu:
Spoiler
const string spellFxInstanceNames[MAX_SPELL] =
{
// ...
"Light", // 90 SPL_Reserved_90
"Light", // 91 SPL_Reserved_91
"Light", // 92 SPL_Reserved_92
"Light", // 93 SPL_Reserved_93
"Light", // 94 SPL_Reserved_94
"Light", // 95 SPL_Reserved_95
"Light", // 96 SPL_Reserved_96
"Light", // 97 SPL_Reserved_97
"Light", // 98 SPL_Reserved_98
"Light", // 99 SPL_Reserved_99
"ImproveArmour" // 100 SPL_ImproveArmour
};
I to w zasadzie tyle. Wszystko działa, a mój czar wygląda jak czar leczenia.
Można też zrobić w pliku PfxInstMagic własny wygląd czaru. Wtedy trzeba w pliku VisualFxInst wszystkie MFX_HEAL w instancji naszego czaru pozmieniać na takie, jak mamy w PfxInstMagic, czyli w moim przypadku byłoby to MFX_IMPROVEARMOUR_ . Oczywiście, żeby to miało sens trzeba w PfxInstMagic stworzyć jakiś nowy wygląd dla naszego czaru, ale że sam jeszcze nie wiem jak się to dokładnie robi, to w tym nie pomogę :D
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry