Hey. Issues hat mir vor seinem "Verschwinden" noch erzählt, er hätte jetzt Sprinten integriert. Die neuesten Skripte dazu konnte er mir aber nicht mehr schicken oder ich kann jedenfalls nichts dazu in den aktuellen, die ich habe, finden. Er hat ohne Ikarus und Lego gearbeitet und darum wundere ich mich, wie er das gemacht hat. Hat jemand eine Idee?
Im normalen Gothic 2 gibt es die Möglichkeit hotkey zu aktivieren welche dafür gedacht sind schnell Heiltränke zu trinken(ohne das Inventar zu öffnen).
In der .ini: GAME.usePotionKeys
Diese hotkeys kann man "missbrauchen" um alles mögliche an skriptcode aufzurufen.
Intern werden da einfach die Funktionen PLAYER_HOTKEY_LAME_POTION() oder PLAYER_HOTKEY_LAME_HEAL () aufgerufen(B_OnHotkey.d) die du ja quasi nach belieben füllen kannst.
Wenn es nicht um hotkeys geht ist mir unklar was das Problem ohne Ikarus ist.
Es geht um Gothic 1, also geht es schätze ich nicht um Hotkeys. Ich glaube es sollte über Shift laufen oder so. Wobei mich das verwirrt, weil das ja schon zwischen Gehen und Laufen umschaltet. Allerdings habe ich jetzt erst realisiert, dass dieses "MEM_KeyState" ja von Ikarus kommt und nicht von Lego. Möglicherweise hat er doch Ikarus genutzt und nur Lego nicht.
Ich habe auch nichts dagegen, Lego zu benutzen, aber ich dachte, es wäre das beste, immer erst die Lösungen auszureizen, die am einfachsten sind.
Kann man mir mal jemand eine grundlegende (dumme) Frage zu Lego und Ikarus beantworten? Also ich denke es wird richtig initialisiert (durch Mud-Freaks Methode); testweise werden z.B. die grünen Namen bei NPCs angezeigt, die befreundet sind. Aber wenn ich jetzt ein neues Skript habe, wie z.B. so eine Sprintfunktion. Erstelle ich dazu dann eine eigene, neue Datei (.d) oder schreibe ich das irgendwo dazu? Und wenn eine neue Datei, wie bringe ich Gothic dann bei, dass es das Ding benutzen/lesen/parsen soll? Z.B. stehen alle Lego-Skripte wohl in der Header.src, wenn ich das richtig sehe. Dort einfach ein neues Skript dazu einzutragen, schien aber nicht zu funktionieren.
Kann man mir mal jemand eine grundlegende (dumme) Frage zu Lego und Ikarus beantworten? Also ich denke es wird richtig initialisiert (durch Mud-Freaks Methode); testweise werden z.B. die grünen Namen bei NPCs angezeigt, die befreundet sind. Aber wenn ich jetzt ein neues Skript habe, wie z.B. so eine Sprintfunktion. Erstelle ich dazu dann eine eigene, neue Datei (.d) oder schreibe ich das irgendwo dazu? Und wenn eine neue Datei, wie bringe ich Gothic dann bei, dass es das Ding benutzen/lesen/parsen soll? Z.B. stehen alle Lego-Skripte wohl in der Header.src, wenn ich das richtig sehe. Dort einfach ein neues Skript dazu einzutragen, schien aber nicht zu funktionieren.
Ich würde grundsätzlich davon abraten, "interne" Dateien der beiden Scriptpakete zu bearbeiten. Bis auf ein paar wenige Ausnahmen in LeGo (Teile der UserConst.d und Focusnames.d) sollte es niemals einen Grund geben, diese Dateien anzufassen.
Dementsprechend kannst du deine Script speichern, wo du möchtest. Damit Gothic diese Scripte liest, müssen sie einfach in der Gothic.src eingetragen sollen (natürlich nach Ikarus und LeGo, falls sie auf diese Pakete zurückgreifen). LeGo verwendet die Header.src nur, um eine einfachere Installation zu ermöglichen (denn dann muss man nur die Header.src in die Gothic.src eintragen und nicht alle Dateien einzeln).
Ich habe auch nichts dagegen, Lego zu benutzen, aber ich dachte, es wäre das beste, immer erst die Lösungen auszureizen, die am einfachsten sind.
Ich habe die Erfahrung gemacht das Ikarus+LeGo verwenden oft zu einfacheren Lösungen führen .
Mal als Beispiel eine Funktion die regelmäßig aufgerufen werden soll. Mit LeGo kann man da ja einfach die framefunctions nutzen. Ist super bequem.
Das finde ich viel einfacher als erst den spacer zu starten, ein triggerscript vob zu setzen etc.
Zitat von lali
Kann man mir mal jemand eine grundlegende (dumme) Frage zu Lego und Ikarus beantworten? Also ich denke es wird richtig initialisiert (durch Mud-Freaks Methode); testweise werden z.B. die grünen Namen bei NPCs angezeigt, die befreundet sind. Aber wenn ich jetzt ein neues Skript habe, wie z.B. so eine Sprintfunktion. Erstelle ich dazu dann eine eigene, neue Datei (.d) oder schreibe ich das irgendwo dazu? Und wenn eine neue Datei, wie bringe ich Gothic dann bei, dass es das Ding benutzen/lesen/parsen soll? Z.B. stehen alle Lego-Skripte wohl in der Header.src, wenn ich das richtig sehe. Dort einfach ein neues Skript dazu einzutragen, schien aber nicht zu funktionieren.
Das ist unabhängig davon ob du Ikarus und LeGo nutzt.
Es gibt eine .src Datei in der die Skripte aufgeführt werden(für gewöhnlich: gothic.src).
Dort können .d Dateien, aber auch weitere .src Dateien aufgeführt werden. Und der Parser geht das dann von oben nach unten durch.
Wenn du in deinem sprintcode Sachen aus Ikarus verwendest muss die Datei in der der sprintcode steht halt erst nach Ikarus in der gothic.src stehen.
Wenn du auch LeGo kram verwendest muss es eben hinter den LeGo Sachen stehen.
Hier mal der Anfang der Dirty Swamp gothic.src:
Die Datei DirtySwamp\frameFunctionExtended.d wird hier erst nach Lego aufgeführt, weil ich in der Datei Sachen aus LeGo verwende.
Eine Datei wie DirtySwamp\SpellConstants.d kann sehr weit oben stehen(weil sie nur Konstanten enthält und keinerlei Abhängigkeiten hat).
Ob du dir deine Sprintfunktionen in eine eigene .d Datei legst oder in eine schon existierende Datei mit rein bastelst ist dir überlassen.
Die Aufteilung der Skripte in verschiedene .d Dateien erhöht einfach nur die Lesbarkeit für Menschen.
Es macht wahrscheinlich Sinn eine eigene Datei MeineSprintfunktionen.d zu erstellen und da alles rein zu packen was zum sprinten gehört.
Du kannst aber auch deine gesamte mod in eine einzelne .d Datei mit 100000 Zeilen packen. Wäre halt für dich unübersichtlich.
Vielen Dank ihr beiden. Das macht schonmal Sinn.
Ein Skript habe ich jetzt unterhalb von Ikarus und Lego eingetragen, am Beispiel des Sprintskripts von Illari (basierend auf dem von Draxes). Sprinten tut er aber nicht. Habs auch mit G und anderen Tasten probiert.
Code:
var int isSprinting;
func void deactivateSprint()
{
Mdl_RemoveOverlayMDS(hero, "HUMANS_SPRINT.MDS");
if(Npc_HasReadiedRangedWeapon(hero))
{
AI_TELEPORT(hero, "PC_HERO");
};
isSprinting = False;
};
func void Sprinten()
{
var C_Npc her;
her = Hlp_GetNpc (PC_Hero);
if (Hlp_GetInstanceID (hero) == Hlp_GetInstanceID (her))
{
var int returnState;
returnState = MEM_KeyState(KEY_V); /*Die bevorzugte Taste*/
if (returnState == KEY_PRESSED) /*Taste wird gedrückt und gehalten*/
{
Mdl_ApplyOverlayMds(hero, "HUMANS_SPRINT.MDS");
isSprinting = True;
}
else if (returnState == KEY_RELEASED)/*Taste wird noch gedrückt und losgelassen*/
{
if(isSprinting)
{
deactivateSprint();
};
};
};
};
Vielen Dank ihr beiden. Das macht schonmal Sinn.
Ein Skript habe ich jetzt unterhalb von Ikarus und Lego eingetragen, am Beispiel des Sprintskripts von Illari (basierend auf dem von Draxes). Sprinten tut er aber nicht. Habs auch mit G und anderen Tasten probiert.
Spoiler:(zum lesen bitte Text markieren)
Code:
var int isSprinting;
func void deactivateSprint()
{
Mdl_RemoveOverlayMDS(hero, "HUMANS_SPRINT.MDS");
if(Npc_HasReadiedRangedWeapon(hero))
{
AI_TELEPORT(hero, "PC_HERO");
};
isSprinting = False;
};
func void Sprinten()
{
var C_Npc her;
her = Hlp_GetNpc (PC_Hero);
if (Hlp_GetInstanceID (hero) == Hlp_GetInstanceID (her))
{
var int returnState;
returnState = MEM_KeyState(KEY_V); /*Die bevorzugte Taste*/
if (returnState == KEY_PRESSED) /*Taste wird gedrückt und gehalten*/
{
Mdl_ApplyOverlayMds(hero, "HUMANS_SPRINT.MDS");
isSprinting = True;
}
else if (returnState == KEY_RELEASED)/*Taste wird noch gedrückt und losgelassen*/
{
if(isSprinting)
{
deactivateSprint();
};
};
};
};
Ja weil die function für Lego/Ikarus ist^^ Zu erkennen an MEM_KeyState! Die wird mittels FFApplyOnceExt in der Startup.d initialisiert. Sie stellt nur eine nicht NINJA variante dar! Hätte benjaminfoo nicht den Report Tab auf gitHUB entfernt hätte es dir die entäuschten versuche erspart^^
Ich habe jeden falls auch oft schon überlegt wie man dem Spiel eine neue taste beibringt, um die Map/Stats/Inventar/Potion Hotkeys nachzubilden.
Das hier war meine vorherige Mana Hotkey replacement variante
(Enthält aber kein Ranged Weapon Fix)
Jetzt müsste man dem Spiel nur irgendwie eine func void player_hotkey_sprint beibringen.
Aber dafür muss noch Menü eintrag etrstellt werden usw. Halt so in der art wie GFA
Wenn ich in den Skripten nach MEM_KeyState suche, taucht der Begriff nur in der Ikarus.d auf, deshalb dachte ich, es sei eine Ikarus-Funktion. Aber egal, ich hab ja auch Lego installiert. Nur warum (und wie?) muss ich das jetzt noch extra in der Startup initialisieren? Also wieso reicht es nicht, dass das Skript in der Gothic.src eingetragen ist?
Wie gesagt modde ich für Gothic 1 und ich will ungern Hotkeys (falls es die hier überhaupt schon gibt) ersetzen, die manche Spieler vielleicht anders nutzen.
Wenn ich in den Skripten nach MEM_KeyState suche, taucht der Begriff nur in der Ikarus.d auf, deshalb dachte ich, es sei eine Ikarus-Funktion. Aber egal, ich hab ja auch Lego installiert. Nur warum (und wie?) muss ich das jetzt noch extra in der Startup initialisieren? Also wieso reicht es nicht, dass das Skript in der Gothic.src eingetragen ist?
Wie gesagt modde ich für Gothic 1 und ich will ungern Hotkeys (falls es die hier überhaupt schon gibt) ersetzen, die manche Spieler vielleicht anders nutzen.
Hm... naja war mir da nicht so sicher mit MEM_KeyState^^
Warum es technisch genau dort mittels dieses Befehls initialisiert werden muss kann ich dir auch nicht beantworten. Mache ja keine sonderlich großen Projekte. Hatte halt nur versucht die NINJA patch variante nachzubauen.
Habe es auch in G1 probiert und hatte funktioniert.
Falls du zufällig eine HUMANS_SPRINT.MSB/MDH hättest ohne PFX an den füßen,
Könntest du sie mir vielleicht bitte zusenden? Ich habe zwar die Anim von StrongHand eingebunden aber die hat dann plötzlich auch das PFX???
Okay, das funktioniert. Vielen Dank Illari. Kann mir irgendjemand noch ein paar Takte zu den Fragen oben sagen, also wieso das in diesem Fall jetzt nötig ist, das in der Startup einzutragen?
Wegen der Sprint.mds. Bei mir ist da kein pfx. Das gab es glaube ich in Gothic 1 noch nicht. Wenn du also die .mds aus Stronghand genommen hast (wobei die da ja glaube ich eine ganz neue Animation von AlexDraven verwenden) und nachdem du sie in Gothic 2 eingefügt hast hattest du das Pfx dann, hat das wohl nichts mit der Animation zu tun. Wird bestimmt irgendwo anders hinzugefügt.
Ich habe dazu ohnehin eine Frage, deshalb gleich ein neuer Thread dazu, da kannst du dich ja anschließen.
Ich habe dazu ohnehin eine Frage, deshalb gleich ein neuer Thread dazu, da kannst du dich ja anschließen.
Kann nicht sein... Ich bin mir sicher das die HUMANS_SPRINT.MDS ebenfalls einen groundPFX eintrag hat. Und war jetzt eigentlich noch im glauben das die Geschwindigkeitstränke diesen ebenfalls einleiten. Obwohl das PFX ja an die ANIM gebunden ist und nicht an das mesh des Trankes.
Also ich sehe jedenfalls keinen Pfx bei mir in Gothic 1 und da wurde nichts an dieser Animation geändert.
// edit: Also ich bin jetzt komplett vom Austauschplatz zum Alten Lager gesprintet. Plötzlich war für eine Milisekunde ein blauer Pfx zu sehen. Aber die ganze übrige Zeit nichts. Mann.^^
Also ich sehe jedenfalls keinen Pfx bei mir in Gothic 1 und da wurde nichts an dieser Animation geändert.
// edit: Also ich bin jetzt komplett vom Austauschplatz zum Alten Lager gesprintet. Plötzlich war für eine Milisekunde ein blauer Pfx zu sehen. Aber die ganze übrige Zeit nichts. Mann.^^
Da hast du wohl einen der gründe warum es bei bestimmten sachen deaktiviert wurde!
Naja ich werd mal gucken ob ich das nochmal wegbekomme wie früher.
Finde es nur blöd das man die ganzen ANIM's nicht erstellen lassen kann ohne abbruch oder fehler.
Immer will er alle neu erstellen!
Wenn ich in den Skripten nach MEM_KeyState suche, taucht der Begriff nur in der Ikarus.d auf, deshalb dachte ich, es sei eine Ikarus-Funktion.
Ist es auch, da habt ihr euch gegenseitig wohl ein wenig verwirrt :P
Zitat von lali
Aber egal, ich hab ja auch Lego installiert. Nur warum (und wie?) muss ich das jetzt noch extra in der Startup initialisieren? Also wieso reicht es nicht, dass das Skript in der Gothic.src eingetragen ist?
Verzeih mir die folgenden bildlichen Analogien, aber: Ich würde Funktionen immer wie (Koch-)Rezepte betrachten. Genau wie ein Rezept beinhaltet eine Funktion eine Liste von benötigten Zutaten (die Parameter), eine Anleitung wie diese Zutaten zu verarbeiten sind (der sog. Körper der Funktion) und ein Ergebnis, wobei das Ergebnis nicht immer unbedingt ein Wert ist, sondern sich eben auch durch sogenannte Seiteneffekte auszeichnet: Die Funktion Mdl_ApplyOverlayMDS hat zwar kein richtiges Ergebnis, aber der Seiteneffekt dass der NPC jetzt andere Animationen benutzt ist ja auch eine Art Ergebnis.
Wenn du jetzt deine Funktion (Rezept) in die Gothic.src (Kochbuch) einträgst, bringt das erstmal wenig. Du musst die Funktion auch ausführen (das Rezept kochen). In diesem Fall wollen wir, dass die Funktion extrem häufig ausgeführt wird, weil du ja ständig überprüfen möchtest bzw. musst, ob die entsprechende Taste gedrückt ist/wurde. Ohne LeGo musste man dafür erstmal ein Objekt in der ZEN erstellen (ein oCTriggerScript), das dann dauerhaft deine Funktion ausführt. Weil das sehr umständlich ist, gibt es mit LeGo die Möglichkeit, das nur über Änderungen in den Scripten zu bewerkstelligen. Dafür ist folgende Zeile verantwortlich:
Als erstes nennt man die Funktion, die regelmäßig ausgeführt werden soll (in diesem Fall 'Sprinten'), dann in welchen Zeitabständen sie ausgeführt werden soll (in diesem Fall alle 5 Millisekunden) und danach wie häufig, wobei -1 in diesem Fall eben "unendlich oft" bedeutet. Kleine Anmerkung dazu: Sehr kleine Werte für die Ausführungsabstände sollte man vermeiden und stattdessen lieber 0 angeben, denn das bedeutet "jeden Frame", also ungefähr "so häufig wie möglich, solange das sinnvoll ist". Rechnet man mit ca. 60FPS, ist das ca. alle 16 Millisekunden (und bei z.B. 30FPS sogar nur alle 33ms).
Die Zeilen davor mit 'Init' im Namen braucht man nur für Ikarus/LeGo im Allgemeinen, da diese beiden Scriptpakete erst ein paar Dinge vorbereiten müssen, bevor sie richtig funktionieren (sonst wäre alles viel, viel langsamer).
In Gothic 1 gibt es keine Funktion Init_Global(), aber im LeGo-Thread sollte im Eröffnungspost ein Post von mud-freak verlinkt sein, der erklärt, wie man LeGo stattdessen initialisiert.
Kann man dort auch irgendwie Tastenkombinationen eintragen? Zum Beispiel: Führe diese Aktion aus, wenn X+Leertaste gedrückt wird?
Oder gibt es eine andere Möglichkeit, Aktionen bestimmte Tastenkombos zuzuordnen?