wel basicly i got kalphite queen working, but it doesnt attack with kalphite queen attacks, so i wonder if anyone has the combat script of kalphite queen and where to put it. im using revision 667.
heres my KalphiteQueen.java:
Code:
package com.rs.game.npc.kalph;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.rs.cores.CoresManager;
import com.rs.game.Animation;
import com.rs.game.Entity;
import com.rs.game.Graphics;
import com.rs.game.World;
import com.rs.game.WorldTile;
import com.rs.game.npc.NPC;
import com.rs.game.npc.combat.NPCCombatDefinitions;
import com.rs.game.player.Player;
import com.rs.game.tasks.WorldTask;
import com.rs.game.tasks.WorldTasksManager;
import com.rs.utils.Utils;
@SuppressWarnings("serial")
public class KalphiteQueen extends NPC {
public KalphiteQueen(int id, WorldTile tile, int mapAreaNameHash,
boolean canBeAttackFromOutOfArea, boolean spawned) {
super(id, tile, mapAreaNameHash, canBeAttackFromOutOfArea, spawned);
setLureDelay(0);
}
@Override
public ArrayList<Entity> getPossibleTargets() {
ArrayList<Entity> possibleTarget = new ArrayList<Entity>();
for (int regionId : getMapRegionsIds()) {
List<Integer> playerIndexes = World.getRegion(regionId)
.getPlayerIndexes();
if (playerIndexes != null) {
for (int npcIndex : playerIndexes) {
Player player = World.getPlayers().get(npcIndex);
if (player == null
|| player.isDead()
|| player.hasFinished()
|| !player.isRunning()
|| !player.withinDistance(this, 64)
|| ((!isAtMultiArea() || !player.isAtMultiArea())
&& player.getAttackedBy() != this && player
.getAttackedByDelay() > Utils
.currentTimeMillis())
|| !clipedProjectile(player, false))
continue;
possibleTarget.add(player);
}
}
}
return possibleTarget;
}
@Override
public void sendDeath(final Entity source) {
// TODO Finish up first & second death
final NPC n = (NPC) this;
final NPCCombatDefinitions defs = getCombatDefinitions();
resetWalkSteps();
getCombat().removeTarget();
setNextAnimation(null);
WorldTasksManager.schedule(new WorldTask() {
int step;
NPC kq;
@Override
public void run() {
if (getId() == 1158) {
if (step == 10) {
stop();
}
if (step == 0) {
setNextAnimation(new Animation(defs.getDeathEmote()));
}
if (step == 2) {
finish();
kq = new NPC(1160, n, -1, true, true);
kq.setNextGraphics(new Graphics(1055));
}
if (step == 8) {
}
} else if (getId() == 1160) {
if (step == 4) {
finish();
stop();
}
if (step == 0) {
setNextAnimation(new Animation(defs.getDeathEmote()));
CoresManager.slowExecutor.schedule(new Runnable() {
@Override
public void run() {
try {
spawn();
} catch (Exception e) {
e.printStackTrace();
} catch (Error e) {
e.printStackTrace();
}
}
}, getCombatDefinitions().getRespawnDelay() * 600,
TimeUnit.MILLISECONDS);
}
}
step++;
}
}, 0, 1);
}
public void respawn() {
setFinished(false);
World.addNPC(this);
setLastRegionId(0);
World.updateEntityRegion(this);
loadMapRegions();
checkMultiArea();
}
public static boolean atKQ(WorldTile tile) {
if ((tile.getX() >= 3462 && tile.getX() <= 3510)
&& (tile.getY() >= 9462 && tile.getY() <= 9528))
return true;
return false;
}
}
i saw that other bosses had a *bossname*Combat.java but kalphite queen didnt have one
for example bandos had:
GeneralGraardor.java
Code:
package com.rs.game.npc.godwars.bandos;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.rs.cores.CoresManager;
import com.rs.game.Animation;
import com.rs.game.Entity;
import com.rs.game.World;
import com.rs.game.WorldTile;
import com.rs.game.minigames.GodWarsBosses;
import com.rs.game.npc.NPC;
import com.rs.game.npc.combat.NPCCombatDefinitions;
import com.rs.game.player.Player;
import com.rs.game.tasks.WorldTask;
import com.rs.game.tasks.WorldTasksManager;
@SuppressWarnings("serial")
public class GeneralGraardor extends NPC {
public GeneralGraardor(int id, WorldTile tile, int mapAreaNameHash,
boolean canBeAttackFromOutOfArea, boolean spawned) {
super(id, tile, mapAreaNameHash, canBeAttackFromOutOfArea, spawned);
}
@Override
public ArrayList<Entity> getPossibleTargets() {
ArrayList<Entity> possibleTarget = new ArrayList<Entity>();
for (int regionId : getMapRegionsIds()) {
List<Integer> playerIndexes = World.getRegion(regionId)
.getPlayerIndexes();
if (playerIndexes != null) {
for (int npcIndex : playerIndexes) {
Player player = World.getPlayers().get(npcIndex);
if (player == null
|| player.isDead()
|| player.hasFinished()
|| !player.isRunning()
|| !player.withinDistance(this, 64)
|| ((!isAtMultiArea() || !player.isAtMultiArea())
&& player.getAttackedBy() != this && player
.getAttackedByDelay() > System
.currentTimeMillis())
|| !clipedProjectile(player, false))
continue;
possibleTarget.add(player);
}
}
}
return possibleTarget;
}
/*
* gotta override else setRespawnTask override doesnt work
*/
@Override
public void sendDeath(Entity source) {
final NPCCombatDefinitions defs = getCombatDefinitions();
resetWalkSteps();
getCombat().removeTarget();
setNextAnimation(null);
WorldTasksManager.schedule(new WorldTask() {
int loop;
@Override
public void run() {
if (loop == 0) {
drop();
setNextAnimation(new Animation(defs.getDeathEmote()));
} else if (loop >= defs.getDeathDelay()) {
reset();
setLocation(getRespawnTile());
finish();
setRespawnTask();
stop();
}
loop++;
}
}, 0, 1);
}
@Override
public void setRespawnTask() {
if (!hasFinished()) {
reset();
setLocation(getRespawnTile());
finish();
}
final NPC npc = this;
CoresManager.slowExecutor.schedule(new Runnable() {
@Override
public void run() {
setFinished(false);
World.addNPC(npc);
npc.setLastRegionId(0);
World.updateEntityRegion(npc);
loadMapRegions();
checkMultiArea();
GodWarsBosses.respawnBandosMinions();
}
}, getCombatDefinitions().getRespawnDelay() * 600,
TimeUnit.MILLISECONDS);
}
}
and GeneralGraardorCombat.java
Code:
package com.rs.game.npc.combat.impl;
import com.rs.game.Animation;
import com.rs.game.Entity;
import com.rs.game.ForceTalk;
import com.rs.game.World;
import com.rs.game.npc.NPC;
import com.rs.game.npc.combat.CombatScript;
import com.rs.game.npc.combat.NPCCombatDefinitions;
import com.rs.utils.Utils;
public class GeneralGraardorCombat extends CombatScript {
@Override
public Object[] getKeys() {
return new Object[] { 6260 };
}
@Override
public int attack(final NPC npc, final Entity target) {
final NPCCombatDefinitions defs = npc.getCombatDefinitions();
if (Utils.getRandom(4) == 0) {
switch (Utils.getRandom(10)) {
case 0:
npc.setNextForceTalk(new ForceTalk("Death to our enemies!"));
npc.playSound(3219, 2);
break;
case 1:
npc.setNextForceTalk(new ForceTalk("Brargh!"));
npc.playSound(3209, 2);
break;
case 2:
npc.setNextForceTalk(new ForceTalk("Break their bones!"));
break;
case 3:
npc.setNextForceTalk(new ForceTalk("For the glory of Bandos!"));
break;
case 4:
npc.setNextForceTalk(new ForceTalk("Split their skulls!"));
npc.playSound(3229, 2);
break;
case 5:
npc.setNextForceTalk(new ForceTalk(
"We feast on the bones of our enemies tonight!"));
npc.playSound(3206, 2);
break;
case 6:
npc.setNextForceTalk(new ForceTalk("CHAAARGE!"));
npc.playSound(3220, 2);
break;
case 7:
npc.setNextForceTalk(new ForceTalk("Crush them underfoot!"));
npc.playSound(3224, 2);
break;
case 8:
npc.setNextForceTalk(new ForceTalk("All glory to Bandos!"));
npc.playSound(3205, 2);
break;
case 9:
npc.setNextForceTalk(new ForceTalk("GRAAAAAAAAAR!"));
npc.playSound(3207, 2);
break;
case 10:
npc.setNextForceTalk(new ForceTalk(
"FOR THE GLORY OF THE BIG HIGH WAR GOD!"));
break;
}
}
if (Utils.getRandom(2) == 0) { // range magical attack
npc.setNextAnimation(new Animation(7063));
for (Entity t : npc.getPossibleTargets()) {
delayHit(
npc,
1,
t,
getRangeHit(
npc,
getRandomMaxHit(npc, 355,
NPCCombatDefinitions.RANGE, t)));
World.sendProjectile(npc, t, 1200, 41, 16, 41, 35, 16, 0);
}
} else { // melee attack
npc.setNextAnimation(new Animation(defs.getAttackEmote()));
delayHit(
npc,
0,
target,
getMeleeHit(
npc,
getRandomMaxHit(npc, defs.getMaxHit(),
NPCCombatDefinitions.MELEE, target)));
}
return defs.getAttackDelay();
}
}
thanks