mcbEMan

» Settlers Map Source Forums » Siedler DEdK Script Forum » mcbEMan

Pages: 1

mcb
#1
06-11-2016 14:39
Posts: 1472

mcbEMan

Da der letzte Link verloren gegangen ist, stell ich das ganze jetzt mal neu rein:
Meine gesammelten Funktionen, um Entities und EntityTypen zu manipulieren.
Doku:

--- mcbEMan   0.2.1b
-- Gesammelte Funktionen zum Manipulieren von Entitys und Entitytypen.
-- Das Ganze wird erweitert, wenn ich neue Funktionen brauche ;)
-- 
-- Entity-Funktionen (müssen nicht zurückgesetzt werden/Savegamesicher):
-- 
-- mcbEMan.GetLeaderExperience(id)					Gibt die Erfahrungspunkte des Leaders zurück.
-- mcbEMan.SetLeaderExperience(id, exper)			Setzt die Erfahrungspunkte des Leaders.
-- 
-- mcbEMan.GetLeaderTroopHealth(id)					Gibt die Gesundheit der Truppe des Leaders zurück (aufsummiert, ohne Leader).
-- mcbEMan.SetLeaderTroopHealth(id, tHealth)		Setzt die Gesundheit der Truppe.
-- 
-- mcbEMan.SetLeaderMaxSoldiers(id, sol)			Setzt die Maximalzahl der Soldaten des Leaders. (Get über Logic)
-- 
-- mcbEMan.GetEntityMaxRange(id)					Gibt die Maximale Reichweite des Entitys zurück (sv 49, wenn nicht gesetzt über Behavior)
-- 
-- mcbEMan.GetScale(id)								Gibt die Skalierung eines Entitys zurück. (Float, Standard 1.0)
-- mcbEMan.SetScale(id, scale)						Setzt die Skalierung des Entitys.
-- 
-- mcbEMan.GetEntityOverheadWidget(id)				Gibt den Typ der Anzeige über dem Entity zurück.
-- 														(0->nur Name, 1->Name+Bar (auch für nicht Leader), 2->Worker,
-- 														3->Name+Bar (nur Leader), 4->Nix)
-- mcbEMan.SetEntityOverheadWidget(id, widNum)		Setzt den Typ der Anzeige.
-- 
-- mcbEMan.GetEntityTargetPos(id)					Gibt die Position zurück, zu der sich das Entity bewegt.
-- 
-- mcbEMan.GetThiefInvisibleData(id)				Gibt isInvisible, timeToInvisible eines Diebes zurück.
-- 
-- mcbEMan.SetThiefInvisibleData(id, time)			Setzt die Zeit, bis ein Dieb wieder unsichtbar wird.
-- 														(Aktuelle Unsichtbarkeit an <==> time==0) (max 15).
-- 
-- mcbEMan.GetAriInvisibleData(id)					Gibt isInvisible, remainingInvisible Aris zurück.
-- mcbEMan.SetAriInvisibleData(id, time)			Setzt die Zeit, die Ari unsichtbar ist (max 90).
-- 
-- mcbEMan.ReanimateHero(id)						Belebt einen toten Helden wieder.
-- 														(Igoriert normalerweise feindliche Truppen).
-- 
-- mcbEMan.GetHeroReanimateTimer(id)				Gibt den Timer zurück, wann ein Held wiederbelebt wird. -1, wenn nicht tot.
-- mcbEMan.SetHeroReanimateTimer(id, tim)			Setzt den Timer (Nur wenn Held auch tot ist).
-- 
-- mcbEMan.GetEntityHealingPoints(id)				Gibt die Regenerationspunkte, Regenerationsdauer des Entitys zurück.
-- 
-- Entity-Funktionen (müssen nicht zurückgesetzt werden/nicht savegamesicher ohne s5HookLoader):
-- 
-- mcbEMan.SetEntityDamage(id, dmg)					Setzt den Schaden eines Entitys. Kann mehrere Sekunden brauchen.
-- 														Wenn verändert, keine Modifikation durch Techs mehr.
-- 														Änderungen rückgängig machen mit dmg<0.
-- 
-- mcbEMan.SetEntityArmor(id, def)					Setzt die Rüstung eines Entitys. Kann mehrere Sekunden brauchen.
-- 														Wenn verändert, keine Modifikation durch Techs mehr.
-- 														Änderungen rückgängig machen mit def<0.
-- 
-- mcbEMan.SetEntityExploration(id, explo)			Setzt die Sichtweite eines Entitys. Kann mehrere Sekunden brauchen.
-- 														Wenn verändert, keine Modifikation durch Techs mehr.
-- 														Änderungen rückgängig machen mit explo<0.
-- 
-- mcbEMan.SetEntityMaxRange(id, range)				Setzt die maximale Angriffsreichweite. Kann mehrere Sekunden brauchen.
-- 														Das Entity muss bereits angegriffen haben, oder einen feindlichen Player haben.
-- 														Wenn verändert keine Modifikation durch Techs mehr.
-- 														Änderungen Rückgängig machen mit range<0.
-- 
-- mcbEMan.SetEntityHealingPoints(id, hp)			Setzt die Regenerationspunkte des Entitys. Kann mehrere Sekunden brauchen.
-- 														Das Entity muss schon einmal regeneriert haben, sonst gibt es einen Lua-Error.
-- 														Wenn verändert keine Modifikation durch Techs mehr.
-- 														Änderungen Rückgängig machen mit hp<0.
-- 
-- EntityTyp-Funktionen (müssen vor beenden der Map zurückgesetzt werden):
-- 
-- mcbEMan.GetEntityTypeBuildBlock(typ)				Gibt ein table mit 2 Positionstables zurück, die die Ecken des BuildBlockings des Typs festlegen.
-- mcbEMan.SetEntityTypeBuildBlock(typ, pTab)		Setzt das BuildBlocking (Format von pTab wie Get). Nach Anwendung sollte das Blocking der Map aktualisiert werden.
-- 
-- mcbEMan.GetEntityTypeBlocking(typ)				Gibt ein table mit tables mit 2 Positionstables zurück, die 2 Positionstables in jedem Untertable ergeben ein Teil-Rechteck des Blockings.
-- mcbEMan.SetEntityTypeBlocking(typ, bTab)			Setzt das Blocking. (Format von bTab wie Get). Die Anzahl der Blockingrechtecke kann nicht geändert werden (allerdings können einige auf 0/0 gesetzt werden).
-- 														 Nach Anwendung sollte das Blocking der Map aktualisiert werden.
-- 
-- mcbEMan.SetEntityTypeMaxHealth(typ, health)		Setzt die maximale Gesundheit eines EntityTyps. Nur bei Typen mit Gesundheit anwenden.
-- 
-- mcbEMan.activateETypeFixes()						Fixt mir bekannte Fehler in den Entity-xmls. (Bauer als Arbeiter im Wirtshaus,
-- 														CU_BanditLeaderSwordX kann keine Soldaten kaufen).
-- 														Wenn framework2 und s5HookLoader vorhanden sind, wird diese Funktion automatisch ausgeführt.
-- 
-- mcbEMan.GetEntityTypeBuilderSlots(typ)			Gibt die Positionen (X,Y,r) zurück, an denen Serfs ein Gebäude bauen können.
-- mcbEMan.SetEntityTypeBuilderSlots(typ, t)		Setzt die Baupositionen, unbegrenzte Menge. UnHackMalloc muss aufgerufen werden.
-- 
-- mcbEMan.UnHackMalloc()							Muss beim beenden der Map aufgerufen werden, vor dem Rücksetzen der Entitytypen,
-- 														um Speicherleks zu verhindern. (Automatisch bei framework2).
-- 
-- mcbEMan.GetEntityTypeRegenValues(typ)			Gibt regenerierte HP, Dauer zwischen Regenerationen zurück.
-- mcbEMan.SetEntityTypeRegenValues(typ, hp, sec)	Setzt die Regenerationswerte.
-- 
-- mcbEMan.activateBuildingForCB()					Modifiziert die Entitytypen von einigen CB_-Gebäuden so, das per Logic.CreateConstructionSite
-- 														gesetzte Gebäude von Serfs gebaut (+repariert) werden können. UnHackMalloc muss aufgerufen werden.
-- 
-- Benötigt:
-- - S5Hook ab v1.4b
-- - MemList
-- - framework2 (optional, setzt Entitytypen automatisch zurück)
-- - s5HookLoader (optional, automatische entityTyp-Fixes + entity-funktionen automatisch neu ausgeführt)
-- 
-- TODO:
-- - ClassVTable vervollständigen
-- - checkEntityMoving



Link: commcbscv.lua (Ist wohl etwas zu groß fürs Forum )

Benötigt wird die aktuellste Version des S5Hooks (nur auf der Bitbucket Seite) für Adressberechnungen.

Hätt ich fast vergessen: Das Vorgehen um die Kampfwerte einzelner Entitys zu ändern hab ich mir aus DVS_Battle abgeschaut (und auf den S5Hook geportet, ist doch wesentlich schneller) . Vielen Dank an die Autoren nochmal.

This posting has been edited by mcb: 06-11-2016 at 14:48.

Kantelo
#2
06-11-2016 21:43
Posts: 357

Vielen Dank!

Finde ich sehr gut, dass dort mal alles zusammengetragen ist und sicher auch besser läuft als davor.

Leider blicke ich bei den Memory Funktionen des Hooks nicht ganz durch bzw. mir fehlt die Zeit mich da einzuarbeiten, sonst könnte ich auch noch ein paar Sachen beisteuern.

mcb
#3
06-11-2016 23:07
Posts: 1472

Im Grunde genommen kann man damit Pointer verwenden (ähnlich wie in C). Dann gibt es noch die Speicheranforderungsfunktionen realloc und free, die brauchst du aber wirklich nur sehr selten (funktionieren auch so wie in C, malloc ist nur realloc mit 0 als ersten parameter).
Leider fehlen mir auch noch ein paar Sachen die ich da gerne einbauen würde:
- Ein Pointer auf das, was aus der logic.xml eingelesen wird (ich will das erste Building aus den UpgradeCategories ändern)
- Informationen darüber, welches Entity angegriffen wird
- Soldier direkt mit einem Leader verbinden (oder Serfs mit Baustellen oder Arbeiter mit Gebäuden, ist glaub ich alles das selbe)

MadShadow
#4
07-11-2016 19:21
Posts: 372

Posted by mcb:

- Soldier direkt mit einem Leader verbinden (oder Serfs mit Baustellen oder Arbeiter mit Gebäuden, ist glaub ich alles das selbe)


Das mit den Serfs könnte ich auch wirlich gut brauchen. Vielen Dank für deine Sammlung, super Sache.

Noigi
#5
05-01-2017 23:55
Posts: 772

Hi mcb! Coole Sache, vielen Dank dafür!

Bei mir bewirken die Funktionen unter...

Entity-Funktionen (müssen nicht zurückgesetzt werden/nicht savegamesicher ohne s5HookLoader):

...allerdings nichts, also z.B. das setzen von Schaden und Rüstung. Die requirements, die du dazugeschrieben hast, sollten erfüllt sein (S5Hook 1.5b ist geladen). Hast du eine Idee, woran das liegen könnte?

mcb
#6
06-01-2017 01:33
Posts: 1472

Die brauchen leider ein paar Sekunden, bis sie den Wert wirklich ändern. Wenn auch nach ein Paar Sekunden noch nix passiert ist, probier mal das originale DVS_Battle aus, damit ich weiß, ob es an meiner Umsetzung liegt, oder ein generelles Problem ist.

Noigi
#7
10-01-2017 21:13
Posts: 772

Posted by mcb:
Die brauchen leider ein paar Sekunden, bis sie den Wert wirklich ändern. Wenn auch nach ein Paar Sekunden noch nix passiert ist, probier mal das originale DVS_Battle aus, damit ich weiß, ob es an meiner Umsetzung liegt, oder ein generelles Problem ist.



Es passiert auch nach vielen Sekunden nichts. Ich probiere mal DVS_Battle und gebe dann Bescheid!

Noigi
#8
25-02-2017 19:09
Posts: 772

Ich bin heute endlich dazu gekommen, es zu testen: ja, DVSBattle funktioniert, mcbEMan nicht!
Gibt es noch etwas, das ich falsch gemacht haben könnte? Bei Bedarf kann ich dir das Skript der Testmap schicken, in der ich rumprobiert habe.

mcb
#9
25-02-2017 22:16
Posts: 1472

Ersetz mal die Funktion:

function mcbEMan.Inter_RedirectBattlePointer(id, ind, override)
	id = GetID(id)
	assert(IsAlive(id))
	local sv = S5Hook.GetEntityMem(id)
	local svbn = sv[58+22]
	local adr1 = svbn:Offset(ind/4)
	local ad22 = svbn[0]:GetInt()
	S5Hook.SetPreciseFPU()
	local val = override or ad22-100
	S5Hook.Log(ad22.." .. "..val..(override and " override" or " calc"))
	local r = adr1[0]:GetInt()
	adr1[0]:SetInt(val)
	return r
end


und poste den Log der dabei rauskommt.
Die Adressberechnung ist eigentlich das einzige, was ich geändert habe...

Noigi
#10
02-03-2017 23:40
Posts: 772

Beim Setzen der Rüstung eines Kurzschwertkämpfers bzw. eines Barbarenhauptmannes kommt:
334836928 .. 334836828 calc
334828912 .. 334828812 calc

mcb
#11
03-03-2017 00:30
Posts: 1472

Also die Adressberechnung ist richtig... Schick mir mal das Mapscript, vielleicht fällt mir nochwas auf. Ansonsten hab ich keine Ahnung, warum es nicht funktioniert

daniBIGdani
#12
02-03-2018 13:18
Posts: 153

