2
0

Pdam.java 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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.actor.instance.L2NpcInstance;
  27. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  28. import net.sf.l2j.gameserver.model.actor.instance.L2RaidBossInstance;
  29. import net.sf.l2j.gameserver.network.SystemMessageId;
  30. import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate;
  31. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  32. import net.sf.l2j.gameserver.skills.Formulas;
  33. import net.sf.l2j.gameserver.skills.effects.EffectCharge;
  34. import net.sf.l2j.gameserver.templates.L2SkillType;
  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. private static Logger _log = Logger.getLogger(Pdam.class.getName());
  44. private static final L2SkillType[] SKILL_IDS =
  45. {
  46. L2SkillType.PDAM
  47. };
  48. /**
  49. *
  50. * @see net.sf.l2j.gameserver.handler.ISkillHandler#useSkill(net.sf.l2j.gameserver.model.L2Character, net.sf.l2j.gameserver.model.L2Skill, net.sf.l2j.gameserver.model.L2Object[])
  51. */
  52. public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
  53. {
  54. if (activeChar.isAlikeDead())
  55. return;
  56. int damage = 0;
  57. if (Config.DEBUG)
  58. {
  59. _log.fine("Begin Skill processing in Pdam.java " + skill.getSkillType());
  60. }
  61. for (int index = 0; index < targets.length; index++)
  62. {
  63. L2Character target = (L2Character) targets[index];
  64. Formulas f = Formulas.getInstance();
  65. L2ItemInstance weapon = activeChar.getActiveWeaponInstance();
  66. if (activeChar instanceof L2PcInstance && target instanceof L2PcInstance && target.isFakeDeath())
  67. {
  68. target.stopFakeDeath(null);
  69. }
  70. else if (target.isDead())
  71. continue;
  72. boolean dual = activeChar.isUsingDualWeapon();
  73. boolean shld = f.calcShldUse(activeChar, target);
  74. // PDAM critical chance not affected by buffs, only by STR. Only some skills are meant to crit.
  75. boolean crit = false;
  76. if (skill.getBaseCritRate() > 0)
  77. crit = f.calcCrit(skill.getBaseCritRate() * 10 * f.getSTRBonus(activeChar));
  78. boolean soul = (weapon != null && weapon.getChargedSoulshot() == L2ItemInstance.CHARGED_SOULSHOT && weapon.getItemType() != L2WeaponType.DAGGER);
  79. if (!crit && (skill.getCondition() & L2Skill.COND_CRIT) != 0)
  80. damage = 0;
  81. else
  82. damage = (int) f.calcPhysDam(activeChar, target, skill, shld, false, dual, soul);
  83. if (skill.getMaxSoulConsumeCount() > 0 && activeChar instanceof L2PcInstance && ((L2PcInstance) activeChar).getSouls() > 0)
  84. {
  85. switch (((L2PcInstance) activeChar).getSouls())
  86. {
  87. case 1:
  88. damage *= 1.10;
  89. break;
  90. case 2:
  91. damage *= 1.12;
  92. break;
  93. case 3:
  94. damage *= 1.15;
  95. break;
  96. case 4:
  97. damage *= 1.18;
  98. break;
  99. default:
  100. damage *= 1.20;
  101. break;
  102. }
  103. }
  104. if (crit)
  105. damage *= 2; // PDAM Critical damage always 2x and not affected by buffs
  106. if (damage > 5000 && activeChar instanceof L2PcInstance)
  107. {
  108. String name = "";
  109. if (target instanceof L2RaidBossInstance)
  110. name = "RaidBoss ";
  111. if (target instanceof L2NpcInstance)
  112. name += target.getName() + "(" + ((L2NpcInstance) target).getTemplate().npcId + ")";
  113. if (target instanceof L2PcInstance)
  114. name = target.getName() + "(" + target.getObjectId() + ") ";
  115. name += target.getLevel() + " lvl";
  116. Log.add(activeChar.getName() + "(" + activeChar.getObjectId() + ") " + activeChar.getLevel() + " lvl did damage " + damage + " with skill " + skill.getName() + "(" + skill.getId() + ") to " + name, "damage_pdam");
  117. }
  118. if (soul && weapon != null)
  119. weapon.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);
  120. if (damage > 0)
  121. {
  122. activeChar.sendDamageMessage(target, damage, false, crit, false);
  123. if (skill.hasEffects())
  124. {
  125. if (target.reflectSkill(skill))
  126. {
  127. activeChar.stopSkillEffects(skill.getId());
  128. skill.getEffects((L2Character) null, activeChar);
  129. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
  130. sm.addSkillName(skill);
  131. activeChar.sendPacket(sm);
  132. }
  133. else
  134. {
  135. // activate attacked effects, if any
  136. target.stopSkillEffects(skill.getId());
  137. if (f.calcSkillSuccess(activeChar, target, skill, false, false, false))
  138. {
  139. skill.getEffects(activeChar, target);
  140. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
  141. sm.addSkillName(skill);
  142. target.sendPacket(sm);
  143. }
  144. else
  145. {
  146. SystemMessage sm = new SystemMessage(SystemMessageId.S1_WAS_UNAFFECTED_BY_S2);
  147. sm.addCharName(target);
  148. sm.addSkillName(skill);
  149. activeChar.sendPacket(sm);
  150. }
  151. }
  152. }
  153. // Possibility of a lethal strike
  154. boolean lethal = Formulas.getInstance().calcLethalHit(activeChar, target, skill);
  155. // Make damage directly to HP
  156. if (!lethal && skill.getDmgDirectlyToHP())
  157. {
  158. if (target instanceof L2PcInstance)
  159. {
  160. L2PcInstance player = (L2PcInstance) target;
  161. if (!player.isInvul())
  162. {
  163. if (damage >= player.getCurrentHp())
  164. {
  165. if (player.isInDuel())
  166. player.setCurrentHp(1);
  167. else
  168. {
  169. player.setCurrentHp(0);
  170. if (player.isInOlympiadMode())
  171. {
  172. player.abortAttack();
  173. player.abortCast();
  174. player.getStatus().stopHpMpRegeneration();
  175. player.setIsDead(true);
  176. player.setIsPendingRevive(true);
  177. }
  178. else
  179. player.doDie(activeChar);
  180. }
  181. }
  182. else
  183. player.setCurrentHp(player.getCurrentHp() - damage);
  184. }
  185. SystemMessage smsg = new SystemMessage(SystemMessageId.S1_RECEIVED_DAMAGE_OF_S3_FROM_S2);
  186. smsg.addPcName(player);
  187. smsg.addCharName(activeChar);
  188. smsg.addNumber(damage);
  189. player.sendPacket(smsg);
  190. }
  191. else
  192. target.reduceCurrentHp(damage, activeChar);
  193. }
  194. else
  195. {
  196. target.reduceCurrentHp(damage, activeChar);
  197. }
  198. }
  199. else
  200. // No - damage
  201. {
  202. activeChar.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));
  203. }
  204. if (skill.getId() == 345 || skill.getId() == 346) // Sonic Rage or Raging Force
  205. {
  206. EffectCharge effect = (EffectCharge) activeChar.getFirstEffect(L2Effect.EffectType.CHARGE);
  207. if (effect != null)
  208. {
  209. int effectcharge = effect.getLevel();
  210. if (effectcharge < 8)
  211. {
  212. effectcharge++;
  213. effect.addNumCharges(1);
  214. if (activeChar instanceof L2PcInstance)
  215. {
  216. activeChar.sendPacket(new EtcStatusUpdate((L2PcInstance) activeChar));
  217. SystemMessage sm = new SystemMessage(SystemMessageId.FORCE_INCREASED_TO_S1);
  218. sm.addNumber(effectcharge);
  219. activeChar.sendPacket(sm);
  220. }
  221. }
  222. else
  223. {
  224. SystemMessage sm = new SystemMessage(SystemMessageId.FORCE_MAXLEVEL_REACHED);
  225. activeChar.sendPacket(sm);
  226. }
  227. }
  228. else
  229. {
  230. if (skill.getId() == 345) // Sonic Rage
  231. {
  232. L2Skill dummy = SkillTable.getInstance().getInfo(8, 8); // Lv7 Sonic Focus
  233. dummy.getEffects(activeChar, activeChar);
  234. }
  235. else if (skill.getId() == 346) // Raging Force
  236. {
  237. L2Skill dummy = SkillTable.getInstance().getInfo(50, 8); // Lv7 Focused Force
  238. dummy.getEffects(activeChar, activeChar);
  239. }
  240. }
  241. }
  242. //self Effect :]
  243. L2Effect effect = activeChar.getFirstEffect(skill.getId());
  244. if (effect != null && effect.isSelfEffect())
  245. {
  246. //Replace old effect with new one.
  247. effect.exit();
  248. }
  249. skill.getEffectsSelf(activeChar);
  250. }
  251. if (skill.isSuicideAttack())
  252. activeChar.doDie(null);
  253. }
  254. /**
  255. *
  256. * @see net.sf.l2j.gameserver.handler.ISkillHandler#getSkillIds()
  257. */
  258. public L2SkillType[] getSkillIds()
  259. {
  260. return SKILL_IDS;
  261. }
  262. }