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

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Ответ
Опции темы
Непрочитано 21.05.2015, 12:25   #1
Аватар для ntking
Пользователь

Автор темы (Топик Стартер) На персонаже не работает reflectDam

Сборка L2Open, Ситуация:
Все скиллы использующие параметр:
Код:
<add order="0x40" stat="reflectDam" val="N" />
На мобах работают, на персонажах нет. Т.е. если на мобе (РБ) скилл ID:4214 и его бьет персонаж - то возвращается 20% нанесенного урона обратно персонажу.
Если же на персонаже скилл или ДС с возвратом урона - когда бьют мобы этого персонажа, им урон не возвращается.
L2Character.java не трогал, там все как было еще с фениксов:
Код:
		if(skill != null && skill.isMagic())
			value = target.calcStat(Stats.REFLECT_MSKILL_DAMAGE_PERCENT, 0, this, skill);
		else if(skill != null && skill.getCastRange() <= 200)
			value = target.calcStat(Stats.REFLECT_PSKILL_DAMAGE_PERCENT, 0, this, skill);
		else if(skill == null && !bow)
			value = target.calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, this, null);

		if(value > 0)
			applyReflectDamage(target, damage, value);

		if(skill != null || bow)
			return false;

	public void applyReflectDamage(L2Character target, double damage, double reflect)
	{
		double rdmg = damage * reflect / 100.;
		rdmg = Math.min(rdmg, target.getCurrentHp());
		if(isPlayable() && !target.isNpc())
			reduceCurrentHp(rdmg, this, null, true, true, false, false);
		else
			reduceCurrentHp(rdmg, target, null, true, true, false, false);
		if(target.isPlayer() && rdmg >= 1.)
			target.sendPacket(new SystemMessage(SystemMessage.C1_HAS_GIVEN_C2_DAMAGE_OF_S3).addName(target).addName(this).addNumber((long) rdmg));
	}
Подскажите где копать? Может я где-то в датапаке косякнул?
ntking вне форума Отправить сообщение для ntking с помощью ICQ Ответить с цитированием
Непрочитано 21.05.2015, 13:23   #2
Пользователь

По умолчанию Re: На персонаже не работает reflectDam

if(isPlayable() && !target.isNpc())
и
reduceCurrentHp
можно разобрать? Или на уровне проверки не выполняется, или не тот обьект в ф-цию отправляется.
kpNemo вне форума Ответить с цитированием
Непрочитано 21.05.2015, 15:18   #3
Аватар для ntking
Пользователь

Автор темы (Топик Стартер) Re: На персонаже не работает reflectDam

