Code:
;///////////////////////////////////////////////////////////////////////[ Essen & Trinken ]//////////////////////////////////////////////////////////////////////
long CheckObjectItemCount
short price
ref objMenuMode
ref CheckIfObjectEaten
string_var objIconPath
short KeyDown
Begin MenuMode 1002 ;Der MenuMode-Block wird nur ausgeführt, wenn sich der Spieler in seinem Inventar befindet
if objMenuMode != 0 ;Ohne diese Abfrage stoppt das Skript weil die Oblivion Engine zu dämlich ist zu wissen was sie tun soll, wenn eine Object Reference 0 ist
if objMenuMode == Apfelsaft || objMenuMode == DrinkBier01 || objMenuMode == DrinkWeinBillig01 || objMenuMode == NQBranntwein || objMenuMode == DrinkDunkelbier || objMenuMode == DrinkEbruCahbaet || objMenuMode == EbruCahbaet || objMenuMode == DrinkMet01 || objMenuMode == DrinkSchnaps01 || objMenuMode == DrinkWeinTeuer01 || objMenuMode == DrinkSchnaps01Teuer || objMenuMode == DrinkWeinBillig02
;Da Getränke nicht abgefragt werden können, musste ich sie händisch angeben, wobei mir mein Kollege die ganzen Namen aus diesem grottigen CS-Tool rausgesucht hat
set RHFoodEaten to RHFoodEaten + 1 ;Diese Variable sorgt für die Sättigung. Getränke geben immer eine Sättigung von 1
set objIconPath to geticonpath objMenuMode
sv_insert "icons\" objIconPath
setMessageIcon $objIconPath
;Dieser Block holt sich das passende Icon für das Getränk, welches der Spieler getrunken hat
messageEX "%n getrunken. Plus 1 Stunde(n) Sättigung.", objMenuMode
;Wirft eine erweiterte Nachricht mit Icon und Namen des Getränks aus. Der Code %n wird durch den Namen der Referenz 'objMenuMode' ersetzt
if CheckIfObjectEaten != 0 ;Ohne diese Abfrage steikt das Skript wie erwähnt
if Player.GetItemcount CheckIfObjectEaten == CheckObjectItemCount
Player.EquipItemNS CheckIfObjectEaten
endif
;Diese Abfrage sorgt dafür, dass man nicht cheaten kann. Wenn man auf ein Nahrungsmittel klickt, aber die Maus wegbewegt und loslässt würde man es normalerweise nicht essen,
;dennoch bekommt man Sättigung. Wenn die Anzahl also gleich ist wie beim Auswählen des Objekts, wird es dennoch verspeißt.
endif
set objIconPath to sv_Destruct
set objMenuMode to 0
;Die Object Reference und der Pfad werden gelöscht
elseif GetObjectType objMenuMode == 25 ;Wenn es sich bei dem Ausgewählten um etwas Essbares handelt wird dieser Block ausgeführt
set price to getGoldValue objMenuMode
set price to price/2
if price < 1
set price to 1
endif
set RHFoodEaten to RHFoodEaten + price
;Diese Kalkulation hab ich aus dem QuestScript übernommen. Ist zwar recht einfältig die Sättigung nach dem Wert des Gegenstandes zu bestimmen, aber
;es spart Platz und ist einfach umzusetzen :P
set objIconPath to geticonpath objMenuMode
sv_insert "icons\" objIconPath
setMessageIcon $objIconPath
messageEX "%n gegessen. Plus %g Stunde(n) Sättigung.", objMenuMode, price
if CheckIfObjectEaten != 0
if Player.GetItemcount CheckIfObjectEaten == CheckObjectItemCount
Player.EquipItemNS CheckIfObjectEaten
endif
endif
set objIconPath to sv_Destruct
set objMenuMode to 0
;Die selben Vorgehensweisen wie bei den Getränken nur eben für das Essen
else
set objIconPath to sv_Destruct
set objMenuMode to 0
;Wenn das Ausgewählte weder Getränke noch Essen ist, werden nur die Variablen wieder gelöscht, um eine neue Auswahl zu ermöglichen
endif
else
if GetContainerMenuView ;Der Spieler darf sich NUR in seinem eigenen Inventar befinden. Wäre ja noch schöner, wenn man beim Verkaufen oder durch das Ablegen in Container satt wird!
if (IsKeyPressed3 256) && (Keydown == 0) && (IsKeyPressed3 42 == 0) && (IsKeyPressed3 54 == 0) ;Wenn die linke Maustaste gedrückt wird und dabei die linke und rechte Shift-Taste NICHT gedrückt sind
set Keydown to 1 ;Das Loslassen der Maustaste wird initialisiert
set CheckIfObjectEaten to GetActiveMenuSelection ;Das geklickte Objekt wird in die Überprüfungsreferenz gespeichert
if CheckIfObjectEaten != 0 ;Wie immer weiß das dumme Skript nicht was es machen soll, wenn man nicht explizit sagt, dass es nur etwas machen soll, sofern die Referenz gesetzt wurde
set CheckObjectItemCount to Player.GetItemcount CheckIfObjectEaten ;Die Anzahl der Objekte von der Überprüfungsreferenz werden in eine Variable gespeichert
endif
elseif (IsKeyPressed3 256 == 0) && Keydown ;Wird ausgeführt, sobald die Maustaste losgelassen wird
set Keydown to 0 ;Um nicht in eine Endlosschleife zu geraten, wird die Variable mit welcher der Tastendruck überprüft wird wieder auf 0 gesetzt
set objMenuMode to GetActiveMenuSelection ;Diese Variable ist nur ein Überbleibsel des Skripts, bevor ich den Anti-Cheat-Modus eingebaut habe,
endif ;da sie aber auch gleichzeitig als Schalter (ist NICHT 0 oder ist 0) dient, ist sie als zusätzliche Referenz notwendig
endif ;anstatt einfach nur mit der CheckIfObjectEaten Referenz zu arbeiten
endif
End