this is the fix for the npc casting search in worldpacketsdecoder.java and replace all of this
Code:
} else if (packetId == INTERFACE_ON_NPC) {
if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead()) {
return;
}
if (player.getLockDelay() > Utils.currentTimeMillis()) {
return;
}
int slot = stream.readUnsignedShortLE128();
stream.readUnsignedShortLE();
int npcIndex = stream.readUnsignedShortLE();
int interfaceHash = stream.readIntV2();
stream.readByte();
int interfaceId = interfaceHash >> 16;
int componentId = interfaceHash - (interfaceId << 16);
if (Utils.getInterfaceDefinitionsSize() <= interfaceId) {
return;
}
if (!player.getInterfaceManager().containsInterface(interfaceId)) {
return;
}
if (componentId == 65535) {
componentId = -1;
}
if (componentId != -1 && Utils.getInterfaceDefinitionsComponentsSize(interfaceId) <= componentId) {
return;
}
NPC npc = World.getNPCs().get(npcIndex);
if (npc == null || npc.isDead() || npc.hasFinished() || !player.getMapRegionsIds().contains(npc.getRegionId())) {
return;
}
player.stopAll(false);
switch (interfaceId) {
case Inventory.INVENTORY_INTERFACE:
Item item = player.getInventory().getItem(slot);
if (item == null) {
return;
}
if (!player.getInventory().containsItem(item.getId(), item.getAmount())) {
return;
}
if (!player.getControlerManager().processItemOnNPC(npc, item)) {
return;
}
//InventoryOptionsHandler.handleItemOnNPC(player, npc, item);
break;
case 662:
case 747:
if (player.getFamiliar() == null)
return;
player.resetWalkSteps();
if ((interfaceId == 747 && componentId == 14)
|| (interfaceId == 662 && componentId == 65)
|| (interfaceId == 662 && componentId == 74)
|| interfaceId == 747 && componentId == 17
|| interfaceId == 747 && componentId == 23) {
if ((interfaceId == 662 && componentId == 74 || interfaceId == 747
&& componentId == 17)) {
if (player.getFamiliar().getSpecialAttack() != SpecialAttack.ENTITY)
return;
}
if (npc == player.getFamiliar()) {
player.getPackets().sendGameMessage(
"You can't attack your own familiar.");
return;
}
if (!player.getFamiliar().canAttack(npc)) {
player.getPackets()
.sendGameMessage(
"You can only use your familiar in a multi-zone area.");
return;
} else {
player.getFamiliar().setSpecial(
interfaceId == 662 && componentId == 74
|| interfaceId == 747
&& componentId == 17);
player.getFamiliar().setTarget(npc);
}
}
break;
case 193:
switch (componentId) {
case 28:
case 32:
case 24:
case 20:
case 30:
case 34:
case 26:
case 22:
case 29:
case 33:
case 25:
case 21:
case 31:
case 35:
case 27:
case 23:
if (Magic.checkCombatSpell(player, componentId, 1, false)) {
player.setNextFaceWorldTile(new WorldTile(npc
.getCoordFaceX(npc.getSize()), npc
.getCoordFaceY(npc.getSize()), npc.getPlane()));
if (!player.getControlerManager().canAttack(npc))
return;
if (npc instanceof Familiar) {
Familiar familiar = (Familiar) npc;
if (familiar == player.getFamiliar()) {
player.getPackets().sendGameMessage(
"You can't attack your own familiar.");
return;
}
if (!familiar.canAttack(player)) {
player.getPackets().sendGameMessage(
"You can't attack this npc.");
return;
}
} else if (!npc.isForceMultiAttacked()) {
if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
if (player.getAttackedBy() != npc
&& player.getAttackedByDelay() > Utils
.currentTimeMillis()) {
player.getPackets().sendGameMessage(
"You are already in combat.");
return;
}
if (npc.getAttackedBy() != player
&& npc.getAttackedByDelay() > Utils
.currentTimeMillis()) {
player.getPackets().sendGameMessage(
"This npc is already in combat.");
return;
}
}
}
player.getActionManager().setAction(new PlayerCombat(npc));
}
break;
}
case 192:
switch (componentId) {
case 25: // air strike
case 28: // water strike
case 30: // earth strike
case 32: // fire strike
case 34: // air bolt
case 39: // water bolt
case 42: // earth bolt
case 45: // fire bolt
case 49: // air blast
case 52: // water blast
case 58: // earth blast
case 63: // fire blast
case 70: // air wave
case 73: // water wave
case 77: // earth wave
case 80: // fire wave
case 84: // air surge
case 87: // water surge
case 89: // earth surge
case 66: // Sara Strike
case 67: // Guthix Claws
case 68: // Flame of Zammy
case 93:
case 91: // fire surge
case 99: // storm of Armadyl
case 36: // bind
case 55: // snare
case 81: // entangle
if (Magic.checkCombatSpell(player, componentId, 1, false)) {
player.setNextFaceWorldTile(new WorldTile(npc
.getCoordFaceX(npc.getSize()), npc
.getCoordFaceY(npc.getSize()), npc.getPlane()));
if (!player.getControlerManager().canAttack(npc))
return;
if (npc instanceof Familiar) {
Familiar familiar = (Familiar) npc;
if (familiar == player.getFamiliar()) {
player.getPackets().sendGameMessage(
"You can't attack your own familiar.");
return;
}
if (!familiar.canAttack(player)) {
player.getPackets().sendGameMessage(
"You can't attack this npc.");
return;
}
} else if (!npc.isForceMultiAttacked()) {
if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
if (player.getAttackedBy() != npc
&& player.getAttackedByDelay() > Utils
.currentTimeMillis()) {
player.getPackets().sendGameMessage(
"You are already in combat.");
return;
}
if (npc.getAttackedBy() != player
&& npc.getAttackedByDelay() > Utils
.currentTimeMillis()) {
player.getPackets().sendGameMessage(
"This npc is already in combat.");
return;
}
}
}
player.getActionManager().setAction(new PlayerCombat(npc));
}
break;
}
break;
}
with this instead
Code:
} else if (packetId == INTERFACE_ON_NPC) {
if (!player.hasStarted() || !player.clientHasLoadedMapRegion() || player.isDead()) {
return;
}
if (player.getLockDelay() > Utils.currentTimeMillis()) {
return;
}
int slot = stream.readUnsignedShortLE128();
stream.readUnsignedShortLE();
int npcIndex = stream.readUnsignedShortLE();
int interfaceHash = stream.readIntV2();
stream.readByte();
int interfaceId = interfaceHash >> 16;
int componentId = interfaceHash - (interfaceId << 16);
if (Utils.getInterfaceDefinitionsSize() <= interfaceId) {
return;
}
if (!player.getInterfaceManager().containsInterface(interfaceId)) {
return;
}
if (componentId == 65535) {
componentId = -1;
}
if (componentId != -1 && Utils.getInterfaceDefinitionsComponentsSize(interfaceId) <= componentId) {
return;
}
NPC npc = World.getNPCs().get(npcIndex);
if (npc == null || npc.isDead() || npc.hasFinished() || !player.getMapRegionsIds().contains(npc.getRegionId())) {
return;
}
player.stopAll(false);
switch (interfaceId) {
case Inventory.INVENTORY_INTERFACE:
Item item = player.getInventory().getItem(slot);
if (item == null) {
return;
}
if (!player.getInventory().containsItem(item.getId(), item.getAmount())) {
return;
}
if (!player.getControlerManager().processItemOnNPC(npc, item)) {
return;
}
//InventoryOptionsHandler.handleItemOnNPC(player, npc, item);
break;
case 662:
case 747:
if (player.getFamiliar() == null)
return;
player.resetWalkSteps();
if ((interfaceId == 747 && componentId == 14)
|| (interfaceId == 662 && componentId == 65)
|| (interfaceId == 662 && componentId == 74)
|| interfaceId == 747 && componentId == 17
|| interfaceId == 747 && componentId == 23) {
if ((interfaceId == 662 && componentId == 74 || interfaceId == 747
&& componentId == 17)) {
if (player.getFamiliar().getSpecialAttack() != SpecialAttack.ENTITY)
return;
}
if (npc == player.getFamiliar()) {
player.getPackets().sendGameMessage(
"You can't attack your own familiar.");
return;
}
if (!player.getFamiliar().canAttack(npc)) {
player.getPackets()
.sendGameMessage(
"You can only use your familiar in a multi-zone area.");
return;
} else {
player.getFamiliar().setSpecial(
interfaceId == 662 && componentId == 74
|| interfaceId == 747
&& componentId == 17);
player.getFamiliar().setTarget(npc);
}
}
break;
case 193:
switch (componentId) {
case 28:
case 32:
case 24:
case 20:
case 30:
case 34:
case 36:
case 38:
case 37:
case 39:
case 26:
case 22:
case 29:
case 33:
case 25:
case 21:
case 31:
case 35:
case 27:
case 23:
if (Magic.checkCombatSpell(player, componentId, 1, false)) {
player.setNextFaceWorldTile(new WorldTile(npc.getCoordFaceX(npc.getSize()), npc.getCoordFaceY(npc.getSize()), npc.getPlane()));
if (!player.getControlerManager().canAttack(npc)) {
return;
}
if (npc instanceof Familiar) {
Familiar familiar = (Familiar) npc;
if (familiar == player.getFamiliar()) {
player.getPackets().sendGameMessage("You can't attack your own familiar.");
return;
}
if (!familiar.canAttack(player)) {
player.getPackets().sendGameMessage("You can't attack this npc.");
return;
}
} else if (!npc.isForceMultiAttacked()) {
if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
if (player.getAttackedBy() != npc && player.getAttackedByDelay() > Utils.currentTimeMillis()) {
player.getPackets().sendGameMessage("You are already in combat.");
return;
}
if (npc.getAttackedBy() != player && npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
player.getPackets().sendGameMessage("This npc is already in combat.");
return;
}
}
}
player.getActionManager().setAction(new PlayerCombat(npc));
}
break;
}
case 192:
switch (componentId) {
case 98: // wind rush
case 25: // air strike
case 28: // water strike
case 30: // earth strike
case 32: // fire strike
case 34: // air bolt
case 39: // water bolt
case 42: // earth bolt
case 45: // fire bolt
case 49: // air blast
case 52: // water blast
case 58: // earth blast
case 63: // fire blast
case 70: // air wave
case 73: // water wave
case 77: // earth wave
case 80: // fire wave
case 84: // air surge
case 87: // water surge
case 89: // earth surge
case 66: // Sara Strike
case 67: // Guthix Claws
case 68: // Flame of Zammy
case 93:
case 91: // fire surge
case 99: // storm of Armadyl
case 36: // bind
case 55: // snare
case 81: // entangle
if (Magic.checkCombatSpell(player, componentId, 1, false)) {
player.setNextFaceWorldTile(new WorldTile(npc.getCoordFaceX(npc.getSize()), npc.getCoordFaceY(npc.getSize()), npc.getPlane()));
if (!player.getControlerManager().canAttack(npc)) {
return;
}
if (npc instanceof Familiar) {
Familiar familiar = (Familiar) npc;
if (familiar == player.getFamiliar()) {
player.getPackets().sendGameMessage("You can't attack your own familiar.");
return;
}
if (!familiar.canAttack(player)) {
player.getPackets().sendGameMessage("You can't attack this npc.");
return;
}
} else if (!npc.isForceMultiAttacked()) {
if (!npc.isAtMultiArea() || !player.isAtMultiArea()) {
if (player.getAttackedBy() != npc && player.getAttackedByDelay() > Utils.currentTimeMillis()) {
player.getPackets().sendGameMessage("You are already in combat.");
return;
}
if (npc.getAttackedBy() != player && npc.getAttackedByDelay() > Utils.currentTimeMillis()) {
player.getPackets().sendGameMessage("This npc is already in combat.");
return;
}
}
}
player.getActionManager().setAction(new PlayerCombat(npc));
}
break;
}
break;
}