Pointer, Animationen und anderes

» Siedler Map Source Forum » Siedler DEdK Script Forum » Pointer, Animationen und anderes

Seiten: 1

Kantelo
#1
12.03.2015 01:04
Beiträge: 357

Pointer, Animationen und anderes

Wie man meinem neuen Screenshot sieht, habe ich in letzter Zeit wieder ein bisschen herumexperimentiert mit dem Logic.SetEntityScriptingValue Befehl.
Im Prinzip kann man mit ein paar Funktionen die sog. Pointer innerhalb der ScriptingValues auslesen und zurückverfolgen und somit an fast jede Information über eine Entity gelangen und diese auch verändern.
Ich erkläre unten noch einmal, wie man sich solche Funktionen selbst schreibt, wichtig für den Gebrauch der SCV-Funktionen, die ich jetzt bereits geschrieben habe ist:
- Bevor man die Funktionen nutzt muss InitAdressEntity(_entity) aufgerufen werden, danach dauert es ca. 0.1 bis 1 Sekunde bis man die Funktionen nutzen kann.
Die Entity muss eine PU oder CU Einheit sein und darf während des gesamten Spiels nicht sterben (am besten ein Schaf am unteren Kartenrand wie im S5Hook)
- Die Zeilennummer in der Animationstabelle ist die ID der Animation in dieser Zeile. Für SCV.SetEntityAnimation muss man die ID verwenden und es dürfen nur Animationen gesetzt werden, die von der Entity auch unterstützt werden; sonst stürzt das Spiel ab
- Eine Animation hält sich sehr unterschiedlich lang (2-15 sek)
Wenn man eine Animation dauerhaft aktivieren möchte, dann kann man Logic.SuspendEntity(_entityID) davor aufrufen.
Die Animation wird erst bei Logic.ResumeEntity wieder gestoppt.
Eine andere Möglichkeit habe ich noch nicht herausgefunden.
- Bei ExperiencePoints müssen die Detailled ExperiencePoints von 0-1000 angegeben werden.

Download: SCV2.0.7z
Man benötigt zusätzlich noch die Float Funktionen von bobby und das bignum Verzeichnis.

-----------

Jetzt dazu, wie das ganze funktioniert.
Man sollte dazu wissen, was Pointer bzw. Zeiger sind
http://de.wikipedia.org/wiki/Zeiger_%28Informatik%29

Normalerweise sind Pointer meist 8-9 stellige Zahlen, die durch 4 teilbar sind.
Der ScriptingValue Wert an der Stelle 67 einer Siedler-Entity zeigt auf die Position von -58 derselben Entity.
Jeder Index eines ScriptingValue Wertes beinhaltet 4 Bytes
Dadurch kann man via Logic.SetEntityScriptingValue wenn man den Wert bei 67 mit 232 addiert (58*4Bytes, dann ist man an der Stelle 0) jeden beliebigen Pointer auslesen, indem man den ermittelten Wert an der Position 0 von dem Pointer abzieht und durch 4 teilt (wegen den 4 Bytes pro Index).

Der Pointer an der ScriptingValue-Stelle -27 einer Entity zeigt auf ein Feld mit ca. 8-15 Pointern, das ist bei jedem EntityTyp anders. Ich habe herausgefunden, dass jeder dieser Pointer auf eine bestimmte Behaviour Tabelle zeigt und zwar in genau der Reihenfolge, wie sie in der xml Datei der Entity gespeichert sind.
Alle Siedler haben gemeinsam, dass der erste Pointer des -27er Feldes auf die dem Siedler eigene Animation Tabelle zeigt.
Mit der Funktion SetBehaviorInformationValue(id,0,index2) kann man auf genau diese Tabelle zugreifen. 0 als erster Index, weil der Pointer, der genau an der Stelle des -27er Pointerfeldes steht auf die Animation Tabelle zeigt.
Mit dem 2. Index gibt man an, welche Position der Animations Tabelle gesetzt werden soll (erste Position ist 0, nächste 1 usw.).
Die nächste Tabelle (i.d.R. Movement) wird mit GetBehaviorInformationValue(id,4,index2) abgerufen.
4 deswegen, weil der Pointer zu dieser Tabelle 4 Bytes von dem ersten Pointer im -27er Feld entfernt ist.

