TriggerSkillByAttack.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * Copyright (C) 2004-2015 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package handlers.effecthandlers;
  20. import com.l2jserver.gameserver.enums.InstanceType;
  21. import com.l2jserver.gameserver.handler.ITargetTypeHandler;
  22. import com.l2jserver.gameserver.handler.TargetHandler;
  23. import com.l2jserver.gameserver.model.L2Object;
  24. import com.l2jserver.gameserver.model.StatsSet;
  25. import com.l2jserver.gameserver.model.actor.L2Character;
  26. import com.l2jserver.gameserver.model.conditions.Condition;
  27. import com.l2jserver.gameserver.model.effects.AbstractEffect;
  28. import com.l2jserver.gameserver.model.events.EventType;
  29. import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageDealt;
  30. import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener;
  31. import com.l2jserver.gameserver.model.holders.SkillHolder;
  32. import com.l2jserver.gameserver.model.items.type.WeaponType;
  33. import com.l2jserver.gameserver.model.skills.BuffInfo;
  34. import com.l2jserver.gameserver.model.skills.Skill;
  35. import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
  36. import com.l2jserver.util.Rnd;
  37. /**
  38. * Trigger Skill By Attack effect implementation.
  39. * @author Zealar
  40. */
  41. public final class TriggerSkillByAttack extends AbstractEffect
  42. {
  43. private final int _minAttackerLevel;
  44. private final int _maxAttackerLevel;
  45. private final int _minDamage;
  46. private final int _chance;
  47. private final SkillHolder _skill;
  48. private final L2TargetType _targetType;
  49. private final InstanceType _attackerType;
  50. private int _allowWeapons;
  51. private final boolean _isCritical;
  52. /**
  53. * @param attachCond
  54. * @param applyCond
  55. * @param set
  56. * @param params
  57. */
  58. public TriggerSkillByAttack(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params)
  59. {
  60. super(attachCond, applyCond, set, params);
  61. _minAttackerLevel = params.getInt("minAttackerLevel", 1);
  62. _maxAttackerLevel = params.getInt("maxAttackerLevel", 100);
  63. _minDamage = params.getInt("minDamage", 1);
  64. _chance = params.getInt("chance", 100);
  65. _skill = new SkillHolder(params.getInt("skillId"), params.getInt("skillLevel", 1));
  66. _targetType = params.getEnum("targetType", L2TargetType.class, L2TargetType.SELF);
  67. _attackerType = params.getEnum("attackerType", InstanceType.class, InstanceType.L2Character);
  68. _isCritical = params.getBoolean("isCritical", false);
  69. if (params.getString("allowWeapons").equalsIgnoreCase("ALL"))
  70. {
  71. _allowWeapons = 0;
  72. }
  73. else
  74. {
  75. for (String s : params.getString("allowWeapons").split(","))
  76. {
  77. _allowWeapons |= WeaponType.valueOf(s).mask();
  78. }
  79. }
  80. }
  81. public void onAttackEvent(OnCreatureDamageDealt event)
  82. {
  83. if (event.isDamageOverTime() || (_chance == 0) || ((_skill.getSkillId() == 0) || (_skill.getSkillLvl() == 0)))
  84. {
  85. return;
  86. }
  87. if (_isCritical != event.isCritical())
  88. {
  89. return;
  90. }
  91. final ITargetTypeHandler targetHandler = TargetHandler.getInstance().getHandler(_targetType);
  92. if (targetHandler == null)
  93. {
  94. _log.warning("Handler for target type: " + _targetType + " does not exist.");
  95. return;
  96. }
  97. if (event.getAttacker() == event.getTarget())
  98. {
  99. return;
  100. }
  101. if ((event.getAttacker().getLevel() < _minAttackerLevel) || (event.getAttacker().getLevel() > _maxAttackerLevel))
  102. {
  103. return;
  104. }
  105. if ((event.getDamage() < _minDamage) || (Rnd.get(100) > _chance) || !event.getAttacker().getInstanceType().isType(_attackerType))
  106. {
  107. return;
  108. }
  109. if (_allowWeapons > 0)
  110. {
  111. if ((event.getAttacker().getActiveWeaponItem() == null) || ((event.getAttacker().getActiveWeaponItem().getItemType().mask() & _allowWeapons) == 0))
  112. {
  113. return;
  114. }
  115. }
  116. final Skill triggerSkill = _skill.getSkill();
  117. final L2Object[] targets = targetHandler.getTargetList(triggerSkill, event.getAttacker(), false, event.getTarget());
  118. for (L2Object triggerTarget : targets)
  119. {
  120. if ((triggerTarget == null) || !triggerTarget.isCharacter())
  121. {
  122. continue;
  123. }
  124. final L2Character targetChar = (L2Character) triggerTarget;
  125. if (!targetChar.isInvul())
  126. {
  127. event.getAttacker().makeTriggerCast(triggerSkill, targetChar);
  128. }
  129. }
  130. }
  131. @Override
  132. public void onExit(BuffInfo info)
  133. {
  134. info.getEffected().removeListenerIf(EventType.ON_CREATURE_DAMAGE_DEALT, listener -> listener.getOwner() == this);
  135. }
  136. @Override
  137. public void onStart(BuffInfo info)
  138. {
  139. info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_CREATURE_DAMAGE_DEALT, (OnCreatureDamageDealt event) -> onAttackEvent(event), this));
  140. }
  141. }