Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Thema gestartet von: fireorange am 07. Mai 2010, 12:13:46
-
Komische Situation, ich habe sowohl den FaceCharacter-Bug als auch den SetActiveInventory-Bug nach Anleitung aus dem AT behoben, wie ich es immer gemacht habe. Doch diesmal tritt folgender Fehler weiterhin auf :( :
Übrigens kommt dort auch folgende Meldung, ich weiß nicht, obs an mir (evtl. schnelles Mausklicken??) lag....
---------------------------
Adventure Game Studio
---------------------------
An error has occured. Please contact the game author for support, as this
is likely to be a scripting error and not a bug in AGS.
(ACI version 2.72.920)
in Global script (line 926)
from Global script (line 945)
from Global script (line 1497)
Error: FaceCharacter: characters are in different rooms
---------------------------
OK
---------------------------
Hab ich was übersehen? :-\ Ich verstehs gerade net.
-
möglicherweise machst du ja wirklich ein FaceCharacter auf einen char der nicht im selben raum ist?
-
Das bezweifle ich irgendwie, sonst würde das wahrscheinlich bei jedem Durchspielen passieren.
Na ja, nochmal zum Gesamtüberblick, ich habe folgende zwei Bugs behoben:
--------
// 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)
--------
und zwar gibts in der Funktion unhandled_event nach dem grünen auskommentierten code so rund um zeile 2000 eine Zeile da steht:
if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
diese ersetzen durch:
if (type == 2 || type == 6)
{
if(GetLocationType(mouse.x,mouse.y)==2)
FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
dann sollte der bug nicht mehr auftreten
-
Was häufig passieren kann, ist, dass evtl. auch die Charakter-ID vom Charakter-Editor und im Script nicht übereinstimmen. Ganz besonders häufig hatte ich das bei Bernard, weil er offiziell ohne H geschrieben wird, aber in den Starterpacks beim Script-Namen MIT H geschrieben wurde.
BG
der Volltanker
-
Waren die Script-Names der Chars und auch die RoomNumbers stimmig?
Notfalls am Besten den Script durch einen Ähnlichen ersetzen, dann müsste auch der Bug nicht
mehr vorkommen.
-
Rayman, ich weiß leider net, an welcher Stelle das passiert ist und kann auch net sagen, ob es ein spezielles Skript war. Helli konnte es ja auch nicht haargenau rekonstruieren.
-
Was häufig passieren kann, ist, dass evtl. auch die Charakter-ID vom Charakter-Editor und im Script nicht übereinstimmen.
Dass dürfte eigentlich nicht der Grund sein. Denn wenn eine fehlerhafte (sprich im Spiel nicht vorhandene) Char-ID benutzt wird meckert AGS schon beim erstellen des Skriptes.
Ganz besonders häufig hatte ich das bei Bernard, weil er offiziell ohne H geschrieben wird, aber in den Starterpacks beim Script-Namen MIT H geschrieben wurde.
*seufz* Wie oft haben wir diesen Fehler jetzt schon beseitigit?
-
Bau doch mal folgendes in die FaceCharacter-Funktion ein:
if ( player.Room != character.Room )
{
player.Say("Fehler* Spieler nicht im selben Raum");
}
Du kannst auch (AGS3 vorrausgesetzt) einen Breakpoint dorthin setzen.
---
Poste doch mal die Zeilen um
in Global script (line 926)
-
Sorry für die späte Antwort, hatte noch andere Sachen zu korrigieren. ;) In den entsprechenden Zeilen steht:
// characters only face each other after the moving character arrived at the target point
if (NPCfacesplayer == 1) FaceCharacter (charid, playerchar);
FaceCharacter (playerchar, charid);
}
return arrived;
}
AGS 3 verwende ich für MMM nach wie vor noch net. ;)
-
Bau doch mal folgendes in die FaceCharacter-Funktion ein:
if ( player.Room != character.Room )
{
player.Say("Fehler* Spieler nicht im selben Raum");
}
Da ich den Fehler net beheben konnte, werde ich das wohl tun müssen. Aber wo genau muss ich das jetzt einfügen oder welche Skriptstelle muss ich ersetzen? Beim Global Script bin ich immer sehr vorsichtig.
-
Wie du bereits weiter oben gepostet hattest.
if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
ersetze es mal durch
if (type == 2 || type == 6)
{
if ( player.Room != GetCharacterAt (mouse.x, mouse.y).Room )
{
player.Say("Character nicht im selben Raum %d %d\n", GetCharacterAt (mouse.x, mouse.y).Room, GetCharacterAt (mouse.x, mouse.y).ID);
}
else
{
FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
}
So weist du den Raum des Characters den dein Spieler anschauen soll und auch die ID.
PS: Ich habe es nicht getestet.
-
Testen wird eh schwer, da der Fehler sehr selten auftritt bzw. erst zweimal gemeldet wurde und bei mir selbst höchstens dreimal aufgetreten ist. Ich werde es mal versuchen, danke.
-
Versuch doch mal, nach dem Ausführen der Aktion die Maus schnell in diue Inventargui zu schieben, wenn das Skript dann an die Stelle kommt und die Maus ist woanders, dann kann es durchaus zu diesem fehler kommen.
-
Versuch doch mal, nach dem Ausführen der Aktion die Maus schnell in diue Inventargui zu schieben, wenn das Skript dann an die Stelle kommt und die Maus ist woanders, dann kann es durchaus zu diesem fehler kommen.
das ist doch exakt der bug von dem er im ersten post gesagt hat, dass er ihn schon gefixt hat
Komische Situation, ich habe sowohl den FaceCharacter-Bug als auch den SetActiveInventory-Bug nach Anleitung aus dem AT behoben, wie ich es immer gemacht habe. Doch diesmal tritt folgender Fehler weiterhin auf :( :
aber möglicherweise ist es ja dieser bug hier:
http://www.maniac-mansion-mania.de/forum/index.php?topic=1000.msg19322#msg19322 (http://www.maniac-mansion-mania.de/forum/index.php?topic=1000.msg19322#msg19322)
-
Ich wollte es gerade einfügen, aber die folgende Zeile akzeptiert AGS net:
if ( player.Room != GetCharacterAt (mouse.x, mouse.y).Room )
Das fehlende Semikolon habe ich ergänzt, danach ging es aber trotzdem net speichern.
-
sowas in der art ist mir bei AGS3.1SP1 auch schon mal untergekommen
da hat AGS einfach ein vollkommen gültiges skript als fehlerhaft angesehen
hab da dann code gelöscht und neu geschrieben (aber 1:1 so wie es vorher da stand) bis es irgendwann wieder ging
-
Dann versuch ich es nochmal, danke.
-
Hab alles versucht, der beschwert sich nach wie vor...
(http://dl.dropbox.com/u/1883128/error.PNG)
-
jep, genau denn selben fehler hatte ich auch
ich wollte zwei integer eigenschaften vergleichen und AGS hat gestreikt
aber nach ein paar mal ändern, speichern, ... hat AGS aufgegeben ;)
-
AGS ist hartnäckig... :P Und da gabs keinen Geheimtipp zur Lösung?
Edit: Ich muss wohl aufgeben... der Bug lässt sich net beheben. :-\
-
hast du das schon probiert? -> http://www.adventure-treff.de/forum/viewtopic.php?p=185068#p185068
-
Wie das Eingangsposting verrät, habe ich den Thread hier nur geöffnet, weil eben dieser Skript dieses Mal offenbar keine Wirkung zeigt...
-
bzgl. speichern-bug:
hast du schon probiert die zeile die ihm nicht passt zu entfernen, speichern, fenster schliessen, evtl. sogar ags schliessen, alles neu aufmachen und den code neu reintippen?
-
Ja, hab ich alles versucht... Leider sind es mindestens drei Zeilen, die ihm net passen. Wenn ich eine ausklammere, beschwert er sich über die nächste. Der Greif meinte, es müsste statt GetCharacterAt "Character.GetAtScreenXY" heißen, aber das ändert auch nichts, außer dass dann ne andere Meldung kommt (structure required on left of '.').
-
das semikolon ist da am Ende der if-anweisung auf jeden Fall fehl am Platz, damit beendest du die if-Anweisung und mehrere Fehlermeldungen sind die Folge.
Semikolon am Ende von 3097 also einmal auf jeden Fall weg.
dann versuch mal den Teil rauslöschen
if (type == 2 || type == 6)
{
if ( player.Room != GetCharacterAt (mouse.x, mouse.y).Room )
{
player.Say("Character nicht im selben Raum %d %d\n", GetCharacterAt (mouse.x, mouse.y).Room, GetCharacterAt (mouse.x, mouse.y).ID);
}
else
{
FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
}
und schau ob ohne diesen Abschnitt alles ordnungsgemäss kompiliert wird,
damit du dir sicher sein kannst, dass das Problem auch von diesem Bereich herrührt und nicht von wo anders kommt.
edit: wenn ich mir das so anschaue, dann bezweifle ich dass dieser code je funktioniert haben könnte.
GetCharacterAt (mouse.x, mouse.y) .Room <- das ist mir neu
um es mit bernards worten auszudrücken - "Das klappt so nicht."
-
Das hab ich schon versucht. Wenn ich den ganzen Part rauslösche, dann speichert es.
Dass das Semikolon an der Stelle falsch ist, hab ich inzwischen gepeilt, aber es ging so und so net speichern.
GetCharacterAt (mouse.x, mouse.y) .Room <- das ist mir neu
Der Skript ist ja auch neu, der stammt von rulaman (vielleicht würdest du besser durchblicken, wenn du den Thread ganz durchliest ;) ). Und er lässt sich eben zumindest bei mir net abspeichern.
Edit: Bòógiemans Theorie vom Speicherfehler kann auch net ganz stimmen. Ich hab versucht den Skript bei einer alten Episode einzufügen und die Meldungen bleiben gleich. Bin mal im Bett, vielleicht findet morgen oder so ja noch jemand nen Fehler in besagtem Skript...
-
edit: ich blick schon durch keine Angst, ;) aber es hat wohl vor mir noch keiner das Konstrukt von Rulaman an sich in Frage gestellt und da hakts meiner Meinung nach, weil so einen Befehl
GetCharacterAt (mouse.x, mouse.y).Room
gibts in AGS nicht, führt deswegen zu deiner Fehlermeldung und kann nicht kompiliert werden.
versuchs mal damit.
if (type == 2 || type == 6)
{
Character *whichchar = Character.GetAtScreenXY(mouse.x,mouse.y);
if ( player.Room != whichchar.Room)
player.Say("Character nicht im selben Raum \n");
else
FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
-
GetCharacterAt gibt es sehr wohl!
GetAtScreenXY (character)
(Formerly known as global function GetCharacterAt, which is now obsolete)
dieser liefert einen Character* zurück, somit geht GetCharacterAt(...).Room auch
probiere mal, die werte die du im if vergleichen willst als variable zwischenzuspeichern
int iRoom1 = player.Room;
int iRoom2 = Character.GetAtScreenXY(mouse.x,mouse.y).Room;
if ( iRoom1 != iRoom2)
...
-
Natürlich gibts GetCharacterAT auch, aber AGS lässt diese Syntax mit .Room am Schluss nicht gelten.
Vielleicht würde es so funktionieren Character[GetCharacterAT(mouse.x,mouse.y)].room
keine Ahnung,
könnte ich mir eher vorstellen, müsste man probieren.
-
das kann jetzt nicht funktionieren
GetCharacterAt liefert den Character zurück (also wenn es zB auf Dave verweisst, bekommt man da das selbe wie wenn man cDave verwendet)
dein code geht aber davon aus, dass GetCharacterAt einen index zurück liefert, mit dem man in der Character-liste zugreifen kann
es sei denn, die AGS-hilfe ist falsch, dann nehme ich alles zurück ;)
-
ich dachte es ist umgekehrt, nämlich das GetCharacterAt ein int zurückliefert,
aber room eine Memberfunktion von Character ist und deswegen einen Character erwartet und mit einem int nichts anfangen kann.
müsste man austesten, das hier scheint aber zu funktionieren (zumindest gibts keinen Error):
if (type == 2 || type == 6)
{
Character *whichchar = Character.GetAtScreenXY(mouse.x,mouse.y);
if ( player.Room != whichchar.Room)
player.Say("Character nicht im selben Raum \n");
else
FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
-
Kann es denn sein, dass rulamans Skript nur unter AGS 3 funktioniert? Dann kanns bei mir nämlich net klappen (und ich weiß net, bei welcher Version Rocco ist...). Danke für das Skript, Rocco, ich werde es nachher ausprobieren. :)
-
Glaub ich nicht, weil GetCharacterAt eigentlich schon in AGS 272 veraltet war und durch GetAtScreenXY (character) ersetzt wurde.
Das du und die meisten anderen hier noch mit AGS 272 arbeiten ist allgemein bekannt. ;)
@Bòógieman:
In der Hilfe steht nichts davon was GetCharacterAt zurückgibt, sondern nur das GetAtScreenXY einen Character zurückgibt.
GetAtScreenXY (character)
(Formerly known as global function GetCharacterAt, which is now obsolete)
static Character* Character.GetAtScreenXY(int x, int y)
-
gut, du hast recht
ich hab mich von der hilfe in die irre leiten lassen
dachte echt, dass wenn eine funktion die andere ersetzt, dass zumindest der rückgabetyp gleich bleibt, aber naja
im skript selbst sieht man den rückgabetyp int, also index :-[
-
Sorry für die übereilte Antwort. Aber Roccos Lösung sollte funktionieren.
Bin die letzten Tage nicht zum Lesen oder testen gekommen.
Wie schon gesagt es war ungetestet. Da hätte ich sorgfältiger sein sollen.
-
Kein Problem, rulaman, kommt vor. ;) Roccos Skript funktioniert. :)