Jump to content

What' wrong with this?


Rijat

Recommended Posts

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

Holy crap, a well-formed topic with all the information!! :shock:

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...