Назад

Помогите с анфиксом диспела и абсорба

Автор: Dimm: Дата: 01.08.2010

Собсно, помогите написать анфикс диспела и абсорба, покачто додумался вот до этого
в skil.c:

case MO_EXTREMITYFIST:
// if(sc && sc->data[SC_EXTREMITYFIST]) //To disable Asura during the 5 min skill block uncomment this...
// return 0;
if( sc && sc->data[SC_BLADESTOP] )
break;
if( sc && sc->data[SC_COMBO] )
{
switch(sc->data[SC_COMBO]->val1) {
case MO_COMBOFINISH:
case CH_TIGERFIST:
case CH_CHAINCRUSH:
break;
default:
return 0;
}
}
else if( !unit_can_move(&sd->bl) )
{ //Placed here as ST_MOVE_ENABLE should not apply if rooted or on a combo. [Skotlex]
clif_skill_fail(sd,skill,0,0);
return 0;
}

else if((sc && sc->data[SC_EXPLOSIONSPIRITS])||(req.spiritball==0)) //если нет крит режима или колво сферок = 0
{
clif_skill_fail(sd,skill,0,0);
return 0;
break;
}
break;

И в начале блока ещё добавляем

struct status_data *status;
struct status_change *sc;
struct skill_condition require;
int i;
struct skill_condition req; //определение переменной ???, как я понял тут хранится колво вызваных сфер
nullpo_retr(0, sd);

req = skill_get_requirement(sd,skill,lv);

Автор: Хитрюга Джэк: Дата: 01.08.2010

case MO_EXTREMITYFIST:
// if(sc && sc->data[SC_EXTREMITYFIST]) //To disable Asura during the 5 min skill block uncomment this...
// return 0;
if(sc && sc->data[SC_BLADESTOP])
spiritball--;
else if (sc && sc->data[SC_COMBO]) {
switch(sc->data[SC_COMBO]->val1) {
case MO_COMBOFINISH:
spiritball = 4;
break;
case CH_TIGERFIST:
spiritball = 3;
break;
case CH_CHAINCRUSH: //It should consume whatever is left as long as it's at least 1.
spiritball = sd->spiritball?sd->spiritball:1;
break;
default:
return 0;
}
} else if(!type && !unit_can_move(&sd->bl)) //Check only on begin casting.
{ //Placed here as ST_MOVE_ENABLE should not apply if rooted or on a combo. [Skotlex]
clif_skill_fail(sd,skill,0,0);
return 0;
}
break;

Автор: Dimm: Дата: 01.09.2010

всё исправил собственными силами)
добавил флаг в начале файла
int noasura = 0;

в абсорбе добавил
case MO_ABSORBSPIRITS:
i = 0;

if (dstsd && dstsd->spiritball && (sd == dstsd || map_flag_vs(src->m)) && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER)
{ // split the if for readability, and included gunslingers in the check so that their coins cannot be removed [Reddozen]
struct unit_data *ud = unit_bl2ud(bl); // new
if (ud->skillid == MO_EXTREMITYFIST) // new
noasura = 1; // new
i = dstsd->spiritball * 7;
pc_delspiritball(dstsd,dstsd->spiritball,0);
} else if (dstmd && !(tstatus->mode&MD_BOSS) && rand() % 100 < 20)
{ // check if target is a monster and not a Boss, for the 20% chance to absorb 2 SP per monster's level [Reddozen]
i = 2 * dstmd->level;
mob_target(dstmd,src,0);
}

if (i) status_heal(src, 0, i, 3);
clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0);
break;

в диспел аналогично абсорбу
и в функцию skill_check_condition_castend
switch( skill )
{ ....

case MO_EXTREMITYFIST:
{if(noasura == 1)
{
clif_skill_fail(sd,skill,0,0);
noasura = 0;
return 0;
break;
}
break;
}
}