mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-02 16:49:12 +00:00
84 lines
2.7 KiB
Ruby
84 lines
2.7 KiB
Ruby
require 'java'
|
|
|
|
java_import 'org.apollo.game.model.Position'
|
|
java_import 'org.apollo.game.model.area.Region'
|
|
java_import 'org.apollo.game.model.entity.Entity'
|
|
java_import 'org.apollo.game.model.entity.obj.DynamicGameObject'
|
|
|
|
# Contains door-related utility methods.
|
|
module DoorUtil
|
|
include DoorConstants
|
|
|
|
# A hash containing currently toggled door objects mapped to the original door objects.
|
|
TOGGLED_DOORS = {}
|
|
|
|
# Translates a door's position in the direction of its orientation.
|
|
def self.translate_door_position(door)
|
|
position = door.position
|
|
|
|
case door.orientation
|
|
when Orientation::WEST
|
|
Position.new(position.x - 1, position.y, position.height)
|
|
when Orientation::EAST
|
|
Position.new(position.x + 1, position.y, position.height)
|
|
when Orientation::NORTH
|
|
Position.new(position.x, position.y + 1, position.height)
|
|
when Orientation::SOUTH
|
|
Position.new(position.x, position.y - 1, position.height)
|
|
else fail "Unsupported orientation #{door.orientation}."
|
|
end
|
|
end
|
|
|
|
# Translates the orientation of a door to a toggled position.
|
|
def self.translate_door_orientation(door)
|
|
object_id = door.id
|
|
orientation = door.orientation
|
|
|
|
if RIGHT_HINGE_DOORS.include?(object_id)
|
|
return ORIENTATIONS[:right_side_hinge][orientation]
|
|
elsif LEFT_HINGE_DOORS.include?(object_id)
|
|
return ORIENTATIONS[:left_side_hinge][orientation]
|
|
end
|
|
|
|
fail 'Given object was not registered as a door.'
|
|
end
|
|
|
|
# Toggles the given door.
|
|
def self.toggle(door)
|
|
region = $world.region_repository.from_position(door.position)
|
|
region.remove_entity(door)
|
|
|
|
if TOGGLED_DOORS.include?(door)
|
|
original_door = TOGGLED_DOORS.delete(door)
|
|
|
|
original_region = $world.region_repository.from_position(original_door.position)
|
|
original_region.add_entity(original_door)
|
|
else
|
|
position = translate_door_position(door)
|
|
orientation = translate_door_orientation(door)
|
|
type = door.type
|
|
|
|
toggled_door = DynamicGameObject.create_public($world, door.id, position, type, orientation)
|
|
|
|
toggled_region = $world.region_repository.from_position(position)
|
|
toggled_region.add_entity(toggled_door)
|
|
|
|
TOGGLED_DOORS[toggled_door] = door
|
|
end
|
|
end
|
|
|
|
# Gets the door object at the given position, if it exists.
|
|
def self.get_door_object(position, object_id)
|
|
region = $world.region_repository.from_position(position)
|
|
objects = region.get_entities(position, EntityType::DYNAMIC_OBJECT, EntityType::STATIC_OBJECT)
|
|
objects.each { |game_object| return game_object if game_object.id == object_id }
|
|
nil
|
|
end
|
|
|
|
# Checks if the given game object id is a door.
|
|
def self.door?(object_id)
|
|
RIGHT_HINGE_DOORS.include?(object_id) || LEFT_HINGE_DOORS.include?(object_id)
|
|
end
|
|
|
|
end
|