mirror of
https://github.com/2006-Scape/2006Scape.git
synced 2026-07-03 00:31:51 +00:00
32bbf1e003
- Fixed npc drops/anims - Fixed some combat sounds that were not working - Made Kalphite Queen a multi area
2325 lines
73 KiB
Java
2325 lines
73 KiB
Java
package com.rebotted.game.content.combat;
|
|
|
|
import com.rebotted.GameConstants;
|
|
import com.rebotted.GameEngine;
|
|
import com.rebotted.game.content.combat.magic.CastOnOther;
|
|
import com.rebotted.game.content.combat.magic.MagicData;
|
|
import com.rebotted.game.content.combat.magic.MagicMaxHit;
|
|
import com.rebotted.game.content.combat.magic.MagicRequirements;
|
|
import com.rebotted.game.content.combat.magic.MagicSpells;
|
|
import com.rebotted.game.content.combat.melee.MeleeData;
|
|
import com.rebotted.game.content.combat.melee.MeleeMaxHit;
|
|
import com.rebotted.game.content.combat.npcs.NpcEmotes;
|
|
import com.rebotted.game.content.combat.prayer.PrayerDrain;
|
|
import com.rebotted.game.content.combat.range.RangeData;
|
|
import com.rebotted.game.content.combat.range.RangeMaxHit;
|
|
import com.rebotted.game.content.minigames.FightCaves;
|
|
import com.rebotted.game.content.minigames.FightPits;
|
|
import com.rebotted.game.content.minigames.PestControl;
|
|
import com.rebotted.game.content.minigames.castlewars.CastleWars;
|
|
import com.rebotted.game.content.music.sound.CombatSounds;
|
|
import com.rebotted.game.content.music.sound.SoundList;
|
|
import com.rebotted.game.content.skills.slayer.SlayerRequirements;
|
|
import com.rebotted.game.items.ItemAssistant;
|
|
import com.rebotted.game.npcs.Npc;
|
|
import com.rebotted.game.npcs.NpcHandler;
|
|
import com.rebotted.game.players.Client;
|
|
import com.rebotted.game.players.Player;
|
|
import com.rebotted.game.players.PlayerHandler;
|
|
import com.rebotted.util.Misc;
|
|
import com.rebotted.world.clip.PathFinder;
|
|
|
|
/**
|
|
* Rewritten Combat (somewhat)
|
|
* @author Andrew (Mr Extremez)
|
|
|
|
*/
|
|
|
|
public class CombatAssistant {
|
|
|
|
private final Player c;
|
|
|
|
public CombatAssistant(Player player) {
|
|
c = player;
|
|
}
|
|
|
|
public static boolean inCombat(Client c) {
|
|
if (c.underAttackBy > 0 || c.underAttackBy2 > 0) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void delayedHit(int i) { // npc hit delay
|
|
if (NpcHandler.npcs[i] != null) {
|
|
if (NpcHandler.npcs[i].isDead) {
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].attackTimer <= 3 || NpcHandler.npcs[i].attackTimer == 0 && NpcHandler.npcs[i].hitDelayTimer > 0 && !c.castingMagic) { // block animation
|
|
NpcHandler.npcs[i].animNumber = NpcEmotes.getBlockEmote(i); // block emote
|
|
NpcHandler.npcs[i].animUpdateRequired = true;
|
|
NpcHandler.npcs[i].updateRequired = true;
|
|
}
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender().sendSound(CombatSounds.getNpcBlockSound(NpcHandler.npcs[c.oldNpcIndex].npcType), 100, 0);
|
|
}
|
|
NpcHandler.npcs[i].facePlayer(c.playerId);
|
|
if (NpcHandler.npcs[i].underAttackBy > 0 && GameEngine.npcHandler.getsPulled(c, i)) {
|
|
NpcHandler.npcs[i].killerId = c.playerId;
|
|
} else if (NpcHandler.npcs[i].underAttackBy < 0 && !GameEngine.npcHandler.getsPulled(c, i)) {
|
|
NpcHandler.npcs[i].killerId = c.playerId;
|
|
}
|
|
c.lastNpcAttacked = i;
|
|
if (c.projectileStage == 0) { // melee hit damage
|
|
applyNpcMeleeDamage(i, 1);
|
|
if (c.doubleHit) {
|
|
applyNpcMeleeDamage(i, 2);
|
|
}
|
|
}
|
|
if (!c.castingMagic && c.projectileStage > 0) { // range hit
|
|
// damage
|
|
int damage = Misc.random(rangeMaxHit());
|
|
int damage2 = -1;
|
|
if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
|
|
damage2 = Misc.random(rangeMaxHit());
|
|
}
|
|
boolean ignoreDef = false;
|
|
if (Misc.random(5) == 1 && c.lastArrowUsed == 9243) {
|
|
ignoreDef = true;
|
|
NpcHandler.npcs[i].gfx0(758);
|
|
}
|
|
|
|
if (Misc.random(NpcHandler.npcs[i].defence) > Misc
|
|
.random(10 + calculateRangeAttack()) && !ignoreDef) {
|
|
damage = 0;
|
|
} else if (NpcHandler.npcs[i].npcType == 2881
|
|
|| NpcHandler.npcs[i].npcType == 2883 && !ignoreDef) {
|
|
damage = 0;
|
|
}
|
|
|
|
if (Misc.random(4) == 1 && c.lastArrowUsed == 9242 && damage > 0) {
|
|
NpcHandler.npcs[i].gfx0(754);
|
|
damage = NpcHandler.npcs[i].HP / 5;
|
|
c.handleHitMask(c.playerLevel[3] / 10);
|
|
c.dealDamage(c.playerLevel[3] / 10);
|
|
c.gfx0(754);
|
|
}
|
|
|
|
if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
|
|
if (Misc.random(NpcHandler.npcs[i].defence) > Misc.random(10 + calculateRangeAttack())) {
|
|
damage2 = 0;
|
|
}
|
|
}
|
|
if (c.dbowSpec) {
|
|
NpcHandler.npcs[i].gfx100(1100);
|
|
if (damage < 8) {
|
|
damage = 8;
|
|
}
|
|
if (damage2 < 8) {
|
|
damage2 = 8;
|
|
}
|
|
c.dbowSpec = false;
|
|
}
|
|
if (damage > 0 && Misc.random(5) == 1
|
|
&& c.lastArrowUsed == 9244) {
|
|
damage *= 1.45;
|
|
NpcHandler.npcs[i].gfx0(756);
|
|
}
|
|
|
|
if (NpcHandler.npcs[i].HP - damage < 0) {
|
|
damage = NpcHandler.npcs[i].HP;
|
|
}
|
|
if (NpcHandler.npcs[i].HP - damage <= 0 && damage2 > 0) {
|
|
damage2 = 0;
|
|
}
|
|
c.globalDamageDealt += damage;
|
|
if (damage2 > 0)
|
|
{
|
|
c.globalDamageDealt += damage2;
|
|
}
|
|
if (c.fightMode == 3) {//range shared
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.RANGE_EXP_RATE / 3, 4);
|
|
c.getPlayerAssistant().addSkillXP(damage / 3, 1);
|
|
c.getPlayerAssistant().addSkillXP(damage / 3, 3);
|
|
c.getPlayerAssistant().refreshSkill(1);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(4);
|
|
} else {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.RANGE_EXP_RATE, 4);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.RANGE_EXP_RATE /3, 3);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(4);
|
|
}
|
|
if (damage > 0) {
|
|
if (NpcHandler.npcs[i].npcType >= 3777 && NpcHandler.npcs[i].npcType <= 3780 || PestControl.npcIsPCMonster(NpcHandler.npcs[i].npcType)) {
|
|
c.pcDamage += damage;
|
|
}
|
|
}
|
|
boolean dropArrows = true;
|
|
|
|
for (int noArrowId : RangeData.NO_ARROW_DROP) {
|
|
if (c.lastWeaponUsed == noArrowId) {
|
|
dropArrows = false;
|
|
break;
|
|
}
|
|
}
|
|
if (dropArrows) {
|
|
c.getItemAssistant().dropArrowNpc();
|
|
}
|
|
if (NpcHandler.npcs[i].npcType == FightCaves.TZTOK_JAD && NpcHandler.npcs[i].spawnedBy == c.getId() && ((NpcHandler.npcs[i].HP < (FightCaves.getHp(FightCaves.TZTOK_JAD)/2)) &&
|
|
(NpcHandler.npcs[i].HP-damage+(damage2 > -1 ? damage2 : 0) < (FightCaves.getHp(FightCaves.TZTOK_JAD)/2)))) {
|
|
if (c.canHealersRespawn) {
|
|
FightCaves.spawnHealers(c, i, 4-c.spawnedHealers);
|
|
}
|
|
}
|
|
NpcHandler.npcs[i].underAttack = true;
|
|
NpcHandler.npcs[i].hitDiff = damage;
|
|
NpcHandler.npcs[i].HP -= damage;
|
|
if (damage2 > -1) {
|
|
NpcHandler.npcs[i].hitDiff2 = damage2;
|
|
NpcHandler.npcs[i].HP -= damage2;
|
|
c.totalDamageDealt += damage2;
|
|
}
|
|
if (c.killingNpcIndex != c.oldNpcIndex) {
|
|
c.totalDamageDealt = 0;
|
|
}
|
|
c.killingNpcIndex = c.oldNpcIndex;
|
|
c.totalDamageDealt += damage;
|
|
NpcHandler.npcs[i].hitUpdateRequired = true;
|
|
if (damage2 > -1) {
|
|
NpcHandler.npcs[i].hitUpdateRequired2 = true;
|
|
}
|
|
NpcHandler.npcs[i].updateRequired = true;
|
|
|
|
} else if (c.projectileStage > 0) { // magic hit damage
|
|
int damage = Misc
|
|
.random(MagicData.MAGIC_SPELLS[c.oldSpellId][6]);
|
|
if (MagicSpells.godSpells(c)) {
|
|
if (System.currentTimeMillis() - c.godSpellDelay < CombatConstants.GOD_SPELL_CHARGE) {
|
|
damage += Misc.random(10);
|
|
}
|
|
}
|
|
boolean magicFailed = false;
|
|
// c.npcIndex = 0;
|
|
int bonusAttack = getBonusAttack(i);
|
|
if (Misc.random(NpcHandler.npcs[i].defence) > 10
|
|
+ Misc.random(mageAtk()) + bonusAttack) {
|
|
damage = 0;
|
|
magicFailed = true;
|
|
} else if (NpcHandler.npcs[i].npcType == 2881
|
|
|| NpcHandler.npcs[i].npcType == 2882) {
|
|
damage = 0;
|
|
magicFailed = true;
|
|
}
|
|
|
|
if (NpcHandler.npcs[i].npcType == FightCaves.TZTOK_JAD && NpcHandler.npcs[i].spawnedBy == c.getId() && ((NpcHandler.npcs[i].HP > (FightCaves.getHp(FightCaves.TZTOK_JAD)/2)) &&
|
|
(NpcHandler.npcs[i].HP-damage < (FightCaves.getHp(FightCaves.TZTOK_JAD)/2)))) {
|
|
if (c.canHealersRespawn)
|
|
FightCaves.spawnHealers(c, i, 4-c.spawnedHealers);
|
|
}
|
|
|
|
if (NpcHandler.npcs[i].HP - damage < 0) {
|
|
damage = NpcHandler.npcs[i].HP;
|
|
}
|
|
//magic
|
|
c.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[c.oldSpellId][7] + damage * CombatConstants.MAGIC_EXP_RATE, 6);
|
|
c.totalDamageDealt += damage;
|
|
if (MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1161 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1153 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1157 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1542 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1543 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1562) {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MAGIC_EXP_RATE / 3, 3);
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(6);
|
|
|
|
if (damage > 0) {
|
|
if (NpcHandler.npcs[i].npcType >= 3777 && NpcHandler.npcs[i].npcType <= 3780 || PestControl.npcIsPCMonster(NpcHandler.npcs[i].npcType)) {
|
|
c.pcDamage += damage;
|
|
}
|
|
}
|
|
if (MagicSpells.getEndGfxHeight(c) == 100 && !magicFailed) { // end GFX
|
|
NpcHandler.npcs[i]
|
|
.gfx100(MagicData.MAGIC_SPELLS[c.oldSpellId][5]);
|
|
} else if (!magicFailed) {
|
|
NpcHandler.npcs[i]
|
|
.gfx0(MagicData.MAGIC_SPELLS[c.oldSpellId][5]);
|
|
}
|
|
|
|
if (magicFailed) {
|
|
NpcHandler.npcs[i].gfx100(85);
|
|
}
|
|
if (!magicFailed) {
|
|
int freezeDelay = MagicSpells.getFreezeTime(c);// freeze
|
|
if (freezeDelay > 0 && NpcHandler.npcs[i].freezeTimer == 0) {
|
|
NpcHandler.npcs[i].freezeTimer = freezeDelay;
|
|
}
|
|
switch (MagicData.MAGIC_SPELLS[c.oldSpellId][0]) {
|
|
case 12901:
|
|
case 12919: // blood spells
|
|
case 12911:
|
|
case 12929:
|
|
int heal = Misc.random(damage / 2);
|
|
if (c.playerLevel[3] + heal >= c.getPlayerAssistant()
|
|
.getLevelForXP(c.playerXP[3])) {
|
|
c.playerLevel[3] = c.getPlayerAssistant()
|
|
.getLevelForXP(c.playerXP[3]);
|
|
} else {
|
|
c.playerLevel[3] += heal;
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
break;
|
|
}
|
|
|
|
}
|
|
NpcHandler.npcs[i].underAttack = true;
|
|
if (MagicData.MAGIC_SPELLS[c.oldSpellId][6] != 0) {
|
|
NpcHandler.npcs[i].hitDiff = damage;
|
|
NpcHandler.npcs[i].HP -= damage;
|
|
NpcHandler.npcs[i].hitUpdateRequired = true;
|
|
c.totalDamageDealt += damage;
|
|
}
|
|
c.killingNpcIndex = c.oldNpcIndex;
|
|
NpcHandler.npcs[i].updateRequired = true;
|
|
c.usingMagic = false;
|
|
c.castingMagic = false;
|
|
c.oldSpellId = 0;
|
|
}
|
|
}
|
|
|
|
if (c.bowSpecShot <= 0) {
|
|
c.oldNpcIndex = 0;
|
|
c.projectileStage = 0;
|
|
c.doubleHit = false;
|
|
c.lastWeaponUsed = 0;
|
|
c.bowSpecShot = 0;
|
|
}
|
|
if (c.bowSpecShot >= 2) {
|
|
c.bowSpecShot = 0;
|
|
// c.attackTimer =
|
|
// getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
|
|
}
|
|
if (c.bowSpecShot == 1) {
|
|
fireProjectileNpc();
|
|
c.hitDelay = 2;
|
|
c.bowSpecShot = 0;
|
|
}
|
|
}
|
|
|
|
public void applyNpcMeleeDamage(int i, int damageMask) {
|
|
int damage = Misc.random(meleeMaxHit());
|
|
boolean fullVeracsEffect = c.getPlayerAssistant().fullVeracs()
|
|
&& Misc.random(3) == 1;
|
|
if (NpcHandler.npcs[i].HP - damage < 0) {
|
|
damage = NpcHandler.npcs[i].HP;
|
|
}
|
|
|
|
if (!fullVeracsEffect) {
|
|
if (Misc.random(NpcHandler.npcs[i].defence) > 10 + Misc
|
|
.random(calcAtt())) {
|
|
damage = 0;
|
|
} else if (NpcHandler.npcs[i].npcType == 2882
|
|
|| NpcHandler.npcs[i].npcType == 2883) {
|
|
damage = 0;
|
|
}
|
|
}
|
|
c.globalDamageDealt += damage;
|
|
if (NpcHandler.npcs[i].HP - damage > 0) {
|
|
if (NpcHandler.npcs[i].npcType == FightCaves.TZTOK_JAD && NpcHandler.npcs[i].spawnedBy == c.getId() && ((NpcHandler.npcs[i].HP > (FightCaves.getHp(FightCaves.TZTOK_JAD)/2)) &&
|
|
(NpcHandler.npcs[i].HP-damage < (FightCaves.getHp(FightCaves.TZTOK_JAD)/2)))) {
|
|
if (c.canHealersRespawn)
|
|
FightCaves.spawnHealers(c, i, 4-c.spawnedHealers);
|
|
}
|
|
}
|
|
boolean guthansEffect = false;
|
|
if (c.getPlayerAssistant().fullGuthans()) {
|
|
if (Misc.random(3) == 1) {
|
|
guthansEffect = true;
|
|
}
|
|
}
|
|
if (c.fightMode == 3 && NpcHandler.npcs[i].npcType != 2459 && NpcHandler.npcs[i].npcType != 2460 && NpcHandler.npcs[i].npcType != 2461 && NpcHandler.npcs[i].npcType != 2462) {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 0);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 1);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 2);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 3);
|
|
c.getPlayerAssistant().refreshSkill(0);
|
|
c.getPlayerAssistant().refreshSkill(1);
|
|
c.getPlayerAssistant().refreshSkill(2);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
} else {
|
|
if (NpcHandler.npcs[i].npcType != 2459 && NpcHandler.npcs[i].npcType != 2460 && NpcHandler.npcs[i].npcType != 2461 && NpcHandler.npcs[i].npcType != 2462) {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE, c.fightMode);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 3);
|
|
c.getPlayerAssistant().refreshSkill(c.fightMode);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
}
|
|
}
|
|
if (damage > 0) {
|
|
if (NpcHandler.npcs[i].npcType >= 3777 && NpcHandler.npcs[i].npcType <= 3780 || PestControl.npcIsPCMonster(NpcHandler.npcs[i].npcType)) {
|
|
c.pcDamage += damage;
|
|
}
|
|
}
|
|
if (damage > 0 && guthansEffect) {
|
|
c.playerLevel[3] += damage;
|
|
if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3])) {
|
|
c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
NpcHandler.npcs[i].gfx0(398);
|
|
}
|
|
NpcHandler.npcs[i].underAttack = true;
|
|
c.killingNpcIndex = c.npcIndex;
|
|
c.lastNpcAttacked = i;
|
|
switch (c.specEffect) {
|
|
case 4:
|
|
if (damage > 0) {
|
|
if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3])) {
|
|
if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3])) {
|
|
;
|
|
} else {
|
|
c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
|
|
}
|
|
} else {
|
|
c.playerLevel[3] += damage;
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
}
|
|
break;
|
|
|
|
}
|
|
switch (damageMask) {
|
|
case 1:
|
|
NpcHandler.npcs[i].hitDiff = damage;
|
|
NpcHandler.npcs[i].HP -= damage;
|
|
c.totalDamageDealt += damage;
|
|
NpcHandler.npcs[i].hitUpdateRequired = true;
|
|
NpcHandler.npcs[i].updateRequired = true;
|
|
break;
|
|
|
|
case 2:
|
|
NpcHandler.npcs[i].hitDiff2 = damage;
|
|
NpcHandler.npcs[i].HP -= damage;
|
|
c.totalDamageDealt += damage;
|
|
NpcHandler.npcs[i].hitUpdateRequired2 = true;
|
|
NpcHandler.npcs[i].updateRequired = true;
|
|
c.doubleHit = false;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
public void fireProjectileNpc() {
|
|
if (c.oldNpcIndex > 0) {
|
|
if (NpcHandler.npcs[c.oldNpcIndex] != null) {
|
|
c.projectileStage = 2;
|
|
int pX = c.getX();
|
|
int pY = c.getY();
|
|
int nX = NpcHandler.npcs[c.oldNpcIndex].getX();
|
|
int nY = NpcHandler.npcs[c.oldNpcIndex].getY();
|
|
int offX = (pY - nY) * -1;
|
|
int offY = (pX - nX) * -1;
|
|
c.getPlayerAssistant().createPlayersProjectile(pX, pY, offX,
|
|
offY, 50, RangeData.getProjectileSpeed(c),
|
|
RangeData.getRangeProjectileGFX(c), 43, 31, c.oldNpcIndex + 1,
|
|
MagicSpells.getStartDelay(c));
|
|
if (RangeData.usingDbow(c)) {
|
|
c.getPlayerAssistant().createPlayersProjectile2(pX, pY,
|
|
offX, offY, 50, RangeData.getProjectileSpeed(c),
|
|
RangeData.getRangeProjectileGFX(c), 60, 31, c.oldNpcIndex + 1,
|
|
MagicSpells.getStartDelay(c), 35);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void attackingNpcTick() {
|
|
int i = c.npcIndex;
|
|
if (i > 0 && NpcHandler.npcs[i] != null) {
|
|
if (NpcHandler.npcs[i].isDead) {
|
|
c.npcIndex = 0;
|
|
c.followId2 = 0;
|
|
c.faceNpc(0);
|
|
return;
|
|
}
|
|
|
|
boolean projectile = c.usingBow || c.usingMagic || c.usingRangeWeapon;
|
|
if (projectile && !PathFinder.isProjectilePathClear(c.absX, c.absY, c.heightLevel, NpcHandler.npcs[i].absX, NpcHandler.npcs[i].absY)) {
|
|
return;
|
|
}
|
|
|
|
if (!c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 2) && RangeData.usingHally(c) && !c.usingRangeWeapon && !c.usingBow && !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 4) && c.usingRangeWeapon&& !c.usingBow && !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 1)&& !c.usingRangeWeapon && !RangeData.usingHally(c) && !c.usingBow && !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 8) && (c.usingBow || c.usingMagic)) {
|
|
return;
|
|
} else {
|
|
c.stopMovement();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void attackingPlayerTick() {
|
|
int i = c.playerIndex;
|
|
if (i > 0 && PlayerHandler.players[i] != null) {
|
|
if (PlayerHandler.players[i].isDead) {
|
|
c.playerIndex = 0;
|
|
c.followId = 0;
|
|
c.faceNpc(0);
|
|
return;
|
|
}
|
|
|
|
boolean projectile = c.usingBow || c.usingMagic || c.usingRangeWeapon;
|
|
if (projectile && !PathFinder.isProjectilePathClear(c.absX, c.absY, c.heightLevel, PlayerHandler.players[i].absX, PlayerHandler.players[i].absY)) {
|
|
return;
|
|
}
|
|
|
|
if (!c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(), 4)
|
|
&& c.usingRangeWeapon
|
|
&& !c.usingBow
|
|
&& !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(), 2)
|
|
&& !c.usingRangeWeapon
|
|
&& RangeData.usingHally(c)
|
|
&& !c.usingBow
|
|
&& !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(),
|
|
getRequiredDistance())
|
|
&& !c.usingRangeWeapon
|
|
&& !RangeData.usingHally(c)
|
|
&& !c.usingBow
|
|
&& !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(), 10)
|
|
&& (c.usingBow || c.usingMagic)) {
|
|
return;
|
|
} else {
|
|
c.stopMovement();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void attackNpc(int i) {
|
|
// int equippedWeapon = c.playerEquipment[c.playerWeapon];
|
|
// final int npcId = NPCHandler.npcs[i].npcType;
|
|
if (NpcHandler.npcs[i] != null) {
|
|
Npc npc = NpcHandler.npcs[i];
|
|
if (NpcHandler.npcs[i].isDead || NpcHandler.npcs[i].MaxHP <= 0) {
|
|
c.usingMagic = false;
|
|
c.faceUpdate(0);
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
/*if (c.absY == 3224 && NpcHandler.npcs[i].absY == 3225) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.absY == 3226 && NpcHandler.npcs[i].absY == 3227) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.absY == 3228 && NpcHandler.npcs[i].absY == 3227) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.absX == 3252 && c.absY > 3254 && c.absY < 3272 || c.absY == 3254 && c.absX > 3252 && c.absX < 3265) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}*/
|
|
if (c.usingMagic && MagicData.MAGIC_SPELLS[c.spellId][0] == 1171) {
|
|
if (!NpcHandler.isUndead(i)) {
|
|
c.getPacketSender().sendMessage("This spell only affects skeletons, zombies, ghosts and shades.");
|
|
resetPlayerAttack();
|
|
c.stopMovement();
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
}
|
|
if (c.respawnTimer > 0) {
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
if (!SlayerRequirements.itemNeededSlayer(c, i) || !c.getSlayer().canAttackNpc(i)) {
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].npcType == 9) {
|
|
if (c.absX == 3225 && c.absY > 3459 && c.absY < 3465 || c.absX > 3222 && c.absX < 3226 && c.absY > 3456 && c.absY < 3460
|
|
|| c.absX > 3213 && c.absX < 3223 && c.absY == 3457 || c.absX > 3202 && c.absX < 3212 && c.absY == 3457
|
|
|| c.absX > 3199 && c.absX < 3203 && c.absY > 3456 && c.absY < 3460 || c.absX == 3200 && c.absY > 3459 && c.absY < 3467) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
}
|
|
if (c.absX == 3180 && c.absY > 3433 && c.absY < 3447) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.absX > 2837 && c.absX < 2840 && c.absY == 9772) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].npcType == 757 && c.vampSlayer > 2) {
|
|
if (!c.getItemAssistant().playerHasItem(1549, 1) || !c.getItemAssistant().playerHasItem(2347, 1)) {
|
|
c.getPacketSender().sendMessage("You need a stake and hammer to attack count draynor.");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
}
|
|
if (c.isWoodcutting == true) {
|
|
c.getPacketSender().sendMessage("You can't attack an npc while woodcutting.");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].npcType == 1676) {
|
|
c.getPacketSender().sendMessage("You don't have the heart to kill the poor creature again.");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].npcType == 411) {
|
|
c.getPacketSender().sendMessage("You can't attack a swarm!");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].underAttackBy > 0 && NpcHandler.npcs[i].underAttackBy != c.playerId && !NpcHandler.npcs[i].inMulti()) {
|
|
c.npcIndex = 0;
|
|
c.getPacketSender().sendMessage("This monster is already in combat.");
|
|
return;
|
|
}
|
|
if ((c.underAttackBy > 0 || c.underAttackBy2 > 0) && c.underAttackBy2 != i && !c.inMulti()) {
|
|
resetPlayerAttack();
|
|
c.getPacketSender().sendMessage("I am already under attack.");
|
|
return;
|
|
}
|
|
if (NpcHandler.npcs[i].spawnedBy != c.playerId && NpcHandler.npcs[i].spawnedBy > 0) {
|
|
resetPlayerAttack();
|
|
c.getPacketSender().sendMessage("This monster was not spawned for you.");
|
|
return;
|
|
}
|
|
|
|
c.followId2 = i;
|
|
c.followId = 0;
|
|
if (c.attackTimer <= 0) {
|
|
c.usingBow = false;
|
|
c.usingRangeWeapon = false;
|
|
boolean usingArrows = false;
|
|
boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185;
|
|
c.bonusAttack = 0;
|
|
c.rangeItemUsed = 0;
|
|
c.projectileStage = 0;
|
|
if (c.autocasting) {
|
|
c.spellId = c.autocastId;
|
|
c.usingMagic = true;
|
|
}
|
|
if (c.spellId > 0) {
|
|
c.usingMagic = true;
|
|
}
|
|
|
|
c.specAccuracy = 1.0;
|
|
c.specDamage = 1.0;
|
|
if (!c.usingMagic) {
|
|
for (int bowId : RangeData.BOWS) {
|
|
if (c.playerEquipment[c.playerWeapon] == bowId) {
|
|
c.usingBow = true;
|
|
for (int arrowId : RangeData.ARROWS) {
|
|
if (c.playerEquipment[c.playerArrows] == arrowId) {
|
|
usingArrows = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int otherRangeId : RangeData.OTHER_RANGE_WEAPONS) {
|
|
if (c.playerEquipment[c.playerWeapon] == otherRangeId) {
|
|
c.usingRangeWeapon = true;
|
|
}
|
|
}
|
|
}
|
|
if (armaNpc(i) && !usingCross && !c.usingBow && !c.usingMagic
|
|
&& !RangeData.usingCrystalBow(c) && !c.usingRangeWeapon) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.usingRangeWeapon || c.usingBow
|
|
&& CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender().sendSound(SoundList.SHOOT_ARROW,
|
|
100, 0);
|
|
}
|
|
|
|
boolean projectile = c.usingBow || c.usingMagic || c.usingRangeWeapon;
|
|
|
|
if (projectile && !PathFinder.isProjectilePathClear(c.absX, c.absY, c.heightLevel, npc.absX, npc.absY)) {
|
|
return;
|
|
}
|
|
|
|
if (!c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 2) && RangeData.usingHally(c) && !c.usingRangeWeapon && !c.usingBow && !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 4) && c.usingRangeWeapon && !c.usingBow && !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 1) && !c.usingRangeWeapon && !RangeData.usingHally(c) && !c.usingBow && !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(), NpcHandler.npcs[i].getX(), NpcHandler.npcs[i].getY(), 8) && (c.usingBow || c.usingMagic)) {
|
|
return;
|
|
} else {
|
|
c.stopMovement();
|
|
}
|
|
|
|
if (!usingCross
|
|
&& !usingArrows
|
|
&& c.usingBow
|
|
&& (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)) {
|
|
c.getPacketSender().sendMessage(
|
|
"There is no ammo left in your quiver.");
|
|
c.stopMovement();
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
if (RangeData.correctBowAndArrows(c) < c.playerEquipment[c.playerArrows]
|
|
&& CombatConstants.CORRECT_ARROWS && c.usingBow
|
|
&& !RangeData.usingCrystalBow(c)
|
|
&& c.playerEquipment[c.playerWeapon] != 9185) {
|
|
c.getItemAssistant();
|
|
c.getItemAssistant();
|
|
c.getPacketSender().sendMessage(
|
|
"You can't use "
|
|
+ ItemAssistant.getItemName(
|
|
c.playerEquipment[c.playerArrows])
|
|
.toLowerCase()
|
|
+ "s with a "
|
|
+ ItemAssistant.getItemName(
|
|
c.playerEquipment[c.playerWeapon])
|
|
.toLowerCase() + ".");
|
|
c.stopMovement();
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
|
|
if (c.playerEquipment[c.playerWeapon] == 9185 && !properBolts()) {
|
|
c.getPacketSender().sendMessage(
|
|
"You must use bolts with a crossbow.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
if (c.usingBow
|
|
|| c.usingMagic
|
|
|| c.usingRangeWeapon
|
|
|| c.goodDistance(c.getX(), c.getY(),
|
|
NpcHandler.npcs[i].getX(),
|
|
NpcHandler.npcs[i].getY(), 2) && RangeData.usingHally(c)) {
|
|
c.stopMovement();
|
|
}
|
|
|
|
if (!checkMagicReqs(c.spellId)) {
|
|
c.stopMovement();
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
|
|
c.faceUpdate(i);
|
|
c.attackTimer = getAttackDelay();
|
|
NpcHandler.npcs[i].underAttackBy = c.playerId;
|
|
NpcHandler.npcs[i].lastDamageTaken = System.currentTimeMillis();
|
|
if (c.usingSpecial && !c.usingMagic) {
|
|
if (c.getCombatAssistant().checkSpecAmount(
|
|
c.playerEquipment[c.playerWeapon])) {
|
|
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
|
|
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
|
|
c.getSpecials().activateSpecial(
|
|
c.playerEquipment[c.playerWeapon], i);
|
|
return;
|
|
} else {
|
|
c.getPacketSender()
|
|
.sendMessage(
|
|
"You don't have the required special energy to use this attack.");
|
|
c.usingSpecial = false;
|
|
c.getItemAssistant().updateSpecialBar();
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender()
|
|
.sendSound(
|
|
CombatSounds
|
|
.specialSounds(c.playerEquipment[c.playerWeapon]),
|
|
100, 0);
|
|
}
|
|
c.npcIndex = 0;
|
|
return;
|
|
}
|
|
}
|
|
c.specMaxHitIncrease = 0;
|
|
if (!c.usingMagic) {
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender().sendSound(
|
|
CombatSounds.getWeaponSounds(c), 100, 0);
|
|
}
|
|
c.startAnimation(getWepAnim());
|
|
} else {
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender().sendSound(
|
|
CombatSounds.getMagicSound(c, c.spellId), 100,
|
|
0);
|
|
}
|
|
c.startAnimation(MagicData.MAGIC_SPELLS[c.spellId][2]);
|
|
}
|
|
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
|
|
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
|
|
if (!c.usingBow && !c.usingMagic && !c.usingRangeWeapon) { // melee
|
|
// hit
|
|
// delay
|
|
c.hitDelay = getHitDelay();
|
|
c.projectileStage = 0;
|
|
c.oldNpcIndex = i;
|
|
}
|
|
|
|
if (c.usingBow && !c.usingRangeWeapon && !c.usingMagic
|
|
|| usingCross) { // range hit delay
|
|
if (usingCross) {
|
|
c.usingBow = true;
|
|
}
|
|
if (c.fightMode == 2) {
|
|
c.attackTimer--;
|
|
}
|
|
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
|
|
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
|
|
c.gfx100(RangeData.getRangeStartGFX(c));
|
|
c.hitDelay = getHitDelay();
|
|
c.projectileStage = 1;
|
|
c.oldNpcIndex = i;
|
|
if (c.playerEquipment[c.playerWeapon] >= 4212
|
|
&& c.playerEquipment[c.playerWeapon] <= 4223) {
|
|
c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
|
|
c.crystalBowArrowCount++;
|
|
c.lastArrowUsed = 0;
|
|
} else {
|
|
c.rangeItemUsed = c.playerEquipment[c.playerArrows];
|
|
c.getItemAssistant().deleteArrow();
|
|
}
|
|
fireProjectileNpc();
|
|
}
|
|
|
|
if (c.usingRangeWeapon && !c.usingMagic && !c.usingBow) { // knives,
|
|
// darts,
|
|
// etc
|
|
// hit
|
|
// delay
|
|
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
|
|
c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
|
|
c.getItemAssistant().deleteEquipment();
|
|
c.gfx100(RangeData.getRangeStartGFX(c));
|
|
c.lastArrowUsed = 0;
|
|
c.hitDelay = getHitDelay();
|
|
c.projectileStage = 1;
|
|
c.oldNpcIndex = i;
|
|
if (c.fightMode == 2) {
|
|
c.attackTimer--;
|
|
}
|
|
fireProjectileNpc();
|
|
}
|
|
|
|
if (c.usingMagic) { // magic hit delay
|
|
int pX = c.getX();
|
|
int pY = c.getY();
|
|
int nX = NpcHandler.npcs[i].getX();
|
|
int nY = NpcHandler.npcs[i].getY();
|
|
int offX = (pY - nY) * -1;
|
|
int offY = (pX - nX) * -1;
|
|
c.castingMagic = true;
|
|
c.projectileStage = 2;
|
|
if (MagicData.MAGIC_SPELLS[c.spellId][3] > 0) {
|
|
if (MagicSpells.getStartGfxHeight(c) == 100) {
|
|
c.gfx100(MagicData.MAGIC_SPELLS[c.spellId][3]);
|
|
} else {
|
|
c.gfx0(MagicData.MAGIC_SPELLS[c.spellId][3]);
|
|
}
|
|
}
|
|
if (MagicData.MAGIC_SPELLS[c.spellId][4] > 0) {
|
|
c.getPlayerAssistant().createPlayersProjectile(pX, pY,
|
|
offX, offY, 50, 78,
|
|
MagicData.MAGIC_SPELLS[c.spellId][4],
|
|
MagicSpells.getStartHeight(c), MagicSpells.getEndHeight(c), i + 1, 50);
|
|
}
|
|
c.hitDelay = getHitDelay();
|
|
c.oldNpcIndex = i;
|
|
c.oldSpellId = c.spellId;
|
|
c.spellId = 0;
|
|
if (!c.autocasting) {
|
|
c.npcIndex = 0;
|
|
}
|
|
}
|
|
|
|
if (c.usingBow && CombatConstants.CRYSTAL_BOW_DEGRADES) { // crystal
|
|
// bow
|
|
// degrading
|
|
if (c.playerEquipment[c.playerWeapon] == 4212) { // new
|
|
// crystal
|
|
// bow
|
|
// becomes
|
|
// full
|
|
// bow
|
|
// on
|
|
// the
|
|
// first
|
|
// shot
|
|
c.getItemAssistant().wearItem(4214, 1, 3);
|
|
}
|
|
if (c.crystalBowArrowCount >= 250) {
|
|
switch (c.playerEquipment[c.playerWeapon]) {
|
|
|
|
case 4223: // 1/10 bow
|
|
c.getItemAssistant().wearItem(-1, 1, 3);
|
|
c.getPacketSender().sendMessage(
|
|
"Your crystal bow has fully degraded.");
|
|
if (!c.getItemAssistant().addItem(4207, 1)) {
|
|
GameEngine.itemHandler.createGroundItem(c, 4207,
|
|
c.getX(), c.getY(), 1, c.getId());
|
|
}
|
|
c.crystalBowArrowCount = 0;
|
|
break;
|
|
|
|
default:
|
|
c.getItemAssistant().wearItem(
|
|
++c.playerEquipment[c.playerWeapon], 1, 3);
|
|
c.getPacketSender().sendMessage(
|
|
"Your crystal bow degrades.");
|
|
c.crystalBowArrowCount = 0;
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Attack Players, same as npc tbh xD
|
|
**/
|
|
|
|
public void attackPlayer(int i) {
|
|
Client o = (Client) PlayerHandler.players[i];
|
|
/*if (c.connectedFrom.equals(o.connectedFrom)) {
|
|
c.getActionSender().sendMessage("You cannot attack your self.");
|
|
resetPlayerAttack();
|
|
return;
|
|
}*/
|
|
int equippedWeapon = c.playerEquipment[c.playerWeapon];
|
|
|
|
if (PlayerHandler.players[i] != null) {
|
|
|
|
if (c.usingMagic && MagicData.MAGIC_SPELLS[c.spellId][0] == 1171) {
|
|
c.getPacketSender().sendMessage("This spell only affects skeletons, zombies, ghosts and shades, not humans.");
|
|
resetPlayerAttack();
|
|
c.stopMovement();
|
|
return;
|
|
}
|
|
|
|
if (CastleWars.isInCw(PlayerHandler.players[i])
|
|
&& CastleWars.isInCw(c)) {
|
|
if (CastleWars.getTeamNumber(c) == CastleWars.getTeamNumber((Client) PlayerHandler.players[i])) {
|
|
c.getPacketSender().sendMessage("You cannot attack your own teammate.");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!CastleWars.isInCw(PlayerHandler.players[i])
|
|
&& CastleWars.isInCw(c)) {
|
|
c.getPacketSender().sendMessage(
|
|
"You cannot attack people outside castle wars.");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
if (PlayerHandler.players[i].isDead) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
if (c.respawnTimer > 0 || PlayerHandler.players[i].respawnTimer > 0) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* if( c.getPlayerAssistant().getWearingAmount() < 4 && c.duelStatus
|
|
* < 1 && ! c.inCw() && c.inPits == false ) {
|
|
* c.getPacketDispatcher().sendMessage(
|
|
* "You must be wearing at least 4 items to attack someone." );
|
|
* resetPlayerAttack(); return; }
|
|
*/
|
|
boolean sameSpot = c.absX == PlayerHandler.players[i].getX()
|
|
&& c.absY == PlayerHandler.players[i].getY();
|
|
if (!c.goodDistance(PlayerHandler.players[i].getX(), PlayerHandler.players[i].getY(), c.getX(), c.getY(), 25) && !sameSpot) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
if (PlayerHandler.players[i].respawnTimer > 0) {
|
|
PlayerHandler.players[i].playerIndex = 0;
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
if (PlayerHandler.players[i].heightLevel != c.heightLevel) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.attackTimer <= 0) {
|
|
c.usingBow = false;
|
|
c.specEffect = 0;
|
|
c.usingRangeWeapon = false;
|
|
c.rangeItemUsed = 0;
|
|
boolean usingArrows = false;
|
|
boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185;
|
|
c.projectileStage = 0;
|
|
if (c.absX == PlayerHandler.players[i].absX
|
|
&& c.absY == PlayerHandler.players[i].absY) {
|
|
if (c.freezeTimer > 0) {
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
c.followId = i;
|
|
c.attackTimer = 0;
|
|
return;
|
|
}
|
|
if (!c.usingMagic) {
|
|
for (int bowId : RangeData.BOWS) {
|
|
if (c.playerEquipment[c.playerWeapon] == bowId) {
|
|
c.usingBow = true;
|
|
for (int arrowId : RangeData.ARROWS) {
|
|
if (c.playerEquipment[c.playerArrows] == arrowId) {
|
|
usingArrows = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (int otherRangeId : RangeData.OTHER_RANGE_WEAPONS) {
|
|
if (c.playerEquipment[c.playerWeapon] == otherRangeId) {
|
|
c.usingRangeWeapon = true;
|
|
}
|
|
}
|
|
}
|
|
if (c.autocasting) {
|
|
c.spellId = c.autocastId;
|
|
c.usingMagic = true;
|
|
}
|
|
if (c.spellId > 0) {
|
|
c.usingMagic = true;
|
|
}
|
|
|
|
|
|
if (c.duelRule[9]) {
|
|
boolean canUseWeapon = false;
|
|
for (int funWeapon : GameConstants.FUN_WEAPONS) {
|
|
if (c.playerEquipment[c.playerWeapon] == funWeapon) {
|
|
canUseWeapon = true;
|
|
}
|
|
}
|
|
if (!canUseWeapon) {
|
|
c.getPacketSender().sendMessage(
|
|
"You can only use fun weapons in this duel!");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (c.duelRule[2] && (c.usingBow || c.usingRangeWeapon)) {
|
|
c.getPacketSender().sendMessage(
|
|
"Range has been disabled in this duel!");
|
|
return;
|
|
}
|
|
if (c.duelRule[3] && !c.usingBow && !c.usingRangeWeapon
|
|
&& !c.usingMagic) {
|
|
c.getPacketSender().sendMessage(
|
|
"Melee has been disabled in this duel!");
|
|
return;
|
|
}
|
|
|
|
if (c.duelRule[4] && c.usingMagic) {
|
|
c.getPacketSender().sendMessage(
|
|
"Magic has been disabled in this duel!");
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
boolean projectile = c.usingBow || c.usingMagic || c.usingRangeWeapon;
|
|
|
|
if (projectile && !PathFinder.isProjectilePathClear(c.absX, c.absY, c.heightLevel, PlayerHandler.players[i].absX, PlayerHandler.players[i].absY)) {
|
|
return;
|
|
}
|
|
|
|
if (!c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(), 4)
|
|
&& c.usingRangeWeapon
|
|
&& !c.usingBow
|
|
&& !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(), 2)
|
|
&& !c.usingRangeWeapon
|
|
&& RangeData.usingHally(c)
|
|
&& !c.usingBow
|
|
&& !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(),
|
|
getRequiredDistance())
|
|
&& !c.usingRangeWeapon
|
|
&& !RangeData.usingHally(c)
|
|
&& !c.usingBow
|
|
&& !c.usingMagic
|
|
|| !c.goodDistance(c.getX(), c.getY(),
|
|
PlayerHandler.players[i].getX(),
|
|
PlayerHandler.players[i].getY(), 10)
|
|
&& (c.usingBow || c.usingMagic)) {
|
|
// c.getPacketDispatcher().sendMessage("Setting attack timer to 1");
|
|
//c.attackTimer = 1;
|
|
if (!c.usingBow && !c.usingMagic && !c.usingRangeWeapon
|
|
&& c.freezeTimer > 0) {
|
|
resetPlayerAttack();
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!usingCross
|
|
&& !usingArrows
|
|
&& c.usingBow
|
|
&& (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)
|
|
&& !c.usingMagic) {
|
|
c.getPacketSender().sendMessage(
|
|
"There is no ammo left in your quiver.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (RangeData.correctBowAndArrows(c) < c.playerEquipment[c.playerArrows]
|
|
&& CombatConstants.CORRECT_ARROWS && c.usingBow
|
|
&& !RangeData.usingCrystalBow(c)
|
|
&& c.playerEquipment[c.playerWeapon] != 9185
|
|
&& !c.usingMagic) {
|
|
c.getItemAssistant();
|
|
c.getItemAssistant();
|
|
c.getPacketSender().sendMessage(
|
|
"You can't use "
|
|
+ ItemAssistant.getItemName(
|
|
c.playerEquipment[c.playerArrows])
|
|
.toLowerCase()
|
|
+ "s with a "
|
|
+ ItemAssistant.getItemName(
|
|
c.playerEquipment[c.playerWeapon])
|
|
.toLowerCase() + ".");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (c.playerEquipment[c.playerWeapon] == 9185 && !properBolts()
|
|
&& !c.usingMagic) {
|
|
c.getPacketSender().sendMessage(
|
|
"You must use bolts with a crossbow.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
if (c.usingBow || c.usingMagic || c.usingRangeWeapon
|
|
|| RangeData.usingHally(c)) {
|
|
c.stopMovement();
|
|
}
|
|
|
|
if (!checkMagicReqs(c.spellId)) {
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
|
|
c.faceUpdate(i + 32768);
|
|
|
|
if (c.duelStatus != 5
|
|
&& !PlayerHandler.players[c.playerIndex].inCwGame()
|
|
&& FightPits.getState(c) == null) {
|
|
if (!c.attackedPlayers.contains(c.playerIndex)
|
|
&& !PlayerHandler.players[c.playerIndex].attackedPlayers
|
|
.contains(c.playerId)) {
|
|
c.attackedPlayers.add(c.playerIndex);
|
|
c.isSkulled = true;
|
|
c.skullTimer = CombatConstants.SKULL_TIMER;
|
|
c.headIconPk = 0;
|
|
c.getPlayerAssistant().requestUpdates();
|
|
}
|
|
}
|
|
c.specAccuracy = 1.0;
|
|
c.specDamage = 1.0;
|
|
c.delayedDamage = c.delayedDamage2 = 0;
|
|
if (c.usingSpecial && !c.usingMagic) {
|
|
if (c.duelRule[10] && c.duelStatus == 5) {
|
|
c.getPacketSender()
|
|
.sendMessage(
|
|
"Special attacks have been disabled during this duel!");
|
|
c.usingSpecial = false;
|
|
c.getItemAssistant().updateSpecialBar();
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender()
|
|
.sendSound(
|
|
CombatSounds
|
|
.specialSounds(c.playerEquipment[c.playerWeapon]),
|
|
100, 0);
|
|
}
|
|
resetPlayerAttack();
|
|
return;
|
|
}
|
|
if (checkSpecAmount(equippedWeapon)) {
|
|
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
|
|
c.getSpecials().activateSpecial(
|
|
c.playerEquipment[c.playerWeapon], i);
|
|
c.followId = c.playerIndex;
|
|
return;
|
|
} else {
|
|
c.getPacketSender()
|
|
.sendMessage(
|
|
"You don't have the required special energy to use this attack.");
|
|
c.usingSpecial = false;
|
|
c.getItemAssistant().updateSpecialBar();
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender()
|
|
.sendSound(
|
|
CombatSounds
|
|
.specialSounds(c.playerEquipment[c.playerWeapon]),
|
|
100, 0);
|
|
}
|
|
c.playerIndex = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!c.usingMagic) {
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender().sendSound(
|
|
CombatSounds.getWeaponSounds(c), 100, 0);
|
|
}
|
|
c.startAnimation(getWepAnim());
|
|
c.mageFollow = false;
|
|
} else {
|
|
c.startAnimation(MagicData.MAGIC_SPELLS[c.spellId][2]);
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
c.getPacketSender().sendSound(
|
|
CombatSounds.getMagicSound(c, c.spellId), 100,
|
|
0);
|
|
}
|
|
}
|
|
|
|
c.attackTimer = getAttackDelay();
|
|
PlayerHandler.players[i].underAttackBy = c.playerId;
|
|
PlayerHandler.players[i].logoutDelay = System.currentTimeMillis();
|
|
PlayerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
|
|
PlayerHandler.players[i].killerId = c.playerId;
|
|
c.lastArrowUsed = 0;
|
|
c.rangeItemUsed = 0;
|
|
if (!c.usingBow && !c.usingMagic && !c.usingRangeWeapon) { // melee
|
|
// hit
|
|
// delay;
|
|
c.followId = PlayerHandler.players[c.playerIndex].playerId;
|
|
//c.getPlayerAssistant().followPlayer();
|
|
c.hitDelay = getHitDelay();
|
|
c.delayedDamage = Misc.random(meleeMaxHit());
|
|
c.projectileStage = 0;
|
|
c.oldPlayerIndex = i;
|
|
}
|
|
|
|
if (c.usingBow && !c.usingRangeWeapon && !c.usingMagic
|
|
|| usingCross) { // range hit delay
|
|
if (c.playerEquipment[c.playerWeapon] >= 4212
|
|
&& c.playerEquipment[c.playerWeapon] <= 4223) {
|
|
c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
|
|
c.crystalBowArrowCount++;
|
|
} else {
|
|
c.rangeItemUsed = c.playerEquipment[c.playerArrows];
|
|
c.getItemAssistant().deleteArrow();
|
|
}
|
|
if (c.fightMode == 2) {
|
|
c.attackTimer--;
|
|
}
|
|
if (usingCross) {
|
|
c.usingBow = true;
|
|
}
|
|
|
|
c.usingBow = true;
|
|
c.followId = PlayerHandler.players[c.playerIndex].playerId;
|
|
//c.getPlayerAssistant().followPlayer();
|
|
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
|
|
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
|
|
c.gfx100(RangeData.getRangeStartGFX(c));
|
|
c.hitDelay = getHitDelay();
|
|
c.projectileStage = 1;
|
|
c.oldPlayerIndex = i;
|
|
fireProjectilePlayer();
|
|
}
|
|
|
|
if (c.usingRangeWeapon) { // knives, darts, etc hit delay
|
|
c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
|
|
c.getItemAssistant().deleteEquipment();
|
|
c.usingRangeWeapon = true;
|
|
c.followId = PlayerHandler.players[c.playerIndex].playerId;
|
|
//c.getPlayerAssistant().followPlayer();
|
|
c.gfx100(RangeData.getRangeStartGFX(c));
|
|
if (c.fightMode == 2) {
|
|
c.attackTimer--;
|
|
}
|
|
c.hitDelay = getHitDelay();
|
|
c.projectileStage = 1;
|
|
c.oldPlayerIndex = i;
|
|
fireProjectilePlayer();
|
|
}
|
|
|
|
if (c.usingMagic) { // magic hit delay
|
|
int pX = c.getX();
|
|
int pY = c.getY();
|
|
int nX = PlayerHandler.players[i].getX();
|
|
int nY = PlayerHandler.players[i].getY();
|
|
int offX = (pY - nY) * -1;
|
|
int offY = (pX - nX) * -1;
|
|
c.castingMagic = true;
|
|
c.projectileStage = 2;
|
|
if (MagicData.MAGIC_SPELLS[c.spellId][3] > 0) {
|
|
if (MagicSpells.getStartGfxHeight(c) == 100) {
|
|
c.gfx100(MagicData.MAGIC_SPELLS[c.spellId][3]);
|
|
} else {
|
|
c.gfx0(MagicData.MAGIC_SPELLS[c.spellId][3]);
|
|
}
|
|
}
|
|
if (MagicData.MAGIC_SPELLS[c.spellId][4] > 0) {
|
|
c.getPlayerAssistant().createPlayersProjectile(pX, pY,
|
|
offX, offY, 50, 78,
|
|
MagicData.MAGIC_SPELLS[c.spellId][4],
|
|
MagicSpells.getStartHeight(c), MagicSpells.getEndHeight(c), -i - 1,
|
|
MagicSpells.getStartDelay(c));
|
|
}
|
|
if (c.autocastId > 0) {
|
|
c.followId = c.playerIndex;
|
|
c.followDistance = 5;
|
|
}
|
|
c.hitDelay = getHitDelay();
|
|
c.oldPlayerIndex = i;
|
|
c.oldSpellId = c.spellId;
|
|
c.spellId = 0;
|
|
if (MagicData.MAGIC_SPELLS[c.oldSpellId][0] == 12891
|
|
&& o.isMoving) {
|
|
// c.getPacketDispatcher().sendMessage("Barrage projectile..");
|
|
c.getPlayerAssistant().createPlayersProjectile(pX, pY,
|
|
offX, offY, 50, 85, 368, 25, 25, -i - 1,
|
|
MagicSpells.getStartDelay(c));
|
|
}
|
|
if (Misc.random(o.getCombatAssistant().mageDef()) > Misc
|
|
.random(mageAtk())) {
|
|
c.magicFailed = true;
|
|
} else {
|
|
c.magicFailed = false;
|
|
}
|
|
int freezeDelay = MagicSpells.getFreezeTime(c);// freeze time
|
|
if (freezeDelay > 0
|
|
&& PlayerHandler.players[i].freezeTimer <= -3
|
|
&& !c.magicFailed) {
|
|
PlayerHandler.players[i].freezeTimer = freezeDelay;
|
|
o.resetWalkingQueue();
|
|
o.getPacketSender().sendMessage(
|
|
"You have been frozen.");
|
|
o.frozenBy = c.playerId;
|
|
}
|
|
if (!checkReqs()) {
|
|
return;
|
|
}
|
|
if (!c.autocasting && c.spellId <= 0) {
|
|
c.playerIndex = 0;
|
|
}
|
|
}
|
|
|
|
if (c.usingBow && CombatConstants.CRYSTAL_BOW_DEGRADES) { // crystal
|
|
// bow
|
|
// degrading
|
|
if (c.playerEquipment[c.playerWeapon] == 4212) { // new
|
|
// crystal
|
|
// bow
|
|
// becomes
|
|
// full
|
|
// bow
|
|
// on
|
|
// the
|
|
// first
|
|
// shot
|
|
c.getItemAssistant().wearItem(4214, 1, 3);
|
|
}
|
|
if (c.crystalBowArrowCount >= 250) {
|
|
switch (c.playerEquipment[c.playerWeapon]) {
|
|
|
|
case 4223: // 1/10 bow
|
|
c.getItemAssistant().wearItem(-1, 1, 3);
|
|
c.getPacketSender().sendMessage(
|
|
"Your crystal bow has fully degraded.");
|
|
if (!c.getItemAssistant().addItem(4207, 1)) {
|
|
GameEngine.itemHandler.createGroundItem(c, 4207,
|
|
c.getX(), c.getY(), 1, c.getId());
|
|
}
|
|
c.crystalBowArrowCount = 0;
|
|
break;
|
|
|
|
default:
|
|
c.getItemAssistant().wearItem(
|
|
++c.playerEquipment[c.playerWeapon], 1, 3);
|
|
c.getPacketSender().sendMessage(
|
|
"Your crystal bow degrades.");
|
|
c.crystalBowArrowCount = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void playerDelayedHit(int i) {
|
|
if (PlayerHandler.players[i] != null) {
|
|
if (PlayerHandler.players[i].isDead || c.isDead
|
|
|| PlayerHandler.players[i].playerLevel[3] <= 0
|
|
|| c.playerLevel[3] <= 0) {
|
|
c.playerIndex = 0;
|
|
return;
|
|
}
|
|
if (PlayerHandler.players[i].respawnTimer > 0) {
|
|
c.faceUpdate(0);
|
|
c.playerIndex = 0;
|
|
return;
|
|
}
|
|
Client o = (Client) PlayerHandler.players[i];
|
|
o.getPacketSender().closeAllWindows();
|
|
if (o.playerIndex <= 0 && o.npcIndex <= 0) {
|
|
if (o.autoRet == 1) {
|
|
o.playerIndex = c.playerId;
|
|
}
|
|
}
|
|
if (o.attackTimer <= 3 || o.attackTimer == 0 && o.playerIndex == 0
|
|
&& !c.castingMagic) { // block animation
|
|
o.startAnimation(o.getCombatAssistant().getBlockEmote());
|
|
if (CombatConstants.COMBAT_SOUNDS) {
|
|
o.getPacketSender().sendSound(
|
|
CombatSounds.getPlayerBlockSounds(o), 100, 0);
|
|
}
|
|
}
|
|
if (o.inTrade) {
|
|
o.getTrading().declineTrade();
|
|
}
|
|
if (c.projectileStage == 0) { // melee hit damage
|
|
applyPlayerMeleeDamage(i, 1);
|
|
if (c.doubleHit) {
|
|
applyPlayerMeleeDamage(i, 2);
|
|
}
|
|
}
|
|
if (!c.castingMagic && c.projectileStage > 0) { // range hit
|
|
// damage
|
|
int damage = Misc.random(rangeMaxHit());
|
|
int damage2 = -1;
|
|
if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
|
|
damage2 = Misc.random(rangeMaxHit());
|
|
}
|
|
boolean ignoreDef = false;
|
|
if (Misc.random(4) == 1 && c.lastArrowUsed == 9243) {
|
|
ignoreDef = true;
|
|
o.gfx0(758);
|
|
}
|
|
if (Misc.random(10 + o.getCombatAssistant()
|
|
.calculateRangeDefence()) > Misc
|
|
.random(10 + calculateRangeAttack())
|
|
&& !ignoreDef) {
|
|
damage = 0;
|
|
}
|
|
if (Misc.random(4) == 1 && c.lastArrowUsed == 9242
|
|
&& damage > 0) {
|
|
PlayerHandler.players[i].gfx0(754);
|
|
damage = NpcHandler.npcs[i].HP / 5;
|
|
c.handleHitMask(c.playerLevel[3] / 10);
|
|
c.dealDamage(c.playerLevel[3] / 10);
|
|
c.gfx0(754);
|
|
}
|
|
|
|
if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
|
|
if (Misc.random(10 + o.getCombatAssistant()
|
|
.calculateRangeDefence()) > Misc
|
|
.random(10 + calculateRangeAttack())) {
|
|
damage2 = 0;
|
|
}
|
|
}
|
|
|
|
if (c.dbowSpec) {
|
|
o.gfx100(1100);
|
|
if (damage < 8) {
|
|
damage = 8;
|
|
}
|
|
if (damage2 < 8) {
|
|
damage2 = 8;
|
|
}
|
|
c.dbowSpec = false;
|
|
}
|
|
if (damage > 0 && Misc.random(5) == 1
|
|
&& c.lastArrowUsed == 9244) {
|
|
damage *= 1.45;
|
|
o.gfx0(756);
|
|
}
|
|
if (o.getPrayer().prayerActive[17]
|
|
&& System.currentTimeMillis() - o.protRangeDelay > 1500) { // if
|
|
// prayer
|
|
// active
|
|
// reduce
|
|
// damage
|
|
// by
|
|
// half
|
|
damage = damage * 60 / 100;
|
|
if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
|
|
damage2 = damage2 * 60 / 100;
|
|
}
|
|
}
|
|
if (PlayerHandler.players[i].playerLevel[3] - damage < 0) {
|
|
damage = PlayerHandler.players[i].playerLevel[3];
|
|
}
|
|
if (PlayerHandler.players[i].playerLevel[3] - damage - damage2 < 0) {
|
|
damage2 = PlayerHandler.players[i].playerLevel[3] - damage;
|
|
}
|
|
if (damage < 0) {
|
|
damage = 0;
|
|
}
|
|
if (damage2 < 0 && damage2 != -1) {
|
|
damage2 = 0;
|
|
}
|
|
if (damage > 0) {
|
|
applyRecoil(c, damage, i);
|
|
}
|
|
if (damage2 > 0) {
|
|
applyRecoil(c, damage2, i);
|
|
}
|
|
if (c.fightMode == 3) {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.RANGE_EXP_RATE / 3, 4);
|
|
c.getPlayerAssistant().addSkillXP(damage / 3, 1);
|
|
c.getPlayerAssistant().addSkillXP(damage / 3, 3);
|
|
c.getPlayerAssistant().refreshSkill(1);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(4);
|
|
} else {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.RANGE_EXP_RATE, 4);
|
|
c.getPlayerAssistant().addSkillXP(damage / 3, 3);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(4);
|
|
}
|
|
boolean dropArrows = true;
|
|
|
|
for (int noArrowId : RangeData.NO_ARROW_DROP) {
|
|
if (c.lastWeaponUsed == noArrowId) {
|
|
dropArrows = false;
|
|
break;
|
|
}
|
|
}
|
|
if (dropArrows) {
|
|
c.getItemAssistant().dropArrowPlayer();
|
|
}
|
|
PlayerHandler.players[i].underAttackBy = c.playerId;
|
|
PlayerHandler.players[i].logoutDelay = System.currentTimeMillis();
|
|
PlayerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
|
|
PlayerHandler.players[i].killerId = c.playerId;
|
|
// Server.playerHandler.players[i].setHitDiff(damage);
|
|
// Server.playerHandler.players[i].playerLevel[3] -= damage;
|
|
PlayerHandler.players[i].dealDamage(damage);
|
|
PlayerHandler.players[i].damageTaken[c.playerId] += damage;
|
|
c.killedBy = PlayerHandler.players[i].playerId;
|
|
PlayerHandler.players[i].handleHitMask(damage);
|
|
if (damage2 != -1) {
|
|
// Server.playerHandler.players[i].playerLevel[3] -=
|
|
// damage2;
|
|
PlayerHandler.players[i].dealDamage(damage2);
|
|
PlayerHandler.players[i].damageTaken[c.playerId] += damage2;
|
|
PlayerHandler.players[i].handleHitMask(damage2);
|
|
|
|
}
|
|
o.getPlayerAssistant().refreshSkill(3);
|
|
|
|
// Server.playerHandler.players[i].setHitUpdateRequired(true);
|
|
PlayerHandler.players[i].updateRequired = true;
|
|
applySmite(i, damage);
|
|
if (damage2 != -1) {
|
|
applySmite(i, damage2);
|
|
}
|
|
|
|
} else if (c.projectileStage > 0) { // magic hit damage
|
|
int damage = Misc
|
|
.random(MagicData.MAGIC_SPELLS[c.oldSpellId][6]);
|
|
if (MagicSpells.godSpells(c)) {
|
|
if (System.currentTimeMillis() - c.godSpellDelay < CombatConstants.GOD_SPELL_CHARGE) {
|
|
damage += 10;
|
|
}
|
|
}
|
|
// c.playerIndex = 0;
|
|
if (c.magicFailed) {
|
|
damage = 0;
|
|
}
|
|
|
|
if (o.getPrayer().prayerActive[16]
|
|
&& System.currentTimeMillis() - o.protMageDelay > 1500) { // if
|
|
// prayer
|
|
// active
|
|
// reduce
|
|
// damage
|
|
// by
|
|
// half
|
|
damage = damage * 60 / 100;
|
|
}
|
|
if (PlayerHandler.players[i].playerLevel[3] - damage < 0) {
|
|
damage = PlayerHandler.players[i].playerLevel[3];
|
|
}
|
|
if (damage > 0) {
|
|
applyRecoil(c, damage, i);
|
|
}
|
|
c.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[c.oldSpellId][7] + damage * CombatConstants.MAGIC_EXP_RATE, 6);
|
|
if (MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1161 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1153 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1157 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1542 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1543 && MagicData.MAGIC_SPELLS[c.oldSpellId][0] != 1562) {
|
|
c.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[c.oldSpellId][7] + damage / 3, 3);
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(6);
|
|
|
|
if (MagicSpells.getEndGfxHeight(c) == 100 && !c.magicFailed) { // end GFX
|
|
PlayerHandler.players[i]
|
|
.gfx100(MagicData.MAGIC_SPELLS[c.oldSpellId][5]);
|
|
} else if (!c.magicFailed) {
|
|
PlayerHandler.players[i]
|
|
.gfx0(MagicData.MAGIC_SPELLS[c.oldSpellId][5]);
|
|
} else if (c.magicFailed) {
|
|
PlayerHandler.players[i].gfx100(85);
|
|
c.getPacketSender().sendSound(SoundList.MAGE_FAIL, 100,
|
|
0);
|
|
}
|
|
|
|
if (!c.magicFailed) {
|
|
if (System.currentTimeMillis()
|
|
- PlayerHandler.players[i].reduceStat > 35000) {
|
|
PlayerHandler.players[i].reduceStat = System
|
|
.currentTimeMillis();
|
|
switch (MagicData.MAGIC_SPELLS[c.oldSpellId][0]) {
|
|
case 12987:
|
|
case 13011:
|
|
case 12999:
|
|
case 13023:
|
|
PlayerHandler.players[i].playerLevel[0] -= o
|
|
.getPlayerAssistant()
|
|
.getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[0]) * 10 / 100;
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (MagicData.MAGIC_SPELLS[c.oldSpellId][0]) {
|
|
case 12445: // teleblock
|
|
if (System.currentTimeMillis() - o.teleBlockDelay > o.teleBlockLength) {
|
|
o.teleBlockDelay = System.currentTimeMillis();
|
|
o.getPacketSender().sendMessage(
|
|
"You have been teleblocked.");
|
|
o.getPacketSender().sendSound(
|
|
SoundList.TELEBLOCK_HIT, 100, 0);
|
|
if (o.getPrayer().prayerActive[16]
|
|
&& System.currentTimeMillis()
|
|
- o.protMageDelay > 1500) {
|
|
o.teleBlockLength = 150000;
|
|
} else {
|
|
o.teleBlockLength = 300000;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 12901:
|
|
case 12919: // blood spells
|
|
case 12911:
|
|
case 12929:
|
|
int heal = damage / 4;
|
|
if (c.playerLevel[3] + heal > c.getPlayerAssistant()
|
|
.getLevelForXP(c.playerXP[3])) {
|
|
c.playerLevel[3] = c.getPlayerAssistant()
|
|
.getLevelForXP(c.playerXP[3]);
|
|
} else {
|
|
c.playerLevel[3] += heal;
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
break;
|
|
|
|
case 1153:
|
|
PlayerHandler.players[i].playerLevel[0] -= o
|
|
.getPlayerAssistant().getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[0]) * 5 / 100;
|
|
o.getPacketSender().sendMessage(
|
|
"Your attack level has been reduced!");
|
|
PlayerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System
|
|
.currentTimeMillis();
|
|
o.getPlayerAssistant().refreshSkill(0);
|
|
break;
|
|
|
|
case 1157:
|
|
PlayerHandler.players[i].playerLevel[2] -= o
|
|
.getPlayerAssistant().getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[2]) * 5 / 100;
|
|
o.getPacketSender().sendMessage(
|
|
"Your strength level has been reduced!");
|
|
PlayerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System
|
|
.currentTimeMillis();
|
|
o.getPlayerAssistant().refreshSkill(2);
|
|
break;
|
|
|
|
case 1161:
|
|
PlayerHandler.players[i].playerLevel[1] -= o
|
|
.getPlayerAssistant().getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[1]) * 5 / 100;
|
|
o.getPacketSender().sendMessage(
|
|
"Your defence level has been reduced!");
|
|
PlayerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System
|
|
.currentTimeMillis();
|
|
o.getPlayerAssistant().refreshSkill(1);
|
|
break;
|
|
|
|
case 1542:
|
|
PlayerHandler.players[i].playerLevel[1] -= o
|
|
.getPlayerAssistant().getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[1]) * 10 / 100;
|
|
o.getPacketSender().sendMessage(
|
|
"Your defence level has been reduced!");
|
|
PlayerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System
|
|
.currentTimeMillis();
|
|
o.getPlayerAssistant().refreshSkill(1);
|
|
break;
|
|
|
|
case 1543:
|
|
PlayerHandler.players[i].playerLevel[2] -= o
|
|
.getPlayerAssistant().getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[2]) * 10 / 100;
|
|
o.getPacketSender().sendMessage(
|
|
"Your strength level has been reduced!");
|
|
PlayerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System
|
|
.currentTimeMillis();
|
|
o.getPlayerAssistant().refreshSkill(2);
|
|
break;
|
|
|
|
case 1562:
|
|
PlayerHandler.players[i].playerLevel[0] -= o
|
|
.getPlayerAssistant().getLevelForXP(
|
|
PlayerHandler.players[i].playerXP[0]) * 10 / 100;
|
|
o.getPacketSender().sendMessage(
|
|
"Your attack level has been reduced!");
|
|
PlayerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System
|
|
.currentTimeMillis();
|
|
o.getPlayerAssistant().refreshSkill(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
PlayerHandler.players[i].logoutDelay = System.currentTimeMillis();
|
|
PlayerHandler.players[i].underAttackBy = c.playerId;
|
|
PlayerHandler.players[i].killerId = c.playerId;
|
|
PlayerHandler.players[i].singleCombatDelay = System
|
|
.currentTimeMillis();
|
|
if (MagicData.MAGIC_SPELLS[c.oldSpellId][6] != 0) {
|
|
// Server.playerHandler.players[i].playerLevel[3] -= damage;
|
|
PlayerHandler.players[i].dealDamage(damage);
|
|
PlayerHandler.players[i].damageTaken[c.playerId] += damage;
|
|
c.totalPlayerDamageDealt += damage;
|
|
if (!c.magicFailed) {
|
|
// Server.playerHandler.players[i].setHitDiff(damage);
|
|
// Server.playerHandler.players[i].setHitUpdateRequired(true);
|
|
PlayerHandler.players[i].handleHitMask(damage);
|
|
}
|
|
}
|
|
applySmite(i, damage);
|
|
c.killedBy = PlayerHandler.players[i].playerId;
|
|
o.getPlayerAssistant().refreshSkill(3);
|
|
PlayerHandler.players[i].updateRequired = true;
|
|
c.usingMagic = false;
|
|
c.castingMagic = false;
|
|
if (o.inMulti() && MagicSpells.multis(c)) {
|
|
c.barrageCount = 0;
|
|
for (int j = 0; j < PlayerHandler.players.length; j++) {
|
|
if (PlayerHandler.players[j] != null) {
|
|
if (j == o.playerId) {
|
|
continue;
|
|
}
|
|
if (c.barrageCount >= 9) {
|
|
break;
|
|
}
|
|
if (o.goodDistance(o.getX(), o.getY(),
|
|
PlayerHandler.players[j].getX(),
|
|
PlayerHandler.players[j].getY(), 1)) {
|
|
MagicSpells.appendMultiBarrage(c, j, c.magicFailed);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
c.getPlayerAssistant().refreshSkill(6);
|
|
c.oldSpellId = 0;
|
|
}
|
|
}
|
|
c.getPlayerAssistant().requestUpdates();
|
|
if (c.bowSpecShot <= 0) {
|
|
c.oldPlayerIndex = 0;
|
|
c.projectileStage = 0;
|
|
c.lastWeaponUsed = 0;
|
|
c.doubleHit = false;
|
|
c.bowSpecShot = 0;
|
|
}
|
|
if (c.bowSpecShot != 0) {
|
|
c.bowSpecShot = 0;
|
|
}
|
|
}
|
|
|
|
public void applyPlayerMeleeDamage(int i, int damageMask) {
|
|
Client o = (Client) PlayerHandler.players[i];
|
|
if (o == null) {
|
|
return;
|
|
}
|
|
int damage = 0;
|
|
boolean veracsEffect = false;
|
|
boolean guthansEffect = false;
|
|
if (c.getPlayerAssistant().fullVeracs()) {
|
|
if (Misc.random(4) == 1) {
|
|
veracsEffect = true;
|
|
}
|
|
}
|
|
if (c.getPlayerAssistant().fullGuthans()) {
|
|
if (Misc.random(4) == 1) {
|
|
guthansEffect = true;
|
|
}
|
|
}
|
|
if (damageMask == 1) {
|
|
damage = c.delayedDamage;
|
|
c.delayedDamage = 0;
|
|
} else {
|
|
damage = c.delayedDamage2;
|
|
c.delayedDamage2 = 0;
|
|
}
|
|
if (Misc.random(o.getCombatAssistant().calcDef()) > Misc
|
|
.random(calcAtt()) && !veracsEffect) {
|
|
damage = 0;
|
|
c.bonusAttack = 0;
|
|
} else if (c.playerEquipment[c.playerWeapon] == 5698
|
|
&& o.poisonDamage <= 0 && Misc.random(3) == 1) {
|
|
o.getPlayerAssistant().appendPoison(13);
|
|
c.bonusAttack += damage / 3;
|
|
} else {
|
|
c.bonusAttack += damage / 3;
|
|
}
|
|
if (o.getPrayer().prayerActive[18]
|
|
&& System.currentTimeMillis() - o.protMeleeDelay > 1500
|
|
&& !veracsEffect) { // if prayer active reduce damage by 40%
|
|
damage = damage * 60 / 100;
|
|
}
|
|
if (damage > 0 && guthansEffect) {
|
|
c.playerLevel[3] += damage;
|
|
if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3])) {
|
|
c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
o.gfx0(398);
|
|
}
|
|
if (PlayerHandler.players[i].playerLevel[3] - damage < 0) {
|
|
damage = PlayerHandler.players[i].playerLevel[3];
|
|
}
|
|
if (damage > 0) {
|
|
applyRecoil(c, damage, i);
|
|
}
|
|
switch (c.specEffect) {
|
|
case 1: // dragon scimmy special
|
|
if (damage > 0) {
|
|
if (o.getPrayer().prayerActive[16]
|
|
|| o.getPrayer().prayerActive[17]
|
|
|| o.getPrayer().prayerActive[18]) {
|
|
o.headIcon = -1;
|
|
o.getPacketSender().sendConfig(
|
|
c.getPrayer().PRAYER_GLOW[16], 0);
|
|
o.getPacketSender().sendConfig(
|
|
c.getPrayer().PRAYER_GLOW[17], 0);
|
|
o.getPacketSender().sendConfig(
|
|
c.getPrayer().PRAYER_GLOW[18], 0);
|
|
}
|
|
o.getPacketSender().sendMessage("You have been injured!");
|
|
o.getPrayer().stopPrayerDelay = System.currentTimeMillis();
|
|
o.getPrayer().prayerActive[16] = false;
|
|
o.getPrayer().prayerActive[17] = false;
|
|
o.getPrayer().prayerActive[18] = false;
|
|
o.getPlayerAssistant().requestUpdates();
|
|
}
|
|
break;
|
|
case 2:
|
|
if (damage > 0) {
|
|
if (o.freezeTimer <= 0) {
|
|
o.freezeTimer = 30;
|
|
}
|
|
o.gfx0(369);
|
|
o.getPacketSender().sendMessage("You have been frozen.");
|
|
o.frozenBy = c.playerId;
|
|
o.stopMovement();
|
|
c.getPacketSender().sendMessage("You freeze your enemy.");
|
|
}
|
|
break;
|
|
case 3:
|
|
if (damage > 0) {
|
|
o.playerLevel[1] -= damage;
|
|
o.getPacketSender().sendMessage("You feel weak.");
|
|
if (o.playerLevel[1] < 1) {
|
|
o.playerLevel[1] = 1;
|
|
}
|
|
o.getPlayerAssistant().refreshSkill(1);
|
|
}
|
|
break;
|
|
case 4:
|
|
if (damage > 0) {
|
|
if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3])) {
|
|
if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3])) {
|
|
;
|
|
} else {
|
|
c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
|
|
}
|
|
} else {
|
|
c.playerLevel[3] += damage;
|
|
}
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
}
|
|
break;
|
|
}
|
|
c.specEffect = 0;
|
|
if (c.fightMode == 3) {//melee shared
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 0);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 1);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE / 3, 2);
|
|
c.getPlayerAssistant().addSkillXP(damage / 3, 3);
|
|
c.getPlayerAssistant().refreshSkill(0);
|
|
c.getPlayerAssistant().refreshSkill(1);
|
|
c.getPlayerAssistant().refreshSkill(2);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
} else {
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE, c.fightMode);
|
|
c.getPlayerAssistant().addSkillXP(damage * CombatConstants.MELEE_EXP_RATE/3, 3);
|
|
c.getPlayerAssistant().refreshSkill(c.fightMode);
|
|
c.getPlayerAssistant().refreshSkill(3);
|
|
}
|
|
PlayerHandler.players[i].logoutDelay = System.currentTimeMillis();
|
|
PlayerHandler.players[i].underAttackBy = c.playerId;
|
|
PlayerHandler.players[i].killerId = c.playerId;
|
|
PlayerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
|
|
if (c.killedBy != PlayerHandler.players[i].playerId) {
|
|
c.totalPlayerDamageDealt = 0;
|
|
}
|
|
c.killedBy = PlayerHandler.players[i].playerId;
|
|
applySmite(i, damage);
|
|
switch (damageMask) {
|
|
case 1:
|
|
PlayerHandler.players[i].dealDamage(damage);
|
|
PlayerHandler.players[i].damageTaken[c.playerId] += damage;
|
|
c.totalPlayerDamageDealt += damage;
|
|
PlayerHandler.players[i].updateRequired = true;
|
|
o.getPlayerAssistant().refreshSkill(3);
|
|
break;
|
|
|
|
case 2:
|
|
PlayerHandler.players[i].dealDamage(damage);
|
|
PlayerHandler.players[i].damageTaken[c.playerId] += damage;
|
|
c.totalPlayerDamageDealt += damage;
|
|
PlayerHandler.players[i].updateRequired = true;
|
|
c.doubleHit = false;
|
|
o.getPlayerAssistant().refreshSkill(3);
|
|
break;
|
|
}
|
|
PlayerHandler.players[i].handleHitMask(damage);
|
|
}
|
|
|
|
public void applySmite(int index, int damage) {
|
|
if (!c.getPrayer().prayerActive[23]) {
|
|
return;
|
|
}
|
|
if (damage <= 0) {
|
|
return;
|
|
}
|
|
if (PlayerHandler.players[index] != null) {
|
|
Client c2 = (Client) PlayerHandler.players[index];
|
|
c2.playerLevel[5] -= damage / 4;
|
|
if (c2.playerLevel[5] <= 0) {
|
|
c2.playerLevel[5] = 0;
|
|
PrayerDrain.resetPrayers(c2);
|
|
}
|
|
c2.getPlayerAssistant().refreshSkill(5);
|
|
}
|
|
|
|
}
|
|
|
|
public void fireProjectilePlayer() {
|
|
if (c.oldPlayerIndex > 0) {
|
|
if (PlayerHandler.players[c.oldPlayerIndex] != null) {
|
|
c.projectileStage = 2;
|
|
int pX = c.getX();
|
|
int pY = c.getY();
|
|
int oX = PlayerHandler.players[c.oldPlayerIndex].getX();
|
|
int oY = PlayerHandler.players[c.oldPlayerIndex].getY();
|
|
int offX = (pY - oY) * -1;
|
|
int offY = (pX - oX) * -1;
|
|
if (!c.msbSpec) {
|
|
c.getPlayerAssistant().createPlayersProjectile(pX, pY,
|
|
offX, offY, 50, RangeData.getProjectileSpeed(c),
|
|
RangeData.getRangeProjectileGFX(c), 43, 31,
|
|
-c.oldPlayerIndex - 1, MagicSpells.getStartDelay(c));
|
|
} else if (c.msbSpec) {
|
|
c.getPlayerAssistant().createPlayersProjectile2(pX, pY,
|
|
offX, offY, 50, RangeData.getProjectileSpeed(c),
|
|
RangeData.getRangeProjectileGFX(c), 43, 31,
|
|
-c.oldPlayerIndex - 1, MagicSpells.getStartDelay(c), 10);
|
|
c.msbSpec = false;
|
|
}
|
|
if (RangeData.usingDbow(c)) {
|
|
c.getPlayerAssistant().createPlayersProjectile2(pX, pY,
|
|
offX, offY, 50, RangeData.getProjectileSpeed(c),
|
|
RangeData.getRangeProjectileGFX(c), 60, 31,
|
|
-c.oldPlayerIndex - 1, MagicSpells.getStartDelay(c), 35);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void resetPlayerAttack() {
|
|
c.usingMagic = false;
|
|
c.npcIndex = 0;
|
|
c.faceUpdate(0);
|
|
c.playerIndex = 0;
|
|
c.getPlayerAssistant().resetFollow();
|
|
// c.getPacketDispatcher().sendMessage("Reset attack.");
|
|
}
|
|
|
|
public int getCombatDifference(int combat1, int combat2) {
|
|
if (combat1 > combat2) {
|
|
return combat1 - combat2;
|
|
}
|
|
if (combat2 > combat1) {
|
|
return combat2 - combat1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Wildy and duel info
|
|
**/
|
|
|
|
public boolean checkReqs() {
|
|
if (PlayerHandler.players[c.playerIndex] == null) {
|
|
return false;
|
|
}
|
|
if (c.inCw()) {
|
|
return true;
|
|
}
|
|
if (c.playerIndex == c.playerId) {
|
|
return false;
|
|
}
|
|
if (c.inPits && PlayerHandler.players[c.playerIndex].inPits) {
|
|
return true;
|
|
}
|
|
if (PlayerHandler.players[c.playerIndex].inDuelArena() && c.duelStatus != 5 && !c.usingMagic) {
|
|
if (c.duelingArena() || c.duelStatus == 5) {
|
|
c.getPacketSender().sendMessage("You can't challenge inside the arena!");
|
|
return false;
|
|
}
|
|
c.getDueling().requestDuel(c.playerIndex);
|
|
return false;
|
|
}
|
|
if (c.duelStatus == 5
|
|
&& PlayerHandler.players[c.playerIndex].duelStatus == 5) {
|
|
if (PlayerHandler.players[c.playerIndex].duelingWith == c.getId()) {
|
|
return true;
|
|
} else {
|
|
c.getPacketSender()
|
|
.sendMessage("This isn't your opponent!");
|
|
return false;
|
|
}
|
|
}
|
|
if (CastOnOther.castOnOtherSpells(c.castingSpellId)) {
|
|
return true;
|
|
}
|
|
if (!PlayerHandler.players[c.playerIndex].inWild()
|
|
&& !PlayerHandler.players[c.playerIndex].inCwGame()
|
|
&& !CastOnOther.castOnOtherSpells(c.castingSpellId)) {
|
|
c.getPacketSender().sendMessage(
|
|
"That player is not in the wilderness." + c.castingSpellId);
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return false;
|
|
}
|
|
if (!c.inWild() && !PlayerHandler.players[c.playerIndex].inCwGame()
|
|
&& !CastOnOther.castOnOtherSpells(c.castingSpellId)) {
|
|
c.getPacketSender().sendMessage(
|
|
"You are not in the wilderness.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return false;
|
|
}
|
|
if (CombatConstants.COMBAT_LEVEL_DIFFERENCE && !c.inCw()) {
|
|
int combatDif1 = getCombatDifference(c.combatLevel,
|
|
PlayerHandler.players[c.playerIndex].combatLevel);
|
|
if (combatDif1 > c.wildLevel
|
|
|| combatDif1 > PlayerHandler.players[c.playerIndex].wildLevel) {
|
|
c.getPacketSender()
|
|
.sendMessage(
|
|
"Your combat level difference is too great to attack that player here.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (CombatConstants.SINGLE_AND_MULTI_ZONES) {
|
|
if (!PlayerHandler.players[c.playerIndex].inMulti()) { // single
|
|
// combat
|
|
// zones
|
|
if (PlayerHandler.players[c.playerIndex].underAttackBy != c.playerId
|
|
&& PlayerHandler.players[c.playerIndex].underAttackBy != 0) {
|
|
c.getPacketSender().sendMessage(
|
|
"That player is already in combat.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return false;
|
|
}
|
|
if (PlayerHandler.players[c.playerIndex].playerId != c.underAttackBy
|
|
&& c.underAttackBy != 0 || c.underAttackBy2 > 0) {
|
|
c.getPacketSender().sendMessage(
|
|
"You are already in combat.");
|
|
c.stopMovement();
|
|
resetPlayerAttack();
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public int getRequiredDistance() {
|
|
if (c.followId > 0 && c.freezeTimer <= 0 && !c.isMoving) {
|
|
return 2;
|
|
} else if (c.followId > 0 && c.freezeTimer <= 0 && c.isMoving) {
|
|
return 3;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
public void handleDfs() {
|
|
if (System.currentTimeMillis() - c.dfsDelay > 30000) {
|
|
if (c.playerIndex > 0
|
|
&& PlayerHandler.players[c.playerIndex] != null) {
|
|
int damage = Misc.random(15) + 5;
|
|
c.startAnimation(2836);
|
|
c.gfx0(600);
|
|
PlayerHandler.players[c.playerIndex].playerLevel[3] -= damage;
|
|
PlayerHandler.players[c.playerIndex].hitDiff2 = damage;
|
|
PlayerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
|
|
PlayerHandler.players[c.playerIndex].updateRequired = true;
|
|
c.dfsDelay = System.currentTimeMillis();
|
|
} else {
|
|
c.getPacketSender().sendMessage(
|
|
"I should be in combat before using this.");
|
|
}
|
|
} else {
|
|
c.getPacketSender().sendMessage(
|
|
"My shield hasn't finished recharging yet.");
|
|
}
|
|
}
|
|
|
|
public void handleDfsNPC() {
|
|
if (System.currentTimeMillis() - c.dfsDelay > 30000) {
|
|
if (c.npcIndex > 0 && NpcHandler.npcs[c.npcIndex] != null) {
|
|
int damage = Misc.random(15) + 5;
|
|
c.startAnimation(2836);
|
|
c.gfx0(600);
|
|
NpcHandler.npcs[c.npcIndex].HP -= damage;
|
|
NpcHandler.npcs[c.npcIndex].hitDiff2 = damage;
|
|
NpcHandler.npcs[c.npcIndex].hitUpdateRequired2 = true;
|
|
NpcHandler.npcs[c.npcIndex].updateRequired = true;
|
|
c.dfsDelay = System.currentTimeMillis();
|
|
} else {
|
|
c.getPacketSender().sendMessage(
|
|
"I should be in combat before using this.");
|
|
}
|
|
} else {
|
|
c.getPacketSender().sendMessage(
|
|
"My shield hasn't finished recharging yet.");
|
|
}
|
|
}
|
|
|
|
public static void applyRecoilNPC(Client c, int damage, int i) {
|
|
if (c == null || c.npcIndex == 0) {
|
|
return;
|
|
}
|
|
if (damage > 0 && c.playerEquipment[c.playerRing] == 2550) {
|
|
int recDamage = damage / 10 + 1;
|
|
NpcHandler.npcs[c.npcIndex].HP -= recDamage;
|
|
NpcHandler.npcs[c.npcIndex].handleHitMask(recDamage);
|
|
removeRecoil(c);
|
|
c.recoilHits += damage;
|
|
}
|
|
}
|
|
|
|
public static void applyRecoil(Player c2, int damage, int i) {
|
|
if (damage > 0
|
|
&& PlayerHandler.players[i].playerEquipment[c2.playerRing] == 2550) {
|
|
int recDamage = damage / 10 + 1;
|
|
if (!c2.getHitUpdateRequired()) {
|
|
c2.setHitDiff(recDamage);
|
|
c2.setHitUpdateRequired(true);
|
|
} else if (!c2.getHitUpdateRequired2()) {
|
|
c2.setHitDiff2(recDamage);
|
|
c2.setHitUpdateRequired2(true);
|
|
}
|
|
c2.dealDamage(recDamage);
|
|
c2.updateRequired = true;
|
|
removeRecoil(c2);
|
|
c2.recoilHits += damage;
|
|
}
|
|
}
|
|
|
|
public static void removeRecoil(Player c2) {
|
|
if (c2.recoilHits >= 400) {
|
|
c2.getItemAssistant().removeItem(2550, c2.playerRing);
|
|
c2.getItemAssistant().deleteItem(2550,
|
|
c2.getItemAssistant().getItemSlot(2550), 1);
|
|
c2.getPacketSender().sendMessage("Your ring of recoil shaters!");
|
|
c2.recoilHits = 0;
|
|
} else {
|
|
c2.recoilHits++;
|
|
}
|
|
}
|
|
|
|
public int getBonusAttack(int i) {
|
|
switch (NpcHandler.npcs[i].npcType) {
|
|
case 2883:
|
|
return Misc.random(50) + 30;
|
|
case 2026:
|
|
case 2027:
|
|
case 2029:
|
|
case 2030:
|
|
return Misc.random(50) + 30;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public void handleGmaulPlayer() {
|
|
int equippedWeapon = c.playerEquipment[c.playerWeapon];
|
|
if (c.playerIndex > 0) {
|
|
Client o = (Client) PlayerHandler.players[c.playerIndex];
|
|
if (c.goodDistance(c.getX(), c.getY(), o.getX(), o.getY(),
|
|
getRequiredDistance())) {
|
|
if (checkReqs()) {
|
|
if (checkSpecAmount(equippedWeapon)) {
|
|
boolean hit = Misc.random(calcAtt()) > Misc.random(o
|
|
.getCombatAssistant().calcDef());
|
|
int damage = 0;
|
|
if (hit) {
|
|
damage = Misc.random(meleeMaxHit());
|
|
}
|
|
if (o.getPrayer().prayerActive[18]
|
|
&& System.currentTimeMillis()
|
|
- o.protMeleeDelay > 1500) {
|
|
damage *= .6;
|
|
}
|
|
o.handleHitMask(damage);
|
|
c.startAnimation(1667);
|
|
c.gfx100(337);
|
|
o.dealDamage(damage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean armaNpc(int i) {
|
|
switch (NpcHandler.npcs[i].npcType) {
|
|
case 2558:
|
|
case 2559:
|
|
case 2560:
|
|
case 2561:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void activateSpecial(int weapon, int i) {
|
|
c.getSpecials().activateSpecial(weapon, i);
|
|
}
|
|
|
|
public boolean checkSpecAmount(int weapon) {
|
|
if (c.specAmount >= c.getSpecials().specAmount()) {
|
|
c.specAmount -= c.getSpecials().specAmount();
|
|
c.getItemAssistant().addSpecialBar(weapon);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public int meleeMaxHit() {
|
|
return MeleeMaxHit.calculateMeleeMaxHit(c);
|
|
}
|
|
|
|
public int calcDef() {
|
|
return MeleeData.calculateMeleeDefence(c);
|
|
}
|
|
|
|
public int calcAtt() {
|
|
return MeleeData.calculateMeleeAttack(c);
|
|
}
|
|
|
|
public void getPlayerAnimIndex() {
|
|
MeleeData.getPlayerAnimIndex(c);
|
|
}
|
|
|
|
public int getHitDelay() {
|
|
return MeleeData.getHitDelay(c);
|
|
}
|
|
|
|
public int getAttackDelay() {
|
|
return MeleeData.getAttackDelay(c);
|
|
}
|
|
|
|
public int getWepAnim() {
|
|
return MeleeData.getWeaponAnimation(c);
|
|
}
|
|
|
|
public int getBlockEmote() {
|
|
return MeleeData.getBlockEmote(c);
|
|
}
|
|
|
|
public int rangeMaxHit() {
|
|
return RangeMaxHit.rangeMaxHit(c);
|
|
}
|
|
|
|
public boolean checkMagicReqs(int spell) {
|
|
return MagicRequirements.checkMagicReqs(c, spell);
|
|
}
|
|
|
|
public int calculateRangeDefence() {
|
|
return RangeMaxHit.calculateRangeDefence(c);
|
|
}
|
|
|
|
public int calculateRangeAttack() {
|
|
return RangeMaxHit.calculateRangeAttack(c);
|
|
}
|
|
|
|
public boolean usingBolts() {
|
|
return RangeData.usingBolts(c);
|
|
}
|
|
|
|
public boolean properBolts() {
|
|
return RangeData.properBolts(c);
|
|
}
|
|
|
|
public int mageDef() {
|
|
return MagicMaxHit.mageDefenceBonus(c);
|
|
}
|
|
|
|
public int mageAtk() {
|
|
return MagicMaxHit.mageAttackBonus(c);
|
|
}
|
|
|
|
}
|