Construction Set Skriptthread zum Construction Set

Gewicht < 5 = 0 extra damage
Gewicht < 8 = 1 extra damage
Gewicht < 11 = 2 extra damage
Kann das jemand erklären. Wo befindet sich die > oder das < ist das das negative und positive Vorzeichen. Wo ist die 8 und wo die 11?
Wofür steht das geteilt? Warum verstehe ich das bloss nicht. Wie Kreuz und Quer muss man denn da denken?
Okay.... Gildur ist hier definitiv der OBSE Experte, aber ich versuch mal mein Glück...

Du brauchst kein > oder <, da Oblivion die Nachkommastellen abschneidet, sofern Getweight als short oder long definiert ist, wovon ich jetzt mal ausgehe.

Eine Waffe mit Gewicht 7 hätte also als Zusatzschaden: 7-5 = 2. Geteilt durch 3 gibt im Spielt 0 aus. +1 wird dazugerechnet, und Du hast einen Extraschaden von +1.
Gewicht von 8 bringt 8-5=3, geteilt durch drei ergibt 1. +1 = 2 extra Schadenspunkte.
Nur bei ganz, ganz leichten Waffen ergibt Division -3 ein Ergebnis von -1, was durch das +1 zu einem Extraschaden von exakt 0 führt.
Ob sich also das Gewicht deiner Waffe zwischen 8 und 11 bewegt spielt keine Rolle, da durch das Abschneiden der Nachkommastellen jeweils der selbe Wert in die Berechnung einfließt. Damit entfällt die kleiner-gleich oder gößer-gleich Abfrage.

Der > < Vergleich versteckt sich in der Formel in Form von "wenn das Gewicht abzüglich 5 durch drei glatt teilbar ist, dann..."Ist zwar ziemlich um die Ecke gedacht, aber funktioniert mathematisch trotzdem. Denk Dir mal jeweils das -5 oder das /3 weg und spiel es dann geadnklich durch. Vielleicht wird's dann verständlicher.


Wie hoch wäre hier denn der Extraschaden bei einem Gewicht von 20?

20-5 = 15
15/3 = 5
5+1 = 6

Denke ich mal? Passt auf jeden Fall zu Deiner 5, 8, 11... Abfolge die sich mit 14, 17, 20 fortsetzen sollte.

Und wie würde das zB aussehen bei
Gewicht < 5 = 0 extra damage
Gewicht < 8 = 1 extra damage
Gewicht < 11 = 3 extra damage
Als Laie würde ich sagen dafür brauchst Du dann doch eine If Abfrage nach dem Gewicht der Waffe die noch extra was drauf haut. Allerdings bin ich auch grade nicht wach genug um mir Gedanken drüber zu machen, ob sich nicht auf das "nackte" +1 irgendwie ins Verhältniss zum Waffengewicht setzen lässt. Sorry. :(
 
Zuletzt bearbeitet:
  • Like
Reaktionen: robinH
Sorry. Accidental double post. Please ignore. Bin wirklich Wochenendreif scheint mir, wenn ich nicht mal die Option zum löschen dieses blöden Posts finde. *grummel*

Ach wenn ich den Doppelpost schon habe, hier ein Nachtrag:

Wenn Du die Berechnung des Extraschadens ansteigen lassen willst je 10 Gewichtseinheiten der Waffe könntest Du vielleicht ein

(GetWeight weapon / 10)

als zusätzlichen Additor in die Berechnung einfließen lassen. Damit sollte sich m.E. der Schaden jeweils um 1 zusätzlich erhöhen bei Gewicht 10, 20, etc.. da 10-19 geteilt durch 10 durch Abschnitt der Nachkommastellen 1 ergibt, 20-29 eine 2, usw.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: robinH
Oh mein Gott, ist das euer Ernst so kompliziert kreuz und Quer muss man da denken. Das kann ich nicht.
Das ist ja kein Wunder das ich am WE so gut wie nichts verstanden habe.

Das einzige was super klappte war "let x +=1" entspricht "set x to x+1"

Ich bin da mehr am Raten als das ich weiss, was ich da tue. Deshalb mal ein paar Beisspiele ob ich richtig geraten habe.

"let V := x * y / z"
entspricht vieleicht "set V to x* y" und "set V to V /z"

"let Q := ( (W -5 ) /3 ) +1
entspricht vieleicht "set Q to W-5" und "set Q to Q/3" und "set Q to Q +1"

Nur bin ich nicht sicher was das ":=" bedeutet. Ich habe das halt da eingesetzt , da das in euren Beispielen auch so vorkam.

Desweiteren verstehe ich immer noch nicht, wann man das let nutzen muss ( Ich meine nicht nur zur Vereinfachung, sondern in welchem Fall man mit set nicht weiterkommt).
Gerne würde ich mal sehen, wie das nachfolgende komplett funktinierende Script mit let hätte ausgesehen. Ich kapier es nicht. Würde ich da jetzt das let benutzen, wäre das doch die selbe Zeilenanzahl, oder?

PHP:
scn A0ItemBlockingPlayer

ref Rtarget
ref Rweapon
ref RSchild

short SWeaponType

float fSchaden
float fSchaden2H
float fSchildHealth
float fGewicht
float fGewichtdamage

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Begin Function {Rtarget Rweapon}

if Rtarget.isBlocking ==0
  return
endif

	
;===========Player blockt und bennutzt Schild================================
	
if player.GetEquippedObject 13					

  set SWeaponType to getWeaponType Rweapon
  set RSchild to player.GetEquippedObject 13
  set fSchildHealth to player.getEquippedCurrentHealth 13
  set fGewicht to GetWeight Rweapon
  set fGewichtdamage to GetWeight Rweapon *0.1
				
			
	;-----Hiebwaffenabfrage-----1H,2H--------------------	
	if SWeaponType ==2 || SWeaponType ==3
	
		set fSchaden 	to (fGewichtdamage + 10)*-1
		set fSchaden2H   to (fGewichtdamage + 20)*-1
			
		;1H	
		if SweaponType ==2
		  Rtarget.ModEquippedCurrentHealth fSchaden 13
		endif
		;2H
		if SweaponType ==3
		  Rtarget.ModEquippedCurrentHealth fSchaden2H 13		
		endif
		
	;--------------Bladeabfrage----1H,2H----------------	
	elseif SWeaponType ==0 || SWeaponType ==1

		set fSchaden 	to (fGewichtdamage + 1)*-1
		set fSchaden2H   to (fGewichtdamage + 2)*-1		
				
		;1H	
		if SweaponType ==0
		  Rtarget.ModEquippedCurrentHealth fSchaden 13
		endif
		;2H
		if SweaponType ==1
		  Rtarget.ModEquippedCurrentHealth fSchaden2H 13
		endif
		
	;--------------Bogenabfrage-------------------------	
	elseif SWeaponType ==5
		
		set fSchaden 	to 0.8*-1
	
		if SweaponType ==5
		  Rtarget.ModEquippedCurrentHealth fSchaden 13
		endif		
					
	endif

	;============Schild unbrauchbar===========================

	if fSchildHealth <=0

		playsound CWoodLarge
		player.unequipitemNS RSchild
		player.removeitemNS RSchild 1		
		player.additemNS A0LegenAnders001Brokenschild 1 	
		player.drop      A0LegenAnders001Brokenschild 1
	
	Print"Schild mit 0HP entfernt, BrokenSchild dropped"
	endif

  Print"------------------------------------------------------------------"		
  PrintToConsole "Target (%n), Object (%n) wird getroffen mit (%n), %.0fKg"Rtarget, Rschild, Rweapon, fGewicht
  PrintToConsole "Waffentyp=%.0f, Schadensbonus=%.0f (Stich1H=0, 2H=1, Hieb1H=2, 2H=3, Bogen=5)"SweaponType, fGewichtdamage
  printToConsole "SchildHP=%.0f, Sfaktor=%.0f, Sfaktor2H=%.0f"fSchildHealth, fschaden, fSchaden2H	
		
endif
	
end
Die abfrage ob <10 oder > habe ich ganz rausgenommen. So ist es genauso schlüssig. Je schwerer eine Waffe umso mehr Schadensbonus macht diese. Ich bin soweit damit zufrieden. Der robin hat seine erste OBSE-Funktion dank Euch endlich hinbekommen.

Nur dachte ich mir wenn das jetzt schon sogut funktioniert, dass man auch noch die Tatsache, das der Player bei einem Schildtreffer Gesundheit verliert, raus nimmt. Denn das ist ja auch sowas von dumm. Wozu hat man schliesslich das Schild.

Wie lässt sich denn am besten Abfragen wie viel Gesundheit der Player vor dem Schildtreffer hat?
Ideal wäre es, wenn diese dann einfach wieder auf den Ursprungwert gesetzt wird. (Somit erleidet der Player durch einen Schildtreffer keinen Schaden)

Ginge das eventuell so, oder gibt es einen Syntaxfehler in meinem Gedankengang?
PHP:
float fPlayerHealth

Am Anfang also bei einem Schildtreffer

set fPlayerHealth to getHealth Rtarget


und am Ende der If-Schleife also nach der Konsolenausgabe

set Rtarget.health to fPlayerHealth
endif
end

Edit, ja den gibts. Vöööliger Murks, was ich da zunächst geschrieben habe. Der CSE gibt nur Fehler raus.
 
Zuletzt bearbeitet:
Und wieder mal eine laienhafte Antwort von mir, basierend im Wesentlichen auf einem flüchtigen Studium der OBSE Command Documentation:

Du brauchst "let", weil "set" i.d.R. nur Standard Befehle / Funktionen akzeptiert. Es geht zwar ab OBSE v0020 wohl die Möglichkeit auch den Standard Skripten OBSE Funktionalität beizubringen, aber ich tippe mal es hat sich einfach so eingebürgert "let" zu benutzen als das noch nicht möglich war, selbst wenn es heute in manchen Fällen auch anders ginge.

:= ist eine "Assign" Funktion, d.h. alles was rechts davon steht wird ausgewertet, und dann der Variablen zugeordnet die links davon steht. In so fern wäre
"let V := x * y / z" das selbe wie
"set V to (x * y / z)"

Was das "Assign" interessant macht ist, daß du mehrere Werte damit verbinden kannst und die Reihe von rechts nach links durchgearbeitet wird. Z.B:
a := b := c := 0
setzt alle drei Variablen a, b, und c auf 0 mit nur einer Code Zeile. In Deinem Script wohl kaum von Belang, aber interessant find ich's trotzdem.

Und was das kreuz und quer denken angeht... Du warst es glaub ich der eine Progression in 3er Stufen haben wollte die mit einem nicht durch 3 glatt teilbaren Wert beginnt. Das haste nu davon. ;)
 
  • Like
Reaktionen: robinH
Ja hast ja recht, habe das mit der Abhängikeit vom Gewicht nun auch anders gelöst. Die set Syntax ist irgendwie logischer und leichter nach zuvollziehen, Gerade bei einer Fehlersuche ist das sehr hilfreich. Bin ich froh, das das ab OBSE 20 mit set funktioniert. Das mit dem Let bekomme ich nicht hin.

Leider bekomme ich das mit der Healthabfrage auch nicht komplett hin.

Die current Health wird gespeichert, jedoch lässt sie sich nach dem Treffer nicht auf diesen Wert setzen. Stattdessen werden die gespeicherten HP zu den bisherigen hinzu addiert.

Was mache ich da falsch?

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 player.getCurrentHealth		;Hp wird laut Console gespeichert	


				
	;-----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	
	;...
	endif



  Rtarget.ModAV Health fPHealthRestore	;Jeder Treffer erhöht Hp um den gespeicherten Wert


endif
Habe auch ForceAV ausprobiert. Dann sinkt HP bei jedem Treffer um den gespeicherten Wert.
 
Zuletzt bearbeitet:
1. "player.getCurrentHealth" ist Unsinn, da der Befehl nur auf Gegenstände wirkt. Für den Spieler nimmt man gewöhnlich "player.getAV health".

2. Um den erlittenen Schaden abzufragen, könntest du vielleicht einen weiteren Event-Handler benutzen: "OnHealthDamage". Laut Beschreibung, wird das kurz vor dem Schlag ausgeführt. Dir sollte dann eigentlich eine Kombination aus den beiden Handlern helfen. Im ersten, wird der Schaden am Spieler bestimmt und im zweiten der Rest erledigt.

Ich hab auf der OBSE-Doc auch gerade den Handler "OnActorDrop" entdeckt, damit könnte man die Referenz eines gedroppten Items abfragen, aber das hat sich ja schon geklärt...
 
  • Like
Reaktionen: robinH
Ok danke dir, Kein Wunder, das das nichts wurde. InGame habe ich nie was von einer Healthanpassung bemerkt. War schon völlig am verzweifeln. Fragt sich nur was da mit der Syntax CurrentHelath für ein HP gespeichert wird. Der Player hat 184HP und gespeichert wurde 57HP. Irgendwie Blödsinn

Im Grunde müsste es doch ausreichen nun einfach bei einem Schildtreffer

Rtargret.getAV Health
zu benutzen

und vor dem Endif

Rtarget.set AV Health "Fneu"
zu schreiben. Oder?


Das mit dem Weiteren Event verstehe ich nicht. Startet man das über das in meinem Falle dem Schildtreffer Event.
Oder wie lässt sich das steuern? Schliesslich soll die HP nur angepasst werden, Wenn ein Schildtreffer für den Abzug sorgt.

