Combat.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package com.gmail.nossr50;
  2. import org.bukkit.ChatColor;
  3. import org.bukkit.Location;
  4. import org.bukkit.entity.Animals;
  5. import org.bukkit.entity.Creature;
  6. import org.bukkit.entity.Creeper;
  7. import org.bukkit.entity.Entity;
  8. import org.bukkit.entity.Monster;
  9. import org.bukkit.entity.PigZombie;
  10. import org.bukkit.entity.Player;
  11. import org.bukkit.entity.Skeleton;
  12. import org.bukkit.entity.Spider;
  13. import org.bukkit.entity.Squid;
  14. import org.bukkit.entity.Wolf;
  15. import org.bukkit.entity.Zombie;
  16. import org.bukkit.event.entity.EntityDamageByEntityEvent;
  17. import org.bukkit.event.entity.EntityDamageByProjectileEvent;
  18. import org.bukkit.event.entity.EntityDamageEvent;
  19. import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
  20. import org.bukkit.inventory.ItemStack;
  21. import org.bukkit.plugin.Plugin;
  22. import com.gmail.nossr50.config.Config;
  23. import com.gmail.nossr50.config.LoadProperties;
  24. import com.gmail.nossr50.datatypes.PlayerProfile;
  25. import com.gmail.nossr50.party.Party;
  26. import com.gmail.nossr50.skills.Acrobatics;
  27. import com.gmail.nossr50.skills.Axes;
  28. import com.gmail.nossr50.skills.Skills;
  29. import com.gmail.nossr50.skills.Swords;
  30. import com.gmail.nossr50.skills.Taming;
  31. import com.gmail.nossr50.skills.Unarmed;
  32. public class Combat {
  33. private static mcMMO plugin;
  34. public Combat(mcMMO instance) {
  35. plugin = instance;
  36. }
  37. public static void combatChecks(EntityDamageEvent event, Plugin pluginx){
  38. if(event.isCancelled() || event.getDamage() == 0)
  39. return;
  40. /*
  41. * OFFENSIVE CHECKS FOR PLAYERS VERSUS ENTITIES
  42. */
  43. if(event instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) event).getDamager() instanceof Player)
  44. {
  45. //Declare Things
  46. EntityDamageByEntityEvent eventb = (EntityDamageByEntityEvent) event;
  47. Player attacker = (Player)((EntityDamageByEntityEvent) event).getDamager();
  48. PlayerProfile PPa = Users.getProfile(attacker);
  49. //Damage modifiers
  50. if(mcPermissions.getInstance().unarmed(attacker) && attacker.getItemInHand().getTypeId() == 0) //Unarmed
  51. Unarmed.unarmedBonus(attacker, eventb);
  52. if(m.isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker) && PPa.getAxesInt() >= 500)
  53. event.setDamage(event.getDamage()+4);
  54. //If there are any abilities to activate
  55. combatAbilityChecks(attacker, PPa, pluginx);
  56. //Check for offensive procs
  57. if(mcPermissions.getInstance().axes(attacker))
  58. Axes.axeCriticalCheck(attacker, eventb, pluginx); //Axe Criticals
  59. if(!Config.getInstance().isBleedTracked(event.getEntity())) //Swords Bleed
  60. Swords.bleedCheck(attacker, event.getEntity(), pluginx);
  61. if(event.getEntity() instanceof Player && mcPermissions.getInstance().unarmed(attacker)){
  62. Player defender = (Player)event.getEntity();
  63. Unarmed.disarmProcCheck(attacker, defender);
  64. }
  65. //Modify the event damage if Attacker is Berserk
  66. if(PPa.getBerserkMode())
  67. event.setDamage(event.getDamage() + (event.getDamage() / 2));
  68. //Handle Ability Interactions
  69. if(PPa.getSkullSplitterMode() && m.isAxes(attacker.getItemInHand()))
  70. Axes.applyAoeDamage(attacker, eventb, pluginx);
  71. if(PPa.getSerratedStrikesMode() && m.isSwords(attacker.getItemInHand()))
  72. Swords.applySerratedStrikes(attacker, eventb, pluginx);
  73. //Experience
  74. if(event.getEntity() instanceof Player)
  75. {
  76. Player defender = (Player)event.getEntity();
  77. PlayerProfile PPd = Users.getProfile(defender);
  78. if(attacker != null && defender != null && LoadProperties.pvpxp)
  79. {
  80. if(System.currentTimeMillis() >= PPd.getRespawnATS() + 5000 && defender.getHealth() >= 1)
  81. {
  82. if(m.isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker))
  83. PPa.addAxesXP((event.getDamage() * 3) * LoadProperties.pvpxprewardmodifier);
  84. if(m.isSwords(attacker.getItemInHand()) && mcPermissions.getInstance().swords(attacker))
  85. PPa.addSwordsXP((event.getDamage() * 3) * LoadProperties.pvpxprewardmodifier);
  86. if(attacker.getItemInHand().getTypeId() == 0 && mcPermissions.getInstance().unarmed(attacker))
  87. PPa.addUnarmedXP((event.getDamage() * 3) * LoadProperties.pvpxprewardmodifier);
  88. }
  89. }
  90. }
  91. if(event.getEntity() instanceof Monster)
  92. {
  93. int xp = 0;
  94. if(event.getEntity() instanceof Creeper)
  95. xp = (event.getDamage() * 4) * LoadProperties.xpGainMultiplier;
  96. if(event.getEntity() instanceof Spider)
  97. xp = (event.getDamage() * 3) * LoadProperties.xpGainMultiplier;
  98. if(event.getEntity() instanceof Skeleton)
  99. xp = (event.getDamage() * 2) * LoadProperties.xpGainMultiplier;
  100. if(event.getEntity() instanceof Zombie)
  101. xp = (event.getDamage() * 2) * LoadProperties.xpGainMultiplier;
  102. if(event.getEntity() instanceof PigZombie)
  103. xp = (event.getDamage() * 3) * LoadProperties.xpGainMultiplier;
  104. if(m.isSwords(attacker.getItemInHand()) && mcPermissions.getInstance().swords(attacker))
  105. PPa.addSwordsXP(xp);
  106. if(m.isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker))
  107. PPa.addAxesXP(xp);
  108. if(attacker.getItemInHand().getTypeId() == 0 && mcPermissions.getInstance().unarmed(attacker))
  109. PPa.addUnarmedXP(xp);
  110. }
  111. Skills.XpCheck(attacker);
  112. //Taming Debug Stuff
  113. if(event.getEntity() instanceof Wolf)
  114. {
  115. if(Party.getInstance().inSameParty(attacker, Taming.getOwner(event.getEntity(), pluginx)))
  116. event.setCancelled(true);
  117. if(attacker.getItemInHand().getTypeId() == 352 && mcPermissions.getInstance().taming(attacker))
  118. {
  119. attacker.sendMessage(ChatColor.GREEN+"**You examine the Wolf using Beast Lore**");
  120. if(Taming.getOwnerName(event.getEntity()) != null)
  121. attacker.sendMessage(ChatColor.DARK_GREEN+"The Beast's Master : "+Taming.getOwnerName(event.getEntity()));
  122. else
  123. attacker.sendMessage(ChatColor.GRAY+"This Beast has no Master...");
  124. attacker.sendMessage(ChatColor.GREEN+"This beast has "+((Wolf)event.getEntity()).getHealth()+" Health");
  125. event.setCancelled(true);
  126. }
  127. }
  128. }
  129. /*
  130. * OFFENSIVE CHECKS FOR WOLVES VERSUS ENTITIES
  131. */
  132. if(event instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) event).getDamager() instanceof Wolf)
  133. {
  134. EntityDamageByEntityEvent eventb = (EntityDamageByEntityEvent) event;
  135. if(Taming.hasOwner(eventb.getDamager(), pluginx))
  136. {
  137. Player master = Taming.getOwner(eventb.getDamager(), pluginx);
  138. PlayerProfile PPo = Users.getProfile(master);
  139. if(mcPermissions.getInstance().taming(master)){
  140. //Sharpened Claws
  141. if(PPo.getTamingInt() >= 750)
  142. {
  143. event.setDamage(event.getDamage() + 2);
  144. }
  145. //Gore
  146. if(Math.random() * 1000 <= PPo.getTamingInt())
  147. {
  148. event.setDamage(event.getDamage() * 2);
  149. if(event.getEntity() instanceof Player)
  150. {
  151. Player target = (Player)event.getEntity();
  152. target.sendMessage(ChatColor.RED+"**STRUCK BY GORE**");
  153. Users.getProfile(target).setBleedTicks(2);
  154. }
  155. else
  156. Config.getInstance().addToBleedQue(event.getEntity());
  157. master.sendMessage(ChatColor.GREEN+"**GORE**");
  158. }
  159. }
  160. }
  161. }
  162. //Another offensive check for Archery
  163. if(event instanceof EntityDamageByProjectileEvent)
  164. archeryCheck((EntityDamageByProjectileEvent) event);
  165. /*
  166. * DEFENSIVE CHECKS
  167. */
  168. if(event instanceof EntityDamageByEntityEvent && event.getEntity() instanceof Player)
  169. {
  170. Player defender = (Player)event.getEntity();
  171. Swords.parryCheck((EntityDamageByEntityEvent) event, defender);
  172. Swords.counterAttackChecks(event);
  173. Acrobatics.dodgeChecks((EntityDamageByEntityEvent)event);
  174. }
  175. /*
  176. * DEFENSIVE CHECKS FOR WOLVES
  177. */
  178. if(event.getEntity() instanceof Wolf){
  179. if(Taming.hasOwner(event.getEntity(), pluginx))
  180. {
  181. Player master = Taming.getOwner(event.getEntity(), pluginx);
  182. PlayerProfile PPo = Users.getProfile(master);
  183. if(mcPermissions.getInstance().taming(master))
  184. {
  185. /*
  186. * TEMPORARY FIX AS WOLVES AREN'T TRIGGERING DAMAGE EVENTS WHEN ATTACKING NON PLAYERS AT THE TIME OF WRITING
  187. */
  188. if(!event.isCancelled() && event.getCause() != DamageCause.LIGHTNING){
  189. PPo.addTamingXP(event.getDamage() * 3);
  190. Skills.XpCheck(master);
  191. }
  192. //Shock-Proof
  193. if((event.getCause() == DamageCause.ENTITY_EXPLOSION || event.getCause() == DamageCause.BLOCK_EXPLOSION) && PPo.getTamingInt() >= 500)
  194. {
  195. event.setDamage(2);
  196. }
  197. //Thick Fur
  198. if(PPo.getTamingInt() >= 250)
  199. event.setDamage(event.getDamage() / 2);
  200. }
  201. }
  202. }
  203. }
  204. public static void combatAbilityChecks(Player attacker, PlayerProfile PPa, Plugin pluginx)
  205. {
  206. //Check to see if any abilities need to be activated
  207. if(PPa.getAxePreparationMode())
  208. Axes.skullSplitterCheck(attacker, pluginx);
  209. if(PPa.getSwordsPreparationMode())
  210. Swords.serratedStrikesActivationCheck(attacker, pluginx);
  211. if(PPa.getFistsPreparationMode())
  212. Unarmed.berserkActivationCheck(attacker, pluginx);
  213. }
  214. public static void archeryCheck(EntityDamageByProjectileEvent event){
  215. Entity y = event.getDamager();
  216. Entity x = event.getEntity();
  217. if(event.getProjectile().toString().equals("CraftArrow") && x instanceof Player){
  218. Player defender = (Player)x;
  219. PlayerProfile PPd = Users.getProfile(defender);
  220. if(PPd == null)
  221. Users.addUser(defender);
  222. if(mcPermissions.getInstance().unarmed(defender) && defender.getItemInHand().getTypeId() == 0){
  223. if(defender != null && PPd.getUnarmedInt() >= 1000){
  224. if(Math.random() * 1000 <= 500){
  225. event.setCancelled(true);
  226. defender.sendMessage(ChatColor.WHITE+"**ARROW DEFLECT**");
  227. return;
  228. }
  229. } else if(defender != null && Math.random() * 1000 <= (PPd.getUnarmedInt() / 2)){
  230. event.setCancelled(true);
  231. defender.sendMessage(ChatColor.WHITE+"**ARROW DEFLECT**");
  232. return;
  233. }
  234. }
  235. }
  236. /*
  237. * If attacker is player
  238. */
  239. if(y instanceof Player){
  240. Player attacker = (Player)y;
  241. PlayerProfile PPa = Users.getProfile(attacker);
  242. if(event.getProjectile().toString().equals("CraftArrow") && mcPermissions.getInstance().archery(attacker)){
  243. if(!Config.getInstance().isTracked(x) && event.getDamage() > 0){
  244. Config.getInstance().addArrowTrack(x, 0);
  245. if(attacker != null){
  246. if(Math.random() * 1000 <= PPa.getArcheryInt()){
  247. Config.getInstance().addArrowCount(x, 1);
  248. }
  249. }
  250. } else {
  251. if(event.getDamage() > 0){
  252. if(attacker != null){
  253. if(Math.random() * 1000 <= PPa.getArcheryInt()){
  254. Config.getInstance().addArrowCount(x, 1);
  255. }
  256. }
  257. }
  258. }
  259. /*
  260. * DAMAGE MODIFIER
  261. */
  262. if(PPa.getArcheryInt() >= 50 && PPa.getArcheryInt() < 250)
  263. event.setDamage(event.getDamage()+1);
  264. if(PPa.getArcheryInt() >= 250 && PPa.getArcheryInt() < 575)
  265. event.setDamage(event.getDamage()+2);
  266. if(PPa.getArcheryInt() >= 575 && PPa.getArcheryInt() < 725)
  267. event.setDamage(event.getDamage()+3);
  268. if(PPa.getArcheryInt() >= 725 && PPa.getArcheryInt() < 1000)
  269. event.setDamage(event.getDamage()+4);
  270. if(PPa.getArcheryInt() >= 1000)
  271. event.setDamage(event.getDamage()+5);
  272. /*
  273. * IGNITION
  274. */
  275. if(Math.random() * 100 >= 75){
  276. int ignition = 20;
  277. if(PPa.getArcheryInt() >= 200)
  278. ignition+=20;
  279. if(PPa.getArcheryInt() >= 400)
  280. ignition+=20;
  281. if(PPa.getArcheryInt() >= 600)
  282. ignition+=20;
  283. if(PPa.getArcheryInt() >= 800)
  284. ignition+=20;
  285. if(PPa.getArcheryInt() >= 1000)
  286. ignition+=20;
  287. if(x instanceof Player){
  288. Player Defender = (Player)x;
  289. if(!Party.getInstance().inSameParty(attacker, Defender)){
  290. event.getEntity().setFireTicks(ignition);
  291. attacker.sendMessage(ChatColor.RED+"**IGNITION**");
  292. Defender.sendMessage(ChatColor.DARK_RED+"You were struck by a burning arrow!");
  293. }
  294. } else {
  295. event.getEntity().setFireTicks(ignition);
  296. attacker.sendMessage(ChatColor.RED+"**IGNITION**");
  297. }
  298. }
  299. /*
  300. * Defender is Monster
  301. */
  302. if(x instanceof Monster){
  303. //XP
  304. if(!Config.getInstance().isMobSpawnTracked(x)){
  305. if(x instanceof Creeper)
  306. PPa.addArcheryXP((event.getDamage() * 4) * LoadProperties.xpGainMultiplier);
  307. if(x instanceof Spider)
  308. PPa.addArcheryXP((event.getDamage() * 3) * LoadProperties.xpGainMultiplier);
  309. if(x instanceof Skeleton)
  310. PPa.addArcheryXP((event.getDamage() * 2) * LoadProperties.xpGainMultiplier);
  311. if(x instanceof Zombie)
  312. PPa.addArcheryXP((event.getDamage() * 2) * LoadProperties.xpGainMultiplier);
  313. if(x instanceof PigZombie)
  314. PPa.addArcheryXP((event.getDamage() * 3) * LoadProperties.xpGainMultiplier);
  315. }
  316. }
  317. /*
  318. * Attacker is Player
  319. */
  320. if(x instanceof Player){
  321. if(LoadProperties.pvp == false){
  322. event.setCancelled(true);
  323. return;
  324. }
  325. Player defender = (Player)x;
  326. PlayerProfile PPd = Users.getProfile(defender);
  327. /*
  328. * Stuff for the daze proc
  329. */
  330. if(PPa.inParty() && PPd.inParty()){
  331. if(Party.getInstance().inSameParty(defender, attacker)){
  332. event.setCancelled(true);
  333. return;
  334. }
  335. }
  336. /*
  337. * PVP XP
  338. */
  339. if(LoadProperties.pvpxp && !Party.getInstance().inSameParty(attacker, defender)){
  340. PPa.addArcheryXP((event.getDamage() * 3) * LoadProperties.pvpxprewardmodifier);
  341. }
  342. /*
  343. * DAZE PROC
  344. */
  345. Location loc = defender.getLocation();
  346. if(Math.random() * 10 > 5){
  347. loc.setPitch(90);
  348. } else {
  349. loc.setPitch(-90);
  350. }
  351. if(PPa.getArcheryInt() >= 1000){
  352. if(Math.random() * 1000 <= 500){
  353. defender.teleportTo(loc);
  354. defender.sendMessage(ChatColor.DARK_RED+"Touched Fuzzy. Felt Dizzy.");
  355. attacker.sendMessage("Target was "+ChatColor.DARK_RED+"Dazed");
  356. }
  357. } else if(Math.random() * 2000 <= PPa.getArcheryInt()){
  358. defender.teleportTo(loc);
  359. defender.sendMessage(ChatColor.DARK_RED+"Touched Fuzzy. Felt Dizzy.");
  360. attacker.sendMessage("Target was "+ChatColor.DARK_RED+"Dazed");
  361. }
  362. }
  363. }
  364. Skills.XpCheck(attacker);
  365. }
  366. }
  367. public static void dealDamage(Entity target, int dmg){
  368. if(target instanceof Player){
  369. ((Player) target).damage(dmg);
  370. }
  371. if(target instanceof Animals){
  372. ((Animals) target).damage(dmg);
  373. }
  374. if(target instanceof Monster){
  375. ((Monster) target).damage(dmg);
  376. }
  377. }
  378. }