Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Как сделать шанс прохождения
#1
Подскажите как сделать шанс прохождения в StealBuffs
[src=java]public class StealBuffs implements ISkillHandler

{

private static final L2SkillType[] SKILL_IDS =

{

L2SkillType.STEAL_BUFF

};



/**

*

* @see l2.brick.gameserver.handler.ISkillHandler#useSkill(l2.brick.gameserver.model.actor.L2Character, l2.brick.gameserver.model.L2Skill, l2.brick.gameserver.model.L2Object[])

*/

public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)

{

// discharge shots

final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance();

if (weaponInst != null)

{

if (skill.isMagic())

{

if (weaponInst.getChargedSpiritshot() == L2ItemInstance.CHARGED_BLESSED_SPIRITSHOT)

weaponInst.setChargedSpiritshot(L2ItemInstance.CHARGED_NONE);

else if (weaponInst.getChargedSpiritshot() == L2ItemInstance.CHARGED_SPIRITSHOT)

weaponInst.setChargedSpiritshot(L2ItemInstance.CHARGED_NONE);

}

}

else if (activeChar instanceof L2Summon)

{

final L2Summon activeSummon = (L2Summon) activeChar;



if (skill.isMagic())

{

if (activeSummon.getChargedSpiritShot() == L2ItemInstance.CHARGED_BLESSED_SPIRITSHOT)

activeSummon.setChargedSpiritShot(L2ItemInstance.CHARGED_NONE);

else if (activeSummon.getChargedSpiritShot() == L2ItemInstance.CHARGED_SPIRITSHOT)

activeSummon.setChargedSpiritShot(L2ItemInstance.CHARGED_NONE);

}

}

else if (activeChar instanceof L2Npc)

((L2Npc) activeChar)._spiritshotcharged = false;



L2Character target;

L2Effect effect;



int count = (int)skill.getPower();

for (L2Object obj: targets)

{

if (!(obj instanceof L2Character))

continue;

target = (L2Character)obj;



if (target.isDead())

continue;



if (!(target instanceof L2PcInstance))

continue;



Env env;

int lastSkillId = 0;

final L2Effect[] effects = target.getAllEffects();

final ArrayList<L2Effect> toSteal = new ArrayList<L2Effect>(count);



for (int i = effects.length; --i >= 0Wink // reverse order

{

effect = effects[i];

if (effect == null)

continue;



if (!effect.canBeStolen()) // remove effect if can't be stolen

{

effects[i] = null;

continue;

}



// if eff time is smaller than 5 sec, will not be stolen, just to save CPU,

// avoid synchronization(?) problems and NPEs

if (effect.getAbnormalTime() - effect.getTime() < 5)

{

effects[i] = null;

continue;

}



// first pass - only dances/songs

if (!effect.getSkill().isDance())

continue;



if (effect.getSkill().getId() != lastSkillId)

{

lastSkillId = effect.getSkill().getId();

count--;

}



toSteal.add(effect);

if (count == 0)

break;

}



if (count > 0) // second pass

{

lastSkillId = 0;

for (int i = effects.length; --i >= 0Wink

{

effect = effects[i];

if (effect == null)

continue;



// second pass - all except dances/songs

if (effect.getSkill().isDance())

continue;



if (effect.getSkill().getId() != lastSkillId)

{

lastSkillId = effect.getSkill().getId();

count--;

}



toSteal.add(effect);

if (count == 0)

break;

}

}



if (toSteal.size() == 0)

continue;



// stealing effects

for (L2Effect eff : toSteal)

{

env = new Env();

env.player = target;

env.target = activeChar;

env.skill = eff.getSkill();

try

{

effect = eff.getEffectTemplate().getStolenEffect(env, eff);

if (effect != null)

{

effect.scheduleEffect();

if (effect.getShowIcon() && activeChar instanceof L2PcInstance)

{

SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);

sm.addSkillName(effect);

activeChar.sendPacket(sm);

}

}

// Finishing stolen effect

eff.exit();

}

catch (RuntimeException e)

{

_log.log(Level.WARNING, "Cannot steal effect: " + eff + " Stealer: " + activeChar + " Stolen: " + target, e);

}

}



//Possibility of a lethal strike

Formulas.calcLethalHit(activeChar, target, skill);

}



if (skill.hasSelfEffects())

{

// Applying self-effects

effect = activeChar.getFirstEffect(skill.getId());

if (effect != null && effect.isSelfEffect())

{

//Replace old effect with new one.

effect.exit();

}

skill.getEffectsSelf(activeChar);

}

}



/**

*

* @see l2.brick.gameserver.handler.ISkillHandler#getSkillIds()

*/

public L2SkillType[] getSkillIds()

{

return SKILL_IDS;

}



}[/src]
Ответ
#2
Можно взять пример по StealBuffs из сборок датированных 2009 годом. В них уже была возможность изменения шанса.
Ответ
#3
NotSpecified Написал:Можно взять пример по StealBuffs из сборок датированных 2009 годом. В них уже была возможность изменения шанса.
Спасибо а не подскажешь в какой сборке глянут можна ?
Ответ
#4
Видел записи в заметках того же Астериоса. Более подробно подскажет гугл с ключевыми словами в поиске.
Ответ
#5
NotSpecified Написал:Можно взять пример по StealBuffs из сборок датированных 2009 годом. В них уже была возможность изменения шанса.

