### this is the base for all triggers
class TriggerBase
attr_accessor :fun, :type, :dies, :arg, :owner
@@trig_list = [] #list for all triggers
def initialize(owner, type, function, args, dies=true)
@fun = function
@type = type
@dies = dies
@arg = args
@owner = Weakref.new(o)
@@trig_list << self
end
# fires this trigger.
def fire obj
#executes our method with the given argument.
return false if obj != owner
ObjectSpace.garbage_collect
@owner = nil if !@owner.weakref_alive?
if @owner != nil
@owner.send(fun, *arg)
else
return true
end
return self.dies
end
def delete
@@trig_list.delete self
end
end
###triggers on entry
class TrigEnter < TriggerBase
attr_accessor :vnum_list
def initialize(o, v, f, arg, dies=true)
super(o, :trig_enter, f, arg, dies)
@vnum_list = v
end
# test all these trigger and see if one fires with vnum.
def TrigEnter.poll obj, needle
@@trig_list.each do |t|
if t.type == :trig_enter
t.vnum_list.each do |v|
next if v != needle
t.delete if t.fire(obj)
end
end
end
end
end
### trigger will fire when you come in proximity
class TrigProx < TriggerBase
attr_accessor :room_vnum, :xy, :distance
def initialize(o, v, f, arg, dies=false)
super(o, :trig_prox, f, arg, dies)
@xy, @room_vnum, @distance = v[0], v[1], v[2]
end
def TrigProx.poll obj, coord, roomnum
@@trig_list.each do |t|
if t.type == :trig_prox
next if t.room_vnum != roomnum or dist_form(coord, t.xy) > t.distance
# we can fire.
t.delete if t.fire(obj)
end
end
end
end
$exit_fix_list = []
### This function is called by the eventmachine in ./core/coral.rb
### It's called hovering around 10 times a second.
### This is not a place for low level timer implementation. EventMachine implements that for us.
def heartbeat
$dsock_list.each do |d|
if d.bust_prompt == true
if $last_sent != '>'
d.text_to_socket "#{Time.now.strftime("#R[%I:%M%p]#w")}CM>" + ENDL
end
d.bust_prompt = false
end
end
end