nikde jsem nevidel, spis to nikdo neumi udelat si vlastni spell :-P tak ja sem hodim takovy mensi navod
Otevreme si soubor SpellMgr.cpp (src\server\game\Spells\SpellMgr.cpp) a najdem si funkci SpellMgr::LoadCustomSpells(), ktera umi nacitat custom spelly pri startu emulatoru.
nejprve to pekne okomentujem, protoze nejsme prasatka co si nekomentuji nic. Pak pridame prvni radek, kde 51206 je ID naseho noveho spellu (u me je to 51206).
INIT_NEW_SPELLENTRY(pSpell, 51206);
pak si dame dalsi radek, ten urcuje nazev Spellu, muj spell se jmenuje PvP disabler (sanctury effect).
pSpell->SpellName = "PvP disabler (sanctuary effect)";
nasleduje radek, ktery urcuje casting time.. 1 pro instant. ID se daji najit v DBC souboru SpellCastTimes.dbc casovani v milisekundach. Duration Index (-1 pro nekonecno) da se najit v SpellDuration.dbc ..zase casovani je v milisekundach. rangeIndex, zase v SpellRange.dbc chce to projit.
pSpell->CastingTimeIndex = 1;
pSpell->DurationIndex = -1;
pSpell->rangeIndex = 1;
a nakonec radek, co prida spell do emu - nemenit!
INSERT_SPELLENTRY(pSpell);
tak, spell jako takovy by jsme meli.. ale neni nikde definovany co ma delat jdem nato
najdeme si funkci SpellMgr::LoadSpellCustomAttr() a zde najedem do switch (i) a nadefinujem si ho:
case 51206: // PvP disabler (sanctuary effect)
spellInfo->EquippedItemClass = -1; // 0
spellInfo->Effect[0] = SPELL_EFFECT_APPLY_AURA; // 1
spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_CASTER; // 2
spellInfo->EffectApplyAuraName[0] = SPELL_AURA_DUMMY; // 3
spellInfo->AttributesEx3 |= SPELL_ATTR3_DEATH_PERSISTENT; // 4
count++;
break;
abych to vysvetlil, udelal jsem si popisku, v cislech takze:
0 - EquippedItemClass = -1; abych se priznal, nevim jak se to pouziva
1 - Effect[0] - kde, nula je cislo effectu, ja davam SPELL_EFFECT_APPLY_AURA aby jsem nahodil auru
2 - EffectImplicitTargetA[0] - kde, nula je zase cislo effectu - TARGET_UNIT_CASTER je target pro castera effectu.
3 - EffectApplyAuraName[0] - kde, nula je zase cislo effectu - SPELL_AURA_DUMMY - tim urcuji, ze spell bude mit effect DUMMY, cili si snim muzu delat co chci.
4 - atributy (flagy) - SPELL_ATTR3_DEATH_PERSISTENT - pokud hrac umre, aura mu zustane i po smrti.
Nuze, spell by byl nadefinovany, effecty taky.. ale nic nebude delat, tak jdem nato.. otevreme si soubor SpellAuraEffects.cpp (src\server\game\Spells\Auras\SpellAuraEffects.cpp) handler AuraEffect::HandleAuraDummy
Definujeme si do if (apply) - znamena, pokud je aura aplikovana.
ja to mam sice ve switchu, ale taky mam jinaci soubor, takze by se definice lisila, takze to nadefinujeme zvlast:
if (m_spellProto->Id == nase_id_spellu)
{
caster->SetPvP(false);
caster->addUnitState(UNIT_STAT_UNATTACKABLE);
caster->AttackStop();
}
a do else musime odebrat zase unit state, aby byl zase attackable :-) je to defakto same jako if (!apply)
if (m_spellProto->Id == nase_id_spellu)
{
caster->SetPvP(true);
caster->clearUnitState(UNIT_STAT_UNATTACKABLE);
}
no co dodat, kod se da vselijak upravit, pointer zde je caster.
omlouvam se, jak je to napsane nemel jsem cas psat topic + venovat se opravam.
repka by potesila :-)