Brücken Vernichten

» Siedler Map Source Forum » Siedler DEdK Script Forum » Brücken Vernichten

Seiten: 1

RitterLeo
#1
22.05.2019 20:21
Beiträge: 237

Brücken Vernichten

Hallo meine Siedlerfreunde, ich bräuchte mal eure Hilfe bei folgendem:
Ich möchte gerne das ein Dieb alle 3 Minuten spawnt(kein Problem) dieser soll dann zu einer Brücke laufen und diese sprengen. JEDOCH wie soll ich dafür sorgen das nach der Sprengung der Brücke die Mission verloren ist da man anscheinend keine Brücken benennen kann(oder doch?). Es wäre nämlich sehr blöd wenn ich dann nochmal die Brücke neu erstellen müsste.

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

mcb
#2
22.05.2019 20:58
Beiträge: 1472

Um einen Scriptnamen an Brücken zu verteilen hast du 2 Möglichkeiten:
- Ein Scriptentity daneben setzen, und dann per Script die id der Brücke daneben besorgen und dann den Scriptnamen setzen.
- Per bba-tool die s5x entpacken, und in der textdatei in dem die entities gespeichert sind einen scriptnamen eintragen.

Nebenbei:
Verwendest du den Hook um dem Dieb den Befehl zu geben, oder simulierst du das?

RitterLeo
#3
22.05.2019 21:19
Beiträge: 237

Ich werde ein Scriptentity "unter" der Brücke platzieren und denke das er dann da hinläuft. Dann falls er angekommen ist nen kurzen Timer starten und dann das Ding platzieren.

Könntest du mir genauer erklären wie das mit der Scriptentity funktioniert?

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

mcb
#4
22.05.2019 21:47
Beiträge: 1472

local pos = GetPosition("posOfBridge")
local _, bid = Logic.GetEntitiesInArea(Entities.PB_Bridge1, pos.X, pos.Y, 500, 1)
SetEntityName(bid, "bridge")


natürlich musst du die Scriptnamen anpassen und eventuell den Entitytyp sowie die suchreichweite (die 500) auf deine entsprechende Brücke anpassen.


Wenn du ein XD_Keg per Script platzierst, funktioniert es nicht wirklich.
Da hast du dann auch 2 Möglichkeiten:
- Das ganze Simulieren, indem du nen Grafikeffekt platzierts und die HP der Brücke manuell auf 0 setzt
- Per hook dem Dieb den Befehl geben, die Brücke zu Sabotieren

RitterLeo
#5
23.05.2019 13:37
Beiträge: 237

Das andere wäre denke ich auch kein Problem da ich bereits die Funktionen sämtlicher Effekte besitze. Also wird wohl es wohl das kleinste Problem sein.
Außerdem muss diese kleine Map noch getestet werden um das Balancing gut hinzubekommen.

Mir fehlt doch noch die Fähigkeit der Diebe.

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

Dieser Beitrag wurde von RitterLeo am 23.05.2019 um 15:40 editiert.

mcb
#6
24.05.2019 21:31
Beiträge: 1472

Den Befehl an die Diebe kannst du mit PostEvent.ThiefSabotage(thiefId, buildingId) geben, du brauchst aber wie gesagt den Hook dafür.

Ansonsten sollte auch sowas wie

function CreateThiefToKillBridge(startpos, player, bridge)
	local p = GetPosition(startpos)
	local id = Logic.CreateEntity(Entities.PU_Thief, p.X, p.Y, 0, player) -- dieb erstellen
	Move(id, bridge) -- ihn bewegen
	Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_SECOND, nil, "CheckThiefToKillBridge", 1, nil, {id, bridge}) -- job starten
end

function CheckThiefToKillBridge(thiefid, bridge)
	if IsDead(thiefid) then -- wenn er tot ist brauchen wir den job nicht mehr
		return true
	end
	if IsNear(thiefid, bridge, 500) then -- wenn der dieb bei der brücke ist
		local tpos = GetPosition(thiefid)
		Logic.CreateEffect(GGL_Effects.FXExplosionPilgrim, tpos.X, tpos.Y, 1) -- explosion grafikeffekt
		SetHealth(bridge, 0) -- brücke zerstören
		-- TODO briefing das den einsturz der brücke zeigt und dann Defeat auruft
		return true
	end
end


funktionieren.

Peter-FS
#7
26.05.2019 13:57
Beiträge: 1086

Rename Brücke

Hier meine Lösung wie ich es bereits eingesetzt habe.

bruecke_pos = ScriptEntity, oder du benutzt gleich die X,Y Koordinaten

function RenameBruecke()
    local pos = GetPosition("bruecke_pos")
    Data = { Logic.GetEntitiesInArea( Entities.PB_DrawBridgeClosed1, pos.X, pos.Y, 2500, 8)};
    if Data[1]>0 then
	SetEntityName(Data[2],"bridge1")
    end
end



____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

RitterLeo
#8
26.05.2019 16:36
Beiträge: 237

Ich habe die normale Brücke PB_Bridge2 verwendetn und es funktioniert derzeit alles so wie geplant.

Nun zu einer anderen Frage:
Ich habe eine Schleife gestartet, wenn 3 Diebe erschaffen wurden, wie ist es mir möglich den aktuellen Countdown abzubrechen um nicht noch mehr Diebe zu erzeugen.
Ich dachte daran, das ich dies an ein gewisses Gebäude fessle das nach der Schleife zerstört wird und somit keine Diebe mehr erscheinen.
Kennt ihr da noch andere möglichkeiten?

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

mcb
#9
26.05.2019 17:57
Beiträge: 1472

Eine Schleife? (also

while do .. end 

oder einen Job?

Test auf ein bestimmtes Gebäude ist relativ einfach, du kannst aber auch einfach irgendwo im Script ne globale Variable setzen und die dann abfragen.

RitterLeo
#10
26.05.2019 18:58
Beiträge: 237

Eine Schleife, also

function CreateThiefToKillBridge()
CreateMilitaryGroup(5, Entities.PU_Thief, 0, GetPosition("KI3"), "Thief1")
Move("Thief1","bridge")
StartCountdown( 60*8,CreateThiefToKillBridge,false)
Message("Ein Dieb ist unterwegs")
Diebe = Diebe + 1
end

function AbfrageDieb()
    if Dieb > 3 then
return true
    end
end



Eine andere Variante ist mir derzeit nicht bekannt.

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

mcb
#11
26.05.2019 20:49
Beiträge: 1472

Ah, so willst du das machen. (Und gut das es keine Schleife ist, die würde nicht funktionieren )
Mit den funktionen von mir unten würde es so aussehen mit funktionierendem Limit:

function Countdown3Thieves()
	thievesNum = (thievesNum or 0) + 1 -- initialisiere variable wenn nicht vorhanden und zähle hoch
	CreateThiefToKillBridge("KI3", 5, "bridge") -- sende einen dieb
	if thievesNum >= 3 then -- wenn alle diebe genutzt, hier ende
		return
	end
	StartCountdown( 60*8, Countdown3Thieves, false) -- neuer dieb in 8 min
end

RitterLeo
#12
26.05.2019 21:22
Beiträge: 237

Achja, hatte das ja aus einer Schleife entnommen und wollte das anders verwenden, mein Fehler.
Mal sehen ob es funktioniert und dann kann der Tester ran.

Vielen dank dir.

Ansonsten noch eine Frage:
Warum wird der Dieb nicht erschaffen so wie du es darein geschrieben hast?
Nur eine Frage eben, nutze daher eher die normalen Funktionen Wie CreateMilitaryGroup und Move.

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

Dieser Beitrag wurde von RitterLeo am 26.05.2019 um 21:42 editiert.

mcb
#13
26.05.2019 21:55
Beiträge: 1472

Was genau meinst du?
Den unterschied zwischen CreateMilitaryGroup und Logic.CreateEntity?
Logic.CreateEntity setzt keinen Scriptnamen für das erstellte entity und erzeugt keine Soldaten, gibt mir aber die entityid zurück.

RitterLeo
#14
27.05.2019 13:51
Beiträge: 237

Ja genau das meinte ich und das hat mich auch gewundert.
Naja, jetzt weiss ich es jedenfalls,
vielen Dank.

____________________
Die Gier eines Menschen kann man mit der einer Pflanze vergleichen:
Hat sie einmal genug Wasser und Sonne wächst sie um noch mehr zu bekommen.

Seiten: 1

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

Impressum