Files
apollo/data/plugins/skill/runecraft/tiara.rb
T
2015-08-27 18:17:58 +01:00

168 lines
5.5 KiB
Ruby

require 'java'
java_import 'org.apollo.game.message.impl.ConfigMessage'
java_import 'org.apollo.game.model.entity.EquipmentConstants'
java_import 'org.apollo.game.action.DistancedAction'
# The hash of tiaras.
TIARAS_BY_ALTAR = {}
TIARAS_BY_ID = {}
TIARAS_BY_TALISMAN = {}
# A tiara will make an altar accessible with a single click.
class Tiara
attr_reader :altar, :bitshift, :tiara_id, :experience, :talisman
def initialize(tiara_id, altar, talisman, bitshift, experience)
@tiara_id = tiara_id
@name = name_of(:item, tiara_id)
@altar = altar
@talisman = talisman
@bitshift = bitshift
@experience = experience
end
# Sends a config message to change the altar object.
def send_config(player)
player.send(ConfigMessage.new(CHANGE_ALTAR_OBJECT_CONFIG, 1 << @bitshift))
end
end
private
# The id of the altar change config.
CHANGE_ALTAR_OBJECT_CONFIG = 491
# The id of the blank tiara.
TIARA_ITEM_ID = 5525
# Sends an empty altar config.
def send_empty_config(player)
player.send(ConfigMessage.new(CHANGE_ALTAR_OBJECT_CONFIG, 0))
end
# Sets the correct config upon login, if the player is wearing a tiara.
on :login do |_event, player|
hat = player.equipment.get(EquipmentConstants::HAT)
unless hat.nil?
tiara = TIARAS_BY_ID[hat]
tiara.nil? ? send_empty_config(player) : tiara.send_config
end
end
# Intercepts the SecondObjectAction message to support left-click access to the altar when wielding
# the correct tiara.
on :message, :second_object_action do |player, message|
object_id = message.id
tiara = TIARAS_BY_ALTAR[object_id]
next if tiara.nil?
hat = player.equipment.get(EquipmentConstants::HAT)
if !hat.nil? && hat.id == tiara.tiara_id
altar = ENTRANCE_ALTARS[tiara.altar]
message.terminate
unless altar.nil?
player.start_action(TeleportAction.new(player, message.position, 2, altar.entrance_position))
end
end
end
# Intercepts the SecondItemAction message to allow for config sending.
on :message, :second_item_option do |player, message|
tiara = TIARAS_BY_ID[message.id]
unless tiara.nil?
tiara.send_config(player)
message.terminate
end
end
# Intercepts the FirstItemAction message to allow for config sending.
on :message, :first_item_action do |player, message|
tiara = TIARAS_BY_ID[message.id]
unless tiara.nil?
send_empty_config(player)
message.terminate
end
end
# Intercepts the ItemOnObject message to create the tiara.
on :message, :item_on_object do |player, message|
tiara, altar = TIARAS_BY_TALISMAN[message.id], CRAFTING_ALTARS[message.object_id]
return if tiara.nil? || altar.nil?
player.start_action(CreateTiaraAction.new(player, message.position, tiara, altar))
message.terminate
end
# An action lets the player create a tiara when it comes within the specified distance of a
# specified position.
# noinspection JRubyImplementInterfaceInspection
class CreateTiaraAction < DistancedAction
# Creates the CreateTiaraAction.
def initialize(player, position, tiara, altar)
super(0, true, player, position, 2)
@player = player
@tiara = tiara
@altar = altar
end
def execute_action
inventory = @player.inventory
if inventory.contains_all(TIARA_ITEM_ID, @tiara.talisman)
if @tiara.altar == @altar.entrance_altar
inventory.remove(@tiara.talisman, TIARA_ITEM_ID)
inventory.add(@tiara.tiara_id)
@player.skill_set.add_experience(RUNECRAFT_SKILL_ID, @tiara.experience)
@player.play_animation(RUNECRAFTING_ANIMATION)
@player.play_graphic(RUNECRAFTING_GRAPHIC)
else
@player.send_message('You can\'t use that talisman on this altar.')
end
else
@player.send_message('You need to have a talisman and blank tiara to enchant a tiara.')
end
stop
end
def equals(other)
get_class == other.get_class && @player == other.player && @tiara == other.tiara
end
end
# Appends a tiara to the list.
def tiara(_name, hash)
unless hash.has_keys?(:altar, :bitshift, :experience, :talisman, :tiara_id)
fail 'Hash must contain a tiara id, altar id, talisman id, a bitshift number, and experience.'
end
tiara_id, altar, talisman = hash[:tiara_id], hash[:altar], hash[:talisman]
bitshift, experience = hash[:bitshift], hash[:experience]
tiara = Tiara.new(tiara_id, altar, talisman, bitshift, experience)
TIARAS_BY_TALISMAN[talisman] = TIARAS_BY_ID[tiara_id] = TIARAS_BY_ALTAR[altar] = tiara
end
tiara :air_tiara, tiara_id: 5527, altar: 2452, talisman: 1438, bitshift: 0, experience: 25
tiara :mind_tiara, tiara_id: 5529, altar: 2453, talisman: 1448, bitshift: 1, experience: 27.5
tiara :water_tiara, tiara_id: 5531, altar: 2454, talisman: 1444, bitshift: 2, experience: 30
tiara :body_tiara, tiara_id: 5533, altar: 2457, talisman: 1446, bitshift: 5, experience: 37.5
tiara :earth_tiara, tiara_id: 5535, altar: 2455, talisman: 1440, bitshift: 3, experience: 32.5
tiara :fire_tiara, tiara_id: 5537, altar: 2456, talisman: 1442, bitshift: 4, experience: 35
tiara :cosmic_tiara, tiara_id: 5539, altar: 2458, talisman: 1454, bitshift: 6, experience: 40
tiara :nature_tiara, tiara_id: 5541, altar: 2460, talisman: 1462, bitshift: 8, experience: 45
tiara :chaos_tiara, tiara_id: 5543, altar: 2461, talisman: 1452, bitshift: 9, experience: 42.5
tiara :law_tiara, tiara_id: 5545, altar: 2459, talisman: 1458, bitshift: 7, experience: 47.5
tiara :death_tiara, tiara_id: 5548, altar: 2462, talisman: 1456, bitshift: 10, experience: 50
# TODO: there are 2 other altars, which probably just aren't spawned on the map