Ok, das ist jetzt schon eine Weile her, dass ich nach diesem Skriptproblem gefragt habe, und damals sah es ja so aus, als sei das Problem behoben worden. Jetzt muss ich aber zugeben, dass ich die betroffene Waffe seitdem gar nicht benutzt hatte, weil sie mir immer viel zu schwer zum tragen war. Mittlerweile verfügt mein Charakter jedoch über genügend Stärke, um die Elite-Bolzenschleuder nutzen zu können. Dabei bemerkte ich, dass ich in der Modversion, die ich im Augenblick verwendet hatte, den besagten Fehler noch gar nicht behoben hatte, da die Fehlermeldung wieder auftrat. Keine Ahnung warum das so war, jedenfalls hat das dazu geführt, dass ich mich noch einmal mit dem Skript befasst habe, und da ich mittlerweile ein wenig Ahnung von Skripten habe (auf jeden Fall mehr als gar keine, wie als ich zuerst hier nachgefragt hatte), konnte ich feststellen, dass dieses Skript in der Form überhaupt nicht funktionieren kann, wie es soll.
Die eine Hälfte des Skripts funktioniert nach der oben beschriebenen Vorgehensweise tadellos und zwar dieser Teil:
Code:
if ( getsoundplaying, "crossbowShoot" == 0 )
set shootsound to 0
else
if ( shootsound == 0 )
set shootsound to 1
PlaySound3D, "AR_BoltBang"
Player->AddItem "AR_RifleLight" 1
endif
endif
if ( getsoundplaying, "crossbowPull" == 0 )
set pullsound to 0
else
if ( pullsound == 0 )
set pullsound to ( player->getitemcount AR_RifleLight ) ; prevent problems with left on items or player removed items
while ( pullsound > 0 )
player->removeitem AR_RifleLight 1
set pullsound to ( pullsound - 1 )
endwhile
set pullsound to 1
PlaySound3D, "AR_BoltLoad"
endif
endif
Dieser Abschnitt des Skripts kommt direkt aus dem Skript der schwächeren Bolzenschleuder und sorgt lediglich dafür, dass ein Schuss- und Nachladesound abgespielt werden. Da das vorliegende Skript jedoch aufgrund des oben erwähnten Fehlers gar nicht laufen konnte, fehlten diese Effekte bei der Elite-Bolzenschleuder.
Die Lösung, die Variable "RifleOut", die das Skript verlangt, aber nicht findet, einfach neu zu erstellen, sorgte dafür, dass der Fehler verschwand und dieser Teil des Skripts funktionierte.
Allerdings soll dieses Skript eigentlich noch eine ganz andere Funktion erfüllen, für die diese Variable überhaupt erst abgefragt wird. Beim Durchsehen des Skripts stellte ich fest, dass dieses Skript offenbar unter bestimmten Bedinungen ein Fähigkeit aktivieren soll, die dem Spieler Infravision und einen besseren Angriffswert gibt. Diese Bedingungen sollten offenbar sein, dass die Bolzenschleuder gezogen ist und der Spieler schleicht, das sollte dann eine Art Sniper-Modus sein. Allerdings ist das Skript, wie es in der Mod enthalten ist, gar nicht in der Lage, diese Funktion zu erfüllen. Es war zwar etwas knifflig, da ich mir die nötigen Befehle zum Teil erst zusammensuchen musste, aber ich habe die vorgesehene Funktionalität des Skripts wiederhergestellt, beziehungsweise überhaupt erst hergestellt, da das Skript auch in der letzten Englischen Version in dieser fehlerhaften Form enthalten ist.
In dieser Form erfüllt das Skript seinen Zweck:
Code:
Begin AR_BoltSScript
short OnPCEquip
short shootsound
short pullsound
if ( Menumode == 1 )
return
endif
if ( getsoundplaying, "crossbowShoot" == 0 )
set shootsound to 0
else
if ( shootsound == 0 )
set shootsound to 1
PlaySound3D, "AR_BoltBang"
Player->AddItem "AR_RifleLight" 1
endif
endif
if ( getsoundplaying, "crossbowPull" == 0 )
set pullsound to 0
else
if ( pullsound == 0 )
set pullsound to ( player->getitemcount AR_RifleLight ) ; prevent problems with left on items or player removed items
while ( pullsound > 0 )
player->removeitem AR_RifleLight 1
set pullsound to ( pullsound - 1 )
endwhile
set pullsound to 1
PlaySound3D, "AR_BoltLoad"
endif
endif
if (OnPCEquip == 1 )
if ( player->GetWeaponDrawn == 1 )
if ( Player->GetPCSneaking == 1 )
Player->AddSpell "AR_SniperSpell"
else
Player->RemoveSpell "AR_SniperSpell"
endif
else
Player->RemoveSpell "AR_SniperSpell"
endif
else
Player->RemoveSpell "AR_SniperSpell"
endif
End AR_BoltSScript
Falls es jemanden interessiert: In der ursprünglichen Version wurde gar nicht abgefragt, ob die Waffe gezogen ist und der Spieler schleicht. Die nicht vorhandene Variable, die den Fehler verursacht hat, ist vollkommen unnötig und sollte scheinbar irgendwie abfragen, ob die Waffe gezogen ist, was aber über "GetWeaponDrawn == 1" erledigt werden kann (muss?). Das Seltsame daran ist, dass das Originalskript korrekt abfragt, ob die Waffe NICHT gezogen ist, in diesem Fall passiert wie vorgesehen gar nichts. Der Befehl zur Schleichabfrage ist dazu noch der falsche: "GetSneak" fragt nicht ab, ob der Spieler schleicht oder nicht, sondern die Höhe der Schleich-Fertigkeit! In der ursprünglichen Form würde also, selbst wenn die Abfrage der gezogenen Waffe korrigiert wäre, die Sniper-Fähigkeit nur dann aktiviert werden, wenn der Spieler einen Schleich-Skill von 1 hat - was im eigentlichen Spiel gar nicht möglich ist, da alle Fähigkeiten mindestens mit 5 beginnen. Natürlich wäre der Sinn des Skripts dadurch immer noch nicht gegeben. Der richtige Befehl lautet "GetPCSneaking", dann funktioniert das auch.
Ich habe dann die einzelnen Abfragen noch zu einer einzelnen if-Schleife (?) zusammengefügt, keine Ahnung ob das so in irgendeiner Form besser ist, aber ich finde es übersichtlicher und das Skript ist dadurch kürzer.
Vielleicht nutzt ja jemand noch diese Mod und möchte den Fehler gern beheben. Ansonsten bin wenigstens ich froh, dass ich es hingekriegt hab und dieser Post darf gerne ignoriert werden.
Falls jemandem doch noch ein Fehler auffällt, darf er das auch gerne sagen, aber es scheint alles zu funktionieren, wie es soll.
Also dann, ich geh mal ein paar Klippenläufer jagen!