Construction Set Brauche player->mod magicka script

Das liegt daran, das OnPCEquip nicht mit Tränken funktioniert.
Stimmt leider, das hatte ich völlig vergessen. Wenn überhaupt, kann man OnPCEquip bei einem Trank nur dann benutzen, wenn man den Trank zeitgleich mit PCSkipEquip vor der Benutzung bewahrt. Dann kann man es zwar abfragen, aber der Trank wird natürlich auch nicht getrunken... es gibt folglich das Problem, dass man irgendwie den Eindruck erwecken müßte, dass der Trank doch getrunken wird - ergo den Sound abspielen, den Effekt anfügen und den Trank aus dem Inventar entfernen.

vielleicht hilft das als Anregung, ich habe selbst nämlich leider gerade keine Möglichkeit es zu scripten/testen...
 
Ja Lexa, sowas in der Art schwebte mir gestern abend auch noch vor, bin leider dann fast am Rechner eingeschlafen, daher hab ich die Versuche dann erstmal eingestellt, werde aber heute, wenn ich aus der Firma komme, weitermachen.

Btw.: Gibt es eine undokumentierte Funktion, die die, im Hilfefile beschriebene, Funktion UsedOnMe ersetzt?

Das wäre die perfekte Lösung, aber anscheinend hat es UsedOnMe nicht ins fertige Spiel geschafft, denn der Compiler meckert die Funktion als nicht vorhanden an.

Könnte ja sein, das es da, ähnlich wie bei GetHealthRatio im Hilfefile (im Spiel GetHealthGetRatio), eine undokumentierte Funktion gibt, die diese ersetzt.

noch nen netten Tag
Taktkonform
 
Folgende Idee:

Code:
begin PotionUse_Script
short OnPCEquip
short PCSkipEquip
short doonce

IF ( doonce == 0 )
 set PCSkipEquip to 1
ELSE
 set PCSkipEquip to 0
 player->Equip "POTIONID"
 return
EndIF

IF ( OnPCEquip = 0 )
 return
EndIF

set doonce to 1
player->addspell "myid_spell_potionlexa"
MessageBox "Magische Kräfte erfüllen Euch."

end
Problem:

Das Script setzt ein echtes Unique voraus. Wenn der Spieler multiple Tränke im Inventar hat, gibt das todsicher Stress. Das gilt aber auch generell für sämtliche andere Varianten, sei es RemoveItemm oder Drop/Disable, da diese nicht selbstreferenzierend sind, sondern über die ID funktionieren. Außerdem bin ich nicht sicher ob das Equip/destroy der Potion nicht MW crashed... da hilft nur Probieren.

Man könnte natürlich eines machen - setzt aber voraus, dass der Trank kein Gewicht hat - minimale Probleme, denke ich. Vorteil: funktioniert auch mit multiplen Potions, da selbstreferenzierend:

Code:
begin PotionUse_Script
DontSaveObject
short OnPCEquip
short PCSkipEquip

set PCSkipEquip to 1

IF ( GetDisabled )
 setdelete 1
 return
EndIF

IF ( OnPCEquip = 0 )
 return
EndIF

set OnPCEquip to 0
player->addspell "myid_spell_potionlexa"
player->PlaySound "ID des Potion Sounds"
MessageBox "Magische Kräfte erfüllen Euch."
disable

end
Wobei ich im Moment nicht sicher bin, ob man das disable direkt im gleichen Frame machen sollte wie die anderen Anweisungen. Und ich bin nicht sicher, ob es überhaupt so funktioniert oder MW dann crashed, ich habe das selbst noch nie probiert...

Wie gesagt: WICHTIG! Kein Gewicht, sonst gibt's Encumbrance Bugs!
 
  • Like