Die Behavior Tabellen fangen alle mit einer siebenstelligen Zahl wie z.B. 7826276 an und hören mit einer neunstelligen und einer zehnstelligen Zahl (meistens Beginn mit 234) auf.
Dazwischen liegen alle Informationen dieses Tables für GENAU diese Entity. Sie können mit GetBehaviorInformationValue und SetBehaviorInformationValue ausgelesen und bearbeitet werden.

An der Position 4 der meisten Behavior Tabellen, steht wiederum ein Pointer, der direkt auf die eigentliche Behavior Tabelle der eingelesenen xml Datei zeigt. Davor sind es diese spezielle Entity betreffende Informationen, in der jetzigen Tabelle sind es Informationen, die den gesamten Entity-Typ betreffen.

Zum Beispiel sind bei Erec auf der index1 Position 36 bei Position 5 die Sekunden bis die Fähigkeit Wirbelschlag wieder benutzbar ist gespeichert (HeroSetAbilityChargeSeconds), aber eigentliche Abklingzeit ist in der internen Behavior Tabelle.

Auch das kann man bearbeiten und zwar mit GetBehaviorXmlValue und SetBehaviorXmlValue. Hier wird als Unterschied ledeglich im Index2 die Position des Pointers in der Behavior Tabelle angegeben (normalerweise 4) und als index3 die Position in der internen Behavior Tabelle.
Neben dem, dass die geänderten Werte mit SetBehaviorXmlValue für alle Entitys desselben Typs gelten, hat diese Methode auch noch den Nachteil, dass bei Verlassen des Spiels alle diesbezüglichen Veränderungen wieder rückgängig gemacht werden müssen, sonst hat man die Veränderungen auch noch in allen anderen Maps, die man vor dem endgültigen Verlassen des Spiels spielt und es kommt teilweise zu Abstürzen beim Spiel Verlassen.

Man muss also nur die 2-3 index Parameter richtig bearbeiten und kann so die komplette Entity nach Belieben umgestalten.

Ich hoffe ihr habt das Tutorial einigermaßen verstanden und könnt auch selbst diese Funktionen nutzen und eigene Veränderungen vornehmen.
Ich habe auch vor meine Ergebnisse noch weiter festzuhalten, vieles habe ich noch nicht gesagt, aber ich habe jetzt eine Stunde an diesem Text geschrieben, jetzt mach ich erst einmal Pause

Viel Spass damit!

Dieser Beitrag wurde von Kantelo am 12.03.2015 um 12:13 editiert.

mcb
#2
01.08.2015 12:17
Beiträge: 1472

Ich hab die Excel-Tabelle mit den Animationsnummern mal in ein lua-table konvertiert, das ganze nach Entities geordnet und sortiert. Vielleicht kanns ja noch jemand brauchen

comanimation

MadShadow
#3
03.04.2017 17:49
Beiträge: 372

Kann mir jemand die Datei zur Verfügung stellen? Ich schaffe es nicht sie selbst herunterzuladen, da ich von den 20 mir dargebotenen Downloadbildern jedesmal auf durch Viren verseuchten Website gelinkt werde. Einmal musste ich schon den Browser abschießen, weil eine Website die es durch mein Antivirenprogramm geschafft hat, mich dazu zwingen wollte mein Administrator Passwort einzugeben und jegliche anderen Aktionen im Browser gesperrt hat. Was sind das nur für Websiten..

Würde mich also sehr freuen, wenn ich jemandem der die Datei hat mir eine Email schickt oder ähnliches. Email würde ich dann per PN schicken.

mcb
#4
03.04.2017 19:04
Beiträge: 1472

Das meiste sollte inzwischen mit dem S5Hook deutlich schneller gehen. Was willst du denn genau machen?

MadShadow
#5
03.04.2017 19:13
Beiträge: 372

Nichts konkretes, ich wollte mir ansehen was Kantelo da zusammengestellt hat. Also lässt sich das alles via. S5Hook auch bewerkstelligen?

mcb
#6
03.04.2017 19:35
Beiträge: 1472

Ja, eventuell müssten nur die Funktionen umgeschrieben werden. Kantelo hatte irgendwann mal 3 Listen angefertigt, mit allen ihm bekannten Werten und Offsets. Irgendwo sollte ein Dropbox-Link im Forum sein, wenn ich mich richtig erinnere.

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum