mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-09 16:45:44 -07:00
Rewrote Canifis warewolf handling, fixed stats
Fixed bandit aggression
This commit is contained in:
parent
a44472e559
commit
53357d20f3
18 changed files with 675 additions and 1281 deletions
|
|
@ -25464,8 +25464,8 @@
|
||||||
"maxAmount": "1"
|
"maxAmount": "1"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ids": "1665,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6212,6213",
|
"ids": "6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6212,6213",
|
||||||
"description": "",
|
"description": "Werewolves (and human form for Canifis)",
|
||||||
"main": [
|
"main": [
|
||||||
{
|
{
|
||||||
"minAmount": "5",
|
"minAmount": "5",
|
||||||
|
|
@ -43345,280 +43345,6 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"default": [
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "100.0",
|
|
||||||
"id": "2859",
|
|
||||||
"maxAmount": "1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"charm": [
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "100.0",
|
|
||||||
"id": "12158",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "100.0",
|
|
||||||
"id": "12159",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "100.0",
|
|
||||||
"id": "12160",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "100.0",
|
|
||||||
"id": "12163",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5600.0",
|
|
||||||
"id": "0",
|
|
||||||
"maxAmount": "1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ids": "6028",
|
|
||||||
"description": "",
|
|
||||||
"main": [
|
|
||||||
{
|
|
||||||
"minAmount": "5",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "2138",
|
|
||||||
"maxAmount": "5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "5",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "2132",
|
|
||||||
"maxAmount": "5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "5",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "2136",
|
|
||||||
"maxAmount": "5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "1993",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "1325",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "1353",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "50",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "886",
|
|
||||||
"maxAmount": "50"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "1157",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "1329",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "1181",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "1109",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "1147",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "830",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "203",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "199",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "201",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "207",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "211",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "215",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "205",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "25.0",
|
|
||||||
"id": "209",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "213",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "2485",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "217",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "10",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "995",
|
|
||||||
"maxAmount": "10"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "90",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "995",
|
|
||||||
"maxAmount": "90"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "6814",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "958",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "7868",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "50.0",
|
|
||||||
"id": "227",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "1",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "245",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "983",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "239",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "1925",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "440",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "5.0",
|
|
||||||
"id": "31",
|
|
||||||
"maxAmount": "1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"minAmount": "1",
|
|
||||||
"weight": "100.0",
|
|
||||||
"id": "0",
|
|
||||||
"maxAmount": "1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"default": [],
|
"default": [],
|
||||||
"charm": [],
|
"charm": [],
|
||||||
|
|
|
||||||
|
|
@ -38696,7 +38696,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"destroy_message": "Another can be received from pickpocketing Dr. Fenkenstrain in the tower.",
|
"destroy_message": "Another can be received from pickpocketing Dr. Fenkenstrain in the tower.",
|
||||||
"examine": "Unactivated: The Ring of charos.Activated: The power within this ring has been activated.",
|
"examine": "The Ring of charos",
|
||||||
"durability": null,
|
"durability": null,
|
||||||
"name": "Ring of charos",
|
"name": "Ring of charos",
|
||||||
"tradeable": "false",
|
"tradeable": "false",
|
||||||
|
|
@ -59397,7 +59397,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"destroy_message": "Another can be received from pickpocketing Dr. Fenkenstrain in the tower.",
|
"destroy_message": "Another can be received from pickpocketing Dr. Fenkenstrain in the tower.",
|
||||||
"examine": "Unactivated: The Ring of charos.Activated: The power within this ring has been activated.",
|
"examine": "The power within this ring has been activated.",
|
||||||
"durability": null,
|
"durability": null,
|
||||||
"name": "Ring of charos(a)",
|
"name": "Ring of charos(a)",
|
||||||
"tradeable": "false",
|
"tradeable": "false",
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,46 +0,0 @@
|
||||||
package content.region.desert.bandits.handlers
|
|
||||||
|
|
||||||
import core.api.*
|
|
||||||
import core.game.node.entity.Entity
|
|
||||||
import core.game.node.entity.combat.BattleState
|
|
||||||
import core.game.node.entity.npc.NPC
|
|
||||||
import core.game.node.entity.npc.NPCBehavior
|
|
||||||
import core.game.world.map.RegionManager
|
|
||||||
import core.tools.RandomFunction
|
|
||||||
import org.rs09.consts.NPCs
|
|
||||||
|
|
||||||
class BanditBehavior : NPCBehavior(NPCs.BANDIT_1926) {
|
|
||||||
override fun tick(self: NPC): Boolean {
|
|
||||||
if (!self.inCombat() && RandomFunction.roll(3) && getWorldTicks() % 5 == 0) {
|
|
||||||
val players = RegionManager.getLocalPlayers(self, 5)
|
|
||||||
for (player in players) {
|
|
||||||
if (player.inCombat()) continue
|
|
||||||
if (hasGodItem(player, God.SARADOMIN)) {
|
|
||||||
sendChat(self, "Prepare to die, Saradominist scum!")
|
|
||||||
self.attack(player)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
else if (hasGodItem(player, God.ZAMORAK)) {
|
|
||||||
sendChat(self, "Prepare to die, Zamorakian scum!")
|
|
||||||
self.attack(player)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun afterDamageReceived(self: NPC, attacker: Entity, state: BattleState) {
|
|
||||||
if (getAttribute(self, "alerted-others", false)) return
|
|
||||||
val otherBandits = RegionManager.getLocalNpcs(self, 3).filter { it.id == self.id }
|
|
||||||
for (bandit in otherBandits) {
|
|
||||||
if (!bandit.inCombat())
|
|
||||||
bandit.attack(attacker)
|
|
||||||
}
|
|
||||||
setAttribute(self, "alerted-others", true)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDeathStarted(self: NPC, killer: Entity) {
|
|
||||||
removeAttribute(self, "alerted-others")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package content.region.desert.bandits.handlers
|
||||||
|
|
||||||
|
import core.api.God
|
||||||
|
import core.api.hasGodItem
|
||||||
|
import core.game.node.entity.Entity
|
||||||
|
import core.game.node.entity.combat.BattleState
|
||||||
|
import core.game.node.entity.npc.AbstractNPC
|
||||||
|
import core.game.node.entity.player.Player
|
||||||
|
import core.game.world.map.Location
|
||||||
|
import core.game.world.map.RegionManager
|
||||||
|
import core.plugin.Initializable
|
||||||
|
import org.rs09.consts.NPCs
|
||||||
|
|
||||||
|
@Initializable
|
||||||
|
class BanditNPC(id: Int = NPCs.BANDIT_1926, location: Location? = null) : AbstractNPC(id, location) {
|
||||||
|
private val supportRange: Int = 3
|
||||||
|
|
||||||
|
override fun construct(id: Int, location: Location, vararg objects: Any): AbstractNPC {
|
||||||
|
return BanditNPC(id, location)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun tick() {
|
||||||
|
if (!inCombat()) {
|
||||||
|
val players = RegionManager.getLocalPlayers(this, 5)
|
||||||
|
for (player in players) {
|
||||||
|
if (player.inCombat()) continue
|
||||||
|
if (hasGodItem(player, God.SARADOMIN)) {
|
||||||
|
sendChat("Time to die, Saradominist filth!")
|
||||||
|
attack(player)
|
||||||
|
break
|
||||||
|
} else if (hasGodItem(player, God.ZAMORAK)) {
|
||||||
|
sendChat("Prepare to suffer, Zamorakian scum!")
|
||||||
|
attack(player)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.tick()
|
||||||
|
}
|
||||||
|
|
||||||
|
//Clear target on death
|
||||||
|
override fun finalizeDeath(killer: Entity?) {
|
||||||
|
super.finalizeDeath(killer)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onImpact(entity: Entity?, state: BattleState?) {
|
||||||
|
if (entity is Player) {
|
||||||
|
RegionManager.getLocalNpcs(entity, supportRange).forEach {
|
||||||
|
if (it.id == NPCs.BANDIT_1926 && !it.properties.combatPulse.isAttacking && it != this) {
|
||||||
|
it.sendChat("You picked the wrong place to start trouble!")
|
||||||
|
it.attack(entity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.onImpact(entity, state)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getIds(): IntArray {
|
||||||
|
return intArrayOf(NPCs.BANDIT_1926)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the dialogue plugin used for the bros np.c
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class BrosDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code BrosDialogue} {@code Object}.
|
|
||||||
*/
|
|
||||||
public BrosDialogue() {
|
|
||||||
/**
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code BrosDialogue} {@code Object}.
|
|
||||||
* @param player the player.
|
|
||||||
*/
|
|
||||||
public BrosDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
return new BrosDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of my way, punk");
|
|
||||||
stage = 1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
switch (stage) {
|
|
||||||
case 1:
|
|
||||||
end();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6026, 6032 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the dialogue plugin used for the gregory npc.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class GregoryDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code GregoryDialogue} {@code Object}.
|
|
||||||
*/
|
|
||||||
public GregoryDialogue() {
|
|
||||||
/**
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code GregoryDialogue} {@code Object}.
|
|
||||||
* @param player the player.
|
|
||||||
*/
|
|
||||||
public GregoryDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
return new GregoryDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If I were as ugly as you I would not dare to show my", "face in public!");
|
|
||||||
stage = 1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
switch (stage) {
|
|
||||||
case 1:
|
|
||||||
end();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6033, 6027, 6043, 6036, 6040, 6038, 6045 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
package content.region.morytania.canifis.dialogue
|
||||||
|
|
||||||
|
import core.api.anyInEquipment
|
||||||
|
import core.api.toIntArray
|
||||||
|
import core.game.dialogue.DialoguePlugin
|
||||||
|
import core.game.dialogue.FacialExpression
|
||||||
|
import core.game.node.entity.player.Player
|
||||||
|
import core.plugin.Initializable
|
||||||
|
import core.tools.END_DIALOGUE
|
||||||
|
import core.tools.START_DIALOGUE
|
||||||
|
import org.rs09.consts.Items
|
||||||
|
|
||||||
|
@Initializable
|
||||||
|
class HumanWerewolfDialogue(player: Player? = null) : DialoguePlugin(player) {
|
||||||
|
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
|
||||||
|
when (stage){
|
||||||
|
START_DIALOGUE -> {
|
||||||
|
// There are 10 random different messages for all of the werewolves in human form
|
||||||
|
// If you have the Ring of Charos they think you're a werewolf and talk differently
|
||||||
|
if (anyInEquipment(player, Items.RING_OF_CHAROS_4202, Items.RING_OF_CHAROSA_6465)){
|
||||||
|
// Nice talks
|
||||||
|
when ((1..10).random()){
|
||||||
|
1 -> npcl(FacialExpression.HAPPY, "I bet you have wonderful paws.").also { stage = END_DIALOGUE }
|
||||||
|
2 -> npcl(FacialExpression.NEUTRAL, "A very miserable day, altogether... enjoy it while it lasts.").also { stage = END_DIALOGUE }
|
||||||
|
3 -> npcl(FacialExpression.ASKING, "If you catch anyone promise me you'll share.").also { stage = END_DIALOGUE }
|
||||||
|
4 -> npcl(FacialExpression.ASKING, "I haven't smelt you around here before...").also { stage = END_DIALOGUE }
|
||||||
|
5 -> npcl(FacialExpression.FRIENDLY, "You smell familiar...").also { stage = END_DIALOGUE }
|
||||||
|
6 -> npcl(FacialExpression.ASKING, "Seen any humans around here? I'm v-e-r-y hungry.").also { stage = END_DIALOGUE }
|
||||||
|
7 -> npcl(FacialExpression.FRIENDLY, "You look to me like someone with a healthy taste for blood.").also { stage = END_DIALOGUE }
|
||||||
|
8 -> npcl(FacialExpression.FRIENDLY, "Good day to you, my friend.").also { stage = END_DIALOGUE }
|
||||||
|
9 -> npcl(FacialExpression.ASKING, "Fancy going up to the castle for a bit of a snack?").also { stage = END_DIALOGUE }
|
||||||
|
10 -> npcl(FacialExpression.NEUTRAL, "Give me a moment, I have a bit of someone stuck in my teeth...").also { stage = END_DIALOGUE }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Mean talks
|
||||||
|
when ((1..10).random()){
|
||||||
|
1 -> npcl(FacialExpression.ANNOYED, "If I were as ugly as you I would not dare to show my face in public!").also { stage = END_DIALOGUE }
|
||||||
|
2 -> npcl(FacialExpression.ANGRY, "Out of my way, punk.").also { stage = END_DIALOGUE }
|
||||||
|
// The only one that has a path
|
||||||
|
3 -> npcl(FacialExpression.ASKING, "Hmm... you smell strange...").also { stage++ }
|
||||||
|
4 -> npcl(FacialExpression.ANGRY, "Leave me alone.").also { stage = END_DIALOGUE }
|
||||||
|
5 -> npcl(FacialExpression.ANNOYED, "Don't talk to me again if you value your life!").also { stage = END_DIALOGUE }
|
||||||
|
6 -> npcl(FacialExpression.ANNOYED, "Get lost!").also { stage = END_DIALOGUE }
|
||||||
|
7 -> npcl(FacialExpression.ANNOYED, "I don't have anything to give you so leave me alone, mendicant.").also { stage = END_DIALOGUE }
|
||||||
|
8 -> npcl(FacialExpression.ANGRY, "Have you no manners?").also { stage = END_DIALOGUE }
|
||||||
|
9 -> npcl(FacialExpression.ANNOYED, "I don't have time for this right now.").also { stage = END_DIALOGUE }
|
||||||
|
10 -> npcl(FacialExpression.ANGRY, "I have no interest in talking to a pathetic meat bag like yourself.").also{ stage = END_DIALOGUE}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// There's one path that the player can respond to (3 without the ring)
|
||||||
|
1 -> playerl(FacialExpression.ASKING, "Strange how?").also { stage++ }
|
||||||
|
2 -> npcl(FacialExpression.EVIL_LAUGH, "Like a human!").also { stage++ }
|
||||||
|
3 -> playerl(FacialExpression.PANICKED, "Oh! Er... I just ate one is why!").also { stage = END_DIALOGUE }
|
||||||
|
else -> {
|
||||||
|
end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getIds(): IntArray {
|
||||||
|
return (6026..6046).toIntArray()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the dialogue plugin used for the irina npc.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class IrinaDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code IrinaDialogue} {@code Object}.
|
|
||||||
*/
|
|
||||||
public IrinaDialogue() {
|
|
||||||
/**
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code IrinaDialogue} {@code Object}.
|
|
||||||
* @param player the player.
|
|
||||||
*/
|
|
||||||
public IrinaDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
return new IrinaDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of my way, punk.");
|
|
||||||
stage = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
switch (stage) {
|
|
||||||
case 0:
|
|
||||||
end();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6035 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the dialogue plugin used for the joseph npc.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class JosephDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code JosephDialogue} {@code Object}.
|
|
||||||
*/
|
|
||||||
public JosephDialogue() {
|
|
||||||
/**
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code JosephDialogue} {@code Object}.
|
|
||||||
* @param player the player.
|
|
||||||
*/
|
|
||||||
public JosephDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
return new JosephDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I have no interest in talking to a pathetic meat bag like", "yourself.");
|
|
||||||
stage = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
switch (stage) {
|
|
||||||
case 0:
|
|
||||||
end();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6029 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the NikitiaDialogue dialogue.
|
|
||||||
* @author 'Vexia
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public class NikitiaDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
public NikitiaDialogue() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public NikitiaDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
|
|
||||||
return new NikitiaDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't talk to me again if you value your life!");
|
|
||||||
stage = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
end();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6042 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the SofiyaDialogue dialogue.
|
|
||||||
* @author 'Vexia
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public class SofiyaDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
public SofiyaDialogue() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public SofiyaDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
|
|
||||||
return new SofiyaDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of my way punk.");
|
|
||||||
stage = 1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
switch (stage) {
|
|
||||||
case 1:
|
|
||||||
end();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6039, 6030, 6037 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the SvetlanaDialogue dialogue.
|
|
||||||
* @author 'Vexia
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public class SvetlanaDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
public SvetlanaDialogue() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public SvetlanaDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
|
|
||||||
return new SvetlanaDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm... you smell strange...");
|
|
||||||
stage = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
end();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6034 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the yadviga dialogue plugin.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class YadvigaDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code YadvigaDialogue} {@code Object}.
|
|
||||||
*/
|
|
||||||
public YadvigaDialogue() {
|
|
||||||
/**
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code YadvigaDialogue} {@code Object}.
|
|
||||||
* @param player the player.
|
|
||||||
*/
|
|
||||||
public YadvigaDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
return new YadvigaDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Get lost!");
|
|
||||||
stage = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
switch (stage) {
|
|
||||||
case 0:
|
|
||||||
end();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6041 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
package content.region.morytania.canifis.dialogue;
|
|
||||||
|
|
||||||
import core.game.dialogue.DialoguePlugin;
|
|
||||||
import core.game.dialogue.FacialExpression;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the dialogue used for the yuri npc.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class YuriDialogue extends DialoguePlugin {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code YuriDialogue} {@code Object}.
|
|
||||||
*/
|
|
||||||
public YuriDialogue() {
|
|
||||||
/**
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code YuriDialogue} {@code Object}.
|
|
||||||
* @param player the player.
|
|
||||||
*/
|
|
||||||
public YuriDialogue(Player player) {
|
|
||||||
super(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DialoguePlugin newInstance(Player player) {
|
|
||||||
return new YuriDialogue(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean open(Object... args) {
|
|
||||||
npc = (NPC) args[0];
|
|
||||||
interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm... you smell strange...");
|
|
||||||
stage = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(int interfaceId, int buttonId) {
|
|
||||||
end();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6028 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
package content.region.morytania.canifis.handlers;
|
|
||||||
|
|
||||||
import core.cache.def.impl.NPCDefinition;
|
|
||||||
import core.game.interaction.OptionHandler;
|
|
||||||
import core.game.node.Node;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.game.node.entity.player.Player;
|
|
||||||
import core.game.system.task.Pulse;
|
|
||||||
import core.game.world.GameWorld;
|
|
||||||
import core.game.world.update.flag.context.Animation;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.plugin.Plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the plugin used to handle the attacking of a werwolf.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class CanafisWereWolfPlugin extends OptionHandler {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the animation to use.
|
|
||||||
*/
|
|
||||||
private static final Animation ANIMATION = new Animation(6543);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the id to transform into.
|
|
||||||
*/
|
|
||||||
private static final int TRANSFORM_ID = 6006;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Plugin<Object> newInstance(Object arg) throws Throwable {
|
|
||||||
for (int i = 6026; i < 6046; i++) {
|
|
||||||
NPCDefinition.forId(i).getHandlers().put("option:attack", this);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(final Player player, Node node, String option) {
|
|
||||||
if (!player.getEquipment().contains(2952, 1)) {
|
|
||||||
player.lock(2);
|
|
||||||
final NPC n = (NPC) node;
|
|
||||||
final NPC newN = NPC.create(TRANSFORM_ID, n.getLocation());
|
|
||||||
newN.init();
|
|
||||||
newN.animate(ANIMATION);
|
|
||||||
n.clear();
|
|
||||||
newN.lock(2);
|
|
||||||
newN.setRespawn(false);
|
|
||||||
newN.setAttribute("original", n.getId());
|
|
||||||
newN.setAttribute("loc", n.getProperties().getSpawnLocation());
|
|
||||||
GameWorld.getPulser().submit(new Pulse(2) {
|
|
||||||
@Override
|
|
||||||
public boolean pulse() {
|
|
||||||
newN.getProperties().getCombatPulse().attack(player);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
player.getProperties().getCombatPulse().attack(node);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package content.region.morytania.canifis.handlers
|
||||||
|
|
||||||
|
import core.api.*
|
||||||
|
import core.game.interaction.QueueStrength
|
||||||
|
import core.game.node.entity.Entity
|
||||||
|
import core.game.node.entity.combat.BattleState
|
||||||
|
import core.game.node.entity.combat.DeathTask
|
||||||
|
import core.game.node.entity.npc.NPC
|
||||||
|
import core.game.node.entity.npc.NPCBehavior
|
||||||
|
import core.game.node.entity.player.Player
|
||||||
|
import core.game.world.update.flag.context.Animation
|
||||||
|
import org.rs09.consts.Items
|
||||||
|
|
||||||
|
class WerewolfBehavior : NPCBehavior(*HUMAN_NPCS) {
|
||||||
|
companion object {
|
||||||
|
// There are 20 humans that can turn into werewolves. They are all in series, so a range toIntArray() is easier.
|
||||||
|
private val HUMAN_NPCS = (6026 .. 6045).toIntArray()
|
||||||
|
private val WEREWOLF_NPCS = (6006 .. 6025).toIntArray()
|
||||||
|
private val HUMAN_OUT_ANIMATION = Animation(6554)
|
||||||
|
private val WEREWOLF_IN_ANIMATION = Animation(6543) // This is not used as there is a corresponding gfx.
|
||||||
|
private val WEREWOLF_IN_GFXS = (1079 .. 1098).toIntArray() // Play each werewolf's gfx with the animation.
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun afterDamageReceived(self: NPC, attacker: Entity, state: BattleState) {
|
||||||
|
if(DeathTask.isDead(self)){
|
||||||
|
// Don't transform if you are killed
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (attacker is Player) {
|
||||||
|
if (!inEquipment(attacker, Items.WOLFBANE_2952, 1) && self.id in HUMAN_NPCS) {
|
||||||
|
delayAttack(self, 3)
|
||||||
|
delayAttack(attacker, 3)
|
||||||
|
lock(self, 3)
|
||||||
|
queueScript(self, 0, QueueStrength.SOFT) { stage: Int ->
|
||||||
|
when (stage) {
|
||||||
|
0 -> {
|
||||||
|
visualize(self, HUMAN_OUT_ANIMATION, WEREWOLF_IN_GFXS[self.id - 6026])
|
||||||
|
return@queueScript delayScript(self, WEREWOLF_IN_ANIMATION.duration)
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
transformNpc(self, WEREWOLF_NPCS[self.id - 6026], 200)
|
||||||
|
return@queueScript delayScript(self, 1)
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
self.properties.combatPulse.attack(attacker)
|
||||||
|
return@queueScript stopExecuting(self)
|
||||||
|
}
|
||||||
|
else -> return@queueScript stopExecuting(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRespawn(self: NPC) {
|
||||||
|
if (self.id in WEREWOLF_NPCS){
|
||||||
|
self.reTransform()
|
||||||
|
}
|
||||||
|
super.onRespawn(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
package content.region.morytania.canifis.handlers;
|
|
||||||
|
|
||||||
import core.game.node.entity.Entity;
|
|
||||||
import core.game.node.entity.npc.AbstractNPC;
|
|
||||||
import core.game.node.entity.npc.NPC;
|
|
||||||
import core.plugin.Initializable;
|
|
||||||
import core.game.world.map.Location;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the tutorial chicken npc.
|
|
||||||
* @author 'Vexia
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
@Initializable
|
|
||||||
public final class WerewolfNPC extends AbstractNPC {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code WerewolfNPC} {@code Object}.
|
|
||||||
* @param id the id.
|
|
||||||
* @param location the location.
|
|
||||||
*/
|
|
||||||
public WerewolfNPC(int id, Location location) {
|
|
||||||
super(id, location, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code WerewolfNPC} {@code Object}.
|
|
||||||
*/
|
|
||||||
public WerewolfNPC() {
|
|
||||||
super(0, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AbstractNPC construct(int id, Location location, Object... objects) {
|
|
||||||
return new WerewolfNPC(id, location);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finalizeDeath(Entity killer) {
|
|
||||||
super.finalizeDeath(killer);
|
|
||||||
NPC nn = NPC.create(getAttribute("original", 6026), getAttribute("loc", getLocation()));
|
|
||||||
nn.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] getIds() {
|
|
||||||
return new int[] { 6006 };
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue