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
#10
05.12.2017 23:32
Beiträge: 73

Problem gefunden, trzd danke für die schnelle antwort

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

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

Impressum