Construction Set Skriptthread zum Construction Set

Das Problem ist, dass ich in der Konsole einfach gar nichts sehe, keine Ausgabe. Anscheinend wird das Skript bei der Zeile set currHealth to (pInvObj.GetCurrentHealth) sofort beendet. Aber ich sehe keine Fehlermeldung, kein Absturz nichts. Kommentiere ich die Zeile aus, und mache ich nur eine Ausgabe bei PrintToConsole geht es.

lass dir doch mal testweise für jede codezeile eine meldung ausgeben, dann müsstest du eigentlich sehen, wo es hakt. also in etwa so:

Code:
	set invPos to pCont.GetNumItems
	 [COLOR="DarkRed"]PrintToConsole "invPos = %.0f" invPos[/COLOR]
Label 1
	if invPos
	 [COLOR="DarkRed"]PrintToConsole "invPos Bedingung OK"[/COLOR]
		set invPos to (invPos - 1)
		 [COLOR="DarkRed"]PrintToConsole "invPos = %.0f" invPos[/COLOR]
		set pInvObj to (pCont.GetInventoryObject invPos)
		 [COLOR="DarkRed"]PrintToConsole "pInvObj = %.0f" pInvObj[/COLOR]
usw.

edit: das hat zwar wohl nichts mit deinem problem zu tun, aber ich weiß nicht, ob es ratsam ist, den if-endif-block immer wieder vorzeitig mit goto zu verlassen. evtl. kann es da irgendwann zu problemen kommen, wenn zu viele if-bedingungen noch "offen" sind, und nicht mehr beendet werden...

edit2: was in dem codeschnipsel leider nicht zu sehen ist: hast du denn am anfang die variablen pInvObj als ref und currHealth als float definiert? so wie in dem beispiel hier?
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Klehron
edit2: was in dem codeschnipsel leider nicht zu sehen ist: hast du denn am anfang die variablen pInvObj als ref und currHealth als float definiert? so wie in dem beispiel hier?

Habe ich natürlich. Ich werde mal Deinen Tipp ausprobieren. Aber ich denke es liegt an der Funktion GetCurrentHealth. Ich habe mir heute mal das Visual Studio gezogen und möchte mal die Funktion im OBSE debuggen. :D Geht das überhaubt bzw. hat das jemand schon mal gemacht?
 
Habe ich natürlich. Ich werde mal Deinen Tipp ausprobieren. Aber ich denke es liegt an der Funktion GetCurrentHealth. Ich habe mir heute mal das Visual Studio gezogen und möchte mal die Funktion im OBSE debuggen. :D Geht das überhaubt bzw. hat das jemand schon mal gemacht?

Naja, also ich könnts net, da meine C++ Kenntnisse mickrig sind. Aber verändern kannstes bestimmt. :)

Hat denn keiner ne Lösung wegen meinem Problem?
Ich brauch ein klein wenig Hilfe bei einem Skript. Es ist ein Spell. Ich möchte, dass der Spell nicht mehr ausführbar ist, wenn der Spieler weniger als 30 Punkte Ausdauer besitzt. Wie man den Spelleffekt deaktiviert, weiß ich schon, bloss macht der Spieler immernoch die Animation für den Spell. Kann man das auch irgendwie deaktivieren?
Wenn der Spieler zum Beispiel zu wenig Mana hat, dann kann man auch nicht mehr casten. Kann man den Effekt auch per Script aufrufen?

"skipanim" ist leider keine Lösung. Das lähmt den Spieler.
 
Kannst du nicht via Player.SetAv Magicka für den Moment die Magie auf 0 machen und im nächsten Moment wieder auf den Ursprung?
Eben das er das nicht macht weil kein Mana da ist.
 
Das Problem ist nur, dass der Spell nix kosten soll außer 30 Punkte Ausdauer. Was bedeutet mit 0 Magic kann man den auch noch casten.
 
Kann man Magicka negativ setzen (also -1) ?

Kann sein. Vielleicht crashed aber auch das Spiel. Könnte man ma probieren, aber ich glaub, dann mach ichs lieber so, dass ich die Spellkosten auf 9999 oder so setze. Das könnte sogar funktionieren.

Ne ich denke nicht...
Denn eben Ausdauer (Fatigue) auf 0 :lol:

Bringt ja nix. Die Spells werden ja immer nach Magic abgefragt. Ich muss ja selber scripten dass er mit weniger als 30 Ausdauer nicht mehr ausführbar ist, was ich ja auch schon geschafft habe. Das Problem ist, dass er trotzdem die blöde cast Animation ausführt.
 
Ich suche auch wieder einmal einen Script (wer hätte es gedacht :roll: :-D)

Und der soll folgendes bewirken (Quest-Script):
1. Sobald ein Mitglied einer Gilde bis auf 20 Fuss an einen bestimmten XMarker rankommt, soll ein Timer von 30 sec gestartet werden. Dieser soll aber nur laufen, solange die Person (auch der Player) in dem Bereich des XMarkers bleibt. Sobald der Spieler oder das Mitglied der Gilde weg/tot sind, soll der Timer zurückgeseetzt werden.

