Flughöhe verändern, Effekt pausieren, Wettermaschine aktivieren

» Siedler Map Source Forum » Siedler DEdK Script Forum » Flughöhe verändern, Effekt pausieren, Wettermaschine aktivieren

Seiten: 1

Riesenadler
#1
17.07.2018 15:45
Beiträge: 14

Flughöhe verändern, Effekt pausieren, Wettermaschine aktivieren

Moin.
Ich bin neu auf dieser Seite und habe als Begrüßungsgeschenk drei Fragen mitgebracht:

1. Wie kann man die Flughöhe von Darios Falken verändern?

2. Wie kann man einen Effekt pausieren, sodass z.B. nachdem ein Baum gefällt wurde, das Gestrüpp nicht verschwindet, sondern liegenbleibt?

3. Wie kann man eine Wettermaschine aktivieren, wie man es in einigen Kampagnenkarten (Cleycourt, Schlacht um Evelance) sieht?

Auf eure Antworten bin ich gespannt wie ein Bogen.

____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

Dieser Beitrag wurde von Riesenadler am 19.07.2018 um 16:37 editiert.

mcb
#2
17.07.2018 16:18
Beiträge: 1367

1) Du könntest höchstens das model ändern.

2) Wahrscheinlich garnicht, ist ein Grafikeffekt, auf die haben wir abgesehen von erstellen und zerstören praktisch keinen Zugriff.

3) Für den normalen Wetterturm GUI.SetWeather(weather) (bin mir nicht sicher, ob die benötigte Energie nochmal geprüft wird), für die kleinere Wettermaschine gibt es ein extra entity.

Riesenadler
#3
17.07.2018 16:24
Beiträge: 14

Danke für die schnelle Antwort!

1. Wie stellst du dir das vor?

2. Dann muss ich es halt mit Büschen lösen...

3. Ich habe die aktivierte Wettermaschine direkt in die Karte gesetzt und eine normale durch eine aktivierte ersetzt. Hat sich in beiden Fällen nichts bewegt.

____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

mcb
#4
17.07.2018 16:33
Beiträge: 1367

1) Gar nicht, bei der Möglichkeit das model zu Bearbeiten die ich kenne gehen die animationen kaputt (oder genauer gesagt die bones), außerdem kriegst du Probleme damit, das geänderte model in eine mapdatei zu packen.

3) Die PB_Weathermachine_Activated ? Wenn ja, hast du auch versucht sie per script zu setzen?

Riesenadler
#5
17.07.2018 16:59
Beiträge: 14

1. schade

3. Ich hab sie eben per Skript in Spiel gesetzt, funktioniert immer noch nicht.

____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

mcb
#6
17.07.2018 18:02
Beiträge: 1367

Ok, grad ins originalscript gesehen: Die Funktion hier sollte die animation starten:

local id = GetID("weathermachine")
Logic.SetBuildingSubAnim(id, 0, "PB_Weathermachine_Activated_600")

Riesenadler
#7
18.07.2018 16:03
Beiträge: 14

Danke für deine Mühe!

Ich hab die Animation mal verlängert:

do
  local id = GetID("weathermachine")
  local i = 0
  function EwigeWettermaschineJob()
    i = i + 1
    if i>=32 then
      Logic.SetBuildingSubAnim(id, 0, "PB_Weathermachine_Activated_600")
      i = 0
    end
  end
  StartSimpleHiResJob("EwigeWettermaschineJob")
end



____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

mcb
#8
18.07.2018 16:15
Beiträge: 1367

Das überlebt leider das speichern und laden nicht, weil id und i upvalues sind.

Riesenadler
#9
18.07.2018 19:15
Beiträge: 14

Kann man das irgendwie umgehen, z.B. indem man beim Speichern alle upvalues in einer Globalen Tabelle speichert und beim Laden wieder einsetzt?

____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

mcb
#10
18.07.2018 19:25
Beiträge: 1367

Leider nicht (sonst hätte ich das schon längst gemacht). Was ich in solchen Gelegenheiten immer mache ist das:

StartSimpleJob(function(t)
   t.t = t.t + 1
   if t.t >= 100 then
      foo()
      t.t = 0
   end
end, {t=0})


Du brauchst dafür aber nen Trigger-Fix.

(Falls das nicht reicht, kann man per metatable ein par argumente/returns hinzuschummeln, für metatables gibts nen speicher-fix)

Riesenadler
#11
18.07.2018 19:31
Beiträge: 14

Und wie mach ich dann sowas?

function foo(_arg)
  return function()
    foo1(_arg)
  end
end



____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

mcb
#12
18.07.2018 19:40
Beiträge: 1367

Wenn du die zurückgegebene Funktion nicht speicherst, ist alles ok. Wenn du sie Speichern willst, helfen nur metatables:

function foo(_a)
   local t = {a=_a}
   metatable.set(t, {
      __call = function(t, ...)
         bar(t.a, unpack(arg))
      end,
   })
   return t
end


(metatable.set anstelle von setmetatable für den metatable-fix)
(für unpack brauchst du je nach version auch nen fix)

Riesenadler
#13
18.07.2018 21:33
Beiträge: 14

Könnte das funktionieren?

function DefiniteCall(f,...) --returns function which calls f with unpack(arg) as arguments, survives savegame
  local t = arg
  t.f = f
  metatable.set(t, {
    __call = function(_t)
      _t.f(unpack(_t))
    end,
  })
  return t
end

do
  local fun,arg1,arg2 = Move,"jemand","wohin"
  WasTun = DefiniteCall(fun,arg1,arg2)
end



Würde nach Speichern und Laden

WasTun()


immer noch jemand wohin schicken?

____________________
"Wer im Glashaus sitzt, sollte sich im Dunkeln ausziehen."
- Ein schlauer Mensch

mcb
#14
18.07.2018 21:50
Beiträge: 1367

Sollte, du könntest aber auch meine Variante nehmen:

mcbPacker.require("fixes/mcbTrigger")
mcbPacker.require("fixes/metatable")

--- createSavingFunc		mcb		v1.0
-- Kapselt eine Funktion so, das zusätzliche Parameter und Rückgabewerte wie upvalues
-- genutzt werden können (allerdings ohne synchronisierung zwischen 2 Funktionen).
-- 
-- Verwendung:
-- local f = function(a, b, c, d)
-- 	return b, a, c+d+a
-- end
-- f = createSavingFunc(f, 2, 1, 2) -- 2 "upvalues" (a, b), initialisiert mit 1 und 2
-- Message(f(5, 5)) -- 11 (a, b = 2, 1)
-- Message(f(5, 5)) -- 12 (a, b = 1, 2)
-- 
-- Die ersten numArg Parameter werden durch gespeicherte Werte aufgefüllt,
-- die ersten numArg Rückgabewerte als Parameter für den nächsten Aufruf gespeichert.
-- 
-- Zur synchronisierung zweier Funktionen kann ein table als Parameter an beide übergeben werden,
-- dessen Inhalte sind synchron.
-- 
-- Benötigt:
-- - metatable-fix
-- - unpack-fix
function createSavingFunc(func, numArg, ...)
	local t = {func = func, numArg = numArg, initArg = arg}
	function t:reInit()
		self.arg = {}
		for k,v in pairs(self.initArg) do
			self.arg[k] = v
		end
	end
	t:reInit()
	metatable.set(t, {
		__call = function(t, ...)
			local c = t.arg
			local ins = t.numArg + 1
			for _, v in ipairs(arg) do
				c[ins] = v
				ins = ins + 1
			end
			c.n = ins
			local r = {t.func(unpack(c))}
			c = {}
			for i=1, t.numArg do
				c[i] = table.remove(r, 1)
			end
			c.n = t.numArg
			t.arg = c
			return unpack(r)
		end,
	})
	return t
end


Da werden dann noch die returns entfernt und als Argumente für den nächsten Aufruf benutzt.

Kimichura
#15
15.09.2018 17:11
Beiträge: 4

Ich weiß, das Ding hier ist 2 Monate alt, aber die Flughöhe zu verändern sollte garnicht so schwer sein und vielleicht probiert das ja mal jemand aus. Zumindest auf Render-Ebene. Dort hat jede Entity bestimmte Eigenschaften. Dazu zählen X,Y und Z-Koordinate sowie mehrere Rotationsmatrizen (2D). Da bei dem Falken ja die Eigenschaften bekannt sind, könnte man sich dann in die Render-Routine bzw. in die Routine einklinken, welche die Eigenschaften aus der Entity-Strukur zieht. Dort könnte man dann die Eigenschaften abändern. Wie gesagt das würde nur das Rendering beinflussen, was allerdings beim Falken ausreichen sollte, da dieser keinen wirklichen Einfluss auf das Spiel hat.
Dafür bräuchte man allerdings ein wenig (mehr wäre auch nicht verkehrt) Wissen über asm und auch Tools wie z.B. Cheatengine um sich den Speicher anzeigen zu lassen.

Der_Deutsche
#16
16.09.2018 01:39
Beiträge: 294
Kimichura
#17
16.09.2018 16:29
Beiträge: 4

Nein, das Ganze kann man mit dem modifzieren des S5Hooks realisieren und dann über diesen bequem in die Map laden.

Seiten: 1

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

Impressum