Dachte schon daran jedes Schild das man in die Hand nimmt, sofort mit 100 Armor Punkten auszustatten. Das müsste ja die selbe Wirkung haben. Oder?

Doch wie lassen sich die Armorpunkte steuern?
 
Zuletzt bearbeitet:
Versuch statt "player.getCurrentHealth" eventuell mal "playerREF.getCurrentHealth".

So wie ich die CS Wiki verstehe geräte der Script Compiler manchmal durcheinander wenn es um den Player Eintrag geht. In der Regel interpretiert der Compiler wohl Player als Verweis auf den aktuellen Stand des Players, aber wohl nicht in 100% aller Fälle. Könnte sein, das Dein Script hier auf das Base Object verweist, statt auf den aktuellen Stand des Player Characters. Vielleicht passen die 57HP ja zum "jungfäulichen Basisstand" des Charakters?
 
  • Like
Reaktionen: robinH
Nee, das klappt auch net. Aber du hast recht die 57HP sind die ersten die der Player als Level 0 hatte. Mit der von Diarrhoe geannten Möglichkeit wird jedoch die HP richtig erkannt.

PHP:
float fPlayer
float fPlayerRestore
.....
set fPlayerRestore to RTarget.getAV Health
funktioniert perfekt.

Das was nicht klappt, ist die korrekte Abfrage. So wie es aussieht, wird sobald die Funktion Onhit startet, die Aktuelle HP korrekt zwischengespeichert.

Nach der Schadenberechnung für das Schild habe ich folgendes geschrieben
PHP:
set fPlayer to RtargetAV Health

Jedoch wird dann am Ende des Scripts durch die Abfrage, ob
PHP:
if Fplayer < ist als die FPlayerRestore
Rtarget.setAV Health FPlayerRestore
Print "Health ist kleiner"
endif
nicht die Restore gesetzt. Statt dessen wird die reduzierte Health zwischengespeichert
usw.
Sehr seltsam das Ganze. Irgendwo liegt da ein Gedankenfehler. Ich nehme mal an, dass die Ausgabe, das die FPlayer kleiner ist, sich auf die FplayerRestore bezieht. Diese jedoch ebenfalls nach dem Treffer den kleineren Wert bekommen hat. Das Zwischenspeichern erfolgt wohl an der falschen Stelle.

Lasse ich die < Abfrage weg, so wird nach jedem Treffer die reduzierte Hp um die gespeicherte HP erhöht. Also bei 184HP zu Beginn werden dann aus 111 nach der Schlagsberechnung 295HP.
Aus 295Hp wurden danach aus 270HP = 565HP usw. So ging es nach jedem Schildtreffer weiter

Eventuell liegt es aber auch an der Funktion die anders arbeitet, als ich bisher annahm. Ich dachte bisher, immer wenn das Schild getroffen wird, also bei OnHit startet die Funktion jedesmal von neuem. Doch dann müsste das doch funktionieren.

Hier ein Bild mit der Consolenausgabe.


Laut Bild ist auch zu sehen, das der Schaden den die Hiebwaffe verursacht erst beim nachfolgendem Treffer berechnet wird. Eventuell klappt es ja deshalb nicht mit den HP.

Was mir ebenfalls auffiel ist, dass der Player nur die HP verliert wenn er durch den Treffer ins Recoil gerät. Normalerweise wäre es doch logischer, wenn die Ausdauer runter gehen würde und nicht die HP des Players. Schon wieder etwas, was mit eingebunden werden müsste.

Also hilft erstmal wohl nur Alternative 2
Wie lassen sich den die Armorpunkte von Anfang an mit diesem Script auf einen höheren Wert setzten?
 
Zuletzt bearbeitet:
Der Prosatext hilft nicht wirklich viel beim Beurteilen des Skripts. Wie sieht denn jetzt der Skriptkomplex aus und wie sind die einzelnen Skripte eingebunden?

Du solltest auch beachten, dass "OnHit" nach der Schadensberechnung ausgeführt wird. Das heißt, "player.getAV health" speichert die HP nach dem Treffer ab, ohne Information darüber, wie viele der Spieler vorher hatte. Deswegen mein Vorschlag mit dem "OnHealthDamage", der wird vor der Schadenskalkulation ausgeführt und so kannst du den Treffer wieder rückgängig machen.
 
  • Like
