Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 17 von 17
  1. #1 Zitieren
    benjaminfoo
    Gast
     

    [Ninja-Patch, G2] Sprintmod

    Hallo liebe Gemeinde,

    nach dem mud-freak das Patch-Framework Ninja hier im Forum veröffentlichte und uns damit eine großartige Facette im Bereich des Gothic-Moddings zur Verfügung stellte, machte ich mich direkt an die arbeiten meiner ersten Mod für Gothic.

    Wie man dem Titel bereits entnehmen kann handelt es dabei um eine Modifikation welche es dem Spieler ermöglicht auf Knopfdruck zu Sprinten.

    Ich habe dazu die bereits vorhandene Funktionalität des Geschwindigkeitstranks wiederverwendet - das sprinten kann dabei ausgelöst werden in dem die 'V'-Taste betätigt wird - sobald diese wieder losgelassen wird ist auch das gesprinte vorbei.

    Der Patch funktioniert bei mir bis jetzt ohne Probleme, dabei sieht mein Gothic-Setup wie folgendermaßen aus:
    • Gothic 2 - Die Nacht des Raben (Steam)
    • Alles was Spine an Updates installiert
    • L'Hiver Edition Original DE Bunt
    • D3D11 Renderer ClockWork Edition
    • Carnage Graphic Patch
    • Systempack
    • 4GB Patch


    Ich plane noch einige Mechaniken in die Modifikation zu integrieren, davor habe ich allerdings noch einige Fragen und Überlegungen:

    • Ist es möglich dem Spieler, hero, ein weiteres Attribut zu spendieren? In einem Test habe ich eine globale Variable dafür verwendet, evtl. gibt es ja aber schon soetwas wie ein Ausdauer-Attribut o.ä.?
    • Ich möchte die verfügbare Ausdauer natürlich in irgendeiner Art und Weise begrenzen - ich frage mich nun von welchen Faktoren man soetwas in einer eleganten Manier abhängig machen kann (sprich, in welcher Relation eines Charakter-Attributes steht die maximale Sprint-Dauer - vom Level? Vom Geschick? ... lasst es mich wissen was ihr davon haltet).
    • Ich werde in den folgenden Versionen eine Anzeige für die Ausdauer einbauen (vermutlich mittels LeGos-Bars, ähnlich wie die Mana-Anzeige, etc.) ...
    • Ich möchte das Ausdauersystem nicht größer machen als es ist - mögliche Einstellungen über INI-Dateien oder Menüs sind zwar denkbar, allerdings nicht unbedingt in meinem Fokus => je nachdem wie die Nachfrage hier aussieht.


    Hinweis
    Da ich es vor der Existenz des Modmanagers Spine nie wirklich hinbekommen habe eigenen Code in Gothic zum laufen zu kriegen bin ich im Bereich des effektiven Scriptings noch etwas unbedarft - aus diesem Grund habe ich mich am Manaregeneration-Ninja-Patch von johnnyboyy orientiert:

    https://github.com/Kirides/ninja-manareg
    Angehängte Dateien

  2. Beiträge anzeigen #2 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Erstmal danke für die Nennung

    Wird es den Quellcode noch in irgendeiner Form zum (online) anschauen geben?

    Wie verhält sich das drücken von "V" währen man in einem Menu ist / das Spiel pausiert ist?

    Um mud-freak ein wenig zu frei zu Zitieren:
    - wird das noch mit anderen Patches und Mods zusammen getestet?
    - wurde das Verhalten bei Weltenwechsel und während des Speicherns geprüft? (Hatte hier teilweise Probleme)
    Geändert von Kirides (30.08.2018 um 16:46 Uhr)

  3. #3 Zitieren
    benjaminfoo
    Gast
     
    Danke für das Feedback

    Ich konnte bis jetzt keinerlei Probleme feststellen (habe allerdings auch nicht die Kapazitäten aufbringen wollen um 10 vers. Gothic-Installationen + 10 vers. Mods zu testen, deswegen die Schilderung meines Setups).

    Wie verhält sich das drücken von "V" währen man in einem Menu ist / das Spiel pausiert ist?
    Im schlimmsten Fall wird dem Spieler ein Overlay verpasst, was ihm, sobald er die V-Taste wieder loslässt aber sofort wieder entfernt wird - ich denke also soweit passiert dort nichts - ich konnte keine Seiteneffekte feststellen.

    Um mud-freak ein wenig zu frei zu Zitieren:
    - wird das noch mit anderen Patches und Mods zusammen getestet?
    - wurde das Verhalten bei Weltenwechsel und während des Speicherns geprüft?
    Ich verwende den oben genannten Setup + deiner Mana-Regenerations-Mod und eben meiner Sprintmod - bis jetzt ohne Probleme. Ich verwende den Setup seit geraumer Zeit und habe auch schon einige mal gespeichert / geladen und zwischen Khorinis und Jharkendar gewechselt - bis jetzt ohne Probleme.

    Der Patch sollte relativ harmlos sein, da momentan nur ein Overlay auf Tastendruck aktiviert wird - keine Veränderungen am Speicher, keine Hacks oder sonstigen kritischen Geschichten irgendwo anders

    Wird es den Quellcode noch in irgendeiner Form zum (online) anschauen geben?
    Ich wollte erstmal Feedback einholen um zu Überprüfen ob der Patch so funktioniert wie ich mir das vorstelle, sollte dieser einen stabilen Eindruck machen stelle ich den Code auf Github bereit.

  4. Beiträge anzeigen #4 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Zitat Zitat von benjaminfoo Beitrag anzeigen
    Ich wollte erstmal Feedback einholen um zu Überprüfen ob der Patch so funktioniert wie ich mir das vorstelle, sollte dieser einen stabilen Eindruck machen stelle ich den Code auf Github bereit.
    Halte ich nicht für sinnvoll (aber nachvollziehbar).

    Ich und sicherlich viele andere haben nicht die Zeit/Lust, deine Mod/Patch tatsächlich auszuprobieren, aber ich bin mir sicher, wir können ganz viele Sachen am Sourcecode absehen oder dir zumindest Verbesserungsvorschläge geben. Ist ja nicht so, als wäre der Code auf Github unveränderbar - im Gegenteil

  5. #5 Zitieren
    benjaminfoo
    Gast
     
    Die Herausforderung beim emtwickeln dieses Ninja-Patches war für mich, die korrekte Initialisierung des Patches unter der Berücksichtigung der verfügbaren / notwendigen Strukturen - der letztendliche Code ist dabei ziemlich uninteressant, da trivial, und aktuell kein init/commit/push auf Github Wert ist:

    Code:
    var int returnState;
    returnState = MEM_KeyState (KEY_V);
    
    // If the Key "V" is pressed, put the player in sprinting state
    if (returnState == KEY_PRESSED) {
         Mdl_ApplyOverlayMDS(hero, STAMINA_SPRINT_ANIM);
    } else if (returnState == KEY_RELEASED) {
         Mdl_RemoveOverlayMDS(hero, STAMINA_SPRINT_ANIM);    
    };

    Ich und sicherlich viele andere haben nicht die Zeit/Lust, deine Mod/Patch tatsächlich auszuprobieren
    Nun es zwingt dich ja keiner dazu - all diejenigen die dennoch Interesse dran haben können mir gerne Feedback dazu geben.

    Sollte der Code irgendwann mal über diesen Umfang hinausgehen werde ich ein Git-Repo. erstellen und öffentlich machen.

  6. Beiträge anzeigen #6 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von benjaminfoo Beitrag anzeigen
    Sollte der Code irgendwann mal über diesen Umfang hinausgehen werde ich ein Git-Repo. erstellen und öffentlich machen.
    Also ich finde selbst diese 5 Zeilen Code sind hilfreich, wenn du das ganze Bootstrapping/Initialisieren und deine Ordnerstruktur sauber dokumentiert hast.

    Mein Manaregeneration-Patch ist schließlich auch sehr dünn, trotzdem sieht man daran leicht über den Quellcode, wie ich z.B. einen INI-Eintrag lese, oder wie ich Probleme angehe, das wiederum kann anderen Entwicklern helfen, diese Probleme zu vermeiden.

  7. Beiträge anzeigen #7 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Mdl_ApplyOverlayMDS "resetted" einiges an Animationskram.
    Mögliche Problemstellen die man mal testen könnte:
    1.: Overlay aktivieren falls Aufladezauber auf der Hand (voll aufgeladener großer Feuerball oder so).
    2.: hero tot/bewusstlos/schwimmend/tauchend/fallend/interaktion mit mob oder item
    3.: Hero verwandelt in Scavenger oder so ( --> benutzt nicht mehr humans.mds)

    evt. auch interessant:
    https://forum.worldofplayers.de/foru...moveOverlayMDS

  8. #8 Zitieren
    Illari
    Gast
     
    Kann mir vielleicht jemand helfen und bitte sagen wie die bezeichnung für die taste PageDown lautet? PageDN, PGDN, PageDown habe ich probiert aber funktionieren nicht.

  9. Beiträge anzeigen #9 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Ich wollte dich gerade auf die Ikarus_Const_G*.d verweisen (dort sind die Key-Konstanten definiert), aber der ist tatsächlich ein bisschen merkwürdig benannt (ist aber nicht Sektis Schuld). PageDown ist KEY_NEXT (und PageUp ist KEY_PRIOR).

  10. #10 Zitieren
    Illari
    Gast
     
    Zitat Zitat von Lehona Beitrag anzeigen
    Ich wollte dich gerade auf die Ikarus_Const_G*.d verweisen (dort sind die Key-Konstanten definiert), aber der ist tatsächlich ein bisschen merkwürdig benannt (ist aber nicht Sektis Schuld). PageDown ist KEY_NEXT (und PageUp ist KEY_PRIOR).
    Danke, habe das gleich dokumentiert.

  11. #11 Zitieren
    Illari
    Gast
     
    Ist es möglich den code von der mod in die normalen skripte einzubinden?
    LeGo und Ikarus sind beide in jenem code schon integriert.
    Habe schon angefangen doch es kommt öfter ein seltsamer fehler nach dem kompilieren und darauf folgendem laden eines spielstandes. Ein Fehler mit einer DAT datei und ich solle die SRC verwenden.
    Verstehe auch nicht ganz wo ich welchen code von einer der skripte einfügen muss.
    Hab den code von NINJA_STAMINA_REGENERATION.D in die Startup.d ganz oben unter die LeGo/Ikarus/Welten Init's geschrieben und den befehl STAMINA_SPRINT_ANIM mit der HUMANS_SPRINT.MDS ersetzt. Leider scheint er etwas von den anderen scripts auch noch haben zu wollen. Denke mal er möchte irwo anders noch den code der NINJA_STAMINA_INIT.D hin haben!?
    Geändert von Illari (02.05.2019 um 08:07 Uhr)

  12. Beiträge anzeigen #12 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    I halte diesen Thread als nicht besonders sinnvoll als Vorlage für eine Sprinten-Implementation. Weiter oben hat Cryp18Struct einige wichtige Punkte genannt, die von den Skripten hier nicht beachtet werden. Er hat auch einen anderen Thread verlinkt, in dem Draxes sogar seinen kompletten Code zum Sprinten zur Verfügung stellt. Du solltest dich besser daran orientieren.

  13. Beiträge anzeigen #13 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    I halte diesen Thread als nicht besonders sinnvoll als Vorlage für eine Sprinten-Implementation. Weiter oben hat Cryp18Struct einige wichtige Punkte genannt, die von den Skripten hier nicht beachtet werden. Er hat auch einen anderen Thread verlinkt, in dem Draxes sogar seinen kompletten Code zum Sprinten zur Verfügung stellt. Du solltest dich besser daran orientieren.
    Naja, in dem alten code wird das auch alles nicht beachtet.
    Der sprintcode von Dirty Swamp hat einiges komische Zeugs was DirtySwamp spezifisch ist, ob das als Vorlage nutzbar ist weiß ich nicht.
    Aber falls jemand mal gucken möchte:
    Code:
    // Dirty Swamp 2.13 von Cryp18Struct und Draxes
    
    // Wie lange kann der Spieler noch sprinten? (in ms)
    var int sprintTimeLeft;
    
    // Wie lange kann der Spieler Sprinten wenn er Volle Ausdauer hat? (in ms)
    var int sprintTimeMax;
    
    // Wie viel sprintTime muss übrig sein damit der Spieler beginnen kann zu sprinten?
    // falls zu wenig Ausdauer vorhanden ist um solange zu sprinten fängt das sprinten gar nicht erst an
    var int sprintRecoveryPeriod;
    
    // sprintet der Spieler zurzeit? (boolean)
    var int isSprinting;
    
    // verändert Ausdauer Regeneration
    // (1 == in 1 Sekunde wird genügend Ausdauer regeneriert um 1 Sekunde lang zu sprinten)
    // (2 == in 1 Sekunde wird genügend Ausdauer regeneriert um 0.5 Sekunden lang zu sprinten)
    // (4 == in 1 Sekunde wird genügend Ausdauer regeneriert um 0.25 Sekunden lang zu sprinten)
    var int enduranceRegenDividend;
    
    // boolean, falls true kann der Spieler sprinten ohne das zugehörige Talent zu haben (praktisch für tests)
    var int option_SprintingIsInnateAbility;
    
    // wie viele ms noch bis die Volle Ausdauer Bar ausgeblendet werden soll?
    var int hideEnduranceBarDelayCurrent;
    
    // nach wie vielen ms soll die volle Ausdauer Bar ausgeblendet werden?
    var int hideEnduranceBarDelayValue;
    
    // handle der Ausdauer bar
    var int enduranceBarHandle;
    
    // zwischenspeicher ob die bar versteckt ist
    // wird gebraucht da ein wiederholter Aufruf von Bar_Show(enduranceBarHandle) irgendwie dazu führt das die bar gar nicht angezeigt wird
    var int enduranceBarIsHidden;
    
    const int SPRINT_BASE_TIME = 2000;
    const int SPRINT_LEARN_TIME = 6000;
    const int SPRINT_RING_TIME = 7000;
    
    /*	Instanz der Ausdauer bar, abgeleitet von GothicBar
    */
    instance EnduranceBarInstance(GothicBar) {
        x = Print_Screen[PS_X] - 100;
        y = Print_Screen[PS_Y] - 50;
        barTop = 3;
        barLeft = 7;
        width = 180;
        height = 20;
    	barTex = "Bar_Endurance.tga";
    };
    
    var int dynEndX;
    var int dynEndY;
    var int dynEndWidth;
    var int dynEndHeight;
    var int dynEndBarTop;
    var int dynEndBarLeft;
    
    instance dynamicEnduranceBarInstance(GothicBar) {
        x = dynEndX;
        y = dynEndY;
        barTop = dynEndBarTop;
        barLeft = dynEndBarLeft;
        width = dynEndWidth;
        height = dynEndHeight;
    	barTex = "Bar_Endurance.tga";
    };
    
    /*	startup des Sprint Skripts
    	Wird in startup.d STARTUP_GLOBAL() aufgerufen
    */
    func void sprint_Startup()
    {
    	sprintTimeLeft = 2147483647; // für volle Ausdauer bei Spielestart
    };
    
    /*	Initialisierung des Sprint Skripts
    	Wird in startup.d INIT_GLOBAL() aufgerufen
    */
    
    func void initSprintTime() {
    	sprintTimeMax = sprintRecoveryPeriod + SPRINT_BASE_TIME;
    
    	if(Npc_GetTalentSkill(hero, NPC_TALENT_ACROBAT)) {
    		sprintTimeMax += SPRINT_LEARN_TIME;
    		enduranceRegenDividend = 3;
    	} else {
    		enduranceRegenDividend = 4;
    	};
    
    	if(sprintRingActive) {
    		sprintTimeMax += SPRINT_RING_TIME;
    	};
    
    	if(sprintTimeLeft > sprintTimeMax)	// Ausdauer auf max setzen, falls zuviel
    	{
    		sprintTimeLeft = sprintTimeMax;
    	};
    };
    
    func void sprint_Init()
    {
    	sprintRecoveryPeriod = 3000; // Spieler fängt nur an zu Sprinten wenn er mindestens 3 Sekunden Sprinten kann
    	initSprintTime();
    	hideEnduranceBarDelayValue = 3000; // Volle Ausdauer Bar verschwindet nach 3 Sekunden	
    	
    	if(sprintTimeLeft > sprintTimeMax)	// Ausdauer auf max setzen, falls zuviel
    	{
    		sprintTimeLeft = sprintTimeMax;
    	};
    };
    
    func void removeSprintMdsDelayed() {
    	Mdl_RemoveOverlayMDS(hero, "HUMANS_SPRINTWITHOUTEFFECT.MDS");
    	if(Npc_HasReadiedRangedWeapon(hero))
    	{
    		AI_TELEPORT(hero, "PC_HERO");
    	};
    };
    
    func void removeSprintMds() {
    	if (C_BodyStateContains(hero, BS_JUMP)) {
    		return;
    	};
    
    	FF_Remove_All(removeSprintMds);
    
    	// Damit die Animation nach dem Springen nicht unterbrochen wird
    	if(Npc_GetTalentSkill(hero, NPC_TALENT_ACROBAT)) {
    		FF_ApplyOnceExt(removeSprintMdsDelayed, 550, 1);
    	} else {
    		Mdl_RemoveOverlayMDS(hero, "HUMANS_SPRINTWITHOUTEFFECT.MDS");
    		if(Npc_HasReadiedRangedWeapon(hero))
    		{
    			AI_TELEPORT(hero, "PC_HERO");
    		};
    	};
    };
    
    /* Wird von sprintLogicLoop() aufgerufen um den Sprint zu beenden
    */
    func void deactivateSprint ()
    {
    	if(! Npc_hasVisualBody(hero, "HUMANS.MDS")){
    		//printDebug("sprint should be deactivated, but not messing with overlay because sc not human");
    		return;
    	};
    	
    	//printDebug("removing overlay");
    	//Mdl_RemoveOverlayMDS(hero, "HUMANS_SPRINTWITHOUTEFFECT.MDS");
    	FF_Apply(removeSprintMds);
    	//printDebug("overlay removed");
    	
    	
    	isSprinting = False;
    	//printDebug("isSprinting = false, end of function");
    };
    
    func int  heroHasStupidBodyState(){
    	if (C_BodyStateContains(hero, BS_SWIM)
    	|| C_BodyStateContains(hero, BS_DIVE)
    	|| C_BodyStateContains(hero, BS_JUMP)
    	|| C_BodyStateContains(hero, BS_FALL)
    	|| C_BodyStateContains(hero, BS_CLIMB)
    	|| C_BodyStateContains(hero, BS_SIT)
    	|| C_BodyStateContains(hero, BS_LIE)
    	|| C_BodyStateContains(hero, BS_INVENTORY)
    	|| C_BodyStateContains(hero, BS_MOBINTERACT)
    	|| C_BodyStateContains(hero, BS_MOBINTERACT_INTERRUPT)
    	|| C_BodyStateContains(hero, BS_ITEMINTERACT)){
    		return 1;
    	};
    	
    	return 0;
    };
    
    /* Wird von sprintLogicLoop() aufgerufen um den Sprint zu starten
    */
    func void activateSprint ()
    {
    	if(!InfoManager_HasFinished()){return;}; // spieler in dialog
    	if(MEM_Game.singleStep){return;}; // irgendein menü offen	
    	if(C_NpcIsDown(hero)){return;}; // spieler down
    	if(hero.aivar[AIV_INVINCIBLE] == true){return;}; // Monologe/Kamerafahrt
    	if(playerInputIsLocked){return;}; // hero darf sich zurzeit nicht bewegen weil stun spezialangriff oder ähnlicher Skriptkrams
    	if(heroHasStupidBodyState()){return;};
    	if(! Npc_hasVisualBody(hero, "HUMANS.MDS")){return;}; // keine Spezialfertigkeiten wenn Spieler kein Mensch(wegen Verwandlungszaubern)
    
    	if(Npc_GetActiveSpellLevel(hero) > 1){ // Aufladezauber
    		return;
    	};
    
    	if(preventSprinting) {
    		return;
    	};
    	
    	if(LevitationZeit > 0){
    		return;
    	};
    	
    	//printDebug("activate sprint");
    	sprintTimeLeft = sprintTimeLeft - sprintRecoveryPeriod/3; // initial direkt was abziehen, damit man nicht sprint "hoppen" kann
    	Mdl_ApplyOverlayMds(hero, "HUMANS_SPRINTWITHOUTEFFECT.MDS");
    	isSprinting = True;
    };
    
    
    /*	Eigentliche Sprint Logik
    	Wird jeden frame von mainloop() aufgerufen
    */
    func void sprintLogicLoop()
    {
    	if(MEM_Game.singleStep){return;}; // irgendein menü offen
    	
    	if(!InfoManager_HasFinished()){return;}; // in Dialog
    	
    	// keystate holen
    	var int sprint_keystate;
    	//sprint_keystate = MEM_KeyState(option_KeycodeSprint);
    	sprint_keystate = MEM_ReadStatArr (keystates, MEM_ReadStatArr (keyForAction, ACTION_SPRINT));
    	
    	if(sprint_keystate == KEY_PRESSED) // Spieler will anfangen zu sprinten
    	{
    		if(sprintTimeLeft >= sprintRecoveryPeriod) // und muss sich nicht mehr erhohlen
    		{
    			activateSprint (); // sprint wird aktiviert
    		}else
    		{
    			//printDebug(ConcatStrings("not enough stamina to start sprint: ", IntToString(sprintTimeLeft)));
    		};
    	}
    	else if(sprint_keystate == KEY_RELEASED || sprint_keystate == KEY_UP) // Spieler will aufhören zu sprinten
    	{
    		if(isSprinting)
    		{
    			deactivateSprint (); // sprint wird deaktiviert
    		};
    	};
    	
    	if(isSprinting 
    	&& (C_BodyStateContains(hero, BS_RUN) || C_BodyStateContains(hero, BS_HIT))) // spieler ist in sprint mode und rennt
    	{	
    		sprintTimeLeft -= MEM_Timer.frameTime; // Spieler verbraucht Ausdauer
    		if(sprintTimeLeft <= 0) // falls keine Ausdauer mehr
    		{
    			sprintTimeLeft = 0; // keine negativen Werte
    			deactivateSprint (); // aufhören zu sprinten
    		};
    		
    	}else // spieler sprintet gerade nicht
    	{
    		if(sprintTimeLeft < sprintTimeMax) // falls Ausdauer nicht maximum
    		{
    			var int enduranceRegenThisTick;
    			enduranceRegenThisTick = MEM_Timer.frameTime/enduranceRegenDividend;
    			if(enduranceRegenThisTick < 1)
    			{
    				enduranceRegenThisTick = 1;
    			};
    		
    			sprintTimeLeft += enduranceRegenThisTick; // spieler regeneriert Ausdauer
    			
    			if(sprintTimeLeft >= sprintTimeMax){// aber nur bis zum maximum
    				//printDebug(ConcatStrings("stamina at max: ", IntToString(sprintTimeLeft)));
    				sprintTimeLeft = sprintTimeMax;
    				hideEnduranceBarDelayCurrent = hideEnduranceBarDelayValue; // setzen, damit die volle Ausdauer bar nicht sofort ausgeblendet wird
    			};
    		};
    	};
    	
    	if(hideEnduranceBarDelayCurrent > 0) // reduzieren, damit die volle Stamina Bar ausgeblendet wird
    	{
    		hideEnduranceBarDelayCurrent -= MEM_Timer.frameTime;
    	};
    };
    
    /*	Interne Logik
    	Falls zurzeit GUI Elemente angezeigt werden können, soll die Stamina bar zurzeit angezeigt werden?
    
    */
    func int conditionShowStaminaBar()
    {
    	if(sprintTimeLeft < sprintTimeMax) // falls Ausdauer nicht voll: Anzeigen!
    	{
    		return true;
    	};
    	
    	if(hideEnduranceBarDelayCurrent > 0) // Falls vor kurzem volle Ausdauer erreicht wurde: Anzeigen!
    	{
    		return true;
    	};
    	
    	return false;
    };
    
    /*	Aktualisiert und zeigt die Ausdauer bar
    	wird von updateGUIElements() in GUI.d aufgerufen falls conditionShowStaminaBar() == true
    */
    func void showStaminaBar()
    {
    	// Wenn notwendig, bar erstellen
        if(!Hlp_IsValidHandle(enduranceBarHandle)) {
            enduranceBarHandle = Bar_Create(EnduranceBarInstance);
        };
    
    	if(needToRefreshEnduranceBar){
    		if(MEM_Game.manaBar != 0){
    			printDebug("creating new endurance bar using mana bar as reference");
    			var oCViewStatusBar manaBar;
    			manaBar = MEM_PtrToInst(MEM_Game.manaBar);
    			pd_si("zCView_pposx:", manaBar.zCView_pposx);
    			pd_si("zCView_pposy:", manaBar.zCView_pposy);
    			pd_si("zCView_psizex:", manaBar.zCView_psizex);
    			pd_si("zCView_psizey:", manaBar.zCView_psizey);
    			
    			dynEndX = manaBar.zCView_pposx;
    			dynEndY = manaBar.zCView_pposy;
    			dynEndWidth = manaBar.zCView_psizex;
    			dynEndHeight = manaBar.zCView_psizey;
    			
    			// LeGo bars benutzen den Mittelpunkt, daher jeweils um die Hälfte verschieben, liegt dann genau auf der mana bar
    			dynEndX = dynEndX + dynEndWidth/2;
    			dynEndY = dynEndY + dynEndHeight/2;
    			
    			// bisschen nach oben schieben
    			dynEndY = dynEndY - dynEndHeight/2;
    			dynEndY = dynEndY - dynEndHeight/2;
    			dynEndY = dynEndY - dynEndHeight/2;
    			
    			
    			var zcView rangeBar;
    			if(manaBar.value_bar == 0){
    				// Werte einfach übernommen von EnduranceBarInstance
    				dynEndBarTop = 3;
    				dynEndBarLeft = 7;
    			}else{
    				rangeBar = MEM_PtrToInst(manaBar.value_bar);
    				
    				dynEndBarTop = rangeBar.pposy - manaBar.zCView_pposy;
    				dynEndBarLeft = rangeBar.pposx - manaBar.zCView_pposx;
    			};
    			
    			if(Hlp_IsValidHandle(enduranceBarHandle)) {
    				Bar_Delete(enduranceBarHandle);
    			};
    			
    			enduranceBarHandle = Bar_Create(dynamicEnduranceBarInstance);
    			
    			needToRefreshEnduranceBar = false;
    		};
    	};
    	
        // Werte setzten
        Bar_SetMax(enduranceBarHandle, sprintTimeMax);
        Bar_SetValue(enduranceBarHandle, sprintTimeLeft);
    
    	// und anzeigen
    	if(enduranceBarIsHidden)
    	{
    		Bar_Show(enduranceBarHandle);
    		enduranceBarIsHidden = false;
    	};
    };
    
    /*	Versteckt die Ausdauer bar
    	wird von updateGUIElements() in GUI.d aufgerufen 
    	falls conditionShowGuiElements() == false
    	oder
    	conditionShowStaminaBar() == false
    */
    func void hideStaminaBar()
    {
    	if(!enduranceBarIsHidden)
    	{
    		Bar_Hide(enduranceBarHandle);
    		enduranceBarIsHidden = true;
    	};
    };
    mainloop() ist einfach eine Funktion die jeden frame aufgerufen wird und GUI.d sieht so aus:
    Code:
    var int option_showAbilityCooldownIcons;
    var int option_RendererSafeMode;
    
    func void gui_Init()
    {
    	FF_ApplyOnce(updateGUIElements); // updateGUIElements jeden frame aufrufen
    };
    
    /*	Allgemein, sollen Interface Elemente angezeigt werden?
    
    	returns false = es gibt zurzeit einen Grund Interface Elemente nicht anzuzeigen
    	returns true = kein Grund gefunden interface Elemente nicht anzuzeigen
    
    
    */
    func int conditionShowGuiElements()
    {
    	if(MEM_Game.pause_screen)
    	{
    		return false;
    	};
    	
    	// Spieler ist in einem Dialog
    	if(!InfoManager_HasFinished())
    	{
    		return false;
    	};
    	
    	if(creditsTriggered){
    		return false;
    	};
    	
    	return true;
    };
    
    /*	Zeigt und versteckt GUI Elemente
    	Wird jeden frame von FrameFunction aufgerufen
    */
    func void updateGUIElements(){
    	
    	// Spieler darauf hinweisen dass wiederbeleben mit MArvin F8 das Spiel kaputt machen kann
    	if(heroDiedTimestamp != 0 && MEM_GAME.game_testmode && !disableCheatWarning_bool){
    		enableCheatWarning();
    	};
    	
    	if(YPOS_ItemGiven_Offset > 0){
    		YPOS_ItemGiven_Offset = YPOS_ItemGiven_Offset - 1;
    	};
    	
    	// Ability Cooldowns update
    	AbilityCooldownUpdateAll();
    	
    	if(conditionShowGUIElements())
    	{
    		// Ausdauer Balken
    		if(conditionShowStaminaBar())
    		{
    			showStaminaBar(); // Bar anzeigen weil nichts dagegen spricht
    		}else{
    			hideStaminaBar(); // Bar ausblenden aufgrund interner Logik
    		};
    		
    		// ability cooldowns
    		if(option_showAbilityCooldownIcons){
    			showAllCooldownsIfConditionsMet(); // Cooldowns gegebenenfalls anzeigen
    		}else{
    			hideAllCooldowns();
    		};
    		
    	}else{
    		hideStaminaBar(); // Bar ausblenden weil keine GUI Elemente angezeigt werden sollen
    		hideAllCooldowns(); // Alle Cooldowns ausblenden weil keine GUI Elemente angezeigt werden sollen
    	};
    };
    Geändert von Cryp18Struct (10.05.2019 um 21:39 Uhr)

  14. #14 Zitieren
    Illari
    Gast
     
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Naja, in dem alten code wird das auch alles nicht beachtet.
    Der sprintcode von Dirty Swamp hat einiges komische Zeugs was DirtySwamp spezifisch ist, ob das als Vorlage nutzbar ist weiß ich nicht.
    Aber falls jemand mal gucken möchte:
    Hey danke für den Code und die beschreibungen zu den einzelnen zeilen.

  15. Beiträge anzeigen #15 Zitieren
    Kämpfer Avatar von ZeroLord
    Registriert seit
    Mar 2012
    Ort
    Ignadon
    Beiträge
    312
     
    ZeroLord ist offline
    wird es den sprint ninja mod auch nochmal für ninja 2 geben ? und falls ja ein spine release ?
    🎵 ... Kampfkraft und Wendigkeit sind die Vorraussetzung für jeden Kämpfer ... 🎶

  16. Beiträge anzeigen #16 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von ZeroLord Beitrag anzeigen
    wird es den sprint ninja mod auch nochmal für ninja 2 geben ? und falls ja ein spine release ?
    Das ist ein Patch, ein(e) "ninja mod" gibt es nicht

    Ich würde diesen Ansatz hier gerne eingehen lassen und bei Interesse würde vorschlagen, von null anzufangen. Die Skripte hier sind, wie weiter oben beschrieben, nicht so optimal und auch die hardgecodete Taste ist nicht so klasse.

  17. Beiträge anzeigen #17 Zitieren
    Abenteurer Avatar von rataj
    Registriert seit
    Jun 2016
    Beiträge
    94
     
    rataj ist offline
    Habe ca. vor einem halben Jahr das gepostet Skript von Dirty-Swamp zu etwa 80% integriert bekommen. Es gab nur immer wieder eine function oder instance die er angeblich nicht finden konnte, obwohl es da glaube nur an der Reihenfolge lag in der ich die Zeilen hinzugefügt hatte.
    „Einen Dummkopf erkennt man daran, dass er alles abtut, was er anhand seiner eigenen Erfahrungen nicht erklären kann.“ — Farengar Heimlich-Feuer —




Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide