|
-
Vob_GetdistToVob?
Es gibt ja Npc_GetDistToNpc. Gibt es auch irgendwo eine allgemeinere Funktion?
Ich platziere Vobs frei in der Welt und möchte so herausfinden ob z.b. das vob x unter dem vob y platziert wurde um es anders zu behandeln. Genau gesagt geht es um gras das unter schützenden Anhöhen / vobs schneller trocknet.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Nicht direkt eine Antwort auf deine Frage, aber eventuell gibt es in Verbindung mit z.B. GothicFreeAim passende ray tracing Methoden, mit denen du ermitteln kannst, ob es oberhalb des Items Kollision mit etwas gibt.
-
Npc_GetDistToNpc beachtet sowieso nur die horizontalen Dimensionen (glaube ich), wäre also ziemlich ungeeignet.
Die Distanz zwischen den beiden Punkten P = (xP, yP, zP) und Q = (xQ, yQ, zQ) kannst du aber einfach berechnen:
dist(P, Q) = sqrt((xP-xQ)² + (yP-yQ)² + (zP-zQ)²)
Danach brauchst du natürlich noch den Winkel. In den Trafo-Skripten (irgendwas mit TRF als Präfix bei den Funktionen) gibt es dazu aber glaube ich schon was.
-
Ah schön dich zu sehen. Ich nehme an die xyz muss ich schlicht mit den Werten aus der trafo füllen. Aber warum muss ich die Wurzel ziehen? Ist das so ein math. Konstrukt das man einfach nicht hinterfragt?
Edit ich seh grad das ist ja ne standardformel die ich sogar aus der schule kenne. Aufm handy überliest man schnell ne klammer.
Edit2 wozu brauch ich den Winkel? Meine vobs werden alle brav im 90 grad winlel aufgestellt.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Geändert von Bisasam (16.06.2019 um 20:03 Uhr)
-
Zitat von Bisasam
Ah schön dich zu sehen. Ich nehme an die xyz muss ich schlicht mit den Werten aus der trafo füllen. Aber warum muss ich die Wurzel ziehen? Ist das so ein math. Konstrukt das man einfach nicht hinterfragt?
Edit ich seh grad das ist ja ne standardformel die ich sogar aus der schule kenne. Aufm handy überliest man schnell ne klammer.
Edit2 wozu brauch ich den Winkel? Meine vobs werden alle brav im 90 grad winlel aufgestellt.
Winkel: 1m weit weg nach rechts ist in deinem Fall anders zu behandeln als 1m weit weg nach unten.
Etwas, das du eventuell beachten möchtest: du wirst die Entfernung zu einem Punkt des Vobs berechnen. Aber die meisten Vobs haben auch eine horizontale Ausdehnung, die du beachten möchtest. Wenn das Vob ein Hausdach ist, ist es ja nicht nur unter dem Mittelpunkt des Daches geschützt, sondern auch an anderen Stellen, über denen das Dach ist.
-
Und da wird das ganze wieder kompliziert...
Ich seh mir mal an ob ich die Punktberechnung überhaupt kriege. Vielleicht komm ich dann auch selbst auf ne gute Lösung.
Wäre es denn vllt einfacher, eine bounding box kollision abzufragen?
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Mud freak hat ja auch irgendwie heraus bekommen, wo ein Pfeil hin fliegt und stecken bleiben kann...
-
Ich hab mal für meine Survialmod ein Skript geschrieben welches prüft ob ein VOB vorm Regen geschützt ist.
Code:
// Ist glaub ich von Sektenspinner aus den Irrwichtelskripten
/* Traceray-Flags (e.g. for zCWorld::TraceRayNearestHit)
* Die Flags die übergeben werden können sollten folgende Bedeutung haben: */
const int zTRACERAY_VOB_IGNORE_NO_CD_DYN = 1<<0; //Vobs ohne Kollision ignorieren
const int zTRACERAY_VOB_IGNORE = 1<<1; //Alle Vobs ignorieren (nur statisches Mesh beachten)
const int zTRACERAY_VOB_BBOX = 1<<2; //Test auf Boundingboxen von Vobs (schneller als "richtiger" Schnitttest)
const int zTRACERAY_STAT_IGNORE = 1<<4; //Statische Welt ignorieren (nur Vobs beachten)
const int zTRACERAY_STAT_POLY = 1<<5; //Ein Zeiger auf das Schnittpolygon (falls es eines gibt) wird im Tracerayreport abgelegt.
const int zTRACERAY_STAT_PORTALS = 1<<6; //Schnitte mit Portalen werden auch als Schnitte gewertet
const int zTRACERAY_POLY_NORMAL = 1<<7; //Ermittle auch normale des Schnittpolygons
const int zTRACERAY_POLY_IGNORE_TRANSP = 1<<8; //Ignoriere Materialien mit Alphatextur
const int zTRACERAY_POLY_TEST_WATER = 1<<9; //Auch Wasser ist ein Schnitt.
const int zTRACERAY_POLY_2SIDED = 1<<10; //Kein Backfaceculling
const int zTRACERAY_VOB_IGNORE_CHARACTER = 1<<11; //Ignoriere Npcs
const int zTRACERAY_FIRSTHIT = 1<<12; //Irgendein Schnittpunkt genügt. Schneller als den nächsten Schnittpunkt ausrechnen.
const int zTRACERAY_VOB_TEST_HELPER_VISUALS = 1<<13; //Auch Helpervisuals können getroffen werden
const int zTRACERAY_VOB_IGNORE_PROJECTILES = 1<<14; //Ignoriere Projektile
func int TraceRay(var int startVec, var int dirVec, var int flags) {
const int zCWorld__TraceRayNearestHit = 6429568; //621B80
//int __fastcall (class zVEC3 const &, class zVEC3 const &, class zCArray<class zCVob *> const *, int)
CALL_IntParam(flags);
CALL_PtrParam(0); //ignore no vobs
CALL_PtrParam(dirVec);
CALL__fastcall(MEM_InstGetOffset(MEM_World), startVec, zCWorld__TraceRayNearestHit);
return CALL_RetValAsInt();
};
func void GetPositionWorldVec(var int vobPtr, var int vecPtr) {
var zCVob vob; vob = MEM_PtrToInst(vobPtr);
MEM_WriteIntArray(vecPtr, 0, vob.trafoObjToWorld[3]);
MEM_WriteIntArray(vecPtr, 1, vob.trafoObjToWorld[7]);
MEM_WriteIntArray(vecPtr, 2, vob.trafoObjToWorld[11]);
};
Code:
func int CheckIfSaveFromRain (var string vobname) {
var zCVob vob; vob = MEM_PtrToInst (MEM_SearchVobByName (STR_Upper (vobname)));
var int pos[3]; var int ray[3];
GetPositionWorldVec(MEM_InstToPtr (vob), _@(pos));
ray[0] = 0; ray[2] = 0; ray[1] = mkf (10000);
if (TraceRay(_@(pos), _@(ray), zTRACERAY_VOB_IGNORE_NO_CD_DYN | zTRACERAY_POLY_IGNORE_TRANSP | zTRACERAY_VOB_IGNORE_CHARACTER)) {
return TRUE;
} else {
return FALSE;
};
};
Ich bin mir aber nicht mehr sicher wie gut es wirklich funktioniert hat. Aber es wär bestimmt schon mal ein guter Anfang.
-
Wusste gar nicht daß du auch mal an sowas gebaut hast, umfi. Gibts da nen thread zu? Bastelst du da grad noch dran?
Das Skript werde ich ausprobieren. Falls noch was dran ausgebessert werden muss poste ich das aktualisierte mit comment hier rein. Vielen herzlichen Dank
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Zitat von Bisasam
Wusste gar nicht daß du auch mal an sowas gebaut hast, umfi. Gibts da nen thread zu? Bastelst du da grad noch dran?
Ja gab mal eine Ankündigung: Zum-Tode-verurteilt
Aktuell nicht nein, bin gerade noch an VINV dran, ob ich es später dann mal fertig machen werde, wird sich zeigen.
-
Oh mann du hattest das alles ja schon vor 7 jahren. Und ich dachte ich hätte das rad mal selbst erfunden...
Auf dem letzten moddertreffen wurde gesagt dass es mittlerweile eine möglichkeit gäbe vobs regenundurchlässig zu machen. Ich find dazu aber nix. Weiss jemand was darüber?
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Das gibt's im ScriptBin:
Code:
func void rainThroughVobs(var int bool) {
MemoryProtectionOverride(6169210, 4);
if (!bool) {
// bool == false -> Es regnet nicht mehr durch
MEM_WriteByte(6169210, 224);
} else {
MEM_WriteByte(6169210, 226);
};
};
Einmal pro Session mit 'true' aufrufen.
-
Danke dir. Ist die magic number für g1 und g2 gleich?
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Höchst unwahrscheinlich. Wenn du das für Gothic 1 brauchst, muss sich da jemand nochmal ransetzen und gucken ob er die selbe Stelle auch in der Gothic1 Exe findet.
-
6000804 für Gothic 1 in zCOutdoorRainFX::CreateParticles(). Denke mal gleiche Werte die man patchen will, zumindest der standard übergebene Wert ist gleich in G1 vs G2.
@Lehona:
War ganz einfach Einfach die gleiche Funktion in G1 in IDA gesucht und eben runtergescrolled.
-
Danke für die schnelle entschlüsselung withmorten. Der code von umfi müsste aber ohne änderungen nutzbar sein. Ich erkenn auf den ersten blick jedenfalls keine magic number.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Doch, TraceRayNearestHit (übrigens die Funktion die aufgerufen wird bei der anderen Adresse in Gothic1/Gothic2, bzw die Adresse ist ein Parameter für die Funktion), muss eine andere Adresse sein.
Einen Moment ... das ist 6243008 in Gothic 1, Hex 5F42C0.
-
Der Einsatz der Funktion sorgt in G1 für einen sofortigen Access-Violation sobald es anfängt zu regnen. Reproduzierbar. Als Grund wird bloß der Versuch des Schreibens an die Adresse angegeben.
In G2 funktioniert es dagegen Tadellos. Ich habe in die obige Funktion MEM_SwitchG1G2 eingebaut mit den entsprechenden Werten und bin daher sicher, dass ich die richtige Adresse übergeben habe.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Hast du auch daran gedacht den Parameter bei MemoryProtectionOverride mit dem Switch zu versehen?
-
Zitat von Bisasam
Es gibt ja Npc_GetDistToNpc. Gibt es auch irgendwo eine allgemeinere Funktion?
Ich platziere Vobs frei in der Welt und möchte so herausfinden ob z.b. das vob x unter dem vob y platziert wurde um es anders zu behandeln. Genau gesagt geht es um gras das unter schützenden Anhöhen / vobs schneller trocknet.
Da es scheinbar noch nicht verlinkt wurde...
Vob_GetDistToVob gibt es dank Sekti..
Npc_GetDistToNpc: Distanz zwischen zwei Vobs.
https://forum.worldofplayers.de/foru...1#post16955344
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|