Advertisement
Guest User

Untitled

a guest
Jan 14th, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.89 KB | None | 0 0
  1. package net.sf.odinms.net.channel.handler;
  2.  
  3. import java.util.concurrent.ScheduledFuture;
  4. import net.sf.odinms.client.IItem;
  5. import net.sf.odinms.client.ISkill;
  6. import net.sf.odinms.client.MapleBuffStat;
  7. import net.sf.odinms.client.MapleCharacter;
  8. import net.sf.odinms.client.MapleCharacter.CancelCooldownAction;
  9. import net.sf.odinms.client.MapleClient;
  10. import net.sf.odinms.client.MapleInventory;
  11. import net.sf.odinms.client.MapleInventoryType;
  12. import net.sf.odinms.client.MapleJob;
  13. import net.sf.odinms.client.MapleWeaponType;
  14. import net.sf.odinms.client.SkillFactory;
  15. import net.sf.odinms.net.MaplePacket;
  16. import net.sf.odinms.server.MapleInventoryManipulator;
  17. import net.sf.odinms.server.MapleItemInformationProvider;
  18. import net.sf.odinms.server.MapleStatEffect;
  19. import net.sf.odinms.server.TimerManager;
  20. import net.sf.odinms.tools.MaplePacketCreator;
  21. import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
  22.  
  23. public class RangedAttackHandler extends AbstractDealDamageHandler {
  24.  
  25. @Override
  26. public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
  27. AttackInfo attack = parseDamage(slea, true);
  28. MapleCharacter player = c.getPlayer();
  29. MapleInventory equip = player.getInventory(MapleInventoryType.EQUIPPED);
  30. IItem weapon = equip.getItem((byte) -11);
  31. MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance();
  32. MapleWeaponType type = mii.getWeaponType(weapon.getItemId());
  33. if (type == MapleWeaponType.NOT_A_WEAPON) {
  34. throw new RuntimeException("[h4x] Player " + player.getName() +
  35. " is attacking with something that's not a weapon");
  36. }
  37. MapleInventory use = player.getInventory(MapleInventoryType.USE);
  38. int projectile = 0;
  39. int bulletCount = 1;
  40. MapleStatEffect effect = null;
  41. if (attack.skill != 0) {
  42. if (!c.getPlayer().getMap().getSkillsEnabled()) {
  43. c.getPlayer().setHp(0);
  44. c.getPlayer().updateSingleStat(net.sf.odinms.client.MapleStat.HP, 0);
  45. c.getSession().write(MaplePacketCreator.serverNotice(1, "Skills are currently disabled in this map."));
  46. return;
  47. }
  48. effect = attack.getAttackEffect(c.getPlayer());
  49. bulletCount = effect.getBulletCount();
  50. if (effect.getCooldown() > 0) {
  51. c.getSession().write(MaplePacketCreator.skillCooldown(attack.skill, effect.getCooldown() / 5));
  52. }
  53. }
  54. boolean hasShadowPartner = player.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null;
  55. int damageBulletCount = bulletCount;
  56. if (hasShadowPartner) {
  57. bulletCount *= 2;
  58. }
  59. for (int i = 0; i < 255; i++) {
  60. IItem item = use.getItem((byte) i);
  61. if (item != null) {
  62. boolean clawCondition = weapon.getItemId() != 1472063 && type == MapleWeaponType.CLAW && mii.isThrowingStar(item.getItemId());
  63. boolean bowCondition = weapon.getItemId() != 1472063 && type == MapleWeaponType.BOW && mii.isArrowForBow(item.getItemId());
  64. boolean crossbowCondition = type == MapleWeaponType.CROSSBOW && mii.isArrowForCrossBow(item.getItemId());
  65. boolean mittenCondition = weapon.getItemId() == 1472063 && (item.getItemId() == 2060005 || item.getItemId() == 2060006);
  66. if ((clawCondition || bowCondition || crossbowCondition || mittenCondition) && item.getQuantity() >= bulletCount) {
  67. projectile = item.getItemId();
  68. break;
  69. }
  70. }
  71. }
  72. boolean soulArrow = player.getBuffedValue(MapleBuffStat.SOULARROW) != null;
  73. boolean shadowClaw = player.getBuffedValue(MapleBuffStat.SHADOW_CLAW) != null;
  74. if (!soulArrow && !shadowClaw) {
  75. int bulletConsume = bulletCount;
  76. if (effect != null && effect.getBulletConsume() != 0) {
  77. bulletConsume = effect.getBulletConsume() * (hasShadowPartner ? 2 : 1);
  78. }
  79. MapleInventoryManipulator.removeById(c, MapleInventoryType.USE, projectile, bulletConsume, false, true, true);
  80. }
  81. if (projectile != 0 || soulArrow) {
  82. int visProjectile = projectile; //visible projectile sent to players
  83. if (mii.isThrowingStar(projectile)) {
  84. //see if player has cash stars
  85. MapleInventory cash = player.getInventory(MapleInventoryType.CASH);
  86. for (int i = 0; i < 255; i++) { // impose order...
  87. IItem item = cash.getItem((byte) i);
  88. if (item != null) {
  89. //cash stars have prefix 5021xxx
  90. if (item.getItemId() / 1000 == 5021) {
  91. visProjectile = item.getItemId();
  92. break;
  93. }
  94. }
  95. }
  96. } else {
  97. if (soulArrow || attack.skill == 3111004 || attack.skill == 3211004) {
  98. visProjectile = 0;
  99. }
  100. }
  101. MaplePacket packet;
  102. if (attack.skill == 3121004 || attack.skill == 3221001) { // pierce and hurricane
  103. packet = MaplePacketCreator.rangedAttack(player.getId(), attack.skill, attack.direction, attack.numAttackedAndDamage, visProjectile, attack.allDamage);
  104. } else {
  105. packet = MaplePacketCreator.rangedAttack(player.getId(), attack.skill, attack.stance, attack.numAttackedAndDamage, visProjectile, attack.allDamage);
  106. }
  107. player.getMap().broadcastMessage(player, packet, false, true);
  108. int basedamage;
  109. int projectileWatk = 0;
  110. if (projectile != 0) {
  111. projectileWatk = mii.getWatkForProjectile(projectile);
  112. }
  113. if (attack.skill != 4001344) { // not lucky 7
  114. if (projectileWatk != 0) {
  115. basedamage = c.getPlayer().calculateMaxBaseDamage(c.getPlayer().getTotalWatk() + projectileWatk);
  116. } else {
  117. basedamage = c.getPlayer().getCurrentMaxBaseDamage();
  118. }
  119. } else { // l7 has a different formula :>
  120. basedamage = (int) (((c.getPlayer().getTotalLuk() * 5.0) / 100.0) * (c.getPlayer().getTotalWatk() + projectileWatk));
  121. }
  122. if (attack.skill == 3101005) { //arrowbomb is hardcore like that o.o
  123. basedamage *= effect.getX() / 100.0;
  124. }
  125. //if (player.getReborns() > 0) {
  126. // basedamage *= ((player.getReborns() / 5) + 1);
  127. //}
  128. int maxdamage = basedamage;
  129. double critdamagerate = 0.0;
  130. if (player.getJob().isA(MapleJob.ASSASSIN)) {
  131. ISkill criticalthrow = SkillFactory.getSkill(4100001);
  132. int critlevel = player.getSkillLevel(criticalthrow);
  133. if (critlevel > 0) {
  134. critdamagerate = (criticalthrow.getEffect(player.getSkillLevel(criticalthrow)).getDamage() / 100.0);
  135. }
  136. } else if (player.getJob().isA(MapleJob.BOWMAN)) {
  137. ISkill criticalshot = SkillFactory.getSkill(3000001);
  138. int critlevel = player.getSkillLevel(criticalshot);
  139. if (critlevel > 0) {
  140. critdamagerate = (criticalshot.getEffect(critlevel).getDamage() / 100.0) - 1.0;
  141. }
  142. }
  143. int critdamage = (int) (basedamage * critdamagerate);
  144. if (effect != null) {
  145. maxdamage *= effect.getDamage() / 100.0;
  146. }
  147. maxdamage += critdamage;
  148. maxdamage *= damageBulletCount;
  149. if (hasShadowPartner) {
  150. ISkill shadowPartner = SkillFactory.getSkill(4111002);
  151. int shadowPartnerLevel = player.getSkillLevel(shadowPartner);
  152. MapleStatEffect shadowPartnerEffect = shadowPartner.getEffect(shadowPartnerLevel);
  153. if (attack.skill != 0) {
  154. maxdamage *= (1.0 + shadowPartnerEffect.getY() / 100.0);
  155. } else {
  156. maxdamage *= (1.0 + shadowPartnerEffect.getX() / 100.0);
  157. }
  158. }
  159. if (attack.skill == 4111004) {
  160. maxdamage = 35000;
  161. }
  162. if (effect != null) {
  163. int money = effect.getMoneyCon();
  164. if (money != 0) {
  165. double moneyMod = money * 0.5;
  166. money = (int) (money + Math.random() * moneyMod);
  167. if (money > player.getMeso()) {
  168. money = player.getMeso();
  169. }
  170. player.gainMeso(-money, false);
  171. }
  172. }
  173. if (attack.skill == 3221007) {
  174. ISkill skill = SkillFactory.getSkill(attack.skill);
  175. int skillLevel = c.getPlayer().getSkillLevel(skill);
  176. MapleStatEffect effect_ = skill.getEffect(skillLevel);
  177. if (effect_.getCooldown() > 0) {
  178. c.getSession().write(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown() / 5));
  179. if (effect_.getCooldown() > 0) {
  180. c.getSession().write(MaplePacketCreator.skillCooldown(attack.skill, effect_.getCooldown() / 5));
  181. ScheduledFuture<?> timer = TimerManager.getInstance().schedule(new CancelCooldownAction(c.getPlayer(), attack.skill), effect_.getCooldown() * 200);
  182. c.getPlayer().addCooldown(attack.skill, System.currentTimeMillis(), effect_.getCooldown() * 200, timer);
  183. }
  184. }
  185. }
  186. applyAttack(attack, player, maxdamage, bulletCount);
  187. }
  188. }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement