Ich verstehe genau was du meinst, fühle mich aber außer Stande das ohne Anleitung hin zu bekommen.
Ich poste jetzt einfach mal den meiner Meinung nach relevanten Code. Wäre genial wenn du mir da auf die Sprünge helfen könntest.

Das ist die Update-Funktion in der weiter unten der Waffenwechsel initiiert wird.
Code:
class Scene_Map
  alias :mss_map_ini_original :initialize if $MSS.nil?
  def initialize
    mss_map_ini_original 
    $MSS.ini_hud
  end

  alias :mss_map_update_original :update if $MSS.nil?
  def update
    $MSS.update if $MSS.active
    mss_map_update_original
  end
end

class Window_Message
  alias :mss_dispose_original :dispose if $MSS.nil?
  def dispose
    mss_dispose_original
    $MSS.dispose
  end
end

class MSS
  def update
   return if $game_temp.message_window_showing
   $game_player.direction_fix = @key.getkey_id(@key_strafe) unless @key_strafe.nil?
   if @wait > 0
       @wait -= 1
       @hud_laden.refresh unless @hud_laden.nil?
       if @wait == 0
         $game_system.menu_disabled = false
         @hud_laden.dispose unless @hud_laden.nil?
         @hud_laden = nil
       end
       return
   end
   if @schussrate > 0
    @schussrate -= 1 
    return
  end

   # Sprinten
   if @sprinten_akt == true and @key.getkey_id(@key_sprinten) and @sprinten > 0
    @sprinten -= 1
    @hud_energie.refresh(@sprinten) if Graphics.frame_count % 2 == 0
    return
   elsif @sprinten_akt == true
    $game_player.move_speed -= 1
    @sprinten_akt = false
   end
  
   if @key.getkey_id(@key_sprinten) and @sprinten > 20
    @sprinten_akt = true 
    $game_player.move_speed += 1
    @hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max) if @sprinten == @sprinten_max
   elsif @sprinten < @sprinten_max
    if Graphics.frame_count % ($game_player.moving? ? 6 : 3) == 0
     @sprinten += 1
     @hud_energie.refresh(@sprinten)
    end
   elsif @sprinten == @sprinten_max and !@hud_energie.nil?
    @hud_energie.dispose
    @hud_energie = nil
  end
  # /
  
  use_medikit if @key.getkey_id(@key_medikit)
  granate_wefen if @key.getkey_id(@key_granate)
  mine_legen if @key.getkey_id(@key_mine)
  
  if @key.getkey_id(69) # E
    granate_wefen(4,2)
    granate_wefen(4,4)
    granate_wefen(4,6)
    granate_wefen(4,8)
  end
  
   if @waffe_aktuell != nil
    if @waffen_atr[@waffe_aktuell['Name']]['Schussrate'].nil?
     schuss if Input.trigger?(Input::C)
   elsif @key.getkey_id(13) or @key.getkey_id(32)
    schuss
    @schussrate = @waffen_atr[@waffe_aktuell['Name']]['Schussrate']
   end
  end

  if @option_allow_weapon_change
    for taste in 0..@waffe.size - 2
      if @key.getkey_id(49+taste) and @waffe[0] != taste+1
      change_weapon(taste+1)
    end
   end
  end
  
   for taste in @nachladetasten
     nachladen if @key.getkey_id(taste)
   end
 end

 def dispose
   if @hud.is_a?(MSS_HUD)
      @hud.dispose
      @hud = nil
   end
   if @hud_laden.is_a?(MSS_HUD_LADEN)
      @hud_laden.dispose
      @hud_laden = nil
   end
   if @hud_boss.is_a?(MSS_HUD_BOSS)
      @hud_boss.dispose
      @hud_boss = nil
   end
    
   if !@hud_energie.nil?
      @hud_energie.dispose
      @hud_energie = nil 
  end
 end
 
 def ini_hud
  @hud = @option_hud_sichtbar[0] ? MSS_HUD.new : MSS_HUD_Dummy.new
  boss(true,@hud_boss_active[0],@hud_boss_active[1],true) if @hud_boss_active.is_a?(Array)
  @hud_energie = MSS_HUD_ENERGIE.new(@sprinten_max, false) unless @sprinten == @sprinten_max
 end
end
Und hier das Script in dem die def steht, auf die ich zugreifen möchte. Die Stelle ist etwas über der Mitte.
Code:
class MSS
  attr_accessor :waffen_atr, :waffe_aktuell, :gegner_atr, :active, 
  :statistik, :waffe, :events, :actor, :key, :hud, :wait, :ziel,
  :hud, :hud_laden, :hud_boss, :hud_boss_active, :option_events_aktivieren,
  :option_allow_weapon_change, :option_quake_sounds, :option_automatisches_nachladen,
  :items, :actor_graphic, :heal_power, :sprinten_max, :granate_power, :mine_power,
  :movement_8_way, :skills
  def schuss(taeter=$game_player,ziel='Events',abfrage=false,spezial=true)
   @taeter = taeter; @ziel = ziel
   @taeter = $game_map.events[@taeter] if @taeter.is_a?(Integer)
   @hx = @taeter.x
   @hy = @taeter.y
   @hd = @taeter.direction
   
   if @ziel == 'Events'
    if not @waffe_aktuell['Magazin'] > 0
     $game_system.se_play(@leere_waffe_sound)
     return
   end
    spezschuss = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Schuss']
    eval(spezschuss) unless spezschuss.nil?
    $game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Schusssound'])
    @statistik['Schuesse'] += 1
    @waffe_aktuell['Magazin'] -= 1
    @hud.refresh
    if @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'] != nil
      $game_player.animation_id = @waffen_atr[@waffe_aktuell['Name']]['Mündungsfeuer'][$game_player.direction / 2 - 1]
    end
    @killed = 0; @int = 0
    treffer?
    quake_sound
    nachladen if @waffe_aktuell['Magazin'] == 0 and @option_automatisches_nachladen
    elsif @ziel == 'Player'
      treffer?
    end
  end
  
  def quake_sound
   @statistik['Multikill'] = @killed if @killed > @statistik['Multikill']
   if @killed > 1 and @option_quake_sounds[0]
     if @killed > @option_quake_sounds.size then sound = @option_quake_sounds.size else sound = @killed end
     $game_system.se_play(@option_quake_sounds[sound-1])
   end
  end
  
  def treffer?
    case @hd
     when 2 # Runter
      start = @hy + 1
      ende = $game_map.height
      counter = 1
      vari = 1 # Y
     when 4 # Links
      start = @hx - 1
      ende = -1
      counter = -1
      vari = 0 # X
     when 6 # Rechts
      start = @hx + 1
      ende = $game_map.width
      counter = 1
      vari = 0
     when 8 # Hoch
      start = @hy - 1
      ende = -1
      counter = -1
      vari = 1
    end
    x, y = @hx, @hy
    tile = start
    while tile != ende
      if vari == 0
        x = tile
      else
        y = tile
      end
      break if $game_map.passable?(x,y,0) == false and @undurchlässiges_terrain.include?($game_map.terrain_tag(x,y)) == false
      @id = $game_map.id_coordinates(x,y)
      break if @events['Hindernis'].include?(@id)
      if @ziel == 'Player'
       if @id == 0
         getroffen 
         return
       end
       tile += counter
       next
      end
      @int = id_to_int(@id)
      if @id > 0 and @int != nil and @events['Gegner'][@int] != nil and 
      $game_self_switches[[$game_map.map_id, @id, 'A']] == false
         getroffen
         break if @events['Gegner'][@int]['HP'] != nil and 
         not @gegner_atr[@events['Gegner'][@int]['Klasse']]['Kugeldurchlässig']
      end
      tile += counter
    end
  end
  
  def getroffen
    if @ziel == 'Player'
      gegner_schlag(@taeter.id)
      return
    end

    spezial = @events['Gegner'][@int]['Spezial']
    unless spezial.nil?
      eval(spezial)
      return
    end
    
    spezial = @gegner_atr[@events['Gegner'][@int]['Klasse']]['Spezial']
    if !spezial.nil?
     aftereval = spezial.include?('!A!')
     eval(spezial) unless aftereval
    end
  
   schaden = @waffen_atr[@waffe_aktuell['Name']]['Schaden']
   
   make_damage(@id,schaden,blut_animation(@id,@hd))
   @store_direction #ssssssssssssssssssssssss
   eval(spezial.gsub('!A!','')) if aftereval
   @restore_direction #ssssssssssssssssssssssss
  end
  
  def nachladen
    return if @waffe_aktuell.nil?
    magazin_max = @waffen_atr[@waffe_aktuell['Name']]['Magazin']
    magazin = @waffe_aktuell['Magazin']
    munition = @waffe_aktuell['Munition']
    noetig = magazin_max - magazin
    return if magazin == magazin_max
    return if munition == 0
    if munition == '/'
      magazin = magazin_max
    else
      if munition + magazin >= magazin_max
      munition -= noetig
      magazin = magazin_max
    else
      magazin += munition
      munition = 0
     end
    end
    @waffe_aktuell['Magazin'] = magazin
    @waffe_aktuell['Munition'] = munition
    $game_system.se_play(@waffen_atr[@waffe_aktuell['Name']]['Nachladesound'])
    wait_balken(@waffen_atr[@waffe_aktuell['Name']]['Nachladezeit'])
    @hud.refresh
  end
  
  def gegner_schlag(id)
int = id_to_int(id)
    schaden = @gegner_atr[@events['Gegner'][int]['Klasse']]['Schaden']
    $game_actors[@actor].hp -= schaden
    @statistik['Verlorene HP'] += schaden
    $game_player.animation_id = 
    @gegner_atr[@events['Gegner'][int]['Klasse']]['Trefferanimation']
  end
  
  def dead?(id)
    return true if @events['Gegner'][id_to_int(id)]['HP'] == 0
    return false
  end
  
  def all_dead?
    ins = 0;@events['Gegner'].each { |g| ins += g['HP'] if !g['HP'].nil?}
    return true if ins == 0
    return false
  end
  
  def kill(id)
    id = [id] if id.is_a?(Numeric) 
    for i in id
     @events['Gegner'][id_to_int(i)]['HP'] = 0
     change_local_switch(i)
    end
  end
  
  def kill_all
   @events['ID'].each_index {|i|int = id_to_int(i);kill(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
  end
  
  def heal(id)
    id = [id] if id.is_a?(Numeric)
    for i in id
     int = id_to_int(i)
     @events['Gegner'][int]['HP'] = 
     @gegner_atr[@events['Gegner'][int]['Klasse']]['HP']
     change_local_switch(i,false)
    end
  end
  
  def heal_all
    @events['ID'].each_index {|i|int = id_to_int(i);heal(i) if !int.nil? and !@events['Gegner'][int]['HP'].nil?}
  end
  
  def add_ammo(name,ammo)
    @waffe[find_weapon_slot(name)]['Munition'] += ammo
  end
  
  def add_weapon(name,munition=300,magazin=30,id=0,double=false)
    return if !double and find_weapon_slot(name) != @waffe.size
    hash = {'Name' => name, 'Munition' => munition, 'Magazin' => magazin}
    if id == 0 then @waffe << hash else @waffe[id] = hash ;end
  end
  
  def remove_weapon(name)
    if name.is_a?(String)
     @waffe.delete_at(find_weapon_slot(name))
   else
     @waffe.delete_at(name)
    end
  end
  
  def find_weapon_slot(name='')
    name.to_s
    @waffe.each_with_index do |waffe,index|
      next if index < 2
      return index if name == waffe['Name']
    end
    return @waffe.size
  end
  
  def boss(show=true,id=1,name='',menu=false)
    @hud_boss.dispose if @hud_boss_active.is_a?(Array) and menu == false
    if show
     @hud_boss = MSS_HUD_BOSS.new(id,name)
     @hud_boss_active = [id,name]
    else
     @hud_boss.dispose
     @hud_boss = nil
     @hud_boss_active = nil
   end
 end
 
  def change_weapon(id=2)
   unless @waffe_aktuell.nil?
     spezab = @waffen_atr[@waffe_aktuell['Name']]['Spezial_Ablegen']
     eval(spezab) unless spezab.nil?
   end
   if @waffe[id].nil?
     $game_actors[@actor].set_graphic(@actor_graphic, 0, '', 0)
    else
     $game_actors[@actor].set_graphic(@waffen_atr[@waffe[id]['Name']]['Spielergrafik'], 0, '', 0)
     spezan = @waffen_atr[@waffe[id]['Name']]['Spezial_Anlegen']
     eval(spezan) unless spezan.nil?
   end
   $game_system.se_play(@waffenwechselsound)
   @waffe[0] = id
   @waffe_aktuell = @waffe[@waffe[0]]
   @hud.refresh
   $game_player.refresh
 end 
 
 def change_local_switch(id,value=true,switch='A',map=$game_map.map_id)
  for i in id.to_a
   $game_self_switches[[map, i, switch]] = value
  end
  $game_map.need_refresh = true
 end

  def option_hud_sichtbar(hud=true,balken=true)
    @option_hud_sichtbar = [hud,balken]
    @hud.dispose
    if hud
      @hud = MSS_HUD.new
    else
      @hud = MSS_HUD_Dummy.new
    end
  end
  
  def make_saveable
    dispose
    @key = nil
  end
  
  def make_playable
    @key = Keys.new
  end
   
  def make_damage(id,schaden,ani=0)
    return if $game_self_switches[[$game_map.map_id, id, 'A']]
    int = id_to_int(id)
    @events['Gegner'][int]['HP'] -= schaden
    @statistik['Zugefuegter Schaden'] += schaden
    $game_map.events[id].animation_id = ani
    if @events['Gegner'][int]['HP'] <= 0
     @statistik['Zugefuegter Schaden'] += @events['Gegner'][int]['HP']
     @events['Gegner'][int]['HP'] = 0
     change_local_switch(id)
     @statistik['Gegner'] += 1
     @killed += 1
   end
   @hud_boss.refresh if @hud_boss_active.is_a?(Array) and @hud_boss_active[0] == id
 end
  
  def wait_balken(wait)
    return if @wait > 0
    @wait = wait
    $game_system.menu_disabled = true
    @hud_laden = @option_hud_sichtbar[1] ? MSS_HUD_LADEN.new(wait) : MSS_HUD_Dummy.new
  end
  
  def items_add(wert, key)
    $MSS.items[key] += wert
    @hud.refresh
  end
  
  def direction(x1,y1,x2,y2)
    x, y = x2 - x1, y2 - y1
    return -1 if x == 0 and y == 0
    if x.abs > y.abs
     return x > 0 ? 4 : 6
    else
     return y > 0 ? 8 : 2
   end
  end
 
  def blut_animation(id,d)
   blut = @gegner_atr[@events['Gegner'][id_to_int(id)]['Klasse']]['Blut']
   return blut.nil? ? 0 : blut[d / 2 - 1]
  end
 
  def id_to_int(id)
    return @events['ID'][id]
  end
 
  def garbage_collector
   $game_map.events.each{|e|$game_map.events.delete(e[1].id) if $game_self_switches[[$game_map.map_id, e[1].id, 'A']]}
  end
  
  def debug
   File.open('MSS.txt','w') {|f|f.write($MSS.inspect)}
  end
end

class Game_Map
  attr_reader   :map
  alias :mss_original_setup :setup if $MSS.nil?
  def setup(map_id)
    mss_original_setup(map_id)
    $MSS.ini_events
  end
  
  def id_coordinates(x=0,y=0)
    @events.each {|e|return e[1].id if e[1].x == x and e[1].y == y}
    return 0 if $game_player.x == x and $game_player.y == y
    return -1
  end
  
  def id_coordinates_mine(x=0,y=0,id=0)
    @events.each {|e|return e[1].id if e[1].x == x and e[1].y == y and e[1].id != id}
    return -1
  end
  
  def id_coordinates_array(x=0,y=0)
    array = []
    @events.each {|e|array << e[1].id if e[1].x == x and e[1].y == y}
    array << 0 if $game_player.x == x and $game_player.y == y
    return array
  end
  
  def id_rect(rect)
    ev = []
    @events.each {|e|ev << e[1].id if rect.inside?(e[1])}
    return ev
  end
end

class Game_Character
 attr_accessor :flat
 alias :mss_original_initialize :initialize if $MSS.nil?
 alias :mss_original_screen_z :screen_z if $MSS.nil?
 def initialize
   @flat = false
   mss_original_initialize
 end
 def screen_z(height = 0)
    return 0 if @flat
    mss_original_screen_z(height)
  end
end

class Keys
  def initialize
    @GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'l','l')
    @keybd_event = Win32API.new('user32', 'keybd_event', %w(l l l l), '')
  end
  def getkey
    for i in 0..255
      if @GetAsyncKeyState.call(i) != 0
        return i
      end
    end
    return 0
  end
  def getkey_id(id)
     if @GetAsyncKeyState.call(id) != 0
       return true
     end
     return false
  end
  def setkey_id_down(id)
    @keybd_event.call(id,0,0,0)
  end
    def setkey_id_up(id)
    @keybd_event.call(id,0,2,0)
  end
end

class Game_Player < Game_Character
  def update
    last_moving = moving?
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
    #==========EDIT===========#
    if $MSS.movement_8_way
      case Input.dir8
      when 1
        move_lower_left
      when 2
        move_down
      when 3
        move_lower_right
      when 4
        move_left
      when 6
        move_right
      when 7
        move_upper_left
      when 8
        move_up
      when 9
        move_upper_right
      end
    else
      case Input.dir4
      when 2
        move_down
      when 4
        move_left
      when 6
        move_right
      when 8
        move_up
      end
    end
    #==========EDIT===========#
    end
    last_real_x = @real_x
    last_real_y = @real_y
    super
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      $game_map.scroll_down(@real_y - last_real_y)
    end
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      $game_map.scroll_left(last_real_x - @real_x)
    end
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      $game_map.scroll_right(@real_x - last_real_x)
    end
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      $game_map.scroll_up(last_real_y - @real_y)
    end
    unless moving?
      if last_moving
        result = check_event_trigger_here([1,2])
        if result == false
          unless $DEBUG and Input.press?(Input::CTRL)
            if @encounter_count > 0
              @encounter_count -= 1
            end
          end
        end
      end
    #==========EDIT===========#
    if $MSS.active == false or $MSS.waffe_aktuell == nil or $MSS.option_events_aktivieren
      if Input.trigger?(Input::C)
        check_event_trigger_here([0])
        check_event_trigger_there([0,1,2])
        end
      end
    #==========EDIT===========#
    end
  end
end

class Game_System
  attr_accessor :mss_save
end

class Game_Character
  attr_accessor :direction_fix
end

class Rect
  def each
    for xx in x..x + width
      for yy in y..y + height
        yield xx, yy
      end
    end
  end
  
  def inside?(ox,oy=0)
   ox, oy = ox.x, ox.y unless ox.is_a?(Integer)
   return (ox.between?(x, x + width)) && (oy.between?(y, y + height))
  end
end

class Game_SelfSwitches
  def delete(key)
    @data.delete(key)
  end
end

class Game_Battler
  alias :mss_hpchange_original :hp= if $MSS.nil?
  def hp=(hp)
    mss_hpchange_original(hp)
    return unless self.is_a?(Game_Actor)
    $MSS.hud.refresh
    $game_temp.gameover = true if @hp == 0
  end
end

class Scene_Save < Scene_File
  alias :mss_write_save_data_original :write_save_data if $MSS.nil?
  def write_save_data(file)
    $MSS.make_saveable
    $game_system.mss_save = $MSS
    mss_write_save_data_original(file)
    $MSS.make_playable
  end
end


class Scene_Load < Scene_File
  alias :mss_read_save_data_original :read_save_data if $MSS.nil?
  def read_save_data(file)
    mss_read_save_data_original(file)
    $MSS = $game_system.mss_save
    $MSS.make_playable
  end
end

class Scene_Title
  alias :mss_title_ini_original :initialize if $MSS.nil?
  def initialize
   $MSS = MSS.new
   mss_title_ini_original
 end
end