NotSpecified Написал:Видел записи в заметках того же Астериоса. Более подробно подскажет гугл с ключевыми словами в поиске.

По гуглил так и ниче не нашел Sad
Ответ
#6
Воспользуйся рандомностью.
Ответ
#7
Бери скилл Canlellation и делай по аналогии. Не забудь только в самом скиле Power выставить не кол-во бафов, а силу стила, а для кол-ва тыримых бафов заюзать maxNegated. Тогда прям точно можно копировать канцел ну и + вставочки свои сделать. Вот код рабочий (ресисты стилу как у канцела я так и не реализовал, времени не хватило).

[src=java]public class StealBuffs implements ISkillHandler
{
private static final L2SkillType[] SKILL_IDS =
{
L2SkillType.STEAL_BUFF
};

@Override
public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
{
final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance();
if (weaponInst != null)
{
if (skill.isMagic())
{
if (weaponInst.getChargedSpiritshot() == L2ItemInstance.CHARGED_BLESSED_SPIRITSHOT)
weaponInst.setChargedSpiritshot(L2ItemInstance.CHARGED_NONE);
else if (weaponInst.getChargedSpiritshot() == L2ItemInstance.CHARGED_SPIRITSHOT)
weaponInst.setChargedSpiritshot(L2ItemInstance.CHARGED_NONE);
}
}
else if (activeChar instanceof L2Summon)
{
final L2Summon activeSummon = (L2Summon) activeChar;

if (skill.isMagic())
{
if (activeSummon.getChargedSpiritShot() == L2ItemInstance.CHARGED_BLESSED_SPIRITSHOT)
activeSummon.setChargedSpiritShot(L2ItemInstance.CHARGED_NONE);
else if (activeSummon.getChargedSpiritShot() == L2ItemInstance.CHARGED_SPIRITSHOT)
activeSummon.setChargedSpiritShot(L2ItemInstance.CHARGED_NONE);
}
}
else if (activeChar instanceof L2Npc)
((L2Npc) activeChar)._spiritshotcharged = false;

L2Character target;
L2Effect effect;
final int stealLvl;

stealLvl = skill.getMagicLevel();
for (L2Object obj: targets)
{
if (!(obj instanceof L2Character))
continue;
target = (L2Character)obj;

if (target.isDead())
continue;

if (!(target instanceof L2PcInstance))
continue;

Env env;
int lastSkillId = 0;
int count = skill.getMaxNegatedEffects();
final double vulnModifier = Formulas.calcSkillTypeVulnerability(0, target, skill.getSkillType());
double res = vulnModifier;
double resMod = 1;
if (res != 0)
{
if (res < 0)
{
resMod = 1 - 0.075 * res;
resMod = 1 / resMod;
}
else
resMod = 1 + 0.02 * res;
}

final L2Effect[] effects = target.getAllEffects();
final ArrayList<L2Effect> toSteal = new ArrayList<L2Effect>(count);

for (int i = effects.length; --i >= 0Wink // reverse order
{
double rate = skill.getPower();
rate += 2 * (stealLvl - effects[i].getSkill().getMagicLevel());
rate *= resMod;

if (rate < 10)
rate = 10;
else if (rate > 75)
rate = 75;

if (Rnd.get(100) < rate)
{
effect = effects[i];
if (effect == null)
continue;

if (!effect.canBeStolen()) // remove effect if can't be stolen
{
effects[i] = null;
continue;
}

// if eff time is smaller than 5 sec, will not be stolen, just to save CPU,
// avoid synchronization(?) problems and NPEs
if (effect.getAbnormalTime() - effect.getTime() < 5)
{
effects[i] = null;
continue;
}

// first pass - only dances/songs
if (!effect.getSkill().isDance())
continue;

if (effect.getSkill().getId() != lastSkillId)
{
lastSkillId = effect.getSkill().getId();
count--;
}

toSteal.add(effect);
if (count == 0)
break;
};
};

if (count > 0) // second pass
{
lastSkillId = 0;
for (int i = effects.length; --i >= 0Wink
{
double rate = skill.getPower();
rate += 2 * (stealLvl - effects[i].getSkill().getMagicLevel());
rate += effects[i].getAbnormalTime() / 5000;

if (rate < 2)
rate = 2;
else if (rate > 10)
rate = 10;

if (Rnd.get(100) < rate)
{
effect = effects[i];
if (effect == null)
continue;

// second pass - all except dances/songs
if (effect.getSkill().isDance())
continue;

if (effect.getSkill().getId() != lastSkillId)
{
lastSkillId = effect.getSkill().getId();
count--;
}

toSteal.add(effect);
if (count == 0)
break;
};
}
}

if (toSteal.size() == 0)
continue;

// stealing effects
for (L2Effect eff : toSteal)
{
env = new Env();
env.player = target;
env.target = activeChar;
env.skill = eff.getSkill();
try
{
effect = eff.getEffectTemplate().getStolenEffect(env, eff);
if (effect != null)
{
effect.scheduleEffect();
if (effect.getShowIcon() && activeChar instanceof L2PcInstance)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
sm.addSkillName(effect);
activeChar.sendPacket(sm);
}
}
// Finishing stolen effect
eff.exit();
}
catch (RuntimeException e)
{
_log.log(Level.WARNING, "Cannot steal effect: " + eff + " Stealer: " + activeChar + " Stolen: " + target, e);
}
}

//Possibility of a lethal strike
Formulas.calcLethalHit(activeChar, target, skill);
}

if (skill.hasSelfEffects())
{
// Applying self-effects
effect = activeChar.getFirstEffect(skill.getId());
if (effect != null && effect.isSelfEffect())
{
//Replace old effect with new one.
effect.exit();
}
skill.getEffectsSelf(activeChar);
}
}

@Override
public L2SkillType[] getSkillIds()
{
return SKILL_IDS;
}

}[/src]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Компиляция без build.xml или как сделать Sky03611 2 3,476 01-18-2016, 05:08 AM
Последний пост: Sky03611
  Прохождения летала gigi1968 3 1,874 10-18-2014, 03:44 AM
Последний пост: KID
  CTF как сделать старт только с 20 по 85 Sensation 6 1,972 02-08-2013, 06:08 PM
Последний пост: Zubastic
  Как сделать апдейт? Time of Gods 2 1,246 12-08-2012, 10:09 PM
Последний пост: Zubastic
  Как сделать запрос в базу? xnekt0x 2 1,543 11-22-2012, 08:03 PM
Последний пост: xnekt0x
  Как сделать чтобы не проходить квсеты на рб Ziky 20 10,160 10-23-2012, 09:45 AM
Последний пост: Zubastic
  Шанс скилы. finfan 3 1,721 10-18-2012, 09:32 PM
Последний пост: finfan
  как сделать скилл нельзя юзать на себя revlon 2 1,316 09-29-2012, 06:06 PM
Последний пост: revlon
  Как сделать атаку после скилла revlon 6 1,690 09-27-2012, 07:49 PM
Последний пост: revlon
  Как сделать сохранение бафов l2j bestworld 3 2,329 09-07-2012, 02:39 PM
Последний пост: gorodetskiy

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)