s5HookLoader

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

Pages: 1

mcb
#1
29-09-2015 20:00
Posts: 1272

s5HookLoader

Da das Laden des S5Hooks bisher nicht sonderlich komfortabel war, hab ich dazu mal was geschrieben (was ich hier schon mal erwähnt hatte).
Der S5Hook und InitAdressEntity wird nach jedem laden automatisch ausgeführt, und über das Aufdecken der Map und den Kamerasprung ist beides fast sofort geladen.

--- s5HookLoader   mcb   0.3  
-- Lädt den S5Hook und SCV 2.0 beim Start und danach automatisch nach jedem laden.  
-- Callbacks mit table.insert in s5HookLoader.cb eintragen.  
-- Callbacks, die nach dem GUI-Laden aufgerufen werden sollen, in s5HookLoader.xmlLoaded eintragen. (auch mit table.insert)  
-- S5Hook.SetCustomNames wird automatisch aufgerufen, das globale namesTable kann genauso verwendet werden wie ein normales table für S5Hook.SetCustomNames, allerdings werden die Namen vorher mit Umlaute bearbeitet.  
-- 
-- s5HookLoader.init(adrEntPl, fma) 	in der FMA aufrufen (Entity für InitAdressEntity wird automatisch erstellt, player angeben).  
-- 											fma wird nach dem ersten laden einer GUI-xml aufgerufen, für Startbriefing oder Ähnliches.  
-- s5HookLoader.xmlLoaded() 		nach dem laden einer GUI aufrufen.  
-- s5HookLoader.isHookSCVLoaded() 	prüft, ob S5Hook und SCV 2.0 geladen sind.  
-- s5HookLoader.reloadNamesTable()	parst die Texte in namesTable erneut. Hilfreich wenn verschiedene Namen über @string geladen werden.  
-- 
-- benötigt:
-- - S5Hook
-- - SCV 2.0
-- - Trigger-Fix
-- - metatable-savegame-fix
-- - Umlaute
s5HookLoader = {cb = {}, xmlLoad={}, ae = nil, namesTable = {}, fma=nil}
function s5HookLoader.init(adrEntitPl, fma)
	s5HookLoader.ae = Logic.CreateEntity(Entities.PU_Serf, 1, 1, 0, adrEntitPl or 8)
	s5HookLoader.fma = fma
	s5HookLoader.Mission_OnSaveGameLoaded = Mission_OnSaveGameLoaded
	Mission_OnSaveGameLoaded = function()
		s5HookLoader.Mission_OnSaveGameLoaded()
		s5HookLoader.load()
	end
	s5HookLoader.load()
end

--- vom s5HookLoader über metatable und Umlaute als CustomNamesTable geladen
namesTable = namesTable or {}

function s5HookLoader.load()
	local x,y = Camera.ScrollGetLookAt()
	local p = GetPosition(s5HookLoader.ae)
	Explore.Show("hookloader", p, 100)
	Logic.ForceFullExplorationUpdate()
	Camera.ScrollSetLookAt(p.X, p.Y)
	ZO = nil
	InstallHook(function()
		if ZO then
			s5HookLoader.callback(x, y)
		end
	end)
	InitAdressEntity(s5HookLoader.ae, function()
		if S5Hook then
			s5HookLoader.callback(x, y)
		end
	end)
end
function s5HookLoader.callback(x, y)
	for _,f in ipairs(s5HookLoader.cb) do
		f()
	end
	S5Hook.SetCustomNames(s5HookLoader.namesTable)
	Camera.ScrollSetLookAt(x, y)
	Explore.Hide("hookloader")
end

function s5HookLoader.xmlLoaded()
	StartSimpleHiResJob(function()
		for _,f in ipairs(s5HookLoader.xmlLoad) do
			f()
		end
		if s5HookLoader.fma then
			s5HookLoader.fma()
			s5HookLoader.fma = nil
		end
		return true
	end)
end
function s5HookLoader.reloadNamesTable()
	for k,v in pairs(namesTable) do
		s5HookLoader.namesTable[k] = Umlaute(v)
	end
end

function s5HookLoader.isHookSCVLoaded()
	return S5Hook and ZO and true or false
end

metatable.set(namesTable, {
	__newindex = function(nt, k, v)
		s5HookLoader.namesTable[k] = Umlaute(v)
		rawset(namesTable, k, v)
	end,
})



Edit: Neue Version in neuerem Post, diese Version nur noch für kompartiblität mit SCV 2.0

This posting has been edited by mcb: 20-06-2016 at 19:59.

Kantelo
#2
30-09-2015 11:20
Posts: 356

Danke, das ist sehr nützlich

Kantelo
#3
01-10-2015 22:26
Posts: 356

Allerdings stürzt bei mir das Spiel jetzt nach einer Minute ab
Wenn ich ihn wieder rausnehme, dann funktioniert alles.
Können irgendwo Probleme mit metatables auftreten?
Weil SCV und s5Hook laufen sonst problemlos bei mir.

mcb
#4
02-10-2015 11:31
Posts: 1272

Nimm mal den Befehl für das Metatable raus. (Der Aufruf von metatable.set ganz am Ende) Wenn es dann funktioniert könnte es am metatable liegen (und ich muss mir was neues ausdenken...)

MadShadow
#5
03-10-2015 18:01
Posts: 348

Funktioniert der S5Hook den stabil im Allgemeinen? Ich habe die Befürchtung das meine gesamte Arbeit dann umsonst ist und zögere deshalb weiter zu machen.

mcb
#6
03-10-2015 20:26
Posts: 1272

Meistens. Beim laden des Hooks und beim Beeenden des Spiels kommt es manchmal zu Abstürzen. (Kann aber auch an der mischung aus Hook, SCV und Debugger liegen...)

andre111
#7
04-10-2015 12:17
Posts: 220

Ich kann gelegentliche Abstürze beim Beenden des Spiels bestätigen. Hatte aber noch nie einen Absturz beim Laden des Hooks. Der Debugger macht bei mir da keinen Unterschied und SCV habe ich noch nie verwendet.

Kantelo
#8
04-10-2015 12:42
Posts: 356

Ohne metatables kommt folgendes nach einer Minute:

settlershok.exe - Fatal error
---------------------------
Access violation - no RTTI data!

Ich weiß jetzt allerdings welcher Befehl den Absturz verursacht, nämlich der SetCustomNames Befehl. Im Moment habe ich kein Table mit Namen, vielleicht liegt es daran?

mcb
#9
04-10-2015 13:02
Posts: 1272

Ich kann das momentan nicht reproduzieren. Auch mit einem leeren table gibt es diesen Absturz bei mir nicht. Vielleicht hat bobby eine Idee was da passiert...

mcb
#10
20-06-2016 19:59
Posts: 1272

Ich hab den loader jetzt an den neuen Hook-Lademechanismus angepasst. Kamerasprung und Mapaufdecken sind jetzt unnötig. Außerdem hab ich das automatische Laden des SCV 2.0 entfernt, da der praktisch durch die neuen Funktionen des Hooks ersetzt wird (und zwar deutlich schneller). Wer SCV 2.0 trotzdem noch benötigt sollte weiter v0.3 verwenden, sie funktioniert auch mit dem neuen Hook.

--- s5HookLoader   mcb   v0.4  
-- Lädt den S5Hook beim Start und danach automatisch nach jedem laden.  
-- Callbacks mit table.insert in s5HookLoader.cb eintragen.  
-- Callbacks, die nach dem GUI-Laden aufgerufen werden sollen, in s5HookLoader.xmlLoaded eintragen. (auch mit table.insert)  
-- S5Hook.SetCustomNames wird automatisch aufgerufen, das globale namesTable kann genauso verwendet werden wie ein normales table für S5Hook.SetCustomNames, allerdings werden die Namen vorher mit Umlaute bearbeitet.  
-- Neu in v0.4: Anpassung für neuen Lademechanismus ab S5Hook v1.2, entfernung von SCV 2.0 da S5Hook schnellere implementierung bietet)
-- 
-- s5HookLoader.init(fma) 			in der FMA aufrufen.  
-- 											fma wird nach dem ersten laden einer GUI-xml aufgerufen, für Startbriefing oder Ähnliches.  
-- s5HookLoader.xmlLoaded() 		nach dem laden einer GUI aufrufen.  
-- s5HookLoader.isHookSCVLoaded() 	prüft, ob S5Hook und SCV 2.0 geladen sind. (SCV 2.0 ab v0.4 nicht mehr automatisch geladen)  
-- s5HookLoader.reloadNamesTable()	parst die Texte in namesTable erneut. Hilfreich wenn verschiedene Namen über @string geladen werden.  
-- 
-- benötigt:
-- - S5Hook ab v1.2
-- - Trigger-Fix
-- - metatable-savegame-fix
-- - Umlaute
s5HookLoader = {cb = {}, xmlLoad={}, namesTable = {}, fma=nil}
function s5HookLoader.init(fma)
	s5HookLoader.fma = fma
	s5HookLoader.Mission_OnSaveGameLoaded = Mission_OnSaveGameLoaded
	Mission_OnSaveGameLoaded = function()
		s5HookLoader.Mission_OnSaveGameLoaded()
		s5HookLoader.load()
	end
	s5HookLoader.load()
end

--- vom s5HookLoader über metatable und Umlaute als CustomNamesTable geladen
namesTable = namesTable or {}

function s5HookLoader.load()
	if not InstallS5Hook() then
		Message("Hook loading failed, please restart map or reload savegame!")
		Message("Hook laden fehlgeschlagen, bitte Map neu starten oder Spielstand neu laden!")
		return
	end
	for _,f in ipairs(s5HookLoader.cb) do
		f()
	end
	S5Hook.SetCustomNames(s5HookLoader.namesTable)
end

function s5HookLoader.xmlLoaded()
	StartSimpleHiResJob(function()
		for _,f in ipairs(s5HookLoader.xmlLoad) do
			f()
		end
		if s5HookLoader.fma then
			s5HookLoader.fma()
			s5HookLoader.fma = nil
		end
		return true
	end)
end
function s5HookLoader.reloadNamesTable()
	for k,v in pairs(namesTable) do
		s5HookLoader.namesTable[k] = Umlaute(v)
	end
end

function s5HookLoader.isHookSCVLoaded()
	return S5Hook and ZO and true or false
end

metatable.set(namesTable, {
	__newindex = function(nt, k, v)
		s5HookLoader.namesTable[k] = Umlaute(v)
		rawset(namesTable, k, v)
	end,
})

Pages: 1

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

Impressum