Construction Set Skriptthread zum Construction Set

Ich bin leider gerade nicht an meinem Home-PC, weswegen ich noch kein Script schreiben kann, aber bevor du dir die Finger blutig tipst möchte ich darauf hinweisen, dass man das mit OBSE in 20 Zeilen lösen kann. Das klappt dann sogar mit Zutaten aus Mods.
 
So schaut's aus:

Code:
scn AufDenContainerREF

ref iter
ref container
short button
short counter
short uniquecounter

begin onActivate
	MessageBox "Wollt ihr alle euere Zutaten in die Truhe legen?" "Ja" "Nein"
end

Begin GameMode
	Set button to getbuttonpressed
	if button == -1
		return
	elseif button == 1
		activate player
		return
	endif

	let uniquecounter := 0
	let counter := 0
	if GetActionRef == player
		let container := getSelf
		foreach iter <- player
			if iter.IsIngredient
				let counter += iter.GetRefCount
				let uniquecounter += 1
				iter.RemoveMeIR container
			endif
		loop
	endif
	Message "Es wurden %g (%g) Zutaten in die Truhe gelegt." uniquecounter counter
	Activate player

End

Du wirst gefragt, ob du deine Zutaten reinlegen willst. Wenn du bestätigst wird am Ende auch noch eine Nachricht ausgegeben mit der Anzahl an Zutaten, die reingelegt wurden. Es wurden 2 (7) Zutaten in die Truhe gelegt.. Der erste Wert ist die Anzahl einzigartiger Zutaten, der zweite Wert die Summe. Angenommen es wurden 5 Äpfel und 2 Brote hineingelegt, dann steht dort 2 (7), weil es 2 unterschiedliche Zutaten waren und in der Summe 7.
 
Vielleicht solltest du, Gildur, noch eine QuestItem_Abfrage einbauen.
Manche Zutaten (bspw. Einhornhorn) sollten so besser nicht entfernt werden.
Wollt ich nur mal sagen. ;)
 
Vielleicht solltest du, Gildur, noch eine QuestItem_Abfrage einbauen.
Manche Zutaten (bspw. Einhornhorn) sollten so besser nicht entfernt werden.
Wollt ich nur mal sagen. ;)

Dann bau du sie dir doch noch ein, wenn du sie als nötig erachtest, zur Not holt man sich das Item wieder, sofern der Sortierer die Items nicht in ein Schwarzes Loch wirft. ;)


Da hast du es sogar:
Code:
if iter.IsIngredient && !iter.IsQuestItem

MfG Master of Worlds
 
  • Like
Reaktionen: robinH
Das ist ja ganz toll, doch kann mir mal jemand den Sinn erklären.
Sobald eine Truhe angeklickt wird, lassen sich doch schon immer die Zutaten in eine Truhe legen.

Ich nahm an, es sollte ein Sortierer gebaut werden. Dazu benötigt man doch mehrere Truhen mit einer Zutatenzuweisung. Also eine Truhe die alle Äpfel sammelt, eine die alle Möhren sammelt usw. Und das halt automatisch. So das eine Sortierung stattfindet.

Schöner wäre es, wenn der Player selbst bestimmen könnte, in welche Schublade (Truhe) er die jeweiligen Zutaten haben möchte. So könnte man beliebige Sachen sortieren.
ZB. könnte der Player die Truhe anklicken und dann wird gefragt, welche Itemgruppe da hinein soll.

Immer wenn der Player dann dort mit gefülltem Inventar ankommt und die Truhen anklickt, wird das Inventar automatisch den Gruppen zugeordnet geleert.

Wie allerdings verhindert wird, das Sachen aus dem Inventar gehen, die man garnicht raushaben möchte, ist mir jedoch weiterhin schleierhaft.
Eventuell könnte ja eine Begrenzung mit aufgenommen werden. Also komplett oder halt bis auf 3 Items bitte alles entnehmen.

Eine Frage zum Verständnis
..........
Message "Es wurden %g (%g) Zutaten in die Truhe gelegt." uniquecounter counter
...................
Ich weiss bisher nur, das man das %f für Werte nutzt und das %n für Objektnamen doch wofür steht das %g ?
 
Zuletzt bearbeitet:
Eine Frage zum Verständnis

Ich weiss bisher nur, das man das %f für Werte nutzt und das %n für Objektnamen doch wofür steht das %g ?
%g gibt Integers, also ganze Zahlen aus, während du bei %f auch Dezimalstellen anzeigen lassen kannst, also z.B. %.2f für ein Ergebniss mit zwei nachkommastellen. Somit ist %g m.E. identisch mit %.0f
 
  • Like
Reaktionen: robinH
So sieht das Script nun aus. Der Start erfolgt über das Event ONHit über eine Quest.

Script bisher
PHP:
Begin Function {Rtarget Rweapon}

if Rtarget.isBlocking ==0
return
endif
;===========Player blockt und benutzt Schild==========TEst 400HP==
if player.GetEquippedObject 13
        
  set SWeaponType to getWeaponType Rweapon
  set RSchild to player.GetEquippedObject 13
  set fSchildHealth to player.getEquippedCurrentHealth 13
  set fGewichtdamage to GetWeight Rweapon *0.1
  set fPHealthRestore to Rtarget.getAV Health

    ;-----Hiebwaffenabfrage-----1H,2H--------------------    
    if SWeaponType ==2 || SWeaponType ==3
    
        set fSchaden     to (fGewichtdamage + 10)*-1
        set fSchaden2H     to (fGewichtdamage + 20)*-1
        
        if SweaponType ==2
        Rtarget.ModEquippedCurrentHealth fSchaden 13
        endif    
        set fPlayerHealth to Rtarget.getAV Health
    ;...

    endif

;==============EDIT=======NEU im Script==========
  Beispiel A
  set Rtarget.AV Health fPHealthRestore    ;Jeder Treffer erhöht leider die Hp um den vorherigen Wert

endif
.......

Da das mit der Methode die Health des Players zu speichern so nicht klappt, wie Ihr ja bereits sagtet, muss das wohl mit einem weiteren Header gemacht werden. Doch wie?

Wie komme ich denn da nun weiter? Jemand eine Idee, wie ich da überhaupt anfange.

Ziel sollte sein, das wenn der Player blockt, dieser wie in Oblivion leider üblich keine Lebenspunkte verliert, sondern diese immer auf den Wert, den er vor dem Blocken hatte zurückgesetzt werden. Schliesslich soll das Schild ja einen Schutz bieten.

Und wie lässt sich anstatt das der Player immer beim Blocken LP verliert, ein Ausdauerabzug steuern. Das fände ich viel Logischer.

Schliesslich ist so ein Schild recht schwer. Man kann schon fast sagen je stabiler umso schwerer. Somit müsste mit Hilfe der Stärke des Players und der Abhängigkeit vom Gewicht des Schildes, entsprechend ein Ausdauerabzug vorgenommen werden. Irgendwie ist das mit der Ausdauer sowieso blöd gelösst. Heiltränke braucht man fast ständig. Ausdauertränke sogut wie nie. Eventuell lässt sich das ja mit Eurer Hilfe über die dann doch bald fertige Mod endlich mal ändern. Das wäre doch mal was. Dann könnten wir auch Schilde nutzen, welche einen Sinn ergeben.
 
Zuletzt bearbeitet:
Ich habe gerade herausbekommen, dass man Gildurs Skript, das übrigens hervorragend funktioniert, mit einer geringfügigen Veränderung auch für andere Gegenstände verwendbar machen kann. Wenn man z. B. in Zeile 27 das Ingredient gegen Ammo austauscht, dann werden alle Pfeile in die Truhe gepackt. Man sollte vorher nur noch den Text in der MessageBox anpassen.

Find ich einfach genial. Ich probiere jetzt alle anderen Möglichkeiten auch aus. Potions, Seelensteine, Bücher, Schriftrollen.......usw..............:)
 
Kann man da "IsGem" nehmen?

Wenn, dann steht dieser Befehl nicht in der Doku fürs OBSE, die obrigen Befehle sind alle aus der Doku. Denke daher nicht, zumindest fällt mir nicht direkt etwas ein.
Man könnte eine Funktion schreiben, mit der du die normalen Juwelen abdeckst, aber dann eben nicht noch jene die über Mods kommen.

MfG Master of Worlds
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Arielle 1000
So sieht mein Script immer noch aus. Der Start erfolgt über das Event ONHit über eine Quest.

Script bisher
PHP:
Begin Function {Rtarget Rweapon}

if Rtarget.isBlocking ==0
return
endif
;===========Player blockt und benutzt Schild==========TEst 400HP==
if player.GetEquippedObject 13
        
  set SWeaponType to getWeaponType Rweapon
  set RSchild to player.GetEquippedObject 13
  set fSchildHealth to player.getEquippedCurrentHealth 13
  set fGewichtdamage to GetWeight Rweapon *0.1
  set fPHealthRestore to Rtarget.getAV Health

    ;-----Hiebwaffenabfrage-----1H,2H--------------------    
    if SWeaponType ==2 || SWeaponType ==3
    
        set fSchaden     to (fGewichtdamage + 10)*-1
        set fSchaden2H     to (fGewichtdamage + 20)*-1
        
        if SweaponType ==2
        Rtarget.ModEquippedCurrentHealth fSchaden 13
        endif    
        set fPlayerHealth to Rtarget.getAV Health
    ;...

    endif

;==============EDIT=======NEU im Script==========
  Beispiel A
  set Rtarget.AV Health fPHealthRestore    ;Jeder Treffer erhöht leider die Hp um den vorherigen Wert

endif
.......

Da das mit der Methode die Health des Players zu speichern so nicht klappt, wie Ihr ja bereits sagtet, muss das wohl mit einem weiteren Header gemacht werden. Doch wie?

Wie komme ich denn da nun weiter? Jemand eine Idee, wie ich da überhaupt anfange.

Ziel sollte sein, das wenn der Player blockt, dieser wie in Oblivion leider üblich keine Lebenspunkte verliert, sondern diese immer auf den Wert, den er vor dem Blocken hatte zurückgesetzt werden. Schliesslich soll das Schild ja einen Schutz bieten.

Und wie lässt sich anstatt das der Player immer beim Blocken LP verliert, ein Ausdauerabzug steuern? Das fände ich viel Logischer. Schliesslich ist so ein Schild recht schwer. Man kann schon fast sagen je stabiler umso schwerer. Somit müsste mit Hilfe der Stärke des Players unter Abhängigkeit des Gewichtes eines Schildes der Ausdauerabzug vorgenommen werden.
Irgendwie ist das mit der Ausdauer von den Machern sowieso seltsam gelöst. Heiltränke braucht man ständig. Ausdauertränke sogut wie nie.

Eventuell lässt sich das ja mit Eurer Hilfe über die dann doch bald fertige Mod endlich mal ändern. Das wäre doch mal was. Dann könnten wir auch Schilde nutzen, die einen Sinn ergeben.

Wer weiss Rat?
 
Zuletzt bearbeitet:
Ich glaube Diarrhoe hat schon ein paar Posts vorher erwähnt, dass du einen anderen EventHandler brauchst. Und zwar den:

Code:
[URL="http://obse.silverlock.org/obse_command_doc.html#Events"]OnHealthDamage[/URL] damage:float attacker:ref

Dort erhälst du genau den Schaden, den der Spieler nimmt und kannst diesen wieder zurück addieren, sofern der Spieler blockt. Die Ausdauer würde ich aber in dem anderen EventHandler runtersetzen. Für deine Zwecke brauchst du folgende Befehle:

Code:
player.[URL="http://cs.elderscrolls.com/index.php/GetActorValue"]getAV[/URL] [URL="http://cs.elderscrolls.com/index.php/Stats_List"]ActorValue[/URL]
player.[URL="http://cs.elderscrolls.com/index.php/ModActorValue"]modAV[/URL] [URL="http://cs.elderscrolls.com/index.php/Stats_List"]ActorValue[/URL] amount:float
player.[URL="http://cs.elderscrolls.com/index.php/SetActorValue"]setAV[/URL] [URL="http://cs.elderscrolls.com/index.php/Stats_List"]ActorValue[/URL] amount:float
item.[URL="http://obse.silverlock.org/obse_command_doc.html#GetWeight"]getWeight[/URL]
 
Zuletzt bearbeitet:
  • Like
Reaktionen: robinH
Super dank dir wiedermal. Ja das mit dem Eventhandler hatte Diarrhoe schon einmal erwähnt, doch auch damals wusste ich nicht wie ich das dann umsetzten soll. Ich verstehe einfach nicht wie man die Funktionen schreibt.
Und setzt man alle Handler gemeinsam in eine Quest oder benötigt man jeweils eine Neue?

Laut OBSE steht da ja:
OnHealthDamage damage:float attacker:ref

wie müsste die Funktion dazu lauten?

Ich versuchs mal.
PHP:
SetEventHandler "OnHealthDamage" ScriptSpielerWirdgetroffen ref::playerRef

Script
PHP:
scn ScriptSpielerWirdGetroffen

float damage
ref Angreifer

Begin Function {damage Angreifer}

....

Ist das so richtig?
Woher weiss der Eventhandler, wer der Angreifer ist? Fragt das Event denn nicht nur ab, ob der Player getroffen wird?

So wurde es doch beim Blockevent auch gemacht. Irgendwie weiss ich nicht was ich da tue.

Laut Wiki übersetzt mit Goggle kommt da diese Erklärung
Code:
Ausgeführt auf den Schauspieler Schaden zu nehmen
(dh GetSelf das beschädigte Schauspieler zurück),
wenn Schaden genommen. "Angreifer" kann Null beispielsweise
sein bei der Einnahme von Schäden fallen. Der Handler wird aufgerufen,
kurz bevor der Schaden angewendet wird, so kann es durch
Befehle wie ModActorValue aufgehoben werden.
Verwenden Sie das Objekt Filter, um die beschädigten Schauspieler,
mit dem Ihr Ereignishandler sollte angebracht werden,
wenn auf den Schauspieler Schaden zu nehmen
(dh GetSelf das beschädigte Schauspieler zurück),
wenn Schaden genommen any.Invoked angeben. "Angreifer"
kann Null beispielsweise sein bei der Einnahme von Schäden fallen.
Der Handler wird aufgerufen, kurz bevor der Schaden angewendet wird,
so kann es durch Befehle wie ModActorValue aufgehoben werden.
Verwenden Sie das Objekt Filter, um die beschädigten
Schauspieler, mit dem Ihr Event-Handler angebracht werden
sollte, wenn überhaupt angeben.

Nur ich verstehe da leider rein garnix. Wenn man Englisch kaum kann, ist man echt aufgeschmissen
 
Zuletzt bearbeitet: