Map Probleme
» Siedler Map Source Forum » Siedler DEdK Script Forum » Map Probleme
Seiten: 1
BrokenSun
|
#1 02.12.2017 15:07 Beiträge: 73 |
Map Probleme
Vorweg,
da sicherlich noch mehr Problem Auftreten werden, werd ich die hier einfügen statt für jedes Problem einen neuen Beitrag zu machen, und hier alles voll zu spammen ´
Zu meinem Problem:
function QuestFarmerOne() quest = { id = F31, type = MAINQUEST_OPEN, title = "Findet Conelius", text = "Dem Farmer fehlt Geld. Und genau dieses muesst ihr ihm auftreiben. Ein alter Freund des Farmers, Conelius, Schuldet ihm noch 50 Taler. Sein Lager liegt westwaerts, dem Weg entlang zu den steinigen Bergen. Sprecht mit ihm, und bringt dem Farmer sein Gold!", } Logic.AddQuest(1, quest.id, quest.type, quest.title, quest.text, 1) QuestFOne = quest.id end function QuestSirMarten() quest = { id = SM1, type = MAINQUEST_OPEN, title = "Schuetzt Leenz und toetet die Banditen", text = "Banditen terorrisieren Leenz. Sir Marten, oder auch Sir Koenig Marten genannt, beauftragte euch das Dorf zu schuetzen und diesen brutalen Schlechtern einhalt zu gebieten. @color:0,139,0,255 Ueberquert die Ufer des trockenen Flusses, findet das Lager der Banditn und zerstoert es!", } Logic.AddQuest(1, quest.id, quest.type, quest.title, quest.text, 2) QuestSMOne = quest.id end function QuestSirMarten2() quest = { id = SM2, type = MAINQUEST_OPEN, title = "Begebt euch nach Dragona", text = "Nordwerts, hinter dem einstigen Lager der Banditen, befindet sich eine Hoele. Die Hoele der Kojoten. Dort sucht ihr den Aufgang nach Dragona.", } Logic.AddQuest(1, quest.id, quest.type, quest.title, quest.text, 3) QuestSMTwo = quest.id end
-Der Quest Text wird nicht ausgeführt
Logic.RemoveQuest( 1, 1);
- Remove Funktioniert nicht...
Weiteres "Problem":
Bei IsDead Funktionen wird ja ein Simple Job angewandt, Problem hierbei ist das verbundene Funktion bei dem Tod einer Entity jede Sekunde wiederholt werden. Gibt es da die Möglichkeit von einem einmaligen aufrufen nach dem Tod einer Entity, einer daraus resultierenden Funktion?
function KojotenIsDead() if IsDead("KojotenHQ") then Logic.RemoveQuest( 1, 2); NPCSirMarten3(); end end
Danke schonmal für eure Antworten
MFG BSun
mcb
|
#2 02.12.2017 17:32 Beiträge: 1472 |
Zu den Quests: Die Ids müssen Integers (also ganze Zahlen) >0 sein.
Zum SimpleJob einfach return true einfügen, z.B. so:
function KojotenIsDead() if IsDead("KojotenHQ") then Logic.RemoveQuest(1, 2) NPCSirMarten3() return true end end
(Das sollte aber auch so im Wiki erklärt sein)
PS: Wenn du deinen Code so einrückst wie ich das im Beispiel gemacht hab, ist alles viel besser lesbar.
(Außerdem willst du vielleicht die Quests nicht einfach aus dem Questlog entfernen, sondern auf gelöst setzen?)
BalistiK
|
#3 02.12.2017 20:31 Beiträge: 70 |
Das Problem mit den ID's für deine Quest kannst du mit einer sehr einfachen Comfort-Funktion ebenfalls wesentlich vereinfachen:
function GetQuestId() gvMission.QuestId = (gvMission.QuestId or 0) + 1 return gvMission.QuestId end
Einfach ohne zu ändern in das Script reinkopieren.
Das ganze sieht dann mit dem Erstellen einer Quest folgendermaßen aus:
function ExampleQuest() quest = { id = GetQuestId(), type = MAINQUEST_OPEN, -- oder SUBQUEST_OPEN title = "", text = "" } Logic.AddQuest( 1, quest.id, quest.type, quest.title, quest.text, 1 ) ExampleQuest = quest.id -- Das ist die Variable die du beliebig benennen kannst. Mit dieser Variable kannst du dann von außerhalb auf die Quest zugreifen. end
Ist viel einfacher und du musst dir die ID's nicht merken. Löschen kannst du es dann auch einfacher:
Logic.RemoveQuest( 1, ExampleQuest );
Als erledigt zu kennzeichnen geht dann auch einfach:
ResolveBriefing( ExampleQuest )
Play4FuN
|
#4 02.12.2017 22:54 Beiträge: 704 |
So geht's auch...
...ich finde es übersichtlicher, es so zu machen:
Vor dem ganzen Skript, also ganz oben, schreibe ich alle Quest IDs auf, z.B.
QUEST_FINDEREC = 1 QUEST_BUILDBASE = 2
usw...
Bei einer neuen Quest mache ich einfach
local pos = GetPosition("pos1") Logic.AddQuestEx(1, QUEST_FINDEREC, MAINQUEST_OPEN, "@center Erec", "Findet Erec!", pos.X, pos.Y, 1)
dann kann man analog unten die Quest verändern bzw. entfernen und behält dabei aufgrund der Bezeichner den Überblick.
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
BrokenSun
|
#5 02.12.2017 23:28 Beiträge: 73 |
Icon
Vielen Dank, jetzt Funkts
Hab noch was kleines:
Gibt es auch die Möglichkeit, z.b. Über "texture", dem Quest ein ausgewähltes Icon einzuspannen? (Die Liste ist ja auf Docu.Wiki)
----------------------------------------------------------------------------------------------------------------------------------------------
Und kann mir jemand mal die Liste an Text Attributen Schreiben, wäre sehr cool wenn ich diese mal ergänzen könnte:
@br @Color @Center @ra
Gibt es da noch mehr Text gestalterische Funktionen?
z.b. @background-Color ?
----------------------------------------------------------------------------------------------------------------------------------------------
@PlayFourFun, wozu genau dient die positionsangabe?
local pos = GetPosition("pos1")
Nochmals Danke für die Hilfe, hat mir grad wieder stunden an Forumssuche erspart
MFG BSun
mcb
|
#6 03.12.2017 00:05 Beiträge: 1472 |
Zu den Quest-Buttons: Das sind einige von den wenigen GUI-Elementen, die in C++ verwaltet werden. Da ranzukommen ist den Aufwand nicht Wert, wenn man bedenkt das man per Hook, GUI-Editor und ein bisschen Lua so was wie das hier basteln kann: http://www.siedler-maps.de/screenshots/screenshot-4095.htm
Zu den @-Codes: Die hier sind mir bekannt:
@cr @bs @ra @center @color
(Sollte es noch mehr geben, werden sie wohl nirgendwo verwendet)
(Hintergrundfarbe lässt sich eventuell mit XGUIEng.SetMaterialColor ändern, aber normalerweise gibt es dazu jeweils ein extra Widget)
Zur Position: Die wird für Logic.AddQuestEx verwendet. Wenn du dann auf die Message für neue Quest im ShortMessagesListWindow klickst, springst du zu dieser Position.
Play4FuN
|
#7 03.12.2017 11:24 Beiträge: 704 |
Quest Position
Genau, aber aufpassen:
Logic.AddQuest -> ohne Position verwenden!
Logic.AddQuestEx -> mit Position möglich!
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
BrokenSun
|
#8 05.12.2017 21:37 Beiträge: 73 |
Variablen
Hi,
mir steht mal wieder ein Problem im Weg, und es ist höchst interessant:
Und zwar:
FMA() GGG = 30; TEST(); end function TEST() StartCountdown(10, TEST2, false); end function TEST2() Message(GGG); AddGold(1, GGG); TEST(); end
Ergebnis
30
30
30
0
30
30
30
0
30
30
...
Könnte einer helfen
Danke
mcb
|
#9 05.12.2017 22:45 Beiträge: 1472 |
Sicher das die 0 von genau der Variablen sind? Das sieht nämlich richtig aus (bis auf die erste Zeile, aber da hast du glaub ich einfach nur was weggelassen).
Was du machen kannst ist an die Message noch einen string anzuhängen, dann kan man die unterscheiden:
Message("GGG: "..GGG)
BrokenSun
|
#11 12.12.2017 00:06 Beiträge: 73 |
SoeldnerQuartier und isDestroyed
Nach langer Zeit hab ich mich mal wieder an eine alte Map gewagt:
Versucht habe ich ein 4. Soeldner lager zu integrieren, doch das stellt sich als nicht so leicht heraus.
local SoeldnerQuartier4 = GetEntityId( "SoeldnerQuartier4" ); Logic.AddMercenaryOffer( SoeldnerQuartier4, Entities.CU_Evil_LeaderBearman1, 80, ResourceType.Gold, 500, ResourceType.Wood, 770, ResourceType.Clay, 160 );
EntityID = SoeldnerQuartier4
Function ist integriert im Gamecallback
------------------------------------------------------------------------------------------------------------------------------------
isDestroyable
function RockOneB() if IsDestroyed("RockOne") then DestroyEntity( "BRock1" ); CreateEntity(0, Entities.XD_Stone1, GetPosition("BRockDA"), "R1"); return true end end FMA() StartSimpleJob("RockOneB"); end
Beim Zerstören eines XD_Rock_Destroyable soll zusätzlich noch ein weiterer Stein verschwinden, an einer anderen Stelle soll ein Steinhaufen entstehen. Funktion zeigt bisher keine Wirkung...
*Auch bei ID= 1 keine Wirkung
MFG BSun
mcb
|
#12 12.12.2017 01:44 Beiträge: 1472 |
Sieht alles soweit in Ordnung aus. Hast du die Map mal mit Debugger gestartet (oder -debugscript)?
Ansonsten kannst du dir auch mit Game.ShowTriggerDlg() alle aktiven Trigger in einem extra Fenster ansehen, dann siehst du ob dein Trigger aufgerufen wird.
Play4FuN
|
#13 13.12.2017 10:13 Beiträge: 704 |
Bist du sicher, dass die Position bzw. der Name exakt so stimmt? Manchmal sind es die ganz simplen Sachen.
____________________
LG Play4FuN
Siedler DEdK Mapping + Scripting Tutorials
Seiten: 1