Um eine Mod zu erstellen, die auf Ingame Events reagieren kann, muss man ein Game Script anlegen.
Dazu erstellt man im Mod-Ordner einen Ordner /res/config/game_script
Dort legt man dann die Datei modname.lua mit folgendem Grundgerüst an:
function data()
return {
ini = function()
end,
handleEvent = function (src, id, name, param)
end,
guiHandleEvent = function (id, name, param)
end,
update = function()
end,
guiUpdate = function()
end,
save = function()
return allState
},
load = function (allState)
end,
}
end
Alles anzeigen
handleEvent und update laufen im Game Thread, guiHandleEvent und guiUpdate laufen im Gui Thread.
Man kann Daten von der Gui zum Script schicken mit game.interface.sendScriptEvent(id, name, param)
Dabei drann denken, das dieses Event alle anderen aktiven GameScripte auch erhalten können.
Die Funktion guiUpdate wird recht regelmäßig getriggert, muss noch herausfinden, ob bei jedem Tick.
Ich werde mich jetzt erstmal weiter durch die Vanilla Files wühlen, um zu sehen, was man alles anstellen kann.
GameScript State Handling (Eigenarten):
save() und load() werden während eines Fames mehrmals (bei mir 3 mal) abwechselnd aufgerufen.
Dabei wird save() aus dem Game-Threads angestoßen, in denen auch update() und handleEvent() ausgeführen wird.
load() dagen wird im GUI-Thread aufgerufen, wie guiHandleEvent() und guiUpdate()
Wenn ein Spieler sein Spiel speichert, wird zusätzlich save() mehrmals aufgerufen.
Und wenn der Spieler ein Spiel startet, wird load() mehrmals ausgelöst, aber nur für die Game-Threads.
Der Zustand innerhalb eines GameScripts kann nur durch die Wechselaufrufe von save() und load() vom Game-Thread zum GUI-Thread gelangen.
Anders rum muss game.interface.sendScriptEvent() im GUI-Thread aufgerufen werden und dieser in handleEvent() dann im Game-Thread verarbeitet.
Es gibt zudem wesentlich mehr Funktionen, die man nun verwenden kann. Hier schon mal ne einfache Liste:
-- game.gui functions (nur im GUI Thread):
-- absoluteLayout_addItem
-- absoluteLayout_deleteAll
-- absoluteLayout_setPosition
-- addTask
-- boxLayout_addItem
-- boxLayout_create
-- button_create
-- calcMinimumSize
-- component_create
-- component_setLayout
-- component_setStyleClassList
-- component_setToolTip
-- component_setTransparent
-- getCamera
-- getContentRect
-- getMousePos
-- getTerrainPos
-- imageView_create
-- imageView_setImage
-- isEditor
-- isGuideSystemActive
-- openWindow
-- playCutscene
-- playSoundEffect
-- playTrack
-- setAutoCamera
-- setCamera
-- setConstructionAngle
-- setEnabled
-- setHighlighted
-- setMedalsCompletion
-- setMissionComplete
-- setTaskProgress
-- setVisible
-- showTask
-- stopAction
-- textView_create
-- textView_setText
-- window_close
-- window_create
-- window_setIcon
-- window_setPosition
-- window_setTitle
-- game.interface functions (größtenteils nur im GameThread):
-- addPlayer
-- book
-- buildConstruction
-- bulldoze
-- clearJournal
-- findPath
-- getBuildingType
-- getBuildingTypes
-- getCargoType
-- getCargoTypes
-- getCompanyScore
-- getConstructionEntity
-- getDateFromNowPlusOffsetDays
-- getDepots
-- getDestinationDataPerson
-- getEntities
-- getEntity
-- getGameDifficulty
-- getGameSpeed
-- getGameTime
-- getHeight
-- getIndustryProduction
-- getIndustryProductionLimit
-- getIndustryShipping
-- getIndustryTransportRating
-- getLines
-- getLog
-- getMillisPerDay
-- getName
-- getPlayer
-- getPlayerJournal
-- getStationTransportSamples
-- getStations
-- getTownCapacities
-- getTownCargoSupplyAndLimit
-- getTownEmission
-- getTownReachability
-- getTownTrafficRating
-- getTownTransportSamples
-- getTowns
-- getVehicles
-- getWorld
-- replaceVehicle
-- setBuildInPauseModeAllowed
-- setBulldozeable
-- setDate
-- setGameSpeed
-- setMarker
-- setMaximumLoan
-- setMillisPerDay
-- setMinimumLoan
-- setMissionState
-- setName
-- setPlayer
-- setTownCapacities
-- setTownDevelopmentActive
-- setZone
-- spawnAnimal
-- startEvent
-- sendScriptEvent(id, name, param) -- nur im GUI Thread verfügbar
-- upgradeConstruction
Kommentare 1
Neu erstellte Kommentare unterliegen der Moderation und werden erst sichtbar, wenn sie durch einen Moderator geprüft und freigeschaltet wurden.
Neu erstellte Kommentare unterliegen der Moderation und werden erst sichtbar, wenn sie durch einen Moderator geprüft und freigeschaltet wurden.
brunna
Kann mir jemand ein Beispiel für diese Funktion schreiben "replaceVehicle"? Ich habe es mit CommonAPI2 getestet, aber ich konnte die Parameter nicht richtig angeben.
VacuumTube
Habe den Eintrag mal umfassend überarbeitet, sortiert und einige Informationen hinzugefügt.
Danke an alle für die bisherigen Infos
Was save und load angeht, so bin ich mir mit der Angabe, dass diese 3 mal in einem Frame aufgerufen werden, unsicher. Ich hatte den Eindruck, dass save und load ähnlich wie update aufgerufen werden.
melectro
Hat jemand startEvent getestet? Wenn ich dieselbe Zeile verwende, die in TpF1 funktioniert, erhalte ich jetzt eine CTD in TpF2.
Has anyone tested startEvent? When I use the same line that works in TpF1 I now get a CTD in TpF2.
stdout.txt
c:\build\tpf2_steam\src\game\scripting\interface.cpp:2320: auto __cdecl scripting::SetupInterface::<lambda_d632bb7827acf6d5147b617fa6d1eaa7>::operator ()(class lua::State &) const: Assertion `false' failed.
melectro
I have got a quick answer from UG and "startEvent" function is not supported for the moment.
PMV
War mal so frei und hab ein bischen was ergänzt
Verständlichere Formulierungen und noch mehr Infos wären aber sich wünschenswert, damit kann ich aber leider erst mal nicht dienen.
MFG PMV