Hi,
würde gerne mit PostEvent.SerfConstructBuilding CB_Buildings bauen. Dazu soll ich mcbEMan.activateBuildingForCB() aufrufen und mcbEMan.UnHackMalloc() leider hast du "mcb" nie den Code zu framework2 gepostet! Wäre schön, wenn du das noch nachreichen könntest.

MfG daniBIGdani

PS: Kann man CU_Evil_Governor reaktivieren? Vielleicht CU_Major01Idle überschreiben? Nur wie, damit er auch herumlaufen kann wie Dovbar!

mcb
#13
02-03-2018 14:22
Posts: 1472

framework2: Ist komplett optional. framework2 nimmt es dir nur ab, UnHackMalloc vor dem Beenden der Map aufzurufen.

EvilGovernor: Möglich, aber kompliziert. Du musst das Model und die Animationen austauschen (per xml-edit oder Mem-objekt).
Das hier macht etwas ähnliches mit Dovbar und LeaderSword4:

	local sv = mcbEMan.GetETypeDisplayPointer(Entities.PU_LeaderSword4)
	sv[2]:SetInt(Models.CU_RegentDovbar) -- model
	sv[9][0]:SetInt(animTable.CU_RegentDovbar.walk) -- animation load
	sv[9][1]:SetInt(animTable.CU_RegentDovbar.run1)
	sv[9][2]:SetInt(animTable.CU_RegentDovbar.finish)
	sv[9][3]:SetInt(animTable.CU_RegentDovbar.dying)
	sv[9][4]:SetInt(animTable.CU_RegentDovbar.dead)
	sv[9][5]:SetInt(animTable.CU_RegentDovbar.attack1)
	sv[9][6]:SetInt(animTable.CU_RegentDovbar.attack2)
	sv[9][7]:SetInt(animTable.CU_RegentDovbar.hit)
	sv[9][8]:SetInt(animTable.CU_RegentDovbar.idleattack1)
	sv[9][9]:SetInt(animTable.CU_RegentDovbar.idle1)
	sv[9][10]:SetInt(animTable.CU_RegentDovbar.talk1)
	sv[9][11]:SetInt(animTable.CU_RegentDovbar.talk2)
	local sv2 = mcbEMan.GetETypeBehaviorPointer(Entities.PU_LeaderSword4)
	sv2[6][5]:SetInt(animTable.CU_RegentDovbar.attack1) -- leader combat anims
	sv2[6][6]:SetInt(animTable.CU_RegentDovbar.attack2)
	sv2[6][7]:SetInt(animTable.CU_RegentDovbar.attack1) --counter
	sv2[6][8]:SetInt(animTable.CU_RegentDovbar.finish)
	sv2[6][9]:SetInt(animTable.CU_RegentDovbar.attack1) --miss
	sv2[6][10]:SetInt(animTable.CU_RegentDovbar.idleattack1)
	sv2[6][11]:SetInt(animTable.CU_RegentDovbar.run1)
	sv2[2][7]:SetInt(animTable.CU_RegentDovbar.idle1) -- walk idle anim
	sv2[0][5]:SetInt(AnimSets.SET_CU_REGENTDOVBAR) -- animation animset

mcb
#14
11-03-2018 15:27
Posts: 1472

Update 0.2.5b:
- Neuer CNetEventCallback Comfort, mit dem einzelne CNetEvents rausgefiltert werden und die Parameter ausgelesen werden.
- Bugfix: BattleValues funktionieren jetzt auch automatisch, wenn s5HookLoader aber nicht framework2 vorhanden sind. Außerdem werden in diesem Fall auch ExtraUCats korrekt resettet (so das sie normal wieder eingefügt werden können)

Messoras
#15
21-07-2018 22:30
Posts: 84

Hey,

Mir fehlt die Offset Funktion, die unter anderem bei RedirectBattlePointer genutzt wird.
Ich kann nicht nachvollziehen was genau da ausgeglichen wird.
Wäre jemand so gut und schreibt mir die Funktion hier hin?

Gruß,
Messoras

#Edit:
Hat sich erledigt.
Hab bis eben noch S5Hook 1.2 benutzt xD

____________________
Six feet of earth make us all equal.

Spielt Siedler 5 online mit mir, dank des neuen Siedler 5 MP Projekts von Kimichura.

This posting has been edited by Messoras: 21-07-2018 at 22:50.

mcb
#16
28-05-2019 18:23
Posts: 1472

mcbEMan wird nicht mehr von mir weiterentwickelt, stattdessen sollte die neue MemoryManipulation verwendet werden: https://github.com/mcb5637/s5C...ter/lib/MemoryManipulation.lua

CNetEventCallbacks ist in einer extra Datei: https://github.com/mcb5637/s5C...ter/lib/CNetEventCallbacks.lua

Pages: 1

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

Impressum