-
Zitat von Oparilames
Kennt jemand von euch, eine Möglichkeit AI_-Befehle sofort auszuführen, ohne dass sie in die AI-Quene eingefügt werden?
Theoretisch kann man die korrespondierende Engine-Funktion aufrufen, aber ich weiß nicht, ob das ohne den passenden Kontext so einfach funktioniert. Je nach Funktion gibt es aber auch eine Version, die sich nicht in die Queue einreiht.
-
Was wäre der Unterschied zu:
Npc_ClearAIQueue(self);
AI_*
Mehr als sofort anfangen geht ja sowieso nicht, AI-Befehle sind ja in der Regel so, dass es eine Weile braucht sie auszuführen.
-
Zitat von Sektenspinner
Was wäre der Unterschied zu:
Npc_ClearAIQueue(self);
AI_*
Mehr als sofort anfangen geht ja sowieso nicht, AI-Befehle sind ja in der Regel so, dass es eine Weile braucht sie auszuführen.
Vielleicht soll die AI-Queue nicht gelöscht werden, außerdem gibt es Befehle wie AI_EquipArmor() etc., die instantan ausgeführt werden könnten.
-
Today, dabbling with scripts, made a couple of interesting features. Maybe someone will need.
The first two functions are not as good as Hook_Damage() (made by Lehona), but anyone can enjoy.
Code:
//Only for Melee Weapon, need reinit in init_global
func void Npc_GetDamageMultiplier(var C_NPC slf,var int pos)
{
var int DamMultiplier; //float
CALL_RetValIsFloat();
CALL__thiscall(MEM_InstToPtr(slf),7729904); //0075F2F0
DamMultiplier = CALL_RetValAsFloat(); //return hex (float32). Need to convert to float
//For_TEST:
PrintScreen(Float32ToString(DamMultiplier),1,pos,Font_ScreenSmall,6);
};
func void Npc_SetDamageMultiplier(var C_NPC slf, var int multiplier)
{
CALL_FloatParam(mkf(multiplier));
CALL__thiscall(MEM_InstToPtr(slf),7729920); //0075F300
};
And this function kills the victim (vict). Kills - (slf)
Equivalently, as if it happened in the battle.
Code:
func void Npc_DoDie(var C_NPC vict, var C_NPC slf)
{
CALL_PtrParam(MEM_InstToPtr(slf));
CALL__thiscall(MEM_InstToPtr(vict),7563104); //00736760
};
-
Ich versuch grad eine bilibige FK waffe die gezogen ist zu verändern.
Sequenz: Waffe ablegen, waffe verändern, Waffe anlegen, waffe ziehen.
Waffe anlegen schaft G2 mit den external ja nicht, daher hab ich versucht das ikarus beispiel zu verwenden:
http://forum.worldofplayers.de/forum...1#post15341275
das funktioniert bei mir aber nicht.
wenn ich EquiqWeapon nutze, sind die Wafen zwar wieder angelegt, aber:
a) FK waffe hat keien änderung
b) NK waffe ist nur optisch im inventar angelegt, weder ist die waffe am Körper sichtbar, noch einsatzbereit -> Held nutzt Fäuste
da ich die ganzen Sicherheitsabfragen eh nicht brauch, hab ich nur mal die beiden letzten CAL zeilen genutzt, nun stÜrzt G2 mit Fehler ab:
00:58 Fault: 0 Q: [start of stacktrace]
00:58 Fault: 0 Q: ASMINT_CALLMYEXTERNAL() + 5 bytes
00:58 Fault: 0 Q: ASM_RUNONCE() + 77 bytes
00:58 Fault: 0 Q: CALLINT_MAKECALL(7577648, 0) + 263 bytes
00:58 Fault: 0 Q: CALL__STDCALL(7577648) + 21 bytes
00:58 Fault: 0 Q: CALL__THISCALL(384824288, 7577648) + 73 bytes
00:58 Fault: 0 Q: EVT_TAGEBUCH() + 483 bytes
00:58 Fault: 0 Q: [end of stacktrace]
Ref-Counter != 0 after vertexbuffer release! .... <zError.cpp,#474>
EVT_Tagebuch ist die Funktion wo das Problem entsteht:
Code:
if (MEM_KeyPressed(KEY_p) == KEY_PRESSED)
{
FK_Waffe = Npc_GetEquippedRangedWeapon(Hero);
if Npc_HasReadiedRangedWeapon (hero)
{ NK_Waffe = Npc_GetEquippedMeleeWeapon(hero);
AI_UnequipWeapons (hero);
AI_RemoveWeapon (hero);
If pfeil_nummer ==0 {FK_Waffe.munition=ItRw_Special_MagicArrow; pfeil_nummer =1; PrintScreen ("Magischer Pfeil.", -1,-1, FONT_ScreenSmall ,2);}
else if pfeil_nummer ==1 {FK_Waffe.munition=ItRw_ShrinkArrow; pfeil_nummer =2; PrintScreen("Zoom Pfeil", -1,-1, FONT_ScreenSmall ,2);}
else if pfeil_nummer ==2 {FK_Waffe.munition=ItRw_Special_FireArrow; pfeil_nummer =3; PrintScreen ("Brand Pfeil.", -1,-1, FONT_ScreenSmall ,2);}
else if pfeil_nummer ==3 {FK_Waffe.munition=ItRw_Arrow; pfeil_nummer =0; PrintScreen ("normaler Pfeil", -1,-1, FONT_ScreenSmall ,2);};
CALL_PtrParam(MEM_InstToPtr(NK_Waffe));
CALL__thiscall(MEM_InstToPtr(hero), oCNpc__EquipWeapon);
CALL_PtrParam(MEM_InstToPtr(FK_Waffe));
CALL__thiscall(MEM_InstToPtr(hero), oCNpc__EquipWeapon);
//EquipWeapon (hero, NK_Waffe);
//EquipWeapon (hero, FK_Waffe);
//AI_ReadyRangedWeapon (hero);
}
else
{
If pfeil_nummer ==0 {FK_Waffe.munition=ItRw_Special_MagicArrow; pfeil_nummer =1; PrintScreen ("Magischer Pfeil.", -1,-1, FONT_ScreenSmall ,2);}
else if pfeil_nummer ==1 {FK_Waffe.munition=ItRw_ShrinkArrow; pfeil_nummer =2; PrintScreen("Zoom Pfeil", -1,-1, FONT_ScreenSmall ,2);}
else if pfeil_nummer ==2 {FK_Waffe.munition=ItRw_Special_FireArrow; pfeil_nummer =3; PrintScreen ("Brand Pfeil.", -1,-1, FONT_ScreenSmall ,2);}
else if pfeil_nummer ==3 {FK_Waffe.munition=ItRw_Arrow; pfeil_nummer =0; PrintScreen ("normaler Pfeil", -1,-1, FONT_ScreenSmall ,2);};
};
};
Prinzipell brauch ich ja nur etwas was für das "vollständige" verlassen des Kampfmoduses sorgt, da der Teil, wo die Waffe nicht gezogen ist, funktioniert. Reines wegstecken der Waffe reicht nicht.
gruss
Noraser
MOD: JURAN 1.4.6 Juran 1.5 Fertig: Sprachdateien 99%, Videos 50%, Weg der Magie (done), Weg des Geschicks (90%)
Geändert von Noraser (15.10.2013 um 21:40 Uhr)
-
Du benutzt AI_Funktionen, das könnte ein Problem sein. LeGo hat (Un-)Equip Funktionen in der EngineAdr.d, dann brauchst du die nicht selber bauen.
-
Ich hab jetzt mal verschieden Ansätze durchprobiert:
block 1:
Hier hab ich mich an den script für das austauschen von visibles beim ziehen der Waffen (ikarus #3) orientiert.
Der pfeil verschwindet, aber der neue pfeil taucht nicht auf, nach abschuss eines 'leer' pfeils, kommt wieder der alte
block 2:
versuch das script oben auf oCNpc__UnequipItem umzustellen. Hier hab ich gar nix lauffähiges zustande bekommen... Mein fehler scheint zu sein, das ich den pointer nicht auf die Waffe zeige.
block3: letzter versuch von gestern abend. Lief einmal richtig, danach nie wieder... Gothic stürzt mit Fehler in EquipWeapon funktion ab.
das pfeiländern hab ich jetzt ausgelagert, das dieser teil funktioniert, sieht man dadran, das es bei nicht gezogenen Bogen immer funktioniert.
Code:
//FF_ApplyOnceExt(Arrow_Change_key,2000, -1);
if (MEM_KeyPressed(KEY_p) == KEY_PRESSED)
{
var C_ITEM FK_Waffe; FK_Waffe = Npc_GetEquippedRangedWeapon(Hero);
if Npc_HasReadiedRangedWeapon (hero)
{ /*
const int oCNpc__RemoveFromSlot = 7643760; //0x74A270
CALL_IntParam(true); //kill effect
CALL_IntParam(false); //dont drop
CALL_zStringPtrParam("ZS_RIGHTHAND");//pfeil rechts!
CALL__thiscall(MEM_InstToPtr(hero), oCNpc__RemoveFromSlot);
Arrow_Change (FK_Waffe);
const int oCNpc__PutInSlot = 7642288; //0x749CB0
CALL_IntParam(true); //is in inventory
CALL_PtrParam(MEM_InstToPtr(item));
CALL_zStringPtrParam("ZS_RIGHTHAND"); //pfeil rechts!
CALL__thiscall(MEM_InstToPtr(hero), oCNpc__PutInSlot);
*/
var int FK_Waffe1; FK_Waffe1 = Hlp_GetInstanceID(FK_Waffe);
const int oCNpc__UnequipItem = 7546560; //0x7326C0
CALL_IntParam(true); //kill effect
CALL_IntParam(false); //dont drop
CALL_zStringPtrParam("ZS_RIGHTHAND");
CALL__thiscall(MEM_InstToPtr(hero), oCNpc__UnequipItem);
PrintScreen ("bogen weg", -1,-1, FONT_ScreenSmall ,2);
//Arrow_Change (FK_Waffe);
//const int oCNpc__EquipItem = 7545792; //0x7323C0
//CALL_IntParam(true); //is in inventory
//CALL_PtrParam(MEM_InstToPtr(item));
//CALL_zStringPtrParam("ZS_LEFTHAND"); //bogen links!
//CALL__thiscall(MEM_InstToPtr(hero), oCNpc__EquipItem);
/**
//NK_Waffe = Npc_GetEquippedMeleeWeapon(hero);
var int NK_Waffe1;
var int FK_Waffe1;
NK_Waffe1 = Npc_GetMeleeWeapon (hero);
FK_Waffe1 = Npc_GetRangedWeapon (hero);
AI_UnequipWeapons (hero);
AI_RemoveWeapon (hero);
//AI_EquipBestMeleeWeapon (hero);
//AI_EquipBestRangedWeapon (hero);
AI_Function_I ( hero, EquipWeapon, NK_Waffe1);
AI_Function_I ( hero, EquipWeapon, FK_Waffe1);
AI_Function (hero, Arrow_Change);
AI_ReadyRangedWeapon (hero);
**/
}
else
{
Arrow_Change (FK_Waffe);
};
};
MOD: JURAN 1.4.6 Juran 1.5 Fertig: Sprachdateien 99%, Videos 50%, Weg der Magie (done), Weg des Geschicks (90%)
-
Neuling
Hello, I have a problem after use this code:
https://forum.worldofplayers.de/foru...8#post15483138
Gothic crashing (in loading, 80%) and I see DoStack Error (Acces Violation). I have Ikarus 1.2 ver. (Gothic 1).
Thanks for any help.
-
Zitat von QazPL
Those addresses only work for Gothic 2, sorry.
-
Neuling
Is there a script to Gothic 1 in this topic? I would like to see the possibility of Ikarus.
-
Zitat von QazPL
Is there a script to Gothic 1 in this topic? I would like to see the possibility of Ikarus.
Not that I know of. Sadly enough I don't have Gothic 1 installed ony my machine right now, so I can't find the correct adresses for G1.
-
Als Ikarus-Anfänger bin ich mit den ganzen Dingen noch nicht so vertraut. Ich möchte auch lediglich ein kleines Feature umsetzen, klappt aber leider nicht. Vielleicht erkennt jemand von euch sofort den Fehler.
Es geht mir um die Gamma-Korrektur (Hauptmenu -> Einstellungen -> Video -> Helligkeit, Kontrast, Gamma).
Eine Get und Set Funktion habe ich in der Tabelle mit den Speicheradressen (habe leider den Author vergessen) gefunden, da steht folgendes:
Code:
virtual float __thiscall zCRnd_D3D::Vid_GetGammaCorrection(void) 0x00659610 0 6 public: virtual float __thiscall zCRnd_D3D::Vid_GetGammaCorrection(void)
Also habe ich an einer beliebigen Stelle (Dialog) folgendes eingebaut:
Code:
//zCRnd_D3D::Vid_GetGammaCorrection(void)
const int GetGammaCorrection = 6657552; //0x00659610
//zCRnd_D3D::~zCRnd_D3D(void)
const int zCRnD_D3D = 6595952; //0x0064A570
CALL_RetValIsFloat();
CALL__thiscall (zCRnD_D3D, GetGammaCorrection);
print (IntToString( CALL_RetValAsFloat () ));
Der Wert ändert sich jedoch nicht, wenn die Einstellungen im Menu ändere. Mit SetGammaCorrection bekomme ich nicht mehr als einen Absturz hin. Anzumerken wäre vielleicht noch, dass die Get-Funktion einen virtual float liefert, die Set-Funktion aber 3 floats will.
Ist mein Vorgehen grundsätzlich richtig?
-
Das erste Problem wäre mal, dass du die Adresse der Destruktor-Funktion benutzt, anstelle der Adresse des zCRnd_D3D-Objekts Wo und ob du die richtige this-Adresse leicht rausfinden kannst, weiß ich so mal eben nicht.
-
Die Adresse die der constructor bei mir zurückgibt ist:
Code:
const int zCRnD_D3D = 2129199156; //0x7EE90034
Damit kommen bei mir beim einstellen des Gamma Wertes Werte von [0,1] raus.
These days, most of my projects can be found on github.
-
So funktioniert das also...
Habe die Werte jetzt umstellen können, vielen Dank!
-
Wahrscheinlich bin ich einfach nur vernagelt, aber wie zur Hölle bekomme ich den String, wenn ich nur einen Zeiger auf einen habe?
Code:
str = _^(_@s(str2));
Das geht ja nicht. Jedenfalls nicht in dem Kontext, den ich vorliegen habe (Pointer von Strings werden an Liste übergeben und dann wieder ausgelesen und konvertiert)
Könnt ihr mir helfen?
Grüße
-
Auf dem Haney bekomme ich den Code gerade nicht zusammen, aber dir ist bewusst, dass die Zeiger ein speichern/laden nicht unbedingt überleben? Wenn du die "dauerhaft" speichern willst, musst du sie selber sichern - ich kann dir heute Nachmittag den Code dazu zeigen.
-
-
Dann frage ich mich, warum du eine Liste brauchst Aber egal, da gibt es sicherlich einige Gründe für.
Hast du zString* oder char*? In letzterem Fall würde folgende Funktion funktionieren:
Code:
func string zString_zString(var int charPtr) {
const int zString__zString = 4198592; //0x4010C0
CALL_PtrParam(charPtr);
var int strPtr; strPtr = MEM_Alloc(20);
CALL__thiscall(strPtr, zString__zString);
return CALL_RetValAszString();
};
Wenn du bereits einen zString* hast, dann sollte folgendes funktionieren:
Code:
var string s; s = MEM_ReadString(strPtr);
-
Zitat von Lehona
Dann frage ich mich, warum du eine Liste brauchst Aber egal, da gibt es sicherlich einige Gründe für.
Hast du zString* oder char*? In letzterem Fall würde folgende Funktion funktionieren:
Code:
func string zString_zString(var int charPtr) {
const int zString__zString = 4198592; //0x4010C0
CALL_PtrParam(charPtr);
var int strPtr; strPtr = MEM_Alloc(20);
CALL__thiscall(strPtr, zString__zString);
return CALL_RetValAszString();
};
Wenn du bereits einen zString* hast, dann sollte folgendes funktionieren:
Code:
var string s; s = MEM_ReadString(strPtr);
Habe beides probiert.
1.:
Code:
var string s; s = "A";
var int ptr; ptr = _@s(s);
Print(zString_zString(ptr))
Der Print liefert nur, dass das d durchgestrichen und ae zusammen als ein Zeichen gefasst ist, also Quatsch.
2.:
Code:
var string s; s = "A";
var int ptr; ptr = _@s(s);
var zString zs; zs = _^(ptr);
s = MEM_ReadString(zs.ptr);
Print(s)
Da liefert der Print gar nichts, s = ""
Was mache ich falsch?
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|