class RuneRb::Item::Container

Constants

MAX_ITEMS

Attributes

always_stack[R]
capacity[R]
fire_events[RW]
items[R]
listeners[R]

Public Class Methods

new(always_stack, capacity) click to toggle source
# File app/model/item.rb, line 202
def initialize(always_stack, capacity)
  @capacity = capacity
  @items = Array.new(@capacity, nil)
  @listeners = []
  @always_stack = always_stack
  @fire_events = true
end
transfer(from, to, slot, id) click to toggle source
# File app/model/item.rb, line 305
def Container.transfer(from, to, slot, id)
  item = from.items[slot]
  return false if item == nil or item.id != id
  
  success = to.add item
  from.set slot, nil if success
  success
end

Public Instance Methods

add(item) click to toggle source
# File app/model/item.rb, line 210
def add(item)
  if item.definition.properties[:stackable] or @always_stack
    new = @items.find {|e| e && e.id == item.id }
    i = @items.index(new)
    existing = new != nil
    
    if existing
      count = item.count + new.count
      return false if count > MAX_ITEMS || count < 1
      
      set i, Item.new(new.id, count)
      return true
    else
      slot = get_free_slot
      set slot, item if slot != -1
      return slot != -1
    end
  else
    slots = free_slots
    return false unless slots >= item.count
    
      fire = @fire_events
      @fire_events = false
    begin
      item.count.times {
        set get_free_slot, Item.new(item.id) 
      }
      fire_items_changed if fire
      return true
    ensure
      @fire_events = fire
    end
  end
  
  return false
end
add_listener(listener) click to toggle source
# File app/model/item.rb, line 336
def add_listener(listener)
  @listeners << listener
  listener.items_changed self
end
clear() click to toggle source
# File app/model/item.rb, line 379
def clear
  @items = Array.new(@capacity, nil)
  fire_items_changed if @fire_events
end
contains(id) click to toggle source
# File app/model/item.rb, line 332
def contains(id)
  slot_for_id(id) != -1
end
count(id) click to toggle source
# File app/model/item.rb, line 320
def count(id)
  @items.inject(0) {|sum, v| v != nil && v.id == id ? sum + v.count : sum }
end
fire_items_changed() click to toggle source
# File app/model/item.rb, line 400
def fire_items_changed
  @listeners.each {|e|
    e.items_changed self 
  }
end
fire_slot_changed(slot) click to toggle source
# File app/model/item.rb, line 388
def fire_slot_changed(slot)
  @listeners.each {|e|
    e.slot_changed self, slot 
  }
end
fire_slots_changed(slots) click to toggle source
# File app/model/item.rb, line 394
def fire_slots_changed(slots)
  @listeners.each {|e|
    e.slots_changed self, slots 
  }
end
free_slots() click to toggle source
# File app/model/item.rb, line 384
def free_slots
  @capacity-size
end
get_free_slot() click to toggle source
# File app/model/item.rb, line 347
def get_free_slot
  @items.index nil or -1
end
has_room_for(item) click to toggle source
# File app/model/item.rb, line 351
def has_room_for(item)
  if ItemDefinition.for_id(item.id).properties[:stackable] or @always_stack
    new = @items.find {|e| e && e.id == item.id }
    existing = new != nil
    
    if existing
      count = item.count + new.count
      return false if count > MAX_ITEMS or count < 1
      return true
    end
    get_free_slot != -1
  else
    free_slots >= item.count
  end
end
insert(from_slot, to_slot) click to toggle source
# File app/model/item.rb, line 247
def insert(from_slot, to_slot)
  if @items[to_slot] == nil
    swap from_slot, to_slot
  else
                while from_slot != to_slot
                  if from_slot > to_slot
                    swap from_slot, from_slot - 1, true
                    from_slot -= 1
                  elsif from_slot < to_slot
                    swap from_slot, from_slot + 1, true
                    from_slot += 1
                  end
                end
              end
              
              fire_items_changed if @fire_events
      end
is_slot_free(slot) click to toggle source
# File app/model/item.rb, line 371
def is_slot_free(slot)
  @items[slot] == nil
end
is_slot_used(slot) click to toggle source
# File app/model/item.rb, line 367
def is_slot_used(slot)
  @items[slot] != nil 
end
item_for_id(id) click to toggle source
# File app/model/item.rb, line 324
def item_for_id(id)
  @items.find {|e| e && e.id == id }
end
remove(preferred, item) click to toggle source
# File app/model/item.rb, line 270
def remove(preferred, item)
  removed = 0
  
  if item.definition.properties[:stackable] or @always_stack
    slot = slot_for_id item.id
    stack = @items[slot]
    
    if stack.count > item.count
      removed = item.count
      set slot, Item.new(stack.id, stack.count - item.count)
    else
      removed = stack.count
      set slot, nil
    end
  else
    item.count.times {|i|
      slot = slot_for_id item.id
      
      if i == 0 && preferred != -1
        in_slot = @items[preferred]
        slot = preferred if in_slot.id == item.id
      end
      
      if slot != -1
        removed += 1
        set slot, nil
      else
        break
      end
    }
  end
  
  return removed
end
remove_empty_slots() click to toggle source
# File app/model/item.rb, line 341
def remove_empty_slots
  kept = @items.reject {|e| e == nil }
  @items = kept + ([nil] * (@capacity-kept.size))
  fire_items_changed if @fire_events
end
set(index, item) click to toggle source
# File app/model/item.rb, line 265
def set(index, item)
  @items[index] = item
  fire_slot_changed index if @fire_events
end
size() click to toggle source
# File app/model/item.rb, line 375
def size
  @items.count {|i| i != nil }
end
slot_for_id(id) click to toggle source
# File app/model/item.rb, line 328
def slot_for_id(id)
  @items.index {|e| e && e.id == id } or -1
end
swap(from, to, stfu = false) click to toggle source
# File app/model/item.rb, line 314
def swap(from, to, stfu = false)
  @items[from], @items[to] = @items[to], @items[from]
  slots = [from, to]
  fire_slots_changed(slots) if @fire_events && !stfu
end