Files
apollo/game/data/plugins/consumables/consumable.rb
T
KeepBotting 739c331860 Housekeeping
2019-03-26 14:05:40 -04:00

80 lines
1.7 KiB
Ruby

require 'java'
# A map of item ids to consumables.
CONSUMABLES = {}
# The id of the food consumption animation.
CONSUME_ANIMATION_ID = 829
# Contains the different types of consumables
module ConsumableType
FOOD = 1
POTION = 2
DRINK = 3
end
# An item that can be consumed to produce a skill effect.
class Consumable
attr_reader :name, :id, :sound, :delay, :type
def initialize(name, id, sound, delay, type)
@name = name.to_s.gsub(/_/, ' ')
@id = id
@sound = sound
@delay = delay
@type = type
end
def consume(_player)
# Override to provide specific functionality.
end
end
# Appends a consumable to the map, with its id as the key.
def append_consumable(consumable)
CONSUMABLES[consumable.id] = consumable
end
# An Action used for food consumption.
class ConsumeAction < Action
attr_reader :consumable
def initialize(player, slot, consumable)
super(2, true, player)
@consumable = consumable
@slot = slot
@executions = 0
end
def execute
if @executions == 0
mob.inventory.reset(@slot)
@consumable.consume(mob)
mob.play_animation(Animation.new(CONSUME_ANIMATION_ID))
end
@executions += 1
if @executions >= @consumable.delay
stop
end
end
def equals(other)
get_class == other.get_class && mob == other.mob && @consumable.type == other.consumable.type
end
end
# Intercepts the first item option message and consumes the consumable, if necessary.
on :message, :first_item_option do |player, message|
consumable = CONSUMABLES[message.id]
unless consumable.nil?
player.start_action(ConsumeAction.new(player, message.slot, consumable))
message.terminate
end
end