Fragen zu MD Scripten: cue instantiate und reset

Hier ist der ideale Ort um über Scripts und Mods für X4: Foundations zu diskutieren.

Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators

Post Reply
sprIder
Posts: 92
Joined: Sat, 3. Jul 10, 23:23
x4

Fragen zu MD Scripten: cue instantiate und reset

Post by sprIder » Thu, 26. Jan 23, 19:04

Moin,

ich bin gerade dabei, ein paar Erfahrungen mit eigen MD Scripten zu sammeln. Da meine Erfahrung mit Programmieren eher gering ist, mache ich es auf dem klassischen Weg und schaue mir an, was andere so getrieben haben.

Was ich bislang noch nicht verstanden habe, ist, wann ich bei einem cue den Parameter "instantiate = true" setzen sollte. Und wann es sinnvoll ist, einen cue zu reseten. Vielleicht kann mir einer das hier bitte näher erläutern.
Ich habe auch hier geschaut, aber es hat mir nicht so wirklich weiter geholfen: https://www.egosoft.com:8444/confluence ... ctor+Guide

Zum Hintergrund, vielleicht ist es an Beispielen einfacher:
Ich möchte zusätzliche Forschung zum Spiel hinzufügen, die dem Spieler jeweils eine Blaupause für eine neue Station gibt.
Also gibt es jetzt eine Reihe neuer Stationen (ware_station_1 bis ware_station_6) in der wares.xml und zusätzlich die dazu passenden research_ware_station_1 bis research_ware_station_6.
Erfolgt nur die Erforschung einer der Blaupausen, sollen sie auch dem Spieler hinzugefügt werden.
Hat der Spieler die Blaupausen bereits gekauft, muss er sie natürlich nicht noch mal erforschen.

Code: Select all

<mdscript name="test23"
	<cues>
<cue name="Check_Research_Unlocked" onfail="cancel">
	<conditions>
		<cue_is_complete cue="md.X4Ep1_Mentor_Subscriptions.UnlockResearch" />
	</conditions>
</cue>
<cue name="Research_Activated">
	<conditions>
		<check_any>
			<event_cue_signalled />
			<event_cue_completed cue="md.X4Ep1_Mentor_Subscriptions.UnlockResearch" />
			<event_cue_completed cue="Check_Research_Unlocked" />
		</check_any>
	</conditions>
	<delay exact="1s" />
	<actions>
		<add_encyclopedia_entry type="researchables" item="'research_station_1'" />
		<add_encyclopedia_entry type="researchables" item="'research_station_2'" />
		<!-- Code gekürzt -->
		<add_encyclopedia_entry type="researchables" item="'research_station_6'" />
	</actions>
</cue>
<cue name="Research_finished" instantiate="true">
	<conditions>
		<event_player_research_unlocked/>
	</conditions>
	<actions>
		<set_value name="$wares_all_modules" exact="[ware.ware_station_1, ware.ware_station_2; .. , ware.ware_station_6]" />
		<set_value name="$research_wares_all_modules" exact="[ware.research_ware_station_1, ware.research_ware_station_2; .. , ware.research_ware_station_6]" />
		<do_all exact="$research_wares_all_modules.count" counter="$c">
			<do_if value="$research_wares_all_modules.{$c}.research.unlocked">
				<add_blueprints wares="$wares_all_modules.{$c}" />
			</do_if>
		</do_all>
		<remove_value name="$wares_all_modules" />
		<remove_value name="$research_wares_all_modules" />
		<reset_cue cue="this" />
	</actions>
</cue>
<cue name="Blueprints_already_bought" instantiate="true">
	<conditions>
		<check_any>
			<event_player_blueprint_added />
			<check_any>
				<event_cue_completed cue="md.X4Ep1_Mentor_Subscriptions.UnlockResearch" />
				<event_cue_completed cue="Check_Research_Unlocked" />
			</check_any>
		</check_any>
	</conditions>
	<delay exact="2s" />
	<actions>
		<set_value name="$wares_all_modules" exact="[ware.ware_station_1, ware.ware_station_2; .. , ware.ware_station_6]" />
		<set_value name="$research_wares_all_modules" exact="[ware.research_ware_station_1, ware.research_ware_station_2; .. , ware.research_ware_station_6]" />
		<do_all exact="$wares_all_modules.count" counter="$i">
			<do_if value="player.blueprints.{$wares_all_modules.{$i}}.any.exists">
				<add_research ware="$research_wares_all_modules.{$i}" />
			</do_if>
		</do_all>
		<remove_value name="$wares_all_modules" />
		<remove_value name="$research_wares_all_modules" />
		<reset_cue cue="this" />
	</actions>
