Как сделать шанс прохождения - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Работа со скриптами

Работа со скриптами Помощь в редактировании и написании квестов к Java серверам, а так же эвентов.

Ответ
Опции темы
Непрочитано 22.12.2011, 14:54   #1
Изгнанные

Автор темы (Топик Стартер) Как сделать шанс прохождения

Подскажите как сделать шанс прохождения в StealBuffs
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 >= 0;) // 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 >= 0;)
 
				{
 
					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;
 
	}
 
 
 
}
Code: Java

Последний раз редактировалось Casper; 11.01.2012 в 20:51.
Литион вне форума Ответить с цитированием
Непрочитано 22.12.2011, 17:03   #2
Аватар для NotSpecified
Олдфаг

По умолчанию Re: Как сделать шанс прохождения

Можно взять пример по StealBuffs из сборок датированных 2009 годом. В них уже была возможность изменения шанса.
NotSpecified вне форума Ответить с цитированием
Непрочитано 22.12.2011, 17:54   #3
Изгнанные

Автор темы (Топик Стартер) Re: Как сделать шанс прохождения

Цитата:
Сообщение от NotSpecified Посмотреть сообщение
Можно взять пример по StealBuffs из сборок датированных 2009 годом. В них уже была возможность изменения шанса.
Спасибо а не подскажешь в какой сборке глянут можна ?
Литион вне форума Ответить с цитированием
Непрочитано 22.12.2011, 17:59   #4
Аватар для NotSpecified
Олдфаг

По умолчанию Re: Как сделать шанс прохождения

Видел записи в заметках того же Астериоса. Более подробно подскажет гугл с ключевыми словами в поиске.
NotSpecified вне форума Ответить с цитированием
Непрочитано 22.12.2011, 19:17   #5
Изгнанные

Автор темы (Топик Стартер) Re: Как сделать шанс прохождения

Цитата:
Сообщение от NotSpecified Посмотреть сообщение
Можно взять пример по StealBuffs из сборок датированных 2009 годом. В них уже была возможность изменения шанса.
Цитата:
Сообщение от NotSpecified Посмотреть сообщение
Видел записи в заметках того же Астериоса. Более подробно подскажет гугл с ключевыми словами в поиске.
По гуглил так и ниче не нашел
Литион вне форума Ответить с цитированием
Непрочитано 23.12.2011, 16:58   #6
Аватар для phozik1
Пользователь

По умолчанию Re: Как сделать шанс прохождения

Воспользуйся рандомностью.
phozik1 вне форума Отправить сообщение для phozik1 с помощью ICQ Отправить сообщение для phozik1 с помощью Skype™ Ответить с цитированием
Непрочитано 07.01.2012, 13:30   #7
Аватар для FaintSmile
Пользователь

По умолчанию Re: Как сделать шанс прохождения

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

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 >= 0;) // 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 >= 0;)
				{
					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;
	}
 
}
Code: Java

Последний раз редактировалось Casper; 11.01.2012 в 20:52.
FaintSmile вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Шанс]Заточка Necron Серверная часть 3 20.01.2011 01:38
Шанс прокачки СА Rakitmiha Lineage II 11 11.01.2011 15:25
Изменение шанса прохождения дебафов krisadr Lineage II 5 14.06.2010 16:38
После прохождения квеста на даэва не даются скиллы сбора. ViAl Серверная часть 15 09.03.2010 12:27
Шанс дропа Index Lineage II 1 14.01.2009 20:56


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 11:51. Часовой пояс GMT +3.

Вверх