• Anmelden

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

1

Donnerstag, 16. August 2012, 15:05

Nur spezielle Items im Itemwindow während Kampf anzeigen

Guten Nachmittag zusammen,

Ich möchte, dass im Itemwindow im Kampf nur Gegenstände mit bestimmten Attributen
angezeigt werden. Beispielsweise nur welche mit dem Attribut Nummer 17.
Ich benutze das RTAB und eine editierte Version des MoG Menüs. Ich schreibe das
jetzt dabei, weil ich nicht weiß, in welchem Skript sich die Klasse für das Itemwindow für den
Kampf verbirgt.

Könnte mir das jemand vielleicht zurecht skripten? Sobald ich weiß, wo die dazugehörige Klasse ist, würde
ich den Skript posten (falls das im RTAB oder MoG Menü sein sollte).

MfG
Mitsch93

2

Donnerstag, 16. August 2012, 18:11

Guck einfach nach einem Script "Window_Item", so heißt es zumindest im standard Menü.
Wenn es dort eins gibt, poste dieses, und sonst kann man einfach das standard Window Item überlagern [Hierfür einfach eine Kopie des Window_Item Scripts erstellen, Methoden die Du nicht überschreiben willst aus der Kopie entfernen und dann Änderungen an der Kopie vornehmen. :)].

Die Items im Inventar werden ja beim erzeugen des Fensters in einen Array @data gesteckt, dabei könntest Du filtern, ob das jeweilige Item im Elementset die Nummer 17 hat.

Ruby Quellcode

1
mein_item.element_set.include?(17) #=> true/false

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

3

Freitag, 17. August 2012, 10:00

Im MoG Menü habe ich diese Klasse gefunden.
Dabei sei gesagt (falls das gerade hier zutrifft): Im MoG Menü werden die Items ja schon nach Kategorien sortiert (im Elementen gespeichert.
Aber im Kampf werden sie nicht sortiert).
Deshalb möchte ich ja im Kampf auch nur Items mit Element 17 angezeigt bekommen, weil nur das die Items sind, die für den Kampf relevant sind.

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#================================================================= # EINGEFÜGT
# ** Window_MenuItem
#---------------------------------------------------------------------------
# Diese Klasse ersetzt Window_Item, Window_Weapon, Window_Armor im Menü.
#===========================================================================
class Window_MenuItem < Window_Selectable
 
  # Objekt-Initialisierung:
  def initialize(element_tag)
    super(250, 50, 295, 350)
    @element_tag = element_tag
    refresh
    self.index = 0
  end
 
  # Aktuelles Item ausgeben (Parameter wird nur intern verwendet)
  def item(index = self.index)
    return @data[index]
  end
 
  # Benutzbarkeit des akt. Items ausgeben (Parameter wird nur intern verwendet)
  def item_enabled?(index = self.index)
    item = self.item(index)
    return (item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id))
  end
 
  # Überprüfe auf Neuzeichnen nach mögl. Benutzen eines Items
  def refresh_on_item(item)
    index = @data.index(item)
    if index != nil
      old_data = @data
      collect_data
      if old_data == @data
        draw_item(index)
      else
        refresh
      end
    end
  end
 
  # Fensterinhalt komplett aktualisieren:
  def refresh
    collect_data
    @item_max = @data.size
    create_contents
    @item_max.times{ |i| draw_item(i) }
  end
 
  # Fensterinhalt neu erstellen:
  def create_contents
    contents.dispose  if contents != nil
    self.contents = Bitmap.new(width - 32, [row_max * 32, 1].max)
  end
 
  # Benutzbare Items sammeln:
  def collect_data
    @data = []
    ($data_items + $data_weapons + $data_armors).each do |item|
      @data.push(item)  if item_valid?(item)
    end
  end
 
  # Bestimme ob ein Item gesammelt werden soll:
  def item_valid?(item)
    return (item_number(item) > 0 and item.element_set.include?(@element_tag))
  end
 
  # Bestimme die Anzahl des Items im Inventar (negativ wenn Item = nil)
  def item_number(item)
    case item
    when RPG::Item 
      return $game_party.item_number(item.id)
    when RPG::Weapon
      return $game_party.weapon_number(item.id)
    when RPG::Armor
      return $game_party.armor_number(item.id)
    when nil
      return -1
    end
  end
 
  # Male das nte Item auf die Bildfläche:
  def draw_item(index)
    prepare_item_draw(index)
    r = item_rect(index)
    item = self.item(index)
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = item_enabled?(index) ? 255 : 128
    self.contents.blt(r.x + 4, r.y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    item = item(index)
    number = item_number(item)
    self.contents.draw_text(r.x + 32, r.y, r.width - 76, r.height, item.name)
    self.contents.draw_text(r.x + r.width - 44, r.y, 16, r.height, ":", 1)
    self.contents.draw_text(r.x + r.width - 28, r.y, 24, r.height, number.to_s, 2)
  end
 
  # Vorbereitungen für das Malen des nten Items:
  def prepare_item_draw(ind)
    self.contents.fill_rect(item_rect(ind), Color.new(0, 0, 0, 0))
    self.contents.font.name = "Georgia"    # <== Schriftart
    self.contents.font.color = item_enabled?(ind) ? normal_color : disabled_color
  end
 
  # Bestimmt das für das nte Item verfügbare Rechteck auf der Bildfläche:
  def item_rect(ind)
    cw = width / @column_max
    return Rect.new(ind % @column_max * cw, ind / @column_max * 32, cw - 32, 32)
  end
 
  # Aktualisiert das Hilfefenster:
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

snoopi

Rekrut

Motto: Der Beste Kampf - ist der, der Nie geführt wurde!

  • Nachricht senden

4

Dienstag, 21. August 2012, 21:13

Kannst du denn im MoG Menu auswählen, welche Elemente im Kampf nutzbar sein sollen?

Falls Ja: Und dies im Kampf trotzdem nicht klappt,
versuch mal das MoG weiter unten zu platzieren. Möglicher weisse wird die window class von einem anderem Skript überschrieben, dabei wird vom obersten Skript zum untersten Skript gelesen. Ist also MoG das letzte skript, dass was daran bastelt, sollte die Funktionen auch erhalten bleiben. (-> konnte so vielen Kompatibilitätsproblemen umgehen =P )


Falls MoG diese Funktion aber gar nicht besitzt, dann habe ich dich falsch verstanden -> bitte ignorieren ;)

