modding-guide

CodeSnippets

Some code snippets which might be usueful.

logging

-- logging https://github.com/anno-mods/modding-guide/blob/main/Scripting/ExecutingScripts.md#logging
local function modlog(t)
  local file = io.open("logs/modlog.txt", "a")
  io.output(file)
  io.write(t,"\n")
  io.close(file)
end 

GetSessionObjectsFromHuman

(CLICK) CODE ```lua -- returns a table like: -- {SessionGUID=SessionGUID, ParticipantID=ParticipantID, Objects=Objects} -- with Objects[OID] = {GUID=GUID,userdata=userdata,GameObject=GameObject} -- with objects from the executing player from the session he is currently in -- I don't know a way to get objects from other players, especially non human and from other sessions. -- with GameObject you can do textsource commands of "CGameObject" (see textsourcelist.json), BUT after you did eg. "GameObject.GetGUID()", do a "GameObject = ts.Objects.GetObject(OID)" again, because GameObject gets corrupted each time. -- with userdata you can do some undocumented commands like userdata:changeGUID(ToGUID) or :moveTo(), :setPosition(), :destruct() :kill() (found these commands here https://github.com/ChrisAnd1998/Anno1800PythonAPI/blob/main/DUMP/x64dbg_Strings.txt ) -- you can also get selected userdata by "session.getSelectedFactory()", beware that in coop game the same player can have multiple objects selected, while you only get one depending on the executing PC... -- For propertyID see https://github.com/anno-mods/modding-guide/blob/main/Scripting/ENUMs.md#propertyids -- written by Serp local function GetSessionObjectsFromHuman(propertyID) local function get_oid(userdata) local oid,Namestring Namestring = userdata:getName() -- returns eg. "GameObject, oid 8589934647", while getOID returns an local ObjectID, not usuable in ts.Objects.GetObject. if Namestring~=nil and type(Namestring)=="string" then oid = string.match(Namestring, "oid (.*)") if oid~=nil and type(oid)=="string" then oid = tonumber(oid) end end return oid end local userdatas,userdata,ParticipantID,GameObject,GUID local Objects = {} userdatas = session.getObjectGroupByProperty(propertyID) local SessionGUID = session.getSessionGUID() if userdatas~=nil and #userdatas>0 then userdata = nil for k,userdata in pairs(userdatas) do if userdata~=nil then GameObject,GUID = nil local OID = get_oid(userdata) -- it is important to do GameObject = ts.Objects.GetObject(OID) several times, because it is broken after we do eg. GameObject.GetGUID() !! GameObject = ts.Objects.GetObject(OID) GUID = GameObject.GetGUID() if ParticipantID==nil then -- will be the same for all objects, so no need to get it multiple times GameObject = ts.Objects.GetObject(OID) ParticipantID = GameObject.GetOwner() -- ParticipantID end GameObject = ts.Objects.GetObject(OID) Objects[OID] = {GUID=GUID,userdata=userdata,GameObject=GameObject} end end end return {SessionGUID=SessionGUID, ParticipantID=ParticipantID, Objects=Objects} end ```