Tribut im MP bei mehreren Spielern bezahlt

» Siedler Map Source Forum » Siedler DEdK Script Forum » Tribut im MP bei mehreren Spielern bezahlt

Seiten: 1

Play4FuN
#1
23.11.2017 18:24
Beiträge: 704

Tribut im MP bei mehreren Spielern bezahlt

Moin moin,

habe folgendes im Skript:

TributePaid_Action_Orig = TributePaid_Action
	TributePaid_Action = function(index)
		TributePaid_Action_Orig(index)
		GUIAction_ToggleMenu("TradeWindow", 0)
		Message("index: "..index)
		if DataTable[index].playerId ~= nil then
			Message("player: "..DataTable[index].playerId)
		end
		if DataTable[index].Tribute ~= nil then
			Message("id: "..DataTable[index].Tribute)
		end
	end


Wenn nun ein Tribut (Comfort ist vorhanden...) vom Spieler bezahlt wird, dann bekomme ich folgendes Ergebnis (Message):
index: 3
player: 1
id: 3
index: 4
player: 2
id: 4

Es existieren bereits zwei weitere Tribute für eine Aufgabe je Spieler, daher Id/Index 3 und 4...
Es handelt sich um eine 2-Spielerkarte, Koop. Ziel dieser Sache ist es, mit dem Überschreiben des Callbacks herauszufinden, welcher Spieler diesen Tribut bezahlt hat - aber da für beide Spieler dieser Callback aufgerufen wird, komme ich an der Stelle nicht zum Ziel :c

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

MadShadow
#2
23.11.2017 18:49
Beiträge: 372

Hi, eigentlich hat doch jeder Spieler seine eigenen Tribute. Also gibst du Spieler 1 einen Tribut mit dem was passieren soll, wenn Spieler 1 den Tribut bezahlt und Spieler 2 einen Tribut, mit dem was passiert wenn spieler 2 den tribut bezahlt. Damit wüsstest du ja quasi welcher Spieler den Tribut bezahlt, oder nicht?

Play4FuN
#3
23.11.2017 19:43
Beiträge: 704

Das hilft leider nicht

Prinzipiell natürlich, klaro. So ist es momentan ... aber ich möchte das nicht für jede Karte anpassen müssen - für eine 6-Spieler Karte müsste ich halt die ganzen Tribute 6x samt Callback ins Skript packen, was ich gerne vermeiden möchte!

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#4
23.11.2017 19:44
Beiträge: 1472

Das ganze ist ein Trigger und du solltest in der Lage sein, an Player und Tributid ranzukommen:

--- Tribut gezahlt
-- Event.GetTributeUniqueID() Event.GetSourcePlayerID() Event.GetTargetPlayerID()
Events.LOGIC_EVENT_TRIBUTE_PAID


(Hab ich aber selbst nie ausprobiert, also keine Ahnung was TargetPlayerId ist)

Wozu willst du denn rausfunden, wer den Tribut gezahlt hat?

(Ist wahrscheinlich auch besser, daraus einen komplett eigenen Trigger zu machen, ohne den alten zu überschreiben)

Edit: Kannst du aus der GUI raus überhaupt Tribute anderer Spieler Zahlen?

Play4FuN
#5
23.11.2017 20:32
Beiträge: 704

Zitat von mcb:
Edit: Kannst du aus der GUI raus überhaupt Tribute anderer Spieler Zahlen?

Das brauche ich (aktuell) gar nicht.

Zitat von mcb:
Das ganze ist ein Trigger

Schon klar, den Code habe ich:

SetupTributePaid = function(_Job)
	-- Remember data
	local Index = AddData(_Job)

	-- Hostage trigger
	Trigger.RequestTrigger( Events.LOGIC_EVENT_TRIBUTE_PAID,
				nil,
				"TributePaid_Action",
				1,
				nil,
				{Index})
end

Der Index gehört zur siedlereigenen DataTable, die soetwas selbst speichert.

Event.GetSourcePlayerID() gibt erwartungsgemäß 0 zurück (vermutlich war das Tributesystem für den MP mal anders geplant, aber nicht implementiert...).

Event.GetTargetPlayerID() funktioniert zwar besser als mein DataTable[index].playerId, jedoch gibt's da das gleiche Problem, was wir gerade nur tangieren: wenn ein Spieler den Tribut bezahlt, dann wird das trotzdem 2 mal ausgelöst! (2 Spieler)

Wozu? Ich habe ein Autoauffüllen für Militär geschrieben, den soll jeder Spieler selbst per Tribut an-/ausschalten können...
Ich lasse jedoch nur 1x einen SimpleJob laufen, der für jeden Spieler, der Autofill aktiv hat, die Auffüllenfunktionen durchführt.

gvMission.Autofill = {false, false} -- 2 players
StartSimpleJob("SJ_CheckAutoFill")
...
function SJ_CheckAutoFill()

	if gvMission.Autofill[gvMission.PlayerID] == true then
    --autofill functions...


Mit den Tributen wird im Callback jeweils (hier Spieler 1)

gvMission.Autofill[1] = not gvMission.Autofill[1]

umgeschaltet... aber eben pro Spieler ein eigener Callback usw ist nervig :/

Theoretisch könnte ich von Tributen gänzlich absehen und bei jedem Spieler einzeln so einen Job laufen lassen, den man mit einem Button im HQ (de)aktivieren kann... sollte auch im MP gehen denke ich.
Aber das Problem mit den Tributen würde ich dennoch gerne lösen

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

mcb
#6
23.11.2017 21:13
Beiträge: 1472

Ich glaub ich weiß, was dein Problem ist: Jedes mal, wenn du einen Tribut erstellst, wird dieser Comfort aufgerufen und jedes mal ein Job erstellt. Das heißt, wahrscheilich hast du gerade 2 Jobs (von 2 Tributen) aktiv, von denen Beide die Messages produzieren.
Ich würde empfehlen, einfach einen neuen Job zu machen, und die Tribute mit der id zu unterscheiden (notfalls mit nem globalen table, in das dann die neue Tributid eingetragen wird).

Play4FuN
#7
23.11.2017 22:29
Beiträge: 704

Jou hab's jetzt über ein weiteren Trigger gelöst, muss es nur noch mit 2 Rechnern testen...

Trigger.RequestTrigger( Events.LOGIC_EVENT_TRIBUTE_PAID, nil, "Autofill_TributePaid_Action", 1, nil, nil)


Zum (de)aktivieren...

function Autofill_TributePaid_Action()
	local p = Event.GetSourcePlayerID()
	ToggleAutofillForPlayer(p)
end


Danke für die Hilfe

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Seiten: 1

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

Impressum