PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Begleiter Dialog - Inventar



Wulfy301
15.11.2013, 19:57
Ich hab mir überlegt, das man das Topic „Lass uns tauschen“ unterteilen könnte in ->

- Lager öffnen (so wie gehabt)

- Alles tauschen (Begleiter Inventar komplett ins Spieler Inventar verschieben)


Ist das Script technisch machbar und wenn ja, wie?:gruebel

Hab diese Scriptzeile gefunden -> RemoveAllItems Player 0 1
mit ihr müsste das komplette Inventar des containers ins Spieler Inventar verschoben werden, glaube ich. Nur wie schaut der Rest aus?

Au, verflucht, das ist ja schon die Lösung!:eek:
Muss nur noch die Topic so ändern wie oben beschrieben, fertig!

Mist, Begleiter verliert auch seine Waffe und die Muni!

Nachtrag:

Boïndil hat mir inzwischen ein paar Möglichkeiten gezeigt, wie man das Problem lösen kann.

Momentan sind wir hier angekommen, falls ein Begleiter nur eine Waffe und eine Munitionsart im Inventar hat würde es so aussehen ->


RemoveItem EyeBot1HP 1
RemoveItem AmmoSmallEnergyCellRobot 1
RemoveAllItems Player 0 1
AddItem AmmoSmallEnergyCellRobot 1
AddItem EyeBot1HP 1

Boïndil zeigt mir hier, wie ich das Problem lösen kann, wenn mein EyeBot im Spiel über ein Terminal ein Waffen Upgrade bekommt, genauer gesagt wie man die aktuelle Waffe abfragt.


Z.B. hat mein wlwQuestScript oder wlwQuestSpawnScript viele Variablen, die von anderen Scripten in Actors oder Triggern ausgelesen wird.
Wenn du von einem anderen Script aus die Variablen einer Quest aufrufen möchtest, geht das z.B. so:
scn ActorScript
Begin GameMode
If wlwQuest.SurvivorMode == 2
RemoveItem wlwQuestSurvivorModeList 1
EndIf
End
Und bei dir wäre das dann ungefähr so:
If LazarusQuest.WeaponLevel == 1

Muss es jetzt bei drei möglichen Waffen so aussehen?:gruebel


scn ActorScript
Begin GameMode
If aaaLazarusDialogue.WeaponLevel == 0
RemoveItem EyeBot1HP 1
RemoveItem AmmoSmallEnergyCellRobot 1
RemoveAllItems Player 0 1
AddItem AmmoSmallEnergyCellRobot 1
AddItem EyeBot1HP 1
EndIf
If aaaLazarusDialogue.WeaponLevel == 1
RemoveItem EyeBot2HPGreen 1
RemoveItem AmmoSmallEnergyCellRobot 1
RemoveAllItems Player 0 1
AddItem AmmoSmallEnergyCellRobot 1
AddItem EyeBot2HPGreen 1
EndIf
If aaaLazarusDialogue.WeaponLevel == 2
RemoveItem EDEZapGun 1
RemoveItem AmmoSmallEnergyCellRobot 1
RemoveAllItems Player 0 1
AddItem AmmoSmallEnergyCellRobot 1
AddItem EDEZapGun 1
EndIf
End

Das mit den Waffen und der Muni funktioniert, nur wird jetzt das Begleiter Inventar nicht mehr ins Spieler Inv. verschoben.

Boïndil
18.11.2013, 21:04
Der Code sieht eigentlich gut aus.
Sind die Waffen und die Mun upnlayable? Macht man z.B. bei Sentrybots so, damit man ihre Waffen und Raketen nicht im Inventar sieht. Eiegntlich sollte man sogar darauf verzichten können, ihm zuerst die Bewaffnung abzunehmen.

Du kannst übrigens schon neue Beiträge für neue Fragen machen, sonst sieht man ja nicht, dass was neues im Thread hinzugekommen ist :)

Wulfy301
18.11.2013, 21:09
Waffen und Mun sind unplayable. Nö, die Waffen müssen entfernt werden, weil die sonst der Spieler kriegt!
Bei doppel Post kriegt man schimpfe!:gnah

Hast du ne Lösung warum das Inventar vom Begleiter nicht mehr zum Spieler wechselt?
Muss ich da eine andere Script Form verwenden, mit "aaaLazarus.RemoveAllItems Player 0 1" z.B. gibt's eine Fehlermeldung.

18614 18615

Boïndil
19.11.2013, 05:25
Kommt sich auf de Kontext an, was ein Doppelpost ist. Ich habe dir mehr als ein Mal nicht auf neue Fragen geantwortet, weil ich nicht wusste, dass du solche gestellt hattest, man sieht ja Änderungen an Beiträgen nicht von aussen.

Result-Scripte dürfen keine Begin/End-Blöcke drin haben und nach meinem Wissen auch keine lokale Variablen-Deklaration wie "short X". Result-Scripte können schon einige Zeilen Code enthalten, aber wenn es mehr als 20 sind, sollte man sich überlegen, ob man eine Funktion in ein Quest- oder Actor-Script auslagert, wo man komfortabler arbeiten kann.

Einige Result-Blöcke nehmen an, dass es dabei um einen bestimmten Actor geht, z.B. in Packages, wo man direkt "AddItem X" notieren kann, dasselbe für ein Script, das direkt auf einem Actor läuft. Im Zweifelsfall sollte man aber immer über eine Referenz gehen, z.B. "LazarusRef.AddItem". "Lazarus.AddItem" geht überhaupt nie, da es theoretisch zig Lazarusse im Spiel haben kann.

Damit man einen Unique-Actor per Script von aussen aufrufen kann, muss man ihn zuerst ins Render-Fenster ziehen. Dann muss man ihm eine eindeutige ID geben, wie etwa LazarusRef und die Checkbox "Persistant reference" anwählen. Solche Actors nennen sich oft in der Art LazarusRef oder CrazyWolfgangRef, da das eine Art Konvention war, aber es geht hauptsächlich darum, dass so eine ID eindeutig sein muss. Eine Referenz ist eine Instanz eines Basis-Object(Lazarus), du kannst mehrere Lazarusse(LazarzusRef3) durchnummeriert im Spiel haben. Und du kannst auf jeden aus einem anderen Script daarauf zugreifen oder sogar im immer selben Lazarus-Script rausfinden, welche Instanz es ist: If GetIsReference LazarusRef3.

LazarusRef hast du ja schon. In der elegantesten Form würde das Script im Dialog so aussehen:

If aaaLazarusDialogue.WeaponLevel == 0
LazarusRef.RemoveItem EyeBot1HP 1
LazarusRef.RemoveItem AmmoSmallEnergyCellRobot 1
LazarusRef.RemoveAllItems Player 0 1
LazarusRef.AddItem AmmoSmallEnergyCellRobot 1
LazarusRef.AddItem EyeBot1HP 1
ElseIf aaaLazarusDialogue.WeaponLevel == 1
LazarusRef.RemoveItem EyeBot2HPGreen 1
LazarusRef.RemoveItem AmmoSmallEnergyCellRobot 1
LazarusRef.RemoveAllItems Player 0 1
LazarusRef.AddItem AmmoSmallEnergyCellRobot 1
LazarusRef.AddItem EyeBot2HPGreen 1
ElseIf aaaLazarusDialogue.WeaponLevel == 2
LazarusRef.RemoveItem EDEZapGun 1
LazarusRef.RemoveItem AmmoSmallEnergyCellRobot 1
LazarusRef.RemoveAllItems Player 0 1
LazarusRef.AddItem AmmoSmallEnergyCellRobot 1
LazarusRef.AddItem EDEZapGun 1
EndIf
LazarusRef kann immer nur ein Level haben, und wenn man das mit den ElseIf macht, wählt das Spiel immer nur den ersten zutreffenden Block und bricht dann die Auswertung ab. Bei einem Dialog ist das vielleicht nicht so wichtig, aber wenn man ein sehr langes Script mit komplexen Bedingungen hat, kann man die Performance schonen.
Ist ja eigentlich seltsam. Zumindest wenn man "Player.RemoveAllItems" macht, bleiben alle Quest-Items im Inventar. Hätte gedacht, dass bei LazarusRef.RemoveAllItems Player" die Unplayable-Items nicht im Inventar des Player auftauchen.

Wulfy301
19.11.2013, 16:14
Wann schläfst du eigentlich?

Spitzen Arbeit, funktioniert Tip Top!:right
Hab das mit den Quest-Items extra nochmal ausprobiert, wird mit getauscht.

Muss mich nur wundern das so was nicht schon früher ausgetüftelt wurde, spart doch jede Menge rumgeklicke??(

Boïndil
19.11.2013, 16:29
Ich beschäftige mich nicht häufig mit dem Inventar der Begleiter, aber manche mag das sicher nützen, eine gute Idee.