Lg snoopi
Bild

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

5

Sonntag, 26. August 2012, 16:43

Leider hat das MoG Menü soeine Funktion nicht :(

Ich dachte mir, dass das eigentlich sehr einfach funktionieren würde.
Ich habe mal den Itemtruhenskript so verändert, dass Questgegenstände (mit einem Attribut versehen)
nicht in die Truhe abgelegt werden können. Dafür musste ich lediglich folgende Bedingung einfügen:

Ruby Quellcode

1
if  $data_items[@item.id].element_set.include?(21) then 

Ich dachte, dass geht so (oder so ähnlich) auch bei den Itemfenster im Kampf.
Also, dass nur Items mit einem gewissen Attribut angezeigt werden.

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

6

Sonntag, 26. August 2012, 18:00

Huhu,

die Klasse aus dem geposteten Script dürfte sich nur auf das Menü auswirken.

Letztenendes funktioniert das Prinzip im Kampf aber genauso wie du schon beschrieben hast.
Im Kampf wird wie Playm schon erwähnte eine Instanz von Window_Item verwendet.
Das gleichnamige Script definiert dabei eine Methode refresh, die unter anderem für die Auswahl der Items zuständig ist:

Spoiler

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Window_Item < Window_Selectable
 
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    # Add item
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])      # <<<<<----- Hier kann eine Bedingung angefügt werden! 
      end
    end
    # Also add weapons and items if outside of battle
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end
zum Lesen den Text mit der Maus markieren

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

7

Sonntag, 26. August 2012, 18:35

Kriege hier eine Fehlermeldung und weiß nicht, wie ich es sonst machen sollte:

Ruby Quellcode

1
2
3
if @data[$data_items[i]].element_set.include?(17) then 
          @data.push($data_items[i])
        end

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

8

Sonntag, 26. August 2012, 18:53

@data ist ein Array, welches am Ende alle Items enthält die angezeigt werden sollen.
push fügt dem Array das jeweilige Item hinzu.
$data_items ist wiederum ein Array welches alle Items enthält die im Editor in der Database eingestellt wurden.

Das Filtern könnte dabei etwa so aussehen:

Ruby Quellcode

1
2
3
if $data_items[i].element_set.include?(17) 
  @data.push($data_items[i])
end

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

9

Mittwoch, 29. August 2012, 15:59

Habs direkt mal ausprobiert und erhalte folgende Fehlermeldung:
cannot convert RPG::Item into Integer

Edit
Hat keiner dafür eine Lösung?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (29. August 2012, 15:59)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

10

Mittwoch, 29. August 2012, 16:51

Welche Fehlermeldung kam denn vorher?

Wenn es die selbe Meldung gewesen sein sollte und die Änderung im Testkampfmodus ausprobiert haben solltest:
der Testkampf verwendet nur dann die aktuellen Scripts wenn du das Projekt vorher abspeicherst.
Solltest du das nicht getan haben versuche es einfach nochmal, ansonsten wäre es evtl. hilfreich wenn du nochmal das gesammte Script posten könntest. :)

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

Social Bookmarks