Epic's "Core" Error running Lua task: [4C6A178280F8DC08]?
Ich spiele gerade ein wenig mit der Epic "Core"-Engine rum. Die benutzt die Lua-Version 5.3.6. - Ich bin absoluter Laie was coden angeht. Hab als Kind mal das ein oder andere Programm mit Visual Basic geschrieben und war stolz drauf. Das wars dann aber auch. Ich möchte verstehen wo der Fehler liegt.
Ich versuche das "META Inventory System" in Kombination mit dem "NPC AI Kit" zum laufen zu kriegen. Sobald ich einen NPC angreife kommt folgende Fehlermeldung:
Error running Lua task: [4C6A178280F8DC08] NPCKitTagGetter:164: attempt to index a nil value (local 'obj')
Soweit ich weiß heißt "nil" = non-existence or nothingness, bedeutet das der Code findet ein Objekt nicht?
Im Code selbst an der besagten Stelle, Line164: if obj.serverUserData and obj.serverUserData.combatTags then tagTable = obj.serverUserData.combatTags
Der NPC kann mir schaden zufügen und mich sogar besiegen. Sobald ich den NPC angreife nimmt er von diesem einen Angriff Schaden und danach keinen mehr, ab meinem ersten Angriff kann er mir auch keinen Schaden mehr zufügen. Das Game freezed jetzt nicht, aber es bricht halt die Gamemechanic so das es keinen Sinn mehr macht weiter zu spielen.
Ich bin da jetzt schon seit gut 4-5 Stunden dran.. und Tutorials zu dem Fehler gibt es auch nicht. Bin auch schon auf einem Discord extra für Lua Scripter gegangen, bisher konnte aber niemand helfen.
Vielleicht findet sich ja hier ein schlafloser Programmierer in Helferlaune. :)
Wenn noch was gebraucht wird an Info, gebe ich die natürlich. Ich lass den Tab mal offen und versuch weiter das Ding zum laufen zu kriegen.
1 Antwort
Hallo.
Ich habe zwar nicht wirklich einen Schimmer was du da machst, aber
if obj.serverUserData and obj.serverUserData.combatTags then
in Verbindung mit
Error running Lua task: [4C6A178280F8DC08] NPCKitTagGetter:164: attempt to index a nil value (local 'obj')
bedeutet schlicht, dass in obj keinerlei Informationen stehen, also keine Felder wie serverUserData hat auf welche du zu zugreifen versuchst. Die Fehlermeldung selbst könntest du mit
if obj and obj.serverUserData and obj.serverUserData.combatTags then
beheben, aber das wird das eigentliche Problem nicht angehen, wieso das Objekt null ist.
Ohne weiteren Code können wir dir da auch nicht helfen. Das könnten einfache Fehler wie z. B. falsche Variablenamen oder fehlerhafte Zuweisung sein, es könnten aber auch schwerwiegendere Probleme sein, die mit den eigentlichen Libs zusammenhängen, die du als Laie unmöglich losen kannst.
Teil 2:
-- NPC/Equipment
elseif obj.GetCustomProperties ~= nil then
if obj.serverUserData then
-- Cache tags into user data table
obj.serverUserData.combatTags = API.GetTags(obj)
API.AddTag(obj.serverUserData.combatTags, tag, isTemporary)
else
warn("Tried to add tag " .. tag .. " to " .. tostring(obj) .. " but was not in server.")
end
else
warn("Tried to add tag " .. tag .. " to " .. tostring(obj) .. " but it's not a valid object type.")
end
end
-- Adds a tag to an object/table, but only if that tag does not exist yet
function API.AddUnique(obj, tag, isTemporary)
if not API.Contains(obj, tag) then
API.AddTag(obj, tag, isTemporary)
end
end
-- Remove a tag from a table or object
function API.RemoveTag(obj, tag)
-- Player or NPC/Equipment that's already been cached
if obj.serverUserData and obj.serverUserData.combatTags then
API.RemoveTag(obj.serverUserData.combatTags, tag)
-- Table
elseif type(obj) == "table" then
if obj[tag] then
obj[tag] = obj[tag] - 1
if obj[tag] <= 0 then
obj[tag] = nil
end
end
-- NPC/Equipment
elseif obj.GetCustomProperties ~= nil then
if obj.serverUserData then
-- Cache tags into user data table
obj.serverUserData.combatTags = API.GetTags(obj)
API.RemoveTag(obj.serverUserData.combatTags, tag)
else
warn("Tried to remove tag " .. tag .. " from " .. tostring(obj) .. " but was not in server.")
end
else
warn("Tried to remove tag " .. tag .. " from " .. tostring(obj) .. " but it's not a valid object type.")
end
end
-- Given an object and a tag, searches that object/player/table to see if
-- it contains that tag.
function API.Contains(obj, compareTo)
-- Player or NPC/Equipment that's already been cached
if obj.serverUserData and obj.serverUserData.combatTags then
return obj.serverUserData.combatTags[compareTo] ~= nil
-- Table
elseif type(obj) == "table" then
return obj[compareTo] ~= nil
-- NPC/Equipment
elseif obj.GetCustomProperties ~= nil then
if obj.serverUserData then
-- Cache tags into user data table
obj.serverUserData.combatTags = API.GetTags(obj)
return obj.serverUserData.combatTags[compareTo] ~= nil
end
-- This is probably called in client context? Support it anyway
for k,tag in pairs(obj:GetCustomProperties()) do
if tag == compareTo and string.sub(k,1,4) == "Tag_" then
return true
end
end
end
return false
end
-- Clears from
local temporaryTags = {}
function API.ClearTemporary(obj)
local tagTable = obj
if obj.serverUserData and obj.serverUserData.combatTags then
tagTable = obj.serverUserData.combatTags
elseif obj.GetCustomProperties ~= nil then
tagTable = API.GetTags(obj)
end
local tempTags = temporaryTags[tagTable]
if tempTags then
for _,tag in ipairs(tempTags) do
API.RemoveTag(tagTable, tag)
end
end
end
function AddTemporary(tagTable, tag)
if not temporaryTags[tagTable] then
temporaryTags[tagTable] = {}
end
table.insert(temporaryTags[tagTable], tag)
end
-- Converts a table of tags into
function API.Serialize(obj)
local tagTable = obj
if obj.serverUserData and obj.serverUserData.combatTags then
tagTable = obj.serverUserData.combatTags
elseif obj.GetCustomProperties ~= nil then
tagTable = API.GetTags(obj)
end
local result = ""
for k,v in pairs(tagTable) do
while v > 0 do
if result == "" then
result = k
else
result = result .. "," .. k
end
v = v - 1
end
end
return result
end
return API
Ziel ist es das ich in meinem Spiel die Gegner angreifen kann um ihnen Lebenspunkte abzuziehen. Nur irgendwie will er nach dem ersten Angriff nicht mehr.
Könnte sein, dass das vorherige Objekt nach dem Angriff dann neu erzeugt und das alte Objekt gelöscht wird. So als Beispiel.
Wenn du dann nicht neu die Objektliste durchläufst, versuchst du dann auf ein Objekt zu zugreifen, welches nicht mehr existiert.
Und das ist nicht der Code, den wir brauchen. Sondern der Code, den du geschrieben hast. Wie interagierst du mit den Funktionen?
Ich benutze einfach drag and drop vom Community Content. https://www.youtube.com/watch?v=hHphhBwvu0U Mit "Core" muss man theoretisch keine einzige Zeile Code schreiben. Das hat mich gelockt. Wenn ich das nicht gefixed kriege, gehe ich zurück zu ue5. Dachte nur wäre ja schön wenn es mittlerweile eine derartige Zeitersparnis gäbe.
Der Code ist leider auch zu lang um ihn hier zu posten. Ich könnte ihn in 2 Teile stückeln, ich befürchte aber das man damit auch nicht wirklich weiter helfen kann. Teil 1: