Rijat Posted July 13, 2012 Share Posted July 13, 2012 i got a ammunation script.but it doesn t work.i mean i can see the blip on map and i can enter ammunation shop.and there s a marker in ammonuation shop,no problem here.but when i get to marker for buy some gun,nothing happens.and this is writing in mta server.exe= "ERROR: interiorexp.lua:121: attempt to index field '?' a nil value" i'm gonna send you the 121. line of the script.its here : local targetInterior = interiors[getResourceFromName(resource) or getThisResource()][id][oppositeType] here is the full file : local interiors = {} local interiorMarkers = {} local resourceFromInterior = {} --format interior = { [resource] = { [id] = { return= { [element],[element] }, entry=[element] } } addEvent ( "doTriggerServerEvents", true ) addEvent ( "onPlayerInteriorHit" ) addEvent ( "onPlayerInteriorWarped", true ) addEvent ( "onInteriorHit" ) addEvent ( "onInteriorWarped", true ) addEventHandler ( "onResourceStart", getRootElement(), function ( resource ) interiorLoadElements ( getResourceRootElement(resource), resource ) interiorCreateMarkers ( resource ) end ) addEventHandler ( "onResourceStop", getRootElement(), function ( resource ) if not interiors[resource] then return end for id,interiorTable in pairs(interiors[resource]) do local interior1 = interiorTable["entry"] local interior2 = interiorTable["return"] destroyElement ( interiorMarkers[interior1] ) destroyElement ( interiorMarkers[interior2] ) end interiors[resource] = nil end ) function interiorLoadElements ( rootElement, resource ) ---Load the exterior markers local entryInteriors = getElementsByType ( "interiorEntry", rootElement ) for key, interior in pairs (entryInteriors) do local id = getElementData ( interior, "id" ) if not interiors[resource] then interiors[resource] = {} end if not id then outputDebugString ( "Interiors: Error, no ID specified on entryInterior. Trying to load anyway.", 2 ) end interiors[resource][id] = {} interiors[resource][id]["entry"] = interior resourceFromInterior[interior] = resource end --Load the interior markers local returnInteriors = getElementsByType ( "interiorReturn", rootElement ) for key, interior in pairs (returnInteriors) do local id = getElementData ( interior, "refid" ) if not interiors[resource][id] then outputDebugString ( "Interiors: Error, no refid specified to returnInterior.", 1 ) return else interiors[resource][id]["return"] = interior resourceFromInterior[interior] = resource end end end function interiorCreateMarkers ( resource ) if not interiors[resource] then return end for interiorID, interiorTypeTable in pairs(interiors[resource]) do local entryInterior = interiorTypeTable["entry"] local entX,entY,entZ = getElementData ( entryInterior, "posX" ),getElementData ( entryInterior, "posY" ),getElementData ( entryInterior, "posZ" ) entX,entY,entZ = tonumber(entX),tonumber(entY),tonumber(entZ) -- local marker = createMarker ( entX, entY, entZ + 2.2, "arrow", 2, 255, 255, 0, 200 ) setElementParent ( marker, entryInterior ) interiorMarkers[entryInterior] = marker -- local dimension = tonumber(getElementData ( entryInterior, "dimension" )) local interior = tonumber(getElementData ( entryInterior, "interior" )) if not dimension then dimension = 0 end if not interior then interior = 0 end -- setElementInterior ( marker, interior ) setElementDimension ( marker, dimension ) ---create return markers local returnInterior = interiorTypeTable["return"] local retX,retY,retZ = getElementData ( returnInterior, "posX" ),getElementData ( returnInterior, "posY" ),getElementData ( returnInterior, "posZ" ) retX,retY,retZ = tonumber(retX),tonumber(retY),tonumber(retZ) -- local oneway = getElementData ( entryInterior, "oneway" ) if oneway == "true" then return end local marker1 = createMarker ( retX, retY, retZ + 2.2, "arrow", 2, 255, 255, 0, 200 ) interiorMarkers[returnInterior] = marker1 setElementParent ( marker1, returnInterior ) -- local dimension1 = tonumber(getElementData ( returnInterior, "dimension" )) local interior1 = tonumber(getElementData ( returnInterior, "interior" )) if not dimension1 then dimension1 = 0 end if not interior1 then interior1 = 0 end -- setElementInterior ( marker1, interior1 ) setElementDimension ( marker1, dimension1 ) end end function getInteriorMarker ( elementInterior ) if not isElement ( elementInterior ) then outputDebugString("getInteriorName: Invalid variable specified as interior. Element expected, got "..type(elementInterior)..".",0,255,128,0) return false end local elemType = getElementType ( elementInterior ) if elemType == "interiorEntry" or elemType == "interiorReturn" then return interiorMarkers[elementInterior] or false end outputDebugString("getInteriorName: Bad element specified. Interior expected, got "..elemType..".",0,255,128,0) return false end local opposite = { ["interiorReturn"] = "entry",["interiorEntry"] = "return" } local idLoc = { ["interiorReturn"] = "refid",["interiorEntry"] = "id" } addEventHandler ( "doTriggerServerEvents",getRootElement(), function( interior, resource, id ) local eventCanceled1,eventCanceled2 = false,false eventCanceled1 = triggerEvent ( "onPlayerInteriorHit", source, interior, resource, id ) eventCanceled2 = triggerEvent ( "onInteriorHit", interior, source ) if ( eventCanceled2 ) and ( eventCanceled1 ) then triggerClientEvent ( source, "doWarpPlayerToInterior", source, interior, resource, id ) setTimer ( setPlayerInsideInterior, 1000, 1, source, interior, resource, id ) end end ) local opposite = { ["interiorReturn"] = "entry",["interiorEntry"] = "return" } function setPlayerInsideInterior ( player, interior, resource, id ) local oppositeType = opposite[getElementType(interior)] local targetInterior = interiors[getResourceFromName(resource) or getThisResource()][id][oppositeType] local dim = getElementData ( targetInterior, "dimension" ) local int = getElementData ( targetInterior, "interior" ) setElementInterior ( player, int ) setElementDimension ( player, dim ) end function getInteriorName ( interior ) if not isElement ( interior ) then outputDebugString("getInteriorName: Invalid variable specified as interior. Element expected, got "..type(interior)..".",0,255,128,0) return false end local elemType = getElementType ( interior ) if elemType == "interiorEntry" then return getElementData ( interior, "id" ) elseif elemType == "interiorReturn" then return getElementData ( interior, "refid" ) else outputDebugString("getInteriorName: Bad element specified. Interior expected, got "..elemType..".",0,255,128,0) return false end end so..I try to understand what s the problem here.Thanks for your helps. Link to comment
robhol Posted July 13, 2012 Share Posted July 13, 2012 Holy crap, a well-formed topic with all the information!! There's quite a bit of indexing going on here, but at one point, one of the "array items" you are trying to find does not exist, so it returns nil. Then you try to index that with another [], leading to the error. "interiors" is a table full of tables (or should be, as that's how you're using it), but only the "outer" table seems to be defined in this snippet. You need to see if a value is nil (or some other un-indexable value) before you try to index it. Link to comment
Rijat Posted July 13, 2012 Author Share Posted July 13, 2012 i ve other files too.this is not a single lua,it works with another files.i just copied this because in mtaserver.exe it says there's something wrong with this one.as i see it will be harder to fix as i thought hahah.scripting is complex.what should i do then Link to comment
robhol Posted July 13, 2012 Share Posted July 13, 2012 Since we can't see how you make these tables (while reading the data), we can't really help. Just make sure that you check if there's data in a variable before you index it. a["derp"] --will error (a is nil). b = {}; b["derp"] --is fine. b["derp"]["herp"] --is NOT fine; this is your error b["derp"] = {}; b["derp"]["herp"] --is now fine after all, because we just initialized it as an empty table. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now