diff --git a/Server/src/main/java/core/game/content/activity/mta/BonesConvertingSpells.java b/Server/src/main/java/core/game/content/activity/mta/BonesConvertingSpells.java deleted file mode 100644 index 0ac2c9c17..000000000 --- a/Server/src/main/java/core/game/content/activity/mta/BonesConvertingSpells.java +++ /dev/null @@ -1,129 +0,0 @@ -package core.game.content.activity.mta; - -import core.game.node.entity.skill.magic.MagicSpell; -import core.game.node.entity.skill.magic.Runes; -import core.game.node.Node; -import core.game.node.entity.Entity; -import core.game.node.entity.combat.equipment.SpellType; -import core.game.node.entity.player.Player; -import core.game.node.entity.player.link.SpellBookManager.SpellBook; -import core.game.node.item.Item; -import core.game.world.update.flag.context.Animation; -import core.game.world.update.flag.context.Graphics; -import core.plugin.Plugin; - -import core.game.content.activity.mta.impl.GraveyardZone; - -/** - * Represents the bones to banana spell. - * @author Emperor - * @author 'Vexia - * @version 1.0 - */ -public final class BonesConvertingSpells extends MagicSpell { - - /** - * The bone ids. - */ - private static final int[] BONES = new int[] { 526, 532, 6904, 6905, 6906, 6907 }; - - /** - * The graphic. - */ - private static final Graphics GRAPHIC = new Graphics(141, 96); - - /** - * The animation. - */ - private static final Animation ANIMATION = new Animation(722); - - /** - * The item to replace the bones with. - */ - private Item converted; - - /** - * Constructs a new {@code BonesConvertingSpells} {@code Object}. - */ - public BonesConvertingSpells() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code BonesConvertingSpells} {@code Object}. - * @param level The level required. - * @param converted The item to replace the bones with. - * @param anim The animation. - * @param graphic The graphic. - * @param runes The runes. - */ - public BonesConvertingSpells(int level, final double experience, Item converted, Animation anim, Graphics graphic, Item... runes) { - super(SpellBook.MODERN, level, experience, anim, graphic, null, runes); - this.converted = converted; - } - - @Override - public Plugin newInstance(SpellType arg) throws Throwable { - SpellBook.MODERN.register(9, new BonesConvertingSpells(15, 25, new Item(1963), ANIMATION, GRAPHIC, Runes.EARTH_RUNE.getItem(2), Runes.WATER_RUNE.getItem(2), Runes.NATURE_RUNE.getItem(1))); - SpellBook.MODERN.register(40, new BonesConvertingSpells(60, 65, new Item(6883), ANIMATION, GRAPHIC, Runes.EARTH_RUNE.getItem(4), Runes.WATER_RUNE.getItem(4), Runes.NATURE_RUNE.getItem(2))); - return this; - } - - @Override - public boolean meetsRequirements(Entity caster, boolean message, boolean remove) { - if (getSpellId() == 40 && !caster.asPlayer().getSavedData().getActivityData().isBonesToPeaches()) { - caster.asPlayer().sendMessage("You can only learn this spell from the Mage Training Arena."); - return false; - } - if (!hasBones(caster.asPlayer())) { - if (message) { - ((Player) caster).getPacketDispatch().sendMessage("You aren't holding any bones!"); - } - return false; - } - return super.meetsRequirements(caster, message, remove); - } - - @Override - public boolean cast(Entity entity, Node target) { - Player p = (Player) entity; - boolean inGrave = p.getZoneMonitor().isInZone("Creature Graveyard"); - if (p.getAttribute("cbs_tab", false) && inGrave && target.getId() >= 6904 && target.getId() <= 6907) { - p.sendMessage("This tablet cannot be used on bones from the Mage Training Arena."); - return false; - } - if (!p.getAttribute("cbs_tab", false) && !meetsRequirements(entity, true, true)) { - return false; - } - p.removeAttribute("cbs_tab"); - for (int id : BONES) { - if (p.getInventory().contains(id, 1)) { - int amount = p.getInventory().getAmount(id); - if (inGrave) { - amount *= (GraveyardZone.BoneType.forItem(new Item(id)).ordinal() + 1); - } - p.getInventory().remove(new Item(id, amount)); - p.getInventory().add(new Item(converted.getId(), amount)); - } - } - visualize(entity, target); - return true; - } - - /** - * Checks if the player has bones. - * @param player the player. - * @return {@code True} if so. - */ - private boolean hasBones(Player player) { - for (int id : BONES) { - if (player.getInventory().contains(id, 1)) { - return true; - } - } - return false; - } - -} \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java b/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java index 9cbac0409..74e7d94d0 100644 --- a/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java +++ b/Server/src/main/java/core/game/content/activity/mta/MageTrainingArenaPlugin.java @@ -52,7 +52,7 @@ public class MageTrainingArenaPlugin extends OptionHandler { ItemDefinition.forId(TelekineticZone.STATUE).getHandlers().put("option:observe", this); ItemDefinition.forId(TelekineticZone.STATUE).getHandlers().put("option:reset", this); NPCDefinition.forId(3102).getHandlers().put("option:talk-to", this); - PluginManager.definePlugins(new CharmedWarriorDialogue(), new EntranceGuardianDialogue(), new RewardsGuardianDialogue(), new ProgressHatDialogue(), new EnchantmentGuardianDialogue(), new EnchantSpell(), new BonesConvertingSpells(), new GraveyardGuardianDialogue(), new AlchemyGuardianDialogue(), new TelekineticGrabSpell(), new TelekineticGuardianDialogue(), new MazeGuardianDialogue()); + PluginManager.definePlugins(new CharmedWarriorDialogue(), new EntranceGuardianDialogue(), new RewardsGuardianDialogue(), new ProgressHatDialogue(), new EnchantmentGuardianDialogue(), new EnchantSpell(), new GraveyardGuardianDialogue(), new AlchemyGuardianDialogue(), new TelekineticGrabSpell(), new TelekineticGuardianDialogue(), new MazeGuardianDialogue()); return this; } diff --git a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java index 11051117d..a2dadc3e6 100644 --- a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java +++ b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java @@ -141,6 +141,7 @@ public final class TzhaarFightCavesPlugin extends ActivityPlugin { public void leave(Player player, int wave) { activeNPCs.clear(); player.getProperties().setTeleportLocation(getSpawnLocation()); + player.getSkills().restore(); if (wave == 63) { if (!player.getInventory().add(new Item(6570))) { GroundItemManager.create(new Item(6570), getSpawnLocation(), player); diff --git a/Server/src/main/java/core/game/interaction/inter/GlassInterface.java b/Server/src/main/java/core/game/interaction/inter/GlassInterface.java index 840c605e3..1909fee9a 100644 --- a/Server/src/main/java/core/game/interaction/inter/GlassInterface.java +++ b/Server/src/main/java/core/game/interaction/inter/GlassInterface.java @@ -3,13 +3,12 @@ package core.game.interaction.inter; import core.game.component.Component; import core.game.component.ComponentDefinition; import core.game.component.ComponentPlugin; -import core.game.node.entity.skill.Skills; -import core.game.node.entity.skill.crafting.GlassProduct; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.GlassProduct; import core.game.node.item.Item; import core.game.system.task.Pulse; -import rs09.game.world.GameWorld; import core.game.world.update.flag.context.Animation; import core.plugin.Initializable; import core.plugin.Plugin; @@ -100,7 +99,8 @@ public final class GlassInterface extends ComponentPlugin { public static void make(final Player player, final GlassProduct glass, final int amount) { player.getInterfaceManager().close(); player.animate(ANIMATION); - GameWorld.getPulser().submit(new Pulse(2, player) { + player.getPulseManager().clear(); + player.getPulseManager().run(new Pulse(2, player) { int amt = amount; @Override diff --git a/Server/src/main/java/core/game/node/entity/combat/special/ChainhitSpecialHandler.java b/Server/src/main/java/core/game/node/entity/combat/special/ChainhitSpecialHandler.java index ac17e8d78..00a0ca1e9 100644 --- a/Server/src/main/java/core/game/node/entity/combat/special/ChainhitSpecialHandler.java +++ b/Server/src/main/java/core/game/node/entity/combat/special/ChainhitSpecialHandler.java @@ -11,7 +11,6 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.system.task.Pulse; import core.game.world.map.Location; -import core.game.world.map.MapDistance; import core.game.world.map.RegionManager; import core.game.world.update.flag.context.Animation; import core.game.world.update.flag.context.Graphics; @@ -50,7 +49,7 @@ public final class ChainhitSpecialHandler extends RangeSwingHandler implements P /** * The door support locations. */ - private static final Location[] DOOR_SUPPORTS = new Location[] { Location.create(2545, 10145, 0), Location.create(2545, 10141, 0) }; + private static final Location[] DOOR_SUPPORTS = new Location[] { Location.create(2545, 10145, 0), Location.create(2545, 10141, 0),Location.create(2543, 10143, 0) }; @Override public Object fireEvent(String identifier, Object... args) { @@ -75,7 +74,7 @@ public final class ChainhitSpecialHandler extends RangeSwingHandler implements P } if (victim instanceof NPC) { NPC npc = victim.asNpc(); - if (npc.getId() == 2443) { + if (npc.getId() == 2440) { for (Location l : DOOR_SUPPORTS) { final NPC n = Repository.findNPC(l); if (n == null) { @@ -176,7 +175,7 @@ public final class ChainhitSpecialHandler extends RangeSwingHandler implements P private List getVictimsList(Entity e, Entity victim) { List list = e.getAttribute("chain-hit_v"); if (list == null) { - int distance = MapDistance.RENDERING.getDistance() / 3; + int distance = 5; if (victim instanceof NPC) { e.setAttribute("chain-hit_v", list = RegionManager.getLocalNpcs(e, distance)); } else { diff --git a/Server/src/main/java/core/game/node/entity/player/link/TeleportManager.java b/Server/src/main/java/core/game/node/entity/player/link/TeleportManager.java index a9b9eed80..bed9736b9 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/TeleportManager.java +++ b/Server/src/main/java/core/game/node/entity/player/link/TeleportManager.java @@ -106,6 +106,9 @@ public class TeleportManager { p.getDialogueInterpreter().close(); } } + if(entity.getAttribute("tablet-spell",false)){ + type = TeleportType.TELETABS; + } this.teleportType = teleportType; entity.getWalkingQueue().reset(); lastTeleport = currentTeleport; diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/ModernListeners.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/ModernListeners.kt index 9ba69f524..d2f7ff28a 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/ModernListeners.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/ModernListeners.kt @@ -1,5 +1,7 @@ package rs09.game.node.entity.skill.magic +import core.game.content.activity.mta.impl.GraveyardZone +import core.game.content.global.Bones import core.game.node.entity.Entity import core.game.node.entity.impl.Animator.Priority import core.game.node.entity.impl.Projectile @@ -129,12 +131,42 @@ class ModernListeners : SpellListener("modern"){ } private fun boneConvert(player: Player,bananas: Boolean){ - if(!bananas && !player.savedData.activityData.isBonesToPeaches){ + val isInMTA = player.zoneMonitor.isInZone("Creature Graveyard") + if(isInMTA && player.getAttribute("tablet-spell",false)){ + player.sendMessage("You can not use this tablet in the Mage Training Arena.") + return + } + + if(!bananas && !player.savedData.activityData.isBonesToPeaches && !player.getAttribute("tablet-spell",false)){ player.sendMessage("You can only learn this spell from the Mage Training Arena.") return } + val bones = if(isInMTA) intArrayOf(6904,6905,6906,6907) else Bones.values().map { it.itemId }.toIntArray() + for(item in player.inventory.toArray()){ + item ?: continue + if(isInMTA){ + if(bones.contains(item.id)){ + val inInventory = player.inventory.getAmount(item.id) + val amount = inInventory * GraveyardZone.BoneType.forItem(Item(item.id)).ordinal + 1 + if(amount > 0){ + player.inventory.remove(Item(item.id,inInventory)) + player.inventory.add(Item(if(bananas) Items.BANANA_1963 else Items.PEACH_6883,amount)) + } + } + } else { + if(bones.contains(item.id)){ + val inInventory = player.inventory.getAmount(item.id) + player.inventory.remove(Item(item.id,inInventory)) + player.inventory.add(Item(if(bananas) Items.BANANA_1963 else Items.PEACH_6883,inInventory)) + } + } + } + visualizeSpell(player,BONE_CONVERT_ANIM, BONE_CONVERT_GFX) + removeRunes(player) + addXP(player,if(bananas) 25.0 else 65.0) + setDelay(player,false) } private fun superheat(player: Player,item: Item){ @@ -186,11 +218,10 @@ class ModernListeners : SpellListener("modern"){ if(player.inventory.remove(Item(item.id,1))) { removeRunes(player) - player.audioManager.send(if (high) 97 else 98) if (high) { - player.visualize(HIGH_ALCH_ANIM,HIGH_ALCH_GFX) + visualizeSpell(player,HIGH_ALCH_ANIM,HIGH_ALCH_GFX,97) } else { - player.visualize(LOW_ALCH_ANIM,LOW_ALCH_GFX) + visualizeSpell(player,LOW_ALCH_ANIM,LOW_ALCH_GFX,98) } if(coins.amount > 0) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellListener.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellListener.kt index 57cf36e83..ca6b97425 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellListener.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellListener.kt @@ -5,6 +5,8 @@ import core.game.node.Node import core.game.node.entity.player.Player import core.game.node.entity.skill.Skills import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics import rs09.game.interaction.Listener import rs09.game.world.GameWorld @@ -35,6 +37,9 @@ abstract class SpellListener(val bookName: String) : Listener { if(player.getAttribute("magic-delay",0) > GameWorld.ticks){ throw IllegalStateException() } + if(player.getAttribute("tablet-spell",false)){ + return + } if(player.skills.getLevel(Skills.MAGIC) < magicLevel){ player.sendMessage("You need a magic level of $magicLevel to cast this spell.") throw IllegalStateException() @@ -56,12 +61,22 @@ abstract class SpellListener(val bookName: String) : Listener { fun removeRunes(player: Player){ player.inventory.remove(*player.getAttribute("spell:runes",ArrayList()).toTypedArray()) player.removeAttribute("spell:runes") + player.removeAttribute("tablet-spell") } fun addXP(player: Player,amount:Double){ + if(player.getAttribute("tablet-spell",false)) return player.skills.addExperience(Skills.MAGIC,amount) } + fun visualizeSpell(player: Player,anim:Animation,gfx: Graphics,soundID: Int = -1){ + if(player.getAttribute("tablet-spell",false)) return + player.visualize(anim,gfx) + if(soundID != -1){ + player.audioManager.send(soundID) + } + } + fun setDelay(player: Player,isTeleport: Boolean = false){ if(!isTeleport) player.setAttribute("magic-delay",GameWorld.ticks + 3) else player.setAttribute("magic-delay",GameWorld.ticks + 5) } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellTablets.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellTablets.kt new file mode 100644 index 000000000..39eefc17f --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/magic/SpellTablets.kt @@ -0,0 +1,37 @@ +package rs09.game.node.entity.skill.magic + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import org.rs09.consts.Items +import rs09.game.interaction.InteractionListener +import rs09.game.node.entity.skill.magic.spellconsts.Modern + +class SpellTablets : InteractionListener() { + val B2P_TABLET = Items.BONES_TO_PEACHES_8015 + val B2B_TABLET = Items.BONES_TO_BANANAS_8014 + override fun defineListeners() { + + on(B2B_TABLET,ITEM,"break"){player, node -> + breakTablet(player) + SpellListeners.run(Modern.BONES_TO_BANANAS,SpellListener.NONE,"modern",player) + player.inventory.remove(Item(node.id)) + return@on true + } + + on(B2P_TABLET,ITEM,"break"){player, node -> + breakTablet(player) + SpellListeners.run(Modern.BONES_TO_PEACHES,SpellListener.NONE,"modern",player) + player.inventory.remove(Item(node.id)) + return@on true + } + + } + + fun breakTablet(player: Player){ + player.audioManager.send(979) + player.animator.forceAnimation(Animation(4069)) + player.lock(5) + player.setAttribute("tablet-spell",true) + } +} \ No newline at end of file