|
-
Zitat von ZeroLord
auch möchte ich meinen dank ausprechen an deine super arbeit. ich finde die ninjapatches heben die modfähigkeit von gothic meiner meinung nach auf ein neues level. finde wirklich das diese methode der modbarkeit mehr aufmerksamkeit verdient. deshalb wünsche weiteres gutes gelingen un immer weiter so
Danke! So mittlerweile ergeben sich ja schon ein paar mehr Ideen (und deren Umsetzung) für Patches.
Zitat von ZeroLord
cool danke. ist es möglich die werte per hexeditor oä anzupassen ?
meine zu glauben das uriziel auch waffenshaden hatte der aber jetzt nicht existent ist.
Wie gesagt kannst du das im Spiel über die Konsole mit edit focus.
Die Werte sind allerdings exakt aus dem Original übernommen. Mich hat es auch etwas gewundert, dass Urziel scheinbar nur Magie- und Feuerschaden macht.
Zitat von ZeroLord
noch ne andere frage ist durch die ninja patches es technisch auch möglich
objecte in der welt zu verändern zb der inhalt won truhen ?
Ja, das geht problemlos. Das geht aber an der Idee von Ninja etwas vorbei, da Truhen oder andere Objekte in der Welt Mod-spezifisch sind und in anderen Mods höchstwahrscheinlich nicht existieren. Patches sollen das Spiel patchen, unabhängig von der derzeitigen Mod. Alle Eingriffe in Storyelemente sollten daher nach wie vor traditionell als Mod erstellt werden.
Geändert von mud-freak (15.01.2021 um 10:33 Uhr)
-
Ich frage mich warum noch niemand auf die Idee gekommen ist
Eines DER wahrscheinlich sinnvollsten Features die man (hoffentlich) via "Ninja" realisieren kann, wäre es doch das Lebensmittel Prozentual Heilen.
Das ginge dann wahrscheinlich nicht für alle Lebensmittel da Modifikationen ja gerne auch mal neue hinzufügen oder alte ersetzen, doch für gebratenes Fleisch würde mir das schon reichen ^^
Leider bin ich was Gothic Modding angeht ein Nichtskönner deswegen würde ich dies gerne an interessierte Könner weitergeben.
Desweiteren wäre meine Frage ob man so Bugfixes implementieren kann?
Zum Beispiel das verdoppeln von Steintafeln oder ähnliches.
//Vielleicht werde ich diesen Post von mal zu mal modifizieren mit neuen Ideen, wie Zocker01
EDIT:
Kaum zeit vergangen ein zwei Videos gesehen und schon duzten neue Ideen xD
- Zum einen wäre schön wenn man das verbesserte Brat/Koch System zur Verfügung stellt. Also dass man 1, 5, 10 oder alle Fleisch keulen braten kann.
- Dann ein System wie in TES Oblivion und KO das man warten kann.
- Dann ein Monster counter (Fand ich für meinen Teil immer extrem Interessant).
- Zudem fand ich zum Beispiel aus der Modifikation "Legend of Ahssûn" das System extrem interessant und logisch, das man durch das nutzten einer Waffe den Umgang damit verbessert.
- Wie aus der Modifikation "Xeres' Rückkehr" die Auto speicher Funktion
- sowie der Erfahrungspunkte Balken
- Zudem fände ich es schön wenn man sowie in "The Returning 2" die neuen Idle Animationen dazu bekommt, für den Helden und andere NPC´s evtl. auch.
Geändert von SnowySchoko (11.09.2018 um 23:48 Uhr)
Grund: Neues
-
hier einige vorschläge meinerseits: manaregeneration für g1 wär cool auch eine g1 version vom sprint mod wär toll und nicht zu vergessen health regen für g1 und auch g2
🎵 ... Kampfkraft und Wendigkeit sind die Vorraussetzung für jeden Kämpfer ... 🎶
-
Hi. can u add other features like change color npc due to attitude or chest color like in g3?
-
Zitat von pawbuj
Hi. can u add other features like change color npc due to attitude or chest color like in g3?
Yes, that is easily possible.
Did you want to know if it is possible or are you asking me to do it?
-
thanks. I try do by myself. In case of any problem I will contact you.
Geändert von pawbuj (21.09.2018 um 11:08 Uhr)
-
Zitat von pawbuj
thanks. I try do by myself. In case of any problem I will contact you.
Great! Don't hesitate to post any intermediate progress and/or questions. I am happy to help.
-
Zitat von mud-freak
Great! Don't hesitate to post any intermediate progress and/or questions. I am happy to help.
Pls see below my trial with init.
Seems I am doing something wrong cause not works.
Gothic 1
Code:
const string NINJA_G1Patch_VERSION = "1.0";
//========================================
// Farbhandling
//========================================
/* r : Roter Farbanteil (0..255)
* g : Grüner Farbanteil (0..255)
* b : Blauer Farbanteil (0..255)
* a : Alpha (0 = unsichtbar, 0..255)
* return : Fertiger zColor */
func int RGBAToZColor(var int r, var int g, var int b, var int a) {
if(!a){if(!b){if(!g){if(!r){return 1;};};};};
return ((r&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_RED)
|((g&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_GREEN)
|((b&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_BLUE)
|((a&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_ALPHA);
};
const int zCView_SetFontColor_offset = 7339392; //6FFD80 thiscall(zCColor)
var int zamkniety;
var int chest_value;
func void Status_Chest()
{
var oCNpc her; her = Hlp_GetNpc(hero);
var oCMobContainer chest; chest = _^(her.focus_vob);
var oCMobDoor Door; Door = _^(her.focus_vob);
var oCMobLockable chest2;chest2 = _^(her.focus_vob);
//var oCItem quest_item;quest_item = _^(her.focus_vob);
//var oCMobInter patelnia; patelnia = _^(her.focus_vob);//_oCMobInter_conditionFunc
var int col; var int ptr;
if !(Hlp_Is_oCMobContainer(her.focus_vob) || Hlp_Is_oCMobDoor(her.focus_vob)){ return; };
if !her.focus_vob { return; };
if Hlp_Is_oCMobContainer(her.focus_vob)
{
if (chest._oCMobLockable_bitfield & oCMobLockable_bitfield_locked)
{
zamkniety = 1;
//chest._oCMobLockable_bitfield = oCMobLockable_bitfield_autoOpen;//otwiera chest !
col = RGBAToZColor(255,0,0,255); //czerwony
//************************************************************************************************
/*
if (Hlp_Is_oCMobLockable(her.focus_vob))
&& (STR_Len(chest2.pickLockStr) > 0)
&& (zamkniety == 1)
{
//chest2._oCMobInter_conditionFunc = "NEED_SKILL"; // You probably need to use all caps
//Print("skrzynia zamknięta!");
};
*/
//**************************************************************************************************
}
else
{
col = RGBAToZColor(255,180,0,255); //Orange
if (zamkniety == 1)
{
zamkniety = 0;
//Print("skrzynia otwarta!");
};
};
MEM_AssignContentInst (Chest,her.focus_vob);
//MEM_AssignInst (Chest,her.focus_vob);
if (chest.containList_next > 0)
&& (zamkniety == 0)//jeżeli zawartośc skrzyni jest większa od 0
{
col = RGBAToZColor(255,180,0,255); //Orange
//
//chest_value = ConcatStrings ("Wartość skrzyni : ",(InttoString (chest.containList_next)));
//PrintS (InttoString (chest_value);
printchestxp ();
}
else if (chest.containList_next == 0)
&& (zamkniety == 0)//jeżeli zawartośc skrzyni jest pusta
{
col = RGBAToZColor(255,255,255,255); //white
};
}
else if Hlp_Is_oCMobDoor(her.focus_vob)
{
if (Door._oCMobLockable_bitfield & oCMobLockable_bitfield_locked)
{
//chest._oCMobLockable_bitfield = oCMobLockable_bitfield_autoOpen;
col = RGBAToZColor(255,0,0,255); //Orange zły
zamkniety = 1;
//Print("drzwi zamknięta!");
}
else
{
col = RGBAToZColor(255,255,255,255);
if (zamkniety == 1)
{
//Print("drzwi otwarta!");
zamkniety = 0;
};
};
};
ptr = MEM_Alloc(4);
MEM_WriteInt(ptr, col);
CALL_IntParam(ptr);
CALL__thiscall(MEM_ReadInt(screen_offset), zCView_SetFontColor_offset);
MEM_Free(ptr);
};
func void SetChoiceBoxScale ()
{
var int ptr; ptr = MEM_ReadInt(MEMINT_oCInformationManager_Address+28);
MEM_WriteInt (ptr+64, STR_ToInt (MEM_GetGothOpt ("VIDEO", "zVidResFullscreenY")));
Print_GetScreenSize(); //Pobiera rozdzielczość ekranu
};
func void UpdateStatus_FocusName() {
//const int zCView_SetFontColor_offset = 7339392; //6FFD80 thiscall(zCColor)
var int col;
var int att;
//var int Trade_WEAPON_Mul;
var oCNpc her; her = Hlp_GetNpc(hero);
if (Hlp_Is_oCNpc(her.focus_vob)) {
var oCNpc oth; oth = MEM_PtrToInst(her.focus_vob);
att = oth.attitude; //edit było pierwotnie
//att = Npc_GetAttitude (oth,hero);
if ( (!Npc_IsDead (oth))&&
((Npc_IsInRoutine(oth, ZS_GUIDEPC) == TRUE)
||(Npc_IsInRoutine(oth, ZS_FOLLOWPC) == TRUE)
||(Npc_IsInRoutine(oth, ZS_FOLLOWMODE) == TRUE)) )
&&(STR_ToInt(MEM_GetModOpt("UPDATE_PACK", "ColoredNames_enabled")))
{
col = RGBAToZColor(128,255,255,255); // niebieski partymemebr
}
else if
(!Npc_IsDead (oth))
&&((att == ATT_FRIENDLY) || (oth.npctype == NPCTYPE_FRIEND))
&& (!((self.id > 1357)&&(self.id < 1371)))//szaleni nowicjusze
{
col = RGBAToZColor(0,255,0,255); //zielony to przyjaciel
}
else if ( (!Npc_IsDead (oth))&&(att == ATT_ANGRY)
{
col = RGBAToZColor(255,180,0,255); //Orange zły
}
else if ( (!Npc_IsDead (oth))
&& (att == ATT_HOSTILE))
|| ((self.id > 1357)&&(self.id < 1371))//szaleni nowicjusze
{
col = Focusnames_Color_Hostile();
//col = RGBAToZColor(255,0,128,255); //czerwony wróg
}
else if(att == ATT_NEUTRAL)
{
col = RGBAToZColor(255,255,255,255); //Weiß
};
}
else
{
col = RGBAToZColor(255,255,255,255); //Weiß
};
var int ptr; ptr = MEM_Alloc(4);
MEM_WriteInt(ptr, col);
CALL_IntParam(ptr);
CALL__thiscall(MEM_ReadInt(screen_offset), zCView_SetFontColor_offset);
MEM_Free(ptr);
Status_Chest();
SetChoiceBoxScale();
};
/*
* Ensure that all necessary LeGo packages will be loaded without breaking already loaded LeGo packages
*
* Caution: When re-using this function elsewhere, it is important to rename it to prevent clashes!
* Each ninja patch that needs it, has to have their own function with a unique name. Otherwise they cannot be stacked.
*/
func void Ninja_G1Patch_MergeLeGoFlags(var int flags) {
const int isInitialized = 0; // Once per session
var int isLoaded; // Once per game save
// Check if LeGo is already used and initialized by the underlying mod
const int MOD_USES_LEGO = -1;
if (MOD_USES_LEGO == -1) {
MOD_USES_LEGO = _LeGo_Init; // Yes/No
};
// Only perform the merging of flags if LeGo is initialized by the underlying mod
if (MOD_USES_LEGO) {
// Already initialized packages
var int currentFlags; currentFlags = _LeGo_Flags;
// Find necessary packages that have not been initialized yet
LeGo_InitFlags(flags);
var int missingFlags; missingFlags = _LeGo_Flags & ~currentFlags;
// Reset the loading indicator
_LeGo_Loaded = isLoaded;
// Re-initialize LeGo, but only with the remaining flags (so that nothing is done twice)
if (!isInitialized) {
LeGo_InitGamestart(missingFlags);
};
LeGo_InitAlways(missingFlags);
_LeGo_Loaded = 1;
// Finally update _LeGo_Flags (only for reference)
LeGo_InitFlags(currentFlags | flags);
} else {
// Otherwise (LeGo is not used by the underlying mod), initialize it here
LeGo_Init(flags);
};
// Set the indicators
isInitialized = 1;
isLoaded = 1;
};
/*
* Init-function called by Ninja
*/
func void Ninja_G1Patch_Init() {
// This function is useful to ensure correct LeGo initialization without breaking the mod
Ninja_G1Patch_MergeLeGoFlags(G1Patch_LEGO_FLAGS);
// Initialize GFA
HookEngineF(oCGame__UpdateStatus, 8, UpdateStatus_FocusName);
};
Geändert von pawbuj (22.09.2018 um 19:37 Uhr)
-
Zitat von pawbuj
Seems I am doing something wrong cause not works.
You'll need to be more specific then this. Is it crashing? Is there an error? Is there no change in the game?
From your code it looks like you are missing the constant G1Patch_LEGO_FLAGS. If it is not defined elsewhere and you have not received an error, Ninja is not parsing your scripts. How did you set it up?
-
Zitat von mud-freak
You'll need to be more specific then this. Is it crashing? Is there an error? Is there no change in the game?
From your code it looks like you are missing the constant G1Patch_LEGO_FLAGS. If it is not defined elsewhere and you have not received an error, Ninja is not parsing your scripts. How did you set it up?
The problem is I do not see any changes. No errors, no crashes.
My script of changes is OK, I have tested many times. I do some error with creating a vdf package or/and implementing with ur code..
Could u look into file attached please?
https://www.sendspace.com/file/bbbwat
Geändert von pawbuj (23.09.2018 um 17:26 Uhr)
-
Zitat von pawbuj
The problem is I do not see any changes. No errors, no crashes.
My script of changes is OK, I have tested many times. I do some error with creating a vdf package or/and implementing with ur code..
Could u look into file attached please?
https://www.sendspace.com/file/bbbwat
Please have a look at the first and second post of this forum thread again. There is a detailed description/graph of the file tree within the VDF.
Some of the files you have in the "Ninja" subdirectory have to be in the base directory.
The name of the VDF has to match the patch name, i.e. "Ninja_G1PATCH.vdf".
Some issues with the files:- The constant that I mentioned above is still missing.
- Some of the LeGo-files have to be renamed:
Code:
__BUTTONS_NINJA_WORKAROUND.D -> __BUTTONS_NINJA_G1PATCH.D
__VIEW_NINJA_WORKAROUND.D -> __VIEW_NINJA_G1PATCH.D
The contents of the file HEADER.SRC has to be adjusted accordingly (lines 27 and 34).
- You should remove the comment
in line 236 of NINJA_G1PATCH_INITCONTENT.D. This is very misleading.
-
Thank you for review but I can not fix one point. Rest is fixed.
"The constant that I mentioned above is still missing."
How to define that? just place above my code const int G1Patch_LEGO_FLAGS = 1; ?
I can not find similar constant in other Ninja examples/
Geändert von pawbuj (23.09.2018 um 18:28 Uhr)
-
That constant should hold the LeGo flags that you need to use your script.
It is equivalent to the usual LeGo initialization:
Code:
LeGo_Init(/* ... */);
Here it is important that you only use the packages that you really need.
-
Zitat von mud-freak
That constant should hold the LeGo flags that you need to use your script.
It is equivalent to the usual LeGo initialization:
Code:
LeGo_Init(/* ... */);
Here it is important that you only use the packages that you really need.
fOUND IT.
I get errors like missing ";" so we are in good way.
Thanks @Szapp
-
hätte noch einen vorschlag für ein ninja patch. ein patch der den hero 2hwaffen die 1h animationen nutzen lässt, ambesten per ingame toggle.
marvin zeitanzeige ohne marvin modus.
und falls möglich das händler nach dem ersten öffen des warenmenüs nicht gleich die besten waffen ausrüsten sondern bei ihren standard waffen bleiben.
und falls möglich für g1 das dort das zaubercasting wie in g2 funktioniert, also ohne dauerdrücken etc.
ps: acho übrigens im startpost fehlt noch eine verlinkung zum ninjypatch von benjaminfoo für den g2 sprintmod, nur der vollständigkeit halber.
🎵 ... Kampfkraft und Wendigkeit sind die Vorraussetzung für jeden Kämpfer ... 🎶
-
Die Idee mittels eines Ninja Patches Heil-/ Manatränke und ggf. gebratenes Fleisch prozentual Leben regenerieren zu lassen finde ich super, das fehlt mir in einigen Mods doch sehr.
Ich hätte da noch eine Frage zum "freien Zielen" und zwar habe ich das mit der Minimodbalance ausprobeirt (installation über Spine) und das Fadenkreuz sieht nie so aus wie in den Videos... Das freie Zielen "funktioniert" zwar, aber es sieht halt völlig anders aus und scheint mir in dessen Funktionalität eingeschränkt zu sein?
Edit: Ein weiteres cooles Feature wäre ein Ninjapatch, der die Golemherzen aus Gothic1 wieder einfügt
Geändert von VaNaDiN (10.10.2018 um 09:07 Uhr)
-
Zitat von VaNaDiN
Ich hätte da noch eine Frage zum "freien Zielen" und zwar habe ich das mit der Minimodbalance ausprobeirt (installation über Spine) und das Fadenkreuz sieht nie so aus wie in den Videos... Das freie Zielen "funktioniert" zwar, aber es sieht halt völlig anders aus und scheint mir in dessen Funktionalität eingeschränkt zu sein?
Das habe ich mal im entsprechenden Thread beantwortet.
-
Ninja ist jetzt ein Jahr alt
Am Moddertreffen stelle ich Ninja 2.0 vor. Dieses ist leichter zu handhaben und sichert bessere Kompatibilität. Danach überschwemme ich euch mit einem Haufen von spannenden neuen Patches, die nur darauf warten veröffentlicht zu werden.
-
12.03.2019 12:00
#59
Wie die Zeit vergeht - freue mich schon auf Version 2.0 des Projekts (und die Patches)!
-
Zitat von mud-freak
Ninja ist jetzt ein Jahr alt
Am Moddertreffen stelle ich Ninja 2.0 vor. Dieses ist leichter zu handhaben und sichert bessere Kompatibilität. Danach überschwemme ich euch mit einem Haufen von spannenden neuen Patches, die nur darauf warten veröffentlicht zu werden.
Glückwunsch zum Jubiläum.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|