Опять повторюсь, я L2Character.java не трогал, там все так, как было и как работало. И в принципе этот парамерт скилла работает, но только на мобах, а на персонажах нет. Для чистоты эксперимента я даже кидал на себя скилл 4214.
Код:
	public void reduceCurrentHp(double i, L2Character attacker, L2Skill skill, boolean awake, boolean standUp, boolean directHp, boolean canReflect)
	{
		fireMethodInvoked(MethodCollection.ReduceCurrentHp, new Object[] { i, attacker, skill, awake, standUp, directHp, });

		if(attacker == null || isDead() || attacker.isDead())
			return;

		if(isInvul() && attacker != this)
		{
			attacker.sendPacket(Msg.THE_ATTACK_HAS_BEEN_BLOCKED);
			return;
		}

		// 5182 = Blessing of protection, работает если разница уровней больше 10 и не в зоне осады
		if(attacker.isPlayer() && Math.abs(attacker.getLevel() - getLevel()) > 10)
		{
			// ПК не может нанести урон чару с блессингом
			if(attacker.getKarma() > 0 && getEffectList().getEffectsBySkillId(5182) != null && !isInZone(ZoneType.Siege))
				return;
			// чар с блессингом не может нанести урон ПК
			if(getKarma() > 0 && attacker.getEffectList().getEffectsBySkillId(5182) != null && !attacker.isInZone(ZoneType.Siege))
				return;
		}

		if(awake && isSleeping())
			getEffectList().stopEffects(EffectType.Sleep);

		if(isMeditated() && attacker != this)
		{
			L2Effect effect = getEffectList().getEffectByType(EffectType.Meditation);
			if(effect != null)
			{
				GArray<L2Effect> effects = getEffectList().getEffectsBySkill(effect.getSkill());
				if(effects != null)
					for(L2Effect ef : effects)
						if(ef.getEffectType() != EffectType.Debuff)
							ef.exit();
			}
		}

		if(standUp && isPlayer())
		{
			standUp();
			if(isFakeDeath())
			{
				L2Effect fakeDeath = getEffectList().getEffectByType(EffectType.FakeDeath);
				if(fakeDeath == null)
					stopFakeDeath();
				else if(fakeDeath.getTime() > 2000)
					getEffectList().stopEffects(EffectType.FakeDeath);
			}
		}

		if(attacker != this)
		{
			startAttackStanceTask();
			if(isInvisible() && getEffectList().getEffectByType(EffectType.Invisible) != null)
				getEffectList().stopEffects(EffectType.Invisible);
		}

		if(canReflect && attacker.absorbAndReflect(this, skill, i))
			return;

		if(attacker.isPlayable())
		{
			L2Playable pAttacker = (L2Playable) attacker;

			// Flag the attacker if it's a L2Player outside a PvP area
			if(!isDead() && pAttacker.checkPvP(this, null))
				pAttacker.startPvPFlag(this);

			if(isMonster() && skill != null && skill.isOverhit())
			{
				// Calculate the over-hit damage
				// Ex: mob had 10 HP left, over-hit skill did 50 damage total, over-hit damage is 40
				double overhitDmg = (_currentHp - i) * -1;
				if(overhitDmg <= 0)
				{
					setOverhitDamage(0);
					setOverhitAttacker(null);
				}
				else
				{
					setOverhitDamage(overhitDmg);
					setOverhitAttacker(attacker);
				}
			}

			double ii;
			if(!directHp && _currentCp > 0)
			{
				i = _currentCp - i;
				ii = i;

				if(ii < 0)
					ii *= -1;

				if(i < 0)
					i = 0;

				setCurrentCp(i);
			}
			else
				ii = i;

			if(_currentCp == 0 || directHp)
			{
				ii = _currentHp - ii;

				if(ii < 0)
					ii = 0;

				if(isNpc())
					pAttacker.addDamage((L2NpcInstance) this, (int) (_currentHp - ii));

				if(!onDieTrigger && ii < 0.5 && _skillsOnAction != null)
				{
					onDieTrigger = true;
					ConcurrentLinkedQueue<L2Skill> SkillsOnDie = _skillsOnAction.get(TriggerActionType.DIE);
					if(SkillsOnDie != null)
						for(L2Skill sk : SkillsOnDie)
							if(Rnd.chance(sk.getChanceForAction(TriggerActionType.DIE)))
								useActionSkill(sk, this, attacker);
					onDieTrigger = false;
				}

				setCurrentHp(ii, false);
			}
		}
		else
		{
			if(_currentHp - i < 0.5)
				useActionSkill(null, this, this, TriggerActionType.DIE);

			setCurrentHp(Math.max(_currentHp - i, 0), false);
		}

		if(isDead())
			doDie(attacker);
	}
ntking вне форума Отправить сообщение для ntking с помощью ICQ Ответить с цитированием
Непрочитано 21.05.2015, 20:06   #4
Аватар для i_am_kisly
Пользователь

По умолчанию Re: На персонаже не работает reflectDam

Цитата:
Сообщение от ntking Посмотреть сообщение
Опять повторюсь, я L2Character.java не трогал
давно уже пора потрогать поставь пару брекпоинтов и решишь проблему

Последний раз редактировалось i_am_kisly; 21.05.2015 в 21:17.
i_am_kisly вне форума Ответить с цитированием
Непрочитано 27.05.2015, 16:14   #5
Аватар для ntking
Пользователь

Автор темы (Топик Стартер) Re: На персонаже не работает reflectDam

Цитата:
Сообщение от i_am_kisly Посмотреть сообщение
давно уже пора потрогать поставь пару брекпоинтов и решишь проблему
Спасибо за совет, но я не настолько знаю язык, чтобы поставить брики в то место, где они нужны((
Меня, как PHP программера смущает условие:
Код:
if(isPlayable() && !target.isNpc())
			reduceCurrentHp(rdmg, this, null, true, true, false, false);
Возможно оно тупо не выполняется и из-за этого дамаг от игрока не возвращается, а вот игроку как раз возвращается, т.к. срабатывает else .
Возможно в !target.isNpc()) лишний восклицательный знак. Т.е. условие срабатывает только на других игроках, а на NPC - нет. Попробую в PVP, возвращается ли урон от игрока игроку.

Последний раз редактировалось ntking; 27.05.2015 в 16:56. Причина: орфография
ntking вне форума Отправить сообщение для ntking с помощью ICQ Ответить с цитированием
Непрочитано 27.05.2015, 16:39   #6
Пользователь

По умолчанию Re: На персонаже не работает reflectDam

Знач пошагово вообще)))
kpNemo вне форума Ответить с цитированием
Непрочитано 27.05.2015, 17:46   #7
Аватар для ntking
Пользователь

Автор темы (Топик Стартер) Re: На персонаже не работает reflectDam

Глянул код у лыж, там вообще никаких условий нет, кто кого дамажет:
Код:
// Reduce HP of the target and calculate reflection damage to reduce HP of attacker if necessary
					double reflectPercent = target.getStat().calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, null, null);
					
					if (reflectPercent > 0)
					{
						reflectedDamage = (int) ((reflectPercent / 100.) * damage);
						
						if (reflectedDamage > target.getMaxHp())
						{
							reflectedDamage = target.getMaxHp();
						}
					}
				}
			}
			
			// reduce targets HP
			target.reduceCurrentHp(damage, this, null);
			target.notifyDamageReceived(damage, this, null, crit, false);
			
			if (reflectedDamage > 0)
			{
				reduceCurrentHp(reflectedDamage, target, true, false, null);
				notifyDamageReceived(reflectedDamage, target, null, crit, false);
			}
Глянул исходники L2Emu - там рефлект закомментирован
Жесть какая-то))) Жаль, Diagod'a нет, он то свой код знает... хотя, код это фениксов, но всеравно, он же с ним работал.
ntking вне форума Отправить сообщение для ntking с помощью ICQ Ответить с цитированием
Непрочитано 28.05.2015, 06:48   #8
Аватар для Zubastic
ZG troll squad

По умолчанию Re: На персонаже не работает reflectDam

Нужен код вот этого:
Цитата:
else if(skill == null && !bow)
value = target.calcStat(Stats.REFLECT_DAMAGE_PERCENT, 0, this, null);
Скорее всего там return 0; из-за чего и не рефлектит. Вообще автор пишите в скайп Zubastic32. Вечером глянем.
__________________
Zubastic вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 28.05.2015, 10:20   #9
Аватар для ntking
Пользователь

Автор темы (Топик Стартер) Re: На персонаже не работает reflectDam

Цитата:
Сообщение от Zubastic Посмотреть сообщение
Нужен код вот этого:

Скорее всего там return 0; из-за чего и не рефлектит. Вообще автор пишите в скайп Zubastic32. Вечером глянем.
Нее, тут то как раз все нормально, словами:
если не скилл и не лук, то высчитываем рефлект, взяв из статов.
Если бы это условие не работало, то от мобов не рефлектило бы.
ntking вне форума Отправить сообщение для ntking с помощью ICQ Ответить с цитированием
Непрочитано 28.05.2015, 10:37   #10
Аватар для Gattsu
Пользователь

По умолчанию Re: На персонаже не работает reflectDam

PHP код:
if(isPlayable() && !target.isNpc())
 
reduceCurrentHp(rdmgthisnulltruetruefalsefalse);
else
 
reduceCurrentHp(rdmgtargetnulltruetruefalsefalse); 
Ну условие должно смущать

вместо всего блога оставьте только это
reduceCurrentHp(rdmg, target, null, true, true, false, false);

хотя....

посмотрите, что в методе attacker.absorbAndReflect

PHP код:
if(canReflect && attacker.absorbAndReflect(thisskilli))
            return; 
я думаю там, нас ждет подсказка, в интересном приключении, l2j core
Gattsu вне форума Отправить сообщение для Gattsu с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Ответ

Метки
reflectdam


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает интернет в VirtualBox pwnator Perfect World 3 02.06.2019 00:46
[release]WZT Season 4 Server Mag_i_str Сервер 22 21.11.2011 12:14
На персонаже не отображается плащ niko42 Игровой клиент 7 13.01.2011 09:52
[Продам] Gracia Part 2 L2Dream PaInKiLlEr Рынок / Marketplace 10 04.06.2010 00:18


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

Вверх