schreiben? Mit DEM Part hab ich Probleme. Ich weiß, es nervt wenn jemand so dumme Fragen stellt. Ich kenn mich damit aber eben nicht so gut aus. Das ist als würdest du "Rechts abbiegen" sagen und ich wüsste nicht mal wie man das Gaspedal bedient
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Aaalso. Mein positionsvektor ist pos[3] den ich dann befüllen und über _@(pos) übergeben muss. Richtig?
Richtig.
Zitat von Bisasam
Meine eigentliche Frage ist, wie ich den Positionsvektor korrekt befülle.
Das weiß ich :P Deswegen hab ich diese Frage ja auch in meinem ersten Post beantwortet Ist vielleicht zwischen den vielen Codeblöcken untergegangen. In den Scripten von mud-freak gibt es bereits die Funktion TrfToPos(), die dir genau diese Werte aus dem Trafo rauskopiert und in den Positionsvektor schreibt. Das musst du dann nichtmehr selber machen. Die genaue Benutzung siehst du weiter unten im letzten Codeblock meines ersten Postes.
Zitat von Bisasam
Muss ich
pos[3]{_@(vob.trafoObjToWorld[3]),_@(vob.trafoObjToWorld[7]),_@(vob.trafoObjToWorld[11])};
schreiben? Mit DEM Part hab ich Probleme.
Du traust Daedalus viel zu viel zu. So wäre es richtig:
Ich habe TrfToPos nicht richtig verstanden. Mir war nicht klar, dass die Funktion doch glatt eine Variable füllt und nicht den Wert einer Variable nimmt. Bin es gewohnt, mit WolfCount 4 zu übergeben statt WolfCount per Funktion mit 4 zu befüllen. Das ist eine Umdenkung, die nötig ist.
Jetzt glaube ich es verstanden zu haben. Wenn ich es getestet habe, kann ich ja ein kurzes Fazit und ggf. eine vereinfachte Funktion des Vorgangs für alle anderen Anfänger und Ottonormaluser schreiben.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Ich habe ein paar Spezialfragen zum Thema Mover und Boundingboxen und Zonen.
Also eine Default-Zone ist ohne Boundingbox wirksam. Die kann man einfach einfügen. Aber wenn ich jetzt eine Music-Zone oder Fog-Zone einfügen will, muss ich die Boundingbox und die Reichweite irgendwie verändern. Aber wie kann ich das im Skript erreichen? Ich hab keine Ahnung, wie man ZBools übergibt oder ändert oder überhaupt abfragt. Und die BBox-Eigenschaft in der Klasse gibt mir keinen Hinweis darüber wie ich damit umzugehen habe.
Außerdem weiß ich nicht wie ich einen Mover mit Bewegungskoordinaten einfüge. Ich wollte automatisch ausrichtende Fischschwärme auf diese Weise einfügen, aber irgendwie weiß ich nicht wie.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Außerdem habe ich festgestellt, dass beim Einfügen eines zweiten Lichts die Lichtfarbe immer rot ist - ich weiß nicht ob das am Setzen des Presets oder am generieren der Weltbeleuchtung liegt. Ich habe die Funktionen wieder aus dem insertAnything-Skript herausgenommen, weil mir das nicht stabil genug ist. Ich lasse die Funktionen aber mal hier, falls jemand anderes sich damit befassen will. Für mich ist hier jetzt erst einmal meine Zeit dafür ausgeschöpft.
Hey, ich befasse mich gerade auch damit. Mir ist aufgefallen, dass im Spacer mit Standard-Einstellungen das einzige Preset mit einem statischen Licht "TEST" heißt und nur rotes Licht mit einer Range von 100 erzeugt. [Bild: presetv81i0y8b.jpg]
Das Preset "AURA" aus deinem Beispiel funktioniert bei mir nur so halb, wahrscheinlich weil es ein Preset für dynamische Lichter ist. Mir ist jedenfalls aufgefallen, dass die eingestellte Range aus dem Preset übernommen wird, nicht aber die Farbe. Die ist bei mir immer rot.
Interessant ist auch der Unterschied zwischen
Wld_GenerateStaticLighting(LIGHT_VERTEX_ONLY, 0);
und
Wld_GenerateStaticLighting(LIGHT_VERTEX_LIGHTMAPS_HIGH, 0);
Ich habe in meinem Testlevel nur einen Raum mit einem Licht. Per Script füge ich zwei weitere Räume mit jew. einem Licht ein.
Im Modus LIGHT_VERTEX_LIGHTMAPS_HIGH verändert das in meinem Testlevel die eingestellten Werte des einzigen Lichts, das per Spacer gesetzt ist und ändert die Farbe in ein helles Blau. Die restlichen Lichter sind rot. Im LIGHT_VERTEX_ONLY Modus wird das Spacer-Licht nicht geändert, aber alle Lichter sind ebenso wieder Rot.
Eigene Presets (im Bild zu sehen -> "PURP") nimmt er übrigens gar nicht und berechnet dann das Licht nicht (ganz schön zickig!).
Dann dachte ich mir, dass man das vllt umgehen kann, indem man sich das Objekt hinter dem lightPtr holt und die Werte selbst ändert und nach stundenlangem rumtesten geht es endlich. Presets braucht man hierbei auch keine mehr.
Ich werde damit jetzt noch etwas weiter rumspielen. Aber zumindest sind jetzt die größten Probleme damit gefixt.
Ein schönes Szenario wäre zB ein kleines Level, bei dem neue Räume zur Laufzeit hinzugefügt werden.
Aber nicht die Baking-Zeit vergessen
Migos
[Bild: spineSignature.php?name=Migos]
Entwickler von Jharkendar-Online Deathmatch & Roleplay (zu finden in Spine).
Komm doch auf unseren Discord und lerne unsere nette Community kennen.
Mal gucken, was gerade entwickelt wird? Hier ist unsere Roadmap.
Ich persönlich löse das Lichtproblem über die Lampenmobs. Ich setze gar keine Lichter mehr über InsertObject.
Lampenmobs erstellen automatisch ein Lightvob während der Laufzeit, das auch immer richtig dargestellt wird.
Aber schön zu sehen, dass Migox sich auch dafür interessiert. Arbeitest du an ner Singleplayer-Mod?
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
Was ist InsertItem? Worauf beziehst du dich? Geht es um das InsertAnything-Skript, siehe hier?
Probier doch mal stattdessen die externe Funktion Wld_InsertItem (erwartet einen Wegpunkt) und schau, ob es damit funktioniert. Ich sehe keinen Grund, dass das mit einem Item-Effekt zu tun haben könnte.
Kannst du mal schauen, ob du die Version des Skripts nutzt die ich verlinkt habe? Da hatte sich über die Zeit immer mal wieder etwas geändert. Speziell: Sehen bei dir die InsertItem-Funktionen so aus?
Spoiler:(zum lesen bitte Text markieren)
Code:
/*
* oCItem functions:
*
* InsertItemWP (string itemInstance, int amount, string waypoint)
* InsertItemPos(string itemInstance, int amount, int* pos, int* dir)
* InsertItem (string itemInstance, int amount, int* trafoMat)
*/
func int InsertItemWP(var string itmInst, var int amount, var string wp){Wld_InsertItem(MEM_GetSymbolIndex(itmInst), wp);
var zCTree newTreeNode; newTreeNode = _^(MEM_World.globalVobTree_firstChild);
var int itmPtr; itmPtr = newTreeNode.data;
if (!itmPtr){
MEM_Warn(ConcatStrings("Could not insert item: ", itmInst));
return 0;
};
var oCItem itm; itm = _^(itmPtr);
itm.amount = amount;
return itmPtr;
};
func int InsertItem(var string itmInst, var int amount, var int trf){
var int itmPtr; itmPtr = InsertItemWP(itmInst, amount, MEM_FARFARAWAY);
AlignVobAt(itmPtr, trf);
return itmPtr;
};
func int InsertItemPos(var string itmInst, var int amount, var int pos, var int dir){
var int trafo[16];
NewTrafo(_@(trafo));
PosDirToTrf(pos, dir, _@(trafo));
var int itmPtr; itmPtr = InsertItem(itmInst, amount, _@(trafo));
SetVobToFloor(itmPtr);
return itmPtr;
};
Darin wird nämlich auch auf Wld_InsertItem zurückgegriffen. Deshalb scheint es etwas merkwürdig, dass es dort nicht funktioniert.
/*
* oCItem functions:
*
* InsertItemWP (string itemInstance, int amount, string waypoint)
* InsertItemPos(string itemInstance, int amount, int* pos, int* dir)
* InsertItem (string itemInstance, int amount, int* trafoMat)
*/
func int InsertItemWP(var string itmInst, var int amount, var string wp) {
Wld_InsertItem(MEM_GetSymbolIndex(itmInst), wp);
var zCTree newTreeNode; newTreeNode = _^(MEM_World.globalVobTree_firstChild);
var int itmPtr; itmPtr = newTreeNode.data;
if (!itmPtr) {
MEM_Warn(ConcatStrings("Could not insert item: ", itmInst));
return 0;
};
var oCItem itm; itm = _^(itmPtr);
itm.amount = amount;
return itmPtr;
};
func int InsertItem(var string itmInst, var int amount, var int trf) {
var int itmPtr; itmPtr = InsertItemWP(itmInst, amount, MEM_FARFARAWAY);
const int sizeof_zMAT4 = 64;
AlignVobAt(itmPtr, trf);
var int trafo[16];
MEM_CopyBytes(trf, _@(trafo), sizeof_zMAT4);
// Increase height for better piling (will be "dropped")
if STR_StartsWith (itmInst,"ITPO")
{
trafo[ 7] = addf(trafo[ 7], mkf(10));
}else
{
trafo[ 7] = addf(trafo[ 7], mkf(3));
};
AlignVobAt(itmPtr, _@(trafo));
SetVobToFloor(itmPtr);
return itmPtr;
};
func int InsertItemPos(var string itmInst, var int amount, var int pos, var int dir) {
var int trafo[16];
NewTrafo(_@(trafo));
PosDirToTrf(pos, dir, _@(trafo));
var int itmPtr; itmPtr = InsertItem(itmInst, amount, _@(trafo));
SetVobToFloor(itmPtr);
return itmPtr;
};
ich hab die Funktion erweitert um die Items besser zu droppen. Dadurch stecken die nicht mehr im Boden fest.
Davon abgesehen sehe ich aber keine Abweichungen.
Ja, es könnte sein, dass durchs nachträgliche Verschieben, der Item-Effekt nicht neugestartet wird. Du kannst mal testweise MEM_InsertItem probieren. Da stammt aus LeGo und erwartet neben der Instanz-ID drei Koordinaten als Float.
Weiß noch jemand wie ich ein mir bekanntes Vob positionieren kann? Ich habe einen Positionsvektor und eine existierende Vob-Instanz. Ich würde nun gern die Position des Vobs anpassen, nach der Erzeugung des Vobs.
Hiermit konnte ich mein Problem lösen:
// https://forum.worldofplayers.de/foru...tPositionWorld
func void zCVob_SetPositionWorld(var int zCVobPtr, var int fX, var int fY, var int fZ) {
const int zCVob__SetPositionWorld = 6404976; //0x61BB70
const int arr[3] = {0,0,0};
arr[0] = fX;
arr[1] = fY;
arr[2] = fZ;
CALL_PtrParam(MEM_GetIntAddress(arr[0]));
CALL__thiscall(zCVobPtr, zCVob__SetPositionWorld);
};
Wie ist es eigentlich möglich einem Vob, bzw einem oCMobDoor, eine Funkion zu übergeben wenn der Spieler das Vob im Fokus hat und "benutzt" ? Ich würde gerne ein benutzbares Bett spawnen - dazu gibt es ja die Methoden InsertMobDoorPos, usw. , aus dem Skript - im Spacer habe ich nun eine OnStateFunc "SLEEPABIT" gesehen - wie kann soetwas via Skript übergeben werden?