Release Inventory Functions

Quad2Core

Abenteurer
Author: Quad2Core
Version: 1.0
Download: Nexus

Hallo,
Bei diesem Mod handelt es sich um ein SKSE-Plugin, welches neue Funktionen zu Papyrus hinzufügt, welche sich auf Inventare fokussieren.
Da ich momentan an einer anderen Mod arbeite, welche zeitnah Informationen über Items im Spieler Inventar braucht und die bisherigen Papyrus Funktionen einfach wesentlich zu langsam sind,
habe ich angefangen an diesem Plugin zu arbeiten. Bei diesen Funktionen lege ich Wert darauf sie möglichst performant zu schreiben.

Bis jetzt habe ich folgende Funktionen hinzugefügt:
-int Function GetNumItemsWithKeyword(Keyword key)
{Wenn getTotalCount true entspricht gibt die Function z.B bei 10xKleiner heiltrank, 1xHeiltrank den Wert 11 zurück ansonsten den Wert 2}
Mit 20 Forms und 6 Forms die dem Keyword zu treffen:
Papyrus speed: 0.875240sec
C++ speed: 0.013010sec
Ergebnis: Meine Funktion ist 0.862230sec oder rund 67mal schneller als die reguläre Papyrus methode.

Mit 157 Forms und 18 Forms die dem Keyword zu treffen:
Papyrus speed: 5.436980sec
C++ speed: 0.021860sec
Ergebnis: Meine Funktion ist 5.415120sec oder rund 249mal schneller als die reguläre Papyrus methode.
int potionCountNew = 0
Function ScanInventoryC()
potionCountNew = PlayerRef.GetNumItemsWithKeyword(VendorItemPotion, true)
endFunction
;--- wird verglichen mit:
int potionCountOld = 0
Function ScanInventory()
int iFormIndex = PlayerRef.GetNumItems()
While iFormIndex > 0
Form akForm = PlayerRef.GetNthForm(iFormIndex)
if akForm.HasKeyword(VendorItemPotion)
potionCountOld += OkayerRef.GetItemCount(akForm)
endif
iFormIndex -= 1
endWhile
endFunction
-Form Function GetNthFormWithKeyword(Keyword key, int index)
{Gibt die Form mit dem Keyword an dem bestimmten Index zurück}

Funktionen an denen ich momentan Arbeite:
-RemoveItemsWithKeyword(Keyword key, ObjectReference ContToMoveTo = none)

Zum Speed test:
Jede Funktion wird 100 mal getestet und der Durchschnittswert wird dabei ermittelt.
Bei den Tests verwende ich die Funktion: GetCurrentRealTime()
 
Zuletzt bearbeitet:
Hört sich interessant an und werde ich bestimmt mal gebrauchen können :good:

Kannst du vielleicht auch eine Funktion hinzufügen, die es erlaubt, den Respawn-Haken bei NPC's zu setzen? Ich weiß, hat jetzt nichts mit dem Inventar zu tun, aber vielleicht als neue Erweiterung oder "Quad2Cores Scripterweiterungen" ;)
 
Ich bin halt gerade erst dabei mich durch SKSE durch zu arbeiten, aber ich werde mal gucken was sich so tuen lässt.
 
File ist momentan hidden von Nexus, da ich es komplett überarbeite und dannach auch die soruce releasen werde.
 
Hallo! Sieht wirklich toll aus! :bye:
Wenn ich das richtig verstehe berechnet GetTotalNumItems() den kompletten Wert eines Inventars, oder?
Ich habe das in meinem jetzigen Mod auch gemacht, allerdings mit Papyrus und habe mich geärgert, dass Skyrim dafür mehrere Sekunden braucht.
Dein Plugin ist also genau das, was mir "gefehlt" hat.
So wie es aussieht, sind auch viele andere Inventarmanagement Scripts damit viel effizienter.
Finde ich auch toll, dass du erlaubst, das Plugin frei zu verwenden! Weiter so und viel Erfolg ;)
mfg, TripleBlade
 
Zuletzt bearbeitet:
Im aktuellen status habe ich die Funktionen GetTotalNumItems raus genommen da sie auf den Spieler nicht die korrekte Anzahl wiedergeben.
Bei Containern Funktionieren sie allerdings wie alles soll. Ich werde weiter daran Arbeiten um herauszufinden woran dies liegt.
(Der Fehler ist aktuell ziemlich verwirrend, weil die Funktion zwar alle Forms findet, aber anscheinend nur beim Spieler (oder Actors generell) die count Anzahl noch wo anders gespeichert werden)

Ich könnte aber kleinere workarounds in papyrus erstellen, wird sich dann aber negativ auf die Performance auswirken :/
 
Zuletzt bearbeitet:
  • Like
Reaktionen: TripleBlade
Achso, dann ist ja klar, warum mir das CK da Fehlermeldungen gibt :D
Na ja, jedenfalls wäre ich sehr dankbar, wenn du diese Funktion implementierst. Ich warte gerne ^^
Tatsächlich bräuchte ich diese Funktion aber in keinem Fall für den Spieler, sondern für NPCs... funktioniert das bei dir im Moment mit NPCs?
mfg, TripleBlade
 
Zuletzt bearbeitet:
Ja wie gesagt ich könnte sie im Momentanen Status zwar implementieren, aber sie würden nicht auf den Spieler korrekt funktionieren :/
 
Hab einen kleinen workaround für GetTotalNumItemsWithKeyword geschrieben:
Code:
int Function 	GetTotalNumItemsWithKeyword(ObjectReference objRef, Keyword thisKeyword) global	int count = 0
	int KeywordIndex = GetNumItemsWithKeyword(objRef, thisKeyword)
	While (KeywordIndex > 0)
		Form akForm = GetNthFormWithKeyword(objRef, thisKeyword, KeywordIndex)
		count += objRef.GetItemCount(akForm)
		KeywordIndex -= 1
	endWhile
	return count
endFunction
einfach in die _Q2C_Functions.psc einfügen und compilen :D
Ist aber nicht gerade, dass was ich "optimiert" nennen würde, aber ist jedoch das einzige, was in diesem moment machbar ist...
 
Sorry, wenn die frage jetzt dämlich kommt, aber ich verstehe nicht ganz was genau die mod macht. :S
Nur so viel das sie irgendeinen script (für das Inventar) schneller macht...
Was genau bringt das?
 
Das Plugin fügt 2 neue Funktionen zu Papyrus hinzu und diese können dann benutzt werden um performantere Scripts zu schreiben.
Im Prinzip ist es einfach nur mein erstes Plugin, welches Funktionen zu Papyrus hinzufügt. Wenn ich die Zeit finde und die passenden Ideen für weitere Funktionen werde ich noch ein paar hinzufügen.
 
  • Like
Reaktionen: Stevrocks
ahh... :!:, also damit du mehr Möglichkeiten hast, wenn du eine Mod erstellst bzw. für die an der du gerade arbeitest, danke !!
 
Ja und ich habe gute neuigkeiten ich werde bald (wahrscheinlich morgen schon) ein update veröffentlichen, welches weitere Funktionen hinzufügt.
Unter anderem GetTotalNumItemsWithKeyword, welches eine extrem performante Möglichkeit seien wird, die gesamt Anzahl von den Items, welche dieses Keyword besitzen zurückt gibt.
Ich erwarte Geschwindigkeiten von <0.03sec bei über 200 Items im Inventar!
 
  • Like
Reaktionen: Stevrocks
Update 1.1

Update 1.1
Habe gerade das Update 1.1 released, aus Zeitmangel halte ich die Beschreibung erstmal so kurz wie möglich:
Hinzugefügte Funktionen:
  • PoisonWornWeapon
  • PoisonWeapon
  • GetPoison
  • SetPoisonCharge
  • IsWeaponPoisoned
  • GetTotalNumItemsWithKeyword (hällt übrigends das versprechen vom vorherigen Post :))
  • GetTotalNumItems
 
Update 1.15

Update 1.15:
Hinzugefügte Funktionen:

  • Worn_IsWeaponPoisoned(Actor akActor, int handSlot)
  • Worn_GetPoison(Actor akActor, int handSlot)
  • Worn_GetPoisonCharges(Actor akActor, int handSlot)
  • Worn_SetPoisonCharges(Actor akActor, int handSlot, int Charges = 1)
  • GetPoisonCharges(ObjectReference objRef, int Charges = 1)
Änderungen:
  • PoisonWornWeapon wurde umbenannt zu Worn_PoisonWeapon
    Der int slotMask parameter wurde entfern, da er nicht benötigt wird.
  • GetNthFormWithKeyword:
    Die Position des Decrementes wurde an den While-loop anfang gestellt, um mit der Funktion GetNthForm übereinzustimmen.
 
  • Like
Reaktionen: bjoernret