Pdam.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.sf.l2j.gameserver.handler.skillhandlers;
  16. import java.util.logging.Logger;
  17. import net.sf.l2j.Config;
  18. import net.sf.l2j.gameserver.datatables.SkillTable;
  19. import net.sf.l2j.gameserver.handler.ISkillHandler;
  20. import net.sf.l2j.gameserver.lib.Log;
  21. import net.sf.l2j.gameserver.model.L2Character;
  22. import net.sf.l2j.gameserver.model.L2Effect;
  23. import net.sf.l2j.gameserver.model.L2ItemInstance;
  24. import net.sf.l2j.gameserver.model.L2Object;
  25. import net.sf.l2j.gameserver.model.L2Skill;
  26. import net.sf.l2j.gameserver.model.L2Skill.SkillType;
  27. import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
  28. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  29. import net.sf.l2j.gameserver.model.actor.instance.L2RaidBossInstance;
  30. import net.sf.l2j.gameserver.network.SystemMessageId;
  31. import net.sf.l2j.gameserver.serverpackets.EtcStatusUpdate;
  32. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  33. import net.sf.l2j.gameserver.skills.Formulas;
  34. import net.sf.l2j.gameserver.skills.effects.EffectCharge;
  35. import net.sf.l2j.gameserver.templates.L2WeaponType;
  36. /**
  37. * This class ...
  38. *
  39. * @version $Revision: 1.1.2.7.2.16 $ $Date: 2005/04/06 16:13:49 $
  40. */
  41. public class Pdam implements ISkillHandler
  42. {
  43. // all the items ids that this handler knowns
  44. private static Logger _log = Logger.getLogger(Pdam.class.getName());
  45. /* (non-Javadoc)
  46. * @see net.sf.l2j.gameserver.handler.IItemHandler#useItem(net.sf.l2j.gameserver.model.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
  47. */
  48. private static final SkillType[] SKILL_IDS = {SkillType.PDAM,
  49. /* SkillType.CHARGEDAM */
  50. };
  51. /* (non-Javadoc)
  52. * @see net.sf.l2j.gameserver.handler.IItemHandler#useItem(net.sf.l2j.gameserver.model.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
  53. */
  54. public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
  55. {
  56. if (activeChar.isAlikeDead()) return;
  57. int damage = 0;
  58. if (Config.DEBUG)
  59. if (Config.DEBUG) _log.fine("Begin Skill processing in Pdam.java " + skill.getSkillType());
  60. for (int index = 0; index < targets.length; index++)
  61. {
  62. L2Character target = (L2Character) targets[index];
  63. Formulas f = Formulas.getInstance();
  64. L2ItemInstance weapon = activeChar.getActiveWeaponInstance();
  65. if (activeChar instanceof L2PcInstance && target instanceof L2PcInstance
  66. && target.isFakeDeath())
  67. {
  68. target.stopFakeDeath(null);
  69. }
  70. else if (target.isDead()) continue;
  71. boolean dual = activeChar.isUsingDualWeapon();
  72. boolean shld = f.calcShldUse(activeChar, target);
  73. // PDAM critical chance not affected by buffs, only by STR. Only some skills are meant to crit.
  74. boolean crit = false;
  75. if (skill.getBaseCritRate() > 0)
  76. crit = f.calcCrit(skill.getBaseCritRate() * 10 * f.getSTRBonus(activeChar));
  77. boolean soul = (weapon != null
  78. && weapon.getChargedSoulshot() == L2ItemInstance.CHARGED_SOULSHOT && weapon.getItemType() != L2WeaponType.DAGGER);
  79. if (!crit && (skill.getCondition() & L2Skill.COND_CRIT) != 0) damage = 0;
  80. else damage = (int) f.calcPhysDam(activeChar, target, skill, shld, false, dual, soul);
  81. if (crit) damage *= 2; // PDAM Critical damage always 2x and not affected by buffs
  82. if (damage > 5000 && activeChar instanceof L2PcInstance)
  83. {
  84. String name = "";
  85. if (target instanceof L2RaidBossInstance) name = "RaidBoss ";
  86. if (target instanceof L2NpcInstance)
  87. name += target.getName() + "(" + ((L2NpcInstance) target).getTemplate().npcId
  88. + ")";
  89. if (target instanceof L2PcInstance)
  90. name = target.getName() + "(" + target.getObjectId() + ") ";
  91. name += target.getLevel() + " lvl";
  92. Log.add(activeChar.getName() + "(" + activeChar.getObjectId() + ") "
  93. + activeChar.getLevel() + " lvl did damage " + damage + " with skill "
  94. + skill.getName() + "(" + skill.getId() + ") to " + name, "damage_pdam");
  95. }
  96. if (soul && weapon != null) weapon.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);
  97. if (damage > 0)
  98. {
  99. activeChar.sendDamageMessage(target, damage, false, crit, false);
  100. if (skill.hasEffects())
  101. {
  102. if (target.reflectSkill(skill))
  103. {
  104. activeChar.stopSkillEffects(skill.getId());
  105. skill.getEffects((L2Character) null, activeChar);
  106. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
  107. sm.addSkillName(skill.getId());
  108. activeChar.sendPacket(sm);
  109. }
  110. else
  111. {
  112. // activate attacked effects, if any
  113. target.stopSkillEffects(skill.getId());
  114. if (f.calcSkillSuccess(activeChar, target, skill, false, false, false))
  115. {
  116. skill.getEffects(activeChar, target);
  117. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
  118. sm.addSkillName(skill.getId());
  119. target.sendPacket(sm);
  120. }
  121. else
  122. {
  123. SystemMessage sm = new SystemMessage(SystemMessageId.S1_WAS_UNAFFECTED_BY_S2);
  124. sm.addString(target.getName());
  125. sm.addSkillName(skill.getDisplayId());
  126. activeChar.sendPacket(sm);
  127. }
  128. }
  129. }
  130. // Possibility of a lethal strike
  131. boolean lethal = Formulas.getInstance().calcLethalHit(activeChar, target, skill);
  132. // Make damage directly to HP
  133. if(!lethal && skill.getDmgDirectlyToHP())
  134. {
  135. if(target instanceof L2PcInstance)
  136. {
  137. L2PcInstance player = (L2PcInstance)target;
  138. if (!player.isInvul())
  139. {
  140. if (damage >= player.getCurrentHp())
  141. {
  142. if (player.isInDuel())
  143. player.setCurrentHp(1);
  144. else
  145. {
  146. player.setCurrentHp(0);
  147. if (player.isInOlympiadMode())
  148. {
  149. player.abortAttack();
  150. player.abortCast();
  151. player.getStatus().stopHpMpRegeneration();
  152. player.setIsDead(true);
  153. player.setIsPendingRevive(true);
  154. }
  155. else
  156. player.doDie(activeChar);
  157. }
  158. }
  159. else
  160. player.setCurrentHp(player.getCurrentHp() - damage);
  161. }
  162. SystemMessage smsg = new SystemMessage(SystemMessageId.S1_RECEIVED_DAMAGE_OF_S3_FROM_S2);
  163. String name = (activeChar instanceof L2PcInstance) ? ((L2PcInstance)activeChar).getAppearance().getVisibleName() : activeChar.getName();
  164. smsg.addString(player.getName());
  165. smsg.addString(name);
  166. smsg.addNumber(damage);
  167. player.sendPacket(smsg);
  168. }
  169. else
  170. target.reduceCurrentHp(damage, activeChar);
  171. }
  172. else
  173. {
  174. target.reduceCurrentHp(damage, activeChar);
  175. }
  176. }
  177. else // No - damage
  178. {
  179. activeChar.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));
  180. }
  181. if (skill.getId() == 345 || skill.getId() == 346) // Sonic Rage or Raging Force
  182. {
  183. EffectCharge effect = (EffectCharge)activeChar.getFirstEffect(L2Effect.EffectType.CHARGE);
  184. if (effect != null)
  185. {
  186. int effectcharge = effect.getLevel();
  187. if (effectcharge < 8)
  188. {
  189. effectcharge++;
  190. effect.addNumCharges(1);
  191. if (activeChar instanceof L2PcInstance)
  192. {
  193. activeChar.sendPacket(new EtcStatusUpdate((L2PcInstance)activeChar));
  194. SystemMessage sm = new SystemMessage(SystemMessageId.FORCE_INCREASED_TO_S1);
  195. sm.addNumber(effectcharge);
  196. activeChar.sendPacket(sm);
  197. }
  198. }
  199. else
  200. {
  201. SystemMessage sm = new SystemMessage(SystemMessageId.FORCE_MAXLEVEL_REACHED);
  202. activeChar.sendPacket(sm);
  203. }
  204. }
  205. else
  206. {
  207. if (skill.getId() == 345) // Sonic Rage
  208. {
  209. L2Skill dummy = SkillTable.getInstance().getInfo(8, 8); // Lv7 Sonic Focus
  210. dummy.getEffects(activeChar, activeChar);
  211. }
  212. else if (skill.getId() == 346) // Raging Force
  213. {
  214. L2Skill dummy = SkillTable.getInstance().getInfo(50, 8); // Lv7 Focused Force
  215. dummy.getEffects(activeChar, activeChar);
  216. }
  217. }
  218. }
  219. //self Effect :]
  220. L2Effect effect = activeChar.getFirstEffect(skill.getId());
  221. if (effect != null && effect.isSelfEffect())
  222. {
  223. //Replace old effect with new one.
  224. effect.exit();
  225. }
  226. skill.getEffectsSelf(activeChar);
  227. }
  228. if (skill.isSuicideAttack())
  229. activeChar.doDie(null);
  230. }
  231. public SkillType[] getSkillIds()
  232. {
  233. return SKILL_IDS;
  234. }
  235. }