Code:
package online.server.content.combat;
import online.server.Engine;
import online.server.model.npcs.NPC;
import online.server.model.players.Player;
import online.server.util.Misc;
public class NPCCombat {
public synchronized void npcCombat(Player p, NPC n) {
if (!canAttack(p)) {
return;
}
boolean useBow = false;
int wepId = p.getItems().getEquipment()[3];
int arrowId = p.getItems().getEquipment()[13]; // Unused right now.
if (wepId >= 800 && wepId <= 876 || wepId >= 4212 && wepId <= 4223 || wepId == 4734 || wepId == 6724 || wepId == 6522 ||
wepId >= 9174 && wepId <= 9186 || wepId == 11235) {
useBow = true;
}
if (useBow && Misc.getDistance(n.getX(), n.getY(), p.getX(), p.getY()) <= 8) {
Engine.playerManager.resetWalking(p);
}
if (p.getCombat().getCombatDelay() > 0) {
return;
}
int hitDiff;
int pDelay;
NPCProjectile projectile;
if (!useBow) {
if (Misc.getDistance(n.getX(), n.getY(), p.getX(), p.getY()) != 1) {
return;
}
hitDiff = Misc.random(getMeleePower(p));
p.getMasks().requestAnim(getAttackAnimation(wepId), 0);
projectile = new NPCProjectile(n, 50, 0);
pDelay = 500;
} else {
if (Misc.getDistance(n.getX(), n.getY(), p.getX(), p.getY()) == 0 || Misc.getDistance(n.getX(), n.getY(), p.getX(), p.getY()) > 8) {
return;
}
hitDiff = Misc.random(5);
p.getMasks().requestAnim(getAttackAnimation(wepId), 0);
projectile = new NPCProjectile(n, hitDiff, 1);
pDelay = 1199;
int offsetX = (p.getX() - n.getX()) * -1;
int offsetY = (p.getY() - n.getY()) * -1;
createGlobalProjectile(p, p.getX(), p.getY(), offsetX, offsetY, getRangeProjectile(p, wepId, arrowId), 43, 31, 70, -p.getCombat().getAttackPlayer() - 1);
}
Engine.eventManager.addEvent(projectile, pDelay);
p.getCombat().setCombatDelay(getWeaponSpeed(wepId));
}
public void createGlobalProjectile(Player p, int casterX, int casterY, int offsetX, int offsetY, int gfxMoving, int startHeight, int endHeight,
int speed, int atkIndex) {
for (Player p2 : Engine.playerManager.getPlayers()) {
if (!p2.isLoggedIn() || p2.getHeight() != p.getHeight() || p2.getDisconnected()[0]) {
continue;
}
if (Misc.getDistance(p.getX(), p.getY(), p2.getX(), p2.getY()) > 25) {
continue;
}
p2.getPackets().createProjectile(casterX, casterY, offsetX, offsetY, gfxMoving, startHeight, endHeight, speed, atkIndex);
}
}
public int getMeleePower(Player p) {
int strengthLevel = p.getSkillLvl()[2];
double maxHit = 1.05 + (p.getItems().getEquipmentBonus()[10] * strengthLevel) * 0.00175;
maxHit += strengthLevel * 0.11;
return (int) maxHit;
}
public int getWeaponSpeed(int wepId) {
String weapon = Engine.itemManager.getItemName(wepId);
if (weapon.endsWith(" dart") || weapon.endsWith(" knife")) {
return 2;
} else if (weapon.startsWith("Karils crossbow") || weapon.startsWith("Toktz-xil-ul")) {
return 3;
} else if (weapon.endsWith("shortbow") || weapon.startsWith("Shortbow")) {
return 3;
} else if (weapon.startsWith("Comp ogre bow") || weapon.startsWith("Seercull") || weapon.endsWith("dagger(+)")) {
return 4;
} else if (weapon.startsWith("Crystal bow") || weapon.startsWith("New crystal bow") || weapon.endsWith(" claws")) {
return 4;
} else if (weapon.endsWith("dagger") || weapon.endsWith("dagger(s)") || weapon.endsWith("dagger(p)")) {
return 4;
} else if (weapon.endsWith(" sword") || weapon.endsWith("scimitar") || weapon.endsWith("thrownaxe")) {
return 4;
} else if (weapon.endsWith("Toktz-xil-ak") || weapon.startsWith("Ancient staff") || weapon.startsWith("Slayer's staff")) {
return 4;
} else if (weapon.endsWith("Toktz-xil-ek") || weapon.startsWith("Abyssal whip") || weapon.startsWith("Saradomin sword")) {
return 4;
} else if (weapon.startsWith("Zamorak staff") || weapon.startsWith("Saradomin staff") || weapon.startsWith("Guthix staff")) {
return 4;
} else if (weapon.startsWith("Torags hammers") || weapon.startsWith("Guthans warspear") || weapon.startsWith("Veracs flail")) {
return 5;
} else if (weapon.endsWith("mace") || weapon.endsWith(" axe") || weapon.endsWith("longsword") || weapon.endsWith("c'bow")) {
return 5;
} else if (weapon.endsWith(" spear") || weapon.endsWith("longbow") || weapon.endsWith("Longbow")) {
return 5;
} else if (weapon.endsWith("pickaxe") || weapon.endsWith(" staff") || weapon.endsWith(" battlestaff")) {
return 5;
} else if (weapon.endsWith("Tzhaar-ket-em") || weapon.endsWith("javelin")) {
return 5;
} else if (weapon.startsWith("Toktz-mej-tal") || weapon.startsWith("Ahrims staff")) {
return 6;
} else if (weapon.endsWith("battleaxe") || weapon.endsWith("warhammer")) {
return 6;
} else if (weapon.startsWith("Granite maul") || weapon.startsWith("Tzhaar-ket-om") || weapon.startsWith("Ogre bow")) {
return 7;
} else if (weapon.startsWith("Dharoks greataxe") || weapon.endsWith("2h sword") || weapon.endsWith("halberd")) {
return 7;
} else if (weapon.endsWith("godsword")) {
return 8;
} else if (weapon.startsWith("Dark bow")) {
return 8;
}
return 6;
}
public int getAttackAnimation(int wepId) {
String weapon = Engine.itemManager.getItemName(wepId);
if (weapon.startsWith("Unarmed")) {
return 422;
} else if (weapon.startsWith("Guthans warspear")) {
return 2081;
} else if (weapon.startsWith("Dragon dagger")) {
return 402;
} else if (weapon.startsWith("Dharoks greataxe")) {
return 2066;
} else if (weapon.startsWith("Karils crossbow")) {
return 2075;
} else if (weapon.startsWith("Tzhaar-ket-om")) {
return 2661;
} else if (weapon.startsWith("Granite maul")) {
return 1665;
} else if (weapon.startsWith("Veracs flail")) {
return 2062;
} else if (weapon.startsWith("Abyssal whip")) {
return 1658;
} else if (weapon.startsWith("Torags hammers")) {
return 2068;
} else if (weapon.startsWith("Toktz-xil-ul")) {
return 2614;
} else if (weapon.endsWith("shortbow") || weapon.startsWith("Shortbow") || weapon.endsWith("longbow") ||
weapon.startsWith("Longbow") || weapon.startsWith("Seercull") || weapon.startsWith("Crystal bow") || weapon.startsWith("New crystal bow")
|| weapon.startsWith("Dark bow")) {
return 426;
} else if (weapon.endsWith("thrownaxe") || weapon.contains("javelin") || weapon.contains("knife")) {
return 0x326;
} else if (weapon.contains("dart")) {
return 582;
} else if (weapon.endsWith("crossbow") || weapon.startsWith("Crossbow")) {
return 427;
} else if (weapon.endsWith("c'bow")) {
return 4230;
} else if (weapon.contains("dagger") || weapon.endsWith("pickaxe")) {
return 412;
} else if (weapon.endsWith("2h sword") || weapon.endsWith("godsword") || weapon.startsWith("Saradomin sword")) {
return 7041;
} else if (weapon.endsWith("sword") || weapon.endsWith("mace") || weapon.endsWith("longsword") || weapon.endsWith("scimitar")) {
return 451;
} else if (weapon.endsWith("axe") || weapon.endsWith("battleaxe")) {
return 1833;
} else if (weapon.endsWith("halberd") || weapon.endsWith("spear")) {
return 440;
} else if (wepId == 10887) {
return 5865;
}
return 451;
}
public int getRangeProjectile(Player p, int weaponId, int arrowId) {
if (weaponId == 4214 || weaponId == 4212)
return 249;
else if (weaponId == 837 || weaponId == 4734)
return 27;
else if (weaponId == 6522)
return 442;
else if (weaponId == 806)
return 226;
else if (weaponId == 807)
return 227;
else if (weaponId == 808)
return 228;
else if (weaponId == 809)
return 229;
else if (weaponId == 810)
return 230;
else if (weaponId == 811)
return 231;
else if (weaponId == 864)
return 212;
else if (weaponId == 863)
return 213;
else if (weaponId == 865)
return 214;
else if (weaponId == 869)
return 215;
else if (weaponId == 866)
return 216;
else if (weaponId == 867)
return 217;
else if (weaponId == 868)
return 218;
else if (weaponId == 825)
return 200;
else if (weaponId == 826)
return 201;
else if (weaponId == 827)
return 202;
else if (weaponId == 828)
return 203;
else if (weaponId == 829)
return 204;
else if (weaponId == 830)
return 205;
else if (weaponId == 800)
return 36;
else if (weaponId == 801)
return 35;
else if (weaponId == 802)
return 37;
else if (weaponId == 803)
return 38;
else if (weaponId == 804)
return 39;
else if (weaponId == 805)
return 41;
else if (weaponId == 11230)
return 1122;
else if (arrowId == 882)
return 10;
else if (arrowId == 884)
return 9;
else if (arrowId == 886)
return 11;
else if (arrowId == 888)
return 12;
else if (arrowId == 890)
return 13;
else if (arrowId == 892)
return 15;
else if (arrowId == 7988)
return 618;
else if (arrowId == 7989)
return 619;
else if (arrowId == 7906)
return 621;
else
return 27;
}
public boolean canAttack(Player p) {
return true;
}
public int getDeathDelay(int type) {
switch (type) {
default:
return 6;
}
}
public int getDeathAnim(int type) {
switch (type) {
case 50:
return 90;
default:
return 7197;
}
}
}
Using my NPCProjectile class:
Code:
package online.server.content.combat;
import online.server.event.Event;
import online.server.event.EventAction;
import online.server.model.npcs.NPC;
public class NPCProjectile implements Event {
private NPC n;
private int hitDiff;
private int hitType;
private int gfxId = -1;
private int gfxHeight = 0;
private int animationId = -1;
private boolean displayDamage = true;
public NPCProjectile(NPC n, int hitDiff, int hitType) {
this.n = n;
this.hitDiff = hitDiff;
this.hitType = hitType;
}
public void setGFX(final int id, final int height) {
gfxId = id;
gfxHeight = height;
}
public void setAnim(final int id) {
animationId = id;
}
public void displayDamage(final boolean displayDamage) {
this.displayDamage = displayDamage;
}
public void execute(EventAction e) {
if (n.isDead()) {
if (gfxId > -1) {
n.getMasks().requestGFX(gfxId, gfxHeight);
}
if (animationId > -1) {
n.getMasks().requestAnim(animationId, 0);
}
if (displayDamage) {
n.appendHit(hitDiff, hitType);
}
}
e.stop();
}
public void stop(EventAction e) {
}
}
It should hit but it doesn't