Reaktionen: robinH
....................

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 Hp um den gespeicherten Wert

  Beispiel B
  if fPlayerHealth < fPHealthRestore
  set Rtarget.Av Health fPHealthRestore
  Print "HP kleiner"
  endif
  ;Es passiert nichts, denn die HP für den Player werden auf die reduzierten gesetzt, Nur durch die Textausgabe, da die HP kleiner sind, weiss ich das das hier überhaupt abgearbeitet wird.



endif
.......

So sieht das Script nun aus. Der Start erfolgt über das Event ONHit über eine Quest.

Du wirst recht haben, jedenfalls erklärt das warum das nicht geht wie gedacht.
Es gibt einfach keinen HP Wert vor dem Treffer.

Wie steuere ich das denn über den anderen Header. Lege ich das mit in die Erste Quest?
Und wie setzte ich denn dann die Neue Funktion. Wird da ein neues Script gebraucht.
 
Zuletzt bearbeitet:
Hallo Leute,

ich möchte mir gerne einen Ingredients-Sortierer basteln. Nun habe ich hier mal die SuFu benutzt und herausgefunden, wie so ein Skript für ein Ingredient aussehen sollte.

PHP:
scn Scriptname

short numitems

Begin OnActivate

if player.getitemcount Apple > 0
    	set numitems to player.getitemcount Apple
    	player.removeitem Apple numitems
    	Testreferenz.additem Apple numitems

endif
End

Dieses Skript käme ja auf den Container, wo meine Ingredients gesammelt werden sollen.
Was mir im Moment noch nicht ganz klar ist: muss ich für jedes einzelne Ingredient diesen On-Activate-Block schreiben?
Das könnte nämlich u. U. ein ziemlich langes Skript werden, wenn dem so sein sollte. :shock:
Gibt es auch eine kürzere und komfortablere Möglichkeit?
 
Was mich zu der Frage veranlasst ob es irgendeine Möglichkeit gibt bestehende Scripts zu copy-pasten? Ich kann zwar im Script Window des CS Text markieren, nur kopieren kann ich ihn scheinbar nicht auf dem üblichen Weg (Strg + c) Scripts für Zutatensorter gibt's ja schon reichlich in allen möglichen Mods. Wär doch schön wenn man sowas einfach 1:1 übernehmen könnte.
 
Hallo Leute,

ich möchte mir gerne einen Ingredients-Sortierer basteln. Nun habe ich hier mal die SuFu benutzt und herausgefunden, wie so ein Skript für ein Ingredient aussehen sollte.

PHP:
scn Scriptname

short numitems

Begin OnActivate

if player.getitemcount Apple > 0
    	set numitems to player.getitemcount Apple
    	player.removeitem Apple numitems
    	Testreferenz.additem Apple numitems

endif
End

Dieses Skript käme ja auf den Container, wo meine Ingredients gesammelt werden sollen.
...........


Sehr interessante Idee. Ich wusste garnicht, dass soetwas geht. Wie rufst du denn dann den Container im PlayerInventar auf, um an die Früchte zu gelangen?
 
Wieso im Player-Inventar? Ich hatte eigentlich vor, einen Container ins Renderfenster zu ziehen, ihn also in irgend einer Innenzelle zu platzieren. Das kann ein Schrank sein, eine Kiste, ein Fass ...... oder was anderes eben. Diesem werde ich eine Referenz zuweisen, welche sich im Skript wiederfindet. Anschließend wird das Skript auf den Container gelegt, und das war's. Ausprobiert habe ich es aber noch nicht, da ich immer noch am Skript schreibe....:D
 
Ich glaube Robin's Frage bezieht sich eher darauf wie der Spieler seine Zutaten wieder aus der Kiste nehmen kann. Wenn das Script beim Aktivieren des Behälters automatisch Zutaten vom Inventar in den Behälter verlagert, wie aktiviert man dann den Behälter um ihm etwas zu entnehmen, ohne das einem etwas aus dem Inventar "stibizt" wird?
 
Achso, jetzt verstehe ich es.

Das ist durchaus eine berechtigte Frage. Ich habe selber keinen blassen Schimmer und hoffe, dass unsere Skript-Profis uns belehren werden.
Denn wie es aussieht, würde dieses Skript bei jeder Aktivierung des Containers unser Inventar entleeren, wenn es was zu entleeren gibt. Das würde bedeuten, dass wir erst bei entleertem Inventar Einblick in den Container erhalten.
Aber eigentlich sollte das Skript so aussehen, dass wir erst gefragt werden wollen, ob wir unsere Ingredienzien abgeben wollen oder nicht. Richtig?