|
-
Zitat von Lehona
Performanter wäre wohl einfach eine Manipulation des Bytecodes, aber ich denke nicht, dass die Funktion so viel Rechenleistung kostet. Andererseits weiß ich auch nicht, wie oft sie aufgerufen wird.
Das dürfte pro Frame und Pfeil und mit dem Pfeil kollidierenden unerwünschtem Ziel nicht mehr als ein Aufruf sein.
Unerwünschte Ziele sind zum einen Triggerzonen zum anderen (nur bei Npc-geschossenen Pfeilen) nicht-Target Npcs (ein Bandit schießt durch den anderen durch).
Diese unerwünschten Zeile dürften also hinreichend selten sein, wenn man nicht gerade 20 Triggerzonen aufeinanderstapelt oder in engen Korridoren mit Banditenhorden kämpft.
Beispiel: Wenn ich durch eine ein paar Meter Breite Triggerzone durchschieße kriegt ich so 20 Aufrufe während der Pfeil innerhalb der Zone fliegt.
Die andere Fälle (wo tatsächlich eine Kollision mit einem Vob stattfindet) halte ich für vernachlässigbar, das passiert ja pro Pfeil im wesentlichen nur einmal.
Habt ihr eigentlich mal gemessen wie teuer ein Hook ist?
Geändert von Sektenspinner (05.04.2013 um 13:45 Uhr)
-
Naja, es ist ein Aufruf pro potentieller Kollision, nicht pro ungewünschter Kollision, die macht bloß ca. 50% des Daedalus-Codes aus, allerdings scheint es sich ja trotzdem in Grenzen zu halten.
Die Hook selber kostet nur minimal mehr als zCParser::CallFunc sowie der dazugehörige Daedalus-Code. Wie zCParser::CallFunc ist, sollte man wohl testen (mit einer leeren Daedalus-Funktion), da muss ich wohl ein wenig Bytecode zusammenschustern.
-
Du hast recht, es ist ein Problem. Bei so ca. 20 Banditen macht es den Unterschied zwischen 30 und 15 Frames (Welt: Newworld/Xardas).
Das habe ich wohl falsch eingeschätzt.
Edt: Update. Hm, so schlimm ist es vielleicht doch nicht.
Ich habe nochmal mit (etwas) besserem Code getestet und habe jetzt gar keinen Unterschied mehr festgestellt. O_o
Bei der ersten Messung sind aber auch merkwürdige Dinge passiert: Die Pfeile sind in der Luft zusammengestoßen und haben dort einen dicken Klumpen gebildet. Vielleicht waren meine Testbedingungen da doch etwas unrealistisch (20 Banditen sind schon verdammt viel).
Geändert von Sektenspinner (05.04.2013 um 14:12 Uhr)
-
Zitat von Sektenspinner
Du hast recht, es ist ein Problem. Bei so ca. 20 Banditen macht es den Unterschied zwischen 30 und 15 Frames (Welt: Newworld/Xardas).
Das habe ich wohl falsch eingeschätzt.
Dann wird man die Bedingungen etc. wohl in Bytecode formulieren müssen, das ist aber ein wenig aufwändiger. Falls jemand wirklich den Performance-Schub braucht, kann man das ja machen. Ansonsten sollte man wohl nicht in Khorinis mit dem Bogen schießen (oder keine Triggerzonen verwenden).
-
hey, war lange nicht mehr im Eding. Wie auch immer habe gerade Semesterferien und eine richtig schwere Klausur erfolgreich hinter mehr, also eben 2 Fragen.
1. Ist Lego inzwischen verfügbar für G1? Meine G1 als G2 Mod klappt nicht so wirklich, außer man findet unzählige Fehlermeldung beim Laden und anschließend einen schwarzen Bildschirm ansprechend.
2. Wie kann man nochmal neue Untertitel von Dialoge bzw. die OU´s erstellen, da gabs mal so nen nettes Tool, glaube von Sektenspinner, aber ich weiß gerade den Namen nicht mehr.
-
-
Folgender Code hilft Information im Charaktermenü darzustellen. Mögliche Anwendungen:
- Anzeige von Script-verwalteten Talenten, zum Beispiel Goldhacken.
- Anzeige der Goldmünzen im Spielerinventar
- Anzeige von Stärke als Zahl (z.B. 100) anstatt als Bruch (z.B. 100/100)
- Allgemeiner: Anzeige beliebiger Strings in beliebigen Menu Items im Charaktermenü deren Werte nicht Engine-verwaltet sind.
Idee: Jedes mal wenn das Charaktermenü geöffnet wird, wird die Funktion Update_Character_Menu aufgerufen in der es DEINE Aufgabe ist deine Menu Items anhand deiner Vorstellungen mit Werten zu füllen. Dazu liegt eine Funktion Update_Menu_Item bei. Ein Beispiel liegt bereit, in dem die Überschrift ("Charakterprofil") ersetzt wird durch einen String der die Zahl der Münzen im Spieler Inventar anzeigt.
Ein ausführlicher Kommentar am Anfang des Skripts beantwortet hoffentlich weitere Fragen.
Code:
/*##############################################################
Idea:
This code is useful if you want to display information
in the character menu that you cannot or do not want to
link to an Npc-Talent or Attribute.
Traditionally, the Engine fills in values itself, for example
initialising the menu Item MENU_ITEM_LEVEL with hero.level,
or retrieving the string in MENU_ITEM_PLAYERGUILD according to
hero.guild and the table TXT_GUILDS (see Text.d).
Because the way in which the engine retrieves these values
is hardcoded, you have only limited controll on what is
displayed in the character menu.
The following code is aimed to give you more control,
allowing you to implement additional talents (more
than NPC_TALENT_MAX) or statistical information
(like number of monsters killed) that are not represented
in attributes or talents.
You also have more controll on how the information is
displayed, for example as a value (100), a fraction (30/100)
with a unit (32 Coins), as a percentage (42%) or in
any other way you fancy.
Usage:
1.) Call Install_Character_Menu_Hook() in INIT_GLOBAL
after having called LeGo_Init.
2.) For each piece of information you want to display,
create a menu item in Scripts\System\Menu\Menu_Status.d
You need to specify the position of the menu item there.
Use e.g. MENU_ITEM_STATUS_HEADING as a reference.
Lets say your new menu item is called MENU_ITEM_GOLD.
3.) At the top of Menu_Status.d, update MENU_STATUS
such that your new menu item is listed as well.
4.) In the function Update_Character_Menu (see below)
you need to "calculate" the value that should be
displayed within the menu item (calculating might
be as easy as specifying a variable).
Use the function Update_Menu_Item.
This may look like this:
var int gold;
gold = Npc_HasItems(hero, ItMi_Gold);
var string s;
s = ConcatStrings(IntToString(gold), " Coins");
Update_Menu_Item("MENU_ITEM_GOLD", s);
5.) If you need additional labels or headings,
create additional menu items in Menu_Status.d for it.
For example a label "Gold:".
You can use MENU_ITEM_STATUS_HEADING as a reference.
Don't forget to list all new items in MENU_STATUS.
5.) Do not call Update_Character_Menu yourself.
This is automatically done for you each time
the character menu is opened.
6.) Do not try to manage menu items that the engine
manages itself. For example you will not be able
to change the value in MENU_ITEM_LEARN, because
the engine will always display the number of learn points there, negating your changes.
If, for example, you want to display the player strength,
create a new menu item or rename the old menu item
instead of just using MENU_ITEM_ATTRIBUTE_1.
The function Update_Character_Menu currently contains
code for replacing the heading "CHARAKTERPROFIL" in the
status menu with a string displaying number of gold coins
in the hero's inventory.
This is supposed to serve as an example.
After following only step 1 above this should already work.
##############################################################*/
// [INTERAL]
func void Update_Menu_Item(var string name, var string val) {
var int itPtr;
itPtr = MEM_GetMenuItemByString(name);
if (!itPtr) {
MEM_Error(ConcatStrings("Update_Menu_Item: Invalid Menu Item: ", name));
return;
};
//void __thiscall zCMenuItem::SetText(val = val, line = 0, drawNow = true)
const int SetText = 5114800;
CALL_IntParam(true);
CALL_IntParam(0);
CALL_zStringPtrParam(val);
CALL__thiscall(itPtr, SetText);
};
//Call this is INIT_GLOBAL after LeGo_Init.
func void Install_Character_Menu_Hook() {
//at oCMenu_Status::SetLearnPoints
const int done = false;
if(!done) {
HookEngineF(4707920, 6, Update_Character_Menu);
done = true;
};
};
// [/INTERNAL]
// Fill in this function according to your needs:
func void Update_Character_Menu() {
/* Usage:
Update_Menu_Item([Name of the Menu Item],
[new String value]);
*/
//Replace heading with number of coins
var int gold;
gold = Npc_HasItems(hero, ItMi_Gold);
var string s;
s = ConcatStrings(IntToString(gold), " Coins");
Update_Menu_Item("MENU_ITEM_STATUS_HEADING", s);
};
Danke an Varus fürs testen.
-
LOD
Hello! I would like to share the information that I found yesterday. I do not know if this was already known before.
Game console has command: ZPROGMESHLOD (apply global strength value to all pm LOD rendering, -1 (default), 0 .. 1 .. x)
I found a memory address. With Ikarus changed it to 0. After that was gone LOD mesh morphing head of the protagonist "Dark Saga" Alastair all within sight.
Prior to this change in his head, which has more than 1,300 polygons greatly distorted even at a distance of two steps.
Here it is:
008A5334 - LOD address parameter / / = 9065268
const int LODparametr = 9065268, / / this is the number of type float.
MEM_WriteInt (LODparametr, 0);
As I see it, it's maybe not the correct implementation, so I hope that the authors will be able to add LeGo correct function. For example Set_LODfactor (var float lodfactor).
I would be glad if I get any response to my message.
-
Could you maybe make two screenshots that show before / after?
-
Zitat von Milky-Way
Could you maybe make two screenshots that show before / after?
1. Default (lodfactor = -1)
[Bild: 2rbIdJB.jpg?1]
2. Lodfactor = 0
[Bild: H1J0XOC.jpg]
3. + zhighqualityrender
[Bild: rjtnKIL.jpg]
-
Clipping Factor
Also empirically found a pointer to a memory location that stores a value set by the command SET CLIPPINGFACTOR.
Well, that just turned out that there is already in use "Dynamic Memory Allocation".
Pointer: (0099AC8C // 10071180) / / offset = 1436;
Description of the command SET CLIPPINGFACTOR: Setting the clipping-factor. Default is 1. Usually check 0.1 ... 2.0
I exhibited a value of 3. Range of detailed drawing really increased. A higher value has little effect.
Geändert von redleha (04.06.2013 um 06:12 Uhr)
-
Der Link im Startpost zum Wiki für die neuen Funktionen funktioniert nicht mehr.
Da ich jetzt auch mit Ikarus und LeGo anfangen will/muss, wäre das sehr hilfreich
Ich scheitere im Moment schon daran, dass ich erfolgreiche Tagebucheinträge grün ausgeben will. Wie genau funktioniert das?
Und 2.
Ich habe ein Mob, Kisten die man auseinanderschieben muss. Danach kann man in eine Höhle gehen, ähnlich wie in Sarkeras. Da der Endzustand eines Mobs nicht gespeichert wird, wollte ich das Mob beim Laden löschen und stattdessen eine 3ds an der Stelle einfügen, welche so aussieht, dass die Kisten bereits auseinandergeschoben sind.
Könnt ihr mit bitte sagen, wie das funktioniert? Ich finds toll, dass es jetzt dafür Möglichkeiten gibt, aber ich möchte mich selbst nicht unbedingt so lang damit aufhalten.
Und warum bringt mir dieser Code ne Fehlermeldung(Division by zero)
Code:
DIAG_SetAni("GreetCool");
AI_Output (self, other, "DIA_NONE_3503_Vater_nachfrage_14_01");//Na mein Sohn. Danke, mir geht es gut.
DIAG_Reset();
Danke!
Geändert von Golden Age (11.05.2013 um 14:01 Uhr)
-
Es gab ein paar Probleme mit der Datenbank, das Wiki sollte jetzt wieder erreichbar sein.
-
Das LeGo-Wiki funktioniert jetzt wieder
Wenn du einen Tagebucheintrag grün ausgeben willst kannst du PrintS dafür verwenden:
Code:
PrintS(ConcatStrings("Quest abgeschlossen: ", quest_title), COL_Green);
COL_Green ist eine der Farbkonstanten. Alternativ kann man dafür natürlich auch die RGBA-Funktion verwenden.
Bei deinem Mob-Problem brauchst du LeGo gar nicht. Du kannst die beiden Funktionen MEM_DeleteVob und MEM_InsertVob aus Ikarus dafür verwenden.
Die Dialoggestures haben vor einiger Zeit ein sehr großes Update erhalten, weil das alte System zu unschön war. Die Funktion DIAG_SetAni solltest du gar nicht benutzen - mein Fehler dass die Funktion überhaupt noch mit diesem Namen vorhanden ist.
Um die Dialoggestures mit dem neuen LeGo zu verwenden musst du die Funktion DIAG nehmen. Die Anwendung ist etwas schwieriger zu verstehen, dafür insgesamt komfortabler wenn man mal weiß wie.
Wenn du die Funktionalität nicht so recht durchschaust kannst du mir gerne ne PN schreiben. Ich sehe gerade dass es für dieses Paket gar keine Beispiele gibt. Das ist natürlich blöd, mal schauen ob ich da in nächster Zeit was schreiben kann.
MfG Gottfried
-
Lehrling
ich trau mich kaum zu fragen, aber wie benutzt man euer wundertool?
ich möchte zum beispiel einen perk implementieren der 1% maxMp/Sek regeneriert. (das problem liegt beim platzieren und starten der schleife)
auf die wikiseite komme ich leider nicht drauf. ich bekomme immer nen timeout, liegt das an mir?
ich würd mich über jede hilfe freuen
-
Also das Wiki funktioniert momentan bei mir. Wir benutzen seit kurzem eine Gratis Datenbank, kann sein, dass dort die Uptime nicht so toll ist... Aber es sollte jetzt wieder funktionieren.
Eigentlich musst du bloß die Scripte einpflegen (d.h. irgendwo in den Scripts-Ordner kopieren und LeGo\Header.src in die Gothic.src eintragen, nach Ikarus und den Floats) und entsprechend initialisieren. Wenn du nur Schleifen brauchst, ist LeGo_Init(LeGo_FrameFunctions); in der Init_Global() (in Startup.d) völlig ausreichend.
Danach kannst du eine ein-sekündige Schleife mit FF_ApplyExtOnce(myFunc, -1, 1000); hinzufügen (einfach direkt nach LeGo_Init() aufrufen). Näheres zu den FrameFunctions findest du hier.
-
Zitat von Gottfried
Wenn du einen Tagebucheintrag grün ausgeben willst kannst du PrintS dafür verwenden:
Code:
PrintS(ConcatStrings("Quest abgeschlossen: ", quest_title), COL_Green);
MfG Gottfried
Das habe ich probiert. Aber ich bekommen beim reparsen den Fehler, das eine Klammer nicht stimmt. Aber ich habe da eine generelle Frage:
Nehmen wir mal an das sei mein Tagebucheintrag:
1.
Code:
Log_CreateTopic (TOPIC_WOOD_FENCE, LOG_MISSION);
Log_SetTopicStatus(TOPIC_WOOD_FENCE, LOG_RUNNING);
B_LogEntry (TOPIC_WOOD_FENCE, "xxx.");
2.
Könnte ich dann das einfach so machen, damit er Grün ausgegeben wird? :
Code:
Log_CreateTopic (TOPIC_WOOD_FENCE, LOG_MISSION);
Log_SetTopicStatus(TOPIC_WOOD_FENCE, LOG_RUNNING);
B_LogEntry (TOPIC_WOOD_FENCE, "xxx.");
PrintS(ConcatStrings("Quest abgeschlossen: ", WOOD_FENCE), COL_Green)
Mfg
-
Ich glaube du brauchst TOPIC_WOOD_FENCE, nicht WOOD_FENCE, ansonsten dürfte es aber stimmen. In B_LogEntry() wird glaube ich noch ein Print ausgeführt, den solltest du ggf. entfernen oder einfach ersetzen.
-
Ok danke. Hab ich nun abgeändert wie du gesagt hast, aber bekomme beim PrintS-Befehl folgenden Fehler:
Code:
PrintS(ConcatStrings("Quest abgeschlossen: ", TOPIC_WOOD_FENCE), COL_Green)
U:PAR Expected ')
'(line xxx)
Geändert von mobpapst (18.05.2013 um 19:54 Uhr)
-
PrintS() nimmt nur einen Text, wenn du Farbe möchtest, benutze PrintS_Ext(). Dafür kann man auch eben im Wiki schauen.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|