</cue>
</cues>
</mdscript>
Ist das richtig so, was ich hier (t/sch)reibe? Stimmt das so mit "instatiate" und "reset cue" oder kann das weg/fehlt es irgendwo? Wann nutze ich es im Allgemeinen?

sprIder
Last edited by sprIder on Fri, 27. Jan 23, 16:35, edited 1 time in total.

User avatar
Marvin Martian
Posts: 3547
Joined: Sun, 8. Apr 12, 09:40
x4

Re: Fragen zu MD Scripten: cue instantiate und reset

Post by Marvin Martian » Fri, 27. Jan 23, 15:35

eine instantiate="true" kann man IMO nicht mit reset_cue behandeln da diese quasi immer resetet wird nach ausführen

wenn du eine Station erforschen willst und diese dann erforscht bleibt benutzt du am besten einen non instantiate und resettest diese auch nicht

planst du das wie den Ehrkönig-Core als unique Item zu verwenden musst du jedoch wirklich laufend prüfen und benutzt am besten instantiate um bei jeder Statusänderung dann auch den MD-Zauber wirken zu lassen

alternativ kannst du auch die Cue verschachteln also die Hauptcue wird erst aktiviert wenn alle Punkt X erreicht wird
ungefähr so

Code: Select all

<mdscript name="test23">
	<cues>
		<cue name="Check_Research_Unlocked">
			<conditions>
				<cue_is_complete cue="md.X4Ep1_Mentor_Subscriptions.UnlockResearch"/>
			</conditions>
			<actions>
				<set_value name="$todo" exact="[1,2,3,4,5,6]"/>
				<set_value name="$my_stations" exact="table['research'=[],'blueprint'=[]]"/>
				<do_for_each name="$rsID" in="$todo">
					<append_to_list name="$my_stations.$research.{'$%s'.[$rsID]}." exact="ware.{'research_ware_station_%s'.{$rsID}}"/>
					<append_to_list name="$my_stations.$blueprint.{'$%s'.[$rsID]}." exact="ware.{ware_station_%s'.{$rsID}}"/>
				</do_for_each>
			</actions>
			<cues>
				<cue name="Research_finished" instantiate="true">
					<conditions>
						<check_any>
							<check_all>
								<event_player_research_unlocked/>
								<check_value value="$my_stations.$research.indexof.{event.param}"/>
								<check_value value="player.blueprints.{$my_stations.$blueprint.{$my_stations.$research.indexof.{event.param}}}.any.exists" negate="true"/>
							</check_all>
							<check_all>
								<event_player_blueprint_added/>
								<check_value value="$my_stations.$blueprint.indexof.{event.param2}"/>
								<check_value value="$my_stations.$research.{$my_stations.$blueprint.indexof.{event.param2}}.research.unlocked" negate="true"/>
							</check_all>
						</check_any>
					</conditions>
					<actions>
						<do_if value="event.name == 'event_player_research_unlocked'">
							<add_blueprints wares="$my_stations.$blueprint.{$my_stations.$research.indexof.{event.param}}"/>
						</do_if>
						<do_elseif value="event.name == 'event_player_blueprint_added'">
							<add_research ware="$my_stations.$research.{$my_stations.$blueprint.indexof.{event.param2}}"/>
						</do_elseif>
					</actions>
				</cue>
			</cues>
		</cue>
	</cues>
</mdscript>
da wäre jetzt die Option die innere Cue immer per reset zurückzusetzten bis alle stationen freigeschalten sind, dann aber eben mit <reset_cue cue="this" /> statt instantiate="true"

sprIder
Posts: 92
Joined: Sat, 3. Jul 10, 23:23
x4

Re: Fragen zu MD Scripten: cue instantiate und reset

Post by sprIder » Fri, 27. Jan 23, 16:39

Danke schön, Marvin!
Genau, die Forschung und die Blaupausen sollen erhalten bleiben. Dann werde ich das "instantiate" und "reset_cue" jeweils entfernen und es mal ausprobieren.

Post Reply

Return to “X4: Foundations - Scripts und Modding”