monster_count = 0DownstreamHook.add("monster_counter") do |line| if line =~ /Also here: .*(troll|ogre|giant)/ monster_count += 1 echo "Monsters encountered: #{monster_count}" end lineend
DownstreamHook.add("track_room_changes") do |line| # Line includes XML tags in raw form if line =~ /<nav rm='(\d+)'/ room_id = $1 echo "Entered room: #{room_id}" end lineend
# Remove a specific hookDownstreamHook.remove("my_hook")UpstreamHook.remove("my_hook")# Always remove hooks when script exitsbefore_dying { DownstreamHook.remove("my_hook") UpstreamHook.remove("my_hook")}
Always remove your hooks in a before_dying callback to prevent them from persisting after your script exits.
# List all downstream hooksDownstreamHook.list.each do |name| echo "Downstream: #{name}"end# List all upstream hooksUpstreamHook.list.each do |name| echo "Upstream: #{name}"end# See hook sources (which script added them)DownstreamHook.sourcesUpstreamHook.sources
DownstreamHook.add("first") do |line| echo "First hook" lineendDownstreamHook.add("second") do |line| echo "Second hook" lineend# Output will be:# First hook# Second hook
buffer = []DownstreamHook.add("multi_line") do |line| buffer << line # Keep last 5 lines buffer.shift if buffer.length > 5 # Check for pattern across multiple lines if buffer.join(" ") =~ /important.*sequence/ echo "Pattern detected!" end lineend
state = :idleDownstreamHook.add("state_machine") do |line| case state when :idle if line =~ /combat begins/ state = :combat echo "Entering combat mode" end when :combat if line =~ /combat ends/ state = :idle echo "Exiting combat mode" end end lineend