Construction Set Skriptthread zum Construction Set

Kanns nicht einfach sein, dass du ziemlich viel im Inventar hast und es deswegen einfach lange dauert? Wenn man zum Beispiel diese Kisten in der Testinghall öffnet, in denn alle Waffen oder so sind, dauert das auch einige Zeit, in der nichts passiert.
 
Warum funktioniert dieses Script nicht??? :(

Code:
scn assassindagger

ref Self

Begin ScriptEffectStart

	set Self to GetSelf

 	If ( Self.GetDetected Player == 0 ) && ( Self.IsEssential == 0 )
  		Self.Kill
	EndIf

End

Es funktioniert einfach nicht. Der NPC wird einfach nicht getötet.
Wenn ich das " == 0 " bei GetDetected weg lasse, dann kann ich jeden NPC töten, egal ob er mich sieht oder nicht.

Was ist falsch?


Und noch eine Frage: Kann man mithilfe von OBSE, Waffen die das Wort "Dagger" in der ID enthalten, eine Enchantment zuordnen? Wenn ja, wie? Ich weiss das es sowas ähnliches gibt, denn Skycaptain benutzt das in seiner Mod "Deadly Reflex".
 
So wie ich das sehe, sollte der NPC immer sterben, wenn er den Player nicht(wegen Selg.GetDetected Player == 0) bemerkt hat.
Du solltest also zumindest 1 anstatt 0 schreiben. Sonst stirbt er, wenn er den Player nicht sieht und das kann verdammt blöd sein.
 
Ja, ist richtig. Wenn er den Spieler nicht bemerkt, soll der Spieler den NPC mit einem Schlag töten können. Wenn er ihn bemerkt, dann nicht. Wenn ich es auf 1 stelle, dann kann ich jeden NPC töten, egal ob er mich sieht oder nicht.
 
Zuletzt bearbeitet:
Hauptfertigkeiten - Fortschrittsbalken auslesen

Ist es irgendwie möglich, den momentanen Wert von einem Balken einer Hauptfertigkeit auszulesen?
Den momentanen Level der Fertigkeit kann man ja über Player.GetAV Luck auslesen.
Mir geht es aber, wie gesagt, um den Fortschrittsbalken.
Auslesen und setzen wären nicht schlecht.
Wäre gut, wenn mir jemand die Codes sagen könnte.
 
jups möglich ist das über den befehl
getplayerskilluse (siehe hier)
zumindest wenn ich die beschreibung nicht falsch verstanden haben...oder dich xD

mfg takbir^^

edit: aso fast vergessen zu sagen. diese funktion benötigt OBSE^^
 
  • Like
Reaktionen: 1 Person
so ich hab ein kleines problem mit einem script an dem ich gerade bastle.
ich will mir ein PI bauen dass die Trainingseinheiten dynamisch ans Spielerlevel anpasst.
Das PI beinhaltet eine neue Quest, zwei Globals und ein Questscript

Code:
scn tbtraininglessons

float fQuestDelayTime
float x
float tbskill
float tbsetting
long lessons
long level
long levelcheck
float training
short tbgamestart
short choice


begin GameMode

set tbgamestart to getgamerestarted
set level to player.getlevel
set lessons to getpcmiscstat 3


if (getstage tbtraining < 10)

set fQuestDelayTime to 0.001
set choice to -1
messagebox "Bitte wählen sie aus durch welchen Faktor der Spielerlevel geteilt werden soll!(für genauere Details bitte die Readme lesen !!!)" " Faktor 1 (1275/5050)" "Faktor 2 (637/2025)" "Faktor 3 (425/1683)" "Faktor 4 (318/1262)" "Faktor 5 (255/1010)" "Faktor 10 (127/505)" "Faktor 20 (63/252)"
set choice to getbuttonpressed
if choice == 0
set tbtrainingsetting to 1
elseif choice == 1
set tbtrainingsetting to 2
elseif choice == 2
set tbtrainingsetting to 3
elseif choice == 3
set tbtrainingsetting to 4
elseif choice == 4
set tbtrainingsetting to 5
elseif choice == 5
set tbtrainingsetting to 10
elseif choice == 6
set tbtrainingsetting to 20
endif
setstage tbtraining 10
endif

set tbsetting to tbtrainingsetting
set fQuestDelayTime to 30

if (getstage tbtraining == 10)
set x to level + 1
set x to x/2
set x to x*level
set x to x/tbsetting
set x to x - lessons
set training to x
setnumericgamesetting iTrainingSkills training
messagebox "Das Plugin wurde erfolgreich installiert"
set levelcheck to level
set tbtrainingskill to training
setstage tbtraining 20
set tbgamestart to 0
endif

set tbskill to tbtrainingskill

if (getstage tbtraining == 20)
if level != levelcheck
set x to level + 1
set x to x/2
set x to x*level
set x to x - lessons
set training to x
setnumericgamesetting iTrainingSkills training
messagebox "Ihre Trainingssettings wurden nach einem Level-Up angeglichen!"
set levelcheck to level
set tbtrainingskill to training
set tbgamestart to 0
endif

if tbgamestart == 1 && level == levelcheck
setnumericgamesetting iTrainingSkills tbskill
messagebox "Ihre Trainingssettings wurden nach einem Spielrestart erfolgreich wieder hergestellt!"
set tbgamestart to 0
endif
endif

end

das script an sich läuft und funktioniert abgesehen vom ersten block auch einwandfrei. ich wollte das PI halt so einrichten, dass am anfang eine messagebox kommt über die der spieler sich entscheiden kann in welchem verhältnis die Trainingseinheiten zum Spielerlevel stehen. Damit man das evtl später wieder ändern kann habe ich dem Quest halt 3 Stages gegeben (0,10,20). Das Problem jedoch ist, dass der messagebox block probleme macht. So wie er jetzt aufgebaut ist - also setstage quest 10 nach den if-abfragen für die messagebox - geht er sofort über zur 2ten Stage ohne die messagebox aufzurufen. Daraufhin habe ich versucht setstage in die if-abfragen der message box zu packen..

Code:
if choice == 0
set tbtrainingsetting to 1
setstage tbtraining 10

dann erscheint zwar die messagebox, dafür aber wird die queststage nicht hochgesetzt.
Weiß einer wieso da nix passiert? (ich hab jetzt nicht überprüft ob die Global für den Faktor auch nicht gesetzt wurde)

Das zweite, eher geringere Problem ist, dass ich trotz allow repeated Stages den quest in der console per setstage auf eine frühere Stage zurücksetzen kann. Ich wollte das ganz gerne einbauen, damit der spieler sich evtl auch nach längerem spielen umentscheiden kann ohne das PI deaktivieren und reaktivieren zu müssen.

hoffe irgendjemand weiß antworten darauf =)

mfg takbir
 
Krüge und zerspringen, das ist so eine Sache, es geht ja leider Havok wegen nicht "normal" und unkompliziert. Jedoch geht es doch mit einem Trigger, welcher, wenn der Gegenstand den Boden berührt ein "Decal", also eine zerbrochene Mesh übriglässt. Vielleicht fällt das Objekt noch in einer Staubwolke auf den Boden und der Zauber ist perfekt! Geht das? Wenn ja, was für ein Skript brauche ich, um eine Mesh zu replacen, wenn sie den Boden erreicht? Kann ich den Trigger an die Mesh binden, damit der Trigger sich mitbewegt? Lässt sich das auf alle Gegenstände einer Art übertragen?
 
Kann mir jemand bitte kurz den Befehl für das Abspielen von Animationen geben?
Ich möchte, dass ein Tier unter bestimmten Umständen(Variablen!!) eine bestimmte Animation ausführt. Geht das überhaupt?

Bisher fand ich: PlayGroup. Kombiniert mit meiner Kreatur: PlayGroup MeinSchaf.Idle

Allerdings kommt nun die Fehlermeldung, dass eine Reference hier nicht möglich ist.
Da das Skritp über den Spieler läuft, ist das blöd. Natürlich könnte ich es über Globals oder QuestVariablen machen, dass währe aber etwas umständlicher als ein einfacher Befehl.
 
so ich hab mein script jetzt mittlerweile ein bisschen umgebastelt...
das mit den queststages geht nicht, da man diese irgendwie nicht zurücksetzen kann.
das neue script sieht jetzt so aus:

Code:
scn tbsettraining

float fQuestDelayTime
float x
float tbskill
float tbsetting
long lessons
long level
long tblevel
float training
short tbgamestart
short choosing
short choice

begin GameMode

set tbgamestart to getgamerestarted
set level to player.getlevel
set lessons to getpcmiscstat 3

if tbstage == 0

set choosing to -1
set fQuestDelayTime to 0.001

