Unabhängiges Skript

Drakons

Neuankömmling
So aus reinem Spaß habe ich mal versucht mittels ein paar NPCs ein kleines nebenherlaufendes XP-System in Skyrim einzubauen.
Das Skript was momentan auf dem NPC liegt sieht so aus:

Code:
Scriptname KillToEXPScript extends ObjectReference  

MiscObject Property RLExpItem auto

GlobalVariable Property RLPlayerExp Auto
GlobalVariable Property RLPlayerLevel Auto
GlobalVariable Property RLPlayerSkillPoints Auto

Event OnDeath(Actor akKiller)

    if (akKiller == game.GetPlayer())
        int Gain = GetItemCount(RLExpItem)
        Debug.Notification("Du erhälst " + Gain + " Erfahrungspunkte")
        RLTCModExp(Gain)
    endIf

EndEvent

Function RLModEXP(int value)
    Self.RLExpGain(value)
    
    int CurrentLevel = Self.RLGetLevel()
    int CurrentExp = Self.RLGetExp()
    int LevelGainXP = (50 * CurrentLevel * (CurrentLevel + 1))
    
    If (CurrentExp >= LevelGainXP)
        Self.RLGainLevel(LevelGainXP)
    EndIf
EndFunction

Function RLExpGain(int value)
    RLPlayerExp.SetValue(RLPlayerExp.GetValue() + value)
EndFunction

Function RLGainLevel(int reduce)
    Self.RLExpGain(-reduce)
    
    game.GetPlayer().ModActorValue("health", 10.0)
    RLPlayerSkillPoints.SetValueInt(RLPlayerSkillPoints.GetValueInt() + 10)
    
    RLPlayerLevel.SetValue(RLPlayerLevel.GetValue() + 1)
    Debug.Notification("STUFENAUFSTIEG! Level " + RLPlayerLevel.GetValueInt() + " erreicht!")
EndFunction

int Function RLGetLevel()
    return RLPlayerLevel.GetValueInt()
EndFunction

int Function RLGetExp()
    return RLPlayerExp.GetValueInt()
EndFunction

Erklärung: Momentan hat jedes NPC ein Token-Item (unplayable), welches die Menge an EXP angibt die der Spieler bekommen soll.
Diese wird natürlich nur gegeben wenn der Spieler der tötende Akteur war. Ist eine bestimmte Menge an Erfahrung erreicht (Abhängig vom Level), geschieht ein Stufenaufstieg, der Spieler bekommt einige Boni und die für den Stufenaufstieg nötige XP wird aus dem XP-Pool des Spielers entfernt.

Dieses Skript funktioniert in der Gestalt wie es oberhalb angeben ist. Jedoch möchte ich eigentlich folgendes erreichen:
a) der NPC besitzt nur ein Skript namens GainExperience. In diesem wird einzig und allein fester Integerwert an das eigentliche Skript weitergeben, welches dann die Globalen Variablen verwaltet und den Stufenaufstieg steuert. Jedoch bereitet mir die Skriptsprache von TES mehr Probleme als jede bisher gesehene Programmiersprache und ich weiß nicht wie ich ein Skript (welches zu definierende Properties hat) benutzen kann OHNE es auf ein Objekt zu legen. Notfalls könnte man das zweite Skript auch in nen immergültigen Quest oder auf die Spielfigur legen, da bekomme ich aber nen Fehler, dass der Call-Aufruf ungültig wäre.
b) die Registrierung von Ereignissen in TES kommt mir unglaublich langsam vor (wenn ich ein NPC töte spürt man eine merkbare Lücke zum "Du erhälst xx Erfahrung" - Text). Kann ich mit irgendwelchen Mittel diese Abarbeitungsgeschwindigkeit erhöhen?
c) Die Methode "game.getplayer().modav("health", 10) bewirkt zwar das Gewünschte, jedoch verfärbt sich Ingame die Lebenszahl grün (als wenn man einen Bonus durch Effekte bekäme). Das möchte ich nicht. Ist die Änderung des Lebens auch möglich ohne eine Verfärbung? (zb *.setav(*.getav("health") + 10) oder sonen quak).
d) Wenn ein Akteur stirbt nachdem ich ihn mit FusRoDah von ner Klippe geworfen habe, bin nicht ich der Mörder sondern die Physikengine (auch wenn er gegen ne Wand haut, verbrennt etc..) kann man diese Fälle auch irgendwie abfangen oder muss ich mich entscheiden zwischen: Keine XP dafür oder XP dafür, aber dann unter Umständen auch XP für Fälle in denen ich diesen Tod nicht initiert habe (zb NPC fällt einfach so runter).

Danke schonmal. Wer miesen Code sieht darf mich gerne draufhinweisen (ich denke das obige ist nur solcher), ich habe jedoch sehr große Angst davor dass ich 2 NPCs nahezu gleichzeitig töte (so unwahrscheinlich es sein mag) und dann ein XP-Gewinn "wegfällt" (habe gerade vergessen wie das in klug heißt).

Edit: Hat sich erledigt. Lösung bitte im Skriptthread nachschauen.
 
Zuletzt bearbeitet: