MP Koop und Desynch mit DVS Battle

» Siedler Map Source Forum » Siedler DEdK Script Forum » MP Koop und Desynch mit DVS Battle

Seiten: 1

Play4FuN
#1
25.03.2018 13:39
Beiträge: 704

MP Koop und Desynch mit DVS Battle

Eine Map macht mich komplett kirre ... mit DVS Battle habe ich in einer Koop lediglich die Zahl der Soldaten verändert und pures Chaos entsteht im MP.

Nach Mapstart (2 Spieler) haben wir gemerkt, dass Spieler 2 keine Holzstapel abbauen kann, selbige Stapel aber von Spieler 1 abgebaut werden können. Lässt mich vermuten, dass es einen Desynch gab, wodurch bei Spieler 2 nie CreateWoodPile aufgerufen wurde ... Infolgedessen (ja, Spiel war dann auch tatsächlich desnchrohn.) spielten die Leibis jedoch komplett verrückt: Leibis, die aus der Sicht von P1 ihm gehörten, gehörten aus Sicht vom 2. Spieler P2 ... wtf (augenscheinlich die ursprünglich selben Leibis. Als ob das nicht genug wäre, gehörte aus Sicht von P1 ein Leibi von P2 auf einmal einem Gegner (mittem im Spielergebiet) - dafuq?

Zudem ging manchmal in meinen Koops der Zoom (vergrößere meist den Faktor) nur bei Spieler 1, bei den anderen nicht (unabhängig von DVS Battle, aber auch noch keine Lösung gefunden).

Selbe Karte funzt im SP wunderbar, auch das Laden klappt, mittels DVS_Battle_ReloadAttributes. Stehe dezent auf dem Schlauch...

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#2
25.03.2018 14:32
Beiträge: 1472

Hm, vielleicht ein Lua-Error bei einem Spieler? Ansonsten sollten diese Funktionen eigentlich alle Problemlos funktionieren, wenn sie synchron aufgerufen werden.

Play4FuN
#3
25.03.2018 14:59
Beiträge: 704

Nachtrag: wenn ich die Anwendung verlasse, bekomme ich nen stack overflow (DVS_Battle_QuitGame_New) jedoch bei

for v, w in pairs(DVS_BattleMemory.OrigHealth) do

wobei ich wie gesagt nur die Soldaten verändere.

Synchron: ich rufe in GameCallback_OnGameStart die Script.Loads auf sowie InitAdressEntity.
Ebenso erstelle ich Tribute und "bezahle" die automatisch 1 Sekunde nach Spielstart, im Callback davon dann

	InitAdressEntity("sheep1", function()
		DVS_Battle_SetUp()
		-- Wertänderungen später
	end)


Die Änderungen der Soldatenzahl mache ich in einem EntityCreated Trigger, um auch alle Hauptmänner zu erwischen (auch bei Upgrade).



Edit: Was ich auch noch nicht voll durchstiegen habe: InitAdressEntity rufe ich quasi 2x auf...
direkt zu Beginn

if AdressEntity then
        InitAdressEntity(DVS_BattleMemory.AdressEntity, DVS_Battle_ReloadAttributes)
    end


und kurz nach Mapstart

InitAdressEntity("sheep1", function()
		DVS_Battle_SetUp()
		-- Wertänderungen später
	end)


Edit 2: okay ... glaube das erste ist unnötig. Da ich AdressEntity ja nicht extra nochmal im Script definiere. Brauche ich an der Stelle das DVS_Battle_ReloadAttributes? Aktuell steht das nur im OnGameLoaded

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Dieser Beitrag wurde von Play4FuN am 25.03.2018 um 15:09 editiert.

mcb
#4
25.03.2018 15:18
Beiträge: 1472

Du benutzt noch das Original? Da bin ich mir nicht ganz so sicher, wie man das verwenden soll. Sollte wie gesagt alles mit mcbEMan deutlich schneller und einfacher gehen.

Das einzige was mir jetzt einfällt ist:
- Das erste InitAdressEntity sollte eigentlich nichts machen, kann also raus.
- Werden die Scripte auch auf allen PCs geladen?

Zu dem StackOverflow: Keine Ahnung wo das her kommt...

Play4FuN
#5
25.03.2018 20:23
Beiträge: 704

Ich werde das ganze nochmal mit deiner Eman durchexerzieren. Habe die DVS Battle (nur) genommen, weil ich damit halt jetzt einmal halbwegs klargekommen bin Die ganze Sache war/ist mir teilweise zu unübersichtlich und ich bin gerne eher vorsichtig, bevor ich mir etwas zerschieße.

Nun zur EMan:
Zuerst, Du hast zwar gesagt, was das framework2 ist, aber nicht, woher ich das bekomme

Ohne dieses, bekomme ich immer zu Begin die Meldung:
Log: "mcbEMan: framework2 or s5HookLoader not found, no automatic eType fix/reset!"

Okay, dazu gibt es ja noch mcbEMan.UnHackMalloc() -> muss ich das immer beim Beenden machen, oder nur, wenn ich entsprechende EntityTyp-Funktionen verwende?
Aktuell brauche ich ja erstmal nur sowas

mcbEMan.SetLeaderMaxSoldiers(GetID("leader"), 12)



Möchte wie angedeutet keineswegs Deine Arbeit verschmähen nur blicke ich da eben noch nicht so durch.

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Play4FuN
#6
25.03.2018 21:44
Beiträge: 704

Okee, nun mit der EMan ... auch hier habe ich leider beim Laden der Karte das Problem, dass ich nen Stack Overflow bekomme

Ah, gefunden. Sorry, hatte nicht bedacht, dass sich mehrere überschrieben Funktionen von OnLoad ja gegenseitig aufrufen (stirnklatsch)

Habe selbst eine Mission_OnSaveGameLoaded drin, die ich natürlich mit einer _Orig vorher gesichert habe ... klar kommt da ein overflow. Blöde Frage ... wie behebe ich das am elegantesten, brauche beide aber will natürlich nicht im Hook herumfummeln.


Anderes Problem
möchte mittels

GUIUpdate_MinimapInDiplomacyMenu=function() end
XGUIEng.ShowWidget("DiplomacyWindowMinimap" ,1)
XGUIEng.SetWidgetPositionAndSize("DiplomacyWindowMinimap",40,50,50,50)


... die Minimap auch im MP anzeigen lassen. Durch die Resourcen-senden Buttons muss diese verkleinert nach unten rutschen, aber irgendwie macht die obige Funktion daraus nur einen winzigen Punkt, habe viele Werte getestet. Nur ShowWidget und SetPosition funktionieren, aber die Size will nicht.

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Dieser Beitrag wurde von Play4FuN am 25.03.2018 um 22:07 editiert.

mcb
#7
25.03.2018 23:41
Beiträge: 1472

framework2: Wie gesagt, das ist optional (aber sieh mal in die Scripte eines gewissen Projektes).

UnHackMalloc: Musst du nur Aufrufen, wenn du entsprechende Funktionen benutzt. (Sollte bei allen dranstehen)

Mission_OnSaveGameLoaded: Am einfachsten ist wohl ein anderer Backup-Funktionsname. (Aber wo wird nur ein _Orig benutzt?)
Wenn du meinen hookLoader benutzt, kannst du auch einfach da die entsprechenden Sachen in den callback packen. (Brauchst du aber für SetLeaderMaxSoldiers nicht, das ist sowieso schon savegamesicher)

Minimap: Das Ding ist kaum über Lua zugänglich. Ich würde mal versuchen, erst die größe zu setzen und es dann sichtbar zu machen.

Das schlimmste was dir mit Hook/mcbEMan passieren kann, ist das Siedler crasht oder irgendwelche geänderten Werte im Arbeitspeicher bleiben. Lässt sich durch nen einfachen Neustart beheben.

Play4FuN
#8
26.03.2018 09:04
Beiträge: 704

Ah okay, auf die Idee wäre ich nicht gekommen, das erst am Ende sichtbar zu machen

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Play4FuN
#9
26.03.2018 16:07
Beiträge: 704

Trigger: gelegentlich kommt die Warnung, dass ein Trigger zu lange bräuchte, diese kommt aber allg vom Triggerfix, nicht von der EMan oder?

EMan: bekomme immer mal wieder ein assertion fail hier:

function mcbEMan.SetLeaderMaxSoldiers(id, sol)
	id = GetID(id)
	assert(IsAlive(id) and Logic.IsLeader(id)==1)
	sol = math.floor(sol)
	local sv = S5Hook.GetEntityMem(id)
	assert(sv[31][4][0]:GetInt()==mcbEMan.ClassVTable.GGL_CLimitedAttachmentBehavior)
	sv[31][4][6][0][4]:SetInt(sol)
end

In Zeile 188, also dem 2. assert in dieser Funktion. Hatte den Fehler bereits einmal, als ich versuchte einem CU_VeteranCaptain Soldaten zu verpassen, bei dem ist das jedoch nicht vorgesehen. Habe den einfach weggelassen, bei den anderen beiden Veteran Einheiten geht es. Was verursacht sonst so einen Fehler?

if (Logic.IsLeader(ent_ID)) == 1 and (Logic.IsHero(ent_ID) == 0) then
		local nr = GetSoldierAmountByLeaderType(ent_typ)
		if nr ~= 0 then
			mcbEMan.SetLeaderMaxSoldiers(ent_ID, nr)
		end
	end

das steht im LOGIC_EVENT_ENTITY_CREATED Trigger, nr ordnet nur eine Zahl Soldaten je nach Leadertyp zu (return 0 bei Fehler, dort sollte also kein "falscher" Wert drin stehen)
Für die Truppen, die veränderte Soldatenwerte haben, scheint alles zu funktionieren.

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#10
26.03.2018 17:34
Beiträge: 1472

Die Warnung kommt Generell vom TriggerFix.

Das Problem bei SetLeaderMaxSoldiers ist, das die Entitytypen bei denen es nicht funktioniert einen Eintrag in der xml woanders oder garnicht haben. Das assert prüft, ob ich auch den richtigen Ort ändere. (Beim CU_VeteranCaptain fehlt er komplett).

Play4FuN
#11
26.03.2018 18:00
Beiträge: 704

Na gut, aber wenn ich nur normale Truppen habe, sollte der Fehler doch eigentlich nicht auftreten?

Bzw. die anderen beiden Veteran Typen können damit verändert werden, ohne dass (direkt) dieser Fehler auftritt. Die Meldung kommt "irgendwann", also wenn die KI ihre Truppen ausbildet.

Nachtrag: können evtl Kanonen Probleme machen?

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#12
26.03.2018 18:06
Beiträge: 1472

Die anderen beiden Veteran typen haben eine GGL::CLimitedAttachmentBehavior. Kanonen nicht, gibt also nen Fehler.
Du könntest einfach mal den Fehler per xpcall abfangen und dir dann den Entitytyp ausgeben lassen:

if (Logic.IsLeader(ent_ID)) == 1 and (Logic.IsHero(ent_ID) == 0) then
		local nr = GetSoldierAmountByLeaderType(ent_typ)
		if nr ~= 0 then
			xpcall(function()
				mcbEMan.SetLeaderMaxSoldiers(ent_ID, nr)
			end, function(emsg)
				Message("etype: "..Logic.GetEntityTypeName(Logic.GetEntityType(ent_ID)).." causes error: "..emsg)
			end)
		end
	end

Seiten: 1

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

Impressum