if choosing == -1
messagebox "Bitte wählen sie aus durch welchen Faktor der Spielerlevel geteilt werden soll!(für genauere Details bitte die Readme lesen !!!)" " Faktor 1 (1275/5050)" "Faktor 2 (637/2025)" "Faktor 3 (425/1683)" "Faktor 4 (318/1262)" "Faktor 5 (255/1010)" "Faktor 10 (127/505)" "Faktor 20 (63/252)"
set choosing to 1
set choice to getbuttonpressed
elseif choosing == 1
set choice to getbuttonpressed
if choice == 0
set tbsetting to 1
elseif choice == 1
set tbsetting to 2
elseif choice == 2
set tbsetting to 3
elseif choice == 3
set tbsetting to 4
elseif choice == 4
set tbsetting to 5
elseif choice == 5
set tbsetting to 10
elseif choice == 6
set tbsetting to 20
endif
set tbtrainingsetting to tbsetting
endif

set tbstage to 1

endif

if tbstage == 1

set fQuestDelayTime to 0.001

set x to level + 1
set x to x/2
set x to x*level
set x to x/tbsetting
set x to x - lessons
set training to x
setnumericgamesetting iTrainingSkills training
messagebox "Das Plugin wurde erfolgreich installiert"
set tbtrainingskill to training
set tblevelcheck to level
set tbstage to 2
set tbgamestart to 0

endif

if tbstage ==  2

set tbsetting to tbtrainingsetting
set tbskill to tbtrainingskill
set tblevel to tblevelcheck
set fQuestDelayTime to 30

if tbgamestart == 1 && level == tblevel

setnumericgamesetting iTrainingSkills tbskill
messagebox "Ihre Trainingssettings wurden nach einem Spielrestart erfolgreich wieder hergestellt!"
set tbgamestart to 0

endif

if level != tblevel

set x to level + 1
set x to x/2
set x to x*level
set x to x - lessons
set training to x
setnumericgamesetting iTrainingSkills training
messagebox "Ihre Trainingssettings wurden nach einem Level-Up angeglichen!"
set tblevelcheck to level
set tbtrainingskill to training
set tbgamestart to 0

endif

endif

end

problem ist, die messagebox erscheint aber danach tut sich nichts mehr. einzig tbstage wird auf 1 gesetzt aber weiter passiert nix...auch durch setzen von tbstage auf einen anderen wert bringt nix (auf 0 sollte ja zb die messagebox noch einmal erscheinen aber tut sie nicht)

Code:
set choice to getbuttonpressed
if choice == 0
set tbsetting to 1
elseif choice == 1
set tbsetting to 2
elseif choice == 2
set tbsetting to 3
elseif choice == 3
set tbsetting to 4
elseif choice == 4
set tbsetting to 5
elseif choice == 5
set tbsetting to 10
elseif choice == 6
set tbsetting to 20
endif
set tbtrainingsetting to tbsetting
scheint gar nix zu bewirken... die von mir erstellte global ändert ihren wert nicht obwohl sie dies ja eigtl tun sollte :huh:

irgendwie hatte ich schon immer probleme mit diesen messageboxes aber ich weiß einfach nicht was falsch ist oO
hoffe irgendjemand sieht den fehler, den ich nicht finde

mfg takbir
 
float fQuestDelayTime
float x
float tbskill
float tbsetting
long lessons
long level
long tblevel
float training
short tbgamestart
short choosing
short choice

bezogen auf das problem mit der global, welche sich nicht ändert...
lösch das fettgedruckte da mal raus
 
mhh sry ich hätte wahrscheinlich dazuschreiben sollen, wie die globals heißen:
tbtrainingsetting: speichert den Faktor (bzw soll)
tbtrainingskill: speichert die aktuelle anzahl an trainingseinheiten, da gamesettings ja nicht im savegame gespeichert werden.
tblevelcheck: überbleibsel aus eine vorherigen version wo ich mit zwei scripten gearbeitet habe...kann ich eigtl wieder rausnehmen
tbstage: speicher die "stage", in der sich das script befindet. ist dafür gedacht, dass man man zb den Faktor auch später noch ändern kann ohne das PI deaktivieren und reaktivieren müssen (also per consolenbefehl "set tbstage to 0")

di global die durch die messagebox geändert werden soll ist tbtrainingsetting.
die float tbsetting ist dafür da, damit man nicht jedesmal bei neustart des spiels nue festlegen muss. deswegen habe ich das in der global gespeichert (bzw will, dass es in der global gespeichert wird)^^
aber auch wenn ich set tbsetting to x in die if-abfrage der messagebox packe, bleibt der wert unverändert :huh:

ich hatte so ein ähnliches problem schonmal mit messageboxes und deswegen vermute ich, dass ich irgendwas grundlegenes falsch mache bei den messageboxes (irgendwas vergessn oder so).

falls es sonst noch irgendwelche verständnis-/funktionsfragen zum PI gibt werde ich die natürlich beantworten^^
 
Zuletzt bearbeitet:
Ist es irgendwie möglich, den momentanen Wert von einem Balken einer Hauptfertigkeit auszulesen?
Den momentanen Level der Fertigkeit kann man ja über Player.GetAV Luck auslesen.
Mir geht es aber, wie gesagt, um den Fortschrittsbalken.
Auslesen und setzen wären nicht schlecht.
Wäre gut, wenn mir jemand die Codes sagen könnte.

Hallo,

tabkir liegt mit "GetPlayerSkillUse" fürs erste mal gut.

Damit hat man aber erst mal nur eine Experience-Punktezahl, mit der man leider alleine noch nichts anfangen kann.

Da das ganze mit enorm viel Rechnerei zu tun hat hab ich gedacht Scriptschreiben ist Schneller als ein langwierige Erklärung die sowieso falsch interpretiert wird.
Der Übersichtlichkeit halber hab ich das Script ein bischen aufgeschlüsselt

Scriptname BalkenArmorer

float Exp
float Mult
float BonusMult

short IsMajSkill
short IsSpecSkill

float ExpNextLvl
float f
float BalkenProzent

begin GameMode
set Exp to GetGameSetting fSkillUseExp
set Mult to GetGameSetting fSkilluseFactor
set IsMajSkill to player.IsClassSkill Armorer
set IsSpecSkill to (player.GetClassSpecialization == 0) ; 0 = Combat / 1 = Magic / 2 = Stealth

if IsMajSkill
set BonusMult to GetGameSetting FSkillUseMajorMult
else
set BonusMult to GetGameSetting FSkillUseMinorMult
endif

if IsSpecSkill
set BonusMult to BonusMult * GetGameSetting FSkillUseSpecMult
endif

set f to player.GetBaseAV Armorer * Mult
set f to pow f Exp
set ExpNextLvl to f * BonusMult

set BalkenProzent to (GetPlayerSkillUse Armorer / ExpNextLvl) * 100

end

Das ganze könnte man noch wie folgt abkürzen:
- Vanilla-Konstanten direkt programmieren (wenn mit original Level-System gespielt wird)
- Die Berechnungen mit "f" können auf eine einzelne Zeile zusammengefaßt werden
- Anstatt der Hilfsvariablen können die GameSetting-Abfragen direkt in die Rechenformeln integriert werden.

Fragen zu Skriptdetails beantwortet das Wiki umfassend.

Da sieht mans mal wieder : GANZ EINFACH 8)

Es grüßt die Yolanda


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
EDIT : Es geht noch einfacher ...... Habe das Skript durch ein neues ersetzt, welches kürzer und leichter Verständlich sein soll
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Zuletzt bearbeitet:
  • Like
Reaktionen: 1 Person
Erst mal Danke, für die Hilfe bei beiden Problemen.
Aber eine frage hätte ich noch: FUnktioniert das Skript von Yolanda ohne OBSE? Ich kenn mich muit OBSE-Befehlen net so aus. Außerdem ist das Skritp für ein Projekt gedacht, dass kein OBSE nutzen soll.
Deshalb frage ich.
 
OBSE ist unbedingt von Nöten für solch geartete Dinge.

OBSE läuft Gott sei Dank sehr stabil.
Deshalb gibts eigentlich keinen Grund es nicht einzusetzen.

Gruß von der Yolanda
 
mhh also alleine getplayerskilluse ist eine obse funktion.
von daher wird zumindest schonmal für yolanda's lösung OBSE benötigt.
soweit ich das erkennen kann gibt es auch keine alternative funktion die ohne OBSE auskommt... zumindest steht sowas normalerweise bei der CS-Wiki in der "See Also" Rubrik.

ups zu langsam xD
hier sind alle funktionen aufgelistet...aber ich bezweifle stark, dass es noch eine andere gibt
 
  • Like
Reaktionen: 1 Person