Code:
/**
* Attack Npcs
*/
public void attackNpc(int i) {
if (c.playerEquipment[c.playerWeapon] == 13022) {
c.gfx0(2138);
}
if (Server.npcHandler.npcs[i] != null) {
if (Server.npcHandler.npcs[i].isDead || Server.npcHandler.npcs[i].MaxHP <= 0) {
c.usingMagic = false;
c.faceUpdate(0);
c.npcIndex = 0;
return;
}
if(c.specEffect == 4) {
c.specEffect = 0;
}
if (c.inWG()) {
resetPlayerAttack();
c.stopMovement();
return;
}
if (Server.npcHandler.npcs[i].npcType == 1000 || Server.npcHandler.npcs[i].npcType == 1001 || Server.npcHandler.npcs[i].npcType == 3100 || Server.npcHandler.npcs[i].npcType == 1002 || Server.npcHandler.npcs[i].npcType == 1003) {
resetPlayerAttack();
c.stopMovement();
return; // Bandos
}
if (Server.npcHandler.npcs[i].npcType == 3104) {
c.sendMessage("You must click the gate before attacking the Corporeal Beast!");
resetPlayerAttack();
c.stopMovement();
return; // Corporeal beast *fake*
}
if (Server.npcHandler.npcs[i].npcType == 1004 || Server.npcHandler.npcs[i].npcType == 1005 || Server.npcHandler.npcs[i].npcType == 1006 || Server.npcHandler.npcs[i].npcType == 1007) {
resetPlayerAttack();
c.stopMovement();
return; // Arma
}
if (Server.npcHandler.npcs[i].npcType == 1008 || Server.npcHandler.npcs[i].npcType == 1009 || Server.npcHandler.npcs[i].npcType == 1010 || Server.npcHandler.npcs[i].npcType == 1011) {
resetPlayerAttack();
c.stopMovement();
return; // Zammy
}
if (Server.npcHandler.npcs[i].npcType == 1012 || Server.npcHandler.npcs[i].npcType == 1013 || Server.npcHandler.npcs[i].npcType == 1014 || Server.npcHandler.npcs[i].npcType == 1015) {
resetPlayerAttack();
c.stopMovement();
return; // Sara
}
if(c.respawnTimer > 0) {
c.npcIndex = 0;
return;
}
if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.npcs[i].underAttackBy != c.playerId && !Server.npcHandler.npcs[i].inMulti()) {
c.npcIndex = 0;
c.sendMessage("This monster is already in combat.");
return;
}
if ((c.underAttackBy > 0 || c.underAttackBy2 > 0) && c.underAttackBy2 != i && !c.inMulti()) {
resetPlayerAttack();
c.sendMessage("I am already under attack.");
return;
}
if (!goodSlayer(i)) {
resetPlayerAttack();
return;
}
if (Server.npcHandler.npcs[i].spawnedBy != c.playerId && Server.npcHandler.npcs[i].spawnedBy > 0) {
resetPlayerAttack();
c.sendMessage("This monster was not spawned for you.");
return;
}
if(c.attackTimer <= 0) {
boolean usingBow = false;
boolean usingArrows = false;
boolean usingOtherRangeWeapons = false;
boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185;
c.bonusAttack = 0;
c.rangeItemUsed = 0;
c.projectileStage = 0;
//c.SaveGame();
if (c.autocasting) {
c.spellId = c.autocastId;
c.usingMagic = true;
}
if(c.spellId > 0) {
c.usingMagic = true;
}
c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
c.specAccuracy = 1.0;
c.specDamage = 1.0;
if(!c.usingMagic) {
for (int bowId : c.BOWS) {
if(c.playerEquipment[c.playerWeapon] == bowId) {
usingBow = true;
for (int arrowId : c.ARROWS) {
if(c.playerEquipment[c.playerArrows] == arrowId) {
usingArrows = true;
c.gfx100(getRangeStartGFX());
}
}
}
}
for (int otherRangeId : c.OTHER_RANGE_WEAPONS) {
if(c.playerEquipment[c.playerWeapon] == otherRangeId) {
usingOtherRangeWeapons = true;
}
}
}
if (armaNpc(i) && !usingCross && !usingBow && !c.usingMagic && !usingCrystalBow() && !usingOtherRangeWeapons) {
resetPlayerAttack();
c.sendMessage("You can only Range/Mage Armadyl creeps!");
return;
}
if((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && (usingHally() && !usingOtherRangeWeapons && !usingBow && !usingCross && !c.usingMagic)) ||(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 4) && (usingOtherRangeWeapons && !usingCross && !usingBow && !c.usingMagic)) || (!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1) && (!usingOtherRangeWeapons && !usingHally() && !usingCross && !usingBow && !c.usingMagic)) || ((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 8) && (usingBow || usingCross || c.usingMagic)))) {
c.attackTimer = 2;
return;
}
if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)) {
c.sendMessage("You have run out of arrows!");
c.stopMovement();
c.npcIndex = 0;
return;
}
if(correctBowAndArrows() < c.playerEquipment[c.playerArrows] && Config.CORRECT_ARROWS && usingBow && !usingCrystalBow() && c.playerEquipment[c.playerWeapon] != 9185) {
c.sendMessage("You can't use "+c.getItems().getItemName(c.playerEquipment[c.playerArrows]).toLowerCase()+"s with a "+c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+".");
c.stopMovement();
c.npcIndex = 0;
return;
}
if (c.playerEquipment[c.playerWeapon] == 9185 && !properBolts()) {
c.sendMessage("You must use bolts with a crossbow.");
c.stopMovement();
resetPlayerAttack();
return;
}
if(usingBow || usingCross || c.usingMagic || usingOtherRangeWeapons || (c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && usingHally())) {
c.stopMovement();
}
if(!checkMagicReqs(c.spellId)) {
c.stopMovement();
c.npcIndex = 0;
return;
}
c.faceUpdate(i);
//c.specAccuracy = 1.0;
//c.specDamage = 1.0;
Server.npcHandler.npcs[i].underAttackBy = c.playerId;
Server.npcHandler.npcs[i].lastDamageTaken = System.currentTimeMillis();
if(c.usingSpecial && !c.usingMagic) {
if(checkSpecAmount(c.playerEquipment[c.playerWeapon])){
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
activateSpecial(c.playerEquipment[c.playerWeapon], i);
return;
} else {
c.sendMessage("You don't have the required special energy to use this attack.");
c.usingSpecial = false;
c.getItems().updateSpecialBar();
c.npcIndex = 0;
return;
}
}
c.specMaxHitIncrease = 0;
if(!c.usingMagic) {
c.startAnimation(getWepAnim(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()));
} else {
c.startAnimation(c.MAGIC_SPELLS[c.spellId][2]);
}
c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
c.lastArrowUsed = c.playerEquipment[c.playerArrows];
if(!usingBow && !usingCross && !c.usingMagic && !usingOtherRangeWeapons) { // melee hit delay
c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
c.projectileStage = 0;
c.oldNpcIndex = i;
}
if(usingBow && !usingOtherRangeWeapons && !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(getRangeStartGFX());
c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
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.getItems().deleteArrow();
}
fireProjectileNpc();
}
if(usingBow && usingCross && c.usingMagic && usingOtherRangeWeapons) {
c.getPA().followNpc();
c.stopMovement();
} else {
c.followId = 0;
c.followId2 = i;
}
if(usingOtherRangeWeapons && !c.usingMagic && !usingCross && !usingBow) { // knives, darts, etc hit delay
c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
c.getItems().deleteEquipment();
c.gfx100(getRangeStartGFX());
c.lastArrowUsed = 0;
c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
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 = Server.npcHandler.npcs[i].getX();
int nY = Server.npcHandler.npcs[i].getY();
int offX = (pY - nY)* -1;
int offY = (pX - nX)* -1;
c.castingMagic = true;
c.projectileStage = 2;
if(c.MAGIC_SPELLS[c.spellId][3] > 0) {
if(getStartGfxHeight() == 100) {
c.gfx100(c.MAGIC_SPELLS[c.spellId][3]);
} else {
c.gfx0(c.MAGIC_SPELLS[c.spellId][3]);
}
}
if(c.MAGIC_SPELLS[c.spellId][4] > 0) {
c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 78, c.MAGIC_SPELLS[c.spellId][4], getStartHeight(), getEndHeight(), i + 1, 50);
}
c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
c.oldNpcIndex = i;
c.oldSpellId = c.spellId;
c.spellId = 0;
if (!c.autocasting)
c.npcIndex = 0;
}if(c.curseActive[18]) { // SoulSplit GFX's - CAUSES CRASH
if(c.oldNpcIndex > 0) {
if(Server.npcHandler.npcs[c.oldNpcIndex] != null) {
try {
if(c.curseActive[18] && !c.prayerActive[23] && c.playerLevel[3] <= 99) {
int heal = 2;
if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
} else {
c.playerLevel[3] += heal;
}
c.getPA().refreshSkill(3);
}
final int pX = c.getX();
final int pY = c.getY();
final int nX = Server.npcHandler.npcs[c.oldNpcIndex].getX();
final int nY = Server.npcHandler.npcs[c.oldNpcIndex].getY();
final int offX = (pY - nY)* -1;
final int offY = (pX - nX)* -1;
c.SSPLIT = true;
c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2263, 9, 9, c.oldNpcIndex + 1, 24, 0);
EventManager.getSingleton().addEvent(new Event() {
public void execute(EventContainer b) {
//Server.npcHandler.npcs[c.oldNpcIndex].gfx0(2264); // 1738
//Server.npcHandler.npcs[c.oldNpcIndex].gfx0(1738); //2264
c.SSPLIT = false;
b.stop();
}
}, 500);
/*EventManager.getSingleton().addEvent(new Event() { // CAUSES CRASH
public void execute(EventContainer b) {
//c.getPA().createPlayersProjectile2(nX, nY, offX, offY, 50, 50, 2263, 9, 9, - c.playerId - 1, 24, 0);
b.stop();
}
}, 800);*/
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
if(c.crystalBowArrowCount >= 250){
switch(c.playerEquipment[c.playerWeapon]) {
case 4223: // 1/10 bow
c.getItems().wearItem(-1, 1, 3);
c.sendMessage("Your crystal bow has fully degraded.");
if(!c.getItems().addItem(4207, 1)) {
Server.itemHandler.createGroundItem(c, 4207, c.getX(), c.getY(), 1, c.getId());
}
c.crystalBowArrowCount = 0;
break;
default:
c.getItems().wearItem(++c.playerEquipment[c.playerWeapon], 1, 3);
c.sendMessage("Your crystal bow degrades.");
c.crystalBowArrowCount = 0;
break;
}
}
}
}
}