2. Wenn aber der Spieler (Gildenmitglied) solange dort war, bis der Timer 30 Sec lang gelaufen ist, soll ein Mapmarker aktiviert und ein Mesh ersetzt werden

3. Die KI sollte das gleiche können wie der Player (also 30 s warten --> Mesh wechsel und Map Marker)

4. Die KI soll erkennen können, ob der Mapmarker an (oder das Mesh gewechselt) ist

Hinter dem Script steckt die grobe Idee einer Mod, die Matches à la Battlefield ermöglicht. Momentan noch Planungsphase.
 
Ich habe auch mal wieder ein Problem:

Ich habe ein Script auf einem Item liegen. Die Hauptroutine soll aber nur abgearbeitet werden, wenn der Gegenstand im Besitz eines (beliebigen) NPCs und nicht beim Spieler ist.

Dazu verwende ich folgendes:

Code:
Begin OnAdd
	short isActor
	short isCreature

	set npc to GetContainer
	set isActor to npc.IsActor
	set isCreature to npc.GetIsCreature

	PrintToConsole "OnAdd on %n" npc
	PrintToConsole "IsActor %.0f" isActor
	PrintToConsole "GetIsCreature %.0f" isCreature

	if ( isActor == 1 ) && ( isCreature == 0 ) && ( npc.GetIsReference player == 0)
		Message "Activate Script"
		set activated to 1
	endif
End OnAdd

Begin OnDrop
	Message "Deactivate Script"
	set activated to 0
End OnDrop


Begin GameMode

	if (activated == 0)
		return
	endif
	MessageBox "Run Script"
	....
End GameMode

Leider ist die Variable isActor bei mir immer 0, egal ob ich selber das Item habe, ein NPC oder es in einer Truhe liegt.

Was mache ich da falsch?
 
Ich würde die Variablen nie wie existierende Befehle benennen. Das führt nur zu Problemen. Bin zwar etwas eingestaubt, aber versuch mal das hier:
Code:
Begin OnAdd
	short sActor
	short sCreature

	set npc to GetContainer
	set sActor to npc.IsActor
	set sCreature to npc.GetIsCreature

	PrintToConsole "OnAdd on %n" npc
	PrintToConsole "IsActor %.0f" sActor
	PrintToConsole "GetIsCreature %.0f" sCreature

	if ( sActor == 1 ) && ( sCreature == 0 ) && ( npc.GetIsReference player == 0)
		Message "Activate Script"
		set activated to 1
	endif
End

Begin OnDrop
	Message "Deactivate Script"
	set activated to 0
End


Begin GameMode

	if (activated == 0)
		return
	endif
	MessageBox "Run Script"
	....
End
 
  • Like
Reaktionen: Klehron
Danke, jetzt funktioniert es. Es hatte die Variablen erst eingeführt, als der direkte Einsatz der Funktionen npc.isActor und npc.GetIsCreature in der if Bedingung auch nicht funktionierte.

Edit:
Habe noch ein kleines Problem: Die Skripte laufen offenbar auf dem Referenz-Objekt und nicht auf dem Objekt selber. Wenn mein NPC z.B. mehrere dieser Items hat, weil es z.B. mehrere gibt oder man sie dazu cheatet, kommen die Skripte sich in die Quere und es können unvorhersehbare Resultate entstehen.

Also habe ich im OnAdd Block geprüft, wieviel Objekte vorhanden sind, und die überzähligen gelöscht. Ich hatte meinen npc ein Item per Konsole und AddItem gegeben und danach ein Expenblar per Spiel und Menü gegeben. Sobald das überzählige Item gelöscht wurde, kam es zu einem CTD. Wenn ich aber per AddItem 2 oder mehr Exemplare gegeben habe, funktionierte alles. Das gleiche passierte auch andersrum (Spieler per addItem, danach das Item vom NPC geben lassen => CTD). :huh:

Code:
Begin OnAdd
	short sActor
	short sCreature
	short sPlayer
	ref thisObj
	
	set thisObj to GetSelf
	set owner to GetContainer
	set sActor to owner.IsActor
	set sCreature to owner.GetIsCreature
	set sPlayer to (owner.GetIsReference player)

	short itemCount
	set itemCount to (owner.GetItemCount thisObj)
	if itemCount > 1
		short itemToRemove
		set itemToRemove to (itemCount - 1)
		PrintToConsole "Remove %.0f items from %n" itemToRemove owner
		[COLOR="Red"]owner.removeItem thisObj itemToRemove ;CTD[/COLOR]
	endif

	if ( sActor == 1 ) && ( sCreature == 0 ) && ( sPlayer == 0)
		PrintToConsole "Activate Script on %n - Actor=%.0f, Creature=%.0f, Player=%.0f" owner sActor sCreature sPlayer
		set activated to 1
		set repairLevel to 85
		set defaultChanceBreak to 40
	endif
End




Wie kann man den sicherstellen, das das Skript nur einmal (auch bei mehreren Items) läuft?
 
Zuletzt bearbeitet:
Probier's mal hiermit:
Code:
Begin OnAdd
	ref myself

	set myself to getself
	set owner to GetContainer

	if owner.GetItemCount myself > 1
	removeme
	endif

	if ( owner.IsActor == 1 ) && ( owner.GetIsCreature == 0 ) && ( owner.GetIsReference player == 0 )
		PrintToConsole "Activate Script on %n - Actor=%.0f, Creature=%.0f, Player=%.0f" owner sActor sCreature sPlayer
		set activated to 1
		set repairLevel to 85
		set defaultChanceBreak to 40
	endif
End
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Klehron
Moin,

erstma Danke, wegen dem letzten Problem. Das ändern des Manaverbrauchs hat so funktioniert, wie ichs mir vorgestellt hab.

Jetz hab ich ein weiteres Problem. Ich hab hier ein Script, welches als Effekt in einer Verzauberung angegeben ist. Diese Verzauberung liegt dann auf einem Rüstungsteil. Das Ganze sieht so aus.

Code:
scn ACWBladeDmgScript

short htoh
short blade
short dex
short str
short hitonce
float dmg
float N
float M
float AR
float absorb
float dif
ref target

begin scripteffectupdate

set target to getcrosshairref
set htoh to player.getav handtohand
set blade to player.getav blade
set dex to player.getav agility
set str to player.getav strength
set AR to target.getarmorrating/100
set N to ((htoh+blade)/2)/100
set M to ((dex+str)/2)/100

If N > 1
	set N to 1
endif

If M > 1
	set M to 1
endif


if player.isattacking
	if target.isactor
		if player.isanimgroupplaying attackleft
			set absorb to (((pow dex N)/4)+((pow htoh N)/4)+((pow blade M)/8)+((pow str M)/8))*(AR*-1)
			set dif to ((((pow dex N)/4)+((pow htoh N)/4)+((pow blade M)/8)+((pow str M)/8))*-1)-absorb
			set dmg to ceil dif
			if player.getav health <= dmg
				player.kill
			else
				player.modav2 health dmg
			endif
		endif
	endif
endif

printc "dmg: %.2f	dif: %.2f	absorb: %.2f", dmg, dif, absorb

end

Das Script wird aber einfach nicht ausgelöst. Das seltsame ist, dass es mal funktioniert hat. Dann habe ich mal was verändert und das Ganze wieder rückgängig gemacht. Seitdem funzt es nicht mehr. Ich hab jetz schon mehrmals geschaut, ob ich eventuell einen Fehler eingebaut habe, als ich es wieder umgeschrieben habe, aber ich finde nix.

Seht ihr eventuell den Fehler?
 
Ich suche so etwas wie RemoveTopic, aber diese Funktion scheint es nicht zu geben?

Oder wie kann man Topic wieder löschen? Alternativ kännte ich auch eine Bedingung für den Topic definieren, aber kann man diese auf ein Topic setzen oder nur auf eine Response?
 
Wie man Topics löschen kann? Gar nicht. Du kannst höchsten (so mach ich es immer) eine DummyQuest laufen lassen, die wenn ein Topic verschwinden soll einfach den Queststage anhebt. Oder du aktivierst die "Say once" funktion.
 
Ich möchte gerne einen beliebigen NPC einen Topic hinzufügen, wenn er einen bestimtes Item besitzt. Das wollte ich über den OnAdd Block machen. Leider klappt das auch noch nicht ganz.

Code:
Begin OnAdd
	short sActor
	short sCreature
	short sPlayer
	ref npc
	
	set npc to GetContainer
	set sActor to npc.IsActor
	set sCreature to npc.GetIsCreature
	set sPlayer to (npc.GetIsReference player)

	if ( sActor == 1 ) || ( sCreature == 0 ) || ( sPlayer == 0)
		npc.AddTopic myTopic
	endif

End OnAdd

Und das ganze wollte ich wieder im OnDrop Block rückgängig machen.

Wenn ich das über eine DummyQUest mache, wäre das ganze fürs Spiel global. Und man könnte es nicht auf verschiedene NPCs gleichzeitig anwenden.
 
mit addtopic fügst du dem NPC kein neues Topic hinzu, sondern machst es für den Spieler "bekannt". Also "npc.addtopic myTopic" bringt gar nichts. Du musst das Topic dem NPC im CS hinzufügen, und den Befehl im Script in "addtopic mytopic" ändern.

@ nexon: Inwiefern funktioniert es nicht? Werden die Variablen erst gar nicht geändert, oder nehmen sie bestimmte Werte an?

Gildur
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Klehron
@ nexon: Inwiefern funktioniert es nicht? Werden die Variablen erst gar nicht geändert, oder nehmen sie bestimmte Werte an?

Das Script wird garnicht erst ausgelöst. Sprich, die printc Ausgabe seh ich nichtmal. Wenn ich das Script als "Object" abspeichere und den Block auf "begin gamemode" setze und das Ganze dem Objekt direkt zuweise, dann funktioniert alles. Bloss ist das viel performacelastiger als scripteffectupdate. Ich frag mich bloss, warum das auf einmal nicht mehr funktioniert.