Reaktionen: Master_DeluXXXe
wieso soll es da ein problem geben wenn man mehrere Tränke hat, einfach RemoveItem "ID" 1 und dann
player->PlaySound "ID des Potion Sounds"
anstatt Equip-Force, gibt keine Probleme (das gilt zumindest für Apparate, dafür habe ich nämlich mal so ein Script geschrieben & getestet

EDIT
aber da wurde kein Gegenstand auf dem ein Script lief gelöscht oder versteckt, was bisher gepostet wurde sowie vergleichbare hab ich getestet und es gibt immer crash bzw der Trank wird durch delete nicht mal gelöscht :(
 
Zuletzt bearbeitet:
Ich hab das nun doch ein wenig anders gemacht...
...allerdings weiß ich nicht, ob Dir das so gefällt.

Auf jeden Fall ist es jetzt ein Trank, auch wenn der ein wenig "strange" ist. :D

Die Potion stammt nicht mehr aus der Familie "Alchemy" sondern ist ein "Misc Item", denn damit funktioniert OnActivate.

Ich hab mir also ein neues "Misc Item" erstellt, dem Meshes und Icon eines normalen Tranks verpasst, ihn gespeichert.

Dann das Script:
Code:
begin sarah_mod_potion

short messageOn
short drink
short gone

; Deaktiviert den Trank nach einmaliger Benutzung
if ( gone == 1 )
    Disable
    set gone to 0
    return
endif

; Funktioniert nicht, wenn das Inventar offen ist
if ( MenuMode == 1 )
    return
endif

if ( OnActivate == 1 )
    Set messageOn to 2
endif

if ( messageOn == 0 )
    return
endif

if ( messageOn == 2 )
    MessageBox "Ihr spürt, wie die magische Kraft Euch durchflutet"
    Set messageOn to 1
endif

if ( messageOn == 1 )
    
        Set drink to 1
        Set messageOn to 0
endif
    
; Den Trank trinken
if ( drink == 1 )

    player->modmagicka, 50
    set gone to 1
    set drink to 0
    return
endif

end sarah_mod_potion
darauf gebunden.

Da der Trank jetzt ein Activator ist, sollte er irgendwo in der Gegend stehen.
Sobald der Spieler ihn anklickt tritt der gewünschte Effekt ein und der Trank verschwindet, wird disabelt.

Willst Du dem Spieler noch die Wahl geben, ob er ihn gleich trinken soll, oder mitnehmen kann, dann müßte die Messagebox-Geschichte verändert werden und die button-Funktion eingefügt werden.

Das würde dann so aussehen:
Code:
begin sarah_mod_potion

short button
short messageOn
short drink
short gone

; Deaktiviert nach einmaliger Benutzung(Trinken)
if ( gone == 1 )
    Disable
    set gone to 0
    return
endif

; Funktioniert nicht bei offenem Inventar
if ( MenuMode == 1 )
    return
endif

if ( OnActivate == 1 )
    Set messageOn to 2
endif

if ( messageOn == 0 )
    return
endif

if ( messageOn == 2 )
    MessageBox "Wollt Ihr den Trank trinken oder Aufnehmen um ihn später zu trinken" "Trinken" "Nehmen."
    Set messageOn to 1
endif

if ( messageOn == 1 )
    set button to GetButtonPressed
    if ( button == 0 )
        ; Trinken
        Set drink to 1
        Set messageOn to 0
    endif
    if ( button == 1 )
        ; Aufnehmen
        Activate
        Set messageOn to 0
        return
    endif
endif
    
; Den Trank trinken
if ( drink == 1 )

    player->modmagicka, 50
    
;Saubermachen
    MessageBox "Euch ist ganz seltsam zumute..."
    set gone to 1
    set drink to 0
    
endif

end sarah_mod_potion
Damit kann dem Spieler die Wahl gegeben werden, ob er den Trank gleich nimmt, oder aber erst später. Allerdings muß er ihn dazu nochmals abstellen und wieder aktivieren (Leertaste).
Die Sounds hab´ ich mir jetzt erspart.

Ich hoffe damit so einigermaßen Deine Vorstellungen getroffen zu haben.
Aber Lexa´s Variante scheint die einfacherer und damit genialere Lösung zu sein.

noch nen netten Tag
Taktkonform
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Master_DeluXXXe
@IvanDaVile:
Soweit ich weiss, reagieren Apparate auf den OnPCEquip-Befehl noch anders als Tränke, ebenso seltsam. Wenn ich mich recht erinnere, sind Tränke und Bücher sehr zickig in der Hinsicht. Ich kann im Moment leider nichts selbst testen, sonst hätte ich schon lange was brauchbares abgeliefert :D so bastele ich blind rum. Mag sein, dass es mit RemoveItem geht, aber es muß dann ja in jedem Fall ein GlobalScript das Item aus dem Inventar entfernen, sonst crasht MW garantiert, denn ein Scriptholder darf sich nicht selbst löschen. Daher meine Idee, es ohne zusätzliches Script zu lösen und Variante 2 einzusetzen.

@Taktkonform:
Genau sowas hab ich auch schon mal gesehen. Millenia hat das mal in eine Mod eingebaut - Arkngchend II enthält so eine "Misc Potion", die man nehmen oder trinken oder in Ruhe lassen kann. Ich glaub, ich weiss jetzt, warum sie es damals genau so gemacht hat - die stand vermutlich vor dem gleichen Problem :-D

Der "Bittercup" funktioniert ja auch ähnlich...
 
  • Like
Reaktionen: Taktkonform
mein post oben wurde zwar noch nach den beiden danach edtiert, aber ich antworte einfach mal separat:
apparaten hab ich mir dann für echten alchemie-gerauch mit einem "unique-dummy" ersetzt, da man mit dem equip block sonst alles zunichte macht, tränke sind in der tat scheinbar noch schlimmer, wenn man darüber hinwegsieht, dass ein misc-item nicht bei den Tränken auftaucht, ist das aber wohl die eleganteste Lösung

der Sound für Trankgebrauch ist übrings "Drink" und lässt sich z.b. den dem Script oben irgendwo einfügen
 
Genau sowas hab ich auch schon mal gesehen. Millenia hat das mal in eine Mod eingebaut - Arkngchend II enthält so eine "Misc Potion", die man nehmen oder trinken oder in Ruhe lassen kann. Ich glaub, ich weiss jetzt, warum sie es damals genau so gemacht hat - die stand vermutlich vor dem gleichen Problem :-D

Den Mod kenn ich nicht...
...mir kam die Idee heute morgen beim Kaffeetrinken, als ich die Tasse wieder absetzte, schoß es mir durch den Kopf onActivate.:-D

Der "Bittercup" funktioniert ja auch ähnlich...

Bittercup...
...oh mann, manchmal bin ich aber auch zu dämlich.
Auf den Trichter hätte ich auch kommen können, das hätte mir einiges an Probiererei erspart.

Na, mal sehen ob ihm das so zusagt, obwohl ich Deine Variante inzwischen bevorzuge, sie ist doch "zugänglicher".

noch nen netten Tag
Taktkonform
 
Ach menno, ist doch alles shice - mit Construction Set und Spiel geht's doch gleich viel besser mit dem scripten :D So, ich hab eine funktionierende Lösung. Die gefällt mir zwar nicht wirklich, aber sie produziert keine Bugs, ich hab es mehrfach getestet. Folgendes - man braucht

1. eine Global
2. ein Background-Script
3. ein lokales Script
4. einen Trank (Potion) als Scriptholder

Dann geht das so:

Man richtet eine Global ein (Short):
LX_PotionUsed
Man erzeugt einen Trank:
LX_MysticPotion

Man erstellt zwei Scripts:
Code:
begin [COLOR="Blue"][I]LX_PotScanner_script[/I][/COLOR]
IF ( [COLOR="Blue"][I]LX_PotionUsed[/I][/COLOR] == 0 )
 return
EndIF

set [I][COLOR="Blue"]LX_PotionUsed[/COLOR][/I] to 0
PlaySound "Drink"
player->removeitem "[I][COLOR="Blue"]LX_MysticPotion[/COLOR][/I]" 1
MessageBox "Magische Kraft erfüllt Euch."

;hier etwas nützliches einsetzen:
;player->addspell "fay ability"
;player->ModMagicka 50
;player->ModIntelligence 10

end
Und für die Potion:
Code:
begin [COLOR="Blue"][I]LX_MagicPotion_scrip[/I][/COLOR]t
DontSaveObject
short OnPCEquip
short PCSkipEquip

set PCSkipEquip to 1

IF ( ( ScriptRunning "[COLOR="Blue"][I]LX_PotScanner_script[/I][/COLOR]" ) == 0 )
 startscript "[COLOR="Blue"][I]LX_PotScanner_script[/I][/COLOR]"
end

IF ( OnPCEquip == 0 )
 return
EndIF

set [COLOR="Blue"][I]LX_PotionUsed[/I][/COLOR] to 1
set OnPCEquip to 0
set PCSkipEquip to 0

end
Das schöne ist, so kann man der Potion zum Beispiel weitere (zufällige) Effekte verpassen... sie könnte eine Krankheit auslösen, den Spieler vergrößern, ihm einen dauerhaften Schutzschild verpassen, eine Horde Untote beschwören oder sonstwas... und natürlich auch den eingestellten Effekt der Potion auslösen, den man ingame sieht, wenn man den Trank ansieht. Ich hab es mit Hinzufügen verschiedener Sternzeichen getestet und es geht wunderbar :)


So. Noch Fragen? :lol:
 
sehr eindrucksvoll :good:


kannst du bitte im Detail erklären warum da DontSaveObject steht (oder stehen muss) und was das allgemein bringt?

:OT:

denkt vielleicht sonst noch jemand es wäre sinnvoll hier eine Script-Section einzurichten (z.B. als Ersatz für den großen Thread) wo so ganz nützliche Dinge wie das hier landen.

Aus Tuts kenne ich nur das Pendant für Bücher und mein eigenes für Alchemie-Tools

:OT:
 
Zuletzt bearbeitet:
kannst du bitte im Detail erklären warum da DontSaveObject steht (oder stehen muss) und was das allgemein bringt?

http://new.uesp.net/wiki/Tes3Mod:DontSaveObject
Da steht die Erklärung.^^
Kannte ich bisher auch nicht, ich kannte bisher auch nur SetDelete

@Lexa:

Ich ziehe meinen Hut vor Dir und verneige mich so weit ich in meinem Alter noch kann. ;)
Klasse Job, well done.

