Seite 4 von 4

Verfasst: 28.07.2006, 09:05
von Bissiger Witzbold
Bòógieman hat geschrieben:kann es sein, dass in den starterpacks kleine fiese bugs versteckt sind, die zum absturz des spiels führen können? :shock:

[...] ich hatte gerade einen inventargegenstand angeklickt und dabei aber den mauscursor weiter bewegt
der klick hat die entsprechende funktion für die inventarklicks ausgelöst, aber als dann auf das inventarobjekt unter dem cursor zugegriffen werden sollte, war der cursor anscheinend schon wieder ausserhalb dieses objektes --> scriptfehler wegen ungültiger inventar-ID :o

anders kann ich mir diesen fehler nicht erklären, denn bisher hat dieses inventarobjekt schon ca. 1000mal problemlos funktionier :-k

ist das vielleicht schon bekannt und kann man das irgendwie verhindern :?:
Das Problem hatten wir auch schon (in allen Starterpacks). Das Script des MMM-GUIs schaut offenbar nach, welcher Inventargegenstand sich unter dem Mousecursor befindet, und wenn man die Maus beim klicken zu schnell bewegt, ist dort kein Gegenstand mehr, wenn das Script nachschaut und das Spiel stürzt ab.

Einen schmutzigen Fix haben wir für unsere neuste Folge bereits geschrieben (siehe die markierten Ergänzungen im folgenden Ausschnitt aus dem GlobalScript), hier wird abgefragt ob sich wirklich ein Gegenstand unter der Maus befindet und wenn nicht wird einfach gar nichts gemacht statt das Spiel abstürzen zu lassen.

Ganz fehlerfrei ist allerdings auch das nicht: Wenn man die Maus in der Zwischenzeit auf einen anderen Gegenstand bewegt hat, so wird dieser genommen statt dem ursprünglich ausgewählten (aber das ist ohne den Fix auch so).

--------
// if the mode is useinv and the mouse is over the active inv (like "use knife on knife")
}
else
{
used_action = global_action;
if (GetCursorMode () == 2)
{
if (isAction (A_USE) && IsInventoryInteractionAvailable (GSlocid, MODE_USE) == 1)
{
SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
RunInventoryInteraction (GSlocid, MODE_USE);
SetAction (A_DEFAULT);
}
else if (GetInvAt (mouse.x, mouse.y) >= 0) SetActiveInventory (GSlocid);
}
else
{
GSagsusedmode = GetCursorMode ();
SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
if (GetInvAt (mouse.x, mouse.y) >= 0) RunInventoryInteraction (GSlocid, GetCursorMode ());
SetAction (A_DEFAULT);
}
}
}
else if (button == RIGHTINV)
--------

Keine Garantie auf Funktionstüchtigkeit, aber bisher scheint es bei uns zu funktionieren.

Verfasst: 28.07.2006, 09:47
von Bòógieman
diese lösung ist völlig ausreichend :D
besten dank!

Verfasst: 28.07.2006, 13:48
von Mister L
Rayman hat geschrieben:...Script Header was bei Zeile 94 ändern soll. :-k
Und was steht in Zeile 94?

Verfasst: 29.07.2006, 00:15
von Rayman
Auf Zeile 94 steht:

Code: Alles auswählen

import function SetDoorStrings (const string lookat,const string islocked,const string wrongitem);

Verfasst: 29.07.2006, 00:30
von Kaktus
Also ich habe das mal getestet, und bei mir gab es keinen Fehler, als ich das "First time player enter room" gelöscht habe.

Es könnte sich auch um einen AGS-Bug handeln, ist bei mir auch letztens passiert, als ich ein "Run-Script" gelöscht habe.
Als ich AGS dann wieder geschlossen habe und es nochmal gelöscht habe, kam der Fehler nicht mehr.

Vergiss nie: Nobody is perfect, selbst AGS nicht ;)

Verfasst: 17.08.2006, 03:01
von Bòógieman
ich habe da mal wieder ein neues "problem" mit den starterpacks
für manche charaktere (aus MMD) dürfte anscheinend eine globale behandlung für TALK_TO events existieren
dabei läuft der player-charakter gleich zum gesprächspartner
das ist aber nur bei manchen figuren so. die von mir erstellten charaktere machen das nicht.
weiß zufällig jemand, wo das im script zu finden ist?
ich würde gerne selber bestimmen, wo meine figuren vor einem dialog hinlaufen :wink:

ohne script debugger wird man da ganz schön alt beim suchen :lol:

Verfasst: 17.08.2006, 03:11
von KhrisMUC
Habs gefunden, die entsprechende Stelle ist in der on_mouse_click und sieht so aus:

Code: Alles auswählen

    else if ((GSagsusedmode == MODE_TALK) && (IsInteractionAvailable (mouse.x, mouse.y, GSagsusedmode) == 1) && (GetCharacterAt (mouse.x, mouse.y) < 7))
    {
      SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
      if (GoToCharacter (GSlocid, 0, 1, 2)) RunCharacterInteraction (GSlocid, GSagsusedmode);
      SetAction (A_DEFAULT);
    }
Entscheidend ist hierbei das "< 7" am Ende der ersten Zeile, das bewirkt, dass der Hauptcharakter nur zu den ersten sechs anderen hinläuft.
Um selbst zu bestimmen, wo der Charakter hinläuft, muss der Code so aussehen:

Code: Alles auswählen

    else if ((GSagsusedmode == MODE_TALK) && (IsInteractionAvailable (mouse.x, mouse.y, GSagsusedmode) == 1))
    {
      SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
      RunCharacterInteraction (GSlocid, GSagsusedmode);
      SetAction (A_DEFAULT);
    }
EDIT: Stimmt, an die rechte Maustaste hab ich nicht gedacht.

Verfasst: 17.08.2006, 14:42
von Bòógieman
besten dank! :D

allerdings gibt es noch eine zweite stelle, die ebenfalls abgeändert werden muss
die von dir beschriebene änderung ist nur für die linke maustaste
für die rechte maustaste (also per default-action) gibt es ebenfalls so einen ähnlichen codeblock

Verfasst: 18.08.2006, 01:41
von Bòógieman
Hmm, irgendwie habe ich es geschafft, dass ein Inventargegenstand plötzlich als ein anderer Inventargegenstand behandelt wurde :shock:
in meinem script habe ich den letzten inventargegenstand mit player.loseinventory entfernt und einen neuen mit player.addinventory hinzugefügt.
als ich dann gleich darauf "Schau an" auf den neuen gegenstand ausgeführt habe, kamm komischerweise der text für den entfernten gegenstand
beim zweiten versuch war wieder alles ganz normal

ich habe den ganzen ablauf später nochmal probiert, aber da hat es dann so funktioniert wie es sollte :-k

ist das schonmal jemanden aufgefallen, oder habe ich mir das ganze einfach nur eingebildet? :lol: