[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ====== Das Stargate System ====== \\ [[http://www.siedler-portal.de/vb3/member.php?u=2109|Tenji]] ==== Funktion des Stargates: ==== Sobalt ein zweites Stargate durch das DHD angewählt wurde aktiviert sich das Gate mit einem wandernden DieHero-Effect. Das Gate kann maximal 3,8 Minuten offen gehalten werden und funktioniert nur vom Wahl- zum Zielgate. Wenn das Gate geschlossen wird verschwindet der Ereignishorizont . \\ Es können mehrere Verbindungen gleichzeitig geöffnet sein, aber zu jeder Verbindung gehören immer nur zwei Stargates! Genaueres unter www.stargate-project.de. \\ \\ Wenn man den unteren Code so in sein Script kopiert hat, ... \\ ( Und sich "Briefing_ExtraWrapper" und die verbesserte "SetPosition" funktion auch in eurem Skript befinden! ) ... \\ und sich geschlossene Tore mit den fortlaufenden Namen "Stargate1", "Stargate2", "Stargate3", ... \\ sowie DHDs ([Anwahlpulte] können alle Entities sein zb. "XD_TemplarAltar") mit den fortlaufenden Namen "DHD1", "DHD2", "DHD3", ... \\ auf der Karte befinden, dann könnt ihr das Stargate-System ganz einfach mit folgendem Aufruf aktivieren: \\ -- Stargate System aktivieren SetupStargateSystem( _stargates ) _stargates ist die Anzahl der Stargates, die das System enthalten soll. Entsprechend viele Tore mit fortlaufendem Namen mussen existieren! \\ ( Mit diesem Code könnt ihr nur EIN Stargate System erstellen! ) Standartmäßig seid ihr die User (Benutzer) des Stargete-Systems -> Player 1. Falls ihr weitere, oder andere Spieler als User definieren möchtet, ... \\ müsst ihr beim Aktivieren alle user-player-Ids ( in einer Tabelle, als zweiten Parameter ) ... \\ an die Setup-Funktion des Stargate-Systems übergeben: \\ -- Stargate System mit erweiterten Benutzern aktivieren local users = { _player1, _player2, ... } SetupStargateSystem( _stargates, users ) Das wars! Wenn ihr EINE der beiden Setup-Code ausgeführt habt, könnt ihr nun die Stargates in einem Briefing anwählen, ... \\ welches startet, wenn ihr mit einem eurer Leute in die unmittelberer Umgebung eines der DHDs kommt! \\ \\ Wenn ihr mehrere geschlossene Tore auf der Karte verteilt, könnt ihr anfangs, nur einige aktivieren, ... \\ und später durch einen Neustart des Stargate-Systems nachträglich weitere aktivieren, oder welche deaktivieren. \\ Die aktivierten Gates müssen aber immer fortlaufend nummeriert sein. \\ -- Stargate System neustarten ReinstallStargateSystem( _stargates ) -- oder local users = { _player1, _player2, ... } ReinstallStargateSystem( _stargates, users ) Hiermit könnt ihr das System deaktivieren ( komplett löschen ). \\ -- Stargate System deaktivieren UninstallStargateSystem() Dann könnt ihr das System noch auf Standby setzen, um die Anwahlmöglichkeit aller Stargates vorübergehend zu deaktivieren: \\ -- Stargate System auf Standby setzen: StandbyStargateSystem() Und natürlich auch wieder aus dem Standby-Modus starten: \\ -- Stargate System aus dem Standby-Modus starten: StartStargateSystem() [[http://www.chromix.de/dedk/dokuwiki/doku.php/utilmaps:setupstargatesystem|Beispielkarte hier!]] ==== Übersicht über den System-Table: ==== Hier ist eine Übersicht über den StargateSystem-Table, wenn er mit allen Parametern gefüllt ist: \\ ( wird erst in aktion aufgefüllt - manches nur kurzzeitig, ... / die Werte [true,false,0,50,...] sind so in Ausgangsstellung ) \\ StargateSystem = { standby = false, users = {_player1, _player2, _player3, _playerN}, activatedConnections = { [1] = { [1] = { id = dialingOutSgID, name = "Stargate"..dialingOutSgID, effect = {offsetPos = 0, changePos = 50}, }, [2] = { id = dialingInSgID, name = "Stargate"..dialingInSgID, effect = {offsetPos = 0, changePos = 50}, }, counter = 380, } }, CheckDHDs = StartSimpleHiResJob("CheckDHDs"), HorizonEffects = StartSimpleHiResJob("ControlHorizonEffects"), HoleAktivitys = StartSimpleJob("ControlStargateHoleAktivitys"), [1] = { name = "Stargate1", pos = GetPosition( "Stargate1" ), place = GetPosition( "Stargate1Place" ), gateType = Logic.GetEntityType(GetEntityId( "Stargate1" )), orientation = Logic.GetEntityOrientation(GetEntityId( "Stargate1" )), dhd = { name = "DHD1", pos = GetPosition("DHD1"), ready = true, active = 0, }, choicePage = {[1] = {}, [2] = {}, [3] = {}, [n] = {}}, }, [2] = { name = "Stargate2", pos = GetPosition( "Stargate2" ), place = GetPosition( "Stargate2Place" ), gateType = Logic.GetEntityType(GetEntityId( "Stargate2" )), orientation = Logic.GetEntityOrientation(GetEntityId( "Stargate2" )), dhd = { name = "DHD2", pos = GetPosition("DHD2"), ready = true, active = 0, }, choicePage = {[1] = {}, [2] = {}, [3] = {}, [n] = {}}, }, [3] = { name = "Stargate3", pos = GetPosition( "Stargate3" ), place = GetPosition( "Stargate3Place" ), gateType = Logic.GetEntityType(GetEntityId( "Stargate3" )), orientation = Logic.GetEntityOrientation(GetEntityId( "Stargate3" )), dhd = { name = "DHD3", pos = GetPosition("DHD3"), ready = true, active = 0, }, choicePage = {[1] = {}, [2] = {}, [3] = {}, [n] = {}}, }, [n] = {} } ==== Der Code: ==== --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Stargate Funktionen beginnen hier! --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Comfort functions um ein Stargate-System zu etablieren Version 1.00 by Tenji ------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------- -- Setup Stargate System ------------------------------------------------------------------------------ function SetupStargateSystem( _gates, _systemUsers) assert(type(_gates) == "number" and _gates > 1, "SetupStargateSystem: _gates have to be a number, higher than 1!"); if _systemUsers ~= nil then assert(type(_systemUsers) == "table" and type(_systemUsers[1]) == "number", "SetupStargateSystem: _systemUsers have to be a table with numbers of players from 1 to 8!"); end -- Erstelle einen globalen Stargaate-System-Table StargateSystem = { standby = true, activatedConnections = {}, }; if _users == nil then StargateSystem.users = {1}; else StargateSystem.users = _systemUsers; end -- informationen über die Stargates speichern for i = 1, _gates do local stargate = "Stargate"..i; -- überprüfe, ob die angegebenen Stargates auf der Map existieren assert( IsExisting( stargate ), "SetupStargateSystem: "..stargate.." have to be on the map with the same Scriptname!" ); assert( IsExisting( "DHD"..i ), "SetupStargateSystem: DHD"..i.." have to be on the map with the same Scriptname!" ); local iTable = { name = stargate, pos = GetPosition( stargate ), gateType = Logic.GetEntityType(GetEntityId( stargate )), orientation = Logic.GetEntityOrientation(GetEntityId( stargate )), dhd = { name = "DHD"..i, pos = GetPosition("DHD"..i), ready = true, active = 0, }, choicePage = {}, }; -- füge das Stargate dem globalen Table hinzu table.insert( StargateSystem, iTable); end -- öffne die Stargates es und füge jeweils eine Ankunftsposition hinzu for i = 1, _gates do local pos = StargateSystem[i].pos; local position; if StargateSystem[i].orientation == 0 then position = {X = pos.X +500, Y= pos.Y}; elseif StargateSystem[i].orientation == 90 then position = {X = pos.X, Y= pos.Y +500}; elseif StargateSystem[i].orientation == 180 then position = {X = pos.X -500, Y= pos.Y}; elseif StargateSystem[i].orientation == 270 then position = {X = pos.X, Y= pos.Y -500}; end local place = CreateEntity( 4, Entities.XD_ScriptEntity, position, "Stargate"..i.."Place"); StargateSystem[i].place = GetPosition( place ); if StargateSystem[i].gateType == 390 then ReplaceEntity( StargateSystem[i].name, Entities.XD_WallStraightGate); elseif StargateSystem[i].gateType == 395 then ReplaceEntity( StargateSystem[i].name, Entities.XD_DarkWallStraightGate); elseif StargateSystem[i].gateType ~= 607 then -- wenn das Stargate kein Tor und keine ScriptEntity ist, dann "Error!" assert( false, "SetupStargateSystem: "..StargateSystem[i].name.." have to be a closed Door! Type 390 or 395, but not "..StargateSystem[i].gateType); end end -- ... und los! StartStargateSystem(); end --------------------------------------------------------------------------------------------- -- Restart Stargate System ------------------------------------------------------------------------------ function ReinstallStargateSystem( _gates, _systemUsers) assert(type(_gates) == "number" and _gates > 1, "ReinstallStargateSystem: _gates have to be a number, higher than 1!"); if _systemUsers ~= nil then assert(type(_systemUsers) == "table" and type(_systemUsers[1]) == "number", "ReinstallStargateSystem: _systemUsers have to be a table with numbers of players from 1 to 8!"); end -- System komplett löschen UninstallStargateSystem(); -- System neu erstellen if _systemUsers == nil then SetupStargateSystem( _gates); else SetupStargateSystem( _gates, _systemUsers); end end --------------------------------------------------------------------------------------------- -- Delate Stargate System ------------------------------------------------------------------------------ function UninstallStargateSystem() assert( StargateSystem ~= nil and table.getn(StargateSystem) > 1, "UninstallStargateSystem: StargateSystem have to be installed by ´SetupStargateSystem´ bevore!"); -- System Herunterfahren StandbyStargateSystem(); -- ermittle Systemgröße local systemSize = table.getn(StargateSystem); -- deaktiviere Stargate-Entitäten for i = 1, systemSize do local stargate = StargateSystem[i].name; local gateType = Logic.GetEntityType(GetEntityId(stargate)); -- entferne die Stargate-Positionen-Entities DestroyEntity("Stargate"..i.."Place"); -- schließe die Stargates auf der Karte if gateType == 389 then ReplaceEntity(stargate, Entities.XD_WallStraightGate_Closed); elseif gateType == 394 then ReplaceEntity(stargate, Entities.XD_DarkWallStraightGate_Closed); end end -- lösche Systemdaten StargateSystem = nil; end --------------------------------------------------------------------------------------------- -- Stargate Systeme auf Standby ------------------------------------------------------------------------------ function StandbyStargateSystem() assert( StargateSystem ~= nil and table.getn(StargateSystem) > 1, "StandbyStargateSystem: StargateSystem have to be installed by ´SetupStargateSystem´ bevore!"); -- Alle Systeme zurücksetzen: ------------------------------------------- -- die "Wurmloch-Funktion" if StargateSystem.HoleAktivitys ~= nil then EndJob( StargateSystem.HoleAktivitys ); StargateSystem.HoleAktivitys = nil; end ------------------------------------------- -- die "Ereignishorizont-Effekte" if StargateSystem.HorizonEffects ~= nil then EndJob( StargateSystem.HorizonEffects ); StargateSystem.HorizonEffects = nil; end ------------------------------------------- -- die Anwahlbereitschaft der DHDs if StargateSystem.CheckDHDs ~= nil then EndJob( StargateSystem.CheckDHDs ); StargateSystem.CheckDHDs = nil; end ------------------------------------------- -- die Daten for i = 1,table.getn(StargateSystem) do StargateSystem[i].dhd.ready = true; StargateSystem[i].dhd.active = 0; end StargateSystem.activatedConnections = {}; ------------------------------------------- -- Standby-Modus aktiv StargateSystem.standby = true; end --------------------------------------------------------------------------------------------- -- Starte das Stargate System ------------------------------------------------------------------------------ function StartStargateSystem() assert( StargateSystem ~= nil and table.getn(StargateSystem) > 1, "StartStargateSystem: StargateSystem have to be installed by ´SetupStargateSystem´ bevore!"); if StargateSystem.standby then -- Standby-Modus inaktiv StargateSystem.standby = false; -- die Anwahlbereitschaft der DHDs überwachen StargateSystem.CheckDHDs = StartSimpleJob("CheckDHDs"); end end --------------------------------------------------------------------------------------------- -- Prüfe, ob anwahlberechtigte Entities am DHD stehen ------------------------------------------------------------------------------ function AreEntitiesAtDHD( _dhd ) local dhd; if type(_dhd) == "string" then dhd = _dhd; elseif type(_dhd) == "number" then dhd = "DHD".._dhd; else assert( false, "SgSystem: _dhd have to be type string or number!"); end if AreUseAllowedEntitiesNear( dhd, 300 ) then return true; else return false; end end --------------------------------------------------------------------------------------------- -- Prüfe, ob Entities mit Nutzungsberechtigung in der Nähe sind ------------------------------------------------------------------------------ function AreUseAllowedEntitiesNear( _entityOrPos, _range ) local pos; if type(_entityOrPos) == "table" and type(_entityOrPos.X) == "number" and type(_entityOrPos.Y) == "number" then pos = _entityOrPos; elseif type(_entityOrPos) == "string" or type(_entityOrPos) == "number" then pos = GetPosition( _entityOrPos ); else assert( false, "SgSystem: _entityOrPos have to be type table {X = number, Y = number} or type string (name of Entity) or type number (ID of Entity)!"); end assert(type(_range) == "number", "SgSystem: _range have to be type number!"); local data = {Logic.GetPlayerEntitiesInArea( 1, 0, pos.X, pos.Y, _range, 10)}; local amount = table.remove(data, 1); for i = 1, amount do -- so umständlich, weil "Logic.IsPlayerEntityOfCategoryInArea" einfach nicht funktioieren will ! if Logic.IsEntityInCategory(data[i], EntityCategories.Military) == 1 and Logic.IsEntityInCategory(data[i], EntityCategories.Soldier) == 0 then return true; end end -- wenn es bis hier durchläuft, ist niemand berechtigter da return false; end --------------------------------------------------------------------------------------------- -- DHD ( Dial Home Device ) - Funktionen ------------------------------------------------------------------------------ function CheckDHDs() for i = 1,table.getn( StargateSystem ) do local dhd = StargateSystem[i].dhd; -- prüfen, ob das DHD bereit ist, ... if ( dhd.ready == false ) and not AreEntitiesAtDHD(i) then -- war nicht bereit -- ist jetzt wieder bereit / wird nicht verwendet dhd.ready = true; elseif ( dhd.ready == true ) and AreEntitiesAtDHD(i) then -- war bereit -- ist jetzt nichtmehr bereit / wird verwendet dhd.ready = false; -- ... wenn ja, Entities in Richtung DHD blicken lassen, ... for u = 1,table.getn(StargateSystem.users) do local player = StargateSystem.users[u]; local data = {Logic.GetPlayerEntitiesInArea( player, 0, dhd.pos.X, dhd.pos.Y, 300, 10)}; local amount = table.remove(data, 1); for e = 1, amount do if Logic.IsBuilding(data[e]) == 0 then LookAt( data[e], dhd.name ); end end end -- ... und entsprechendes Briefing starten! if dhd.active == 1 then CreateDialOutDHDBriefing(i); elseif dhd.active == 2 then CreateDialInDHDBriefing(i); else CreateDHDBriefing(i); end end end end --------------------------------------------------------------------------------------------- -- Dialing Out DHD Briefing ------------------------------------------------------------------------------ function CreateDialOutDHDBriefing( _dialingOutDHDid) -- Das lokale Briefing local briefing = {}; -- AddPage Funktion local AP = function( _page ) table.insert( briefing, _page ); return _page; end -- das angewählte DHD heraus suchen local cons = StargateSystem.activatedConnections; local dialingInDHDid; for i = table.getn(cons),1,-1 do if cons[i][1].id == _dialingOutDHDid then dialingInDHDid = cons[i][2].id; end end -- Seite 1 local choicePage = AP{ mc = { -- Multiple Choice title = "", text = "Die von diesem DHD ausgehende Aktivierung abschalten, Sir?", firstText = "Ja, DHD".._dialingOutDHDid.." abschalten!", secondText = "Nein, Aktivierung Stargate ".._dialingOutDHDid.." - "..dialingInDHDid.." beibehalten!", firstSelected = 2, -- -> Ende secondSelected = 2, -- -> Ende }, position = GetPosition("DHD".._dialingOutDHDid), dialogCamera = true, }; -- Seite 2 AP(); -- dient als Endseite -- Die finished Funktion: briefing.finished = function() -- wenn abgebrochen wurde, dann ... if GetSelectedBriefingMCButton( choicePage ) == 1 then DeactivateConnection(_dialingOutDHDid); end end -- ... und los! StartBriefing( briefing ); end --------------------------------------------------------------------------------------------- -- Dialing In DHD Briefing ------------------------------------------------------------------------------ function CreateDialInDHDBriefing( _dialingInDHDid) -- Das lokale Briefing local briefing = {}; -- AddPage Funktion local AP = function( _page ) table.insert( briefing, _page ); return _page; end -- das anwählende DHD heraus suchen local cons = StargateSystem.activatedConnections; local dialingOutStargate; for i = table.getn(cons),1,-1 do if cons[i][2].id == _dialingInDHDid then dialingOutStargate = cons[i][1].name; end end -- Seite 1 AP{ text = "Sir, eine eingehende Aktivierung von "..dialingOutStargate.."! \n \n Wir können nicht rauswählen!", position = GetPosition("DHD".._dialingInDHDid), dialogCamera = true, }; -- ... und los! StartBriefing( briefing ); end --------------------------------------------------------------------------------------------- -- DHD Briefing ------------------------------------------------------------------------------ function CreateDHDBriefing( _dialingOutSgID) -- Das lokale Briefing local briefing = {}; -- AddPage Funktion local AP = function( _page ) table.insert( briefing, _page ); return _page; end -- lokale Speicherung local tableN = table.getn(StargateSystem); local dialingInSgID; local stopped = true; -- Endseite festlegen local lastPage = 4 for i = 1,tableN do if i ~= _dialingOutSgID and StargateSystem[i].dhd.active == 0 then lastPage = lastPage +1; end end local endPage = lastPage -1; local nextpage = 2; -- Seite 1 local firstChoicePage = AP{ mc = { -- Multiple Choice title = "", text = "Sir, wir kennen "..tableN.." Toradressen!", firstText = "Eine anwählen!", secondText = "Abbrechen!", firstSelected = 2, -- -> Erste Stargateanwahlseite secondSelected = endPage, -- -> Ende }, position = GetPosition("DHD".._dialingOutSgID), dialogCamera = true, }; -- je nach Systemgröße und Bereitschaft Anwahlmöglichkeiten bieten for i = 1,tableN do if i ~= _dialingOutSgID and StargateSystem[i].dhd.active == 0 then nextpage = nextpage +1; -- page # 1 - tableN StargateSystem[_dialingOutSgID].choicePage[i] = AP{ mc = { -- Multiple Choice title = "", text = "Welches Gate sollen wir anwählen?", firstText = "Stargate"..i, secondText = "Nächstes", firstSelected = lastPage, -- -> Nächste Stargateanwahlseite secondSelected = nextpage, -- -> Nächste Auswahlseite }, dialogCamera = true, }; end end -- restart ? page local secChoicePage = AP{ mc = { -- Multiple Choice title = "", text = "Sir, mehr Toradressen kennen wir nicht!", firstText = "Eine anwählen!", secondText = "Abbrechen!", firstSelected = 2, -- -> Erste Stargateanwahlseite secondSelected = endPage, -- -> Ende }, dialogCamera = true, }; -- end page AP(); -- dient als Ende -- last page AP{ text = "Ja Sir, aktiviere Stargate!", position = GetPosition("Stargate".._dialingOutSgID), action = function() -- angewähltes Stargate merken for i = tableN,1,-1 do if i ~= _dialingOutSgID and GetSelectedBriefingMCButton( StargateSystem[_dialingOutSgID].choicePage[i] ) == 1 then dialingInSgID = i; break end end assert(type(dialingInSgID) == "number", "SgSystem: dialingInSgID have to be a number!"); -- Verbindung im globalen Table katalogisieren StargateSystem[_dialingOutSgID].dhd.active = 1; StargateSystem[dialingInSgID].dhd.active = 2; local iTable = { { -- "StargateSystem.activatedConnections[1][1]" _ entspricht "dialOut" id = _dialingOutSgID, name = "Stargate".._dialingOutSgID, effect = {offsetPos = 0, changePos = 50}, }, { -- "StargateSystem.activatedConnections[1][2]" _ entspricht "dialIn" id = dialingInSgID, name = "Stargate"..dialingInSgID, effect = {offsetPos = 0, changePos = 50}, }, counter = 380, }; table.insert(StargateSystem.activatedConnections, iTable); -- den Ereignishorizont-Effekt starten StargateSystem.HorizonEffects = StargateSystem.HorizonEffects or StartSimpleHiResJob("ControlHorizonEffects"); stopped = false; Message("Stargate Aktivierung erfolgt!"); end } -- Die finished Funktion: briefing.finished = function() -- wenn abgebrochen wurde, dann aktiviere die Stargate-Funktion! if not stopped then StargateSystem.HoleAktivitys = StargateSystem.HoleAktivitys or StartSimpleJob("ControlStargateHoleAktivitys"); StargateSystem.Counter = StargateSystem.Counter or StartSimpleJob("CountingStargateActivitys"); end end -- ... und los! StartBriefing( briefing ); end --------------------------------------------------------------------------------------------- -- Wurmloch Funktion ------------------------------------------------------------------------------ function ControlStargateHoleAktivitys() -- System-Verzeichnis-Verlauf abkürzen local cons = StargateSystem.activatedConnections; for c = table.getn(cons),1,-1 do -- locale Variablen festlegen local outDialStargate = StargateSystem[cons[c][1].id]; local inDialStargate = StargateSystem[cons[c][2].id]; local outHorizonPos = outDialStargate.pos; local inHorizonPos = inDialStargate.pos; -- Entities aller Systembenutzer im Anwahlberich ermitteln, ... for u = 1,table.getn(StargateSystem.users) do local player = StargateSystem.users[u]; local data = {Logic.GetPlayerEntitiesInArea( player, 0, outHorizonPos.X, outHorizonPos.Y, 200, 10)}; local amount = table.remove(data, 1); -- ... und durch das Stargate schicken for i = 1, amount do if Logic.IsEntityInCategory(data[i], EntityCategories.Military) == 1 and Logic.IsEntityInCategory(data[i], EntityCategories.Soldier) == 0 then local id = GetEntityId( data[i]); if GetEntityName( id) == nil then -- eventuell lokalen Namen vergeben, ... SetEntityName(id, "DataEntity"..i); end local name = GetEntityName( id); SetPosition( data[i], inHorizonPos); Move( name, inDialStargate.place); NpcIsObservedIDUpdate( id, name); -- ... und nach Gebrauch wieder löschen local newId = GetEntityId( name ); if name == "DataEntity"..i then SetEntityName( newId, nil ); end -- ermitteln, ob noch jemand rumsteht, ... if not AreUseAllowedEntitiesNear( outDialStargate.place, 500 ) and outDialStargate.dhd.ready == true then -- ... wenn nicht, Ankunfts-Briefing starten CreateWurmlochBriefing( newId , cons[c][1].id); end end end end end end --------------------------------------------------------------------------------------------- -- Briefing-npc.id update ------------------------------------------------------------------------------ -- Hier wird die npc.id in den Npc-briefings aktualisiert function NpcIsObservedIDUpdate( _id, _name) -- prüfen, ob es der Entity ein Briefing übergeben wurde local newId = GetEntityId( _name); if NPC ~= nil then local npc = NPC[_id]; if npc ~= nil then if npc.briefing ~= nil then -- wenn ja, alle Seiten durchgehen for j = 1, table.getn(npc.briefing) do if npc.briefing[j].npc ~= nil then -- und wenn npc.isObserved mit der alten Id verwendet wird, ... if npc.briefing[j].npc.id == _id or npc.briefing[j].npc.id == 0 then -- ... dann die Id aktualisieren! npc.briefing[j].npc.id = newId; end end end end end end end --------------------------------------------------------------------------------------------- -- Voyager Briefing ------------------------------------------------------------------------------ function CreateWurmlochBriefing(_entity, _dialingOutSgID) -- Das lokale Briefing local briefing = {}; -- AddPage Funktion local AP = function( _page ) table.insert( briefing, _page ); return _page; end -- Seite 1 local showVoyager = AP{ text = "Das ist immer wieder Cool!", npc = { id = GetEntityId( _entity), isObserved = true}, dialogCamera = true, }; briefing.finished = function() ResolveBriefing( showVoyager ); DeactivateConnection( _dialingOutSgID ); end -- ... los! StartBriefing( briefing ); end --------------------------------------------------------------------------------------------- -- Ereignishorizont Effekt ------------------------------------------------------------------------------ function ControlHorizonEffects() -- System-Verzeichnis-Verlauf abkürzen local cons = StargateSystem.activatedConnections; for c = table.getn(cons),1,-1 do for i = 1,2 do local conSg = cons[c][i]; local effect = conSg.effect; local sg = StargateSystem[conSg.id]; -- Ausrichtung des Effects festlegen if sg.orientation == 0 or sg.orientation == 180 then Logic.CreateEffect(GGL_Effects.FXDie, sg.pos.X, sg.pos.Y -150 +effect.offsetPos, 4); else Logic.CreateEffect(GGL_Effects.FXDie, sg.pos.X -150 +effect.offsetPos, sg.pos.Y, 4); end -- Effect kreieren effect.offsetPos = effect.offsetPos + effect.changePos; if effect.offsetPos > 300 then effect.offsetPos = 300; effect.changePos = effect.changePos * -1; end if effect.offsetPos < 0 then effect.offsetPos = 0; effect.changePos = effect.changePos * -1; end end end end ------------------------------------------------------------------------------------------------- -- Automatischen Abschalten des Stargates nach 3,8 Minuten ------------------------------------------------------------------------------ -- ( in der TV-Serie "Stargate" sind es eigentlich 38 Minuten ) function CountingStargateActivitys() -- System-Verzeichnis-Verlauf abkürzen local cons = StargateSystem.activatedConnections; -- für jede Verbindung den counter herunterzählen for i = table.getn(cons),1,-1 do if ( cons[i].counter > 0 ) then if ( cons[i].counter == 380 ) then Message("3,8 Minuten bis zum automatischen Abschalten des Stargates!"); end cons[i].counter = cons[i].counter -1; else -- wenn der counter abgelaufen ist, Verbindung trennen DeactivateConnection( cons[i][1].id ); Message("Automatische Deaktivierung des Stargates erfolgt!"); end end -- wenn keine Verbindungen mehr aktiv sind, den Job beenden if table.getn(cons) == 0 then StargateSystem.Counter = nil; return true; end end function DeactivateConnection( _dialingOutSgID ) -- System-Verzeichnis-Verlauf abkürzen local cons = StargateSystem.activatedConnections; -- die aktuelle ID der zu trennenden Verbindung ermitteln for i = table.getn(cons),1,-1 do if cons[i][1].id == _dialingOutSgID then -- die DHDs beider Stargates der zu trennenden Verbindung sind jetzt nichtmehr aktiv StargateSystem[_dialingOutSgID].dhd.active = 0; StargateSystem[cons[i][2].id].dhd.active = 0; -- die Verbindung trennen table.remove(cons,i); break; end end -- falls keine Verbindungen mehr bestehen, ... if table.getn(cons) == 0 then -- ... und die Jobs noch laufen, dann beenden! if StargateSystem.HoleAktivitys ~= nil then EndJob( StargateSystem.HoleAktivitys ); StargateSystem.HoleAktivitys = nil; end if StargateSystem.HorizonEffects ~= nil then EndJob( StargateSystem.HorizonEffects ); StargateSystem.HorizonEffects = nil; end end end --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- Stargate Funktionen enden hier! --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ==== Die Zusatzcode: ==== ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- Comfort function zum aufrufen von Aktionen im Briefing ------------------------------------------------------------------------------------------------------------------------------------------------------------ function Briefing_ExtraWrapper( _v1, _v2 ) for i = 1, 2 do --alt local theButton = "CinematicMC_Button" .. i; XGUIEng.DisableButton( theButton, 1 ); XGUIEng.DisableButton( theButton, 0 ); end if _v1.action then --neu assert( type(_v1.action) == "function" ); if type(_v1.parameters) == "table" then _v1.action(unpack2(_v1.parameters)); else _v1.action(_v1.parameters); end end Briefing_ExtraOrig( _v1, _v2 ); end Briefing_ExtraOrig = Briefing_Extra; Briefing_Extra = Briefing_ExtraWrapper; ------------------------------------------------------------------------------------------------------------------------------------------------------------ -- "SetPosition" optimierung by Old McDonald ------------------------------------------------------------------------------------------------------------------------------------------------------------ function SetPosition(_entity, _position) assert(type(_entity) == "string" or type(_entity) == "number"); assert(type(_position) == "table" and type(_position.X) == "number" and type(_position.Y) == "number"); if IsDead(_entity) then return; end _entity = GetEntityId(_entity); local hurt = Logic.GetEntityMaxHealth(_entity) - Logic.GetEntityHealth(_entity); local entityType = Logic.GetEntityType(_entity); local name = Logic.GetEntityName(_entity); local player = Logic.EntityGetPlayer(_entity); local wasSelected = IsEntitySelected(_entity); local orientation = Logic.GetEntityOrientation(_entity); if wasSelected then GUI.DeselectEntity(_entity); end local newEntityId; --leader is a special case... if Logic.IsLeader(_entity) == 1 then local army = AI.Entity_GetConnectedArmy(_entity); local numberOfSoldiers = Logic.LeaderGetNumberOfSoldiers(_entity); local soldiers = {Logic.GetSoldiersAttachedToLeader(_entity)}; local soldierType = Logic.LeaderGetSoldiersType(_entity); local allHurts = {}; assert(numberOfSoldiers == table.remove(soldiers, 1)); for i = 1, numberOfSoldiers, 1 do --get hurt table.insert(allHurts, Logic.GetEntityMaxHealth(soldiers[i]) - Logic.GetEntityHealth(soldiers[i])); --destroy Logic.DestroyEntity(soldiers[i]); end --destroy leader Logic.DestroyEntity(_entity); --create leader newEntityId = Logic.CreateEntity(entityType, _position.X, _position.Y, orientation, player); for i = 1, numberOfSoldiers, 1 do --create soldier local soldierId = Logic.CreateEntity(soldierType, _position.X, _position.Y, orientation, player); --hurt soldier Logic.HurtEntity(soldierId, allHurts[i]); end --add soldier Tools.AttachSoldiersToLeader(newEntityId, numberOfSoldiers); if army ~= -1 then AI.Entity_ConnectLeader(newEntityId, army); end else --destroy entity Logic.DestroyEntity(_entity); --create entity newEntityId = Logic.CreateEntity(entityType, _position.X, _position.Y, orientation, player); end --entity name if name ~= nil then Logic.SetEntityName(newEntityId, name); end --selection if wasSelected then GUI.SelectEntity(newEntityId); end GroupSelection_EntityIDChanged(_entity, newEntityId); --hurt it Logic.HurtEntity(newEntityId, hurt); end ===== Schlusswort ===== Vielen Dank an Old McDonald für die SetPosition-Optimierung! :-)Tenji [2005/11/12 19:22] \\ \\ \\ Bei Problemen bitte [[http://www.siedler-portal.de/vb3/forumdisplay.php?f=95|hier]] im Forum melden! \\ \\ \\ [[:tutorials:index|Zur Tutorial-Übersicht]] \\