@Script-Section:
Die Idee an sich ist gut, wenn sie (die Sektion) gut moderiert wird und gepflegt wird.
Denn, es ist noch ne Menge aus Morrowind heraus zu holen.

noch nen netten Tag
Taktkonform
 
Zu meiner Lösung sei vielleicht noch anzumerken, dass sie davon ausgeht, dass auf jeden Fall mehrere Potions im Spiel verfügbar sind. Darum wird das Script auch nicht beendet, sondern "ruht" im Hintergrund, solange die Globale nicht getriggert wird, frißt es keine Zeit. Ich hatte mir gedacht, dass das Inventar eh schon oft so lahm ist, dass ein Startscript aus dem Inventar heraus ggfs. laggt.

Die Sache klappt übrigens auch dann, wenn man die Potion aufnimmt und schluckt und auch wenn das Ding auf 'nem Hotkey sitzt. Ich bin richtig zufrieden mit mir, muhaha :D

@Script-Section:
Tjoa, warum nicht... müßte man mal anregen. Wobei das natürlich sehr oft mit dem Construction Set Bereich Überschneidungen gibt. Vielleicht könnte man ja auch mal ein Archiv von Scripts aufbauen, so eine Art "wie scripted man XYZ?"... in einigen Tutorials sind ja schöne Lösungen drin, aber auch hier wurden schon öfter nette Sachen für ungewöhnliche Situationen erstellt.
 
ich hab bei dem Script zweite end zu einem endif ergänzt sodass das Script jetzt läuft aber es gibt ein Problem:

wenn ich mir z.B. 10 Tränke per Console einfüge und dann Trinke gibts nach 1~7 einen CTD, egal ob ich zwischendrin Warte, Menü schließe Tränke absetze usw. Bei nur einem Trank passiert das komischer nie (d.h. ich denke nicht das der gerade getrunkene Trank das Problem sein kann) bin ich da der einzige oder kann das sonst jemand reproduzieren?