-
Verbindung zwischen Waypoints mit Skripten aufheben
Hallo, ich hab folgendes Problem, in meiner Modifikation ändert sich das Aussehen der Welt dynamisch.
In einer aktuellen Situation ist ein Weg nicht mehr passierbar, da er versperrt ist. Den NPCS ist das aber egal und die versuchen sich da irgendwie rüber/durch zu buggen.
Darum dachte ich mir, wenn ich diese Verbindung im Waynet auflöse, werden sie dann einen alternativen Weg nehmen.
Jedoch frag ich mich wie ich das angehen soll.
Jemand Vorschläge?
-
Wenn du Ikarus vermeiden willst. Würde ich ihn über zwei Wegpunkte laufen lassen.
Da du ihn um den versperrten Weg herum führen willst, machste einmal nen TA wechsel, wo du den Npc zu einem WP führst, der nicht auf dem versperrten Weg liegt. und dann etwa sowas in einer Framefunktion/EVENT abfragst.
Code:
if (Npc_GetDistToWp(npc, "WP_AUßERHALB_DES_VERSPERRTEN_WEGES") < 500 || Npc_GetDistToNpc(npc, hero) < 3000){
B_StartOtherRoutine(npc, "TAzumursprünglichenZielWP");
}
Dadurch wird das event dann auch ausgeführt, wenn der Npc zu weit vom helden weg ist und wird gleich zum ziel wp geportet. Ansonsten geht er vom ersten umwegwp zum Ziel.
-
Hm diese Lösung ist nicht ganz optimal... aber ich werde sie im Hinterkopf behalten.
Mal angenommen ich lösche einen der Verbindungswegpunkte, würde Gothic das checken?
Also zb so:
WP_A ----- WP_X ----- WP_B, wenn ich jetzt WP_X lösche sollte ja auch die Verbindung zwischen den WP_A und WP_B weg sein un der NPC versucht einen anderen Weg um zu WP_A zu kommen?
-
Damit könntest du es versuchen:
Code:
.text:007B01B0 ; public: class zCWay * __thiscall zCWaypoint::HasWay(class zCWaypoint *)
.text:007B0150 ; protected: void __thiscall zCWaypoint::RemoveWay(class zCWay *)
-
Ich hab es mal versucht.
Dabei hab ich die Funktion SearchWaypointByName verwendet.
zCWay * __thiscall zCWaypoint::HasWay(zCWaypoint *) |
0x007B01B0 |
void __thiscall zCWaypoint::RemoveWay(class zCWay *) |
0x007B0150 |
Code:
func void deleteWay()
{
VAR zCWaypoint meinWp; MEM_AssignInst (meinWp, SearchWaypointByName("OC1"));
var int meinWpPointer; meinWpPointer = MEM_InstToPtr(meinWp);
CALL_IntParam(meinWpPointer);
CALL__thiscall(MEM_InstToPtr(meinWp), 8061360);
var oCWay meinWay;
meinWay = CALL_RetValAsStructPtr();
var int meinWayPointer; meinWayPointer = MEM_InstToPtr(meinWay);
CALL_IntParam(meinWayPointer);
CALL__thiscall(MEM_InstToPtr(meinWp), 8061264);
};
Das Spiel stürzt nicht ab, aber sonst passiert auch nichts. Getestet hab ich mit Marvin "toogle waynet"
Hab ich evt einen offensichtlichen Fehler im Code?
-
So direkt sieht das richtig aus. Aber ich glaube, das WayNet ist quasi eine zusätzliche Entität, das sieht doch vielversprechender aus:
Code:
.text:007AD2B0 ; public: void __thiscall zCWayNet::DeleteWaypoint(class zCWaypoint *)
//oder
.text:007AD4F0 ; public: void __thiscall zCWayNet::DeleteWay(class zCWaypoint *, class zCWaypoint *)
Es gibt in Ikarus die globale Instanz MEM_Waynet.
SearchWaypointByName() kann ich übrigens nicht finden, das wurde glaube ich nur irgendwo hier im Forum gepostet? Musst aufpassen, dass du auch tatsächlich ein zCWayPoint bekommst und nicht oCWayPoint oder das Vob vom Waypoint.
-
Super! Vielen Dank für die Hilfe, haut hin.
Hier das Skript falls es jemand benötigt, ihr benötigt aber auch die Funktion SearchWaypointByName von mud-freak.
Code:
func void deleteWay(var string wp1, var string wp2) {
VAR zCWaypoint _wp1; MEM_AssignInst (_wp1, SearchWaypointByName(STR_Upper(wp1)));
var int _wp1Pointer; _wp1Pointer= MEM_InstToPtr(_wp1);
VAR zCWaypoint _wp2; MEM_AssignInst (_wp2, SearchWaypointByName(STR_Upper(wp2)));
var int _wp2Pointer; _wp2Pointer= MEM_InstToPtr(_wp2);
CALL_IntParam(_wp2Pointer);
CALL_IntParam(_wp1Pointer);
CALL__thiscall(MEM_InstToPtr(MEM_Waynet), 8049904);
};
Geändert von Umfi (08.01.2016 um 07:53 Uhr)
Grund: STR_Upper hinzugefügt
-
Wird das mitgespeichert oder sollte es einmalig pro Session (oder bei jedem Laden?) ausgefuehrt werden?
Und um noch eine moegliche Fehlerquelle bei zukuenftiger Verwendung direkt auszuschliessen: Die WP sollten in GROSSBUCHSTABEN uebergeben werden?
Was passiert, wenn gar keine direkte Verbindung zwischen den beiden WP besteht?
-
Zitat von Milky-Way
Wird das mitgespeichert oder sollte es einmalig pro Session (oder bei jedem Laden?) ausgefuehrt werden?
Es wird mitgespeichert. Einmalige Ausführung reicht das überlebt dann Lade und Neustarts.
Zitat von Milky-Way
Und um noch eine moegliche Fehlerquelle bei zukuenftiger Verwendung direkt auszuschliessen: Die WP sollten in GROSSBUCHSTABEN uebergeben werden?
Gute Idee, ich hab gleich mal STR_Upper() eingefügt.
Zitat von Milky-Way
Was passiert, wenn gar keine direkte Verbindung zwischen den beiden WP besteht?
Nichts
Weitere Ergebnisse von meinem kurzen Test, wenn die Funktion mehrmals für die selben WPs aufgerufen wird passiert auch nichts.
Und die NPCs checken das auch und suchen sich einen neuen Weg.
Sollten doch Fehler auftreten beim testen, werde ich das hier bekannt geben.
-
Ich muss den Thread noch mal aufmachen.
Leider funktioniert der Code nicht mehr.
Code:
[w] 02:28 Warn: 0 X: [RND3D-Destructor]: Can't uninitialize D3DX Utility Library ! Error: D3DXERR_D3DXNOTSTARTEDYET .... <zRndD3D.h,#127>
[i] 02:28 Info: 5 X: [RND3D-Destructor]: D3DXUninitialize done .... <zRndD3D_Render.cpp,#309>
[i] 02:52 Info: 8 C: WM_ACTIVATE received .... <zWin32.cpp,#1720>
[i] 02:52 Info: 8 C: WM_ACTIVATEAPP received .... <zWin32.cpp,#1738>
[i] 02:52 Info: 8 C: WM_ACTIVATEAPP received .... <zWin32.cpp,#1738>
[w] 02:52 Warn: 0 == ===================================== UNHANDLED EXCEPTION OCCURED ====================================================== .... <zError.cpp,#474>
[w] 02:52 Warn: 0 == ============================================ CRASH INFOS: ============================================================== .... <zError.cpp,#474>
[w] 02:52 Warn: 0 Go thic II - 2.6 (fix), Parser Version: 50 .... <zError.cpp,#474>
[w] 02:52 Warn: 0 Us er: Michael, CPUType: 586, Mem: 2048 MB total, 2048 MB free .... <zError.cpp,#474>
[w] 02:52 Warn: 0 Ca mera: Pos(2813.2832/-658.102112/-5377.98145), At(0.587876379/-0.340320766/0.733882248) .... <zError.cpp,#474>
[w] 02:52 Warn: 0 St artup Options: .... <zWin32.cpp,#2976>
[w] 02:52 Warn: 0 -g ame:vinv.ini -zreparse -zwindow -znomusic -znosound -zlog:10,s -zmaxframerate:35
.... <zWin32.cpp,#2977>
[w] 02:52 Warn: 0 == ============================================= CALLSTACK : ============================================================== .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:007B2E1F (0x47766A14 0x43141F9A 0x0135FA9C 0x0A5BAEF4) Gothic2.exe, zCRoute::GetInterpolatedPosition()+127 byte(s), P:\dev\g2addon\release\ZenGin\_ulf\zWaynet.cpp, line 1826+13 byte(s) .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:007758A0 (0x0135FB9C 0x00000009 0x0361CC0C 0x0083C10C) Gothic2.exe, oCRtnManager::GetRoutinePos()+208 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oRoutine.cpp, line 611 .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:007787D2 (0x08A820A4 0x00000000 0x0135FCA0 0x00000000) Gothic2.exe, oCSpawnManager::CheckInsertNpc()+1826 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oSpawn.cpp, line 324+19 byte(s) .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:006C87FB (0x00400000 0x013B3ACB 0x0135FEC4 0x00298000) Gothic2.exe, oCGame::Render()+347 byte(s), P:\dev\g2addon\release\Gothic\_ulf\oGame.cpp, line 2664 .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:00425E6E (0x0082F0EC 0x00000000 0x00020FFA 0x08A820A4) Gothic2.exe, CGameManager::Run()+1598 byte(s), P:\dev\g2addon\release\Gothic\_bert\oGameManager.cpp, line 767+47 byte(s) .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:0078188B (0x0000002C 0x01DA861C 0x0000010D 0x00000000) Gothic2.exe, MainProg()+75 byte(s), P:\dev\g2addon\release\Gothic\_ulf\Phoenix.cpp, line 111 .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:00503270 (0x00400000 0x00000000 0x013B3ACB 0x00000007) Gothic2.exe, HandledWinMain()+928 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1169 .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:00502DFD (0x0135FEC8 0x00000000 0x013B3ACB 0x00000007) Gothic2.exe, WinMain()+141 byte(s), P:\dev\g2addon\release\ZenGin\_carsten\zWin32.cpp, line 1054+17 byte(s) .... <zError.cpp,#474>
[w] 02:52 Warn: 0 00 23:007D43F8 (0x00000004 0x0000FFFF 0x000000B8 0x00000000) Gothic2.exe, WinMainCRTStartup()+224 byte(s) .... <zError.cpp,#474>
[w] 02:52 Warn: 0 == ===================================== UNHANDLED EXCEPTION OCCURED ====================================================== .... <zError.cpp,#474>
Kann jemand von euch damit etwas anfangen?
Im Spiel ist es so mit "toggle waynet" seh ich wie die verbindung entfernt wird, aber kurz drauf kommt es dann zum crash.
EDIT: Wenn ich die Funktion aufrufe aber ich nicht in der Nähe von den WPs bin passiert nichts. Wenn ich mich dann aber zu den WP teleportiere kommt es zum Absturz mit dem gleichen Stacktrace.
Selbest Problem auch bei zCWayNet:: DeleteWaypoint.
Ich denke da brächte man eine Möglichkeit das Waynet und die Routen zu aktualisieren.
Geändert von Umfi (20.09.2018 um 14:38 Uhr)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|