mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-03 00:38:21 +00:00
168 lines
5.5 KiB
Ruby
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
|