Pdam.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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.ai.CtrlIntention;
  19. import net.sf.l2j.gameserver.datatables.SkillTable;
  20. import net.sf.l2j.gameserver.handler.ISkillHandler;
  21. import net.sf.l2j.gameserver.lib.Log;
  22. import net.sf.l2j.gameserver.model.L2Character;
  23. import net.sf.l2j.gameserver.model.L2Effect;
  24. import net.sf.l2j.gameserver.model.L2ItemInstance;
  25. import net.sf.l2j.gameserver.model.L2Object;
  26. import net.sf.l2j.gameserver.model.L2Skill;
  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.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.item.L2WeaponType;
  35. import net.sf.l2j.gameserver.templates.skills.L2EffectType;
  36. import net.sf.l2j.gameserver.templates.skills.L2SkillType;
  37. /**
  38. * This class ...
  39. *
  40. * @version $Revision: 1.1.2.7.2.16 $ $Date: 2005/04/06 16:13:49 $
  41. */
  42. public class Pdam implements ISkillHandler
  43. {
  44. private static Logger _log = Logger.getLogger(Pdam.class.getName());
  45. private static final L2SkillType[] SKILL_IDS =
  46. {
  47. L2SkillType.PDAM, L2SkillType.FATAL
  48. };
  49. /**
  50. *
  51. * @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[])
  52. */
  53. public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
  54. {
  55. if (activeChar.isAlikeDead())
  56. return;
  57. int damage = 0;
  58. if (Config.DEBUG)
  59. {
  60. _log.fine("Begin Skill processing in Pdam.java " + skill.getSkillType());
  61. }
  62. for (L2Character target: (L2Character[]) targets)
  63. {
  64. Formulas f = Formulas.getInstance();
  65. L2ItemInstance weapon = activeChar.getActiveWeaponInstance();
  66. if (activeChar instanceof L2PcInstance && target instanceof L2PcInstance && ((L2PcInstance)target).isFakeDeath())
  67. {
  68. target.stopFakeDeath(null);
  69. }
  70. else if (target.isDead())
  71. continue;
  72. boolean dual = activeChar.isUsingDualWeapon();
  73. byte 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 (soul && weapon != null)
  107. weapon.setChargedSoulshot(L2ItemInstance.CHARGED_NONE);
  108. boolean skillIsEvaded = f.calcPhysicalSkillEvasion(target, skill);
  109. if (!skillIsEvaded)
  110. {
  111. if (damage > 0)
  112. {
  113. activeChar.sendDamageMessage(target, damage, false, crit, false);
  114. if (skill.hasEffects())
  115. {
  116. if (target.reflectSkill(skill))
  117. {
  118. activeChar.stopSkillEffects(skill.getId());
  119. skill.getEffects(target, activeChar);
  120. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
  121. sm.addSkillName(skill);
  122. activeChar.sendPacket(sm);
  123. }
  124. else
  125. {
  126. // activate attacked effects, if any
  127. target.stopSkillEffects(skill.getId());
  128. if (f.calcSkillSuccess(activeChar, target, skill, shld, false, false, false))
  129. {
  130. skill.getEffects(activeChar, target);
  131. SystemMessage sm = new SystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
  132. sm.addSkillName(skill);
  133. target.sendPacket(sm);
  134. }
  135. else
  136. {
  137. SystemMessage sm = new SystemMessage(SystemMessageId.S1_WAS_UNAFFECTED_BY_S2);
  138. sm.addCharName(target);
  139. sm.addSkillName(skill);
  140. activeChar.sendPacket(sm);
  141. }
  142. }
  143. if (Config.LOG_GAME_DAMAGE && damage > 5000 && activeChar instanceof L2PcInstance)
  144. {
  145. String name = "";
  146. if (target.isRaid())
  147. name = "RaidBoss ";
  148. if (target instanceof L2NpcInstance)
  149. name += target.getName() + "(" + ((L2NpcInstance) target).getTemplate().npcId + ")";
  150. if (target instanceof L2PcInstance)
  151. name = target.getName() + "(" + target.getObjectId() + ") ";
  152. name += target.getLevel() + " lvl";
  153. Log.add(activeChar.getName() + "(" + activeChar.getObjectId() + ") " + activeChar.getLevel() + " lvl did damage " + damage + " with skill " + skill.getName() + "(" + skill.getId() + ") to " + name, "damage_pdam");
  154. }
  155. }
  156. // Possibility of a lethal strike
  157. boolean lethal = Formulas.getInstance().calcLethalHit(activeChar, target, skill);
  158. // Make damage directly to HP
  159. if (!lethal && skill.getDmgDirectlyToHP())
  160. {
  161. if (target instanceof L2PcInstance)
  162. {
  163. L2PcInstance player = (L2PcInstance) target;
  164. if (!player.isInvul())
  165. {
  166. if (damage >= player.getCurrentHp())
  167. {
  168. if (player.isInDuel())
  169. player.setCurrentHp(1);
  170. else
  171. {
  172. player.setCurrentHp(0);
  173. if (player.isInOlympiadMode())
  174. {
  175. player.abortAttack();
  176. player.abortCast();
  177. player.getStatus().stopHpMpRegeneration();
  178. player.setIsDead(true);
  179. player.setIsPendingRevive(true);
  180. if (player.getPet() != null)
  181. player.getPet().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null);
  182. }
  183. else
  184. player.doDie(activeChar);
  185. }
  186. }
  187. else
  188. player.setCurrentHp(player.getCurrentHp() - damage);
  189. }
  190. SystemMessage smsg = new SystemMessage(SystemMessageId.S1_RECEIVED_DAMAGE_OF_S3_FROM_S2);
  191. smsg.addPcName(player);
  192. smsg.addCharName(activeChar);
  193. smsg.addNumber(damage);
  194. player.sendPacket(smsg);
  195. }
  196. else
  197. target.reduceCurrentHp(damage, activeChar, skill);
  198. }
  199. else
  200. {
  201. target.reduceCurrentHp(damage, activeChar, skill);
  202. }
  203. }
  204. else
  205. // No - damage
  206. {
  207. activeChar.sendPacket(new SystemMessage(SystemMessageId.ATTACK_FAILED));
  208. }
  209. }
  210. else
  211. {
  212. if (activeChar instanceof L2PcInstance)
  213. {
  214. SystemMessage sm = new SystemMessage(SystemMessageId.S1_DODGES_ATTACK);
  215. sm.addString(target.getName());
  216. ((L2PcInstance) activeChar).sendPacket(sm);
  217. }
  218. if (target instanceof L2PcInstance)
  219. {
  220. SystemMessage sm = new SystemMessage(SystemMessageId.AVOIDED_S1_ATTACK);
  221. sm.addString(activeChar.getName());
  222. ((L2PcInstance) target).sendPacket(sm);
  223. }
  224. // Possibility of a lethal strike despite skill is evaded
  225. Formulas.getInstance().calcLethalHit(activeChar, target, skill);
  226. }
  227. if (skill.getId() == 345 || skill.getId() == 346) // Sonic Rage or Raging Force
  228. {
  229. EffectCharge effect = (EffectCharge) activeChar.getFirstEffect(L2EffectType.CHARGE);
  230. if (effect != null)
  231. {
  232. int effectcharge = effect.getLevel();
  233. if (effectcharge++ < 8)
  234. {
  235. effect.addNumCharges(1);
  236. if (activeChar instanceof L2PcInstance)
  237. {
  238. activeChar.sendPacket(new EtcStatusUpdate((L2PcInstance) activeChar));
  239. SystemMessage sm = new SystemMessage(SystemMessageId.FORCE_INCREASED_TO_S1);
  240. sm.addNumber(effectcharge);
  241. activeChar.sendPacket(sm);
  242. }
  243. }
  244. else
  245. {
  246. SystemMessage sm = new SystemMessage(SystemMessageId.FORCE_MAXLEVEL_REACHED);
  247. activeChar.sendPacket(sm);
  248. }
  249. }
  250. else
  251. {
  252. if (skill.getId() == 345) // Sonic Rage
  253. {
  254. L2Skill dummy = SkillTable.getInstance().getInfo(8, 8); // Lv7 Sonic Focus
  255. dummy.getEffects(activeChar, activeChar);
  256. }
  257. else if (skill.getId() == 346) // Raging Force
  258. {
  259. L2Skill dummy = SkillTable.getInstance().getInfo(50, 8); // Lv7 Focused Force
  260. dummy.getEffects(activeChar, activeChar);
  261. }
  262. }
  263. }
  264. //self Effect :]
  265. L2Effect effect = activeChar.getFirstEffect(skill.getId());
  266. if (effect != null && effect.isSelfEffect())
  267. {
  268. //Replace old effect with new one.
  269. effect.exit();
  270. }
  271. skill.getEffectsSelf(activeChar);
  272. }
  273. if (skill.isSuicideAttack())
  274. activeChar.doDie(activeChar);
  275. }
  276. /**
  277. *
  278. * @see net.sf.l2j.gameserver.handler.ISkillHandler#getSkillIds()
  279. */
  280. public L2SkillType[] getSkillIds()
  281. {
  282. return SKILL_IDS;
  283. }
  284. }