diff --git a/data/expression2/TA_Exporter_Generator.txt b/data/expression2/TA_Exporter_Generator.txt index 626ce51..96237e6 100644 --- a/data/expression2/TA_Exporter_Generator.txt +++ b/data/expression2/TA_Exporter_Generator.txt @@ -9,14 +9,15 @@ interval(20) function number isOuter(Lft, Rgh, Percent, MaxRange) { - # print("isOuter "+Lft+" "+Rgh) + Rez = 0 T = abs(Lft-Rgh) Pd = ((Percent / 100) * MaxRange) Pu = MaxRange - Pd - if(T > Pd){ return 1 } - if(Lft > Pu){ return 1 } - if(Rgh > Pu){ return 1 } - return 0 + if(T > Pd){ Rez = 1 } + if(Lft > Pu){ Rez = 1 } + if(Rgh > Pu){ Rez = 1 } + # print("isOuter "+Rez+" ["+round(T,2)+">"+round(Pd)+"] "+round(Lft,2)+">"+round(Pu)+" "+round(Rgh,2)+">"+round(Pu,2)) + return Rez } function array clampTrace(Pos:vector,Width,Fwd:vector,Rgh:vector,Len,Holo1,Holo2) @@ -45,14 +46,14 @@ if(first() || dupefinished()) OutagePercentTolerance = 5 # Set this delta forward to slow fasten the process - DF = 0.3 + DF = 0.5 # Track piece width - TrackPieceW = 120 - TrackPieceH = 50 + TrackPieceW = 1000 + TrackPieceH = 500 #Generate the origin with an inset - TrackOriginInset = 0.0001 + TrackOriginInset = 0.001 # Tolerance if the error gained when generating an actibe point TrackOriginTolerance = 10^-12 @@ -174,18 +175,32 @@ if(StraightUp != 0 && Interval == 0) { PosL = Cen - TrackPieceW * R PosR = Cen + TrackPieceW * R + # holoPos(2,PosL), holoPos(3,PosR) VRL = clampTrace(Cen,TrackPieceW,F,R,TrackRangerMaxW,0,0) VR = VRL[1,number] , VL = VRL[2,number], VDM = VRL[3,number] + # DL = rangerOffset(TrackRangerMaxW,PosL, R):distance() + # DR = rangerOffset(TrackRangerMaxW,PosR, -R):distance() VDP = clampTrace(Cen + Prg - TrackOriginInset * F,TrackPieceH,F,U,TrackRangerMaxH,5,6) PU = VDP[1,number], PD = VDP[2,number], PDW = VDP[4,number] - + VDC = clampTrace(Cen,TrackPieceH,F,U,TrackRangerMaxH,7,8) + # print(VDC[1,number],PU, ARC[1,number]) + if((VDC[1,number] < ARC[1,number]) && (VDC[2,number] < ARC[2,number])) { ARC = VDC } +#[ + PosU = Cen + TrackPieceH * U + Prg - TrackOriginInset * F + PosD = Cen - TrackPieceH * U + Prg - TrackOriginInset * F + + holoPos(5,PosU), holoPos(6,PosD) + DU = rangerOffset(TrackRangerMaxH,PosU, -U):distance() + DD = rangerOffset(TrackRangerMaxH,PosD, U):distance() +]# + if(isOuter(VL,VR,OutagePercentTolerance,TrackRangerMaxW)) { Time = 100 @@ -198,21 +213,28 @@ if(StraightUp != 0 && Interval == 0) DF = DF * 1.7 } DF = 0.5 * DF + # print(_HUD_PRINTTALK,"Switch!") }else{ holoPos(1,Cen) holoColor(1,vec(0,255,255)) - PRL = clampTrace(Cen - TrackOriginInset * F ,TrackPieceW,F,R,TrackRangerMaxW,3,4) + # BEGIN Defintition formulas - # BEGIN Definition formulas + # Use this 2 beam tracks outside + # PRL = clampTrace(Cen - TrackOriginInset * F ,TrackPieceW,F,R,TrackRangerMaxW,3,4) + # TrackExtraDepth = ((ARC[1,number] - PU) / 2) + PU + # TrackExtraSide = PRL[3,number] - # Use this for 2 beam tracks + + # Use this for 2 beam tracks inside + PRL = clampTrace(Cen - TrackOriginInset * F ,0,F,R,TrackRangerMaxW,3,4) TrackExtraDepth = ((ARC[1,number] - PU) / 2) + PU TrackExtraSide = PRL[3,number] - #Use this for monorail + #Use ths for monorail + # PRL = clampTrace(Cen - TrackOriginInset * F ,TrackPieceW,F,R,TrackRangerMaxW,3,4) # TrackExtraDepth = ARC[1,number] + ARC[4,number] # TrackExtraSide = PRL[3,number] - # END Definition formulas + # END Defintition formulas ORG = Cen + TrackPieceH * U ORG = ORG - TrackExtraSide * R @@ -221,7 +243,8 @@ if(StraightUp != 0 && Interval == 0) A = round(Base:toLocal((F):toAngle(U))) S = toString(abs(DF)-abs(TrackOriginTolerance)):sub(1,1) - + + # print(S+" "+DF) if(S == "-") { print("Origin: "+toString(O)+" Angle: "+toString(A)+" ["+toString(DF)+"]") diff --git a/data/hooks/pre-commit.lua b/data/hooks/pre-commit.lua index 039d38d..93359c8 100644 --- a/data/hooks/pre-commit.lua +++ b/data/hooks/pre-commit.lua @@ -46,8 +46,8 @@ end if(sEnd == "DOS") then sEnd = "\r\n" end if(sEnd == "UNX") then sEnd = "\n" end io.write("------------------ OPEN FILE ------------------\n") -local fOut = io.open(sOut,"w+") -local fInp = io.open(sInp,"r+") +local fOut = io.open(sOut,"wb") +local fInp = io.open(sInp,"rb") if(not fOut) then io.write("File "..sOut.." not found\n") return false @@ -92,7 +92,7 @@ while(sI) do end end end; nL = nL + 1 - fOut:write(sI..sEnd) + fOut:write(sI,sEnd) sI = fInp:read() end io.write("------------------ FINISH ------------------\n") diff --git a/lua/autorun/trackassembly_init.lua b/lua/autorun/trackassembly_init.lua index 6cf2cef..8787e09 100644 --- a/lua/autorun/trackassembly_init.lua +++ b/lua/autorun/trackassembly_init.lua @@ -1,2431 +1,2427 @@ ------- INCLUDE LIBRARY ------ -if(SERVER) then - AddCSLuaFile("trackassembly/trackasmlib.lua") -end -include("trackassembly/trackasmlib.lua") - ------- LOCALIZNG FUNCTIONS --- -local tonumber = tonumber -local tostring = tostring -local Vector = Vector -local Angle = Angle -local IsValid = IsValid -local bitBor = bit and bit.bor -local mathFloor = math and math.floor -local vguiCreate = vgui and vgui.Create -local fileExists = file and file.Exists -local tableConcat = table and table.concat -local stringFind = string and string.find -local stringGsub = string and string.gsub -local stringLower = string and string.lower -local stringGmatch = string and string.gmatch -local stringExplode = string and string.Explode -local surfaceScreenWidth = surface and surface.ScreenWidth -local surfaceScreenHeight = surface and surface.ScreenHeight -local duplicatorStoreEntityModifier = duplicator and duplicator.StoreEntityModifier - ------- MODULE POINTER ------- -local asmlib = trackasmlib - ------- CONFIGURE ASMLIB ------ -asmlib.InitAssembly("track","assembly") -asmlib.SetOpVar("TOOL_VERSION","5.236") -asmlib.SetLogControl(0,"") -asmlib.SetIndexes("V",1,2,3) -asmlib.SetIndexes("A",1,2,3) -asmlib.SetIndexes("S",4,5,6,7) -asmlib.SetOpVar("LOG_ONLY",nil) -asmlib.SetOpVar("LOG_SKIP",{"QuickSort","ModelToName","GetEntitySpawn: Not hitting active point","CacheQueryPiece: Record not located", "GetEntitySpawn: Trace model missing"}) - ------- CONFIGURE REPLICATED CVARS ----- Server tells the client what value to use -asmlib.MakeCoVar("maxactrad", "150", {1,500} ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Maximum active radius to search for a point ID") -asmlib.MakeCoVar("enwiremod", "1" , {0, 1 } ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Toggle the wire extension on/off server side") -asmlib.MakeCoVar("devmode" , "0" , {0, 1 } ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Toggle developer mode on/off server side") -asmlib.MakeCoVar("maxstcnt" , "200", {1,200} ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Maximum pieces to spawn in stack mode") -if(SERVER) then - asmlib.MakeCoVar("bnderrmod", "LOG", nil ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Unreasonable position error handling mode") - asmlib.MakeCoVar("maxfruse" , "50" , {1,100} ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Maximum frequent pieces to be listed") -end ------- CONFIGURE NON-REPLICATED CVARS ----- Client's got a mind of its own -asmlib.MakeCoVar("modedb" , "SQL", nil, bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_PRINTABLEONLY), "Database operating mode") -asmlib.MakeCoVar("enqstore" , 1 , nil, bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_PRINTABLEONLY), "Enable cache for built queries") -asmlib.MakeCoVar("timermode", "CQT@1800@1@1/CQT@900@1@1/CQT@600@1@1", nil, bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_PRINTABLEONLY), "Memory management setting when DB mode is SQL") - ------- CONFIGURE MODES ----- -asmlib.SetOpVar("MODE_DATABASE" , asmlib.GetCoVar("modedb","STR")) -asmlib.SetOpVar("EN_QUERY_STORE",(asmlib.GetCoVar("enqstore","INT") ~= 0) and true or false) - ------- GLOBAL VARIABLES ------ -local gsToolNameU = asmlib.GetOpVar("TOOLNAME_NU") -local gsFullDSV = asmlib.GetOpVar("DIRPATH_BAS")..asmlib.GetOpVar("DIRPATH_DSV").. - asmlib.GetInstPref()..asmlib.GetOpVar("TOOLNAME_PU") -local gaTimerSet = stringExplode(asmlib.GetOpVar("OPSYM_DIRECTORY"),asmlib.GetCoVar("timermode","STR")) - --------- ACTIONS ---------- - -if(SERVER) then - asmlib.SetAction("DUPE_PHYS_SETTINGS", - function(oPly,oEnt,tData) -- Duplicator wrapper - if(not asmlib.ApplyPhysicalSettings(oEnt,tData[1])) then - return asmlib.StatusLog(false,"DUPE_PHYS_SETTINGS: Failed to apply physical settings on "..tostring(oEnt)) - end - return asmlib.StatusLog(true,"DUPE_PHYS_SETTINGS: Success") - end) -end - -if(CLIENT) then - asmlib.SetAction("RESET_VARIABLES", - function(oPly,oCom,oArgs) - local devmode = asmlib.GetCoVar("devmode" ,"INT") - local bgskids = asmlib.GetCoVar("bgskids", "STR") - asmlib.LogInstance("RESET_VARIABLES: {"..tostring(devmode)..asmlib.GetOpVar("OPSYM_DISABLE")..tostring(bgskids).."}") - asmlib.ConCommandPly(oPly,"nextx" , 0) - asmlib.ConCommandPly(oPly,"nexty" , 0) - asmlib.ConCommandPly(oPly,"nextz" , 0) - asmlib.ConCommandPly(oPly,"nextpic", 0) - asmlib.ConCommandPly(oPly,"nextyaw", 0) - asmlib.ConCommandPly(oPly,"nextrol", 0) - if(devmode == 0) then - return asmlib.StatusLog(true,"RESET_VARIABLES: Developer mode disabled") end - if(bgskids == "reset var") then - local anchor = asmlib.GetOpVar("MISS_NOID").. - asmlib.GetOpVar("OPSYM_REVSIGN").. - asmlib.GetOpVar("MISS_NOMD") - asmlib.ConCommandPly(oPly, "weld" , "1") - asmlib.ConCommandPly(oPly, "mass" , "25000") - asmlib.ConCommandPly(oPly, "model" , "models/props_phx/trains/tracks/track_1x.mdl") - asmlib.ConCommandPly(oPly, "count" , "5") - asmlib.ConCommandPly(oPly, "freeze" , "1") - asmlib.ConCommandPly(oPly, "anchor" , anchor) - asmlib.ConCommandPly(oPly, "igntype" , "0") - asmlib.ConCommandPly(oPly, "spnflat" , "0") - asmlib.ConCommandPly(oPly, "ydegsnp" , "45") - asmlib.ConCommandPly(oPly, "pointid" , "1") - asmlib.ConCommandPly(oPly, "pnextid" , "2") - asmlib.ConCommandPly(oPly, "logsmax" , "0") - asmlib.ConCommandPly(oPly, "logfile" , "") - asmlib.ConCommandPly(oPly, "mcspawn" , "0") - asmlib.ConCommandPly(oPly, "bgskids" , "0/0") - asmlib.ConCommandPly(oPly, "gravity" , "1") - asmlib.ConCommandPly(oPly, "adviser" , "1") - asmlib.ConCommandPly(oPly, "activrad" , "45") - asmlib.ConCommandPly(oPly, "pntasist" , "0") - asmlib.ConCommandPly(oPly, "surfsnap" , "0") - asmlib.ConCommandPly(oPly, "exportdb" , "0") - asmlib.ConCommandPly(oPly, "offsetup" , "0") - asmlib.ConCommandPly(oPly, "ignphysgn", "0") - asmlib.ConCommandPly(oPly, "ghosthold", "1") - asmlib.ConCommandPly(oPly, "maxstatts", "3") - asmlib.ConCommandPly(oPly, "nocollide", "1") - asmlib.ConCommandPly(oPly, "physmater", "metal") - asmlib.ConCommandPly(oPly, "maxactrad", "150") - asmlib.ConCommandPly(oPly, "enwiremod", "1") - asmlib.ConCommandPly(oPly, "devmode" , "0") - asmlib.ConCommandPly(oPly, "maxstcnt" , "200") - asmlib.ConCommandPly(oPly, "bnderrmod", "LOG") - asmlib.ConCommandPly(oPly, "maxfruse" , "50") - asmlib.ConCommandPly(oPly, "modedb" , "LUA") - asmlib.ConCommandPly(oPly, "enqstore" , "1") - asmlib.ConCommandPly(oPly, "timermode", "CQT@1800@1@1/CQT@900@1@1/CQT@600@1@1") - asmlib.PrintNotifyPly(ply,gsToolNameU.." Variable reset complete!","UNDO") - elseif(stringFind(bgskids,"delete ") == 1) then - local indWord = 1 - local insPref = stringGsub(bgskids,"delete ","") - local expWord = stringExplode(" ",insPref) - while(expWord[indWord]) do - local sWord = expWord[indWord] - asmlib.DeleteExternalDatabase("PIECES","DSV",sWord.."_") - asmlib.DeleteExternalDatabase("ADDITIONS","DSV",sWord.."_") - asmlib.DeleteExternalDatabase("PHYSPROPERTIES","DSV",sWord.."_") - asmlib.LogInstance("RESET_VARIABLES: Match <"..sWord..">") - indWord = indWord + 1 - end - asmlib.DeleteDirectoryPath("DSV") - else return asmlib.StatusLog(true,"RESET_VARIABLES: Command <"..bgskids.."> skipped") end - return asmlib.StatusLog(true,"RESET_VARIABLES: Success") - end) - - asmlib.SetAction("OPEN_FRAME", - function(oPly,oCom,oArgs) - local frUsed, nCount = asmlib.GetFrequentModels(oArgs[1]) - if(not asmlib.IsExistent(frUsed)) then - return asmlib.StatusLog(false,"OPEN_FRAME: Failed to retrieve most frequent models ["..tostring(oArgs[1]).."]") - end - local defTable = asmlib.GetOpVar("DEFTABLE_PIECES") - if(not defTable) then return StatusLog(false,"OPEN_FRAME: Missing definition for table PIECES") end - local pnFrame = vguiCreate("DFrame") - if(not IsValid(pnFrame)) then - pnFrame:Remove() - return asmlib.StatusLog(false,"OPEN_FRAME: Failed to create base frame") - end - local pnElements = asmlib.MakeContainer("FREQ_VGUI") - pnElements:Insert(1,{Label = { "DButton" ,"Export DB" ,"Click to export the client database as a file"}}) - pnElements:Insert(2,{Label = { "DListView" ,"Routine Items" ,"The list of your frequently used track pieces"}}) - pnElements:Insert(3,{Label = { "DModelPanel","Piece Display" ,"The model of your track piece is displayed here"}}) - pnElements:Insert(4,{Label = { "DTextEntry" ,"Enter Pattern" ,"Enter a pattern here and hit enter to preform a search"}}) - pnElements:Insert(5,{Label = { "DComboBox" ,"Select Column" ,"Choose which list column you want to preform a search on"}}) - ------------ Manage the invalid panels ------------------- - local iNdex, iSize, sItem, vItem = 1, pnElements:GetSize(), "", nil - while(iNdex <= iSize) do - vItem = pnElements:Select(iNdex) - vItem.Panel = vguiCreate(vItem.Label[1],pnFrame) - if(not IsValid(vItem.Panel)) then - asmlib.LogInstance("OPEN_FRAME: Failed to create ID #"..tonumber(iNdex)) - iNdex, vItem = 1, nil - while(iNdex <= iSize) do - vItem, sItem = pnElements:Select(iNdex), "" - if(IsValid(vItem.Panel)) then vItem.Panel:Remove(); sItem = "and panel " end - pnElements:Delete(iNdex) - asmlib.LogInstance("OPEN_FRAME: Deleted entry "..sItem.."ID #"..tonumber(iNdex)) - iNdex = iNdex + 1 - end - pnFrame:Remove() - collectgarbage() - return StatusLog(false,"OPEN_FRAME: Invalid panel created. Frame removed") - end - vItem.Panel:SetName(vItem.Label[2]) - vItem.Panel:SetTooltip(vItem.Label[3]) - iNdex = iNdex + 1 - end - ------ Screen resolution and elements ------- - local scrW = surfaceScreenWidth() - local scrH = surfaceScreenHeight() - local pnButton = pnElements:Select(1).Panel - local pnListView = pnElements:Select(2).Panel - local pnModelPanel = pnElements:Select(3).Panel - local pnTextEntry = pnElements:Select(4).Panel - local pnComboBox = pnElements:Select(5).Panel - local nRatio = asmlib.GetOpVar("GOLDEN_RATIO") - local xyZero = {x = 0, y = 20} -- The start location of left-top - local xyDelta = {x = 10, y = 10} -- Distance between panels - local xySiz = {x = 0, y = 0} -- Current panel size - local xyPos = {x = 0, y = 0} -- Current panel position - local xyTmp = {x = 0, y = 0} -- Temporary coordinate - ------------ Frame -------------- - xyPos.x = (scrW / 4) - xyPos.y = (scrH / 4) - xySiz.x = 750 - xySiz.y = mathFloor(xySiz.x / (1 + nRatio)) - pnFrame:SetTitle("Frequent pieces by "..oPly:GetName().." v."..asmlib.GetOpVar("TOOL_VERSION")) - pnFrame:SetVisible(true) - pnFrame:SetDraggable(true) - pnFrame:SetDeleteOnClose(true) - pnFrame:SetPos(xyPos.x, xyPos.y) - pnFrame:SetSize(xySiz.x, xySiz.y) - pnFrame.OnClose = function() - pnFrame:SetVisible(false) - local iNdex, iSize = 1, pnElements:GetSize() - while(iNdex <= iSize) do -- All panels are valid - asmlib.LogInstance("OPEN_FRAME: Frame.OnClose: Delete #"..iNdex) - pnElements:Select(iNdex).Panel:Remove() - pnElements:Delete(iNdex) - iNdex = iNdex + 1 - end - pnFrame:Remove() - collectgarbage() - asmlib.LogInstance("OPEN_FRAME: Frame.OnClose: Form removed") - end - ------------ Button -------------- - xyPos.x = xyZero.x + xyDelta.x - xyPos.y = xyZero.y + xyDelta.y - xySiz.x = 55 -- Display properly the name - xySiz.y = 25 -- Used by combo-box and text-box - pnButton:SetParent(pnFrame) - pnButton:SetText(pnElements:Select(1).Label[2]) - pnButton:SetPos(xyPos.x, xyPos.y) - pnButton:SetSize(xySiz.x, xySiz.y) - pnButton:SetVisible(true) - pnButton.DoClick = function() - asmlib.LogInstance("OPEN_FRAME: Button.DoClick: <"..pnButton:GetText().."> clicked") - asmlib.SetLogControl(asmlib.GetCoVar("logsmax", "INT"), - asmlib.GetCoVar("logfile", "STR")) - local ExportDB = asmlib.GetCoVar("exportdb","INT") - if(ExportDB ~= 0) then - asmlib.LogInstance("OPEN_FRAME: Button Exporting DB") - asmlib.StoreExternalDatabase("PIECES",",","INS") - asmlib.StoreExternalDatabase("ADDITIONS",",","INS") - asmlib.StoreExternalDatabase("PHYSPROPERTIES",",","INS") - asmlib.StoreExternalDatabase("PIECES","\t","DSV") - asmlib.StoreExternalDatabase("ADDITIONS","\t","DSV") - asmlib.StoreExternalDatabase("PHYSPROPERTIES","\t","DSV") - end - end - ------------- ComboBox --------------- - xyPos.x, xyPos.y = pnButton:GetPos() - xyTmp.x, xyTmp.y = pnButton:GetSize() - xyPos.x = xyPos.x + xyTmp.x + xyDelta.x - xySiz.x = nRatio * xyTmp.x - xySiz.y = xyTmp.y - pnComboBox:SetParent(pnFrame) - pnComboBox:SetPos(xyPos.x,xyPos.y) - pnComboBox:SetSize(xySiz.x,xySiz.y) - pnComboBox:SetVisible(true) - pnComboBox:SetValue("") - pnComboBox:AddChoice("Model",defTable[1][1]) - pnComboBox:AddChoice("Type" ,defTable[2][1]) - pnComboBox:AddChoice("Name" ,defTable[3][1]) - pnComboBox:AddChoice("Act" ,defTable[4][1]) - pnComboBox.OnSelect = function(pnSelf, nInd, sVal, anyData) - asmlib.LogInstance("OPEN_FRAME: ComboBox.OnSelect: ID #"..nInd.."<"..sVal..">"..tostring(anyData)) - pnSelf:SetValue(sVal) - end - ------------ ModelPanel -------------- - xySiz.x = 250 -- Display model properly - xyTmp.x, xyTmp.y = pnFrame:GetSize() - xyPos.x, xyPos.y = pnComboBox:GetPos() - xyPos.x = xyTmp.x - xySiz.x - xyDelta.x - xySiz.y = xyTmp.y - xyPos.y - xyDelta.y - -------------------------------------- - pnModelPanel:SetParent(pnFrame) - pnModelPanel:SetPos(xyPos.x,xyPos.y) - pnModelPanel:SetSize(xySiz.x,xySiz.y) - pnModelPanel:SetVisible(true) - pnModelPanel.LayoutEntity = function(pnSelf, oEnt) - if(pnSelf.bAnimated) then pnSelf:RunAnimation() end - local uiBox = asmlib.CacheBoxLayout(oEnt,40) - if(not asmlib.IsExistent(uiBox)) then - return asmlib.StatusLog(false,"OPEN_FRAME: pnModelPanel.LayoutEntity: Box invalid") end - local stSpawn = asmlib.GetNormalSpawn(asmlib.GetOpVar("VEC_ZERO"),uiBox.Ang,oEnt:GetModel(),1) - stSpawn.SPos:Set(uiBox.Cen) - stSpawn.SPos:Rotate(stSpawn.SAng) - stSpawn.SPos:Mul(-1) - stSpawn.SPos:Add(uiBox.Cen) - oEnt:SetAngles(stSpawn.SAng) - oEnt:SetPos(stSpawn.SPos) - end - ------------ TextEntry -------------- - xyPos.x, xyPos.y = pnComboBox:GetPos() - xyTmp.x, xyTmp.y = pnComboBox:GetSize() - xyPos.x = xyPos.x + xyTmp.x + xyDelta.x - xySiz.y = xyTmp.y - ------------------------------------- - xyTmp.x, xyTmp.y = pnModelPanel:GetPos() - xySiz.x = xyTmp.x - xyPos.x - xyDelta.x - ------------------------------------- - pnTextEntry:SetParent(pnFrame) - pnTextEntry:SetPos(xyPos.x,xyPos.y) - pnTextEntry:SetSize(xySiz.x,xySiz.y) - pnTextEntry:SetVisible(true) - pnTextEntry.OnEnter = function(pnSelf) - local sName, sField = pnComboBox:GetSelected() - sName = tostring(sName or "") - sField = tostring(sField or "") - local sPattern = tostring(pnSelf:GetValue() or "") - if(not asmlib.UpdateListView(pnListView,frUsed,nCount,sField,sPattern)) then - return asmlib.StatusLog(false,"OPEN_FRAME: TextEntry.OnEnter: Failed to update ListView {"..sName.."#"..sField.."#"..sPattern.."}") - end - end - ------------ ListView -------------- - xyPos.x, xyPos.y = pnButton:GetPos() - xyTmp.x, xyTmp.y = pnButton:GetSize() - xyPos.y = xyPos.y + xyTmp.y + xyDelta.y - ------------------------------------ - xyTmp.x, xyTmp.y = pnTextEntry:GetPos() - xySiz.x, xySiz.y = pnTextEntry:GetSize() - xySiz.x = xyTmp.x + xySiz.x - xyDelta.x - ------------------------------------ - xyTmp.x, xyTmp.y = pnFrame:GetSize() - xySiz.y = xyTmp.y - xyPos.y - xyDelta.y - ------------------------------------ - local wUse = mathFloor(0.120377559 * xySiz.x) - local wAct = mathFloor(0.047460893 * xySiz.x) - local wTyp = mathFloor(0.214127559 * xySiz.x) - local wMod = xySiz.x - wUse - wAct - wTyp - pnListView:SetParent(pnFrame) - pnListView:SetVisible(false) - pnListView:SetSortable(true) - pnListView:SetMultiSelect(false) - pnListView:SetPos(xyPos.x,xyPos.y) - pnListView:SetSize(xySiz.x,xySiz.y) - pnListView:AddColumn("Used" ):SetFixedWidth(wUse) -- (1) - pnListView:AddColumn("Act" ):SetFixedWidth(wAct) -- (2) - pnListView:AddColumn("Type" ):SetFixedWidth(wTyp) -- (3) - pnListView:AddColumn("Model"):SetFixedWidth(wMod) -- (4) - pnListView.OnRowSelected = function(pnSelf, nIndex, pnLine) - local uiMod = pnLine:GetColumnText(4) -- Forth index is actually the model in the table - pnModelPanel:SetModel(uiMod) - local uiEnt = pnModelPanel:GetEntity() - local uiBox = asmlib.CacheBoxLayout(uiEnt,0,nRatio,nRatio-1) - if(not asmlib.IsExistent(uiBox)) then - return asmlib.StatusLog(false,"OPEN_FRAME: ListView.OnRowSelected: Box invalid for <"..uiMod..">") end - pnModelPanel:SetLookAt(uiBox.Eye) - pnModelPanel:SetCamPos(uiBox.Cam) - asmlib.ConCommandPly(oPly, "model" ,uiMod) - asmlib.ConCommandPly(oPly,"pointid", 1 ) - asmlib.ConCommandPly(oPly,"pnextid", 2 ) - end - if(not asmlib.UpdateListView(pnListView,frUsed,nCount)) then - asmlib.StatusLog(false,"OPEN_FRAME: ListView.OnRowSelected: Populate the list view failed") - end - ------------ Show the completed panel -------------- - pnFrame:SetVisible(true) - pnFrame:Center() - pnFrame:MakePopup() - collectgarbage() - return asmlib.StatusLog(true,"OPEN_FRAME: Success") - end) -end - ------- INITIALIZE DB ------ -asmlib.CreateTable("PIECES",{ - Timer = asmlib.TimerSetting(gaTimerSet[1]), - Index = {{1},{4},{1,4}}, - [1] = {"MODEL" , "TEXT" , "LOW", "QMK"}, - [2] = {"TYPE" , "TEXT" , nil , "QMK"}, - [3] = {"NAME" , "TEXT" , nil , "QMK"}, - [4] = {"LINEID", "INTEGER", "FLR", nil }, - [5] = {"POINT" , "TEXT" , nil , nil }, - [6] = {"ORIGIN", "TEXT" , nil , nil }, - [7] = {"ANGLE" , "TEXT" , nil , nil } -},true,true) - -asmlib.CreateTable("ADDITIONS",{ - Timer = asmlib.TimerSetting(gaTimerSet[2]), - Index = {{1},{4},{1,4}}, - [1] = {"MODELBASE", "TEXT" , "LOW", "QMK"}, - [2] = {"MODELADD" , "TEXT" , "LOW", "QMK"}, - [3] = {"ENTCLASS" , "TEXT" , nil , nil }, - [4] = {"LINEID" , "INTEGER", "FLR", nil }, - [5] = {"POSOFF" , "TEXT" , nil , nil }, - [6] = {"ANGOFF" , "TEXT" , nil , nil }, - [7] = {"MOVETYPE" , "INTEGER", "FLR", nil }, - [8] = {"PHYSINIT" , "INTEGER", "FLR", nil }, - [9] = {"DRSHADOW" , "INTEGER", "FLR", nil }, - [10] = {"PHMOTION" , "INTEGER", "FLR", nil }, - [11] = {"PHYSLEEP" , "INTEGER", "FLR", nil }, - [12] = {"SETSOLID" , "INTEGER", "FLR", nil }, -},true,true) - -asmlib.CreateTable("PHYSPROPERTIES",{ - Timer = asmlib.TimerSetting(gaTimerSet[3]), - Index = {{1},{2},{1,2}}, - [1] = {"TYPE" , "TEXT" , nil , "QMK"}, - [2] = {"LINEID", "INTEGER", "FLR", nil }, - [3] = {"NAME" , "TEXT" , nil , nil } -},true,true) - ------- POPULATE DB ------ ---[[ TA parametrization legend -Disabling of a component is preformed by using "OPSYM_DISABLE" -Disabling P - The ID is ignored when searching for active one -Disabling O - The ID can not selected by the holder via right click -Disabling A - The ID angle is treated as {0,0,0} -Disabling Type - makes it use the value of DefaultType() -Disabling Name - makes it generate it using the model -Reversing the parameter sign of a component happens by using variable "OPSYM_REVSIGN" -When table name is not provided to InsertRecord() it uses the value of DefaultTable() -]]-- -if(file.Exists(gsFullDSV.."PIECES.txt", "DATA")) then - asmlib.LogInstance(gsToolNameU..": DB PIECES from DSV") - asmlib.ImportDSV("PIECES","\t",true) -else - asmlib.LogInstance(gsToolNameU..": DB PIECES from LUA") - asmlib.DefaultTable("PIECES") - if(asmlib.GetCoVar("devmode" ,"INT") ~= 0) then - asmlib.DefaultType("Develop Sprops") - asmlib.InsertRecord({"models/sprops/cuboids/height06/size_1/cube_6x6x6.mdl" , "#", "x1", 1, "", "", ""}) - asmlib.InsertRecord({"models/sprops/cuboids/height12/size_1/cube_12x12x12.mdl", "#", "x2", 1, "", "", ""}) - asmlib.InsertRecord({"models/sprops/cuboids/non_set/cube_18x18x18.mdl" , "#", "x3", 1, "", "", ""}) - asmlib.InsertRecord({"models/sprops/cuboids/height24/size_1/cube_24x24x24.mdl", "#", "x4", 1, "", "", ""}) - asmlib.InsertRecord({"models/sprops/cuboids/height36/size_1/cube_36x36x36.mdl", "#", "x5", 1, "", "", ""}) - asmlib.InsertRecord({"models/sprops/cuboids/height48/size_1/cube_48x48x48.mdl", "#", "x6", 1, "", "", ""}) - asmlib.DefaultType("Develop PHX") - asmlib.InsertRecord({"models/hunter/blocks/cube025x025x025.mdl", "#", "x1", 1, "", "", ""}) - asmlib.InsertRecord({"models/hunter/blocks/cube05x05x05.mdl" , "#", "x2", 1, "", "", ""}) - asmlib.InsertRecord({"models/hunter/blocks/cube075x075x075.mdl", "#", "x3", 1, "", "", ""}) - asmlib.InsertRecord({"models/hunter/blocks/cube1x1x1.mdl" , "#", "x4", 1, "", "", ""}) - asmlib.DefaultType("Develop Test") - asmlib.InsertRecord({"models/props_c17/furniturewashingmachine001a.mdl", "#", "#", 1, "#", "-0.05,0.006, 21.934", "#@-90, 0,180"}) - asmlib.InsertRecord({"models/props_c17/furniturewashingmachine001a.mdl", "#", "#", 2, "", "-0.05,0.006,-21.922", "@90,180,180"}) - end - asmlib.DefaultType("SligWolf's Rerailers") - asmlib.InsertRecord({"models/props_phx/trains/sw_rerailer_1.mdl", "#", "Short Single", 1, "-190.553,0,25.193", "211.414,0.015,-5.395", ""}) - asmlib.InsertRecord({"models/props_phx/trains/sw_rerailer_2.mdl", "#", "Middle Single", 1, "-190.553,0,25.193", "211.414,0.015,-5.395", ""}) - asmlib.InsertRecord({"models/props_phx/trains/sw_rerailer_3.mdl", "#", "Long Single", 1, "-190.553,0,25.193", "211.414,0.015,-5.395", ""}) - asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_3.mdl", "#", "Long Double", 1, "-258.249, -0.01, -0.002", "219.415, 0, -5.409", ""}) - asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_3.mdl", "#", "Long Double", 2, "-3124.199, -0.01, 2.997", "-3601.869, -0.377, -5.416", "0,-180,0"}) - asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_2.mdl", "#", "Middle Double", 1, "-265.554, 0, 3.031", "219.412, 0, -5.407", ""}) - asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_2.mdl", "#", "Middle Double", 2, "-1882.106, 0, 3.031", "-2367.072, 0, -5.412", "0,-180,0"}) - asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_1.mdl", "#", "Short Double", 1, "-221.409, 0, 3.031", "219.412, 0, -5.411", ""}) - asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_1.mdl", "#", "Short Double", 2, "-1103.05, 0, 0.009", "-1543.871, 0, -5.411", "0,-180,0"}) - asmlib.DefaultType("SligWolf's Minis") - asmlib.InsertRecord({"models/minitrains/straight_16.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_16.mdl", "#", "#", 2, "", "-16, -8.507, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_32.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_32.mdl", "#", "#", 2, "", "-32, -8.507, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_64.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_64.mdl", "#", "#", 2, "", "-64, -8.507, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_128.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_128.mdl", "#", "#", 2, "", "-128, -8.507, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_256.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_256.mdl", "#", "#", 2, "", "-256, -8.507, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_512.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_512.mdl", "#", "#", 2, "", "-512, -8.507, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_1024.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_1024.mdl", "#", "#", 2, "", "-1024, -8.507, 1", "0,-180,0"}) - asmlib.SettingsModelToName("SET",nil,{"diagonal_","ramp_"},nil) - asmlib.InsertRecord({"models/minitrains/straight_diagonal_128.mdl", "#", "#", 1, "", "8, -8.508, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_diagonal_128.mdl", "#", "#", 2, "", "-136, -8.506, 33", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_diagonal_256.mdl", "#", "#", 1, "", "8, -8.508, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_diagonal_256.mdl", "#", "#", 2, "", "-264, -8.506, 33", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/straight_diagonal_512.mdl", "#", "#", 1, "", "8, -8.508, 1", ""}) - asmlib.InsertRecord({"models/minitrains/straight_diagonal_512.mdl", "#", "#", 2, "", "-520, -8.506, 33", "0,-180,0"}) - asmlib.SettingsModelToName("CLR") - asmlib.InsertRecord({"models/minitrains/curve_1_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_1_90.mdl", "#", "#", 2, "", "-138.51, 130, 1", "0,90,0"}) - asmlib.InsertRecord({"models/minitrains/curve_2_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_2_90.mdl", "#", "#", 2, "", "-168.51, 160, 0.996", "0,90,0"}) - asmlib.InsertRecord({"models/minitrains/curve_3_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_3_90.mdl", "#", "#", 2, "", "-198.51, 190, 0.995", "0,90,0"}) - asmlib.InsertRecord({"models/minitrains/curve_4_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_4_90.mdl", "#", "#", 2, "", "-228.51, 220, 0.994", "0,90,0"}) - asmlib.InsertRecord({"models/minitrains/curve_5_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_5_90.mdl", "#", "#", 2, "", "-258.51, 250, 0.994", "0,90,0"}) - asmlib.InsertRecord({"models/minitrains/curve_6_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_6_90.mdl", "#", "#", 2, "", "-288.51, 280, 0.993", "0,90,0"}) - asmlib.InsertRecord({"models/minitrains/curve_1_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_1_45.mdl", "#", "#", 2, "", "-97.956, 32.044, 1", "0,135,0"}) - asmlib.InsertRecord({"models/minitrains/curve_2_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_2_45.mdl", "#", "#", 2, "", "-119.15, 40.853, 1", "0,135,0"}) - asmlib.InsertRecord({"models/minitrains/curve_3_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_3_45.mdl", "#", "#", 2, "", "-140.368, 49.631, 1", "0,135,0"}) - asmlib.InsertRecord({"models/minitrains/curve_4_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_4_45.mdl", "#", "#", 2, "", "-161.567, 58.434, 1", "0,135,0"}) - asmlib.InsertRecord({"models/minitrains/curve_5_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_5_45.mdl", "#", "#", 2, "", "-182.769, 67.232, 1", "0,135,0"}) - asmlib.InsertRecord({"models/minitrains/curve_6_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_6_45.mdl", "#", "#", 2, "", "-203.983, 76.019, 1", "0,135,0"}) - asmlib.InsertRecord({"models/minitrains/curve_1_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_1_22-5.mdl", "#", "#", 2, "", "-53.014, 2.013, 1", "0,157.5,0"}) - asmlib.InsertRecord({"models/minitrains/curve_2_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_2_22-5.mdl", "#", "#", 2, "", "-64.492, 4.307, 1", "0,157.5,0"}) - asmlib.InsertRecord({"models/minitrains/curve_3_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_3_22-5.mdl", "#", "#", 2, "", "-75.965, 6.599, 1", "0,157.5,0"}) - asmlib.InsertRecord({"models/minitrains/curve_4_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_4_22-5.mdl", "#", "#", 2, "", "-87.437, 8.904, 1", "0,157.5,0"}) - asmlib.InsertRecord({"models/minitrains/curve_5_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_5_22-5.mdl", "#", "#", 2, "", "-98.913, 11.205,1", "0,157.5,0"}) - asmlib.InsertRecord({"models/minitrains/curve_6_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_6_22-5.mdl", "#", "#", 2, "", "-110.405, 13.455, 1", "0,157.5,0"}) - asmlib.InsertRecord({"models/minitrains/curve_1_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_1_s_small.mdl", "#", "#", 2, "", "-105.994, 12.497, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_2_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_2_s_small.mdl", "#", "#", 2, "", "-128.994, 17.497, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_3_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_3_s_small.mdl", "#", "#", 2, "", "-151.994, 21.497, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_4_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_4_s_small.mdl", "#", "#", 2, "", "-174.994, 26.497, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_5_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_5_s_small.mdl", "#", "#", 2, "", "-197.994, 31.497, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_6_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_6_s_small.mdl", "#", "#", 2, "", "-220.994, 35.497, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_1_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_1_s_medium.mdl", "#", "#", 2, "", "-195.966, 72.51, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_2_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_2_s_medium.mdl", "#", "#", 2, "", "-237.966, 90.51, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_3_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_3_s_medium.mdl", "#", "#", 2, "", "-280.966, 107.51, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_4_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_4_s_medium.mdl", "#", "#", 2, "", "-322.966, 125.51, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_5_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_5_s_medium.mdl", "#", "#", 2, "", "-365.991, 142.507, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_6_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_6_s_medium.mdl", "#", "#", 2, "", "-407.99, 160.51, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_1_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_1_s_big.mdl", "#", "#", 2, "", "-277.01, 268.511, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_2_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_2_s_big.mdl", "#", "#", 2, "", "-336.99, 328.521, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_3_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_3_s_big.mdl", "#", "#", 2, "", "-397.033, 388.521, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_4_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_4_s_big.mdl", "#", "#", 2, "", "-456.991, 448.521, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_5_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_5_s_big.mdl", "#", "#", 2, "", "-516.985, 508.521, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/curve_6_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) - asmlib.InsertRecord({"models/minitrains/curve_6_s_big.mdl", "#", "#", 2, "", "-576.985, 568.521, 1", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/rerailer.mdl", "#", "Rerailer Double", 1, "", "190, -0.005, 1.02", ""}) - asmlib.InsertRecord({"models/minitrains/rerailer.mdl", "#", "Rerailer Double", 2, "", "-190, -0.005, 1.02", "0,180,0"}) - asmlib.InsertRecord({"models/minitrains/sw_buffer_stop.mdl", "#", "Buffer Stop", 1, "", "9.43, -8.011, -1.001", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 1, "", "16, 21.512, 1", ""}) - asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 2, "", "-144, 21.513, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 3, "", "16, -8.515, 1", ""}) - asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 4, "", "-144, -8.514, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 1, "", "16, 21.512, 1", ""}) - asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 2, "", "-144, 21.513, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 3, "", "16, -8.515, 1", ""}) - asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 4, "", "-144, -8.514, 1", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/switch.mdl", "#", "Switch Y", 1, "", "-128, -23.512, 0.998", "0,-180,0"}) - asmlib.InsertRecord({"models/minitrains/switch.mdl", "#", "Switch Y", 2, "", "0, -8.509, 1", ""}) - asmlib.InsertRecord({"models/minitrains/switch.mdl", "#", "Switch Y", 3, "", "-128, 6.493, 0.998", "0,-180,0"}) - asmlib.DefaultType("PHX Monorail") - asmlib.InsertRecord({"models/props_phx/trains/monorail1.mdl", "#", "Straight Short", 1, "", "229.885559,0.23999,13.87915", ""}) - asmlib.InsertRecord({"models/props_phx/trains/monorail1.mdl", "#", "Straight Short", 2, "", "-228.885254,0.239726,13.87915", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail2.mdl", "#", "Straight Middle", 1, "", "0.239726,-462.635468,13.879296", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail2.mdl", "#", "Straight Middle", 2, "", "0.239914,464.885315,13.879209", "0,90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail3.mdl", "#", "Straight Long", 1, "", "0.239949,-934.135559,13.879116", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail3.mdl", "#", "Straight Long", 2, "", "0.239705, 930.885315,13.879150", "0, 90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail4.mdl", "#", "Straight Very Long", 1, "", "0.239664,-1867.13562,13.879143", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail4.mdl", "#", "Straight Very Long", 2, "", "0.239664,1872.885376,13.879150", "0,90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail_curve2.mdl", "#", "Turn 45", 1, "", "-0.030396,-605.638428,13.881409", ""}) - asmlib.InsertRecord({"models/props_phx/trains/monorail_curve2.mdl", "#", "Turn 45", 2, "", "-428.018524,-428.362335,13.881714", "0,135,0"}) - asmlib.InsertRecord({"models/props_phx/trains/monorail_curve.mdl", "#", "Turn 90", 1, "", "-0.030518,-605.638184,13.880554", ""}) - asmlib.InsertRecord({"models/props_phx/trains/monorail_curve.mdl", "#", "Turn 90", 2, "", "-605.380859,-0.307583,13.881714", "0,90,0"}) - asmlib.DefaultType("PHX Metal") - asmlib.SettingsModelToName("SET",nil,{"track_","straight_"},nil) - asmlib.InsertRecord({"models/props_phx/trains/track_32.mdl" , "#", "#", 1, "-0.327,-61.529,8.714", " 15.755127,0.001953,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_32.mdl" , "#", "#", 2, "-0.327, 61.529,8.714", "-16.239746,0.000244,9.215", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_64.mdl" , "#", "#", 1, "", " 31.999878, 0.001960,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_64.mdl" , "#", "#", 2, "", "-32.000275,-0.001469,9.215", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_128.mdl", "#", "#", 1, "", " 63.75531, 0.001953,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_128.mdl", "#", "#", 2, "", "-64.240356,-0.005125,9.215", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_256.mdl", "#", "#", 1, "", " 127.754944, 0.001953,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_256.mdl", "#", "#", 2, "", " -128.245117,-0.012207,9.215", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_512.mdl", "#", "#", 1, "", " 255.754791, 0.001465,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_512.mdl", "#", "#", 2, "", "-256.242401,-0.026855,9.215", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_1024.mdl", "#", "#", 1, "", " 511.754761,-4.7e-005,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_1024.mdl", "#", "#", 2, "", "-512.240601,-0.050828,9.215", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_2048.mdl", "#", "#", 1, "", " 1023.755066,0.000642,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_2048.mdl", "#", "#", 2, "", "-1024.242676,-0.109433,9.215", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/track_4096.mdl", "#", "#", 1, "", " 2047.755249, 0.001923,9.215", ""}) - asmlib.InsertRecord({"models/props_phx/trains/track_4096.mdl", "#", "#", 2, "", "-2048.240479,-0.225247,9.215", "0,-180,0"}) - asmlib.DefaultType("PHX Regular") - asmlib.SettingsModelToName("SET",{1,6}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_single.mdl", "#", "#", 1, "-0.327,-61.529,8.714", " 15.451782, 1.5e-005,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_single.mdl", "#", "#", 2, "-0.327, 61.529,8.714", "-16.094971,-1.0e-006,12.548828", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_1x.mdl", "#", "#", 1, "", " 79.929352,0,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_1x.mdl", "#", "#", 2, "", "-70.058060,6e-006,12.548828", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 1, "", " 74.973145, 1e-005,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 2, "", "-75.013794,-7e-006,12.548828", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 3, "", "-0.022434 , 74.999878,12.548828", "0,90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 4, "", "-0.022434 ,-74.987061,12.548828", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_2x.mdl", "#", "#", 1, "", "229.919388,0,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_2x.mdl", "#", "#", 2, "", "-70.05806,-6e-006,12.548828", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_4x.mdl", "#", "#", 1, "", " 229.919388, 3.1e-005,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_4x.mdl", "#", "#", 2, "", "-370.037079,-3.2e-005,12.548828", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_pass.mdl", "#", "Cross Road", 1, "", " 229.920044,2e-005,11.214844", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_pass.mdl", "#", "Cross Road", 2, "", "-370.036377,2e-006,11.214844", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_8x.mdl", "#", "#", 1, "", " 829.878418, 3.8e-005,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_8x.mdl", "#", "#", 2, "", "-370.036865,-2.5e-005,12.548828", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_16x.mdl", "#", "#", 1, "", "2029.797363,0.000133,12.548828", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_16x.mdl", "#", "#", 2, "", "-370.036865,-2e-0060,12.548828", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 1, "", " 250.473389, 49.613159,11.214844", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 2, "", "-349.483032, 49.613129,11.214844", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 3, "", " 162.610229,-162.4935 ,11.214844", "0, -45,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 4, "", "-261.623718, 261.740234,11.214844", "0, 135,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_down.mdl", "#", "#", 1, "", "-75.016,-0.006,64.57", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_down.mdl", "#", "#", 2, "", "4.096,-0.007,48.791", "@22.5,0,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_up.mdl", "#", "#", 1, "", "-75.016,0.007,11.212", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_up.mdl", "#", "#", 2, "", "4.196,0,27.054", "@-22.5,0,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_down.mdl", "#", "#", 1, "-75.016,-0.002,64.568", "-75.013,-0.002,64.568", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_down.mdl", "#", "#", 2, "", "71.037,-0.018,3.951", "@45,0,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_up.mdl", "#", "#", 1, "", "-75.013,0.007,11.218", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_up.mdl", "#", "#", 2, "", "71.173,0.003,71.909", "@-45,0,0"}) - asmlib.SettingsModelToName("SET",{1,6},{"turn","turn_"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn45.mdl", "#", "#", 1, "", "733.000061,-265.363037,11.218994", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn45.mdl", "#", "#", 2, "", "-83.264610, 72.744667,11.218994", "0,135,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn90.mdl", "#", "#", 1, "", "733.000061,-265.363037,11.218994", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn90.mdl", "#", "#", 2, "", "-421.363312,889.005493,11.218994", "0,90,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch.mdl", "#", "Switch Right", 1, "", " 829.879700,0.00158700, 11.218994", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch.mdl", "#", "Switch Right", 2, "", "-370.037231,0.00025600, 11.218994", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch.mdl", "#", "Switch Right", 3, "", "-158.311737,338.107941, 11.218994", "0,135,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch2.mdl", "#", "Switch Left [X]", 1, "", " 829.880005, -0.001465, 11.218994", ""}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch2.mdl", "#", "Switch Left [X]", 2, "", "-370.037262, -0.000456, 11.218994", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch2.mdl", "#", "Switch Left [X]", 3, "", "-158.311356,-338.111572, 11.218994", "0,-135,0"}) - asmlib.DefaultType("SProps") - asmlib.SettingsModelToName("SET",nil,{"track_s0","straight_"},{"","x"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s01.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s01.mdl", "#", "#", 2, "", "-162,0,7.624", "0,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s02.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s02.mdl", "#", "#", 2, "", "-324,0,7.624", "0,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s03.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s03.mdl", "#", "#", 2, "", "-486,0,7.624", "0,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s04.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s04.mdl", "#", "#", 2, "", "-648,0,7.624", "0,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s05.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s05.mdl", "#", "#", 2, "", "-1296.002,0,7.624", "0,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s06.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_s06.mdl", "#", "#", 2, "", "-2592.002,0,7.624", "0,180,0"}) - asmlib.SettingsModelToName("CLR") - asmlib.InsertRecord({"models/sprops/trans/train/track_h01.mdl", "#", "Ramp", 1, "", "0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_h01.mdl", "#", "Ramp", 2, "", "-2525.98,0,503.58", "0,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_h02.mdl", "#", "225 Up", 1, "", ",0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_h02.mdl", "#", "225 Up", 2, "", "-1258.828,0,261.268", "@-22.5,180,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_h03.mdl", "#", "225 Down", 1, "", "0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_h03.mdl", "#", "225 Down", 2, "", "-1264.663,0,-247.177", "@22.5,180,0"}) - asmlib.SettingsModelToName("SET",nil,{"track_t","turn_","02","big","01","small"},nil) - asmlib.InsertRecord({"models/sprops/trans/train/track_t90_02.mdl", "#", "#", 1, "", "0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_t90_02.mdl", "#", "#", 2, "", "-1650,1650.0009765625,7.624", "0,90,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/track_t90_01.mdl", "#", "#", 1, "", "0,0,7.624", ""}) - asmlib.InsertRecord({"models/sprops/trans/train/track_t90_01.mdl", "#", "#", 2, "", "-825,825,7.624", "0,90,0"}) - asmlib.InsertRecord({"models/sprops/trans/train/rerailer.mdl", "#", "#", 1, "-1088.178,0,19.886", "-1280.383,0,7.618", "0,180,0"}) - asmlib.DefaultType("XQM Coaster") - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_1.mdl", "#", "#", 1, "", "75.790,-0.013,-2.414", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_1.mdl", "#", "#", 2, "", "-70.806,-0.003.923,26.580", "@-22.5,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_2.mdl", "#", "#", 1, "", "149.8, -0.013, -9.62", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_2.mdl", "#", "#", 2, "", "-141.814, 0.004, 48.442", "@-22.5,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_3.mdl", "#", "#", 1, "", "225.199, -0.016, -16.814", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_3.mdl", "#", "#", 2, "", "-214.187, 0.006, 70.463", "@-22.5,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_4.mdl", "#", "#", 1, "", "298.8, -0.013, -24.02", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_4.mdl", "#", "#", 2, "", "-285.799, 0.019, 92.158", "@-22.5,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_1.mdl", "#", "#", 1, "", "74.8, -0.013, -9.758", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_1.mdl", "#", "#", 2, "", "-59.846, 0.021, 45.855", "@-45,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_2.mdl", "#", "#", 1, "", "-148.199, 0.021, -24.085", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_2.mdl", "#", "#", 2, "", "121.828, -0.004, 88.131", "@-45,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_3.mdl", "#", "#", 1, "", "-221.204, 0.005, -38.364", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_3.mdl", "#", "#", 2, "", "183.612, -0.018, 129.084", "@-45,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_4.mdl", "#", "#", 1, "", "-293.8, -0.013, -52.661", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_4.mdl", "#", "#", 2, "", "245.168, -0.007, 170.857", "@-45,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_1.mdl", "#", "#", 1, "", "75, -0.016, -9.757", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_1.mdl", "#", "#", 2, "", "-115.988, 0.017, 181.075", "@-90,0,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_2.mdl", "#", "#", 1, "", "-148.198, -0.013, -24.085", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_2.mdl", "#", "#", 2, "", " 233.158, 0.013, 358.192", "@-90, 180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_3.mdl", "#", "#", 1, "", "-221.1, -0.013, -38.366", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_3.mdl", "#", "#", 2, "", "351.2, -0.013, 533.582", "@-90,-180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_4.mdl", "#", "#", 1, "", "-293.701, -0.013, -52.661", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_4.mdl", "#", "#", 2, "", "468.482, -0.013, 710.225", "@-90,-180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_1.mdl", "#", "#", 1, "", " -73.800, -0.013, 11.999", " 0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_1.mdl", "#", "#", 2, "", " 72.814, -0.013, -16.992", "@22.5,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_2.mdl", "#", "#", 1, "", "-148.626, -0.013, 19.510", " 0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_2.mdl", "#", "#", 2, "", " 134.806, -0.011, -36.762", "@22.5,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_3.mdl", "#", "#", 1, "", "-224.899, 0.010, 25.763", " 0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_3.mdl", "#", "#", 2, "", " 202.547, -0.014, -57.473", "@22.5,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_4.mdl", "#", "#", 1, "", "-300.319, 0.017, 32.110", " 0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_4.mdl", "#", "#", 2, "", " 268.600, 0.052, -77.783", "@22.5,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_1.mdl", "#", "#", 1, "", "-71.199, -0.013, 18.809", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_1.mdl", "#", "#", 2, "", " 63.815, -0.021, -37.126", "@45,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_2.mdl", "#", "#", 1, "", "-144.8, -0.013, 33.103", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_2.mdl", "#", "#", 2, "", "125.217, -0.014, -78.778", "@45,0,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_3.mdl", "#", "#", 1, "", "217.199, -0.013, 47.332", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_3.mdl", "#", "#", 2, "", "-187.587, 0.003, -120.127", "@45,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_4.mdl", "#", "#", 1, "", "290.79, -0.013, 61.604", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_4.mdl", "#", "#", 2, "", "-249.142, 0.017, -161.855", "@45, 180, 0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_1.mdl", "#", "#", 1, "", "-70.793, -0.038, 18.807", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_1.mdl", "#", "#", 2, "", "119.415, -0.013, -171.482", "@90,-180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_2.mdl", "#", "#", 1, "", "-144.804, -0.013, 33.103", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_2.mdl", "#", "#", 2, "", "237.418, -0.013, -349.306", "@90,180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_3.mdl", "#", "#", 1, "", "217.199, -0.013, 47.332", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_3.mdl", "#", "#", 2, "", "-355.101, 0.01, -524.496", "@90,0,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_4.mdl", "#", "#", 1, "", "290.8, -0.013, 61.604", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_4.mdl", "#", "#", 2, "", "-473.228, -0.013, -701.956", "@90,0,180"}) - --- XQM Turn --- - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_1.mdl", "#", "#", 1, "", "73.232, -14.287, 4.894", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_1.mdl", "#", "#", 2, "", "-62.119, 41.771, 4.888", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_2.mdl", "#", "#", 1, "", "145.801, -28.557, 4.893", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_2.mdl", "#", "#", 2, "", "-123.848, 83.091, 4.921", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_3.mdl", "#", "#", 1, "", "218.8, -42.829, 4.899", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_3.mdl", "#", "#", 2, "", "-184.844, 124.707, 4.88", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_4.mdl", "#", "#", 1, "", "292.197, -57.102, 4.896", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_4.mdl", "#", "#", 2, "", "-246.823, 166.305, 4.888", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_1.mdl", "#", "#", 1, "", "73.199, -14.286, 4.894", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_1.mdl", "#", "#", 2, "", "-117.904, 176.785, 4.888", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_2.mdl", "#", "#", 1, "", "145.748, -28.566, 4.883", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_2.mdl", "#", "#", 2, "", "-235.851, 352.965, 4.883", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_3.mdl", "#", "#", 1, "", "219.199, -42.829, 4.9", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_3.mdl", "#", "#", 2, "", "-352.072, 529.25, 4.888", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_4.mdl", "#", "#", 1, "", "292.695, -57.102, 4.897", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_4.mdl", "#", "#", 2, "", "-470.379, 706.175, 4.887", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_1.mdl", "#", "#", 1, "", "72.8, 367.527, 4.894", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_1.mdl", "#", "#", 2, "", "72.8, -14.286, 4.894", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_3.mdl", "#", "#", 1, "", "218.767, -42.833, 4.888", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_3.mdl", "#", "#", 2, "", "218.767, 1100.169, 4.91", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_2.mdl", "#", "#", 1, "", "146.198, -28.561, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_2.mdl", "#", "#", 2, "", "146.041, 735.053, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_4.mdl", "#", "#", 1, "", "292.283, -57.102, 4.896", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_4.mdl", "#", "#", 2, "", "292.283, 1468.9, 4.896", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_1.mdl", "#", "#", 1, "", "68.201, -27.47, 4.907", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_1.mdl", "#", "#", 2, "", "-27.469, 68.408, 4.907", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_2.mdl", "#", "#", 1, "", "134.784, -54.932, 4.883", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_2.mdl", "#", "#", 2, "", "-54.9, 134.79, 4.908", "0, 90, 0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_3.mdl", "#", "#", 1, "", "203.169, -82.386, 4.885", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_3.mdl", "#", "#", 2, "", "-82.342, 203.198, 4.884", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_4.mdl", "#", "#", 1, "", "270.8, -109.856, 4.889", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_4.mdl", "#", "#", 2, "", "-109.812, 270.799, 4.89", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_2.mdl", "#", "#", 1, "", "93.769, 96.842, 4.9", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_2.mdl", "#", "#", 2, "", "-93.912, 96.841, 4.9", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_3.mdl", "#", "#", 1, "", "138.58, 144.2, 4.906", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_3.mdl", "#", "#", 2, "", "-142.846, 144.192, 4.888", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_4.mdl", "#", "#", 1, "", "184.588, 191.8, 4.905", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_4.mdl", "#", "#", 2, "", "-190.323, 191.8, 4.905", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_1.mdl", "#", "#", 1, "", "73.214, -14.287, 4.889", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_1.mdl", "#", "#", 2, "", "-62.103, 41.809, 49.893", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_2.mdl", "#", "#", 1, "", "145.789, -28.557, 4.888", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_2.mdl", "#", "#", 2, "", "-123.816, 83.09, 49.885", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_3.mdl", "#", "#", 1, "", "218.817, -42.829, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_3.mdl", "#", "#", 2, "", "-184.823, 124.712, 49.888", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_4.mdl", "#", "#", 1, "", "292.295, -57.102, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_4.mdl", "#", "#", 2, "", "-246.825, 166.303, 49.887", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_1.mdl", "#", "#", 1, "", "151.949, -115.536, -28.863", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_1.mdl", "#", "#", 2, "", "-39.186, 75.539, 61.137", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_2.mdl", "#", "#", 1, "", "247.052, -129.807, -17.611", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_2.mdl", "#", "#", 2, "", "-134.631, 251.731, 72.387", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_3.mdl", "#", "#", 1, "", "342.55, -166.589, -6.356", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_3.mdl", "#", "#", 2, "", "-228.353, 405.104, 83.627", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_4.mdl", "#", "#", 1, "", "461.445, -180.852, -6.363", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_4.mdl", "#", "#", 2, "", "-301.622, 582.445, 83.635", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_1.mdl", "#", "#", 1, "", "61.949, -171.786, -85.113", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_1.mdl", "#", "#", 2, "", "61.849, 210.026, 94.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_2.mdl", "#", "#", 1, "", "145.79, -377.307, -51.364", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_2.mdl", "#", "#", 2, "", "145.64, 386.277, 128.636", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_3.mdl", "#", "#", 1, "", "219.186, -560.329, -73.863", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_3.mdl", "#", "#", 2, "", "219.938, 582.673, 106.137", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_4.mdl", "#", "#", 1, "", "292.682, -57.062, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_4.mdl", "#", "#", 2, "", "292.882, 1468.926, 184.888", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_1.mdl", "#", "#", 1, "", "73.199, -14.286, 49.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_1.mdl", "#", "#", 2, "", "-62.097, 41.783, 4.886", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_2.mdl", "#", "#", 1, "", "145.79, -28.558, 49.879", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_2.mdl", "#", "#", 2, "", "-123.833, 83.088, 4.892", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_3.mdl", "#", "#", 1, "", "219.197, -42.829, 49.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_3.mdl", "#", "#", 2, "", "-185.095, 124.99, 4.888", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_4.mdl", "#", "#", 1, "", "292.695, -57.102, 49.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_4.mdl", "#", "#", 2, "", "-247.123, 166.602, 4.888", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_1.mdl", "#", "#", 1, "", "128.858, -14.281, 72.387", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_1.mdl", "#", "#", 2, "", "-61.682, 176.749, -17.61", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_2.mdl", "#", "#", 1, "", "179.55, -28.557, 61.136", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_2.mdl", "#", "#", 2, "", "-202.131, 352.976, -28.864", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_3.mdl", "#", "#", 1, "", "241.3, -42.829, 61.136", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_3.mdl", "#", "#", 2, "", "-329.578, 528.859, -28.864", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_4.mdl", "#", "#", 1, "", "292.296, -57.102, 94.89", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_4.mdl", "#", "#", 2, "", "-470.372, 705.791, 4.886", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_1.mdl", "#", "#", 1, "", "73.2, -149.286, 128.637", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_1.mdl", "#", "#", 2, "", "73.099, 232.527, -51.363", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_2.mdl", "#", "#", 1, "", "145.8, -287.306, 117.387", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_2.mdl", "#", "#", 2, "", "145.6, 476.307, -62.612", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_3.mdl", "#", "#", 1, "", "219.196, -391.579, 117.387", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_3.mdl", "#", "#", 2, "", "219.948, 751.399, -62.61", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_4.mdl", "#", "#", 1, "", "292.681, -630.852, 117.391", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_4.mdl", "#", "#", 2, "", "292.833, 895.14, -62.613", ""}) - --- XQM Bank -- - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_1.mdl", "#", "#", 1, "", "149.7, -0.005, 4.88", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_1.mdl", "#", "#", 2, "", "-149.7, 0.024, 4.865", "0,180,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_2.mdl", "#", "#", 1, "", "299.790,-0.021,4.885", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_2.mdl", "#", "#", 2, "", "-299.790,0.007,4.862", "0,180,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_3.mdl", "#", "#", 1, "", "449.8, -0.018, 4.896", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_3.mdl", "#", "#", 2, "", "-449.802, -0.003, 4.853", "0,-180,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_4.mdl", "#", "#", 1, "", "600.194, -0.017, 4.888", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_4.mdl", "#", "#", 2, "", "-600.199, 0.025, 4.872", "0,180,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_1.mdl", "#", "#", 1, "", "150.199, 0.032, 4.885", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_1.mdl", "#", "#", 2, "", "-150.168, -0.014, 4.881", "0,180,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_2.mdl", "#", "#", 1, "", "300.199, -0.011, 4.895", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_2.mdl", "#", "#", 2, "", "-300.198, 0.032, 4.914", "0,180,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_3.mdl", "#", "#", 1, "", "449.378, -0.025, 4.893", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_3.mdl", "#", "#", 2, "", "-449.801, 0.018, 4.896", "0,180,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_4.mdl", "#", "#", 1, "", "599.802, -0.013, 4.883", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_4.mdl", "#", "#", 2, "", "-600.198, -0.015, 4.902", "0,-180,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_1.mdl", "#", "#", 1, "", "74.199, 14.457, 4.888", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_1.mdl", "#", "#", 2, "", "-63.081, -42.297, 4.912", "0,-135,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_2.mdl", "#", "#", 1, "", "147.199, 28.717, 4.886", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_2.mdl", "#", "#", 2, "", "-124.087, -83.935, 4.901", "0,-135,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_3.mdl", "#", "#", 1, "", "219.8, 42.98, 4.887", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_3.mdl", "#", "#", 2, "", "-185.808, -125.258, 4.908", "0,-135,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_4.mdl", "#", "#", 1, "", "292.799, 57.249, 4.89", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_4.mdl", "#", "#", 2, "", "-247.727, -166.794, 4.908", "0,-135,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_1.mdl", "#", "#", 1, "", "73.8, 14.448, 4.895", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_1.mdl", "#", "#", 2, "", "-119.757, -178.862, 4.909", "0,-90,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_2.mdl", "#", "#", 1, "", "147.2, 28.719, 4.887", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_2.mdl", "#", "#", 2, "", "-235.985, -355.128, 4.904", "0,-90,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_3.mdl", "#", "#", 1, "", "220.199, 42.985, 4.89", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_3.mdl", "#", "#", 2, "", "-353.929, -531.719, 4.91", "0,-90,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_4.mdl", "#", "#", 1, "", "292.790,57.259,4.881", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_4.mdl", "#", "#", 2, "", "-471.864,-707.923,4.910", "0,-90.00,-45.00"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_1.mdl", "#", "#", 1, "", "73.8, 14.45, 4.887", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_1.mdl", "#", "#", 2, "", "73.46, -372.816, 4.902", "0,0,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_2.mdl", "#", "#", 1, "", "146.8, 28.715, 4.888", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_2.mdl", "#", "#", 2, "", "147.376, -737.938, 4.911", "0,0,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_3.mdl", "#", "#", 1, "", "220.191, 43.001, 4.907", "0,0,45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_3.mdl", "#", "#", 2, "", "220.813, -1105.46, 4.883", "0,0,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_4.mdl", "#", "#", 1, "", "293.308, -1472.996, 4.916", "0,0,-45"}) - asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_4.mdl", "#", "#", 2, "", "292.8, 57.26, 4.89", "0,0,45"}) - --- XQM Special --- - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_2.mdl", "#", "#", 1, "", "150.189, -36.538, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_2.mdl", "#", "#", 2, "", "-150.199, 36.554, 4.887", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_3.mdl", "#", "#", 1, "", "225.199, -36.549, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_3.mdl", "#", "#", 2, "", "-225.099, 36.55, 4.887", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_4.mdl", "#", "#", 1, "", "300.2, -36.649, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_4.mdl", "#", "#", 2, "", "-300.195, 36.561, 4.887", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_2.mdl", "#", "#", 1, "", "149.8, 36.553, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_2.mdl", "#", "#", 2, "", "-149.8, -36.54, 4.886", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_3.mdl", "#", "#", 1, "", "225.159, 36.552, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_3.mdl", "#", "#", 2, "", "-225.2, -36.559, 4.886", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_4.mdl", "#", "#", 1, "", "299.8, 36.623, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_4.mdl", "#", "#", 2, "", "-299.8, -36.6, 4.886", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_2.mdl", "#", "#", 1, "", "189.277, 59.435, 41.118", "0,90,-90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_2.mdl", "#", "#", 2, "", "-192.302, 46.789, -17.492", "@22.5,90,90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_3.mdl", "#", "#", 1, "", "-285.755, -96.647, 32.538", "0,-90,-90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_3.mdl", "#", "#", 2, "", "281.393, -79.204, -55.216", "@22.5,-90,90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_4.mdl", "#", "#", 1, "", "322.424, -72.015, 15.907", "0,-90,90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_4.mdl", "#", "#", 2, "", "-419.735, -44.894, 132.706", "@-22.5,-90,-90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_2.mdl", "#", "#", 1, "", "-207.841, 30.414, 100.219", "@-22.5,-90,-90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_2.mdl", "#", "#", 2, "", "-207.993, 7.31, -17.474", "@22.5,90,90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_3.mdl", "#", "#", 1, "", "281.359, -6.612, 120.391", "@-22.5,90,-90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_3.mdl", "#", "#", 2, "", "281.371, 28.004, -55.354", "@22.5,-90,90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_4.mdl", "#", "#", 1, "", "322.609, 52.146, 251.028", "0,90,-90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_4.mdl", "#", "#", 2, "", "322.431, 5.79, 15.895", "0,-90,90"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_1.mdl", "#", "#", 1, "", "150.199, 0.013, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_1.mdl", "#", "#", 2, "", "-1050.199, -0.01, 4.886", "0,180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_2.mdl", "#", "#", 1, "", "1126.907, -0.013, 4.883, 4.9", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_2.mdl", "#", "#", 2, "", "-1272.492, -0.164, 4.883", "0,-180,-180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_3.mdl", "#", "#", 1, "", "1349.823, -0.012, 4.883", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_3.mdl", "#", "#", 2, "", "-2249.7, -0.013, 4.884", "0,-180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_4.mdl", "#", "#", 1, "", "1950.199, -0.017, 4.889", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_4.mdl", "#", "#", 2, "", "-2850.199, -0.047, 4.88", "0,-180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_1.mdl", "#", "#", 1, "", "150.079, -0.009, 4.878", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_1.mdl", "#", "#", 2, "", "-1050.198, -0.036, 4.877", "0,180,-180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_2.mdl", "#", "#", 1, "", "299.8, -0.013, 4.884", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_2.mdl", "#", "#", 2, "", "-2099.8, -0.013, 4.883", "0,-180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_3.mdl", "#", "#", 1, "", "449.801, -0.014, 4.882", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_3.mdl", "#", "#", 2, "", "-3149.802, -0.028, 4.871", "0,180,180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_4.mdl", "#", "#", 1, "", "599.801, -0.014, 4.888", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_4.mdl", "#", "#", 2, "", "-4199.8, -0.013, 4.881", "0,-180,-180"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_1.mdl", "#", "#", 1, "", "150, -0.013, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_1.mdl", "#", "#", 2, "", "-2250, -0.013, 4.886", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_3.mdl", "#", "#", 1, "", "2550.2, -0.012, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_3.mdl", "#", "#", 2, "", "-4650.14, -0.013, 4.886", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_4.mdl", "#", "#", 1, "", "3749.790,-0.019,4.879", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_4.mdl", "#", "#", 2, "", "-5849.795, 0.008, 4.884", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_1.mdl", "#", "#", 1, "", "149.695, -0.02, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_1.mdl", "#", "#", 2, "", "-2249.721, 0.014, 4.888", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_2.mdl", "#", "#", 1, "", "1350.218, 0.029, 4.883", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_2.mdl", "#", "#", 2, "", "-3450.199, -0.009, 4.887", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_3.mdl", "#", "#", 1, "", "2550, -0.013, 4.886", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_3.mdl", "#", "#", 2, "", "-4650.203, 0.023, 4.886", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_4.mdl", "#", "#", 1, "", "3749.804, -0.001, 4.888", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_4.mdl", "#", "#", 2, "", "-5849.8, 0.036, 4.888", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_3.mdl", "#", "#", 1, "", "14.2, 67.584, -279.931", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_3.mdl", "#", "#", 2, "", "-0.172, -67.619, -279.937", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_4.mdl", "#", "#", 1, "", "2.16, 89.53, -307.495", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_4.mdl", "#", "#", 2, "", "-18.191, -72.398, -307.642", "0,-180,0"}) - --- XQM Straight --- - asmlib.InsertRecord({"models/xqm/coastertrack/straight_1.mdl", "#", "#", 1, "", "74.802, -0.013, 4.886, 0", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_1.mdl", "#", "#", 2, "", "-74.803, -0.013, 4.886", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_2.mdl", "#", "#", 1, "", "149.805, -0.013, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_2.mdl", "#", "#", 2, "", "-149.805, -0.013, 4.887", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_3.mdl", "#", "#", 1, "", "225.206, -0.013, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_3.mdl", "#", "#", 2, "", "-225.196, -0.013, 4.887", "0,-180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_4.mdl", "#", "#", 1, "", "300.164, -0.013, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/straight_4.mdl", "#", "#", 2, "", "-300.189, -0.013, 4.887", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_station.mdl", "#", "#", 1, "", "150.194, -0.045, 4.887", ""}) - asmlib.InsertRecord({"models/xqm/coastertrack/special_station.mdl", "#", "#", 2, "", "-150.184, -0.045, 4.887", "0,-180,0"}) - asmlib.DefaultType("PHX Road") - asmlib.InsertRecord({"models/props_phx/huge/road_short.mdl", "#", "#", 1, "", "0, 299.693, 1.765", "0, 90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_short.mdl", "#", "#", 2, "", "0,-299.693, 1.765", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_medium.mdl", "#", "#", 1, "", "0, 599.386, 1.765", "0, 90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_medium.mdl", "#", "#", 2, "", "0,-599.386, 1.765", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_long.mdl", "#", "#", 1, "", "0, 1198.773, 1.765", "0, 90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_long.mdl", "#", "#", 2, "", "0,-1198.773, 1.765", "0,-90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_curve.mdl", "#", "#", 1, "", "162.813, 379.277, 1.879", "0, 90,0"}) - asmlib.InsertRecord({"models/props_phx/huge/road_curve.mdl", "#", "#", 2, "", "-363.22, -146.757, 1.879", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/misc/small_ramp.mdl", "#", "#", 1, "", "-284.589, -3.599976, -1.672", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/misc/small_ramp.mdl", "#", "#", 2, "", " 312.608, -3.599976, 236.11", "@-45,0,0"}) - asmlib.InsertRecord({"models/props_phx/misc/big_ramp.mdl", "#", "#", 1, "", "-569.177, -7.199953, -3.075", "0,-180,0"}) - asmlib.InsertRecord({"models/props_phx/misc/big_ramp.mdl", "#", "#", 2, "", "625.022, -7.199953, 472.427", "@-45,0,0"}) - asmlib.DefaultType("PHX Monorail Beam") - asmlib.InsertRecord({"models/props_phx/misc/iron_beam1.mdl", "#", "#", 1, "", " 22.411, 0.001, 5.002", "0, 0,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam1.mdl", "#", "#", 2, "", "-22.413, 0.001, 5.002", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam2.mdl", "#", "#", 1, "", " 45.298, 0.001, 5.002", "0, 0,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam2.mdl", "#", "#", 2, "", "-46.968, 0.001, 5.002", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam3.mdl", "#", "#", 1, "", " 93.069, 0, 5.002", "0, 0,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam3.mdl", "#", "#", 2, "", "-94.079, 0.002, 5.002", "0,180,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam4.mdl", "#", "#", 1, "", " 175.507, 0.001, 5.002", "0, 0,0"}) - asmlib.InsertRecord({"models/props_phx/misc/iron_beam4.mdl", "#", "#", 2, "", "-201.413, 0.001, 5.002", "0,180,0"}) - asmlib.DefaultType("XQM Ball Rails") - asmlib.InsertRecord({"models/xqm/rails/tunnel_1.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_1.mdl", "#", "#", 2, "", "-6, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_2.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_2.mdl", "#", "#", 2, "", "-18, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_4.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_4.mdl", "#", "#", 2, "", "-42, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_8.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_8.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_16.mdl","#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/tunnel_16.mdl","#", "#", 2, "", "-186, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/straight_1.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/straight_1.mdl", "#", "#", 2, "", "-6, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/straight_2.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/straight_2.mdl", "#", "#", 2, "", "-18, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/straight_4.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/straight_4.mdl", "#", "#", 2, "", "-42, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/straight_8.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/straight_8.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/straight_16.mdl","#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/straight_16.mdl","#", "#", 2, "", "-186, 0, -2.25", "0,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/funnel.mdl","#", "#", 1, "", "2.206, 0.003, 4.282", "90,0,180"}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_15.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_15.mdl", "#", "#", 2, "", "-20.245, -0.018, -4.13", "@15,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_30.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_30.mdl", "#", "#", 2, "", "-32.078, 0.022, -9.114", "@30,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_45.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_45.mdl", "#", "#", 2, "", "-42.144, -0.011, -16.998", "@45,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_90.mdl", "#", "#", 1, "", "38, 0.019, 30.42", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_down_90.mdl", "#", "#", 2, "", "-30.418, -0.009, -37.98", "@90,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_15.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_15.mdl", "#", "#", 2, "", "-15.521, 0.014, -1.009", "@-15,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_30.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_30.mdl", "#", "#", 2, "", "-22.871, -0.019, 2.152", "@-30,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_45.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_45.mdl", "#", "#", 2, "", "-29.149, 0.006, 7.109", "@-45,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_90.mdl", "#", "#", 1, "", "6.004, 0.005, 15.322", ""}) - asmlib.InsertRecord({"models/xqm/rails/slope_up_90.mdl", "#", "#", 2, "", "-44.066, -0.011, 65.001", "@-90,180,0"}) - asmlib.InsertRecord({"models/xqm/rails/turn_15.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/turn_15.mdl", "#", "#", 2, "", "-17.591, 3.105, -2.25, -1.009", "0,165,0"}) - asmlib.InsertRecord({"models/xqm/rails/turn_30.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/turn_30.mdl", "#", "#", 2, "", "-28.676, 7.705, -2.252", "0,150,0"}) - asmlib.InsertRecord({"models/xqm/rails/turn_45.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/turn_45.mdl", "#", "#", 2, "", "-38.2, 15.001, -2.261", "0,135,0"}) - asmlib.InsertRecord({"models/xqm/rails/turn_90.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/turn_90.mdl", "#", "#", 2, "", "-58.848, 56.855, -2.255", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/rails/turn_180.mdl", "#", "#", 1, "", "52.789, 44.753, -2.273", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/rails/turn_180.mdl", "#", "#", 2, "", "-52.808, 44.743, -2.238", "0,90,0"}) - asmlib.InsertRecord({"models/xqm/rails/twist_45_left.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/twist_45_left.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,-45"}) - asmlib.InsertRecord({"models/xqm/rails/twist_90_left.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/twist_90_left.mdl", "#", "#", 2, "", "-186, 0, -2.25", "0,180,-90"}) - asmlib.InsertRecord({"models/xqm/rails/twist_45_right.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/twist_45_right.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,45"}) - asmlib.InsertRecord({"models/xqm/rails/twist_90_right.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) - asmlib.InsertRecord({"models/xqm/rails/twist_90_right.mdl", "#", "#", 2, "", "-186, 0, -2.25", "0,180,-90"}) - asmlib.InsertRecord({"models/xqm/rails/loop_left.mdl", "#", "#", 1, "", "13.7315, 41.726, -0.968", "0,22.5,-2.2585"}) - asmlib.InsertRecord({"models/xqm/rails/loop_left.mdl", "#", "#", 2, "", "-13.7315, -41.726, -0.968", "0,-157.5,-2.2585"}) - asmlib.InsertRecord({"models/xqm/rails/loop_right.mdl", "#", "#", 1, "", "13.864, -41.787, -0.953", "0,-22.5,2.433"}) - asmlib.InsertRecord({"models/xqm/rails/loop_right.mdl", "#", "#", 2, "", "-13.562, 41.789, -0.952", "0,157.5,2.433"}) - asmlib.DefaultType("Magnum's Rails") - asmlib.InsertRecord({"models/magtrains1ga/straight_0032.mdl", "#", "#", 1, "", " 16 , 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0032.mdl", "#", "#", 2, "", "-16 , 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0064.mdl", "#", "#", 1, "", " 32 , 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0064.mdl", "#", "#", 2, "", "-32 , 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0128.mdl", "#", "#", 1, "", " 64 , 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0128.mdl", "#", "#", 2, "", "-64 , 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0256.mdl", "#", "#", 1, "", " 128 , 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0256.mdl", "#", "#", 2, "", "-128 , 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0512.mdl", "#", "#", 1, "", " 256 , 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_0512.mdl", "#", "#", 2, "", "-256 , 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/straight_1024.mdl", "#", "#", 1, "", " 512 , 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_1024.mdl", "#", "#", 2, "", "-512 , 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/straight_2048.mdl", "#", "#", 1, "", " 1024, 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/straight_2048.mdl", "#", "#", 2, "", "-1024, 0, 3.016", "0,180,0"}) - asmlib.InsertRecord({"models/magtrains1ga/curve_225.mdl", "#", "#", 1, "", "-0.01, 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/curve_225.mdl", "#", "#", 2, "", "-587.955, -117.702, 3.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/magtrains1ga/curve_45.mdl", "#", "#", 1, "", "-0.012, 0, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/curve_45.mdl", "#", "#", 2, "", "-1087.089, -451.055, 3.016", "0,-135,0"}) - asmlib.InsertRecord({"models/magtrains1ga/curve_90.mdl", "#", "#", 1, "", " 1086.58, 450.079, 3.016", ""}) - asmlib.InsertRecord({"models/magtrains1ga/curve_90.mdl", "#", "#", 2, "", "-449.475,-1085.92, 3.016", "0,-90,0"}) - asmlib.DefaultType("Shinji85's Rails") - asmlib.SettingsModelToName("SET",nil,{"rail_","straight_"},nil) - asmlib.InsertRecord({"models/shinji85/train/rail_1x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_1x.mdl", "#", "#", 2, "", "-128,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_2x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_2x.mdl", "#", "#", 2, "", "-256,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_4x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_4x.mdl", "#", "#", 2, "", "-512,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_8x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_8x.mdl", "#", "#", 2, "", "-1024,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_16x.mdl", "#","#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_16x.mdl", "#","#", 2, "", "-2048,0,7.346", "0,180,0"}) - asmlib.SettingsModelToName("SET",nil,{"_crossing","","rail_","crossing_"},nil) - asmlib.InsertRecord({"models/shinji85/train/rail_4x_crossing.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_4x_crossing.mdl", "#", "#", 2, "", "-512,0,7.346", "0,180,0"}) - asmlib.SettingsModelToName("SET",{1,5}) - asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 2, "", "-512,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 3, "", "-256,-256,7.346", "0,270,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 4, "", "-256,256,7.346", "0,90,0"}) - asmlib.SettingsModelToName("SET",{1,5},{"_crossing","","double_","crossing_double_"}) - asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 1, "", "0,128,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 2, "", "-512,128,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 3, "", "0,-128,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 4, "", "-512,-128,7.346", "0,180,0"}) - asmlib.SettingsModelToName("SET",{1,5}) - asmlib.InsertRecord({"models/shinji85/train/rail_bumper.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.SettingsModelToName("SET",{1,5},{"double_bumper","bumper_double"},nil) - asmlib.InsertRecord({"models/shinji85/train/rail_double_bumper.mdl", "#", "#", 1, "", "0,128,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_double_bumper.mdl", "#", "#", 2, "", "0,-128,7.346", ""}) - asmlib.SettingsModelToName("SET",{1,5}) - --- Shinji85 Curve --- - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R1.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R1.mdl", "#", "#", 2, "", "-1060.12341 ,139.56763 ,7.346", "0,165,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R2.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R2.mdl", "#", "#", 2, "", "-993.86572 ,130.84471 ,7.346", "0,165,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R3.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R3.mdl", "#", "#", 2, "", "-927.60797 ,122.1218 ,7.346", "0,165,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_CC.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_CC.mdl", "#", "#", 2, "", "-966.40515 ,128, 7.346", "0,165,0"}) - --- Shinji85 Switch --- - asmlib.SettingsModelToName("SET",{1,5},{"r_","right_","l_","left_"},nil) - asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl", "#", "#", 2, "", "-1024,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl", "#", "#", 3, "", "-966.40515 ,128, 7.346", "0,165,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl", "#", "#", 2, "", "-1024,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl", "#", "#", 3, "", "-966.40515 ,-128, 7.346", "0,195,0"}) - asmlib.SettingsModelToName("SET",{1,5}) - --- Shinji85 Raccordi --- - asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 2, "", "-494.55,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 3, "", "-33.129,-123.63866,7.346", "0,-30,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 4, "", "-461.42175,123.63649,7.346", "0,150,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_Cx.mdl", "#", "Counter X", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_Cx.mdl", "#", "Counter X", 2, "", "-362.51361,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_CS.mdl", "#", "Counter Switch", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_CS.mdl", "#", "Counter Switch", 2, "", "-908.81165,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_Cxfix.mdl", "#", "Counter X Fix", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_Cxfix.mdl", "#", "Counter X Fix", 2, "", "-149.48648,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_CSfix.mdl", "#", "Counter Switch Fix", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_CSfix.mdl", "#", "Counter Switch Fix", 2, "", "-115.18847,0,7.346", "0,180,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R11.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R11.mdl", "#", "#", 2, "", "-1086.11584 ,449.88458 ,7.346", "0,135,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R12.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R12.mdl", "#", "#", 2, "", "-905.09656 ,374.90414 ,7.346", "0,135,0"}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R13.mdl", "#", "#", 1, "", "0,0,7.346", ""}) - asmlib.InsertRecord({"models/shinji85/train/rail_curve_R13.mdl", "#", "#", 2, "", "-724.07727 ,299.92276 ,7.346", "0,135,0"}) - asmlib.DefaultType("Sligwof's Railcar") - asmlib.InsertRecord({"models/swrcs/swrccross.mdl", "#", "Switcher Cross", 1, "", "500,0,0", ""}) - asmlib.InsertRecord({"models/swrcs/swrccross.mdl", "#", "Switcher Cross", 2, "", "-2673,0,0", "0,180,0"}) - asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 1, "", "890, 748.009, 2.994", ""}) - asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 2, "", "890, 451.998, 2.994", ""}) - asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 3, "", "890, -452.001, 2.974", ""}) - asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 4, "", "890, -748.027, 2.974", ""}) - asmlib.InsertRecord({"models/swrcs/swrclooping.mdl", "#", "Loop 180", 1, "", "810, -252.447, -0.005", ""}) - asmlib.InsertRecord({"models/swrcs/swrclooping.mdl", "#", "Loop 180", 2, "", "-809.999, 136.997, -0.002", "0,180,0"}) - asmlib.InsertRecord({"models/swrcs/swrcloopingspecial.mdl", "#", "LoopSwitch 180", 1, "", "927.001, -194.403, -0.036", ""}) - asmlib.InsertRecord({"models/swrcs/swrcloopingspecial.mdl", "#", "LoopSwitch 180", 2, "", "-809.999, 137.003, 350.984", "0,-180,0"}) - asmlib.InsertRecord({"models/swrcs/swrcloopingspecial.mdl", "#", "LoopSwitch 180", 3, "", "-809.999, -527.972, 350.984", "0,-180,0"}) - asmlib.InsertRecord({"models/swrcs/swrcramp.mdl", "#", "Ramp 45", 1, "", "1000, 0, 0", ""}) - asmlib.InsertRecord({"models/swrcs/swrcramp.mdl", "#", "Ramp 45", 2, "", "-641.92, 0, 269.672", "@-45,-180,0"}) - asmlib.InsertRecord({"models/swrcs/swrctraffic_lights.mdl", "#", "Start Lights", 1, "", "0, -152.532, 0", ""}) - asmlib.InsertRecord({"models/swrcs/swrctraffic_lights.mdl", "#", "Start Lights", 2, "", "0, 152.554, 0", ""}) - asmlib.InsertRecord({"models/swrcs/swrctraffic_lights.mdl", "#", "Start Lights", 3, "", "0, 0, 0.042", ""}) - asmlib.DefaultType("Random Bridges") - asmlib.InsertRecord({"models/props_canal/canal_bridge01.mdl", "#", "#", 1, "", "455.345, -6.815, 201.73", ""}) - asmlib.InsertRecord({"models/props_canal/canal_bridge01.mdl", "#", "#", 2, "", "-456.655, -6.815, 201.73", "0,-180,0"}) - asmlib.InsertRecord({"models/props_canal/canal_bridge01b.mdl", "#", "#", 1, "", "910.69, -13.63, 403.46", ""}) - asmlib.InsertRecord({"models/props_canal/canal_bridge01b.mdl", "#", "#", 2, "", "-913.31, -13.63, 403.46", "0,-180,0"}) - asmlib.InsertRecord({"models/props_canal/canal_bridge02.mdl", "#", "#", 1, "", "0, 512.155, 288", "0,90,0"}) - asmlib.InsertRecord({"models/props_canal/canal_bridge02.mdl", "#", "#", 2, "", "0, -512.212, 288", "0,-90,0"}) - asmlib.InsertRecord({"models/props_canal/canal_bridge03a.mdl", "#", "#", 1, "", "320.89, 0, 187.742", ""}) - asmlib.InsertRecord({"models/props_canal/canal_bridge03a.mdl", "#", "#", 2, "", "-320.059, 0, 187.742", "0,-180,0"}) - asmlib.InsertRecord({"models/props_canal/canal_bridge03b.mdl", "#", "#", 1, "", "320.89, 0, 187.741", ""}) - asmlib.InsertRecord({"models/props_canal/canal_bridge03b.mdl", "#", "#", 2, "", "-320.059, 0, 187.741", "0,-180,0"}) - asmlib.InsertRecord({"models/props_canal/canal_bridge03c.mdl", "#", "#", 1, "", "1026.848, 0, 600.773", ""}) - asmlib.InsertRecord({"models/props_canal/canal_bridge03c.mdl", "#", "#", 2, "", "-1024.189, 0, 600.773", "0,-180,0"}) - asmlib.SettingsModelToName("SET",nil,{"bridge","bridge_","001",""},nil) - asmlib.InsertRecord({"models/props_2fort/bridgesupports001.mdl", "#", "TF Support", 1, "", "448, 0, -14.268", ""}) - asmlib.InsertRecord({"models/props_2fort/bridgesupports001.mdl", "#", "TF Support", 2, "", "-448, 0, -15.558", "0,-180,0"}) - asmlib.SettingsModelToName("SET",nil,{"bridge01_","bridge_"},nil) - asmlib.InsertRecord({"models/askari/bridge01_stlve.mdl", "#", "Stlve", 1, "", "192, 0, 189.531", ""}) - asmlib.InsertRecord({"models/askari/bridge01_stlve.mdl", "#", "Stlve", 2, "", "-192, 0, 189.531", "0,-180,0"}) - asmlib.SettingsModelToName("CLR") - asmlib.InsertRecord({"models/karkar/bridge.mdl", "#", "Karkar", 1, "", "62.07, -343.696, 208.295", "0,-90,0"}) - asmlib.InsertRecord({"models/karkar/bridge.mdl", "#", "karkar", 2, "", "62.07, 334.44, 208.295", "0,90,0"}) - asmlib.InsertRecord({"models/karkar/wooden_bridge_helly.mdl", "#", "#", 1, "", "0, 318.601, 26.783", "0,90,0"}) - asmlib.InsertRecord({"models/karkar/wooden_bridge_helly.mdl", "#", "#", 2, "", "0, -240.814, 2.85", "0,-90,0"}) - asmlib.InsertRecord({"models/karkar/wooden_bridge_helly_broken_bstk.mdl", "#", "#", 1, "", "-318.524, 0, 26.757", "0,-180,0"}) - asmlib.InsertRecord({"models/karkar/wooden_bridge_helly_broken_bstk.mdl", "#", "#", 2, "", "244.523, 0, 3.55", ""}) - asmlib.InsertRecord({"models/props/tresslebridge.mdl", "#", "#", 1, "", "374.246, -1.2345, 24.849", ""}) - asmlib.InsertRecord({"models/props/tresslebridge.mdl", "#", "#", 2, "", "-345.367, -1.2345, 24.85", "0,180,0"}) - asmlib.InsertRecord({"models/props_combine/combine_bridge.mdl", "#", "#", 1, "", "-8.401, 0, 124.685", ""}) - asmlib.InsertRecord({"models/props_combine/combine_bridge.mdl", "#", "#", 2, "", "-320, 0, 124.685", "0,180,0"}) - asmlib.InsertRecord({"models/props_combine/combine_bridge_b.mdl", "#", "#", 1, "", "-330.895, 0.039, 124.673", ""}) - asmlib.InsertRecord({"models/props_combine/combine_bridge_b.mdl", "#", "#", 2, "", "-522.855, 0.251, 124.671", "0,180,0"}) - asmlib.InsertRecord({"models/props_swamp/big_jetty.mdl", "#", "#", 1, "", "0, 116.668, 57.94", "0,90,0"}) - asmlib.InsertRecord({"models/props_swamp/big_jetty.mdl", "#", "#", 2, "", "0, -11.914, 57.939", "0,-90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_128.mdl", "#", "#", 1, "", "0, 67.452, 14.326", "0, 90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_128.mdl", "#", "#", 2, "", "0,-63.954, 14.325", "0,-90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_256.mdl", "#", "#", 1, "", "0, 131.491, 14.199", "0, 90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_256.mdl", "#", "#", 2, "", "0,-139.388, 14.198", "0,-90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_384.mdl", "#", "#", 1, "", "0, 199.517, 14.302", "0, 90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_384.mdl", "#", "#", 2, "", "0,-196.069, 14.215", "0,-90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_128.mdl", "#", "#", 1, "", "0, 67.244, 14.323", "0, 90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_128.mdl", "#", "#", 2, "", "0,-63.033, 14.337", "0,-90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_256.mdl", "#", "#", 1, "", "0, 131.502, 14.339", "0, 90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_256.mdl", "#", "#", 2, "", "0,-127.085, 14.319", "0,-90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_384.mdl", "#", "#", 1, "", "0, 199.517, 14.332", "0, 90,0"}) - asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_384.mdl", "#", "#", 2, "", "0,-196.012, 14.318", "0,-90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge01.mdl", "#", "#", 1, "", "0, 68.767, 14.898", "0, 90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge01.mdl", "#", "#", 2, "", "0, -70.316, 14.898", "0,-90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge02.mdl", "#", "#", 1, "", "5.236, -13.396, 11.976", "0,-90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge02.mdl", "#", "#", 2, "", "5.236, 479.851, 11.976", "0, 90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge03.mdl", "#", "#", 1, "", "1.436, -12.169, 11.136", "0,-90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge03.mdl", "#", "#", 2, "", "1.436, 480.851, 11.136", "0, 90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge04.mdl", "#", "#", 1, "", "-2.253, -11.847, 10.696", "0,-90,0"}) - asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge04.mdl", "#", "#", 2, "", "-2.253, 480.851, 10.696", "0, 90,0"}) - asmlib.InsertRecord({"models/props_wasteland/bridge_low_res.mdl", "#", "#", 1, "", "5056, 219.145, 992.765", ""}) - asmlib.InsertRecord({"models/props_wasteland/bridge_low_res.mdl", "#", "#", 2, "", "-576, 219.145, 992.765", "0, 180,0"}) - asmlib.DefaultType("StephenTechno's Buildings Single") - asmlib.SettingsModelToName("SET",{1,4}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_10road_dl_sdw_1x32.mdl", "#", "#", 1, "", "-268,1152,2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_10road_dl_sdw_1x32.mdl", "#", "#", 2, "", "-268,-1152,2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_1road_dl_sdw_1x1.mdl", "#", "#", 1, "", "-268,36,2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_1road_dl_sdw_1x1.mdl", "#", "#", 2, "", "-268,-36,2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_2road_dl_sdw_1x2.mdl", "#", "#", 1, "", "-268, 72, 2.5", "0, 90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_2road_dl_sdw_1x2.mdl", "#", "#", 2, "", "-268, -72, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_3road_dl_sdw_1x3.mdl", "#", "#", 1, "", "-196,0,1.999", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_3road_dl_sdw_1x3.mdl", "#", "#", 2, "", "-196,-216,1.999", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_4road_dl_sdw_1x4.mdl", "#", "#", 1, "", "-268,144,2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_4road_dl_sdw_1x4.mdl", "#", "#", 2, "", "-268,-144,2.498", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_5road_dl_sdw_1x5.mdl", "#", "#", 1, "", "-268,180,2.498", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_5road_dl_sdw_1x5.mdl", "#", "#", 2, "", "-268,-180,2.498", "0,-90,0"}) - asmlib.SettingsModelToName("SET",nil,{"lot","lot_"},nil) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16.mdl", "#", "#", 1, "", "-268, 575, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16.mdl", "#", "#", 2, "", "-268, -577.002, 2.501", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16fence.mdl", "#", "#", 1, "", "-268, 575, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16fence.mdl", "#", "#", 2, "", "-268, -577.002, 2.501", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32.mdl", "#", "#", 1, "", "-268, 1152.002, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32.mdl", "#", "#", 2, "", "-267.999, -1151.292, 2.501", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32fence.mdl", "#", "#", 1, "", "-268, 1152.002, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32fence.mdl", "#", "#", 2, "", "-267.999, -1151.292, 2.501", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8fence.mdl", "#", "#", 1, "", "-268, 288, 2.501", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8fence.mdl", "#", "#", 2, "", "-268, -287.996, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8.mdl", "#", "#", 1, "", "-268, 288, 2.501", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8.mdl", "#", "#", 2, "", "-268, -287.996, 2.5", "0,-90,0"}) - asmlib.SettingsModelToName("SET",{1,3}) - asmlib.InsertRecord({"models/buildingspack/housing/3_0apartments_0.mdl", "#", "#", 1, "", "-268, 612.001, 2.501", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/housing/3_0apartments_0.mdl", "#", "#", 2, "", "-268, -612, 2.501", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/housing/3_1apartments_1.mdl", "#", "#", 1, "", "-268, 1248, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/housing/3_1apartments_1.mdl", "#", "#", 2, "", "-268, -1200, 2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/housing/3_3apartments_3.mdl", "#", "#", 1, "", "-268.008, 574.913, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/housing/3_3apartments_3.mdl", "#", "#", 2, "", "-268, -577, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 1, "", "0, -916, 2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 2, "", "0, 916, 2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 3, "", "-340, 1256, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 4, "", "-2172, 1256, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 5, "", "-2512, 916, 2.5", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 6, "", "-2512, -916, 2.5", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 7, "", "-2172, -1256, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 8, "", "-340, -1256, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 1, "", "0, -916, 2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 2, "", "0, 916, 2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 3, "", "-340, 1256, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 4, "", "-2172, 1256, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 5, "", "-2512, 916, 2.5", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 6, "", "-2512, -916, 2.5", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 7, "", "-2172, -1256, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 8, "", "-340, -1256, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 1, "", "0, -1492, 2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 2, "", "0, 1492, 2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 3, "", "-340, 1832, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 4, "", "-2172, 1832, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 5, "", "-2512, 1492, 2.5", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 6, "", "-2512, -1492, 2.5", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 7, "", "-2172, -1832, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 8, "", "-340, -1832, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/recreational/5_1club_lgbt.mdl", "#", "#", 1, "", "-268, 720, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/recreational/5_1club_lgbt.mdl", "#", "#", 2, "", "-268, -720, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/recreational/5_2stripclub.mdl", "#", "#", 1, "", "-268, 736, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/recreational/5_2stripclub.mdl", "#", "#", 2, "", "-268, -736, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_0office.mdl", "#", "#", 1, "", "-267.986, 616.053, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_0office.mdl", "#", "#", 2, "", "-268, -608, 2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_1garage.mdl", "#", "#", 1, "", "-268, 698, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_1garage.mdl", "#", "#", 2, "", "-268, -598, 2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_a.mdl", "#", "#", 1, "", "-268, 604, 2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_a.mdl", "#", "#", 2, "", "-268, -620, 2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_b.mdl", "#", "#", 1, "", "-268, 612, 2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_b.mdl", "#", "#", 2, "", "-268, -612, 2.498", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_3gunshop.mdl", "#", "#", 1, "", "-268, 504.001, 2.5", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_3gunshop.mdl", "#", "#", 2, "", "-268, -504, 2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_4bank.mdl", "#", "#", 1, "", "-268, 504, 1.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_4bank.mdl", "#", "#", 2, "", "-268, -504, 1.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_2pcshop.mdl", "#", "#", 1, "", "-268, 432, 2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/stores/4_2pcshop.mdl", "#", "#", 2, "", "-268, -432, 2.499", "0,-90,0"}) - asmlib.SettingsModelToName("SET",{1,4},{"ion_","_"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 1, "", "0,0,2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 2, "", "-340,340,2.501", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 3, "", "-680,0,2.5", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 4, "", "-340,-340,2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_12road_intersection_3w.mdl", "#", "#", 1, "", "0,0,2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_12road_intersection_3w.mdl", "#", "#", 2, "", "-340,340,2.501", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_12road_intersection_3w.mdl", "#", "#", 3, "", "-340,-340,2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_13road_intersection_2w.mdl", "#", "#", 1, "", "0,0,2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_13road_intersection_2w.mdl", "#", "#", 2, "", "-340,-340,2.5", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_14road_intersection_deadend.mdl", "#", "#", 1, "", "0,0,2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_16road_intersection_turn2_16.mdl", "#", "#", 1, "", "0,0,2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_16road_intersection_turn2_16.mdl", "#", "#", 2, "", "-1564,1564,2.501", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_15road_intersection_turn1.mdl", "#", "#", 1, "", "0,0,2.5", ""}) - asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_15road_intersection_turn1.mdl", "#", "#", 2, "", "-340,-340,2.5", "0,-90,0"}) - asmlib.DefaultType("StephenTechno's Buildings Double") - asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy","_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy1x1.mdl" , "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy1x1.mdl" , "#", "#", 2, "", "-72,0,316.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_2roadsdwhwy1x4.mdl" , "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_2roadsdwhwy1x4.mdl" , "#", "#", 2, "", "-288,0,316.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_3roadsdwhwy1x8.mdl" , "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_3roadsdwhwy1x8.mdl" , "#", "#", 2, "", "-576,0,316.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_4roadsdwhwy1x16.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_4roadsdwhwy1x16.mdl", "#", "#", 2, "", "-1152,0,316.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_5roadsdwhwy1x32.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_5roadsdwhwy1x32.mdl", "#", "#", 2, "", "-2304,0,316.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_6roadsdwhwy1x64.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_6roadsdwhwy1x64.mdl", "#", "#", 2, "", "-4608,0,316.03125", "0,180,0"}) - asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy","_","bridge","bridge_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_8roadsdwhwybridge1x4.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_8roadsdwhwybridge1x4.mdl", "#", "#", 2, "", "-288,0,60.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_9roadsdwhwybridge1x8.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_9roadsdwhwybridge1x8.mdl", "#", "#", 2, "", "-576,0,60.03125", "0,180,0"}) - asmlib.SettingsModelToName("SET",{1,4},{"sdwhwy","_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_10roadsdwhwybridge1x16.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_10roadsdwhwybridge1x16.mdl", "#", "#", 2, "", "-1152,0,60.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_11roadsdwhwybridge1x32.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_11roadsdwhwybridge1x32.mdl", "#", "#", 2, "", "-2304,0,60.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_12roadsdwhwybridge1x64.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_12roadsdwhwybridge1x64.mdl", "#", "#", 2, "", "-4608,0,60.03125", "0,180,0"}) - asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy_","_","turn1","turn"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_7roadsdwhwy_turn1.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_7roadsdwhwy_turn1.mdl", "#", "#", 2, "", "-1692,1692,316.03125", "0,90,0"}) - asmlib.SettingsModelToName("SET",{1,3}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_0roadsdwsidewalktransfer.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_0roadsdwsidewalktransfer.mdl", "#", "#", 2, "", "-376,0,3.03125", "0,-180,0"}) - asmlib.SettingsModelToName("SET",{1,4},{"sdw","_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 1, "", "0,0,2.498", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 2, "", "-540,540,2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 3, "", "-1080,0,2.499", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 4, "", "-540,-540,2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_12roadsdwsidewalk_int_3way.mdl", "#", "#", 1, "", "0,0,2.498", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_12roadsdwsidewalk_int_3way.mdl", "#", "#", 2, "", "-540,540,2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_12roadsdwsidewalk_int_3way.mdl", "#", "#", 3, "", "-540,-540,2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_13roadsdwsidewalk_int_2way.mdl", "#", "#", 1, "", "0,0,2.498", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_13roadsdwsidewalk_int_2way.mdl", "#", "#", 2, "", "-540,540,2.499", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_14roadsdwsidewalk_turn_1.mdl", "#", "#", 1, "", "0,-4,2.499", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_14roadsdwsidewalk_turn_1.mdl", "#", "#", 2, "", "-540,-544,2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_15roadsdwsidewalk_turn_2.mdl", "#", "#", 1, "", "0,0,2.497", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_15roadsdwsidewalk_turn_2.mdl", "#", "#", 2, "", "-1692,1692,2.498", "0,90,0"}) - asmlib.SettingsModelToName("SET",{1,3},{"sdw","_","walk","walk_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_1roadsdwsidewalk1x1.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_1roadsdwsidewalk1x1.mdl", "#", "#", 2, "", "-72,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_2roadsdwsidewalk1x2.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_2roadsdwsidewalk1x2.mdl", "#", "#", 2, "", "-144,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_3roadsdwsidewalk1x3.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_3roadsdwsidewalk1x3.mdl", "#", "#", 2, "", "-216,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_4roadsdwsidewalk1x4.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_4roadsdwsidewalk1x4.mdl", "#", "#", 2, "", "-288,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_5roadsdwsidewalk1x5.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_5roadsdwsidewalk1x5.mdl", "#", "#", 2, "", "-360,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_6roadsdwsidewalk1x6.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_6roadsdwsidewalk1x6.mdl", "#", "#", 2, "", "-432,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_7roadsdwsidewalk1x7.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_7roadsdwsidewalk1x7.mdl", "#", "#", 2, "", "-504,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_8roadsdwsidewalk1x8.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_8roadsdwsidewalk1x8.mdl", "#", "#", 2, "", "-576,0,3.03125", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_9roadsdwsidewalk1x16.mdl","#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_9roadsdwsidewalk1x16.mdl","#", "#", 2, "", "-1152,0,3.03125", "0,180,0"}) - asmlib.SettingsModelToName("SET",{1,4},{"sdw","_","walk","walk_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_10roadsdwsidewalk1x32.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_10roadsdwsidewalk1x32.mdl", "#", "#", 2, "", "-2304,0,3.03125", "0,180,0"}) - - asmlib.DefaultType("StephenTechno's Buildings Cross") - asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy_","_"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 1, "", "0, 0, 2.499", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 2, "", "-1632, 1152, 2.506", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 3, "", "-2304, 1152, 314.494", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 4, "", "-2976, 1152, 2.507", "0,90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 5, "", "-2976.007,-1151.975,2.506", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 6, "", "-2304,-1152,314.498", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 7, "", "-1632,-1152,2.499", "0,-90,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 8, "", "-4608,0,2.5", "0,180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 1, "", "0,-671.994,2.508", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 2, "", "0,0,314.499", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 3, "", "0,671.995,2.501", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 4, "", "-4608,0,314.499", "0,-180,0"}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 1, "", "0,-671.994,2.508", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 2, "", "0,0,314.499", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 3, "", "0,671.995,2.501", ""}) - asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 4, "", "-4160,0,15.202", "0,-180,0"}) - asmlib.DefaultType("Portal Tubes") - asmlib.InsertRecord({"models/props_bts/clear_tube_straight.mdl", "#", "#", 1, "", "0.009,0 , 63.896", "@-90, 0,180"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_straight.mdl", "#", "#", 2, "", "0.008,0.004,-63.897", "@ 90,180,180"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_90deg.mdl" , "#", "#", 1, "", "64.041,0.049, 0.131", ""}) - asmlib.InsertRecord({"models/props_bts/clear_tube_90deg.mdl" , "#", "#", 2, "", " 0.002,0.040,-63.904", "@90,0,180"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_broken.mdl", "#", "#", 1, "", "0.009,0 , 63.896", "@-90, 0,180"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_broken.mdl", "#", "#", 2, "", "0.008,0.004,-63.897", "@ 90,180,180"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_tjoint.mdl", "#", "#", 1, "", "-0.014,0.13,96.075", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_tjoint.mdl", "#", "#", 2, "", "-0.004,-95.763,0.016", "0,-90,-90"}) - asmlib.InsertRecord({"models/props_bts/clear_tube_tjoint.mdl", "#", "#", 3, "", "0,96,0.083", "0,90,90"}) - asmlib.DefaultType("Mr.Train's M-Gauge") - asmlib.SettingsModelToName("SET",nil,{"m_gauge","straight"},nil) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_32.mdl", "#", "#", 1, "", "16,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_32.mdl", "#", "#", 2, "", "-16,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_64.mdl", "#", "#", 1, "", "32,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_64.mdl", "#", "#", 2, "", "-32,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128.mdl", "#", "#", 1, "", "64,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128.mdl", "#", "#", 2, "", "-64,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_256.mdl", "#", "#", 1, "", "128,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_256.mdl", "#", "#", 2, "", "-128,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_512.mdl", "#", "#", 1, "", "256,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_512.mdl", "#", "#", 2, "", "-256,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_1024.mdl", "#", "#", 1, "", "512,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_1024.mdl", "#", "#", 2, "", "-512,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_2048.mdl", "#", "#", 1, "", "1024,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_2048.mdl", "#", "#", 2, "", "-1024,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_4096.mdl", "#", "#", 1, "", "2048,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_4096.mdl", "#", "#", 2, "", "-2048,0,0.016", "0,-180,0"}) - asmlib.SettingsModelToName("SET",nil,{"_cross","","m_gauge_","cross_"},nil) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 1, "", "64,0,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 2, "", "0,64,0.016", "0,90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 3, "", "-64,0,0.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 4, "", "0,-64,0.016", "0,-90,0"}) - asmlib.SettingsModelToName("SET",nil,{"m_gauge_",""},nil) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_256.mdl", "#", "#", 1, "", "134.497,121.499,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_256.mdl", "#", "#", 2, "", "-121.5,-134.5,0.016", "0,-90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512.mdl", "#", "#", 1, "", "262.5,249.5,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512.mdl", "#", "#", 2, "", "-249.5,-262.5,0.016", "0,-90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768.mdl", "#", "#", 1, "", "383.625,370.625,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768.mdl", "#", "#", 2, "", "-370.625,-383.625,0.016", "0,-90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024.mdl", "#", "#", 1, "", "518.5,505.5,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024.mdl", "#", "#", 2, "", "-505.5,-518.5,0.016", "0,-90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512_45.mdl", "#", "#", 1, "", "262.5,-249.497,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512_45.mdl", "#", "#", 2, "", "-99.51,-99.507,0.015", "0,135,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768_45.mdl", "#", "#", 1, "", "383.625,370.625,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768_45.mdl", "#", "#", 2, "", "-149.73,149.729,0.016", "0,-135,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024_45.mdl", "#", "#", 1, "", "518.5,505.5,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024_45.mdl", "#", "#", 2, "", "-205.608,205.607,0.014", "0,-135,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_256.mdl", "#", "#", 1, "", "134.5,-121.5,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_256.mdl", "#", "#", 2, "", "-121.5,134.5,0.016", "0,90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_512.mdl", "#", "#", 1, "", "262.5,-249.5,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_512.mdl", "#", "#", 2, "", "-249.5,262.5,0.016", "0,90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768.mdl", "#", "#", 1, "", "383.625,-370.625,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768.mdl", "#", "#", 2, "", "-370.625,383.625,0.016", "0,90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024.mdl", "#", "#", 1, "", "518.5,-505.5,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024.mdl", "#", "#", 2, "", "-505.5,518.5,0.016", "0,90,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768_45.mdl", "#", "#", 1, "", "383.625,-370.625,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768_45.mdl", "#", "#", 2, "", "-149.758,-149.751,0.012", "0,135,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024_45.mdl", "#", "#", 1, "", "518.5,-505.498,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024_45.mdl", "#", "#", 2, "", "-205.621,-205.618,0.014", "0,135,0"}) - asmlib.SettingsModelToName("SET",nil,{"m_gauge_","","over",""},nil) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 1, "", "203,-75,-2.484", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 2, "", "203,75,-2.484", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 3, "", "-203,75,-2.484", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 4, "", "-203,-75,-2.484", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 1, "", "75,-75,-2.484", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 2, "", "203,75,-2.484", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 3, "", "-75,75,-2.484", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 4, "", "-203,-75,-2.484", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 1, "", "203,-75,-2.484", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 2, "", "75,75,-2.484", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 3, "", "-203,75,-2.484", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 4, "", "-75,-75,-2.485", "0,180,0"}) - asmlib.SettingsModelToName("SET",nil,{"m_gauge_","","hand",""},nil) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_lefthand.mdl", "#", "#", 1, "", "0,-10,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_lefthand.mdl", "#", "#", 2, "", "-256,-10,0.016", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_lefthand.mdl", "#", "#", 3, "", "-384,-160,0.016", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_righthand.mdl", "#", "#", 1, "", "0,10,0.016", ""}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_righthand.mdl", "#", "#", 2, "", "-384,160,0.016", "0,180,0"}) - asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_righthand.mdl", "#", "#", 3, "", "-256,10,0.016", "0,180,0"}) - asmlib.DefaultType("Mr.Train's G-Gauge") - asmlib.SettingsModelToName("SET",nil,{"g_gauge_track_",""},nil) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_32.mdl" , "#", "#", 1, "", " 16,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_32.mdl" , "#", "#", 2, "", "-16,0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_1.mdl", "#", "#", 1, "", " 16,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_1.mdl", "#", "#", 2, "", "-16,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_2.mdl", "#", "#", 1, "", " 16,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_2.mdl", "#", "#", 2, "", "-16,0,4.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_3.mdl", "#", "#", 1, "", " 16,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_3.mdl", "#", "#", 2, "", "-16,0,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_64.mdl" , "#", "#", 1, "", " 32,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_64.mdl" , "#", "#", 2, "", "-32,0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_128.mdl" , "#", "#", 1, "", " 64,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_128.mdl" , "#", "#", 2, "", "-64,0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 1, "", " 64, 0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 2, "", " 0 , 64,1.516", "0,90,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 3, "", "-64, 0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 4, "", " 0 ,-64,1.516", "0,-90,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_256.mdl" , "#", "#", 1, "", " 128, 0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_256.mdl" , "#", "#", 2, "", "-128, 0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_512.mdl" , "#", "#", 1, "", " 256, 0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_512.mdl" , "#", "#", 2, "", "-256, 0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_1024.mdl", "#", "#", 1, "", " 512, 0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_1024.mdl", "#", "#", 2, "", "-512, 0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_2048.mdl", "#", "#", 1, "", " 1024,0,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_2048.mdl", "#", "#", 2, "", "-1024,0,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_right_22_5.mdl", "#", "#", 1, "", " 256,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_right_22_5.mdl", "#", "#", 2, "", "-256, 39,1.516" , "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_left_22_5.mdl" , "#", "#", 1, "", " 256, 39,1.516" , ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_left_22_5.mdl" , "#", "#", 2, "", "-256,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_1.mdl", "#", "#", 1, "", " 256,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_1.mdl", "#", "#", 2, "", " 0,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_1.mdl", "#", "#", 3, "", "-256, 39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_2.mdl", "#", "#", 1, "", " 256,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_2.mdl", "#", "#", 2, "", " 0,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_2.mdl", "#", "#", 3, "", "-256, 39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_1.mdl", "#", "#", 1, "", " 256,39 ,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_1.mdl", "#", "#", 2, "", " 0,39 ,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_1.mdl", "#", "#", 3, "", "-256,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_2.mdl", "#", "#", 1, "", " 256,39 ,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_2.mdl", "#", "#", 2, "", " 0,39 ,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_2.mdl", "#", "#", 3, "", "-256,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_22_5.mdl", "#", "#", 1, "", "263.75,-248.25,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_22_5.mdl", "#", "#", 2, "", "67.872,-209.299,1.516", "0,157.5,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_45.mdl" , "#", "#", 1, "", "263.75,-248.25,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_45.mdl" , "#", "#", 2, "", "-98.302,-98.302,1.516", "0,135,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_90.mdl" , "#", "#", 1, "", "263.75,-248.25,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_90.mdl" , "#", "#", 2, "", "-248.25,263.75,1.516", "0,90,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_22_5.mdl" , "#", "#", 1, "", "263.75, 248.25,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_22_5.mdl" , "#", "#", 2, "", "67.855,209.265,1.516", "0,-157.5,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_45.mdl" , "#", "#", 1, "", "263.75, 248.25,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_45.mdl" , "#", "#", 2, "", "-98.326,98.323,1.516", "0,-135,0"}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_90.mdl" , "#", "#", 1, "", "263.75, 248.25,1.516", ""}) - asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_90.mdl" , "#", "#", 2, "", "-248.25,-263.75,1.516", "0,-90,0"}) - asmlib.DefaultType("Bobster's two feet rails") - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_16.mdl", "#", "#", 1, "0,-32,1.5", "8,0,3.017", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_16.mdl", "#", "#", 2, "0,32,1.5", "-8,0,3.017", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_32.mdl", "#", "#", 1, "0,-32,1.5", "16,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_32.mdl", "#", "#", 2, "0,32,1.5", "-16,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_64.mdl", "#", "#", 1, "", "32,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_64.mdl", "#", "#", 2, "", "-32,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_128.mdl", "#", "#", 1, "", "64,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_128.mdl", "#", "#", 2, "", "-64,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_left.mdl", "#", "#", 1, "", " 128,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_left.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_right.mdl", "#", "#", 1, "", " 128,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_right.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_256.mdl", "#", "#", 1, "", "128,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_256.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_512.mdl", "#", "#", 1, "", "256,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_512.mdl", "#", "#", 2, "", "-256,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_1024.mdl", "#", "#", 1, "", "512,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_1024.mdl", "#", "#", 2, "", "-512,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_2048.mdl", "#", "#", 1, "", " 1024,0,3.017", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_2048.mdl", "#", "#", 2, "", "-1024,0,3.017", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_4096.mdl", "#", "#", 1, "", " 2048,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_4096.mdl", "#", "#", 2, "", "-2048,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_16.mdl", "#", "#", 1, "0,-32,1.5", "8,0,3.017", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_16.mdl", "#", "#", 2, "0,32,1.5", "-8,0,3.017", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_32.mdl", "#", "#", 1, "0,-32,1.5", "16,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_32.mdl", "#", "#", 2, "0,32,1.5", "-16,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_64.mdl", "#", "#", 1, "", "32,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_64.mdl", "#", "#", 2, "", "-32,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_128.mdl", "#", "#", 1, "", "64,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_128.mdl", "#", "#", 2, "", "-64,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_256.mdl", "#", "#", 1, "", "128,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_256.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_512.mdl", "#", "#", 1, "", "256,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_512.mdl", "#", "#", 2, "", "-256,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_1024.mdl", "#", "#", 1, "", "512,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_1024.mdl", "#", "#", 2, "", "-512,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_512.mdl", "#", "#", 2, "", "124.736,-24.811,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_512.mdl", "#", "#", 2, "", "124.735,24.812,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_1024.mdl", "#", "#", 2, "", "249.471,-49.623,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_1024.mdl", "#", "#", 2, "", "249.471,49.621,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_2048.mdl", "#", "#", 2, "", "498.945,-99.237,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_2048.mdl", "#", "#", 2, "", "498.941,99.246,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_512.mdl", "#", "#", 2, "", "230.481,95.468,3.016", "0,45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_512.mdl", "#", "#", 2, "", "230.481,-95.469,3.016", "0,-45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_1024.mdl", "#", "#", 2, "", "460.963,-190.936,3.016", "0,-45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_1024.mdl", "#", "#", 2, "", "460.962,190.936,3.016", "0,45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_512.mdl", "#", "#", 2, "", "325.949,-325.949,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_512.mdl", "#", "#", 2, "", "325.949,325.95,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_1024.mdl", "#", "#", 2, "", "651.898,-651.899,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_1024.mdl", "#", "#", 2, "", "651.898,651.898,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_2048.mdl", "#", "#", 2, "", "1303.797,-1303.797,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_2048.mdl", "#", "#", 2, "", "1303.797,1303.797,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_2048.mdl", "#", "#", 2, "", "921.925,-381.872,3.016", "0,-45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_2048.mdl", "#", "#", 2, "", "921.925,381.872,3.016", "0,45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_512.mdl" , "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_512.mdl" , "#", "#", 2, "", "325.949,-325.949,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_1024.mdl", "#", "#", 2, "", "651.926,-651.874,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_2048.mdl", "#", "#", 2, "", "1303.798,-1303.797,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_512.mdl" , "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_512.mdl" , "#", "#", 2, "", "325.949,325.949,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_1024.mdl", "#", "#", 2, "", "651.899,651.898,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_2048.mdl", "#", "#", 2, "", "1303.797,1303.797,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 1, "", "83,0,3.015", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 2, "", "0.003,83,3.015", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 3, "", "-83,0.003,3.015", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 4, "", "0,-83,3.015", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_switched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_switched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_switched.mdl", "#", "#", 3, "", "262.471,49.622,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_unswitched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_unswitched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_unswitched.mdl", "#", "#", 3, "", "262.471,49.622,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_switched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_switched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_switched.mdl", "#", "#", 3, "", "262.472,-49.622,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_unswitched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_unswitched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_unswitched.mdl", "#", "#", 3, "", "262.472,-49.622,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_512.mdl", "#", "#", 2, "", "124.736,-24.811,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_512.mdl", "#", "#", 2, "", "124.735,24.812,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_1024.mdl", "#", "#", 2, "", "249.471,-49.623,3.016", "0,-22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_1024.mdl", "#", "#", 2, "", "249.471,49.621,3.016", "0,22.5,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_512.mdl", "#", "#", 2, "", "230.481,95.468,3.016", "0,45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_512.mdl", "#", "#", 2, "", "230.481,-95.469,3.016", "0,-45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_1024.mdl", "#", "#", 2, "", "460.963,-190.936,3.016", "0,-45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_1024.mdl", "#", "#", 2, "", "460.962,190.936,3.016", "0,45,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_512.mdl", "#", "#", 2, "", "325.949,-325.949,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_512.mdl", "#", "#", 2, "", "325.949,325.95,3.016", "0,90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_1024.mdl", "#", "#", 2, "", "651.898,-651.899,3.016", "0,-90,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) - asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_1024.mdl", "#", "#", 2, "", "651.898,651.898,3.016", "0,90,0"}) - asmlib.DefaultType("Ron's 2ft track pack") - asmlib.InsertRecord({"models/ron/2ft/straight/straight_32.mdl" , "#", "#", 1, "", " 16 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_32.mdl" , "#", "#", 2, "", "-16 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_64.mdl" , "#", "#", 1, "", " 32 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_64.mdl" , "#", "#", 2, "", "-32 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_128.mdl" , "#", "#", 1, "", " 64 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_128.mdl" , "#", "#", 2, "", "-64 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_256.mdl" , "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_256.mdl" , "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/rerailer.mdl" , "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/misc/rerailer.mdl" , "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_512.mdl" , "#", "#", 1, "", " 256,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_512.mdl" , "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_1.mdl", "#", "#", 2, "", "-391.846,-77.978,6.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_2.mdl", "#", "#", 2, "", "-439.352,-87.36,6.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_3.mdl", "#", "#", 2, "", "-486.814,-96.707,6.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_4.mdl", "#", "#", 2, "", "-534.192,-106.258,6.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_1.mdl", "#", "#", 2, "", "-391.846,77.978,6.016", "0,157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_2.mdl", "#", "#", 2, "", "-439.352,87.36,6.016", "0,157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_3.mdl", "#", "#", 2, "", "-486.814,96.707,6.016", "0,157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_4.mdl", "#", "#", 2, "", "-534.192,106.258,6.016", "0,157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_1.mdl", "#", "#", 2, "", "-724.122,-299.876,6.016", "0,-135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_2.mdl", "#", "#", 2, "", "-811.77,-336.23,6.016", "0,-135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_3.mdl", "#", "#", 2, "", "-899.503,-372.497,6.016", "0,-135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_4.mdl", "#", "#", 2, "", "-987.115,-408.885,6.016", "0,-135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_1.mdl", "#", "#", 2, "", "-724.122,299.876,6.016", "0,135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_2.mdl", "#", "#", 2, "", "-811.77,336.23,6.016", "0,135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_3.mdl", "#", "#", 2, "", "-899.503,372.497,6.016", "0,135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_4.mdl", "#", "#", 2, "", "-987.115,408.885,6.016", "0,135,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_1.mdl", "#", "#", 2, "", "-1024,-1024,6.016", "0,-90,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_2.mdl", "#", "#", 2, "", "-1148,-1148,6.016", "0,-90,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_3.mdl", "#", "#", 2, "", "-1272,-1272,6.016", "0,-90,0"}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_4.mdl", "#", "#", 2, "", "-1396,-1396,6.016", "0,-90,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/left_switched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/junctions/left_switched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/left_switched_1.mdl", "#", "#", 3, "", "-391.842,-77.994,6.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/left_unswitched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/junctions/left_unswitched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/left_unswitched_1.mdl", "#", "#", 3, "", "-391.842,-77.994,6.016", "0,-157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/right_switched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/junctions/right_switched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/right_switched_1.mdl", "#", "#", 3, "", "-391.842,77.994,6.016", "0,157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/right_unswitched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/junctions/right_unswitched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/junctions/right_unswitched_1.mdl", "#", "#", 3, "", "-391.842,77.994,6.016", "0,157.5,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 1, "", " 0 , 62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 4, "", "-320,-62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 1, "", " 0 , 62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 4, "", "-320,-62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 1, "", " 0 ,-62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 4, "", "-320, 62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 1, "", " 0 ,-62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 4, "", "-320, 62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_switched.mdl" , "#", "#", 1, "", "0 , 62,6.016", "0,0,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_switched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_switched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_unswitched.mdl" , "#", "#", 1, "", "0 , 62,6.016", "0,0,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_unswitched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_unswitched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_switched.mdl" , "#", "#", 1, "", "0 ,-62,6.016", "0,0,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_switched.mdl" , "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_switched.mdl" , "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_unswitched.mdl", "#", "#", 1, "", "0 ,-62,6.016", "0,0,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_unswitched.mdl", "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_unswitched.mdl", "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/buffer.mdl", "#", "#", 1, "", "64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_end.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_end.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_128.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_128.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_256.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_256.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_512.mdl", "#", "#", 1, "", " 256,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_512.mdl", "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512.mdl", "#", "#", 1, "", " 256,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512.mdl", "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/passenger_crossing.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/misc/passenger_crossing.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/shed_open_both.mdl" , "#", "#", 1, "", "-128,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/shed_open_left.mdl" , "#", "#", 1, "", "-128,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/shed_open_right.mdl", "#", "#", 1, "", "-128,0,3.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 1, "", " 64, 0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 2, "", " 0, 64,5.016", "0,90,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 3, "", "-64, 0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 4, "", " 0,-64,5.016", "0,-90,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_1.mdl" , "#", "#", 2, "", " -32,0, 8.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_1.mdl" , "#", "#", 2, "", " -64,0,10.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_1.mdl" , "#", "#", 2, "", " -128,0,14.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_1.mdl" , "#", "#", 2, "", " -256,0,22.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_1.mdl" , "#", "#", 2, "", " -512,0,38.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_1.mdl", "#", "#", 1, "", " 0,0, 6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_1.mdl", "#", "#", 2, "", "-1024,0,70.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_1.mdl", "#", "#", 1, "", " 0,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_1.mdl", "#", "#", 2, "", "-64,0,8.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_1.mdl" , "#", "#", 1, "", " 64,0,2.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_1.mdl" , "#", "#", 2, "", " 0,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 1, "", " 16,-62,5.016", "0,0,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 2, "", " 16, 62,5.016", "0,0,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 3, "", "-16, 62,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 4, "", "-16,-62,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 1, "", " 0,-62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 2, "", " 0, 62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 4, "", "-704,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 1, "", " 0,-62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 2, "", " 0, 62,6.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 4, "", "-704,-62,6.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_32.mdl" , "#", "#", 1, "", " 16 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_32.mdl" , "#", "#", 2, "", "-16 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_64.mdl" , "#", "#", 1, "", " 32 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_64.mdl" , "#", "#", 2, "", "-32 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_128.mdl" , "#", "#", 1, "", " 64 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_128.mdl" , "#", "#", 2, "", "-64 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_bridge.mdl" , "#", "#", 1, "", " 64 ,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_bridge.mdl" , "#", "#", 2, "", "-64 ,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_256.mdl" , "#", "#", 1, "", " 128,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_256.mdl" , "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_512.mdl" , "#", "#", 1, "", " 256,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_512.mdl" , "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) - asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/buffer_2.mdl","#","Buffer SH2",1,"","32,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/misc/buffer_2.mdl","#","Buffer SH2",2,"","-32,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",1,"","512,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",2,"","512,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",3,"","-512,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",4,"","-512,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",1,"","512,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",2,"","512,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",3,"","-512,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",4,"","-512,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof.mdl","#","#",1,"","512,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof.mdl","#","#",2,"","-512,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof.mdl","#","#",1,"","64,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench.mdl","#","#",1,"","64,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof.mdl","#","#",1,"","64,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",1,"","128,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",2,"","128,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",1,"","128,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",2,"","128,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof.mdl","#","#",1,"","128,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",1,"","256,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",2,"","256,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",3,"","-256,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",4,"","-256,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",1,"","256,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",2,"","256,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",3,"","-256,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",4,"","-256,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof.mdl","#","#",1,"","256,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof.mdl","#","#",2,"","-256,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",1,"","128,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",2,"","128,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",1,"","128,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",2,"","128,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof.mdl","#","#",1,"","128,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof.mdl","#","#",1,"","64,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",1,"","128,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",2,"","128,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",1,"","128,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",2,"","128,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof.mdl","#","#",1,"","128,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof.mdl","#","#",1,"","64,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_middle.mdl","#","#",1,"","128,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_middle.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_side.mdl","#","#",1,"","128,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_side.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing.mdl","#","#",1,"","128,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/shed.mdl","#","#",1,"","-128,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-1024,0,70.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 1024 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 1024 Embankment Sided Mirrored 1",2,"","-1024,0,70.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-128,0,14.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 128 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 128 Embankment Sided Mirrored 1",2,"","-128,0,14.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-256,0,22.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 256 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 256 Embankment Sided Mirrored 1",2,"","-256,0,22.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-32,0,8.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 32 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 32 Embankment Sided Mirrored 1",2,"","-32,0,8.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-512,0,38.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 512 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 512 Embankment Sided Mirrored 1",2,"","-512,0,38.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-64,0,10.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 64 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 64 Embankment Sided Mirrored 1",2,"","-64,0,10.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","64,0,3.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","0,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp End Embankment Sided Mirrored 1",1,"","64,0,3.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp End Embankment Sided Mirrored 1",2,"","0,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-64,0,9.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp Start Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp Start Embankment Sided Mirrored 1",2,"","-64,0,9.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/misc/track_damaged.mdl","Ron's 2ft track pack","#",1,""," 64,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/misc/track_damaged.mdl","Ron's 2ft track pack","#",2,"","-64,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_1024.mdl","Ron's 2ft track pack","#",1,""," 512,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_1024.mdl","Ron's 2ft track pack","#",2,"","-512,0,6.016","0,-180,0"}) - asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_512.mdl","Ron's 2ft track pack","#",1,""," 256,0,6.016",""}) - asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_512.mdl","Ron's 2ft track pack","#",2,"","-256,0,6.016","0,-180,0"}) - asmlib.DefaultType("PHX Tubes Miscellaneous") --- Tubes Metal --- - asmlib.InsertRecord({"models/props_phx/construct/metal_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve2x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve2x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180x2.mdl", "#", "#", 1, "", "0.02,0,95.081", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - --- Tubes Glass --- - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - --- Tubes Wireframe --- - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - --- Tubes Wireframe Glass --- - asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - --- Tubes Wood --- - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x1.mdl", "#", "#", 1, "", "0.02,0,47.541", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x1.mdl", "#", "#", 2, "", "0.02,0, 0.095", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x2.mdl", "#", "#", 1, "", "0.02,0,95.083", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x2.mdl", "#", "#", 2, "", "0.02,0, 0.183", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x2.mdl", "#", "#", 1, "", "0.02,0,95.081", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - --- Tubes Wireframe Wood --- - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) - asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) - asmlib.DefaultType("PHX Tubes Plastic") - asmlib.InsertRecord({"models/hunter/misc/platehole1x1a.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1a.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1c.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1c.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1d.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole1x1d.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1.mdl" , "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1b.mdl", "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1c.mdl", "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1d.mdl", "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2.mdl" , "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2b.mdl", "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2c.mdl", "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2d.mdl", "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3.mdl" , "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3b.mdl", "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3c.mdl", "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3d.mdl", "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4.mdl" , "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4b.mdl", "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4c.mdl", "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4d.mdl", "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5.mdl" , "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5b.mdl", "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5c.mdl", "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5d.mdl", "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6.mdl" , "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6b.mdl", "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6c.mdl", "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6d.mdl", "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8b.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8c.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8d.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x1x90.mdl", "#", "#", 1, "", "0,0,0", "@90,-180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x1x90.mdl", "#", "#", 2, "", "0,23.725,23.725", " 0, 90, 90"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2c.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2c.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2d.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle2x2d.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole1x1.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole1x1.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole1x2.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole1x2.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole2x2.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole2x2.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole3.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/plates/platehole3.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2a.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2b.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2c.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2d.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2e.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2x45.mdl", "#", "#", 1, "0, -47.45, 0", "", ""}) - asmlib.InsertRecord({"models/hunter/misc/shell2x2x45.mdl", "#", "#", 2, "-33.552, -33.552, 0", "", "0,135,0"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025.mdl" , "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025.mdl" , "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025b.mdl", "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025b.mdl", "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025c.mdl", "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025c.mdl", "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025d.mdl", "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025d.mdl", "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05b.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05b.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05c.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05c.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05d.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05d.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1.mdl" , "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1.mdl" , "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1b.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1b.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1c.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1c.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1d.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1d.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2.mdl" , "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2.mdl" , "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2b.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2b.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2c.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2c.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2d.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2d.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4.mdl" , "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4.mdl" , "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4b.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4b.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4c.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4c.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4d.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4d.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8.mdl" , "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8.mdl" , "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8b.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8b.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8c.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8c.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8d.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8d.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x16d.mdl", "#", "#", 1, "", "0,0,711.75", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x16d.mdl", "#", "#", 2, "", "0,0,-47.45", "@ 90,-180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 1, "", "0,0,47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 2, "", "0,-47.45,0", "0,-90,-90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 3, "", "0,0,-47.45", "@ 90,0,0"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 4, "", "0,47.45,0" , "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xt.mdl", "#", "#", 1, "", "0,0,-47.45", "@ 90,0,0"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xt.mdl", "#", "#", 2, "", "0,-47.45,0", "0,-90,-90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xt.mdl", "#", "#", 3, "", "0,47.45,0" , "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xta.mdl", "#", "#", 1, "", "0,0,-23.725", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xta.mdl", "#", "#", 2, "", "0,47.45,23.725", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xta.mdl", "#", "#", 3, "", "0,-47.45,23.725", "0,-90,-90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xtb.mdl", "#", "#", 1, "", "0,-23.725,0", "0,-90,-90"}) - asmlib.InsertRecord({"models/hunter/tubes/tube2x2xtb.mdl", "#", "#", 2, "", "0,23.725,-47.45", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90a.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90a.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90outer.mdl", "#", "#", 1, "", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90outer.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90square.mdl", "#", "#", 1, "", "0,0,-47.451", "@90,-180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90square.mdl", "#", "#", 2, "", "0,47.417,0", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90b.mdl", "#", "#", 1, "", "-47.45,0,47.45", "0,-180,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90b.mdl", "#", "#", 2, "", "", "@90,-90,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare.mdl", "#", "#", 1, "", "0,0,23.725", "@-90,90,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare.mdl", "#", "#", 2, "", "-47.45,0,-23.724", "0,-180,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare2.mdl", "#", "#", 1, "", "0,0,23.725", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare2.mdl", "#", "#", 2, "", "0,-47.45,-23.724", "0,-90,-90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare.mdl", "#", "#", 1, "0,0,47.45", "", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare.mdl", "#", "#", 2, "0,-47.45,0", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare2.mdl", "#", "#", 1, "0,0,47.45", "", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare2.mdl", "#", "#", 2, "0,-47.45,0", "", "@90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4c.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4c.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4d.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/circle4x4d.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4c.mdl", "#", "#", 1, "", "47.45,0, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4c.mdl", "#", "#", 2, "", "47.45,0,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4d.mdl", "#", "#", 1, "", "47.45,47.45, 1.5", "@-90, 0,180"}) - asmlib.InsertRecord({"models/hunter/misc/platehole4x4d.mdl", "#", "#", 2, "", "47.45,47.45,-1.5", "@ 90,180,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1to2x2.mdl", "#", "#", 1, "", "" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1to2x2.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025b.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025b.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025c.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025c.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025d.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025d.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05b.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05b.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05c.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05c.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05d.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05d.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1.mdl" , "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1.mdl" , "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1b.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1b.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1c.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1c.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1d.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1d.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2.mdl" , "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2.mdl" , "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2b.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2b.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2c.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2c.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2d.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2d.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3.mdl" , "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3.mdl" , "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3b.mdl", "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3b.mdl", "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3c.mdl", "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3c.mdl", "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3d.mdl", "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3d.mdl", "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4.mdl" , "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4.mdl" , "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4b.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4b.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4c.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4c.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4d.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4d.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5.mdl" , "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5.mdl" , "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5b.mdl", "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5b.mdl", "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5c.mdl", "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5c.mdl", "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5d.mdl", "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5d.mdl", "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6.mdl" , "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6.mdl" , "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6b.mdl", "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6b.mdl", "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6c.mdl", "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6c.mdl", "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6d.mdl", "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6d.mdl", "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8.mdl" , "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8.mdl" , "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8b.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8b.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8c.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8c.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8d.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8d.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16.mdl" , "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16.mdl" , "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16b.mdl", "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16b.mdl", "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16c.mdl", "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16c.mdl", "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16d.mdl", "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) - asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16d.mdl", "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend4x4x90.mdl", "#", "#", 1, "", "0,94.9,0", "0,90,90"}) - asmlib.InsertRecord({"models/hunter/tubes/tubebend4x4x90.mdl", "#", "#", 2, "", "0,0,-94.9", "@90,-180,180"}) -end - -if(file.Exists(gsFullDSV.."PHYSPROPERTIES.txt", "DATA")) then - asmlib.LogInstance(gsToolNameU..": DB PHYSPROPERTIES from DSV") - asmlib.ImportDSV("PHYSPROPERTIES","\t",true) -else --- Valve's physical properties: https://developer.valvesoftware.com/wiki/Material_surface_properties - asmlib.LogInstance(gsToolNameU..": DB PHYSPROPERTIES from LUA") - asmlib.DefaultTable("PHYSPROPERTIES") - asmlib.DefaultType("Special") - asmlib.InsertRecord({"#", 1 , "default" }) - asmlib.InsertRecord({"#", 2 , "default_silent" }) - asmlib.InsertRecord({"#", 3 , "floatingstandable" }) - asmlib.InsertRecord({"#", 4 , "item" }) - asmlib.InsertRecord({"#", 5 , "ladder" }) - asmlib.InsertRecord({"#", 6 , "no_decal" }) - asmlib.InsertRecord({"#", 7 , "player" }) - asmlib.InsertRecord({"#", 8 , "player_control_clip" }) - asmlib.DefaultType("Concrete") - asmlib.InsertRecord({"#", 1 , "brick" }) - asmlib.InsertRecord({"#", 2 , "concrete" }) - asmlib.InsertRecord({"#", 3 , "concrete_block" }) - asmlib.InsertRecord({"#", 4 , "gravel" }) - asmlib.InsertRecord({"#", 5 , "rock" }) - asmlib.DefaultType("Metal") - asmlib.InsertRecord({"#", 1 , "canister" }) - asmlib.InsertRecord({"#", 2 , "chain" }) - asmlib.InsertRecord({"#", 3 , "chainlink" }) - asmlib.InsertRecord({"#", 4 , "combine_metal" }) - asmlib.InsertRecord({"#", 5 , "crowbar" }) - asmlib.InsertRecord({"#", 6 , "floating_metal_barrel" }) - asmlib.InsertRecord({"#", 7 , "grenade" }) - asmlib.InsertRecord({"#", 8 , "gunship" }) - asmlib.InsertRecord({"#", 9 , "metal" }) - asmlib.InsertRecord({"#", 10, "metal_barrel" }) - asmlib.InsertRecord({"#", 11, "metal_bouncy" }) - asmlib.InsertRecord({"#", 12, "Metal_Box" }) - asmlib.InsertRecord({"#", 13, "metal_seafloorcar" }) - asmlib.InsertRecord({"#", 14, "metalgrate" }) - asmlib.InsertRecord({"#", 15, "metalpanel" }) - asmlib.InsertRecord({"#", 16, "metalvent" }) - asmlib.InsertRecord({"#", 17, "metalvehicle" }) - asmlib.InsertRecord({"#", 18, "paintcan" }) - asmlib.InsertRecord({"#", 19, "popcan" }) - asmlib.InsertRecord({"#", 20, "roller" }) - asmlib.InsertRecord({"#", 21, "slipperymetal" }) - asmlib.InsertRecord({"#", 22, "solidmetal" }) - asmlib.InsertRecord({"#", 23, "strider" }) - asmlib.InsertRecord({"#", 24, "weapon" }) - asmlib.DefaultType("Wood") - asmlib.InsertRecord({"#", 1 , "wood" }) - asmlib.InsertRecord({"#", 2 , "Wood_Box" }) - asmlib.InsertRecord({"#", 3 , "Wood_Furniture"}) - asmlib.InsertRecord({"#", 4 , "Wood_Plank" }) - asmlib.InsertRecord({"#", 5 , "Wood_Panel" }) - asmlib.InsertRecord({"#", 6 , "Wood_Solid" }) - asmlib.DefaultType("Terrain") - asmlib.InsertRecord({"#", 1 , "dirt" }) - asmlib.InsertRecord({"#", 2 , "grass" }) - asmlib.InsertRecord({"#", 3 , "gravel" }) - asmlib.InsertRecord({"#", 4 , "mud" }) - asmlib.InsertRecord({"#", 5 , "quicksand" }) - asmlib.InsertRecord({"#", 6 , "sand" }) - asmlib.InsertRecord({"#", 7 , "slipperyslime" }) - asmlib.InsertRecord({"#", 8 , "antlionsand" }) - asmlib.DefaultType("Liquid") - asmlib.InsertRecord({"#", 1 , "slime" }) - asmlib.InsertRecord({"#", 2 , "water" }) - asmlib.InsertRecord({"#", 3 , "wade" }) - asmlib.DefaultType("Frozen") - asmlib.InsertRecord({"#", 1 , "snow" }) - asmlib.InsertRecord({"#", 2 , "ice" }) - asmlib.InsertRecord({"#", 3 , "gmod_ice" }) - asmlib.DefaultType("Miscellaneous") - asmlib.InsertRecord({"#", 1 , "carpet" }) - asmlib.InsertRecord({"#", 2 , "ceiling_tile" }) - asmlib.InsertRecord({"#", 3 , "computer" }) - asmlib.InsertRecord({"#", 4 , "pottery" }) - asmlib.DefaultType("Organic") - asmlib.InsertRecord({"#", 1 , "alienflesh" }) - asmlib.InsertRecord({"#", 2 , "antlion" }) - asmlib.InsertRecord({"#", 3 , "armorflesh" }) - asmlib.InsertRecord({"#", 4 , "bloodyflesh" }) - asmlib.InsertRecord({"#", 5 , "flesh" }) - asmlib.InsertRecord({"#", 6 , "foliage" }) - asmlib.InsertRecord({"#", 7 , "watermelon" }) - asmlib.InsertRecord({"#", 8 , "zombieflesh" }) - asmlib.DefaultType("Manufactured") - asmlib.InsertRecord({"#", 1 , "jeeptire" }) - asmlib.InsertRecord({"#", 2 , "jalopytire" }) - asmlib.InsertRecord({"#", 3 , "rubber" }) - asmlib.InsertRecord({"#", 4 , "rubbertire" }) - asmlib.InsertRecord({"#", 5 , "slidingrubbertire" }) - asmlib.InsertRecord({"#", 6 , "slidingrubbertire_front" }) - asmlib.InsertRecord({"#", 7 , "slidingrubbertire_rear" }) - asmlib.InsertRecord({"#", 8 , "brakingrubbertire" }) - asmlib.InsertRecord({"#", 9 , "tile" }) - asmlib.InsertRecord({"#", 10, "paper" }) - asmlib.InsertRecord({"#", 11, "papercup" }) - asmlib.InsertRecord({"#", 12, "cardboard" }) - asmlib.InsertRecord({"#", 13, "plaster" }) - asmlib.InsertRecord({"#", 14, "plastic_barrel" }) - asmlib.InsertRecord({"#", 15, "plastic_barrel_buoyant" }) - asmlib.InsertRecord({"#", 16, "Plastic_Box" }) - asmlib.InsertRecord({"#", 17, "plastic" }) - asmlib.InsertRecord({"#", 18, "glass" }) - asmlib.InsertRecord({"#", 19, "glassbottle" }) - asmlib.InsertRecord({"#", 20, "combine_glass" }) -end - -if(file.Exists(gsFullDSV.."ADDITIONS.txt", "DATA")) then - asmlib.LogInstance(gsToolNameU..": DB ADDITIONS from DSV") - asmlib.ImportDSV("ADDITIONS","\t",true) -else - asmlib.LogInstance(gsToolNameU..": DB ADDITIONS from LUA") - asmlib.DefaultTable("ADDITIONS") - --- Shinji's Switchers --- - asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl","models/shinji85/train/sw_lever.mdl" ,"buttonswitch",1,"-100,125,0","",-1,-1,-1,-1,-1,-1}) - asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl","models/shinji85/train/rail_r_switcher1.mdl","prop_dynamic",2,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,1,1,SOLID_VPHYSICS}) - asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl","models/shinji85/train/rail_r_switcher2.mdl","prop_dynamic",3,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,-1,-1,SOLID_NONE}) - asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl","models/shinji85/train/sw_lever.mdl" ,"buttonswitch",1,"-100,-125,0","0,180,0",-1,-1,-1,-1,-1,-1}) - asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl","models/shinji85/train/rail_l_switcher1.mdl","prop_dynamic",2,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,1,1,SOLID_VPHYSICS}) - asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl","models/shinji85/train/rail_l_switcher2.mdl","prop_dynamic",3,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,-1,-1,SOLID_NONE}) -end - --------- CACHE PANEL STUFF --------- -asmlib.CacheQueryPanel() -asmlib.CacheQueryProperty() -asmlib.PrintInstance("Ver."..asmlib.GetOpVar("TOOL_VERSION")) -collectgarbage() +------ INCLUDE LIBRARY ------ +if(SERVER) then + AddCSLuaFile("trackassembly/trackasmlib.lua") +end +include("trackassembly/trackasmlib.lua") + +------ LOCALIZNG FUNCTIONS --- +local tonumber = tonumber +local tostring = tostring +local Vector = Vector +local Angle = Angle +local IsValid = IsValid +local bitBor = bit and bit.bor +local mathFloor = math and math.floor +local vguiCreate = vgui and vgui.Create +local fileExists = file and file.Exists +local stringFind = string and string.find +local stringGsub = string and string.gsub +local stringExplode = string and string.Explode +local surfaceScreenWidth = surface and surface.ScreenWidth +local surfaceScreenHeight = surface and surface.ScreenHeight +local duplicatorStoreEntityModifier = duplicator and duplicator.StoreEntityModifier + +------ MODULE POINTER ------- +local asmlib = trackasmlib + +------ CONFIGURE ASMLIB ------ +asmlib.InitAssembly("track","assembly") +asmlib.SetOpVar("TOOL_VERSION","5.237") +asmlib.SetLogControl(0,"") +asmlib.SetIndexes("V",1,2,3) +asmlib.SetIndexes("A",1,2,3) +asmlib.SetIndexes("S",4,5,6,7) +asmlib.SetOpVar("LOG_ONLY",nil) +asmlib.SetOpVar("LOG_SKIP",{"QuickSort","ModelToName","GetEntitySpawn: Not hitting active point","CacheQueryPiece: Record not located", "GetEntitySpawn: Trace model missing"}) + +------ CONFIGURE REPLICATED CVARS ----- Server tells the client what value to use +asmlib.MakeCoVar("maxactrad", "150", {1,500} ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Maximum active radius to search for a point ID") +asmlib.MakeCoVar("enwiremod", "1" , {0, 1 } ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Toggle the wire extension on/off server side") +asmlib.MakeCoVar("devmode" , "0" , {0, 1 } ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Toggle developer mode on/off server side") +asmlib.MakeCoVar("maxstcnt" , "200", {1,200} ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Maximum pieces to spawn in stack mode") +if(SERVER) then + asmlib.MakeCoVar("bnderrmod", "LOG", nil ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Unreasonable position error handling mode") + asmlib.MakeCoVar("maxfruse" , "50" , {1,100} ,bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_REPLICATED, FCVAR_PRINTABLEONLY), "Maximum frequent pieces to be listed") +end +------ CONFIGURE NON-REPLICATED CVARS ----- Client's got a mind of its own +asmlib.MakeCoVar("modedb" , "SQL", nil, bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_PRINTABLEONLY), "Database operating mode") +asmlib.MakeCoVar("enqstore" , 1 , nil, bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_PRINTABLEONLY), "Enable cache for built queries") +asmlib.MakeCoVar("timermode", "CQT@1800@1@1/CQT@900@1@1/CQT@600@1@1", nil, bitBor(FCVAR_ARCHIVE, FCVAR_ARCHIVE_XBOX, FCVAR_NOTIFY, FCVAR_PRINTABLEONLY), "Memory management setting when DB mode is SQL") + +------ CONFIGURE MODES ----- +asmlib.SetOpVar("MODE_DATABASE" , asmlib.GetCoVar("modedb","STR")) +asmlib.SetOpVar("EN_QUERY_STORE",(asmlib.GetCoVar("enqstore","INT") ~= 0) and true or false) + +------ GLOBAL VARIABLES ------ +local gsToolNameU = asmlib.GetOpVar("TOOLNAME_NU") +local gsFullDSV = asmlib.GetOpVar("DIRPATH_BAS")..asmlib.GetOpVar("DIRPATH_DSV").. + asmlib.GetInstPref()..asmlib.GetOpVar("TOOLNAME_PU") +local gaTimerSet = stringExplode(asmlib.GetOpVar("OPSYM_DIRECTORY"),asmlib.GetCoVar("timermode","STR")) + +-------- ACTIONS ---------- + +if(SERVER) then + asmlib.SetAction("DUPE_PHYS_SETTINGS", + function(oPly,oEnt,tData) -- Duplicator wrapper + if(not asmlib.ApplyPhysicalSettings(oEnt,tData[1])) then + return asmlib.StatusLog(false,"DUPE_PHYS_SETTINGS: Failed to apply physical settings on "..tostring(oEnt)) + end + return asmlib.StatusLog(true,"DUPE_PHYS_SETTINGS: Success") + end) +end + +if(CLIENT) then + asmlib.SetAction("RESET_VARIABLES", + function(oPly,oCom,oArgs) + local devmode = asmlib.GetCoVar("devmode" ,"INT") + local bgskids = asmlib.GetCoVar("bgskids", "STR") + asmlib.LogInstance("RESET_VARIABLES: {"..tostring(devmode)..asmlib.GetOpVar("OPSYM_DISABLE")..tostring(command).."}") + asmlib.ConCommandPly(oPly,"nextx" , 0) + asmlib.ConCommandPly(oPly,"nexty" , 0) + asmlib.ConCommandPly(oPly,"nextz" , 0) + asmlib.ConCommandPly(oPly,"nextpic", 0) + asmlib.ConCommandPly(oPly,"nextyaw", 0) + asmlib.ConCommandPly(oPly,"nextrol", 0) + if(devmode == 0) then + return asmlib.StatusLog(true,"RESET_VARIABLES: Developer mode disabled") end + if(bgskids == "reset cvars") then + local anchor = asmlib.GetOpVar("MISS_NOID").. + asmlib.GetOpVar("OPSYM_REVSIGN").. + asmlib.GetOpVar("MISS_NOMD") + asmlib.ConCommandPly(oPly, "weld" , "1") + asmlib.ConCommandPly(oPly, "mass" , "25000") + asmlib.ConCommandPly(oPly, "model" , "models/props_phx/trains/tracks/track_1x.mdl") + asmlib.ConCommandPly(oPly, "count" , "5") + asmlib.ConCommandPly(oPly, "freeze" , "1") + asmlib.ConCommandPly(oPly, "anchor" , anchor) + asmlib.ConCommandPly(oPly, "igntype" , "0") + asmlib.ConCommandPly(oPly, "spnflat" , "0") + asmlib.ConCommandPly(oPly, "ydegsnp" , "45") + asmlib.ConCommandPly(oPly, "pointid" , "1") + asmlib.ConCommandPly(oPly, "pnextid" , "2") + asmlib.ConCommandPly(oPly, "logsmax" , "0") + asmlib.ConCommandPly(oPly, "logfile" , "") + asmlib.ConCommandPly(oPly, "mcspawn" , "0") + asmlib.ConCommandPly(oPly, "bgskids" , "0/0") + asmlib.ConCommandPly(oPly, "gravity" , "1") + asmlib.ConCommandPly(oPly, "adviser" , "1") + asmlib.ConCommandPly(oPly, "activrad" , "45") + asmlib.ConCommandPly(oPly, "pntasist" , "1") + asmlib.ConCommandPly(oPly, "surfsnap" , "0") + asmlib.ConCommandPly(oPly, "exportdb" , "0") + asmlib.ConCommandPly(oPly, "offsetup" , "0") + asmlib.ConCommandPly(oPly, "ignphysgn", "0") + asmlib.ConCommandPly(oPly, "ghosthold", "1") + asmlib.ConCommandPly(oPly, "maxstatts", "3") + asmlib.ConCommandPly(oPly, "nocollide", "1") + asmlib.ConCommandPly(oPly, "physmater", "metal") + asmlib.ConCommandPly(oPly, "maxactrad", "150") + asmlib.ConCommandPly(oPly, "enwiremod", "1") + asmlib.ConCommandPly(oPly, "devmode" , "0") + asmlib.ConCommandPly(oPly, "maxstcnt" , "200") + asmlib.ConCommandPly(oPly, "bnderrmod", "LOG") + asmlib.ConCommandPly(oPly, "maxfruse" , "50") + asmlib.ConCommandPly(oPly, "modedb" , "LUA") + asmlib.ConCommandPly(oPly, "enqstore" , "1") + asmlib.ConCommandPly(oPly, "timermode", "CQT@1800@1@1/CQT@900@1@1/CQT@600@1@1") + asmlib.PrintInstance("RESET_VARIABLES: Variables reset complete") + elseif(stringFind(bgskids,"delete ") == 1) then + local indWord = 1 + local insPref = stringGsub(bgskids,"delete ","") + local expWord = stringExplode(" ",insPref) + while(expWord[indWord]) do + local sWord = expWord[indWord] + asmlib.DeleteExternalDatabase("PIECES","DSV",sWord.."_") + asmlib.DeleteExternalDatabase("ADDITIONS","DSV",sWord.."_") + asmlib.DeleteExternalDatabase("PHYSPROPERTIES","DSV",sWord.."_") + asmlib.LogInstance("RESET_VARIABLES: Match <"..sWord..">") + indWord = indWord + 1 + end + else return asmlib.StatusLog(true,"RESET_VARIABLES: Command <"..bgskids.."> skipped") end + return asmlib.StatusLog(true,"RESET_VARIABLES: Success") + end) + + asmlib.SetAction("OPEN_FRAME", + function(oPly,oCom,oArgs) + local frUsed, nCount = asmlib.GetFrequentModels(oArgs[1]) + if(not asmlib.IsExistent(frUsed)) then + return asmlib.StatusLog(false,"OPEN_FRAME: Failed to retrieve most frequent models ["..tostring(oArgs[1]).."]") + end + local defTable = asmlib.GetOpVar("DEFTABLE_PIECES") + if(not defTable) then return StatusLog(false,"OPEN_FRAME: Missing definition for table PIECES") end + local pnFrame = vguiCreate("DFrame") + if(not IsValid(pnFrame)) then + pnFrame:Remove() + return asmlib.StatusLog(false,"OPEN_FRAME: Failed to create base frame") + end + local pnElements = asmlib.MakeContainer("FREQ_VGUI") + pnElements:Insert(1,{Label = { "DButton" ,"Export DB" ,"Click to export the client database as a file"}}) + pnElements:Insert(2,{Label = { "DListView" ,"Routine Items" ,"The list of your frequently used track pieces"}}) + pnElements:Insert(3,{Label = { "DModelPanel","Piece Display" ,"The model of your track piece is displayed here"}}) + pnElements:Insert(4,{Label = { "DTextEntry" ,"Enter Pattern" ,"Enter a pattern here and hit enter to preform a search"}}) + pnElements:Insert(5,{Label = { "DComboBox" ,"Select Column" ,"Choose which list column you want to preform a search on"}}) + ------------ Manage the invalid panels ------------------- + local iNdex, iSize, sItem, vItem = 1, pnElements:GetSize(), "", nil + while(iNdex <= iSize) do + vItem = pnElements:Select(iNdex) + vItem.Panel = vguiCreate(vItem.Label[1],pnFrame) + if(not IsValid(vItem.Panel)) then + asmlib.LogInstance("OPEN_FRAME: Failed to create ID #"..tonumber(iNdex)) + iNdex, vItem = 1, nil + while(iNdex <= iSize) do + vItem, sItem = pnElements:Select(iNdex), "" + if(IsValid(vItem.Panel)) then vItem.Panel:Remove(); sItem = "and panel " end + pnElements:Delete(iNdex) + asmlib.LogInstance("OPEN_FRAME: Deleted entry "..sItem.."ID #"..tonumber(iNdex)) + iNdex = iNdex + 1 + end + pnFrame:Remove() + collectgarbage() + return StatusLog(false,"OPEN_FRAME: Invalid panel created. Frame removed") + end + vItem.Panel:SetName(vItem.Label[2]) + vItem.Panel:SetTooltip(vItem.Label[3]) + iNdex = iNdex + 1 + end + ------ Screen resolution and elements ------- + local scrW = surfaceScreenWidth() + local scrH = surfaceScreenHeight() + local pnButton = pnElements:Select(1).Panel + local pnListView = pnElements:Select(2).Panel + local pnModelPanel = pnElements:Select(3).Panel + local pnTextEntry = pnElements:Select(4).Panel + local pnComboBox = pnElements:Select(5).Panel + local nRatio = asmlib.GetOpVar("GOLDEN_RATIO") + local xyZero = {x = 0, y = 20} -- The start location of left-top + local xyDelta = {x = 10, y = 10} -- Distance between panels + local xySiz = {x = 0, y = 0} -- Current panel size + local xyPos = {x = 0, y = 0} -- Current panel position + local xyTmp = {x = 0, y = 0} -- Temporary coordinate + ------------ Frame -------------- + xyPos.x = (scrW / 4) + xyPos.y = (scrH / 4) + xySiz.x = 750 + xySiz.y = mathFloor(xySiz.x / (1 + nRatio)) + pnFrame:SetTitle("Frequent pieces by "..oPly:GetName().." v."..asmlib.GetOpVar("TOOL_VERSION")) + pnFrame:SetVisible(true) + pnFrame:SetDraggable(true) + pnFrame:SetDeleteOnClose(true) + pnFrame:SetPos(xyPos.x, xyPos.y) + pnFrame:SetSize(xySiz.x, xySiz.y) + pnFrame.OnClose = function() + pnFrame:SetVisible(false) + local iNdex, iSize = 1, pnElements:GetSize() + while(iNdex <= iSize) do -- All panels are valid + asmlib.LogInstance("OPEN_FRAME: Frame.OnClose: Delete #"..iNdex) + pnElements:Select(iNdex).Panel:Remove() + pnElements:Delete(iNdex) + iNdex = iNdex + 1 + end + pnFrame:Remove() + collectgarbage() + asmlib.LogInstance("OPEN_FRAME: Frame.OnClose: Form removed") + end + ------------ Button -------------- + xyPos.x = xyZero.x + xyDelta.x + xyPos.y = xyZero.y + xyDelta.y + xySiz.x = 55 -- Display properly the name + xySiz.y = 25 -- Used by combo-box and text-box + pnButton:SetParent(pnFrame) + pnButton:SetText(pnElements:Select(1).Label[2]) + pnButton:SetPos(xyPos.x, xyPos.y) + pnButton:SetSize(xySiz.x, xySiz.y) + pnButton:SetVisible(true) + pnButton.DoClick = function() + asmlib.LogInstance("OPEN_FRAME: Button.DoClick: <"..pnButton:GetText().."> clicked") + asmlib.SetLogControl(asmlib.GetCoVar("logsmax", "INT"), + asmlib.GetCoVar("logfile", "STR")) + local ExportDB = asmlib.GetCoVar("exportdb","INT") + if(ExportDB ~= 0) then + asmlib.LogInstance("OPEN_FRAME: Button Exporting DB") + asmlib.StoreExternalDatabase("PIECES",",","INS") + asmlib.StoreExternalDatabase("ADDITIONS",",","INS") + asmlib.StoreExternalDatabase("PHYSPROPERTIES",",","INS") + asmlib.StoreExternalDatabase("PIECES","\t","DSV") + asmlib.StoreExternalDatabase("ADDITIONS","\t","DSV") + asmlib.StoreExternalDatabase("PHYSPROPERTIES","\t","DSV") + end + end + ------------- ComboBox --------------- + xyPos.x, xyPos.y = pnButton:GetPos() + xyTmp.x, xyTmp.y = pnButton:GetSize() + xyPos.x = xyPos.x + xyTmp.x + xyDelta.x + xySiz.x = nRatio * xyTmp.x + xySiz.y = xyTmp.y + pnComboBox:SetParent(pnFrame) + pnComboBox:SetPos(xyPos.x,xyPos.y) + pnComboBox:SetSize(xySiz.x,xySiz.y) + pnComboBox:SetVisible(true) + pnComboBox:SetValue("") + pnComboBox:AddChoice("Model",defTable[1][1]) + pnComboBox:AddChoice("Type" ,defTable[2][1]) + pnComboBox:AddChoice("Name" ,defTable[3][1]) + pnComboBox:AddChoice("Act" ,defTable[4][1]) + pnComboBox.OnSelect = function(pnSelf, nInd, sVal, anyData) + asmlib.LogInstance("OPEN_FRAME: ComboBox.OnSelect: ID #"..nInd.."<"..sVal..">"..tostring(anyData)) + pnSelf:SetValue(sVal) + end + ------------ ModelPanel -------------- + xySiz.x = 250 -- Display model properly + xyTmp.x, xyTmp.y = pnFrame:GetSize() + xyPos.x, xyPos.y = pnComboBox:GetPos() + xyPos.x = xyTmp.x - xySiz.x - xyDelta.x + xySiz.y = xyTmp.y - xyPos.y - xyDelta.y + -------------------------------------- + pnModelPanel:SetParent(pnFrame) + pnModelPanel:SetPos(xyPos.x,xyPos.y) + pnModelPanel:SetSize(xySiz.x,xySiz.y) + pnModelPanel:SetVisible(true) + pnModelPanel.LayoutEntity = function(pnSelf, oEnt) + if(pnSelf.bAnimated) then pnSelf:RunAnimation() end + local uiBox = asmlib.CacheBoxLayout(oEnt,40) + if(not asmlib.IsExistent(uiBox)) then + return asmlib.StatusLog(false,"OPEN_FRAME: pnModelPanel.LayoutEntity: Box invalid") end + local stSpawn = asmlib.GetNormalSpawn(asmlib.GetOpVar("VEC_ZERO"),uiBox.Ang,oEnt:GetModel(),1) + stSpawn.SPos:Set(uiBox.Cen) + stSpawn.SPos:Rotate(stSpawn.SAng) + stSpawn.SPos:Mul(-1) + stSpawn.SPos:Add(uiBox.Cen) + oEnt:SetAngles(stSpawn.SAng) + oEnt:SetPos(stSpawn.SPos) + end + ------------ TextEntry -------------- + xyPos.x, xyPos.y = pnComboBox:GetPos() + xyTmp.x, xyTmp.y = pnComboBox:GetSize() + xyPos.x = xyPos.x + xyTmp.x + xyDelta.x + xySiz.y = xyTmp.y + ------------------------------------- + xyTmp.x, xyTmp.y = pnModelPanel:GetPos() + xySiz.x = xyTmp.x - xyPos.x - xyDelta.x + ------------------------------------- + pnTextEntry:SetParent(pnFrame) + pnTextEntry:SetPos(xyPos.x,xyPos.y) + pnTextEntry:SetSize(xySiz.x,xySiz.y) + pnTextEntry:SetVisible(true) + pnTextEntry.OnEnter = function(pnSelf) + local sName, sField = pnComboBox:GetSelected() + sName = tostring(sName or "") + sField = tostring(sField or "") + local sPattern = tostring(pnSelf:GetValue() or "") + if(not asmlib.UpdateListView(pnListView,frUsed,nCount,sField,sPattern)) then + return asmlib.StatusLog(false,"OPEN_FRAME: TextEntry.OnEnter: Failed to update ListView {"..sName.."#"..sField.."#"..sPattern.."}") + end + end + ------------ ListView -------------- + xyPos.x, xyPos.y = pnButton:GetPos() + xyTmp.x, xyTmp.y = pnButton:GetSize() + xyPos.y = xyPos.y + xyTmp.y + xyDelta.y + ------------------------------------ + xyTmp.x, xyTmp.y = pnTextEntry:GetPos() + xySiz.x, xySiz.y = pnTextEntry:GetSize() + xySiz.x = xyTmp.x + xySiz.x - xyDelta.x + ------------------------------------ + xyTmp.x, xyTmp.y = pnFrame:GetSize() + xySiz.y = xyTmp.y - xyPos.y - xyDelta.y + ------------------------------------ + local wUse = mathFloor(0.120377559 * xySiz.x) + local wAct = mathFloor(0.047460893 * xySiz.x) + local wTyp = mathFloor(0.214127559 * xySiz.x) + local wMod = xySiz.x - wUse - wAct - wTyp + pnListView:SetParent(pnFrame) + pnListView:SetVisible(false) + pnListView:SetSortable(true) + pnListView:SetMultiSelect(false) + pnListView:SetPos(xyPos.x,xyPos.y) + pnListView:SetSize(xySiz.x,xySiz.y) + pnListView:AddColumn("Used" ):SetFixedWidth(wUse) -- (1) + pnListView:AddColumn("Act" ):SetFixedWidth(wAct) -- (2) + pnListView:AddColumn("Type" ):SetFixedWidth(wTyp) -- (3) + pnListView:AddColumn("Model"):SetFixedWidth(wMod) -- (4) + pnListView.OnRowSelected = function(pnSelf, nIndex, pnLine) + local uiMod = pnLine:GetColumnText(4) -- Forth index is actually the model in the table + pnModelPanel:SetModel(uiMod) + local uiEnt = pnModelPanel:GetEntity() + local uiBox = asmlib.CacheBoxLayout(uiEnt,0,nRatio,nRatio-1) + if(not asmlib.IsExistent(uiBox)) then + return asmlib.StatusLog(false,"OPEN_FRAME: ListView.OnRowSelected: Box invalid for <"..uiMod..">") end + pnModelPanel:SetLookAt(uiBox.Eye) + pnModelPanel:SetCamPos(uiBox.Cam) + asmlib.ConCommandPly(oPly, "model" ,uiMod) + asmlib.ConCommandPly(oPly,"pointid", 1 ) + asmlib.ConCommandPly(oPly,"pnextid", 2 ) + end + if(not asmlib.UpdateListView(pnListView,frUsed,nCount)) then + asmlib.StatusLog(false,"OPEN_FRAME: ListView.OnRowSelected: Populate the list view failed") + end + ------------ Show the completed panel -------------- + pnFrame:SetVisible(true) + pnFrame:Center() + pnFrame:MakePopup() + collectgarbage() + return asmlib.StatusLog(true,"OPEN_FRAME: Success") + end) +end + +------ INITIALIZE DB ------ +asmlib.CreateTable("PIECES",{ + Timer = asmlib.TimerSetting(gaTimerSet[1]), + Index = {{1},{4},{1,4}}, + [1] = {"MODEL" , "TEXT" , "LOW", "QMK"}, + [2] = {"TYPE" , "TEXT" , nil , "QMK"}, + [3] = {"NAME" , "TEXT" , nil , "QMK"}, + [4] = {"LINEID", "INTEGER", "FLR", nil }, + [5] = {"POINT" , "TEXT" , nil , nil }, + [6] = {"ORIGIN", "TEXT" , nil , nil }, + [7] = {"ANGLE" , "TEXT" , nil , nil } +},true,true) + +asmlib.CreateTable("ADDITIONS",{ + Timer = asmlib.TimerSetting(gaTimerSet[2]), + Index = {{1},{4},{1,4}}, + [1] = {"MODELBASE", "TEXT" , "LOW", "QMK"}, + [2] = {"MODELADD" , "TEXT" , "LOW", "QMK"}, + [3] = {"ENTCLASS" , "TEXT" , nil , nil }, + [4] = {"LINEID" , "INTEGER", "FLR", nil }, + [5] = {"POSOFF" , "TEXT" , nil , nil }, + [6] = {"ANGOFF" , "TEXT" , nil , nil }, + [7] = {"MOVETYPE" , "INTEGER", "FLR", nil }, + [8] = {"PHYSINIT" , "INTEGER", "FLR", nil }, + [9] = {"DRSHADOW" , "INTEGER", "FLR", nil }, + [10] = {"PHMOTION" , "INTEGER", "FLR", nil }, + [11] = {"PHYSLEEP" , "INTEGER", "FLR", nil }, + [12] = {"SETSOLID" , "INTEGER", "FLR", nil }, +},true,true) + +asmlib.CreateTable("PHYSPROPERTIES",{ + Timer = asmlib.TimerSetting(gaTimerSet[3]), + Index = {{1},{2},{1,2}}, + [1] = {"TYPE" , "TEXT" , nil , "QMK"}, + [2] = {"LINEID", "INTEGER", "FLR", nil }, + [3] = {"NAME" , "TEXT" , nil , nil } +},true,true) + +------ POPULATE DB ------ +--[[ TA parametrization legend +Disabling of a component is preformed by using "OPSYM_DISABLE" +Disabling P - The ID is ignored when searching for active one +Disabling O - The ID can not selected by the holder via right click +Disabling A - The ID angle is treated as {0,0,0} +Disabling Type - makes it use the value of DefaultType() +Disabling Name - makes it generate it using the model +Reversing the parameter sign of a component happens by using variable "OPSYM_REVSIGN" +When table name is not provided to InsertRecord() it uses the value of DefaultTable() +]]-- +if(fileExists(gsFullDSV.."PIECES.txt", "DATA")) then + asmlib.LogInstance(gsToolNameU..": DB PIECES from DSV") + asmlib.ImportDSV("PIECES","\t",true) +else + asmlib.LogInstance(gsToolNameU..": DB PIECES from LUA") + asmlib.DefaultTable("PIECES") + if(asmlib.GetCoVar("devmode" ,"INT") ~= 0) then + asmlib.DefaultType("Develop Sprops") + asmlib.InsertRecord({"models/sprops/cuboids/height06/size_1/cube_6x6x6.mdl" , "#", "x1", 1, "", "", ""}) + asmlib.InsertRecord({"models/sprops/cuboids/height12/size_1/cube_12x12x12.mdl", "#", "x2", 1, "", "", ""}) + asmlib.InsertRecord({"models/sprops/cuboids/non_set/cube_18x18x18.mdl" , "#", "x3", 1, "", "", ""}) + asmlib.InsertRecord({"models/sprops/cuboids/height24/size_1/cube_24x24x24.mdl", "#", "x4", 1, "", "", ""}) + asmlib.InsertRecord({"models/sprops/cuboids/height36/size_1/cube_36x36x36.mdl", "#", "x5", 1, "", "", ""}) + asmlib.InsertRecord({"models/sprops/cuboids/height48/size_1/cube_48x48x48.mdl", "#", "x6", 1, "", "", ""}) + asmlib.DefaultType("Develop PHX") + asmlib.InsertRecord({"models/hunter/blocks/cube025x025x025.mdl", "#", "x1", 1, "", "", ""}) + asmlib.InsertRecord({"models/hunter/blocks/cube05x05x05.mdl" , "#", "x2", 1, "", "", ""}) + asmlib.InsertRecord({"models/hunter/blocks/cube075x075x075.mdl", "#", "x3", 1, "", "", ""}) + asmlib.InsertRecord({"models/hunter/blocks/cube1x1x1.mdl" , "#", "x4", 1, "", "", ""}) + asmlib.DefaultType("Develop Test") + asmlib.InsertRecord({"models/props_c17/furniturewashingmachine001a.mdl", "#", "#", 1, "#", "-0.05,0.006, 21.934", "#@-90, 0,180"}) + asmlib.InsertRecord({"models/props_c17/furniturewashingmachine001a.mdl", "#", "#", 2, "", "-0.05,0.006,-21.922", "@90,180,180"}) + end + asmlib.DefaultType("SligWolf's Rerailers") + asmlib.InsertRecord({"models/props_phx/trains/sw_rerailer_1.mdl", "#", "Short Single", 1, "-190.553,0,25.193", "211.414,0.015,-5.395", ""}) + asmlib.InsertRecord({"models/props_phx/trains/sw_rerailer_2.mdl", "#", "Middle Single", 1, "-190.553,0,25.193", "211.414,0.015,-5.395", ""}) + asmlib.InsertRecord({"models/props_phx/trains/sw_rerailer_3.mdl", "#", "Long Single", 1, "-190.553,0,25.193", "211.414,0.015,-5.395", ""}) + asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_3.mdl", "#", "Long Double", 1, "-258.249, -0.01, -0.002", "219.415, 0, -5.409", ""}) + asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_3.mdl", "#", "Long Double", 2, "-3124.199, -0.01, 2.997", "-3601.869, -0.377, -5.416", "0,-180,0"}) + asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_2.mdl", "#", "Middle Double", 1, "-265.554, 0, 3.031", "219.412, 0, -5.407", ""}) + asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_2.mdl", "#", "Middle Double", 2, "-1882.106, 0, 3.031", "-2367.072, 0, -5.412", "0,-180,0"}) + asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_1.mdl", "#", "Short Double", 1, "-221.409, 0, 3.031", "219.412, 0, -5.411", ""}) + asmlib.InsertRecord({"models/sligwolf/rerailer/rerailer_1.mdl", "#", "Short Double", 2, "-1103.05, 0, 0.009", "-1543.871, 0, -5.411", "0,-180,0"}) + asmlib.DefaultType("SligWolf's Minis") + asmlib.InsertRecord({"models/minitrains/straight_16.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_16.mdl", "#", "#", 2, "", "-16, -8.507, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_32.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_32.mdl", "#", "#", 2, "", "-32, -8.507, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_64.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_64.mdl", "#", "#", 2, "", "-64, -8.507, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_128.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_128.mdl", "#", "#", 2, "", "-128, -8.507, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_256.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_256.mdl", "#", "#", 2, "", "-256, -8.507, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_512.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_512.mdl", "#", "#", 2, "", "-512, -8.507, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_1024.mdl", "#", "#", 1, "", "0, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_1024.mdl", "#", "#", 2, "", "-1024, -8.507, 1", "0,-180,0"}) + asmlib.SettingsModelToName("SET",nil,{"diagonal_","ramp_"},nil) + asmlib.InsertRecord({"models/minitrains/straight_diagonal_128.mdl", "#", "#", 1, "", "8, -8.508, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_diagonal_128.mdl", "#", "#", 2, "", "-136, -8.506, 33", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_diagonal_256.mdl", "#", "#", 1, "", "8, -8.508, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_diagonal_256.mdl", "#", "#", 2, "", "-264, -8.506, 33", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/straight_diagonal_512.mdl", "#", "#", 1, "", "8, -8.508, 1", ""}) + asmlib.InsertRecord({"models/minitrains/straight_diagonal_512.mdl", "#", "#", 2, "", "-520, -8.506, 33", "0,-180,0"}) + asmlib.SettingsModelToName("CLR") + asmlib.InsertRecord({"models/minitrains/curve_1_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_1_90.mdl", "#", "#", 2, "", "-138.51, 130, 1", "0,90,0"}) + asmlib.InsertRecord({"models/minitrains/curve_2_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_2_90.mdl", "#", "#", 2, "", "-168.51, 160, 0.996", "0,90,0"}) + asmlib.InsertRecord({"models/minitrains/curve_3_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_3_90.mdl", "#", "#", 2, "", "-198.51, 190, 0.995", "0,90,0"}) + asmlib.InsertRecord({"models/minitrains/curve_4_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_4_90.mdl", "#", "#", 2, "", "-228.51, 220, 0.994", "0,90,0"}) + asmlib.InsertRecord({"models/minitrains/curve_5_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_5_90.mdl", "#", "#", 2, "", "-258.51, 250, 0.994", "0,90,0"}) + asmlib.InsertRecord({"models/minitrains/curve_6_90.mdl", "#", "#", 1, "", "-0.011, -8.5, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_6_90.mdl", "#", "#", 2, "", "-288.51, 280, 0.993", "0,90,0"}) + asmlib.InsertRecord({"models/minitrains/curve_1_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_1_45.mdl", "#", "#", 2, "", "-97.956, 32.044, 1", "0,135,0"}) + asmlib.InsertRecord({"models/minitrains/curve_2_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_2_45.mdl", "#", "#", 2, "", "-119.15, 40.853, 1", "0,135,0"}) + asmlib.InsertRecord({"models/minitrains/curve_3_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_3_45.mdl", "#", "#", 2, "", "-140.368, 49.631, 1", "0,135,0"}) + asmlib.InsertRecord({"models/minitrains/curve_4_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_4_45.mdl", "#", "#", 2, "", "-161.567, 58.434, 1", "0,135,0"}) + asmlib.InsertRecord({"models/minitrains/curve_5_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_5_45.mdl", "#", "#", 2, "", "-182.769, 67.232, 1", "0,135,0"}) + asmlib.InsertRecord({"models/minitrains/curve_6_45.mdl", "#", "#", 1, "", "-0.004, -8.506, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_6_45.mdl", "#", "#", 2, "", "-203.983, 76.019, 1", "0,135,0"}) + asmlib.InsertRecord({"models/minitrains/curve_1_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_1_22-5.mdl", "#", "#", 2, "", "-53.014, 2.013, 1", "0,157.5,0"}) + asmlib.InsertRecord({"models/minitrains/curve_2_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_2_22-5.mdl", "#", "#", 2, "", "-64.492, 4.307, 1", "0,157.5,0"}) + asmlib.InsertRecord({"models/minitrains/curve_3_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_3_22-5.mdl", "#", "#", 2, "", "-75.965, 6.599, 1", "0,157.5,0"}) + asmlib.InsertRecord({"models/minitrains/curve_4_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_4_22-5.mdl", "#", "#", 2, "", "-87.437, 8.904, 1", "0,157.5,0"}) + asmlib.InsertRecord({"models/minitrains/curve_5_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_5_22-5.mdl", "#", "#", 2, "", "-98.913, 11.205,1", "0,157.5,0"}) + asmlib.InsertRecord({"models/minitrains/curve_6_22-5.mdl", "#", "#", 1, "", "-0.005, -8.505, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_6_22-5.mdl", "#", "#", 2, "", "-110.405, 13.455, 1", "0,157.5,0"}) + asmlib.InsertRecord({"models/minitrains/curve_1_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_1_s_small.mdl", "#", "#", 2, "", "-105.994, 12.497, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_2_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_2_s_small.mdl", "#", "#", 2, "", "-128.994, 17.497, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_3_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_3_s_small.mdl", "#", "#", 2, "", "-151.994, 21.497, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_4_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_4_s_small.mdl", "#", "#", 2, "", "-174.994, 26.497, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_5_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_5_s_small.mdl", "#", "#", 2, "", "-197.994, 31.497, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_6_s_small.mdl", "#", "#", 1, "", "-0.007, -8.507, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_6_s_small.mdl", "#", "#", 2, "", "-220.994, 35.497, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_1_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_1_s_medium.mdl", "#", "#", 2, "", "-195.966, 72.51, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_2_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_2_s_medium.mdl", "#", "#", 2, "", "-237.966, 90.51, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_3_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_3_s_medium.mdl", "#", "#", 2, "", "-280.966, 107.51, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_4_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_4_s_medium.mdl", "#", "#", 2, "", "-322.966, 125.51, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_5_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_5_s_medium.mdl", "#", "#", 2, "", "-365.991, 142.507, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_6_s_medium.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_6_s_medium.mdl", "#", "#", 2, "", "-407.99, 160.51, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_1_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_1_s_big.mdl", "#", "#", 2, "", "-277.01, 268.511, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_2_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_2_s_big.mdl", "#", "#", 2, "", "-336.99, 328.521, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_3_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_3_s_big.mdl", "#", "#", 2, "", "-397.033, 388.521, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_4_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_4_s_big.mdl", "#", "#", 2, "", "-456.991, 448.521, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_5_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_5_s_big.mdl", "#", "#", 2, "", "-516.985, 508.521, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/curve_6_s_big.mdl", "#", "#", 1, "", "-0.007, -8.504, 1", ""}) + asmlib.InsertRecord({"models/minitrains/curve_6_s_big.mdl", "#", "#", 2, "", "-576.985, 568.521, 1", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/rerailer.mdl", "#", "Rerailer Double", 1, "", "190, -0.005, 1.02", ""}) + asmlib.InsertRecord({"models/minitrains/rerailer.mdl", "#", "Rerailer Double", 2, "", "-190, -0.005, 1.02", "0,180,0"}) + asmlib.InsertRecord({"models/minitrains/sw_buffer_stop.mdl", "#", "Buffer Stop", 1, "", "9.43, -8.011, -1.001", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 1, "", "16, 21.512, 1", ""}) + asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 2, "", "-144, 21.513, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 3, "", "16, -8.515, 1", ""}) + asmlib.InsertRecord({"models/minitrains/switch_double_right.mdl", "#", "#", 4, "", "-144, -8.514, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 1, "", "16, 21.512, 1", ""}) + asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 2, "", "-144, 21.513, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 3, "", "16, -8.515, 1", ""}) + asmlib.InsertRecord({"models/minitrains/switch_double_left.mdl", "#", "#", 4, "", "-144, -8.514, 1", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/switch.mdl", "#", "Switch Y", 1, "", "-128, -23.512, 0.998", "0,-180,0"}) + asmlib.InsertRecord({"models/minitrains/switch.mdl", "#", "Switch Y", 2, "", "0, -8.509, 1", ""}) + asmlib.InsertRecord({"models/minitrains/switch.mdl", "#", "Switch Y", 3, "", "-128, 6.493, 0.998", "0,-180,0"}) + asmlib.DefaultType("PHX Monorail") + asmlib.InsertRecord({"models/props_phx/trains/monorail1.mdl", "#", "Straight Short", 1, "", "229.885559,0.23999,13.87915", ""}) + asmlib.InsertRecord({"models/props_phx/trains/monorail1.mdl", "#", "Straight Short", 2, "", "-228.885254,0.239726,13.87915", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail2.mdl", "#", "Straight Middle", 1, "", "0.239726,-462.635468,13.879296", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail2.mdl", "#", "Straight Middle", 2, "", "0.239914,464.885315,13.879209", "0,90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail3.mdl", "#", "Straight Long", 1, "", "0.239949,-934.135559,13.879116", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail3.mdl", "#", "Straight Long", 2, "", "0.239705, 930.885315,13.879150", "0, 90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail4.mdl", "#", "Straight Very Long", 1, "", "0.239664,-1867.13562,13.879143", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail4.mdl", "#", "Straight Very Long", 2, "", "0.239664,1872.885376,13.879150", "0,90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail_curve2.mdl", "#", "Turn 45", 1, "", "-0.030396,-605.638428,13.881409", ""}) + asmlib.InsertRecord({"models/props_phx/trains/monorail_curve2.mdl", "#", "Turn 45", 2, "", "-428.018524,-428.362335,13.881714", "0,135,0"}) + asmlib.InsertRecord({"models/props_phx/trains/monorail_curve.mdl", "#", "Turn 90", 1, "", "-0.030518,-605.638184,13.880554", ""}) + asmlib.InsertRecord({"models/props_phx/trains/monorail_curve.mdl", "#", "Turn 90", 2, "", "-605.380859,-0.307583,13.881714", "0,90,0"}) + asmlib.DefaultType("PHX Metal") + asmlib.SettingsModelToName("SET",nil,{"track_","straight_"},nil) + asmlib.InsertRecord({"models/props_phx/trains/track_32.mdl" , "#", "#", 1, "-0.327,-61.529,8.714", " 15.755127,0.001953,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_32.mdl" , "#", "#", 2, "-0.327, 61.529,8.714", "-16.239746,0.000244,9.215", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_64.mdl" , "#", "#", 1, "", " 31.999878, 0.001960,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_64.mdl" , "#", "#", 2, "", "-32.000275,-0.001469,9.215", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_128.mdl", "#", "#", 1, "", " 63.75531, 0.001953,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_128.mdl", "#", "#", 2, "", "-64.240356,-0.005125,9.215", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_256.mdl", "#", "#", 1, "", " 127.754944, 0.001953,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_256.mdl", "#", "#", 2, "", " -128.245117,-0.012207,9.215", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_512.mdl", "#", "#", 1, "", " 255.754791, 0.001465,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_512.mdl", "#", "#", 2, "", "-256.242401,-0.026855,9.215", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_1024.mdl", "#", "#", 1, "", " 511.754761,-4.7e-005,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_1024.mdl", "#", "#", 2, "", "-512.240601,-0.050828,9.215", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_2048.mdl", "#", "#", 1, "", " 1023.755066,0.000642,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_2048.mdl", "#", "#", 2, "", "-1024.242676,-0.109433,9.215", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/track_4096.mdl", "#", "#", 1, "", " 2047.755249, 0.001923,9.215", ""}) + asmlib.InsertRecord({"models/props_phx/trains/track_4096.mdl", "#", "#", 2, "", "-2048.240479,-0.225247,9.215", "0,-180,0"}) + asmlib.DefaultType("PHX Regular") + asmlib.SettingsModelToName("SET",{1,6}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_single.mdl", "#", "#", 1, "-0.327,-61.529,8.714", " 15.451782, 1.5e-005,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_single.mdl", "#", "#", 2, "-0.327, 61.529,8.714", "-16.094971,-1.0e-006,12.548828", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_1x.mdl", "#", "#", 1, "", " 79.929352,0,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_1x.mdl", "#", "#", 2, "", "-70.058060,6e-006,12.548828", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 1, "", " 74.973145, 1e-005,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 2, "", "-75.013794,-7e-006,12.548828", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 3, "", "-0.022434 , 74.999878,12.548828", "0,90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_crossing.mdl", "#", "Cross 90", 4, "", "-0.022434 ,-74.987061,12.548828", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_2x.mdl", "#", "#", 1, "", "229.919388,0,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_2x.mdl", "#", "#", 2, "", "-70.05806,-6e-006,12.548828", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_4x.mdl", "#", "#", 1, "", " 229.919388, 3.1e-005,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_4x.mdl", "#", "#", 2, "", "-370.037079,-3.2e-005,12.548828", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_pass.mdl", "#", "Cross Road", 1, "", " 229.920044,2e-005,11.214844", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_pass.mdl", "#", "Cross Road", 2, "", "-370.036377,2e-006,11.214844", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_8x.mdl", "#", "#", 1, "", " 829.878418, 3.8e-005,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_8x.mdl", "#", "#", 2, "", "-370.036865,-2.5e-005,12.548828", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_16x.mdl", "#", "#", 1, "", "2029.797363,0.000133,12.548828", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_16x.mdl", "#", "#", 2, "", "-370.036865,-2e-0060,12.548828", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 1, "", " 250.473389, 49.613159,11.214844", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 2, "", "-349.483032, 49.613129,11.214844", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 3, "", " 162.610229,-162.4935 ,11.214844", "0, -45,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_x.mdl", "#", "Cross 45", 4, "", "-261.623718, 261.740234,11.214844", "0, 135,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_down.mdl", "#", "#", 1, "", "-75.016,-0.006,64.57", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_down.mdl", "#", "#", 2, "", "4.096,-0.007,48.791", "@22.5,0,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_up.mdl", "#", "#", 1, "", "-75.016,0.007,11.212", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_225_up.mdl", "#", "#", 2, "", "4.196,0,27.054", "@-22.5,0,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_down.mdl", "#", "#", 1, "-75.016,-0.002,64.568", "-75.013,-0.002,64.568", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_down.mdl", "#", "#", 2, "", "71.037,-0.018,3.951", "@45,0,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_up.mdl", "#", "#", 1, "", "-75.013,0.007,11.218", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_45_up.mdl", "#", "#", 2, "", "71.173,0.003,71.909", "@-45,0,0"}) + asmlib.SettingsModelToName("SET",{1,6},{"turn","turn_"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn45.mdl", "#", "#", 1, "", "733.000061,-265.363037,11.218994", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn45.mdl", "#", "#", 2, "", "-83.264610, 72.744667,11.218994", "0,135,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn90.mdl", "#", "#", 1, "", "733.000061,-265.363037,11.218994", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_turn90.mdl", "#", "#", 2, "", "-421.363312,889.005493,11.218994", "0,90,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch.mdl", "#", "Switch Right", 1, "", " 829.879700,0.00158700, 11.218994", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch.mdl", "#", "Switch Right", 2, "", "-370.037231,0.00025600, 11.218994", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch.mdl", "#", "Switch Right", 3, "", "-158.311737,338.107941, 11.218994", "0,135,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch2.mdl", "#", "Switch Left [X]", 1, "", " 829.880005, -0.001465, 11.218994", ""}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch2.mdl", "#", "Switch Left [X]", 2, "", "-370.037262, -0.000456, 11.218994", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/trains/tracks/track_switch2.mdl", "#", "Switch Left [X]", 3, "", "-158.311356,-338.111572, 11.218994", "0,-135,0"}) + asmlib.DefaultType("SProps") + asmlib.SettingsModelToName("SET",nil,{"track_s0","straight_"},{"","x"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s01.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s01.mdl", "#", "#", 2, "", "-162,0,7.624", "0,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s02.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s02.mdl", "#", "#", 2, "", "-324,0,7.624", "0,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s03.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s03.mdl", "#", "#", 2, "", "-486,0,7.624", "0,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s04.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s04.mdl", "#", "#", 2, "", "-648,0,7.624", "0,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s05.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s05.mdl", "#", "#", 2, "", "-1296.002,0,7.624", "0,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s06.mdl", "#", "#", 1, "", " 0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_s06.mdl", "#", "#", 2, "", "-2592.002,0,7.624", "0,180,0"}) + asmlib.SettingsModelToName("CLR") + asmlib.InsertRecord({"models/sprops/trans/train/track_h01.mdl", "#", "Ramp", 1, "", "0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_h01.mdl", "#", "Ramp", 2, "", "-2525.98,0,503.58", "0,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_h02.mdl", "#", "225 Up", 1, "", ",0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_h02.mdl", "#", "225 Up", 2, "", "-1258.828,0,261.268", "@-22.5,180,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_h03.mdl", "#", "225 Down", 1, "", "0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_h03.mdl", "#", "225 Down", 2, "", "-1264.663,0,-247.177", "@22.5,180,0"}) + asmlib.SettingsModelToName("SET",nil,{"track_t","turn_","02","big","01","small"},nil) + asmlib.InsertRecord({"models/sprops/trans/train/track_t90_02.mdl", "#", "#", 1, "", "0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_t90_02.mdl", "#", "#", 2, "", "-1650,1650.0009765625,7.624", "0,90,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/track_t90_01.mdl", "#", "#", 1, "", "0,0,7.624", ""}) + asmlib.InsertRecord({"models/sprops/trans/train/track_t90_01.mdl", "#", "#", 2, "", "-825,825,7.624", "0,90,0"}) + asmlib.InsertRecord({"models/sprops/trans/train/rerailer.mdl", "#", "#", 1, "-1088.178,0,19.886", "-1280.383,0,7.618", "0,180,0"}) + asmlib.DefaultType("XQM Coaster") + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_1.mdl", "#", "#", 1, "", "75.790,-0.013,-2.414", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_1.mdl", "#", "#", 2, "", "-70.806,-0.003.923,26.580", "@-22.5,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_2.mdl", "#", "#", 1, "", "149.8, -0.013, -9.62", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_2.mdl", "#", "#", 2, "", "-141.814, 0.004, 48.442", "@-22.5,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_3.mdl", "#", "#", 1, "", "225.199, -0.016, -16.814", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_3.mdl", "#", "#", 2, "", "-214.187, 0.006, 70.463", "@-22.5,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_4.mdl", "#", "#", 1, "", "298.8, -0.013, -24.02", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_4.mdl", "#", "#", 2, "", "-285.799, 0.019, 92.158", "@-22.5,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_1.mdl", "#", "#", 1, "", "74.8, -0.013, -9.758", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_1.mdl", "#", "#", 2, "", "-59.846, 0.021, 45.855", "@-45,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_2.mdl", "#", "#", 1, "", "-148.199, 0.021, -24.085", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_2.mdl", "#", "#", 2, "", "121.828, -0.004, 88.131", "@-45,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_3.mdl", "#", "#", 1, "", "-221.204, 0.005, -38.364", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_3.mdl", "#", "#", 2, "", "183.612, -0.018, 129.084", "@-45,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_4.mdl", "#", "#", 1, "", "-293.8, -0.013, -52.661", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_4.mdl", "#", "#", 2, "", "245.168, -0.007, 170.857", "@-45,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_1.mdl", "#", "#", 1, "", "75, -0.016, -9.757", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_1.mdl", "#", "#", 2, "", "-115.988, 0.017, 181.075", "@-90,0,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_2.mdl", "#", "#", 1, "", "-148.198, -0.013, -24.085", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_2.mdl", "#", "#", 2, "", " 233.158, 0.013, 358.192", "@-90, 180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_3.mdl", "#", "#", 1, "", "-221.1, -0.013, -38.366", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_3.mdl", "#", "#", 2, "", "351.2, -0.013, 533.582", "@-90,-180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_4.mdl", "#", "#", 1, "", "-293.701, -0.013, -52.661", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_4.mdl", "#", "#", 2, "", "468.482, -0.013, 710.225", "@-90,-180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_1.mdl", "#", "#", 1, "", " -73.800, -0.013, 11.999", " 0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_1.mdl", "#", "#", 2, "", " 72.814, -0.013, -16.992", "@22.5,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_2.mdl", "#", "#", 1, "", "-148.626, -0.013, 19.510", " 0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_2.mdl", "#", "#", 2, "", " 134.806, -0.011, -36.762", "@22.5,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_3.mdl", "#", "#", 1, "", "-224.899, 0.010, 25.763", " 0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_3.mdl", "#", "#", 2, "", " 202.547, -0.014, -57.473", "@22.5,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_4.mdl", "#", "#", 1, "", "-300.319, 0.017, 32.110", " 0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_225_down_4.mdl", "#", "#", 2, "", " 268.600, 0.052, -77.783", "@22.5,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_1.mdl", "#", "#", 1, "", "-71.199, -0.013, 18.809", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_1.mdl", "#", "#", 2, "", " 63.815, -0.021, -37.126", "@45,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_2.mdl", "#", "#", 1, "", "-144.8, -0.013, 33.103", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_2.mdl", "#", "#", 2, "", "125.217, -0.014, -78.778", "@45,0,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_3.mdl", "#", "#", 1, "", "217.199, -0.013, 47.332", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_3.mdl", "#", "#", 2, "", "-187.587, 0.003, -120.127", "@45,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_4.mdl", "#", "#", 1, "", "290.79, -0.013, 61.604", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_45_down_4.mdl", "#", "#", 2, "", "-249.142, 0.017, -161.855", "@45, 180, 0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_1.mdl", "#", "#", 1, "", "-70.793, -0.038, 18.807", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_1.mdl", "#", "#", 2, "", "119.415, -0.013, -171.482", "@90,-180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_2.mdl", "#", "#", 1, "", "-144.804, -0.013, 33.103", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_2.mdl", "#", "#", 2, "", "237.418, -0.013, -349.306", "@90,180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_3.mdl", "#", "#", 1, "", "217.199, -0.013, 47.332", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_3.mdl", "#", "#", 2, "", "-355.101, 0.01, -524.496", "@90,0,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_4.mdl", "#", "#", 1, "", "290.8, -0.013, 61.604", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/slope_90_down_4.mdl", "#", "#", 2, "", "-473.228, -0.013, -701.956", "@90,0,180"}) + --- XQM Turn --- + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_1.mdl", "#", "#", 1, "", "73.232, -14.287, 4.894", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_1.mdl", "#", "#", 2, "", "-62.119, 41.771, 4.888", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_2.mdl", "#", "#", 1, "", "145.801, -28.557, 4.893", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_2.mdl", "#", "#", 2, "", "-123.848, 83.091, 4.921", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_3.mdl", "#", "#", 1, "", "218.8, -42.829, 4.899", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_3.mdl", "#", "#", 2, "", "-184.844, 124.707, 4.88", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_4.mdl", "#", "#", 1, "", "292.197, -57.102, 4.896", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_45_4.mdl", "#", "#", 2, "", "-246.823, 166.305, 4.888", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_1.mdl", "#", "#", 1, "", "73.199, -14.286, 4.894", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_1.mdl", "#", "#", 2, "", "-117.904, 176.785, 4.888", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_2.mdl", "#", "#", 1, "", "145.748, -28.566, 4.883", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_2.mdl", "#", "#", 2, "", "-235.851, 352.965, 4.883", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_3.mdl", "#", "#", 1, "", "219.199, -42.829, 4.9", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_3.mdl", "#", "#", 2, "", "-352.072, 529.25, 4.888", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_4.mdl", "#", "#", 1, "", "292.695, -57.102, 4.897", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_4.mdl", "#", "#", 2, "", "-470.379, 706.175, 4.887", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_1.mdl", "#", "#", 1, "", "72.8, 367.527, 4.894", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_1.mdl", "#", "#", 2, "", "72.8, -14.286, 4.894", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_3.mdl", "#", "#", 1, "", "218.767, -42.833, 4.888", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_3.mdl", "#", "#", 2, "", "218.767, 1100.169, 4.91", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_2.mdl", "#", "#", 1, "", "146.198, -28.561, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_2.mdl", "#", "#", 2, "", "146.041, 735.053, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_4.mdl", "#", "#", 1, "", "292.283, -57.102, 4.896", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_4.mdl", "#", "#", 2, "", "292.283, 1468.9, 4.896", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_1.mdl", "#", "#", 1, "", "68.201, -27.47, 4.907", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_1.mdl", "#", "#", 2, "", "-27.469, 68.408, 4.907", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_2.mdl", "#", "#", 1, "", "134.784, -54.932, 4.883", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_2.mdl", "#", "#", 2, "", "-54.9, 134.79, 4.908", "0, 90, 0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_3.mdl", "#", "#", 1, "", "203.169, -82.386, 4.885", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_3.mdl", "#", "#", 2, "", "-82.342, 203.198, 4.884", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_4.mdl", "#", "#", 1, "", "270.8, -109.856, 4.889", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_90_tight_4.mdl", "#", "#", 2, "", "-109.812, 270.799, 4.89", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_2.mdl", "#", "#", 1, "", "93.769, 96.842, 4.9", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_2.mdl", "#", "#", 2, "", "-93.912, 96.841, 4.9", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_3.mdl", "#", "#", 1, "", "138.58, 144.2, 4.906", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_3.mdl", "#", "#", 2, "", "-142.846, 144.192, 4.888", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_4.mdl", "#", "#", 1, "", "184.588, 191.8, 4.905", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_180_tight_4.mdl", "#", "#", 2, "", "-190.323, 191.8, 4.905", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_1.mdl", "#", "#", 1, "", "73.214, -14.287, 4.889", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_1.mdl", "#", "#", 2, "", "-62.103, 41.809, 49.893", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_2.mdl", "#", "#", 1, "", "145.789, -28.557, 4.888", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_2.mdl", "#", "#", 2, "", "-123.816, 83.09, 49.885", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_3.mdl", "#", "#", 1, "", "218.817, -42.829, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_3.mdl", "#", "#", 2, "", "-184.823, 124.712, 49.888", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_4.mdl", "#", "#", 1, "", "292.295, -57.102, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_45_4.mdl", "#", "#", 2, "", "-246.825, 166.303, 49.887", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_1.mdl", "#", "#", 1, "", "151.949, -115.536, -28.863", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_1.mdl", "#", "#", 2, "", "-39.186, 75.539, 61.137", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_2.mdl", "#", "#", 1, "", "247.052, -129.807, -17.611", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_2.mdl", "#", "#", 2, "", "-134.631, 251.731, 72.387", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_3.mdl", "#", "#", 1, "", "342.55, -166.589, -6.356", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_3.mdl", "#", "#", 2, "", "-228.353, 405.104, 83.627", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_4.mdl", "#", "#", 1, "", "461.445, -180.852, -6.363", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_90_4.mdl", "#", "#", 2, "", "-301.622, 582.445, 83.635", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_1.mdl", "#", "#", 1, "", "61.949, -171.786, -85.113", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_1.mdl", "#", "#", 2, "", "61.849, 210.026, 94.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_2.mdl", "#", "#", 1, "", "145.79, -377.307, -51.364", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_2.mdl", "#", "#", 2, "", "145.64, 386.277, 128.636", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_3.mdl", "#", "#", 1, "", "219.186, -560.329, -73.863", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_3.mdl", "#", "#", 2, "", "219.938, 582.673, 106.137", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_4.mdl", "#", "#", 1, "", "292.682, -57.062, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_180_4.mdl", "#", "#", 2, "", "292.882, 1468.926, 184.888", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_1.mdl", "#", "#", 1, "", "73.199, -14.286, 49.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_1.mdl", "#", "#", 2, "", "-62.097, 41.783, 4.886", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_2.mdl", "#", "#", 1, "", "145.79, -28.558, 49.879", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_2.mdl", "#", "#", 2, "", "-123.833, 83.088, 4.892", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_3.mdl", "#", "#", 1, "", "219.197, -42.829, 49.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_3.mdl", "#", "#", 2, "", "-185.095, 124.99, 4.888", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_4.mdl", "#", "#", 1, "", "292.695, -57.102, 49.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_45_4.mdl", "#", "#", 2, "", "-247.123, 166.602, 4.888", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_1.mdl", "#", "#", 1, "", "128.858, -14.281, 72.387", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_1.mdl", "#", "#", 2, "", "-61.682, 176.749, -17.61", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_2.mdl", "#", "#", 1, "", "179.55, -28.557, 61.136", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_2.mdl", "#", "#", 2, "", "-202.131, 352.976, -28.864", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_3.mdl", "#", "#", 1, "", "241.3, -42.829, 61.136", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_3.mdl", "#", "#", 2, "", "-329.578, 528.859, -28.864", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_4.mdl", "#", "#", 1, "", "292.296, -57.102, 94.89", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_90_4.mdl", "#", "#", 2, "", "-470.372, 705.791, 4.886", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_1.mdl", "#", "#", 1, "", "73.2, -149.286, 128.637", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_1.mdl", "#", "#", 2, "", "73.099, 232.527, -51.363", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_2.mdl", "#", "#", 1, "", "145.8, -287.306, 117.387", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_2.mdl", "#", "#", 2, "", "145.6, 476.307, -62.612", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_3.mdl", "#", "#", 1, "", "219.196, -391.579, 117.387", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_3.mdl", "#", "#", 2, "", "219.948, 751.399, -62.61", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_4.mdl", "#", "#", 1, "", "292.681, -630.852, 117.391", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/turn_slope_down_180_4.mdl", "#", "#", 2, "", "292.833, 895.14, -62.613", ""}) + --- XQM Bank -- + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_1.mdl", "#", "#", 1, "", "149.7, -0.005, 4.88", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_1.mdl", "#", "#", 2, "", "-149.7, 0.024, 4.865", "0,180,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_2.mdl", "#", "#", 1, "", "299.790,-0.021,4.885", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_2.mdl", "#", "#", 2, "", "-299.790,0.007,4.862", "0,180,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_3.mdl", "#", "#", 1, "", "449.8, -0.018, 4.896", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_3.mdl", "#", "#", 2, "", "-449.802, -0.003, 4.853", "0,-180,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_4.mdl", "#", "#", 1, "", "600.194, -0.017, 4.888", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_right_4.mdl", "#", "#", 2, "", "-600.199, 0.025, 4.872", "0,180,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_1.mdl", "#", "#", 1, "", "150.199, 0.032, 4.885", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_1.mdl", "#", "#", 2, "", "-150.168, -0.014, 4.881", "0,180,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_2.mdl", "#", "#", 1, "", "300.199, -0.011, 4.895", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_2.mdl", "#", "#", 2, "", "-300.198, 0.032, 4.914", "0,180,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_3.mdl", "#", "#", 1, "", "449.378, -0.025, 4.893", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_3.mdl", "#", "#", 2, "", "-449.801, 0.018, 4.896", "0,180,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_4.mdl", "#", "#", 1, "", "599.802, -0.013, 4.883", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_start_left_4.mdl", "#", "#", 2, "", "-600.198, -0.015, 4.902", "0,-180,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_1.mdl", "#", "#", 1, "", "74.199, 14.457, 4.888", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_1.mdl", "#", "#", 2, "", "-63.081, -42.297, 4.912", "0,-135,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_2.mdl", "#", "#", 1, "", "147.199, 28.717, 4.886", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_2.mdl", "#", "#", 2, "", "-124.087, -83.935, 4.901", "0,-135,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_3.mdl", "#", "#", 1, "", "219.8, 42.98, 4.887", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_3.mdl", "#", "#", 2, "", "-185.808, -125.258, 4.908", "0,-135,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_4.mdl", "#", "#", 1, "", "292.799, 57.249, 4.89", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_45_4.mdl", "#", "#", 2, "", "-247.727, -166.794, 4.908", "0,-135,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_1.mdl", "#", "#", 1, "", "73.8, 14.448, 4.895", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_1.mdl", "#", "#", 2, "", "-119.757, -178.862, 4.909", "0,-90,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_2.mdl", "#", "#", 1, "", "147.2, 28.719, 4.887", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_2.mdl", "#", "#", 2, "", "-235.985, -355.128, 4.904", "0,-90,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_3.mdl", "#", "#", 1, "", "220.199, 42.985, 4.89", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_3.mdl", "#", "#", 2, "", "-353.929, -531.719, 4.91", "0,-90,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_4.mdl", "#", "#", 1, "", "292.790,57.259,4.881", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_90_4.mdl", "#", "#", 2, "", "-471.864,-707.923,4.910", "0,-90.00,-45.00"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_1.mdl", "#", "#", 1, "", "73.8, 14.45, 4.887", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_1.mdl", "#", "#", 2, "", "73.46, -372.816, 4.902", "0,0,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_2.mdl", "#", "#", 1, "", "146.8, 28.715, 4.888", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_2.mdl", "#", "#", 2, "", "147.376, -737.938, 4.911", "0,0,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_3.mdl", "#", "#", 1, "", "220.191, 43.001, 4.907", "0,0,45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_3.mdl", "#", "#", 2, "", "220.813, -1105.46, 4.883", "0,0,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_4.mdl", "#", "#", 1, "", "293.308, -1472.996, 4.916", "0,0,-45"}) + asmlib.InsertRecord({"models/xqm/coastertrack/bank_turn_180_4.mdl", "#", "#", 2, "", "292.8, 57.26, 4.89", "0,0,45"}) + --- XQM Special --- + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_2.mdl", "#", "#", 1, "", "150.189, -36.538, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_2.mdl", "#", "#", 2, "", "-150.199, 36.554, 4.887", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_3.mdl", "#", "#", 1, "", "225.199, -36.549, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_3.mdl", "#", "#", 2, "", "-225.099, 36.55, 4.887", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_4.mdl", "#", "#", 1, "", "300.2, -36.649, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_right_4.mdl", "#", "#", 2, "", "-300.195, 36.561, 4.887", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_2.mdl", "#", "#", 1, "", "149.8, 36.553, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_2.mdl", "#", "#", 2, "", "-149.8, -36.54, 4.886", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_3.mdl", "#", "#", 1, "", "225.159, 36.552, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_3.mdl", "#", "#", 2, "", "-225.2, -36.559, 4.886", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_4.mdl", "#", "#", 1, "", "299.8, 36.623, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_sturn_left_4.mdl", "#", "#", 2, "", "-299.8, -36.6, 4.886", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_2.mdl", "#", "#", 1, "", "189.277, 59.435, 41.118", "0,90,-90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_2.mdl", "#", "#", 2, "", "-192.302, 46.789, -17.492", "@22.5,90,90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_3.mdl", "#", "#", 1, "", "-285.755, -96.647, 32.538", "0,-90,-90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_3.mdl", "#", "#", 2, "", "281.393, -79.204, -55.216", "@22.5,-90,90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_4.mdl", "#", "#", 1, "", "322.424, -72.015, 15.907", "0,-90,90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_4.mdl", "#", "#", 2, "", "-419.735, -44.894, 132.706", "@-22.5,-90,-90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_2.mdl", "#", "#", 1, "", "-207.841, 30.414, 100.219", "@-22.5,-90,-90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_2.mdl", "#", "#", 2, "", "-207.993, 7.31, -17.474", "@22.5,90,90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_3.mdl", "#", "#", 1, "", "281.359, -6.612, 120.391", "@-22.5,90,-90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_3.mdl", "#", "#", 2, "", "281.371, 28.004, -55.354", "@22.5,-90,90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_4.mdl", "#", "#", 1, "", "322.609, 52.146, 251.028", "0,90,-90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_helix_middle_full_4.mdl", "#", "#", 2, "", "322.431, 5.79, 15.895", "0,-90,90"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_1.mdl", "#", "#", 1, "", "150.199, 0.013, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_1.mdl", "#", "#", 2, "", "-1050.199, -0.01, 4.886", "0,180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_2.mdl", "#", "#", 1, "", "1126.907, -0.013, 4.883, 4.9", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_2.mdl", "#", "#", 2, "", "-1272.492, -0.164, 4.883", "0,-180,-180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_3.mdl", "#", "#", 1, "", "1349.823, -0.012, 4.883", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_3.mdl", "#", "#", 2, "", "-2249.7, -0.013, 4.884", "0,-180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_4.mdl", "#", "#", 1, "", "1950.199, -0.017, 4.889", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_right_4.mdl", "#", "#", 2, "", "-2850.199, -0.047, 4.88", "0,-180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_1.mdl", "#", "#", 1, "", "150.079, -0.009, 4.878", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_1.mdl", "#", "#", 2, "", "-1050.198, -0.036, 4.877", "0,180,-180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_2.mdl", "#", "#", 1, "", "299.8, -0.013, 4.884", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_2.mdl", "#", "#", 2, "", "-2099.8, -0.013, 4.883", "0,-180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_3.mdl", "#", "#", 1, "", "449.801, -0.014, 4.882", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_3.mdl", "#", "#", 2, "", "-3149.802, -0.028, 4.871", "0,180,180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_4.mdl", "#", "#", 1, "", "599.801, -0.014, 4.888", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_half_corkscrew_left_4.mdl", "#", "#", 2, "", "-4199.8, -0.013, 4.881", "0,-180,-180"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_1.mdl", "#", "#", 1, "", "150, -0.013, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_1.mdl", "#", "#", 2, "", "-2250, -0.013, 4.886", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_3.mdl", "#", "#", 1, "", "2550.2, -0.012, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_3.mdl", "#", "#", 2, "", "-4650.14, -0.013, 4.886", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_4.mdl", "#", "#", 1, "", "3749.790,-0.019,4.879", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_right_4.mdl", "#", "#", 2, "", "-5849.795, 0.008, 4.884", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_1.mdl", "#", "#", 1, "", "149.695, -0.02, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_1.mdl", "#", "#", 2, "", "-2249.721, 0.014, 4.888", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_2.mdl", "#", "#", 1, "", "1350.218, 0.029, 4.883", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_2.mdl", "#", "#", 2, "", "-3450.199, -0.009, 4.887", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_3.mdl", "#", "#", 1, "", "2550, -0.013, 4.886", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_3.mdl", "#", "#", 2, "", "-4650.203, 0.023, 4.886", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_4.mdl", "#", "#", 1, "", "3749.804, -0.001, 4.888", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_corkscrew_left_4.mdl", "#", "#", 2, "", "-5849.8, 0.036, 4.888", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_3.mdl", "#", "#", 1, "", "14.2, 67.584, -279.931", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_3.mdl", "#", "#", 2, "", "-0.172, -67.619, -279.937", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_4.mdl", "#", "#", 1, "", "2.16, 89.53, -307.495", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_full_loop_4.mdl", "#", "#", 2, "", "-18.191, -72.398, -307.642", "0,-180,0"}) + --- XQM Straight --- + asmlib.InsertRecord({"models/xqm/coastertrack/straight_1.mdl", "#", "#", 1, "", "74.802, -0.013, 4.886, 0", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_1.mdl", "#", "#", 2, "", "-74.803, -0.013, 4.886", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_2.mdl", "#", "#", 1, "", "149.805, -0.013, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_2.mdl", "#", "#", 2, "", "-149.805, -0.013, 4.887", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_3.mdl", "#", "#", 1, "", "225.206, -0.013, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_3.mdl", "#", "#", 2, "", "-225.196, -0.013, 4.887", "0,-180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_4.mdl", "#", "#", 1, "", "300.164, -0.013, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/straight_4.mdl", "#", "#", 2, "", "-300.189, -0.013, 4.887", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_station.mdl", "#", "#", 1, "", "150.194, -0.045, 4.887", ""}) + asmlib.InsertRecord({"models/xqm/coastertrack/special_station.mdl", "#", "#", 2, "", "-150.184, -0.045, 4.887", "0,-180,0"}) + asmlib.DefaultType("PHX Road") + asmlib.InsertRecord({"models/props_phx/huge/road_short.mdl", "#", "#", 1, "", "0, 299.693, 1.765", "0, 90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_short.mdl", "#", "#", 2, "", "0,-299.693, 1.765", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_medium.mdl", "#", "#", 1, "", "0, 599.386, 1.765", "0, 90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_medium.mdl", "#", "#", 2, "", "0,-599.386, 1.765", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_long.mdl", "#", "#", 1, "", "0, 1198.773, 1.765", "0, 90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_long.mdl", "#", "#", 2, "", "0,-1198.773, 1.765", "0,-90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_curve.mdl", "#", "#", 1, "", "162.813, 379.277, 1.879", "0, 90,0"}) + asmlib.InsertRecord({"models/props_phx/huge/road_curve.mdl", "#", "#", 2, "", "-363.22, -146.757, 1.879", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/misc/small_ramp.mdl", "#", "#", 1, "", "-284.589, -3.599976, -1.672", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/misc/small_ramp.mdl", "#", "#", 2, "", " 312.608, -3.599976, 236.11", "@-45,0,0"}) + asmlib.InsertRecord({"models/props_phx/misc/big_ramp.mdl", "#", "#", 1, "", "-569.177, -7.199953, -3.075", "0,-180,0"}) + asmlib.InsertRecord({"models/props_phx/misc/big_ramp.mdl", "#", "#", 2, "", "625.022, -7.199953, 472.427", "@-45,0,0"}) + asmlib.DefaultType("PHX Monorail Beam") + asmlib.InsertRecord({"models/props_phx/misc/iron_beam1.mdl", "#", "#", 1, "", " 22.411, 0.001, 5.002", "0, 0,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam1.mdl", "#", "#", 2, "", "-22.413, 0.001, 5.002", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam2.mdl", "#", "#", 1, "", " 45.298, 0.001, 5.002", "0, 0,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam2.mdl", "#", "#", 2, "", "-46.968, 0.001, 5.002", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam3.mdl", "#", "#", 1, "", " 93.069, 0, 5.002", "0, 0,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam3.mdl", "#", "#", 2, "", "-94.079, 0.002, 5.002", "0,180,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam4.mdl", "#", "#", 1, "", " 175.507, 0.001, 5.002", "0, 0,0"}) + asmlib.InsertRecord({"models/props_phx/misc/iron_beam4.mdl", "#", "#", 2, "", "-201.413, 0.001, 5.002", "0,180,0"}) + asmlib.DefaultType("XQM Ball Rails") + asmlib.InsertRecord({"models/xqm/rails/tunnel_1.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_1.mdl", "#", "#", 2, "", "-6, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_2.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_2.mdl", "#", "#", 2, "", "-18, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_4.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_4.mdl", "#", "#", 2, "", "-42, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_8.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_8.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_16.mdl","#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/tunnel_16.mdl","#", "#", 2, "", "-186, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/straight_1.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/straight_1.mdl", "#", "#", 2, "", "-6, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/straight_2.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/straight_2.mdl", "#", "#", 2, "", "-18, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/straight_4.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/straight_4.mdl", "#", "#", 2, "", "-42, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/straight_8.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/straight_8.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/straight_16.mdl","#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/straight_16.mdl","#", "#", 2, "", "-186, 0, -2.25", "0,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/funnel.mdl","#", "#", 1, "", "2.206, 0.003, 4.282", "90,0,180"}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_15.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_15.mdl", "#", "#", 2, "", "-20.245, -0.018, -4.13", "@15,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_30.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_30.mdl", "#", "#", 2, "", "-32.078, 0.022, -9.114", "@30,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_45.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_45.mdl", "#", "#", 2, "", "-42.144, -0.011, -16.998", "@45,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_90.mdl", "#", "#", 1, "", "38, 0.019, 30.42", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_down_90.mdl", "#", "#", 2, "", "-30.418, -0.009, -37.98", "@90,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_15.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_15.mdl", "#", "#", 2, "", "-15.521, 0.014, -1.009", "@-15,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_30.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_30.mdl", "#", "#", 2, "", "-22.871, -0.019, 2.152", "@-30,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_45.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_45.mdl", "#", "#", 2, "", "-29.149, 0.006, 7.109", "@-45,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_90.mdl", "#", "#", 1, "", "6.004, 0.005, 15.322", ""}) + asmlib.InsertRecord({"models/xqm/rails/slope_up_90.mdl", "#", "#", 2, "", "-44.066, -0.011, 65.001", "@-90,180,0"}) + asmlib.InsertRecord({"models/xqm/rails/turn_15.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/turn_15.mdl", "#", "#", 2, "", "-17.591, 3.105, -2.25, -1.009", "0,165,0"}) + asmlib.InsertRecord({"models/xqm/rails/turn_30.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/turn_30.mdl", "#", "#", 2, "", "-28.676, 7.705, -2.252", "0,150,0"}) + asmlib.InsertRecord({"models/xqm/rails/turn_45.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/turn_45.mdl", "#", "#", 2, "", "-38.2, 15.001, -2.261", "0,135,0"}) + asmlib.InsertRecord({"models/xqm/rails/turn_90.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/turn_90.mdl", "#", "#", 2, "", "-58.848, 56.855, -2.255", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/rails/turn_180.mdl", "#", "#", 1, "", "52.789, 44.753, -2.273", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/rails/turn_180.mdl", "#", "#", 2, "", "-52.808, 44.743, -2.238", "0,90,0"}) + asmlib.InsertRecord({"models/xqm/rails/twist_45_left.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/twist_45_left.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,-45"}) + asmlib.InsertRecord({"models/xqm/rails/twist_90_left.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/twist_90_left.mdl", "#", "#", 2, "", "-186, 0, -2.25", "0,180,-90"}) + asmlib.InsertRecord({"models/xqm/rails/twist_45_right.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/twist_45_right.mdl", "#", "#", 2, "", "-90, 0, -2.25", "0,180,45"}) + asmlib.InsertRecord({"models/xqm/rails/twist_90_right.mdl", "#", "#", 1, "", "6, 0, -2.25", ""}) + asmlib.InsertRecord({"models/xqm/rails/twist_90_right.mdl", "#", "#", 2, "", "-186, 0, -2.25", "0,180,-90"}) + asmlib.InsertRecord({"models/xqm/rails/loop_left.mdl", "#", "#", 1, "", "13.7315, 41.726, -0.968", "0,22.5,-2.2585"}) + asmlib.InsertRecord({"models/xqm/rails/loop_left.mdl", "#", "#", 2, "", "-13.7315, -41.726, -0.968", "0,-157.5,-2.2585"}) + asmlib.InsertRecord({"models/xqm/rails/loop_right.mdl", "#", "#", 1, "", "13.864, -41.787, -0.953", "0,-22.5,2.433"}) + asmlib.InsertRecord({"models/xqm/rails/loop_right.mdl", "#", "#", 2, "", "-13.562, 41.789, -0.952", "0,157.5,2.433"}) + asmlib.DefaultType("Magnum's Rails") + asmlib.InsertRecord({"models/magtrains1ga/straight_0032.mdl", "#", "#", 1, "", " 16 , 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0032.mdl", "#", "#", 2, "", "-16 , 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0064.mdl", "#", "#", 1, "", " 32 , 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0064.mdl", "#", "#", 2, "", "-32 , 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0128.mdl", "#", "#", 1, "", " 64 , 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0128.mdl", "#", "#", 2, "", "-64 , 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0256.mdl", "#", "#", 1, "", " 128 , 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0256.mdl", "#", "#", 2, "", "-128 , 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0512.mdl", "#", "#", 1, "", " 256 , 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_0512.mdl", "#", "#", 2, "", "-256 , 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/straight_1024.mdl", "#", "#", 1, "", " 512 , 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_1024.mdl", "#", "#", 2, "", "-512 , 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/straight_2048.mdl", "#", "#", 1, "", " 1024, 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/straight_2048.mdl", "#", "#", 2, "", "-1024, 0, 3.016", "0,180,0"}) + asmlib.InsertRecord({"models/magtrains1ga/curve_225.mdl", "#", "#", 1, "", "-0.01, 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/curve_225.mdl", "#", "#", 2, "", "-587.955, -117.702, 3.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/magtrains1ga/curve_45.mdl", "#", "#", 1, "", "-0.012, 0, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/curve_45.mdl", "#", "#", 2, "", "-1087.089, -451.055, 3.016", "0,-135,0"}) + asmlib.InsertRecord({"models/magtrains1ga/curve_90.mdl", "#", "#", 1, "", " 1086.58, 450.079, 3.016", ""}) + asmlib.InsertRecord({"models/magtrains1ga/curve_90.mdl", "#", "#", 2, "", "-449.475,-1085.92, 3.016", "0,-90,0"}) + asmlib.DefaultType("Shinji85's Rails") + asmlib.SettingsModelToName("SET",nil,{"rail_","straight_"},nil) + asmlib.InsertRecord({"models/shinji85/train/rail_1x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_1x.mdl", "#", "#", 2, "", "-128,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_2x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_2x.mdl", "#", "#", 2, "", "-256,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_4x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_4x.mdl", "#", "#", 2, "", "-512,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_8x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_8x.mdl", "#", "#", 2, "", "-1024,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_16x.mdl", "#","#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_16x.mdl", "#","#", 2, "", "-2048,0,7.346", "0,180,0"}) + asmlib.SettingsModelToName("SET",nil,{"_crossing","","rail_","crossing_"},nil) + asmlib.InsertRecord({"models/shinji85/train/rail_4x_crossing.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_4x_crossing.mdl", "#", "#", 2, "", "-512,0,7.346", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,5}) + asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 2, "", "-512,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 3, "", "-256,-256,7.346", "0,270,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_cross_4x.mdl", "#", "#", 4, "", "-256,256,7.346", "0,90,0"}) + asmlib.SettingsModelToName("SET",{1,5},{"_crossing","","double_","crossing_double_"}) + asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 1, "", "0,128,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 2, "", "-512,128,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 3, "", "0,-128,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_double_4x_crossing.mdl", "#", "#", 4, "", "-512,-128,7.346", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,5}) + asmlib.InsertRecord({"models/shinji85/train/rail_bumper.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.SettingsModelToName("SET",{1,5},{"double_bumper","bumper_double"},nil) + asmlib.InsertRecord({"models/shinji85/train/rail_double_bumper.mdl", "#", "#", 1, "", "0,128,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_double_bumper.mdl", "#", "#", 2, "", "0,-128,7.346", ""}) + asmlib.SettingsModelToName("SET",{1,5}) + --- Shinji85 Curve --- + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R1.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R1.mdl", "#", "#", 2, "", "-1060.12341 ,139.56763 ,7.346", "0,165,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R2.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R2.mdl", "#", "#", 2, "", "-993.86572 ,130.84471 ,7.346", "0,165,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R3.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R3.mdl", "#", "#", 2, "", "-927.60797 ,122.1218 ,7.346", "0,165,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_CC.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_CC.mdl", "#", "#", 2, "", "-966.40515 ,128, 7.346", "0,165,0"}) + --- Shinji85 Switch --- + asmlib.SettingsModelToName("SET",{1,5},{"r_","right_","l_","left_"},nil) + asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl", "#", "#", 2, "", "-1024,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl", "#", "#", 3, "", "-966.40515 ,128, 7.346", "0,165,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl", "#", "#", 2, "", "-1024,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl", "#", "#", 3, "", "-966.40515 ,-128, 7.346", "0,195,0"}) + asmlib.SettingsModelToName("SET",{1,5}) + --- Shinji85 Raccordi --- + asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 2, "", "-494.55,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 3, "", "-33.129,-123.63866,7.346", "0,-30,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_x_junction.mdl", "#", "#", 4, "", "-461.42175,123.63649,7.346", "0,150,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_Cx.mdl", "#", "Counter X", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_Cx.mdl", "#", "Counter X", 2, "", "-362.51361,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_CS.mdl", "#", "Counter Switch", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_CS.mdl", "#", "Counter Switch", 2, "", "-908.81165,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_Cxfix.mdl", "#", "Counter X Fix", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_Cxfix.mdl", "#", "Counter X Fix", 2, "", "-149.48648,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_CSfix.mdl", "#", "Counter Switch Fix", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_CSfix.mdl", "#", "Counter Switch Fix", 2, "", "-115.18847,0,7.346", "0,180,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R11.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R11.mdl", "#", "#", 2, "", "-1086.11584 ,449.88458 ,7.346", "0,135,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R12.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R12.mdl", "#", "#", 2, "", "-905.09656 ,374.90414 ,7.346", "0,135,0"}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R13.mdl", "#", "#", 1, "", "0,0,7.346", ""}) + asmlib.InsertRecord({"models/shinji85/train/rail_curve_R13.mdl", "#", "#", 2, "", "-724.07727 ,299.92276 ,7.346", "0,135,0"}) + asmlib.DefaultType("Sligwof's Railcar") + asmlib.InsertRecord({"models/swrcs/swrccross.mdl", "#", "Switcher Cross", 1, "", "500,0,0", ""}) + asmlib.InsertRecord({"models/swrcs/swrccross.mdl", "#", "Switcher Cross", 2, "", "-2673,0,0", "0,180,0"}) + asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 1, "", "890, 748.009, 2.994", ""}) + asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 2, "", "890, 451.998, 2.994", ""}) + asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 3, "", "890, -452.001, 2.974", ""}) + asmlib.InsertRecord({"models/swrcs/swrccurve001.mdl", "#", "U-Turn", 4, "", "890, -748.027, 2.974", ""}) + asmlib.InsertRecord({"models/swrcs/swrclooping.mdl", "#", "Loop 180", 1, "", "810, -252.447, -0.005", ""}) + asmlib.InsertRecord({"models/swrcs/swrclooping.mdl", "#", "Loop 180", 2, "", "-809.999, 136.997, -0.002", "0,180,0"}) + asmlib.InsertRecord({"models/swrcs/swrcloopingspecial.mdl", "#", "LoopSwitch 180", 1, "", "927.001, -194.403, -0.036", ""}) + asmlib.InsertRecord({"models/swrcs/swrcloopingspecial.mdl", "#", "LoopSwitch 180", 2, "", "-809.999, 137.003, 350.984", "0,-180,0"}) + asmlib.InsertRecord({"models/swrcs/swrcloopingspecial.mdl", "#", "LoopSwitch 180", 3, "", "-809.999, -527.972, 350.984", "0,-180,0"}) + asmlib.InsertRecord({"models/swrcs/swrcramp.mdl", "#", "Ramp 45", 1, "", "1000, 0, 0", ""}) + asmlib.InsertRecord({"models/swrcs/swrcramp.mdl", "#", "Ramp 45", 2, "", "-641.92, 0, 269.672", "@-45,-180,0"}) + asmlib.InsertRecord({"models/swrcs/swrctraffic_lights.mdl", "#", "Start Lights", 1, "", "0, -152.532, 0", ""}) + asmlib.InsertRecord({"models/swrcs/swrctraffic_lights.mdl", "#", "Start Lights", 2, "", "0, 152.554, 0", ""}) + asmlib.InsertRecord({"models/swrcs/swrctraffic_lights.mdl", "#", "Start Lights", 3, "", "0, 0, 0.042", ""}) + asmlib.DefaultType("Random Bridges") + asmlib.InsertRecord({"models/props_canal/canal_bridge01.mdl", "#", "#", 1, "", "455.345, -6.815, 201.73", ""}) + asmlib.InsertRecord({"models/props_canal/canal_bridge01.mdl", "#", "#", 2, "", "-456.655, -6.815, 201.73", "0,-180,0"}) + asmlib.InsertRecord({"models/props_canal/canal_bridge01b.mdl", "#", "#", 1, "", "910.69, -13.63, 403.46", ""}) + asmlib.InsertRecord({"models/props_canal/canal_bridge01b.mdl", "#", "#", 2, "", "-913.31, -13.63, 403.46", "0,-180,0"}) + asmlib.InsertRecord({"models/props_canal/canal_bridge02.mdl", "#", "#", 1, "", "0, 512.155, 288", "0,90,0"}) + asmlib.InsertRecord({"models/props_canal/canal_bridge02.mdl", "#", "#", 2, "", "0, -512.212, 288", "0,-90,0"}) + asmlib.InsertRecord({"models/props_canal/canal_bridge03a.mdl", "#", "#", 1, "", "320.89, 0, 187.742", ""}) + asmlib.InsertRecord({"models/props_canal/canal_bridge03a.mdl", "#", "#", 2, "", "-320.059, 0, 187.742", "0,-180,0"}) + asmlib.InsertRecord({"models/props_canal/canal_bridge03b.mdl", "#", "#", 1, "", "320.89, 0, 187.741", ""}) + asmlib.InsertRecord({"models/props_canal/canal_bridge03b.mdl", "#", "#", 2, "", "-320.059, 0, 187.741", "0,-180,0"}) + asmlib.InsertRecord({"models/props_canal/canal_bridge03c.mdl", "#", "#", 1, "", "1026.848, 0, 600.773", ""}) + asmlib.InsertRecord({"models/props_canal/canal_bridge03c.mdl", "#", "#", 2, "", "-1024.189, 0, 600.773", "0,-180,0"}) + asmlib.SettingsModelToName("SET",nil,{"bridge","bridge_","001",""},nil) + asmlib.InsertRecord({"models/props_2fort/bridgesupports001.mdl", "#", "TF Support", 1, "", "448, 0, -14.268", ""}) + asmlib.InsertRecord({"models/props_2fort/bridgesupports001.mdl", "#", "TF Support", 2, "", "-448, 0, -15.558", "0,-180,0"}) + asmlib.SettingsModelToName("SET",nil,{"bridge01_","bridge_"},nil) + asmlib.InsertRecord({"models/askari/bridge01_stlve.mdl", "#", "Stlve", 1, "", "192, 0, 189.531", ""}) + asmlib.InsertRecord({"models/askari/bridge01_stlve.mdl", "#", "Stlve", 2, "", "-192, 0, 189.531", "0,-180,0"}) + asmlib.SettingsModelToName("CLR") + asmlib.InsertRecord({"models/karkar/bridge.mdl", "#", "Karkar", 1, "", "62.07, -343.696, 208.295", "0,-90,0"}) + asmlib.InsertRecord({"models/karkar/bridge.mdl", "#", "karkar", 2, "", "62.07, 334.44, 208.295", "0,90,0"}) + asmlib.InsertRecord({"models/karkar/wooden_bridge_helly.mdl", "#", "#", 1, "", "0, 318.601, 26.783", "0,90,0"}) + asmlib.InsertRecord({"models/karkar/wooden_bridge_helly.mdl", "#", "#", 2, "", "0, -240.814, 2.85", "0,-90,0"}) + asmlib.InsertRecord({"models/karkar/wooden_bridge_helly_broken_bstk.mdl", "#", "#", 1, "", "-318.524, 0, 26.757", "0,-180,0"}) + asmlib.InsertRecord({"models/karkar/wooden_bridge_helly_broken_bstk.mdl", "#", "#", 2, "", "244.523, 0, 3.55", ""}) + asmlib.InsertRecord({"models/props/tresslebridge.mdl", "#", "#", 1, "", "374.246, -1.2345, 24.849", ""}) + asmlib.InsertRecord({"models/props/tresslebridge.mdl", "#", "#", 2, "", "-345.367, -1.2345, 24.85", "0,180,0"}) + asmlib.InsertRecord({"models/props_combine/combine_bridge.mdl", "#", "#", 1, "", "-8.401, 0, 124.685", ""}) + asmlib.InsertRecord({"models/props_combine/combine_bridge.mdl", "#", "#", 2, "", "-320, 0, 124.685", "0,180,0"}) + asmlib.InsertRecord({"models/props_combine/combine_bridge_b.mdl", "#", "#", 1, "", "-330.895, 0.039, 124.673", ""}) + asmlib.InsertRecord({"models/props_combine/combine_bridge_b.mdl", "#", "#", 2, "", "-522.855, 0.251, 124.671", "0,180,0"}) + asmlib.InsertRecord({"models/props_swamp/big_jetty.mdl", "#", "#", 1, "", "0, 116.668, 57.94", "0,90,0"}) + asmlib.InsertRecord({"models/props_swamp/big_jetty.mdl", "#", "#", 2, "", "0, -11.914, 57.939", "0,-90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_128.mdl", "#", "#", 1, "", "0, 67.452, 14.326", "0, 90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_128.mdl", "#", "#", 2, "", "0,-63.954, 14.325", "0,-90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_256.mdl", "#", "#", 1, "", "0, 131.491, 14.199", "0, 90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_256.mdl", "#", "#", 2, "", "0,-139.388, 14.198", "0,-90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_384.mdl", "#", "#", 1, "", "0, 199.517, 14.302", "0, 90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_384.mdl", "#", "#", 2, "", "0,-196.069, 14.215", "0,-90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_128.mdl", "#", "#", 1, "", "0, 67.244, 14.323", "0, 90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_128.mdl", "#", "#", 2, "", "0,-63.033, 14.337", "0,-90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_256.mdl", "#", "#", 1, "", "0, 131.502, 14.339", "0, 90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_256.mdl", "#", "#", 2, "", "0,-127.085, 14.319", "0,-90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_384.mdl", "#", "#", 1, "", "0, 199.517, 14.332", "0, 90,0"}) + asmlib.InsertRecord({"models/props_swamp/boardwalk_tall_384.mdl", "#", "#", 2, "", "0,-196.012, 14.318", "0,-90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge01.mdl", "#", "#", 1, "", "0, 68.767, 14.898", "0, 90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge01.mdl", "#", "#", 2, "", "0, -70.316, 14.898", "0,-90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge02.mdl", "#", "#", 1, "", "5.236, -13.396, 11.976", "0,-90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge02.mdl", "#", "#", 2, "", "5.236, 479.851, 11.976", "0, 90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge03.mdl", "#", "#", 1, "", "1.436, -12.169, 11.136", "0,-90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge03.mdl", "#", "#", 2, "", "1.436, 480.851, 11.136", "0, 90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge04.mdl", "#", "#", 1, "", "-2.253, -11.847, 10.696", "0,-90,0"}) + asmlib.InsertRecord({"models/props_viaduct_event/underworld_bridge04.mdl", "#", "#", 2, "", "-2.253, 480.851, 10.696", "0, 90,0"}) + asmlib.InsertRecord({"models/props_wasteland/bridge_low_res.mdl", "#", "#", 1, "", "5056, 219.145, 992.765", ""}) + asmlib.InsertRecord({"models/props_wasteland/bridge_low_res.mdl", "#", "#", 2, "", "-576, 219.145, 992.765", "0, 180,0"}) + asmlib.DefaultType("StephenTechno's Buildings Single") + asmlib.SettingsModelToName("SET",{1,3}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_1road_dl_sdw_1x1.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_1road_dl_sdw_1x1.mdl", "#", "#", 2, "", "-72,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_2road_dl_sdw_1x2.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_2road_dl_sdw_1x2.mdl", "#", "#", 2, "", "-144,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_3road_dl_sdw_1x3.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_3road_dl_sdw_1x3.mdl", "#", "#", 2, "", "-216,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_4road_dl_sdw_1x4.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_4road_dl_sdw_1x4.mdl", "#", "#", 2, "", "-288,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_5road_dl_sdw_1x5.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_5road_dl_sdw_1x5.mdl", "#", "#", 2, "", "-360,0,3.03125", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,4}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_10road_dl_sdw_1x32.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_10road_dl_sdw_1x32.mdl", "#", "#", 2, "", "-2304,0,3.03125", "0,180,0"}) + asmlib.SettingsModelToName("SET",nil,{"lot","lot_"},nil) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16.mdl", "#", "#", 1, "", "-268, 575, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16.mdl", "#", "#", 2, "", "-268, -577.002, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16fence.mdl", "#", "#", 1, "", "-268, 575, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot16x16fence.mdl", "#", "#", 2, "", "-268, -577.002, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32.mdl", "#", "#", 1, "", "-268, 1152.002, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32.mdl", "#", "#", 2, "", "-267.999, -1151.292, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32fence.mdl", "#", "#", 1, "", "-268, 1152.002, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot32x32fence.mdl", "#", "#", 2, "", "-267.999, -1151.292, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8fence.mdl", "#", "#", 1, "", "-268, 288, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8fence.mdl", "#", "#", 2, "", "-268, -287.996, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8.mdl", "#", "#", 1, "", "-268, 288, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/emptylots/lot8x8.mdl", "#", "#", 2, "", "-268, -287.996, 3.03125", "0,-90,0"}) + asmlib.SettingsModelToName("SET",{1,3}) + asmlib.InsertRecord({"models/buildingspack/housing/3_0apartments_0.mdl", "#", "#", 1, "", "-268, 612.001, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/housing/3_0apartments_0.mdl", "#", "#", 2, "", "-268, -612, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/housing/3_1apartments_1.mdl", "#", "#", 1, "", "-268, 1248, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/housing/3_1apartments_1.mdl", "#", "#", 2, "", "-268, -1200, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/housing/3_3apartments_3.mdl", "#", "#", 1, "", "-268.008, 574.913, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/housing/3_3apartments_3.mdl", "#", "#", 2, "", "-268, -577, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 1, "", "0, -916, 3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 2, "", "0, 916, 3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 3, "", "-340, 1256, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 4, "", "-2172, 1256, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 5, "", "-2512, 916, 3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 6, "", "-2512, -916, 3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 7, "", "-2172, -1256, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_2skyscraper1.mdl", "#", "#", 8, "", "-340, -1256, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 1, "", "0, -916, 3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 2, "", "0, 916, 3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 3, "", "-340, 1256, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 4, "", "-2172, 1256, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 5, "", "-2512, 916, 3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 6, "", "-2512, -916, 3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 7, "", "-2172, -1256, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_3skyscraper2.mdl", "#", "#", 8, "", "-340, -1256, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 1, "", "0, -1492, 3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 2, "", "0, 1492, 3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 3, "", "-340, 1832, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 4, "", "-2172, 1832, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 5, "", "-2512, 1492, 3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 6, "", "-2512, -1492, 3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 7, "", "-2172, -1832, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/misc/6_4skyscraper3.mdl", "#", "#", 8, "", "-340, -1832, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/recreational/5_1club_lgbt.mdl", "#", "#", 1, "", "-268, 720, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/recreational/5_1club_lgbt.mdl", "#", "#", 2, "", "-268, -720, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/recreational/5_2stripclub.mdl", "#", "#", 1, "", "-268, 736, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/recreational/5_2stripclub.mdl", "#", "#", 2, "", "-268, -736, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_0office.mdl", "#", "#", 1, "", "-267.986, 616.053, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_0office.mdl", "#", "#", 2, "", "-268, -608, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_1garage.mdl", "#", "#", 1, "", "-268, 698, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/schultz/stores/4_1garage.mdl", "#", "#", 2, "", "-268, -598, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_a.mdl", "#", "#", 1, "", "-268, 604, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_a.mdl", "#", "#", 2, "", "-268, -620, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_b.mdl", "#", "#", 1, "", "-268, 612, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_1gas_station_b.mdl", "#", "#", 2, "", "-268, -612, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_3gunshop.mdl", "#", "#", 1, "", "-268, 504.001, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_3gunshop.mdl", "#", "#", 2, "", "-268, -504, 3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_4bank.mdl", "#", "#", 1, "", "-268, 504, 2.031232", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_4bank.mdl", "#", "#", 2, "", "-268, -504, 2.031232", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_2pcshop.mdl", "#", "#", 1, "", "-268, 432, 3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/stores/4_2pcshop.mdl", "#", "#", 2, "", "-268, -432, 3.03125", "0,-90,0"}) + asmlib.SettingsModelToName("SET",{1,4},{"ion_","_"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 2, "", "-340,340,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 3, "", "-680,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_11road_intersection_4w.mdl", "#", "#", 4, "", "-340,-340,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_12road_intersection_3w.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_12road_intersection_3w.mdl", "#", "#", 2, "", "-340,340,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_12road_intersection_3w.mdl", "#", "#", 3, "", "-340,-340,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_13road_intersection_2w.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_13road_intersection_2w.mdl", "#", "#", 2, "", "-340,-340,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_14road_intersection_deadend.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_16road_intersection_turn2_16.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_16road_intersection_turn2_16.mdl", "#", "#", 2, "", "-1564,1564,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_15road_intersection_turn1.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadswsidewalk/2_15road_intersection_turn1.mdl", "#", "#", 2, "", "-340,-340,3.03125", "0,-90,0"}) + asmlib.DefaultType("StephenTechno's Buildings Double") + asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy","_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy1x1.mdl" , "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy1x1.mdl" , "#", "#", 2, "", "-72,0,316.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_2roadsdwhwy1x4.mdl" , "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_2roadsdwhwy1x4.mdl" , "#", "#", 2, "", "-288,0,316.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_3roadsdwhwy1x8.mdl" , "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_3roadsdwhwy1x8.mdl" , "#", "#", 2, "", "-576,0,316.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_4roadsdwhwy1x16.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_4roadsdwhwy1x16.mdl", "#", "#", 2, "", "-1152,0,316.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_5roadsdwhwy1x32.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_5roadsdwhwy1x32.mdl", "#", "#", 2, "", "-2304,0,316.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_6roadsdwhwy1x64.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_6roadsdwhwy1x64.mdl", "#", "#", 2, "", "-4608,0,316.03125", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy","_","bridge","bridge_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_8roadsdwhwybridge1x4.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_8roadsdwhwybridge1x4.mdl", "#", "#", 2, "", "-288,0,60.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_9roadsdwhwybridge1x8.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_9roadsdwhwybridge1x8.mdl", "#", "#", 2, "", "-576,0,60.03125", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,4},{"sdwhwy","_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_10roadsdwhwybridge1x16.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_10roadsdwhwybridge1x16.mdl", "#", "#", 2, "", "-1152,0,60.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_11roadsdwhwybridge1x32.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_11roadsdwhwybridge1x32.mdl", "#", "#", 2, "", "-2304,0,60.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_12roadsdwhwybridge1x64.mdl", "#", "#", 1, "", "0,0,60.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_12roadsdwhwybridge1x64.mdl", "#", "#", 2, "", "-4608,0,60.03125", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy_","_","turn1","turn"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_7roadsdwhwy_turn1.mdl", "#", "#", 1, "", "0,0,316.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_7roadsdwhwy_turn1.mdl", "#", "#", 2, "", "-1692,1692,316.03125", "0,90,0"}) + asmlib.SettingsModelToName("SET",{1,3}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_0roadsdwsidewalktransfer.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_0roadsdwsidewalktransfer.mdl", "#", "#", 2, "", "-376,0,3.03125", "0,-180,0"}) + asmlib.SettingsModelToName("SET",{1,4},{"sdw","_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 2, "", "-540,540,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 3, "", "-1080,0,3.03125", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_11roadsdwsidewalk_int_4way.mdl", "#", "#", 4, "", "-540,-540,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_12roadsdwsidewalk_int_3way.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_12roadsdwsidewalk_int_3way.mdl", "#", "#", 2, "", "-540,540,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_12roadsdwsidewalk_int_3way.mdl", "#", "#", 3, "", "-540,-540,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_13roadsdwsidewalk_int_2way.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_13roadsdwsidewalk_int_2way.mdl", "#", "#", 2, "", "-540,540,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_14roadsdwsidewalk_turn_1.mdl", "#", "#", 1, "", "0,-4,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_14roadsdwsidewalk_turn_1.mdl", "#", "#", 2, "", "-540,-544,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_15roadsdwsidewalk_turn_2.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_15roadsdwsidewalk_turn_2.mdl", "#", "#", 2, "", "-1692,1692,3.03125", "0,90,0"}) + asmlib.SettingsModelToName("SET",{1,3},{"sdw","_","walk","walk_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_1roadsdwsidewalk1x1.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_1roadsdwsidewalk1x1.mdl", "#", "#", 2, "", "-72,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_2roadsdwsidewalk1x2.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_2roadsdwsidewalk1x2.mdl", "#", "#", 2, "", "-144,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_3roadsdwsidewalk1x3.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_3roadsdwsidewalk1x3.mdl", "#", "#", 2, "", "-216,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_4roadsdwsidewalk1x4.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_4roadsdwsidewalk1x4.mdl", "#", "#", 2, "", "-288,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_5roadsdwsidewalk1x5.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_5roadsdwsidewalk1x5.mdl", "#", "#", 2, "", "-360,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_6roadsdwsidewalk1x6.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_6roadsdwsidewalk1x6.mdl", "#", "#", 2, "", "-432,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_7roadsdwsidewalk1x7.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_7roadsdwsidewalk1x7.mdl", "#", "#", 2, "", "-504,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_8roadsdwsidewalk1x8.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_8roadsdwsidewalk1x8.mdl", "#", "#", 2, "", "-576,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_9roadsdwsidewalk1x16.mdl","#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_9roadsdwsidewalk1x16.mdl","#", "#", 2, "", "-1152,0,3.03125", "0,180,0"}) + asmlib.SettingsModelToName("SET",{1,4},{"sdw","_","walk","walk_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_10roadsdwsidewalk1x32.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwsidewalk/0_10roadsdwsidewalk1x32.mdl", "#", "#", 2, "", "-2304,0,3.03125", "0,180,0"}) + asmlib.DefaultType("StephenTechno's Buildings Cross") + asmlib.SettingsModelToName("SET",{1,3},{"sdwhwy_","_"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 1, "", "0,0,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 2, "", "-1632,1152,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 3, "", "-2304,1152,315.031616", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 4, "", "-2976,1152,3.03125", "0,90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 5, "", "-2976.007,-1151.975,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 6, "", "-2304,-1152,315.031616", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 7, "", "-1632,-1152,3.03125", "0,-90,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_0roadsdwhwy_ramp_1.mdl", "#", "#", 8, "", "-4608,0,3.03125", "0,180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 1, "", "0,-671.994,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 2, "", "0,0,315.031616", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 3, "", "0,671.995,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_2.mdl", "#", "#", 4, "", "-4608,0,315.031616", "0,-180,0"}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 1, "", "0,-671.994,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 2, "", "0,0,315.031616", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 3, "", "0,671.995,3.03125", ""}) + asmlib.InsertRecord({"models/buildingspack/roadsdwhighway/1_1roadsdwhwy_ramp_stop.mdl", "#", "#", 4, "", "-4160,0,15.202", "0,-180,0"}) + asmlib.DefaultType("Portal Tubes") + asmlib.InsertRecord({"models/props_bts/clear_tube_straight.mdl", "#", "#", 1, "", "0.009,0 , 63.896", "@-90, 0,180"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_straight.mdl", "#", "#", 2, "", "0.008,0.004,-63.897", "@ 90,180,180"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_90deg.mdl" , "#", "#", 1, "", "64.041,0.049, 0.131", ""}) + asmlib.InsertRecord({"models/props_bts/clear_tube_90deg.mdl" , "#", "#", 2, "", " 0.002,0.040,-63.904", "@90,0,180"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_broken.mdl", "#", "#", 1, "", "0.009,0 , 63.896", "@-90, 0,180"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_broken.mdl", "#", "#", 2, "", "0.008,0.004,-63.897", "@ 90,180,180"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_tjoint.mdl", "#", "#", 1, "", "-0.014,0.13,96.075", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_tjoint.mdl", "#", "#", 2, "", "-0.004,-95.763,0.016", "0,-90,-90"}) + asmlib.InsertRecord({"models/props_bts/clear_tube_tjoint.mdl", "#", "#", 3, "", "0,96,0.083", "0,90,90"}) + asmlib.DefaultType("Mr.Train's M-Gauge") + asmlib.SettingsModelToName("SET",nil,{"m_gauge","straight"},nil) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_32.mdl", "#", "#", 1, "", "16,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_32.mdl", "#", "#", 2, "", "-16,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_64.mdl", "#", "#", 1, "", "32,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_64.mdl", "#", "#", 2, "", "-32,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128.mdl", "#", "#", 1, "", "64,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128.mdl", "#", "#", 2, "", "-64,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_256.mdl", "#", "#", 1, "", "128,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_256.mdl", "#", "#", 2, "", "-128,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_512.mdl", "#", "#", 1, "", "256,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_512.mdl", "#", "#", 2, "", "-256,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_1024.mdl", "#", "#", 1, "", "512,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_1024.mdl", "#", "#", 2, "", "-512,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_2048.mdl", "#", "#", 1, "", "1024,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_2048.mdl", "#", "#", 2, "", "-1024,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_4096.mdl", "#", "#", 1, "", "2048,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_4096.mdl", "#", "#", 2, "", "-2048,0,0.016", "0,-180,0"}) + asmlib.SettingsModelToName("SET",nil,{"_cross","","m_gauge_","cross_"},nil) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 1, "", "64,0,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 2, "", "0,64,0.016", "0,90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 3, "", "-64,0,0.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_128_cross.mdl", "#", "#", 4, "", "0,-64,0.016", "0,-90,0"}) + asmlib.SettingsModelToName("SET",nil,{"m_gauge_",""},nil) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_256.mdl", "#", "#", 1, "", "134.497,121.499,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_256.mdl", "#", "#", 2, "", "-121.5,-134.5,0.016", "0,-90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512.mdl", "#", "#", 1, "", "262.5,249.5,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512.mdl", "#", "#", 2, "", "-249.5,-262.5,0.016", "0,-90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768.mdl", "#", "#", 1, "", "383.625,370.625,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768.mdl", "#", "#", 2, "", "-370.625,-383.625,0.016", "0,-90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024.mdl", "#", "#", 1, "", "518.5,505.5,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024.mdl", "#", "#", 2, "", "-505.5,-518.5,0.016", "0,-90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512_45.mdl", "#", "#", 1, "", "262.5,-249.497,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_512_45.mdl", "#", "#", 2, "", "-99.51,-99.507,0.015", "0,135,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768_45.mdl", "#", "#", 1, "", "383.625,370.625,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_768_45.mdl", "#", "#", 2, "", "-149.73,149.729,0.016", "0,-135,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024_45.mdl", "#", "#", 1, "", "518.5,505.5,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_left_1024_45.mdl", "#", "#", 2, "", "-205.608,205.607,0.014", "0,-135,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_256.mdl", "#", "#", 1, "", "134.5,-121.5,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_256.mdl", "#", "#", 2, "", "-121.5,134.5,0.016", "0,90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_512.mdl", "#", "#", 1, "", "262.5,-249.5,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_512.mdl", "#", "#", 2, "", "-249.5,262.5,0.016", "0,90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768.mdl", "#", "#", 1, "", "383.625,-370.625,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768.mdl", "#", "#", 2, "", "-370.625,383.625,0.016", "0,90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024.mdl", "#", "#", 1, "", "518.5,-505.5,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024.mdl", "#", "#", 2, "", "-505.5,518.5,0.016", "0,90,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768_45.mdl", "#", "#", 1, "", "383.625,-370.625,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_768_45.mdl", "#", "#", 2, "", "-149.758,-149.751,0.012", "0,135,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024_45.mdl", "#", "#", 1, "", "518.5,-505.498,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_right_1024_45.mdl", "#", "#", 2, "", "-205.621,-205.618,0.014", "0,135,0"}) + asmlib.SettingsModelToName("SET",nil,{"m_gauge_","","over",""},nil) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 1, "", "203,-75,-2.484", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 2, "", "203,75,-2.484", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 3, "", "-203,75,-2.484", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover.mdl", "#", "#", 4, "", "-203,-75,-2.484", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 1, "", "75,-75,-2.484", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 2, "", "203,75,-2.484", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 3, "", "-75,75,-2.484", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sl.mdl", "#", "#", 4, "", "-203,-75,-2.484", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 1, "", "203,-75,-2.484", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 2, "", "75,75,-2.484", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 3, "", "-203,75,-2.484", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_crossover_sr.mdl", "#", "#", 4, "", "-75,-75,-2.485", "0,180,0"}) + asmlib.SettingsModelToName("SET",nil,{"m_gauge_","","hand",""},nil) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_lefthand.mdl", "#", "#", 1, "", "0,-10,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_lefthand.mdl", "#", "#", 2, "", "-256,-10,0.016", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_lefthand.mdl", "#", "#", 3, "", "-384,-160,0.016", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_righthand.mdl", "#", "#", 1, "", "0,10,0.016", ""}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_righthand.mdl", "#", "#", 2, "", "-384,160,0.016", "0,180,0"}) + asmlib.InsertRecord({"models/props/m_gauge/track/m_gauge_switch_righthand.mdl", "#", "#", 3, "", "-256,10,0.016", "0,180,0"}) + asmlib.DefaultType("Mr.Train's G-Gauge") + asmlib.SettingsModelToName("SET",nil,{"g_gauge_track_",""},nil) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_32.mdl" , "#", "#", 1, "", " 16,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_32.mdl" , "#", "#", 2, "", "-16,0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_1.mdl", "#", "#", 1, "", " 16,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_1.mdl", "#", "#", 2, "", "-16,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_2.mdl", "#", "#", 1, "", " 16,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_2.mdl", "#", "#", 2, "", "-16,0,4.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_3.mdl", "#", "#", 1, "", " 16,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_ramp_3.mdl", "#", "#", 2, "", "-16,0,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_64.mdl" , "#", "#", 1, "", " 32,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_64.mdl" , "#", "#", 2, "", "-32,0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_128.mdl" , "#", "#", 1, "", " 64,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_128.mdl" , "#", "#", 2, "", "-64,0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 1, "", " 64, 0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 2, "", " 0 , 64,1.516", "0,90,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 3, "", "-64, 0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_cross_128.mdl", "#", "#", 4, "", " 0 ,-64,1.516", "0,-90,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_256.mdl" , "#", "#", 1, "", " 128, 0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_256.mdl" , "#", "#", 2, "", "-128, 0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_512.mdl" , "#", "#", 1, "", " 256, 0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_512.mdl" , "#", "#", 2, "", "-256, 0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_1024.mdl", "#", "#", 1, "", " 512, 0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_1024.mdl", "#", "#", 2, "", "-512, 0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_2048.mdl", "#", "#", 1, "", " 1024,0,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_straight_2048.mdl", "#", "#", 2, "", "-1024,0,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_right_22_5.mdl", "#", "#", 1, "", " 256,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_right_22_5.mdl", "#", "#", 2, "", "-256, 39,1.516" , "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_left_22_5.mdl" , "#", "#", 1, "", " 256, 39,1.516" , ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_s_left_22_5.mdl" , "#", "#", 2, "", "-256,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_1.mdl", "#", "#", 1, "", " 256,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_1.mdl", "#", "#", 2, "", " 0,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_1.mdl", "#", "#", 3, "", "-256, 39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_2.mdl", "#", "#", 1, "", " 256,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_2.mdl", "#", "#", 2, "", " 0,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_right_2.mdl", "#", "#", 3, "", "-256, 39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_1.mdl", "#", "#", 1, "", " 256,39 ,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_1.mdl", "#", "#", 2, "", " 0,39 ,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_1.mdl", "#", "#", 3, "", "-256,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_2.mdl", "#", "#", 1, "", " 256,39 ,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_2.mdl", "#", "#", 2, "", " 0,39 ,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_1_left_2.mdl", "#", "#", 3, "", "-256,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_1.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_right_2.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_1.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 1, "", "195.938,39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 2, "", "195.938,-39,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 3, "", "-195.937,-39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_switch_2_left_2.mdl", "#", "#", 4, "", "-195.937,39,1.516", "0,-180,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_22_5.mdl", "#", "#", 1, "", "263.75,-248.25,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_22_5.mdl", "#", "#", 2, "", "67.872,-209.299,1.516", "0,157.5,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_45.mdl" , "#", "#", 1, "", "263.75,-248.25,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_45.mdl" , "#", "#", 2, "", "-98.302,-98.302,1.516", "0,135,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_90.mdl" , "#", "#", 1, "", "263.75,-248.25,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_right_90.mdl" , "#", "#", 2, "", "-248.25,263.75,1.516", "0,90,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_22_5.mdl" , "#", "#", 1, "", "263.75, 248.25,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_22_5.mdl" , "#", "#", 2, "", "67.855,209.265,1.516", "0,-157.5,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_45.mdl" , "#", "#", 1, "", "263.75, 248.25,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_45.mdl" , "#", "#", 2, "", "-98.326,98.323,1.516", "0,-135,0"}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_90.mdl" , "#", "#", 1, "", "263.75, 248.25,1.516", ""}) + asmlib.InsertRecord({"models/props/g_gauge/track/g_gauge_track_turn_left_90.mdl" , "#", "#", 2, "", "-248.25,-263.75,1.516", "0,-90,0"}) + asmlib.DefaultType("Bobster's two feet rails") + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_16.mdl", "#", "#", 1, "0,-32,1.5", "8,0,3.017", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_16.mdl", "#", "#", 2, "0,32,1.5", "-8,0,3.017", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_32.mdl", "#", "#", 1, "0,-32,1.5", "16,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_32.mdl", "#", "#", 2, "0,32,1.5", "-16,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_64.mdl", "#", "#", 1, "", "32,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_64.mdl", "#", "#", 2, "", "-32,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_128.mdl", "#", "#", 1, "", "64,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_128.mdl", "#", "#", 2, "", "-64,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_left.mdl", "#", "#", 1, "", " 128,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_left.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_right.mdl", "#", "#", 1, "", " 128,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_bank_right.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_256.mdl", "#", "#", 1, "", "128,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_256.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_512.mdl", "#", "#", 1, "", "256,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_512.mdl", "#", "#", 2, "", "-256,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_1024.mdl", "#", "#", 1, "", "512,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_1024.mdl", "#", "#", 2, "", "-512,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_2048.mdl", "#", "#", 1, "", " 1024,0,3.017", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_2048.mdl", "#", "#", 2, "", "-1024,0,3.017", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_4096.mdl", "#", "#", 1, "", " 2048,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_4096.mdl", "#", "#", 2, "", "-2048,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_16.mdl", "#", "#", 1, "0,-32,1.5", "8,0,3.017", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_16.mdl", "#", "#", 2, "0,32,1.5", "-8,0,3.017", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_32.mdl", "#", "#", 1, "0,-32,1.5", "16,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_32.mdl", "#", "#", 2, "0,32,1.5", "-16,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_64.mdl", "#", "#", 1, "", "32,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_64.mdl", "#", "#", 2, "", "-32,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_128.mdl", "#", "#", 1, "", "64,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_128.mdl", "#", "#", 2, "", "-64,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_256.mdl", "#", "#", 1, "", "128,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_256.mdl", "#", "#", 2, "", "-128,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_512.mdl", "#", "#", 1, "", "256,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_512.mdl", "#", "#", 2, "", "-256,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_1024.mdl", "#", "#", 1, "", "512,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/straight_rack_1024.mdl", "#", "#", 2, "", "-512,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_512.mdl", "#", "#", 2, "", "124.736,-24.811,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_512.mdl", "#", "#", 2, "", "124.735,24.812,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_1024.mdl", "#", "#", 2, "", "249.471,-49.623,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_1024.mdl", "#", "#", 2, "", "249.471,49.621,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_right_2048.mdl", "#", "#", 2, "", "498.945,-99.237,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_225_left_2048.mdl", "#", "#", 2, "", "498.941,99.246,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_512.mdl", "#", "#", 2, "", "230.481,95.468,3.016", "0,45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_512.mdl", "#", "#", 2, "", "230.481,-95.469,3.016", "0,-45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_1024.mdl", "#", "#", 2, "", "460.963,-190.936,3.016", "0,-45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_1024.mdl", "#", "#", 2, "", "460.962,190.936,3.016", "0,45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_512.mdl", "#", "#", 2, "", "325.949,-325.949,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_512.mdl", "#", "#", 2, "", "325.949,325.95,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_1024.mdl", "#", "#", 2, "", "651.898,-651.899,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_1024.mdl", "#", "#", 2, "", "651.898,651.898,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_right_2048.mdl", "#", "#", 2, "", "1303.797,-1303.797,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_90_left_2048.mdl", "#", "#", 2, "", "1303.797,1303.797,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_right_2048.mdl", "#", "#", 2, "", "921.925,-381.872,3.016", "0,-45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_45_left_2048.mdl", "#", "#", 2, "", "921.925,381.872,3.016", "0,45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_512.mdl" , "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_512.mdl" , "#", "#", 2, "", "325.949,-325.949,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_1024.mdl", "#", "#", 2, "", "651.926,-651.874,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_right_2048.mdl", "#", "#", 2, "", "1303.798,-1303.797,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_512.mdl" , "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_512.mdl" , "#", "#", 2, "", "325.949,325.949,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_1024.mdl", "#", "#", 2, "", "651.899,651.898,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_2048.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_bank_90_left_2048.mdl", "#", "#", 2, "", "1303.797,1303.797,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 1, "", "83,0,3.015", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 2, "", "0.003,83,3.015", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 3, "", "-83,0.003,3.015", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/misc/cross.mdl", "#", "#", 4, "", "0,-83,3.015", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_switched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_switched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_switched.mdl", "#", "#", 3, "", "262.471,49.622,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_unswitched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_unswitched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_left_unswitched.mdl", "#", "#", 3, "", "262.471,49.622,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_switched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_switched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_switched.mdl", "#", "#", 3, "", "262.472,-49.622,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_unswitched.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_unswitched.mdl", "#", "#", 2, "", "256,0,3.016", ""}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/switches/switch_right_unswitched.mdl", "#", "#", 3, "", "262.472,-49.622,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_512.mdl", "#", "#", 2, "", "124.736,-24.811,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_512.mdl", "#", "#", 2, "", "124.735,24.812,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_right_1024.mdl", "#", "#", 2, "", "249.471,-49.623,3.016", "0,-22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_225_left_1024.mdl", "#", "#", 2, "", "249.471,49.621,3.016", "0,22.5,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_512.mdl", "#", "#", 2, "", "230.481,95.468,3.016", "0,45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_512.mdl", "#", "#", 2, "", "230.481,-95.469,3.016", "0,-45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_right_1024.mdl", "#", "#", 2, "", "460.963,-190.936,3.016", "0,-45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_45_left_1024.mdl", "#", "#", 2, "", "460.962,190.936,3.016", "0,45,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_512.mdl", "#", "#", 2, "", "325.949,-325.949,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_512.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_512.mdl", "#", "#", 2, "", "325.949,325.95,3.016", "0,90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_right_1024.mdl", "#", "#", 2, "", "651.898,-651.899,3.016", "0,-90,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_1024.mdl", "#", "#", 1, "", "0,0,3.016", "0,180,0"}) + asmlib.InsertRecord({"models/bobsters_trains/rails/2ft/curves/curve_rack_90_left_1024.mdl", "#", "#", 2, "", "651.898,651.898,3.016", "0,90,0"}) + asmlib.DefaultType("Ron's 2ft track pack") + asmlib.InsertRecord({"models/ron/2ft/straight/straight_32.mdl" , "#", "#", 1, "", " 16 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_32.mdl" , "#", "#", 2, "", "-16 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_64.mdl" , "#", "#", 1, "", " 32 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_64.mdl" , "#", "#", 2, "", "-32 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_128.mdl" , "#", "#", 1, "", " 64 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_128.mdl" , "#", "#", 2, "", "-64 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_256.mdl" , "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_256.mdl" , "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/rerailer.mdl" , "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/misc/rerailer.mdl" , "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_512.mdl" , "#", "#", 1, "", " 256,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_512.mdl" , "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_1.mdl", "#", "#", 2, "", "-391.846,-77.978,6.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_2.mdl", "#", "#", 2, "", "-439.352,-87.36,6.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_3.mdl", "#", "#", 2, "", "-486.814,-96.707,6.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_left_4.mdl", "#", "#", 2, "", "-534.192,-106.258,6.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_1.mdl", "#", "#", 2, "", "-391.846,77.978,6.016", "0,157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_2.mdl", "#", "#", 2, "", "-439.352,87.36,6.016", "0,157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_3.mdl", "#", "#", 2, "", "-486.814,96.707,6.016", "0,157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_225_right_4.mdl", "#", "#", 2, "", "-534.192,106.258,6.016", "0,157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_1.mdl", "#", "#", 2, "", "-724.122,-299.876,6.016", "0,-135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_2.mdl", "#", "#", 2, "", "-811.77,-336.23,6.016", "0,-135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_3.mdl", "#", "#", 2, "", "-899.503,-372.497,6.016", "0,-135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_left_4.mdl", "#", "#", 2, "", "-987.115,-408.885,6.016", "0,-135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_1.mdl", "#", "#", 2, "", "-724.122,299.876,6.016", "0,135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_2.mdl", "#", "#", 2, "", "-811.77,336.23,6.016", "0,135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_3.mdl", "#", "#", 2, "", "-899.503,372.497,6.016", "0,135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_45_right_4.mdl", "#", "#", 2, "", "-987.115,408.885,6.016", "0,135,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_1.mdl", "#", "#", 2, "", "-1024,-1024,6.016", "0,-90,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_2.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_2.mdl", "#", "#", 2, "", "-1148,-1148,6.016", "0,-90,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_3.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_3.mdl", "#", "#", 2, "", "-1272,-1272,6.016", "0,-90,0"}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_4.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/curves/curve_90_4.mdl", "#", "#", 2, "", "-1396,-1396,6.016", "0,-90,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/left_switched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/junctions/left_switched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/left_switched_1.mdl", "#", "#", 3, "", "-391.842,-77.994,6.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/left_unswitched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/junctions/left_unswitched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/left_unswitched_1.mdl", "#", "#", 3, "", "-391.842,-77.994,6.016", "0,-157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/right_switched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/junctions/right_switched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/right_switched_1.mdl", "#", "#", 3, "", "-391.842,77.994,6.016", "0,157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/right_unswitched_1.mdl", "#", "#", 1, "", "0,0,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/junctions/right_unswitched_1.mdl", "#", "#", 2, "", "-384,0,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/junctions/right_unswitched_1.mdl", "#", "#", 3, "", "-391.842,77.994,6.016", "0,157.5,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 1, "", " 0 , 62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_switched.mdl" , "#", "#", 4, "", "-320,-62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 1, "", " 0 , 62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_left_unswitched.mdl" , "#", "#", 4, "", "-320,-62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 1, "", " 0 ,-62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_switched.mdl" , "#", "#", 4, "", "-320, 62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 1, "", " 0 ,-62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/sjunctions/s_junction_right_unswitched.mdl", "#", "#", 4, "", "-320, 62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_switched.mdl" , "#", "#", 1, "", "0 , 62,6.016", "0,0,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_switched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_switched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_unswitched.mdl" , "#", "#", 1, "", "0 , 62,6.016", "0,0,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_unswitched.mdl" , "#", "#", 2, "", "-384, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_left_unswitched.mdl" , "#", "#", 3, "", "-704,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_switched.mdl" , "#", "#", 1, "", "0 ,-62,6.016", "0,0,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_switched.mdl" , "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_switched.mdl" , "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_unswitched.mdl", "#", "#", 1, "", "0 ,-62,6.016", "0,0,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_unswitched.mdl", "#", "#", 2, "", "-384,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/njunctions/n_junction_right_unswitched.mdl", "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/buffer.mdl", "#", "#", 1, "", "64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_end.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_end.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_128.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_128.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_256.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_256.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_512.mdl", "#", "#", 1, "", " 256,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_512.mdl", "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/bridges/bridge_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512.mdl", "#", "#", 1, "", " 256,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512.mdl", "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/passenger_crossing.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/misc/passenger_crossing.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/shed_open_both.mdl" , "#", "#", 1, "", "-128,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/shed_open_left.mdl" , "#", "#", 1, "", "-128,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/shed_open_right.mdl", "#", "#", 1, "", "-128,0,3.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 1, "", " 64, 0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 2, "", " 0, 64,5.016", "0,90,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 3, "", "-64, 0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/90crossing.mdl", "#", "#", 4, "", " 0,-64,5.016", "0,-90,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_1.mdl" , "#", "#", 2, "", " -32,0, 8.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_1.mdl" , "#", "#", 2, "", " -64,0,10.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_1.mdl" , "#", "#", 2, "", " -128,0,14.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_1.mdl" , "#", "#", 2, "", " -256,0,22.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_1.mdl" , "#", "#", 1, "", " 0,0, 6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_1.mdl" , "#", "#", 2, "", " -512,0,38.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_1.mdl", "#", "#", 1, "", " 0,0, 6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_1.mdl", "#", "#", 2, "", "-1024,0,70.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_1.mdl", "#", "#", 1, "", " 0,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_1.mdl", "#", "#", 2, "", "-64,0,8.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_1.mdl" , "#", "#", 1, "", " 64,0,2.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_1.mdl" , "#", "#", 2, "", " 0,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start.mdl", "#", "#", 1, "", " 64,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start.mdl", "#", "#", 2, "", "-64,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp.mdl", "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp.mdl", "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 1, "", " 16,-62,5.016", "0,0,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 2, "", " 16, 62,5.016", "0,0,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 3, "", "-16, 62,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/straight/straight_32_2tracks.mdl", "#", "#", 4, "", "-16,-62,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 1, "", " 0,-62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 2, "", " 0, 62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_switched.mdl" , "#", "#", 4, "", "-704,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 1, "", " 0,-62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 2, "", " 0, 62,6.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 3, "", "-704, 62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/xjunctions/x_junction_unswitched.mdl", "#", "#", 4, "", "-704,-62,6.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_32.mdl" , "#", "#", 1, "", " 16 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_32.mdl" , "#", "#", 2, "", "-16 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_64.mdl" , "#", "#", 1, "", " 32 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_64.mdl" , "#", "#", 2, "", "-32 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_128.mdl" , "#", "#", 1, "", " 64 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_128.mdl" , "#", "#", 2, "", "-64 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_bridge.mdl" , "#", "#", 1, "", " 64 ,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_bridge.mdl" , "#", "#", 2, "", "-64 ,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_256.mdl" , "#", "#", 1, "", " 128,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_256.mdl" , "#", "#", 2, "", "-128,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_512.mdl" , "#", "#", 1, "", " 256,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_512.mdl" , "#", "#", 2, "", "-256,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_1024.mdl", "#", "#", 1, "", " 512,0,5.016", ""}) + asmlib.InsertRecord({"models/ron/2ft/embankment/embankment_1024.mdl", "#", "#", 2, "", "-512,0,5.016", "0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/buffer_2.mdl","#","Buffer SH2",1,"","32,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/misc/buffer_2.mdl","#","Buffer SH2",2,"","-32,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",1,"","512,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",2,"","512,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",3,"","-512,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_2_track.mdl","#","#",4,"","-512,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",1,"","512,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",2,"","512,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",3,"","-512,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof_2_track.mdl","#","#",4,"","-512,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof.mdl","#","#",1,"","512,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_1024_roof.mdl","#","#",2,"","-512,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof.mdl","#","#",1,"","64,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench.mdl","#","#",1,"","64,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_bench.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof.mdl","#","#",1,"","64,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_128_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",1,"","128,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",2,"","128,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",1,"","128,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",2,"","128,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof.mdl","#","#",1,"","128,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_256_roof.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",1,"","256,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",2,"","256,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",3,"","-256,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_2_track.mdl","#","#",4,"","-256,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",1,"","256,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",2,"","256,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",3,"","-256,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof_2_track.mdl","#","#",4,"","-256,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof.mdl","#","#",1,"","256,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_512_roof.mdl","#","#",2,"","-256,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",1,"","128,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",2,"","128,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",1,"","128,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",2,"","128,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof.mdl","#","#",1,"","128,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_ramp_roof.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof.mdl","#","#",1,"","64,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_end_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",1,"","128,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",2,"","128,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",1,"","128,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",2,"","128,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",3,"","-128,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof_2_track.mdl","#","#",4,"","-128,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof.mdl","#","#",1,"","128,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_ramp_roof.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",1,"","64,-124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",2,"","64,124,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",3,"","-64,124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof_2_track.mdl","#","#",4,"","-64,-124,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof.mdl","#","#",1,"","64,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/station/platform_start_roof.mdl","#","#",2,"","-64,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_middle.mdl","#","#",1,"","128,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_middle.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_side.mdl","#","#",1,"","128,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing_side.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing.mdl","#","#",1,"","128,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/road_crossings/road_crossing.mdl","#","#",2,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/shed.mdl","#","#",1,"","-128,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-1024,0,70.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 1024 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_1024_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 1024 Embankment Sided Mirrored 1",2,"","-1024,0,70.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-128,0,14.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 128 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_128_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 128 Embankment Sided Mirrored 1",2,"","-128,0,14.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-256,0,22.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 256 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_256_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 256 Embankment Sided Mirrored 1",2,"","-256,0,22.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-32,0,8.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 32 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_32_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 32 Embankment Sided Mirrored 1",2,"","-32,0,8.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-512,0,38.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 512 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_512_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 512 Embankment Sided Mirrored 1",2,"","-512,0,38.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-64,0,10.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 64 Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_64_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp 64 Embankment Sided Mirrored 1",2,"","-64,0,10.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","64,0,3.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","0,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp End Embankment Sided Mirrored 1",1,"","64,0,3.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_end_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp End Embankment Sided Mirrored 1",2,"","0,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_1.mdl","Ron's 2ft track pack","#",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_1.mdl","Ron's 2ft track pack","#",2,"","-64,0,9.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp Start Embankment Sided Mirrored 1",1,"","0,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/ramps/ramp_start_embankment_sided_m_1.mdl","Ron's 2ft track pack","Ramp Start Embankment Sided Mirrored 1",2,"","-64,0,9.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/misc/track_damaged.mdl","Ron's 2ft track pack","#",1,""," 64,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/misc/track_damaged.mdl","Ron's 2ft track pack","#",2,"","-64,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_1024.mdl","Ron's 2ft track pack","#",1,""," 512,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_1024.mdl","Ron's 2ft track pack","#",2,"","-512,0,6.016","0,-180,0"}) + asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_512.mdl","Ron's 2ft track pack","#",1,""," 256,0,6.016",""}) + asmlib.InsertRecord({"models/ron/2ft/viaduct/viaduct_512.mdl","Ron's 2ft track pack","#",2,"","-256,0,6.016","0,-180,0"}) + asmlib.DefaultType("PHX Tubes Miscellaneous") --- Tubes Metal --- + asmlib.InsertRecord({"models/props_phx/construct/metal_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve2x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve2x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180x2.mdl", "#", "#", 1, "", "0.02,0,95.081", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve180x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_plate_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + --- Tubes Glass --- + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/glass/glass_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + --- Tubes Wireframe --- + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/metal_wire_angle360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + --- Tubes Wireframe Glass --- + asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/windows/window_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + --- Tubes Wood --- + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle90.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle90.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle180.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle180.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle360.mdl", "#", "#", 1, "", "-0.001,0,3.258", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_angle360.mdl", "#", "#", 2, "", "-0.001,0,0.255", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_dome90.mdl", "#", "#", 1, "", "0,0,0.025", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_dome180.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_dome360.mdl", "#", "#", 1, "", "0,0,0.025","@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x1.mdl", "#", "#", 1, "", "0.02,0,47.541", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x1.mdl", "#", "#", 2, "", "0.02,0, 0.095", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x2.mdl", "#", "#", 1, "", "0.02,0,95.083", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve90x2.mdl", "#", "#", 2, "", "0.02,0, 0.183", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x2.mdl", "#", "#", 1, "", "0.02,0,95.081", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve180x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_curve360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + --- Tubes Wireframe Wood --- + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x1.mdl", "#", "#", 1, "", "31.246,33.667,47.541", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x1.mdl", "#", "#", 2, "", "31.222,33.69,0.095", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x2.mdl", "#", "#", 1, "", "31.246,33.667,95.083", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle90x2.mdl", "#", "#", 2, "", "31.241,33.671,0.183", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x1.mdl", "#", "#", 1, "", "31.222,33.667,47.543", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x1.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x2.mdl", "#", "#", 1, "", "31.222,33.668,94.993", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle180x2.mdl", "#", "#", 2, "", "31.222,33.667,0.093", "@90,-180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x1.mdl", "#", "#", 1, "", "0.02,0,47.538", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x1.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x2.mdl", "#", "#", 1, "", "0.02,0,95.076", "@-90,0,180"}) + asmlib.InsertRecord({"models/props_phx/construct/wood/wood_wire_angle360x2.mdl", "#", "#", 2, "", "0.02,0,0.089", "@90,180,180"}) + asmlib.DefaultType("PHX Tubes Plastic") + asmlib.InsertRecord({"models/hunter/misc/platehole1x1a.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1a.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1c.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1c.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1d.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole1x1d.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1.mdl" , "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1b.mdl", "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1c.mdl", "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1d.mdl", "#", "#", 1, "", "0,0,47.450", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x1d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2.mdl" , "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2b.mdl", "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2c.mdl", "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2d.mdl", "#", "#", 1, "", "0,0,94.900", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x2d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3.mdl" , "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3b.mdl", "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3c.mdl", "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3d.mdl", "#", "#", 1, "", "0,0,142.35", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x3d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4.mdl" , "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4b.mdl", "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4c.mdl", "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4d.mdl", "#", "#", 1, "", "0,0,189.80", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x4d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5.mdl" , "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5b.mdl", "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5c.mdl", "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5d.mdl", "#", "#", 1, "", "0,0,237.25", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x5d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6.mdl" , "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6.mdl" , "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6b.mdl", "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6c.mdl", "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6d.mdl", "#", "#", 1, "", "0,0,284.70", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x6d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8b.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8b.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8c.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8c.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8d.mdl", "#", "#", 1, "", "0,0,379.60", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube1x1x8d.mdl", "#", "#", 2, "", "" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x1x90.mdl", "#", "#", 1, "", "0,0,0", "@90,-180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x1x90.mdl", "#", "#", 2, "", "0,23.725,23.725", " 0, 90, 90"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2c.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2c.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2d.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle2x2d.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole1x1.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole1x1.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole1x2.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole1x2.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole2x2.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole2x2.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole3.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/plates/platehole3.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2a.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2b.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2c.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2d.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2e.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2x45.mdl", "#", "#", 1, "0, -47.45, 0", "", ""}) + asmlib.InsertRecord({"models/hunter/misc/shell2x2x45.mdl", "#", "#", 2, "-33.552, -33.552, 0", "", "0,135,0"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025.mdl" , "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025.mdl" , "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025b.mdl", "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025b.mdl", "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025c.mdl", "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025c.mdl", "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025d.mdl", "#", "#", 1, "", "0,0, 5.93125", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x025d.mdl", "#", "#", 2, "", "0,0,-5.93125", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05b.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05b.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05c.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05c.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05d.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x05d.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1.mdl" , "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1.mdl" , "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1b.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1b.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1c.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1c.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1d.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x1d.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2.mdl" , "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2.mdl" , "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2b.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2b.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2c.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2c.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2d.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x2d.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4.mdl" , "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4.mdl" , "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4b.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4b.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4c.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4c.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4d.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x4d.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8.mdl" , "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8.mdl" , "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8b.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8b.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8c.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8c.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8d.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x8d.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x16d.mdl", "#", "#", 1, "", "0,0,711.75", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x16d.mdl", "#", "#", 2, "", "0,0,-47.45", "@ 90,-180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 1, "", "0,0,47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 2, "", "0,-47.45,0", "0,-90,-90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 3, "", "0,0,-47.45", "@ 90,0,0"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2x+.mdl", "#", "#", 4, "", "0,47.45,0" , "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xt.mdl", "#", "#", 1, "", "0,0,-47.45", "@ 90,0,0"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xt.mdl", "#", "#", 2, "", "0,-47.45,0", "0,-90,-90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xt.mdl", "#", "#", 3, "", "0,47.45,0" , "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xta.mdl", "#", "#", 1, "", "0,0,-23.725", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xta.mdl", "#", "#", 2, "", "0,47.45,23.725", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xta.mdl", "#", "#", 3, "", "0,-47.45,23.725", "0,-90,-90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xtb.mdl", "#", "#", 1, "", "0,-23.725,0", "0,-90,-90"}) + asmlib.InsertRecord({"models/hunter/tubes/tube2x2xtb.mdl", "#", "#", 2, "", "0,23.725,-47.45", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90a.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90a.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90outer.mdl", "#", "#", 1, "", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90outer.mdl", "#", "#", 2, "", "0,47.45,47.45", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90square.mdl", "#", "#", 1, "", "0,0,-47.451", "@90,-180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend2x2x90square.mdl", "#", "#", 2, "", "0,47.417,0", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90b.mdl", "#", "#", 1, "", "-47.45,0,47.45", "0,-180,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend1x2x90b.mdl", "#", "#", 2, "", "", "@90,-90,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare.mdl", "#", "#", 1, "", "0,0,23.725", "@-90,90,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare.mdl", "#", "#", 2, "", "-47.45,0,-23.724", "0,-180,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare2.mdl", "#", "#", 1, "", "0,0,23.725", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendinsidesquare2.mdl", "#", "#", 2, "", "0,-47.45,-23.724", "0,-90,-90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare.mdl", "#", "#", 1, "0,0,47.45", "", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare.mdl", "#", "#", 2, "0,-47.45,0", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare2.mdl", "#", "#", 1, "0,0,47.45", "", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebendoutsidesquare2.mdl", "#", "#", 2, "0,-47.45,0", "", "@90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4c.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4c.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4d.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/circle4x4d.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4b.mdl", "#", "#", 1, "", "0,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4b.mdl", "#", "#", 2, "", "0,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4c.mdl", "#", "#", 1, "", "47.45,0, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4c.mdl", "#", "#", 2, "", "47.45,0,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4d.mdl", "#", "#", 1, "", "47.45,47.45, 1.5", "@-90, 0,180"}) + asmlib.InsertRecord({"models/hunter/misc/platehole4x4d.mdl", "#", "#", 2, "", "47.45,47.45,-1.5", "@ 90,180,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1to2x2.mdl", "#", "#", 1, "", "" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1to2x2.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025b.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025b.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025c.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025c.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025d.mdl" , "#", "#", 1, "", "0,0,11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x025d.mdl" , "#", "#", 2, "", "0,0,", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05b.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05b.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05c.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05c.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05d.mdl" , "#", "#", 1, "", "0,0, 11.8625", "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x05d.mdl" , "#", "#", 2, "", "0,0,-11.8625", "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1.mdl" , "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1.mdl" , "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1b.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1b.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1c.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1c.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1d.mdl", "#", "#", 1, "", "0,0, 23.726" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x1d.mdl", "#", "#", 2, "", "0,0,-23.726" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2.mdl" , "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2.mdl" , "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2b.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2b.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2c.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2c.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2d.mdl", "#", "#", 1, "", "0,0, 47.45" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x2d.mdl", "#", "#", 2, "", "0,0,-47.45" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3.mdl" , "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3.mdl" , "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3b.mdl", "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3b.mdl", "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3c.mdl", "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3c.mdl", "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3d.mdl", "#", "#", 1, "", "0,0, 71.175" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x3d.mdl", "#", "#", 2, "", "0,0,-71.175" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4.mdl" , "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4.mdl" , "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4b.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4b.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4c.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4c.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4d.mdl", "#", "#", 1, "", "0,0, 94.9" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x4d.mdl", "#", "#", 2, "", "0,0,-94.9" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5.mdl" , "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5.mdl" , "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5b.mdl", "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5b.mdl", "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5c.mdl", "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5c.mdl", "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5d.mdl", "#", "#", 1, "", "0,0, 118.625" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x5d.mdl", "#", "#", 2, "", "0,0,-118.625" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6.mdl" , "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6.mdl" , "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6b.mdl", "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6b.mdl", "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6c.mdl", "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6c.mdl", "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6d.mdl", "#", "#", 1, "", "0,0, 142.35" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x6d.mdl", "#", "#", 2, "", "0,0,-142.35" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8.mdl" , "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8.mdl" , "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8b.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8b.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8c.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8c.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8d.mdl", "#", "#", 1, "", "0,0, 189.8" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x8d.mdl", "#", "#", 2, "", "0,0,-189.8" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16.mdl" , "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16.mdl" , "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16b.mdl", "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16b.mdl", "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16c.mdl", "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16c.mdl", "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16d.mdl", "#", "#", 1, "", "0,0, 379.6" , "@-90,0,180"}) + asmlib.InsertRecord({"models/hunter/tubes/tube4x4x16d.mdl", "#", "#", 2, "", "0,0,-379.6" , "@ 90,0, 0 "}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend4x4x90.mdl", "#", "#", 1, "", "0,94.9,0", "0,90,90"}) + asmlib.InsertRecord({"models/hunter/tubes/tubebend4x4x90.mdl", "#", "#", 2, "", "0,0,-94.9", "@90,-180,180"}) +end + +if(fileExists(gsFullDSV.."PHYSPROPERTIES.txt", "DATA")) then + asmlib.LogInstance(gsToolNameU..": DB PHYSPROPERTIES from DSV") + asmlib.ImportDSV("PHYSPROPERTIES","\t",true) +else --- Valve's physical properties: https://developer.valvesoftware.com/wiki/Material_surface_properties + asmlib.LogInstance(gsToolNameU..": DB PHYSPROPERTIES from LUA") + asmlib.DefaultTable("PHYSPROPERTIES") + asmlib.DefaultType("Special") + asmlib.InsertRecord({"#", 1 , "default" }) + asmlib.InsertRecord({"#", 2 , "default_silent" }) + asmlib.InsertRecord({"#", 3 , "floatingstandable" }) + asmlib.InsertRecord({"#", 4 , "item" }) + asmlib.InsertRecord({"#", 5 , "ladder" }) + asmlib.InsertRecord({"#", 6 , "no_decal" }) + asmlib.InsertRecord({"#", 7 , "player" }) + asmlib.InsertRecord({"#", 8 , "player_control_clip" }) + asmlib.DefaultType("Concrete") + asmlib.InsertRecord({"#", 1 , "brick" }) + asmlib.InsertRecord({"#", 2 , "concrete" }) + asmlib.InsertRecord({"#", 3 , "concrete_block" }) + asmlib.InsertRecord({"#", 4 , "gravel" }) + asmlib.InsertRecord({"#", 5 , "rock" }) + asmlib.DefaultType("Metal") + asmlib.InsertRecord({"#", 1 , "canister" }) + asmlib.InsertRecord({"#", 2 , "chain" }) + asmlib.InsertRecord({"#", 3 , "chainlink" }) + asmlib.InsertRecord({"#", 4 , "combine_metal" }) + asmlib.InsertRecord({"#", 5 , "crowbar" }) + asmlib.InsertRecord({"#", 6 , "floating_metal_barrel" }) + asmlib.InsertRecord({"#", 7 , "grenade" }) + asmlib.InsertRecord({"#", 8 , "gunship" }) + asmlib.InsertRecord({"#", 9 , "metal" }) + asmlib.InsertRecord({"#", 10, "metal_barrel" }) + asmlib.InsertRecord({"#", 11, "metal_bouncy" }) + asmlib.InsertRecord({"#", 12, "Metal_Box" }) + asmlib.InsertRecord({"#", 13, "metal_seafloorcar" }) + asmlib.InsertRecord({"#", 14, "metalgrate" }) + asmlib.InsertRecord({"#", 15, "metalpanel" }) + asmlib.InsertRecord({"#", 16, "metalvent" }) + asmlib.InsertRecord({"#", 17, "metalvehicle" }) + asmlib.InsertRecord({"#", 18, "paintcan" }) + asmlib.InsertRecord({"#", 19, "popcan" }) + asmlib.InsertRecord({"#", 20, "roller" }) + asmlib.InsertRecord({"#", 21, "slipperymetal" }) + asmlib.InsertRecord({"#", 22, "solidmetal" }) + asmlib.InsertRecord({"#", 23, "strider" }) + asmlib.InsertRecord({"#", 24, "weapon" }) + asmlib.DefaultType("Wood") + asmlib.InsertRecord({"#", 1 , "wood" }) + asmlib.InsertRecord({"#", 2 , "Wood_Box" }) + asmlib.InsertRecord({"#", 3 , "Wood_Furniture"}) + asmlib.InsertRecord({"#", 4 , "Wood_Plank" }) + asmlib.InsertRecord({"#", 5 , "Wood_Panel" }) + asmlib.InsertRecord({"#", 6 , "Wood_Solid" }) + asmlib.DefaultType("Terrain") + asmlib.InsertRecord({"#", 1 , "dirt" }) + asmlib.InsertRecord({"#", 2 , "grass" }) + asmlib.InsertRecord({"#", 3 , "gravel" }) + asmlib.InsertRecord({"#", 4 , "mud" }) + asmlib.InsertRecord({"#", 5 , "quicksand" }) + asmlib.InsertRecord({"#", 6 , "sand" }) + asmlib.InsertRecord({"#", 7 , "slipperyslime" }) + asmlib.InsertRecord({"#", 8 , "antlionsand" }) + asmlib.DefaultType("Liquid") + asmlib.InsertRecord({"#", 1 , "slime" }) + asmlib.InsertRecord({"#", 2 , "water" }) + asmlib.InsertRecord({"#", 3 , "wade" }) + asmlib.DefaultType("Frozen") + asmlib.InsertRecord({"#", 1 , "snow" }) + asmlib.InsertRecord({"#", 2 , "ice" }) + asmlib.InsertRecord({"#", 3 , "gmod_ice" }) + asmlib.DefaultType("Miscellaneous") + asmlib.InsertRecord({"#", 1 , "carpet" }) + asmlib.InsertRecord({"#", 2 , "ceiling_tile" }) + asmlib.InsertRecord({"#", 3 , "computer" }) + asmlib.InsertRecord({"#", 4 , "pottery" }) + asmlib.DefaultType("Organic") + asmlib.InsertRecord({"#", 1 , "alienflesh" }) + asmlib.InsertRecord({"#", 2 , "antlion" }) + asmlib.InsertRecord({"#", 3 , "armorflesh" }) + asmlib.InsertRecord({"#", 4 , "bloodyflesh" }) + asmlib.InsertRecord({"#", 5 , "flesh" }) + asmlib.InsertRecord({"#", 6 , "foliage" }) + asmlib.InsertRecord({"#", 7 , "watermelon" }) + asmlib.InsertRecord({"#", 8 , "zombieflesh" }) + asmlib.DefaultType("Manufactured") + asmlib.InsertRecord({"#", 1 , "jeeptire" }) + asmlib.InsertRecord({"#", 2 , "jalopytire" }) + asmlib.InsertRecord({"#", 3 , "rubber" }) + asmlib.InsertRecord({"#", 4 , "rubbertire" }) + asmlib.InsertRecord({"#", 5 , "slidingrubbertire" }) + asmlib.InsertRecord({"#", 6 , "slidingrubbertire_front" }) + asmlib.InsertRecord({"#", 7 , "slidingrubbertire_rear" }) + asmlib.InsertRecord({"#", 8 , "brakingrubbertire" }) + asmlib.InsertRecord({"#", 9 , "tile" }) + asmlib.InsertRecord({"#", 10, "paper" }) + asmlib.InsertRecord({"#", 11, "papercup" }) + asmlib.InsertRecord({"#", 12, "cardboard" }) + asmlib.InsertRecord({"#", 13, "plaster" }) + asmlib.InsertRecord({"#", 14, "plastic_barrel" }) + asmlib.InsertRecord({"#", 15, "plastic_barrel_buoyant" }) + asmlib.InsertRecord({"#", 16, "Plastic_Box" }) + asmlib.InsertRecord({"#", 17, "plastic" }) + asmlib.InsertRecord({"#", 18, "glass" }) + asmlib.InsertRecord({"#", 19, "glassbottle" }) + asmlib.InsertRecord({"#", 20, "combine_glass" }) +end + +if(fileExists(gsFullDSV.."ADDITIONS.txt", "DATA")) then + asmlib.LogInstance(gsToolNameU..": DB ADDITIONS from DSV") + asmlib.ImportDSV("ADDITIONS","\t",true) +else + asmlib.LogInstance(gsToolNameU..": DB ADDITIONS from LUA") + asmlib.DefaultTable("ADDITIONS") + --- Shinji's Switchers --- + asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl","models/shinji85/train/sw_lever.mdl" ,"buttonswitch",1,"-100,125,0","",-1,-1,-1,-1,-1,-1}) + asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl","models/shinji85/train/rail_r_switcher1.mdl","prop_dynamic",2,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,1,1,SOLID_VPHYSICS}) + asmlib.InsertRecord({"models/shinji85/train/rail_r_switch.mdl","models/shinji85/train/rail_r_switcher2.mdl","prop_dynamic",3,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,-1,-1,SOLID_NONE}) + asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl","models/shinji85/train/sw_lever.mdl" ,"buttonswitch",1,"-100,-125,0","0,180,0",-1,-1,-1,-1,-1,-1}) + asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl","models/shinji85/train/rail_l_switcher1.mdl","prop_dynamic",2,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,1,1,SOLID_VPHYSICS}) + asmlib.InsertRecord({"models/shinji85/train/rail_l_switch.mdl","models/shinji85/train/rail_l_switcher2.mdl","prop_dynamic",3,"","",MOVETYPE_VPHYSICS,SOLID_VPHYSICS,-1,-1,-1,SOLID_NONE}) +end + +-------- CACHE PANEL STUFF --------- +asmlib.CacheQueryPanel() +asmlib.CacheQueryProperty() +asmlib.PrintInstance("Ver."..asmlib.GetOpVar("TOOL_VERSION")) +collectgarbage() diff --git a/lua/entities/gmod_wire_expression2/core/custom/trackasmlib_wire.lua b/lua/entities/gmod_wire_expression2/core/custom/trackasmlib_wire.lua index 6cb14ff..485e5ec 100644 --- a/lua/entities/gmod_wire_expression2/core/custom/trackasmlib_wire.lua +++ b/lua/entities/gmod_wire_expression2/core/custom/trackasmlib_wire.lua @@ -1,324 +1,324 @@ ------ Localizing the asmlib module -local asmlib = trackasmlib ------ Localizing needed functions -local Vector = Vector -local Angle = Angle -local Color = Color -local tonumber = tonumber -local tostring = tostring -local stringSub = string and string.sub -local stringUpper = string and string.upper -local stringLen = string and string.len - ------ Get extension enabled flag -local enFlag = ((tonumber(asmlib.GetCoVar("enwiremod","INT")) or 0) ~= 0) and true or false -local anyTrue = 1 -local anyFalse = 0 ---------- Pieces ---------- - -__e2setcost(50) -e2function string entity:trackasmlibGenActivePointINS(entity ucsEnt, string sType, string sName, number nPoint, string sP) - if(not (this and this:IsValid() and enFlag)) then return "" end - if(not (ucsEnt and ucsEnt:IsValid())) then return "" end - local C1, C2, C3 = asmlib.GetIndexes("V") - local ucsPos = ucsEnt:GetPos() - local sO = tostring(ucsPos[C1])..","..tostring(ucsPos[C2])..","..tostring(ucsPos[C3]) - C1, C2, C3 = asmlib.GetIndexes("A") - local ucsAng = ucsEnt:GetAngles() - local sA = tostring(ucsAng[C1])..", "..tostring(ucsAng[C2])..", "..tostring(ucsAng[C3]) - return "asmlib.InsertRecord({\""..this:GetModel().."\", \""..sType.. - "\", \""..sName.."\", "..tostring(nPoint or 0)..", \""..sP.. - "\", \""..sO.."\", \""..sA.."\"})" -end - -__e2setcost(50) -e2function string entity:trackasmlibGenActivePointDSV(entity ucsEnt, string sType, string sName, number nPoint, string sP, string sDelim) - if(not (this and this:IsValid() and enFlag)) then return "" end - if(not (ucsEnt and ucsEnt:IsValid())) then return "" end - local sDelim = stringSub(sDelim,1,1) - if(not (stringLen(sDelim) > 0)) then return "" end - local C1, C2, C3 = asmlib.GetIndexes("V") - local ucsPos = ucsEnt:GetPos() - local sO = tostring(ucsPos[C1])..","..tostring(ucsPos[C2])..","..tostring(ucsPos[C3]) - C1, C2, C3 = asmlib.GetIndexes("A") - local ucsAng = ucsEnt:GetAngles() - local sA = tostring(ucsAng[C1])..","..tostring(ucsAng[C2])..","..tostring(ucsAng[C3]) - return "TRACKASSEMBLY_PIECES"..sDelim.."\""..this:GetModel().."\""..sDelim.."\"".. - sType.."\""..sDelim.."\""..sName.."\""..sDelim..tostring(nPoint or 0).. - sDelim.."\""..sP.."\""..sDelim.."\""..sO.."\""..sDelim.."\""..sA.."\"" -end - -__e2setcost(100) -e2function array entity:trackasmlibSnapEntity(vector trHitPos , string hdModel , number hdPointID, - number nActRadius, number enFlatten, number enIgnTyp , - vector ucsOffPos , vector ucsOffAng) - if(not (this and this:IsValid() and enFlag)) then return {} end - local stSpawn = asmlib.GetEntitySpawn(this,trHitPos,hdModel,hdPointID, - nActRadius,enFlatten,enIgnTyp, - ucsPos[1],ucsPos[2],ucsPos[3], - ucsAng[1],ucsAng[2],ucsAng[3]) - if(not stSpawn) then return {} end - return {stSpawn.SPos, stSpawn.SAng} -end - -__e2setcost(80) -e2function array trackasmlibSnapNormal(vector ucsPos , angle ucsAng , string hdModel, - number hdPointID, vector ucsOffPos, vector ucsOffAng) - if(not enFlag) then return {} end - local stSpawn = asmlib.GetNormalSpawn(ucsPos,ucsAng,hdModel,hdPointID, - ucsOffPos[1],ucsOffPos[2],ucsOffPos[3], - ucsOffAng[1],ucsOffAng[2],ucsOffAng[3]) - if(not stSpawn) then return {} end - return {stSpawn.SPos, stSpawn.SAng} -end - -__e2setcost(30) -e2function number trackasmlibIsPiece(string sModel) - if(not enFlag) then return anyFalse end - local stRecord = asmlib.CacheQueryPiece(sModel) - if(stRecord) then return anyTrue else return anyFalse end -end - -__e2setcost(30) -e2function number entity:trackasmlibIsPiece() - if(not (this and this:IsValid() and enFlag)) then return anyFalse end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(stRecord) then return anyTrue else return anyFalse end -end - -__e2setcost(120) -e2function array trackasmlibGetOffset(string sModel, number nOffset, string sPOA) - if(not enFlag) then return {} end - local stPOA = asmlib.LocatePOA(asmlib.CacheQueryPiece(sModel),nOffset) - if(not stPOA) then return {} end - local sPOA = stringSub(stringUpper(tostring(sPOA)),1,1) - local arResult = {} - local C1, C2, C3, C4 - if (sPOA == "P") then C1, C2, C3 = asmlib.GetIndexes("V") - elseif(sPOA == "O") then C1, C2, C3 = asmlib.GetIndexes("V") - elseif(sPOA == "A") then C1, C2, C3 = asmlib.GetIndexes("A") - else return arResult end - arResult[1] = stPOA[sPOA][C1] - arResult[1] = stPOA[sPOA][C1] - arResult[2] = stPOA[sPOA][C2] - arResult[3] = stPOA[sPOA][C3] - C1, C2, C3, C4 = asmlib.GetIndexes("S") - arResult[4] = stPOA[sPOA][C1] - arResult[5] = stPOA[sPOA][C2] - arResult[6] = stPOA[sPOA][C3] - arResult[7] = stPOA[sPOA][C4] and 1 or 0 - return arResult -end - -__e2setcost(120) -e2function array entity:trackasmlibGetOffset(number nOffset, string sPOA) - if(not (this and this:IsValid() and enFlag)) then return {} end - local stPOA = asmlib.LocatePOA(asmlib.CacheQueryPiece(this:GetModel()),nOffset) - if(not stPOA) then return {} end - local sPOA = stringSub(stringUpper(tostring(sPOA)),1,1) - local arResult = {} - local C1, C2, C3, C4 - if (sPOA == "P") then C1, C2, C3 = asmlib.GetIndexes("V") - elseif(sPOA == "O") then C1, C2, C3 = asmlib.GetIndexes("V") - elseif(sPOA == "A") then C1, C2, C3 = asmlib.GetIndexes("A") - else return arResult end - arResult[1] = stPOA[sPOA][C1] - arResult[2] = stPOA[sPOA][C2] - arResult[3] = stPOA[sPOA][C3] - C1, C2, C3, C4 = asmlib.GetIndexes("S") - arResult[4] = stPOA[sPOA][C1] - arResult[5] = stPOA[sPOA][C2] - arResult[6] = stPOA[sPOA][C3] - arResult[7] = stPOA[sPOA][C4] and 1 or 0 - return arResult -end - -__e2setcost(30) -e2function string trackasmlibGetType(string sModel) - if(not enFlag) then return "" end - local stRecord = asmlib.CacheQueryPiece(sModel) - if(stRecord and stRecord.Type) then return stRecord.Type else return "" end -end - -__e2setcost(30) -e2function string entity:trackasmlibGetType() - if(not (this and this:IsValid() and enFlag)) then return "" end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(stRecord and stRecord.Type) then return stRecord.Type else return "" end -end - -__e2setcost(30) -e2function string trackasmlibGetName(string sModel) - if(not enFlag) then return "" end - local stRecord = asmlib.CacheQueryPiece(sModel) - if(stRecord and stRecord.Name) then return stRecord.Name else return "" end -end - -__e2setcost(30) -e2function string entity:trackasmlibGetName() - if(not (this and this:IsValid() and enFlag)) then return "" end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(stRecord and stRecord.Name) then return stRecord.Name else return "" end -end - -__e2setcost(30) -e2function number trackasmlibGetPointsCount(string sModel) - if(not enFlag) then return 0 end - local stRecord = asmlib.CacheQueryPiece(sModel) - if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end -end - -__e2setcost(30) -e2function number entity:trackasmlibGetPointsCount() - if(not (this and this:IsValid() and enFlag)) then return 0 end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end -end - ----------- Additions ------------ - -__e2setcost(30) -e2function number trackasmlibHasAdditions(string sModel) - if(not enFlag) then return anyFalse end - local stRecord = asmlib.CacheQueryAdditions(sModel) - if(stRecord) then return anyTrue else return anyFalse end -end - -__e2setcost(30) -e2function number entity:trackasmlibHasAdditions() - if(not (this and this:IsValid() and enFlag)) then return anyFalse end - local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) - if(stRecord) then return anyTrue else return anyFalse end -end - -__e2setcost(50) -e2function number trackasmlibGetAdditionsCount(string sModel) - if(not enFlag) then return 0 end - local stRecord = asmlib.CacheQueryAdditions(sModel) - if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end -end - -__e2setcost(50) -e2function number entity:trackasmlibGetAdditionsCount() - if(not (this and this:IsValid() and enFlag)) then return 0 end - local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) - if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end -end - -__e2setcost(60) -e2function array trackasmlibGetAdditionsLine(string sModel, number nLine) - if(not enFlag) then return {} end - local defAddit = asmlib.GetOpVar("DEFTABLE_ADDITIONS") - if(not defAddit) then - return asmlib.StatusLog({},"entity:trackasmlibGetAdditionLine(number): No table definition") - end - local stRecord = asmlib.CacheQueryAdditions(sModel) - if(not stRecord) then return {} end - if(not stRecord[nLine]) then return {} end - stRecord = stRecord[nLine] -- Ordered by ID. Get the line per model - local cntField = 2 -- The model is missed by the main SELECT - local arAdditionsLine = {} - while(defAddit[cntField]) do - arAdditionsLine[cntField-1] = stRecord[defAddit[cntField][1]] - cntField = cntField + 1 - end - return arAdditionsLine -end - -__e2setcost(60) -e2function array entity:trackasmlibGetAdditionsLine(number nLine) - if(not (this and this:IsValid() and enFlag)) then return {} end - local defAddit = asmlib.GetOpVar("DEFTABLE_ADDITIONS") - if(not defAddit) then - return asmlib.StatusLog({},"entity:trackasmlibGetAdditionLine(number): No table definition") - end - local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) - if(not stRecord) then return {} end - if(not stRecord[nLine]) then return {} end - stRecord = stRecord[nLine] -- Ordered by ID. Get the line per model - local cntField = 2 -- The model is missed by the main SELECT - local arAdditionsLine = {} - while(defAddit[cntField]) do - arAdditionsLine[cntField-1] = stRecord[defAddit[cntField][1]] - cntField = cntField + 1 - end - return arAdditionsLine -end - ------------- PhysProperties ------------ - -__e2setcost(15) -e2function array trackasmlibGetProperty(string sType) - if(not enFlag) then return {} end - local stRecord = asmlib.CacheQueryProperty(sType) - if(not stRecord) then return {} end - return stRecord -end - -__e2setcost(15) -e2function array trackasmlibGetProperty() - if(not enFlag) then return {} end - local stRecord = asmlib.CacheQueryProperty() - if(not stRecord) then return {} end - return stRecord -end - ------------ Piece creator -------------- - -__e2setcost(50) -e2function entity trackasmlibMakePiece(string sModel, vector vPos, angle aAng, number nMass, string sBgpID, number nR, number nG, number nB, number nA) - if(not enFlag) then return nil end - return asmlib.MakePiece(sModel,Vector(vPos[1],vPos[2],vPos[3]), - Angle (aAng[1],aAng[2],aAng[3]), - nMass or 50000,sBgpID or "", - Color(nR or 255, nG or 255, nB or 255, nA or 255)) -end - -__e2setcost(50) -e2function entity entity:trackasmlibMakePiece(vector vPos, angle aAng) - if(not (this and this:IsValid() and enFlag)) then return nil end - local phthis = this:GetPhysicsObject() - if(not (phthis and phthis:IsValid())) then return nil end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(not stRecord) then return nil end - local sBgpID = asmlib.GetPropBodyGrp(this).. - asmlib.GetOpVar("OPSYM_DIRECTORY").. - asmlib.GetPropSkin(this) - return asmlib.MakePiece(this:GetModel(), - Vector(vPos[1],vPos[2],vPos[3]), - Angle (aAng[1],aAng[2],aAng[3]), - phthis:GetMass(),sBgpID,this:GetColor()) -end - -__e2setcost(15) -e2function entity entity:trackasmlibApplyPhysicalAnchor(entity eBase, number nWe, number nNc) - if(not (this and this:IsValid() and enFlag)) then return anyFalse end - if(not (eBase and eBase:IsValid())) then return anyFalse end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(not stRecord) then return anyFalse end - return asmlib.ApplyPhysicalAnchor(this,eBase,nWe,nNc) and anyTrue or anyFalse -end - -__e2setcost(15) -e2function entity entity:trackasmlibApplyPhysicalSettings(number nPi, number nFr, number nGr, string sPh) - if(not (this and this:IsValid() and enFlag)) then return anyFalse end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(not stRecord) then return anyFalse end - return asmlib.ApplyPhysicalSettings(this,nPi,nFr,nGr,sPh) and anyTrue or anyFalse -end - -__e2setcost(35) -e2function number entity:trackasmlibAttachAdditions() - if(not (this and this:IsValid() and enFlag)) then return anyFalse end - local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) - if(not stRecord) then return 0 end - return asmlib.AttachAdditions(this) and anyTrue or anyFalse -end - -__e2setcost(20) -e2function number entity:trackasmlibAttachBodyGroups(string sBgpID) - if(not (this and this:IsValid() and enFlag)) then return 0 end - local stRecord = asmlib.CacheQueryPiece(this:GetModel()) - if(not stRecord) then return 0 end - return asmlib.AttachBodyGroups(this, sBgpID) and anyTrue or anyFalse +----- Localizing the asmlib module +local asmlib = trackasmlib +----- Localizing needed functions +local Vector = Vector +local Angle = Angle +local Color = Color +local tonumber = tonumber +local tostring = tostring +local stringSub = string and string.sub +local stringUpper = string and string.upper +local stringLen = string and string.len + +----- Get extension enabled flag +local enFlag = ((tonumber(asmlib.GetCoVar("enwiremod","INT")) or 0) ~= 0) and true or false +local anyTrue = 1 +local anyFalse = 0 +--------- Pieces ---------- + +__e2setcost(50) +e2function string entity:trackasmlibGenActivePointINS(entity ucsEnt, string sType, string sName, number nPoint, string sP) + if(not (this and this:IsValid() and enFlag)) then return "" end + if(not (ucsEnt and ucsEnt:IsValid())) then return "" end + local C1, C2, C3 = asmlib.GetIndexes("V") + local ucsPos = ucsEnt:GetPos() + local sO = tostring(ucsPos[C1])..","..tostring(ucsPos[C2])..","..tostring(ucsPos[C3]) + C1, C2, C3 = asmlib.GetIndexes("A") + local ucsAng = ucsEnt:GetAngles() + local sA = tostring(ucsAng[C1])..", "..tostring(ucsAng[C2])..", "..tostring(ucsAng[C3]) + return "asmlib.InsertRecord({\""..this:GetModel().."\", \""..sType.. + "\", \""..sName.."\", "..tostring(nPoint or 0)..", \""..sP.. + "\", \""..sO.."\", \""..sA.."\"})" +end + +__e2setcost(50) +e2function string entity:trackasmlibGenActivePointDSV(entity ucsEnt, string sType, string sName, number nPoint, string sP, string sDelim) + if(not (this and this:IsValid() and enFlag)) then return "" end + if(not (ucsEnt and ucsEnt:IsValid())) then return "" end + local sDelim = stringSub(sDelim,1,1) + if(not (stringLen(sDelim) > 0)) then return "" end + local C1, C2, C3 = asmlib.GetIndexes("V") + local ucsPos = ucsEnt:GetPos() + local sO = tostring(ucsPos[C1])..","..tostring(ucsPos[C2])..","..tostring(ucsPos[C3]) + C1, C2, C3 = asmlib.GetIndexes("A") + local ucsAng = ucsEnt:GetAngles() + local sA = tostring(ucsAng[C1])..","..tostring(ucsAng[C2])..","..tostring(ucsAng[C3]) + return "TRACKASSEMBLY_PIECES"..sDelim.."\""..this:GetModel().."\""..sDelim.."\"".. + sType.."\""..sDelim.."\""..sName.."\""..sDelim..tostring(nPoint or 0).. + sDelim.."\""..sP.."\""..sDelim.."\""..sO.."\""..sDelim.."\""..sA.."\"" +end + +__e2setcost(100) +e2function array entity:trackasmlibSnapEntity(vector trHitPos , string hdModel , number hdPointID, + number nActRadius, number enFlatten, number enIgnTyp , + vector ucsOffPos , vector ucsOffAng) + if(not (this and this:IsValid() and enFlag)) then return {} end + local stSpawn = asmlib.GetEntitySpawn(this,trHitPos,hdModel,hdPointID, + nActRadius,enFlatten,enIgnTyp, + ucsPos[1],ucsPos[2],ucsPos[3], + ucsAng[1],ucsAng[2],ucsAng[3]) + if(not stSpawn) then return {} end + return {stSpawn.SPos, stSpawn.SAng} +end + +__e2setcost(80) +e2function array trackasmlibSnapNormal(vector ucsPos , angle ucsAng , string hdModel, + number hdPointID, vector ucsOffPos, vector ucsOffAng) + if(not enFlag) then return {} end + local stSpawn = asmlib.GetNormalSpawn(ucsPos,ucsAng,hdModel,hdPointID, + ucsOffPos[1],ucsOffPos[2],ucsOffPos[3], + ucsOffAng[1],ucsOffAng[2],ucsOffAng[3]) + if(not stSpawn) then return {} end + return {stSpawn.SPos, stSpawn.SAng} +end + +__e2setcost(30) +e2function number trackasmlibIsPiece(string sModel) + if(not enFlag) then return anyFalse end + local stRecord = asmlib.CacheQueryPiece(sModel) + if(stRecord) then return anyTrue else return anyFalse end +end + +__e2setcost(30) +e2function number entity:trackasmlibIsPiece() + if(not (this and this:IsValid() and enFlag)) then return anyFalse end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(stRecord) then return anyTrue else return anyFalse end +end + +__e2setcost(120) +e2function array trackasmlibGetOffset(string sModel, number nOffset, string sPOA) + if(not enFlag) then return {} end + local stPOA = asmlib.LocatePOA(asmlib.CacheQueryPiece(sModel),nOffset) + if(not stPOA) then return {} end + local sPOA = stringSub(stringUpper(tostring(sPOA)),1,1) + local arResult = {} + local C1, C2, C3, C4 + if (sPOA == "P") then C1, C2, C3 = asmlib.GetIndexes("V") + elseif(sPOA == "O") then C1, C2, C3 = asmlib.GetIndexes("V") + elseif(sPOA == "A") then C1, C2, C3 = asmlib.GetIndexes("A") + else return arResult end + arResult[1] = stPOA[sPOA][C1] + arResult[1] = stPOA[sPOA][C1] + arResult[2] = stPOA[sPOA][C2] + arResult[3] = stPOA[sPOA][C3] + C1, C2, C3, C4 = asmlib.GetIndexes("S") + arResult[4] = stPOA[sPOA][C1] + arResult[5] = stPOA[sPOA][C2] + arResult[6] = stPOA[sPOA][C3] + arResult[7] = stPOA[sPOA][C4] and 1 or 0 + return arResult +end + +__e2setcost(120) +e2function array entity:trackasmlibGetOffset(number nOffset, string sPOA) + if(not (this and this:IsValid() and enFlag)) then return {} end + local stPOA = asmlib.LocatePOA(asmlib.CacheQueryPiece(this:GetModel()),nOffset) + if(not stPOA) then return {} end + local sPOA = stringSub(stringUpper(tostring(sPOA)),1,1) + local arResult = {} + local C1, C2, C3, C4 + if (sPOA == "P") then C1, C2, C3 = asmlib.GetIndexes("V") + elseif(sPOA == "O") then C1, C2, C3 = asmlib.GetIndexes("V") + elseif(sPOA == "A") then C1, C2, C3 = asmlib.GetIndexes("A") + else return arResult end + arResult[1] = stPOA[sPOA][C1] + arResult[2] = stPOA[sPOA][C2] + arResult[3] = stPOA[sPOA][C3] + C1, C2, C3, C4 = asmlib.GetIndexes("S") + arResult[4] = stPOA[sPOA][C1] + arResult[5] = stPOA[sPOA][C2] + arResult[6] = stPOA[sPOA][C3] + arResult[7] = stPOA[sPOA][C4] and 1 or 0 + return arResult +end + +__e2setcost(30) +e2function string trackasmlibGetType(string sModel) + if(not enFlag) then return "" end + local stRecord = asmlib.CacheQueryPiece(sModel) + if(stRecord and stRecord.Type) then return stRecord.Type else return "" end +end + +__e2setcost(30) +e2function string entity:trackasmlibGetType() + if(not (this and this:IsValid() and enFlag)) then return "" end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(stRecord and stRecord.Type) then return stRecord.Type else return "" end +end + +__e2setcost(30) +e2function string trackasmlibGetName(string sModel) + if(not enFlag) then return "" end + local stRecord = asmlib.CacheQueryPiece(sModel) + if(stRecord and stRecord.Name) then return stRecord.Name else return "" end +end + +__e2setcost(30) +e2function string entity:trackasmlibGetName() + if(not (this and this:IsValid() and enFlag)) then return "" end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(stRecord and stRecord.Name) then return stRecord.Name else return "" end +end + +__e2setcost(30) +e2function number trackasmlibGetPointsCount(string sModel) + if(not enFlag) then return 0 end + local stRecord = asmlib.CacheQueryPiece(sModel) + if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end +end + +__e2setcost(30) +e2function number entity:trackasmlibGetPointsCount() + if(not (this and this:IsValid() and enFlag)) then return 0 end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end +end + +---------- Additions ------------ + +__e2setcost(30) +e2function number trackasmlibHasAdditions(string sModel) + if(not enFlag) then return anyFalse end + local stRecord = asmlib.CacheQueryAdditions(sModel) + if(stRecord) then return anyTrue else return anyFalse end +end + +__e2setcost(30) +e2function number entity:trackasmlibHasAdditions() + if(not (this and this:IsValid() and enFlag)) then return anyFalse end + local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) + if(stRecord) then return anyTrue else return anyFalse end +end + +__e2setcost(50) +e2function number trackasmlibGetAdditionsCount(string sModel) + if(not enFlag) then return 0 end + local stRecord = asmlib.CacheQueryAdditions(sModel) + if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end +end + +__e2setcost(50) +e2function number entity:trackasmlibGetAdditionsCount() + if(not (this and this:IsValid() and enFlag)) then return 0 end + local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) + if(stRecord and stRecord.Kept) then return stRecord.Kept else return 0 end +end + +__e2setcost(60) +e2function array trackasmlibGetAdditionsLine(string sModel, number nLine) + if(not enFlag) then return {} end + local defAddit = asmlib.GetOpVar("DEFTABLE_ADDITIONS") + if(not defAddit) then + return asmlib.StatusLog({},"entity:trackasmlibGetAdditionLine(number): No table definition") + end + local stRecord = asmlib.CacheQueryAdditions(sModel) + if(not stRecord) then return {} end + if(not stRecord[nLine]) then return {} end + stRecord = stRecord[nLine] -- Ordered by ID. Get the line per model + local cntField = 2 -- The model is missed by the main SELECT + local arAdditionsLine = {} + while(defAddit[cntField]) do + arAdditionsLine[cntField-1] = stRecord[defAddit[cntField][1]] + cntField = cntField + 1 + end + return arAdditionsLine +end + +__e2setcost(60) +e2function array entity:trackasmlibGetAdditionsLine(number nLine) + if(not (this and this:IsValid() and enFlag)) then return {} end + local defAddit = asmlib.GetOpVar("DEFTABLE_ADDITIONS") + if(not defAddit) then + return asmlib.StatusLog({},"entity:trackasmlibGetAdditionLine(number): No table definition") + end + local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) + if(not stRecord) then return {} end + if(not stRecord[nLine]) then return {} end + stRecord = stRecord[nLine] -- Ordered by ID. Get the line per model + local cntField = 2 -- The model is missed by the main SELECT + local arAdditionsLine = {} + while(defAddit[cntField]) do + arAdditionsLine[cntField-1] = stRecord[defAddit[cntField][1]] + cntField = cntField + 1 + end + return arAdditionsLine +end + +------------ PhysProperties ------------ + +__e2setcost(15) +e2function array trackasmlibGetProperty(string sType) + if(not enFlag) then return {} end + local stRecord = asmlib.CacheQueryProperty(sType) + if(not stRecord) then return {} end + return stRecord +end + +__e2setcost(15) +e2function array trackasmlibGetProperty() + if(not enFlag) then return {} end + local stRecord = asmlib.CacheQueryProperty() + if(not stRecord) then return {} end + return stRecord +end + +----------- Piece creator -------------- + +__e2setcost(50) +e2function entity trackasmlibMakePiece(string sModel, vector vPos, angle aAng, number nMass, string sBgpID, number nR, number nG, number nB, number nA) + if(not enFlag) then return nil end + return asmlib.MakePiece(sModel,Vector(vPos[1],vPos[2],vPos[3]), + Angle (aAng[1],aAng[2],aAng[3]), + nMass or 50000,sBgpID or "", + Color(nR or 255, nG or 255, nB or 255, nA or 255)) +end + +__e2setcost(50) +e2function entity entity:trackasmlibMakePiece(vector vPos, angle aAng) + if(not (this and this:IsValid() and enFlag)) then return nil end + local phthis = this:GetPhysicsObject() + if(not (phthis and phthis:IsValid())) then return nil end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(not stRecord) then return nil end + local sBgpID = asmlib.GetPropBodyGroup(this).. + asmlib.GetOpVar("OPSYM_DIRECTORY").. + asmlib.GetPropSkin(this) + return asmlib.MakePiece(this:GetModel(), + Vector(vPos[1],vPos[2],vPos[3]), + Angle (aAng[1],aAng[2],aAng[3]), + phthis:GetMass(),sBgpID,this:GetColor()) +end + +__e2setcost(15) +e2function entity entity:trackasmlibApplyPhysicalAnchor(entity eBase, number nWe, number nNc) + if(not (this and this:IsValid() and enFlag)) then return anyFalse end + if(not (eBase and eBase:IsValid())) then return anyFalse end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(not stRecord) then return anyFalse end + return asmlib.ApplyPhysicalAnchor(this,eBase,nWe,nNc) and anyTrue or anyFalse +end + +__e2setcost(15) +e2function entity entity:trackasmlibApplyPhysicalSettings(number nPi, number nFr, number nGr, string sPh) + if(not (this and this:IsValid() and enFlag)) then return anyFalse end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(not stRecord) then return anyFalse end + return asmlib.ApplyPhysicalSettings(this,nPi,nFr,nGr,sPh) and anyTrue or anyFalse +end + +__e2setcost(35) +e2function number entity:trackasmlibAttachAdditions() + if(not (this and this:IsValid() and enFlag)) then return anyFalse end + local stRecord = asmlib.CacheQueryAdditions(this:GetModel()) + if(not stRecord) then return 0 end + return asmlib.AttachAdditions(this) and anyTrue or anyFalse +end + +__e2setcost(20) +e2function number entity:trackasmlibAttachBodyGroups(string sBgpID) + if(not (this and this:IsValid() and enFlag)) then return 0 end + local stRecord = asmlib.CacheQueryPiece(this:GetModel()) + if(not stRecord) then return 0 end + return asmlib.AttachBodyGroups(this, sBgpID) and anyTrue or anyFalse end \ No newline at end of file diff --git a/lua/trackassembly/trackasmlib.lua b/lua/trackassembly/trackasmlib.lua index 967c659..5879f59 100644 --- a/lua/trackassembly/trackasmlib.lua +++ b/lua/trackassembly/trackasmlib.lua @@ -1,3229 +1,3215 @@ ---- Because Vec[1] is actually faster than Vec.X - ---- Vector Component indexes --- -local cvX -- Vector X component -local cvY -- Vector Y component -local cvZ -- Vector Z component - ---- Angle Component indexes --- -local caP -- Angle Pitch component -local caY -- Angle Yaw component -local caR -- Angle Roll component - ---- Component Status indexes --- -local csA -- Sign of the first component -local csB -- Sign of the second component -local csC -- Sign of the third component -local csD -- Flag for disabling the point - ----------------- Localizing instances ------------------ -local SERVER = SERVER -local CLIENT = CLIENT - ----------------- Localizing Player keys ---------------- -local IN_ALT1 = IN_ALT1 -local IN_ALT2 = IN_ALT2 -local IN_ATTACK = IN_ATTACK -local IN_ATTACK2 = IN_ATTACK2 -local IN_BACK = IN_BACK -local IN_DUCK = IN_DUCK -local IN_FORWARD = IN_FORWARD -local IN_JUMP = IN_JUMP -local IN_LEFT = IN_LEFT -local IN_MOVELEFT = IN_MOVELEFT -local IN_MOVERIGHT = IN_MOVERIGHT -local IN_RELOAD = IN_RELOAD -local IN_RIGHT = IN_RIGHT -local IN_SCORE = IN_SCORE -local IN_SPEED = IN_SPEED -local IN_USE = IN_USE -local IN_WALK = IN_WALK -local IN_ZOOM = IN_ZOOM - ----------------- Localizing ENT Properties ---------------- -local SOLID_VPHYSICS = SOLID_VPHYSICS -local MOVETYPE_VPHYSICS = MOVETYPE_VPHYSICS -local COLLISION_GROUP_NONE = COLLISION_GROUP_NONE -local RENDERMODE_TRANSALPHA = RENDERMODE_TRANSALPHA - ----------------- Localizing needed functions ---------------- -local next = next -local type = type -local Angle = Angle -local Color = Color -local pairs = pairs -local print = print -local tobool = tobool -local Vector = Vector -local include = include -local IsValid = IsValid -local require = require -local Time = SysTime -local tonumber = tonumber -local tostring = tostring -local GetConVar = GetConVar -local LocalPlayer = LocalPlayer -local CreateConVar = CreateConVar -local getmetatable = getmetatable -local setmetatable = setmetatable -local collectgarbage = collectgarbage -local osClock = os and os.clock -local osDate = os and os.date -local sqlQuery = sql and sql.Query -local sqlLastError = sql and sql.LastError -local sqlTableExists = sql and sql.TableExists -local utilTraceLine = util and util.TraceLine -local utilIsInWorld = util and util.IsInWorld -local utilIsValidModel = util and util.IsValidModel -local utilGetPlayerTrace = util and util.GetPlayerTrace -local entsCreate = ents and ents.Create -local fileOpen = file and file.Open -local fileExists = file and file.Exists -local fileAppend = file and file.Append -local fileDelete = file and file.Delete -local fileCreateDir = file and file.CreateDir -local mathPi = math and math.pi -local mathAbs = math and math.abs -local mathSin = math and math.sin -local mathCos = math and math.cos -local mathCeil = math and math.ceil -local mathModf = math and math.modf -local mathSqrt = math and math.sqrt -local mathFloor = math and math.floor -local mathClamp = math and math.Clamp -local mathRandom = math and math.random -local undoCreate = undo and undo.Create -local undoFinish = undo and undo.Finish -local undoAddEntity = undo and undo.AddEntity -local undoSetPlayer = undo and undo.SetPlayer -local undoSetCustomUndoText = undo and undo.SetCustomUndoText -local timerStop = timer and timer.Stop -local timerStart = timer and timer.Start -local timerExists = timer and timer.Exists -local timerCreate = timer and timer.Create -local timerDestroy = timer and timer.Destroy -local tableEmpty = table and table.Empty -local tableMaxn = table and table.maxn -local stringLen = string and string.len -local stringSub = string and string.sub -local stringFind = string and string.find -local stringGsub = string and string.gsub -local stringUpper = string and string.upper -local stringLower = string and string.lower -local stringFormat = string and string.format -local stringExplode = string and string.Explode -local stringImplode = string and string.Implode -local stringToFileName = string and string.GetFileFromFilename -local surfaceSetFont = surface and surface.SetFont -local surfaceDrawLine = surface and surface.DrawLine -local surfaceDrawText = surface and surface.DrawText -local surfaceDrawCircle = surface and surface.DrawCircle -local surfaceSetTexture = surface and surface.SetTexture -local surfaceSetTextPos = surface and surface.SetTextPos -local surfaceGetTextSize = surface and surface.GetTextSize -local surfaceGetTextureID = surface and surface.GetTextureID -local surfaceSetDrawColor = surface and surface.SetDrawColor -local surfaceSetTextColor = surface and surface.SetTextColor -local constructSetPhysProp = construct and construct.SetPhysProp -local constraintWeld = constraint and constraint.Weld -local constraintNoCollide = constraint and constraint.NoCollide -local surfaceDrawTexturedRect = surface and surface.DrawTexturedRect -local duplicatorStoreEntityModifier = duplicator and duplicator.StoreEntityModifier - ----------------- CASHES SPACE -------------------- - -local libCache = {} -- Used to cache stuff in a Pool -local libAction = {} -- Used to attach external function to the lib -local libOpVars = {} -- Used to Store operational Variable Values - -module("trackasmlib") - ----------------------------- PRIMITIVES ---------------------------- - -function Delay(nAdd) - local nAdd = tonumber(nAdd) or 0 - if(nAdd > 0) then - local tmEnd = osClock() + nAdd - while(osClock() < tmEnd) do end - end -end - -function GetInstPref() - if (CLIENT) then return "cl_" - elseif(SERVER) then return "sv_" end - return "na_" -end - -function GetOpVar(sName) - return libOpVars[sName] -end - -function SetOpVar(sName, anyValue) - libOpVars[sName] = anyValue -end - -function IsExistent(anyValue) - return (anyValue ~= nil) -end - -function IsString(anyValue) - return (getmetatable(anyValue) == GetOpVar("TYPEMT_STRING")) -end - -local function IsEmptyString(anyValue) - if(not IsString(anyValue)) then return false end - return (anyValue == "") -end - -function IsBool(anyValue) - if (anyValue == true ) then return true - elseif(anyValue == false) then return true end - return false -end - -function IsNumber(anyValue) - return ((tonumber(anyValue) and true) or false) -end - ------------------- LOGS ------------------------ - -local function FormatNumberMax(nNum,nMax) - local nNum = tonumber(nNum) - local nMax = tonumber(nMax) - if(not (nNum and nMax)) then return "" end - return stringFormat("%"..stringLen(tostring(mathFloor(nMax))).."d",nNum) -end - -function SetLogControl(nLines,sFile) - SetOpVar("LOG_CURLOGS",0) - SetOpVar("LOG_LOGFILE",tostring(sFile or "")) - SetOpVar("LOG_MAXLOGS",mathFloor(tonumber(nLines) or 0)) - if(not fileExists(GetOpVar("DIRPATH_BAS"),"DATA") and - not IsEmptyString(GetOpVar("LOG_LOGFILE"))) then - fileCreateDir(GetOpVar("DIRPATH_BAS")) - end -end - -local function Log(anyStuff) - local nMaxLogs = GetOpVar("LOG_MAXLOGS") - if(nMaxLogs <= 0) then return end - local sLogFile = GetOpVar("LOG_LOGFILE") - local nCurLogs = GetOpVar("LOG_CURLOGS") - if(sLogFile ~= "") then - local fName = GetOpVar("DIRPATH_BAS")..GetOpVar("DIRPATH_LOG")..sLogFile..".txt" - fileAppend(fName,FormatNumberMax(nCurLogs,nMaxLogs).." >> "..tostring(anyStuff).."\n") - nCurLogs = nCurLogs + 1 - if(nCurLogs > nMaxLogs) then - fileDelete(fName) - nCurLogs = 0 - end - SetOpVar("LOG_CURLOGS",nCurLogs) - else - print(FormatNumberMax(nCurLogs,nMaxLogs).." >> "..tostring(anyStuff)) - nCurLogs = nCurLogs + 1 - if(nCurLogs > nMaxLogs) then - nCurLogs = 0 - end - SetOpVar("LOG_CURLOGS",nCurLogs) - end -end - -function PrintInstance(anyStuff) - local sModeDB = GetOpVar("MODE_DATABASE") - if(SERVER) then - print("SERVER > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..tostring(anyStuff)) - elseif(CLIENT) then - print("CLIENT > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..tostring(anyStuff)) - else - print("NOINST > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..tostring(anyStuff)) - end -end - -function LogInstance(anyStuff) - if(GetOpVar("LOG_MAXLOGS") <= 0) then return end - local anyStuff = tostring(anyStuff) - local logStats = GetOpVar("LOG_SKIP") - if(logStats and logStats[1]) then - local iNdex = 1 - while(logStats[iNdex]) do - if(stringFind(anyStuff,tostring(logStats[iNdex]))) then return end - iNdex = iNdex + 1 - end - end -- Should the current log being skipped - logStats = GetOpVar("LOG_ONLY") - if(logStats and logStats[1]) then - local iNdex = 1 - local logMe = false - while(logStats[iNdex]) do - if(stringFind(anyStuff,tostring(logStats[iNdex]))) then - logMe = true - end - iNdex = iNdex + 1 - end - if(not logMe) then return end - end -- Only the chosen messages are processed - local sModeDB = GetOpVar("MODE_DATABASE") - if(SERVER) then - Log("SERVER > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..anyStuff) - elseif(CLIENT) then - Log("CLIENT > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..anyStuff) - else - Log("NOINST > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..anyStuff) - end -end - -function StatusPrint(anyStatus,sError) - PrintInstance(sError) - return anyStatus -end - -function StatusLog(anyStatus,sError) - LogInstance(sError) - return anyStatus -end - -function Print(tT,sS) - if(not IsExistent(tT)) then - return StatusLog(nil,"Print: {nil, name="..tostring(sS or "\"Data\"").."}") end - local S = type(sS) - local T = type(tT) - local Key = "" - if (S == "string") then S = sS - elseif(S == "number") then S = tostring(sS) - else S = "Data" end - if(T ~= "table") then - LogInstance("{"..T.."}["..tostring(sS or "N/A").."] = "..tostring(tT)) - return - end - T = tT - if(next(T) == nil) then - LogInstance(S.." = {}") - return - end - LogInstance(S) - for k,v in pairs(T) do - if(type(k) == "string") then - Key = S.."[\""..k.."\"]" - else - Key = S.."["..tostring(k).."]" - end - if(type(v) ~= "table") then - if(type(v) == "string") then - LogInstance(Key.." = \""..v.."\"") - else - LogInstance(Key.." = "..tostring(v)) - end - else - Print(v,Key) - end - end -end - ------------------ INITAIALIZATION ----------------- - -function GetIndexes(sType) - if(not IsString(sType)) then - return StatusLog(nil,"GetIndexes: Type {"..type(sType).."}<"..tostring(sType).."> not string") end - if (sType == "V") then return cvX, cvY, cvZ - elseif(sType == "A") then return caP, caY, caR - elseif(sType == "S") then return csA, csB, csC, csD - else return StatusLog(nil,"GetIndexes: Type <"..sType.."> not found") end -end - -function SetIndexes(sType,I1,I2,I3,I4) - if(not IsString(sType)) then - return StatusLog(false,"SetIndexes: Type {"..type(sType).."}<"..tostring(sType).."> not string") end - if (sType == "V") then cvX, cvY, cvZ = I1, I2, I3 - elseif(sType == "A") then caP, caY, caR = I1, I2, I3 - elseif(sType == "S") then csA, csB, csC, csD = I1, I2, I3, I4 - else return StatusLog(false,"SetIndexes: Type <"..sType.."> not found") end - return StatusLog(true,"SetIndexes["..sType.."]: Success") -end - -function InitAssembly(sName,sPurpose) - SetOpVar("TYPEMT_STRING",getmetatable("TYPEMT_STRING")) - SetOpVar("TYPEMT_SCREEN",{}) - SetOpVar("TYPEMT_CONTAINER",{}) - if(not (IsString(sName) and IsString(sPurpose))) then - return StatusPrint(false,"InitAssembly: Expecting string argument" - .." {"..type(sName)..","..type(sPurpose).."}") end - if(IsEmptyString(sName) or tonumber(stringSub(sName,1,1))) then - return StatusPrint(false,"InitAssembly: Name invalid") end - if(IsEmptyString(sPurpose) or tonumber(stringSub(sPurpose,1,1))) then - return StatusPrint(false,"InitAssembly: Purpose invalid") end - SetOpVar("MAX_MASS",50000) - SetOpVar("MAX_LINEAR",1000) - SetOpVar("MAX_ROTATION",360) - SetOpVar("LOG_MAXLOGS",0) - SetOpVar("LOG_CURLOGS",0) - SetOpVar("LOG_LOGFILE","") - SetOpVar("ANG_ZERO",Angle()) - SetOpVar("VEC_ZERO",Vector()) - SetOpVar("TIME_EPOCH",Time()) - SetOpVar("OPSYM_DISABLE","#") - SetOpVar("OPSYM_REVSIGN","@") - SetOpVar("OPSYM_DIVIDER","_") - SetOpVar("OPSYM_DIRECTORY","/") - SetOpVar("OPSYM_SEPARATOR",",") - SetOpVar("GOLDEN_RATIO",1.61803398875) - SetOpVar("NAME_INIT",stringLower(sName)) - SetOpVar("NAME_PERP",stringLower(sPurpose)) - SetOpVar("TOOLNAME_NL",stringLower(GetOpVar("NAME_INIT")..GetOpVar("NAME_PERP"))) - SetOpVar("TOOLNAME_NU",stringUpper(GetOpVar("NAME_INIT")..GetOpVar("NAME_PERP"))) - SetOpVar("TOOLNAME_PL",GetOpVar("TOOLNAME_NL").."_") - SetOpVar("TOOLNAME_PU",GetOpVar("TOOLNAME_NU").."_") - SetOpVar("DIRPATH_BAS",GetOpVar("TOOLNAME_NL")..GetOpVar("OPSYM_DIRECTORY")) - SetOpVar("DIRPATH_INS","exp"..GetOpVar("OPSYM_DIRECTORY")) - SetOpVar("DIRPATH_DSV","dsv"..GetOpVar("OPSYM_DIRECTORY")) - SetOpVar("DIRPATH_LOG","") - SetOpVar("MISS_NOID","N") -- No ID selected - SetOpVar("MISS_NOAV","N/A") -- Not Available - SetOpVar("MISS_NOMD","X") -- No model - SetOpVar("ARRAY_DECODEPOA",{0,0,0,1,1,1,false}) - SetOpVar("TABLE_FREQUENT_MODELS",{}) - SetOpVar("TABLE_BORDERS",{}) - SetOpVar("FILE_MODEL","%.mdl") - SetOpVar("MODE_DATABASE",GetOpVar("MISS_NOAV")) - SetOpVar("HASH_USER_PANEL",GetOpVar("TOOLNAME_PU").."USER_PANEL") - SetOpVar("HASH_QUERY_STORE",GetOpVar("TOOLNAME_PU").."QHASH_QUERY") - SetOpVar("HASH_PLAYER_KEYDOWN","PLAYER_KEYDOWN") - SetOpVar("HASH_PROPERTY_NAMES","PROPERTY_NAMES") - SetOpVar("HASH_PROPERTY_TYPES","PROPERTY_TYPES") - SetOpVar("NAV_PIECE",{}) - SetOpVar("NAV_ADDITION",{}) - SetOpVar("NAV_PROPERTY_NAMES",{}) - SetOpVar("NAV_PROPERTY_TYPES",{}) - SetOpVar("NAV_PANEL",{}) - SetOpVar("STRUCT_SPAWN",{ - F = Vector(), - R = Vector(), - U = Vector(), - OPos = Vector(), - OAng = Angle (), - SPos = Vector(), - SAng = Angle (), - RLen = 0, - --- Holder --- - HRec = 0, - HID = 0, - HPnt = Vector(), -- P - HPos = Vector(), -- O - HAng = Angle (), -- A - --- Traced --- - TRec = 0, - TID = 0, - TPnt = Vector(), -- P - TPos = Vector(), -- O - TAng = Angle () -- A - }) - return StatusPrint(true,"InitAssembly: Success") -end - -------------- ANGLE --------------- -function ToAngle(aBase) - if(not aBase) then return StatusLog(nil,"ToAngle: Base invalid") end - return Angle((tonumber(aBase[caP]) or 0), (tonumber(aBase[caY]) or 0), (tonumber(aBase[caR]) or 0)) -end - -function ExpAngle(aBase) - if(not aBase) then return StatusLog(nil,"ExpAngle: Base invalid") end - return (tonumber(aBase[caP]) or 0), (tonumber(aBase[caY]) or 0), (tonumber(aBase[caR]) or 0) -end - -function AddAngle(aBase, aUnit) - if(not aBase) then return StatusLog(nil,"AddAngle: Base invalid") end - if(not aUnit) then return StatusLog(nil,"AddAngle: Unit invalid") end - aBase[caP] = (tonumber(aBase[caP]) or 0) + (tonumber(aUnit[caP]) or 0) - aBase[caY] = (tonumber(aBase[caY]) or 0) + (tonumber(aUnit[caY]) or 0) - aBase[caR] = (tonumber(aBase[caR]) or 0) + (tonumber(aUnit[caR]) or 0) -end - -function AddAnglePYR(aBase, nP, nY, nR) - if(not aBase) then return StatusLog(nil,"AddAnglePYR: Base invalid") end - aBase[caP] = (tonumber(aBase[caP]) or 0) + (tonumber(nP) or 0) - aBase[caY] = (tonumber(aBase[caY]) or 0) + (tonumber(nY) or 0) - aBase[caR] = (tonumber(aBase[caR]) or 0) + (tonumber(nR) or 0) -end - -function SubAngle(aBase, aUnit) - if(not aBase) then return StatusLog(nil,"SubAngle: Base invalid") end - if(not aUnit) then return StatusLog(nil,"SubAngle: Unit invalid") end - aBase[caP] = (tonumber(aBase[caP]) or 0) - (tonumber(aUnit[caP]) or 0) - aBase[caY] = (tonumber(aBase[caY]) or 0) - (tonumber(aUnit[caY]) or 0) - aBase[caR] = (tonumber(aBase[caR]) or 0) - (tonumber(aUnit[caR]) or 0) -end - -function SubAnglePYR(aBase, nP, nY, nR) - if(not aBase) then return StatusLog(nil,"SubAnglePYR: Base invalid") end - aBase[caP] = (tonumber(aBase[caP]) or 0) - (tonumber(nP) or 0) - aBase[caY] = (tonumber(aBase[caY]) or 0) - (tonumber(nY) or 0) - aBase[caR] = (tonumber(aBase[caR]) or 0) - (tonumber(nR) or 0) -end - -function NegAngle(aBase) - if(not aBase ) then return StatusLog(nil,"NegAngle: Base invalid") end - aBase[caP] = -(tonumber(aBase[caP]) or 0) - aBase[caY] = -(tonumber(aBase[caY]) or 0) - aBase[caR] = -(tonumber(aBase[caR]) or 0) -end - -function SetAngle(aBase, aUnit) - if(not aBase) then return StatusLog(nil,"SetAngle: Base invalid") end - if(not aUnit) then return StatusLog(nil,"SetAngle: Unit invalid") end - aBase[caP] = (tonumber(aUnit[caP]) or 0) - aBase[caY] = (tonumber(aUnit[caY]) or 0) - aBase[caR] = (tonumber(aUnit[caR]) or 0) -end - -function SetAnglePYR(aBase, nP, nY, nR) - if(not aBase) then return StatusLog(nil,"SetAnglePYR: Base invalid") end - aBase[caP] = (tonumber(nP) or 0) - aBase[caY] = (tonumber(nY) or 0) - aBase[caR] = (tonumber(nR) or 0) -end - -------------- VECTOR --------------- - -function ToVector(vBase) - if(not vBase) then return StatusLog(nil,"ToVector: Base invalid") end - return Vector((tonumber(vBase[cvX]) or 0), (tonumber(vBase[cvY]) or 0), (tonumber(vBase[cvZ]) or 0)) -end - -function ExpVector(vBase) - if(not vBase) then return StatusLog(nil,"ExpVector: Base invalid") end - return (tonumber(vBase[cvX]) or 0), (tonumber(vBase[cvY]) or 0), (tonumber(vBase[cvZ]) or 0) -end - -function GetLengthVector(vBase) - if(not vBase) then return StatusLog(nil,"GetLengthVector: Base invalid") end - local X = (tonumber(vBase[cvX]) or 0); X = X * X - local Y = (tonumber(vBase[cvY]) or 0); Y = Y * Y - local Z = (tonumber(vBase[cvZ]) or 0); Z = Z * Z - return mathSqrt(X + Y + Z) -end - -function RoundVector(vBase,nvRound) - if(not vBase) then return StatusLog(nil,"RoundVector: Base invalid") end - local R = tonumber(nvRound) - if(not IsExistent(R)) then - return StatusLog(nil,"RoundVector: Round NAN {"..type(nvRound).."}<"..tostring(nvRound)..">") end - local X = (tonumber(vBase[cvX]) or 0); X = RoundValue(X,R); vBase[cvX] = X - local Y = (tonumber(vBase[cvY]) or 0); Y = RoundValue(Y,R); vBase[cvY] = Y - local Z = (tonumber(vBase[cvZ]) or 0); Z = RoundValue(Z,R); vBase[cvZ] = Z -end - -function AddVector(vBase, vUnit) - if(not vBase) then return StatusLog(nil,"AddVector: Base invalid") end - if(not vUnit) then return StatusLog(nil,"AddVector: Unit invalid") end - vBase[cvX] = (tonumber(vBase[cvX]) or 0) + (tonumber(vUnit[cvX]) or 0) - vBase[cvY] = (tonumber(vBase[cvY]) or 0) + (tonumber(vUnit[cvY]) or 0) - vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) + (tonumber(vUnit[cvZ]) or 0) -end - -function AddVectorXYZ(vBase, nX, nY, nZ) - if(not vBase) then return StatusLog(nil,"AddVectorXYZ: Base invalid") end - vBase[cvX] = (tonumber(vBase[cvX]) or 0) + (tonumber(nX) or 0) - vBase[cvY] = (tonumber(vBase[cvY]) or 0) + (tonumber(nY) or 0) - vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) + (tonumber(nZ) or 0) -end - -function SubVector(vBase, vUnit) - if(not vBase) then return StatusLog(nil,"SubVector: Base invalid") end - if(not vUnit) then return StatusLog(nil,"SubVector: Unit invalid") end - vBase[cvX] = (tonumber(vBase[cvX]) or 0) - (tonumber(vUnit[cvX]) or 0) - vBase[cvY] = (tonumber(vBase[cvY]) or 0) - (tonumber(vUnit[cvY]) or 0) - vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) - (tonumber(vUnit[cvZ]) or 0) -end - -function SubVectorXYZ(vBase, nX, nY, nZ) - if(not vBase) then return StatusLog(nil,"SubVectorXYZ: Base invalid") end - vBase[cvX] = (tonumber(vBase[cvX]) or 0) - (tonumber(nX) or 0) - vBase[cvY] = (tonumber(vBase[cvY]) or 0) - (tonumber(nY) or 0) - vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) - (tonumber(nZ) or 0) -end - -function NegVector(vBase) - if(not vBase) then return StatusLog(nil,"NegVector: Base invalid") end - vBase[cvX] = -(tonumber(vBase[cvX]) or 0) - vBase[cvY] = -(tonumber(vBase[cvY]) or 0) - vBase[cvZ] = -(tonumber(vBase[cvZ]) or 0) -end - -function SetVector(vBase, vUnit) - if(not vBase) then return StatusLog(nil,"SetVector: Base invalid") end - if(not vUnit) then return StatusLog(nil,"SetVector: Unit invalid") end - vBase[cvX] = (tonumber(vUnit[cvX]) or 0) - vBase[cvY] = (tonumber(vUnit[cvY]) or 0) - vBase[cvZ] = (tonumber(vUnit[cvZ]) or 0) -end - -function SetVectorXYZ(vBase, nX, nY, nZ) - if(not vBase) then return StatusLog(nil,"SetVector: Base invalid") end - vBase[cvX] = (tonumber(nX or 0)) - vBase[cvY] = (tonumber(nY or 0)) - vBase[cvZ] = (tonumber(nZ or 0)) -end - -function DecomposeByAngle(vBase,aUnit) - if(not vBase) then return StatusLog(Vector(),"DecomposeByAngle: Base invalid") end - if(not aUnit) then return StatusLog(Vector(),"DecomposeByAngle: Unit invalid") end - local X = vBase:DotProduct(aUnit:Forward()) - local Y = vBase:DotProduct(aUnit:Right()) - local Z = vBase:DotProduct(aUnit:Up()) - SetVectorXYZ(vBase,X,Y,Z) -end - ----------- OOP ----------------- - -function MakeContainer(sInfo,sDefKey) - local Curs = 0 - local Data = {} - local sSel, sIns, sDel, sMet = "", "", "", "" - local Info = tostring(sInfo or "Store Container") - local Key = sDefKey or "(!_+*#-$@DEFKEY@$-#*+_!)" - local self = {} - function self:GetInfo() return Info end - function self:GetSize() return Curs end - function self:GetData() return Data end - function self:Insert(nsKey,anyValue) - sIns = nsKey or Key - sMet = "I" - if(not IsExistent(Data[sIns])) then - Curs = Curs + 1 - end - Data[sIns] = anyValue - end - function self:Select(nsKey) - sSel = nsKey or Key - return Data[sSel] - end - function self:Delete(nsKey,fnDel) - sDel = nsKey or Key - sMet = "D" - if(IsExistent(Data[sDel])) then - if(IsExistent(fnDel)) then - fnDel(Data[sDel]) - end - Data[sDel] = nil - Curs = Curs - 1 - end - end - function self:GetHistory() - return tostring(sMet)..GetOpVar("OPSYM_REVSIGN").. - tostring(sSel)..GetOpVar("OPSYM_DIRECTORY").. - tostring(sIns)..GetOpVar("OPSYM_DIRECTORY").. - tostring(sDel) - end - setmetatable(self,GetOpVar("TYPEMT_CONTAINER")) - return self -end - -function MakeScreen(sW,sH,eW,eH,conPalette) - if(SERVER) then return nil end - local sW, sH = (tonumber(sW) or 0), (tonumber(sH) or 0) - local eW, eH = (tonumber(eW) or 0), (tonumber(eH) or 0) - if(eW <= 0 or eH <= 0) then return nil end - if(type(conPalette) ~= "table") then return nil end - local White = Color(255,255,255,255) - local Palette - local ColorKey - local Text = {} - Text.Font = "Trebuchet18" - Text.DrawX = 0 - Text.DrawY = 0 - Text.ScrW = 0 - Text.ScrH = 0 - Text.LastW = 0 - Text.LastH = 0 - if(getmetatable(conPalette) == GetOpVar("TYPEMT_CONTAINER")) then - Palette = conPalette - end - local Texture = {} - Texture.Path = "vgui/white" - Texture.ID = surfaceGetTextureID(Texture.Path) - local self = {} - function self:GetSize() return (eW-sW), (eH-sH) end - function self:GetCenter(nX,nY) - local nW, nH = self:GetSize() - nW = (nW / 2) + (tonumber(nX) or 0) - nH = (nH / 2) + (tonumber(nY) or 0) - return nW, nH - end - function self:SetColor(keyColor) - if(not keyColor) then return end - local keyColor = keyColor or ColorKey; ColorKey = keyColor - local rgbColor = (Palette and keyColor) and Palette:Select(keyColor) or White - surfaceSetDrawColor(rgbColor.r, rgbColor.g, rgbColor.b, rgbColor.a) - surfaceSetTextColor(rgbColor.r, rgbColor.g, rgbColor.b, rgbColor.a) - end - function self:SetTexture(sTexture) - if(not IsString(sTexture)) then return end - if(IsEmptyString(sTexture)) then return end - Texture.Path = sTexture - Texture.ID = surfaceGetTextureID(Texture.Path) - end - function self:GetTexture() return Texture.ID, Texture.Path end - function self:DrawBackGround(keyColor) - self:SetColor(keyColor) - surfaceSetTexture(Texture.ID) - surfaceDrawTexturedRect(sW,sH,eW-sW,eH-sH) - end - function self:DrawRect(nX,nY,nW,nH,keyColor) - self:SetColor(keyColor) - surfaceSetTexture(Texture.ID) - surfaceDrawTexturedRect(nX,nY,nW,nH) - end - function self:SetTextEdge(nX,nY) - Text.DrawX = (tonumber(nX) or 0) - Text.DrawY = (tonumber(nY) or 0) - Text.ScrW = 0 - Text.ScrH = 0 - Text.LastW = 0 - Text.LastH = 0 - end - function self:SetFont(sFont) - if(not IsString(sFont)) then return end - Text.Font = sFont or "Trebuchet18" - surfaceSetFont(Text.Font) - end - function self:GetTextState(nX,nY,nW,nH) - return (Text.DrawX + (nX or 0)), (Text.DrawY + (nY or 0)), - (Text.ScrW + (nW or 0)), (Text.ScrH + (nH or 0)), - Text.LastW, Text.LastH - end - function self:DrawText(sText,keyColor) - surfaceSetTextPos(Text.DrawX,Text.DrawY) - self:SetColor(keyColor) - surfaceDrawText(sText) - Text.LastW, Text.LastH = surfaceGetTextSize(sText) - Text.DrawY = Text.DrawY + Text.LastH - if(Text.LastW > Text.ScrW) then - Text.ScrW = Text.LastW - end - Text.ScrH = Text.DrawY - end - function self:DrawTextAdd(sText,keyColor) - surfaceSetTextPos(Text.DrawX + Text.LastW,Text.DrawY - Text.LastH) - self:SetColor(keyColor) - surfaceDrawText(sText) - local LastW, LastH = surfaceGetTextSize(sText) - Text.LastW = Text.LastW + LastW - Text.LastH = LastH - if(Text.LastW > Text.ScrW) then - Text.ScrW = Text.LastW - end - Text.ScrH = Text.DrawY - end - function self:Enclose(xyPnt) - if(xyPnt.x < sW) then return -1 end - if(xyPnt.x > eW) then return -1 end - if(xyPnt.y < sH) then return -1 end - if(xyPnt.y > eH) then return -1 end - return 1 - end - function self:DrawLine(xyS,xyE,keyColor,sMeth,tArg) - self:SetColor(keyColor) - if(not (xyS and xyE)) then return end - if(not (xyS.x and xyS.y and xyE.x and xyE.y)) then return end - if(self:Enclose(xyS) == -1 or self:Enclose(xyE) == -1) then return end - local sdrwMeth = tostring(sMeth or "API") - if(sdrwMeth == "API") then - surfaceDrawLine(xyS.x,xyS.y,xyE.x,xyE.y) - elseif(sdrwMeth == "LIN") then - local nIter = tonumber(tArg[1]) or 0 - if(nIter <= 0) then return end - local nLx, nLy = (xyE.x - xyS.x), (xyE.y - xyS.y) - local xyD = {x = (nLx / nIter), y = (nLy / nIter)} - local xyOld, xyNew = {x = xyS.x, y = xyS.y}, {x = 0,y = 0} - while(nIter > 0) do - xyNew.x = xyOld.x + xyD.x - xyNew.y = xyOld.y + xyD.y - self:DrawLine(xyOld,xyNew,keyColor) - surfaceDrawCircle(xyNew.x, xyNew.y, 10, Color(255,0,0)) - xyOld.x, xyOld.y = xyNew.x, xyNew.y - nIter = nIter - 1; - end - end - end - function self:DrawCircle(xyPos,nRad,keyColor,sMeth,tArg) - local sdrwMeth = tostring(sMeth or "API") - local keyColor = keyColor or ColorKey; ColorKey = keyColor - local rgbColor = (Palette and keyColor) and Palette:Select(keyColor) or White - if(sdrwMeth == "API") then surfaceDrawCircle(xyPos.x, xyPos.y, nRad, rgbColor) - elseif(sdrwMeth == "LIN") then - local nIter = tonumber(tArg[1]) or 0 - if(nIter <= 0) then return end - local nCurAng = 0 - local nMaxRot = (GetOpVar("MAX_ROTATION") * mathPi / 180) - local nStpRot = nMaxRot / nIter - local xyOld, xyNew, xyRad = {x=0,y=0}, {x=0,y=0}, {x=nRad,y=0} - xyOld.x = xyPos.x + xyRad.x - xyOld.y = xyPos.y + xyRad.y - while(nIter > 0) do - nCurAng = nCurAng + nStpRot - local nSin, nCos = mathSin(nCurAng), mathCos(nCurAng) - xyNew.x = xyPos.x + (xyRad.x * nCos - xyRad.y * nSin) - xyNew.y = xyPos.y + (xyRad.x * nSin + xyRad.y * nCos) - self:DrawLine(xyOld,xyNew,keyColor) - xyOld.x, xyOld.y = xyNew.x, xyNew.y - nIter = nIter - 1; - end - end - end - setmetatable(self,GetOpVar("TYPEMT_SCREEN")) - return self -end - -function SetAction(sKey,fAct,tDat) - if(not (sKey and IsString(sKey))) then return false end - if(not (fAct and type(fAct) == "function")) then return false end - if(not libAction[sKey]) then - libAction[sKey] = {} - end - libAction[sKey].Act = fAct - libAction[sKey].Dat = tDat - return true -end - -function GetActionCode(sKey) - if(not (sKey and IsString(sKey))) then return StatusLog(nil,"GetActionCode: ") end - if(not (libAction and libAction[sKey])) then return nil end - return libAction[sKey].Act -end - -function GetActionData(sKey) - if(not (sKey and IsString(sKey))) then return nil end - if(not (libAction and libAction[sKey])) then return nil end - return libAction[sKey].Dat -end - -function CallAction(sKey,A1,A2,A3,A4) - if(not (sKey and IsString(sKey))) then return false end - if(not (libAction and libAction[sKey])) then return false end - return libAction[sKey].Act(A1,A2,A3,A4,libAction[sKey].Dat) -end - -function IsOther(oEnt) - if(not oEnt) then return true end - if(not oEnt:IsValid()) then return true end - if(oEnt:IsPlayer()) then return true end - if(oEnt:IsVehicle()) then return true end - if(oEnt:IsNPC()) then return true end - if(oEnt:IsRagdoll()) then return true end - if(oEnt:IsWeapon()) then return true end - if(oEnt:IsWidget()) then return true end - return false -end - -local function AddLineListView(pnListView,frUsed,ivNdex) - if(not IsExistent(pnListView)) then - return StatusLog(nil,"LineAddListView: Missing panel") end - if(not IsValid(pnListView)) then - return StatusLog(nil,"LineAddListView: Invalid panel") end - if(not IsExistent(frUsed)) then - return StatusLog(nil,"LineAddListView: Missing data") end - local iNdex = tonumber(ivNdex) - if(not IsExistent(iNdex)) then - return StatusLog(nil,"LineAddListView: Index NAN {"..type(ivNdex).."}<"..tostring(ivNdex)..">") end - local tValue = frUsed[iNdex] - if(not IsExistent(tValue)) then - return StatusLog(nil,"LineAddListView: Missing data on index #"..tostring(iNdex)) end - local defTable = GetOpVar("DEFTABLE_PIECES") - if(not IsExistent(defTable)) then - return StatusLog(nil,"LineAddListView: Missing table definition") end - local sModel = tValue.Table[defTable[1][1]] - local sType = tValue.Table[defTable[2][1]] - local nAct = tValue.Table[defTable[4][1]] - local nUsed = RoundValue(tValue.Value,0.001) - local pnRec = pnListView:AddLine(nUsed,nAct,sType,sModel) - if(not IsExistent(pnRec)) then - return StatusLog(nil,"LineAddListView: Failed to create a ListView line for <"..sModel.."> #"..tostring(iNdex)) end - return pnRec, tValue -end - ---[[ - * Updates a VGUI pnListView with a search preformed in the already generated - * frequently used pieces "frUsed" for the pattern "sPattern" given by the user - * and a field name selected "sField". - * On success populates "pnListView" with the search preformed - * On fail a parameter is not valid or missing and returns non-success -]]-- -function UpdateListView(pnListView,frUsed,nCount,sField,sPattern) - if(not (IsExistent(frUsed) and IsExistent(frUsed[1]))) then - return StatusLog(false,"UpdateListView: Missing data") end - local nCount = tonumber(nCount) or 0 - if(nCount <= 0) then - return StatusLog(false,"UpdateListView: Count not applicable") end - if(IsExistent(pnListView)) then - if(not IsValid(pnListView)) then - return StatusLog(false,"UpdateListView: Invalid ListView") end - pnListView:SetVisible(false) - pnListView:Clear() - else - return StatusLog(false,"UpdateListView: Missing ListView") - end - local sField = tostring(sField or "") - local sPattern = tostring(sPattern or "") - local iNdex, pnRec, sData = 1, nil, nil - while(frUsed[iNdex]) do - if(IsEmptyString(sPattern)) then - pnRec = AddLineListView(pnListView,frUsed,iNdex) - if(not IsExistent(pnRec)) then - return StatusLog(false,"UpdateListView: Failed to add line on #"..tostring(iNdex)) end - else - sData = tostring(frUsed[iNdex].Table[sField] or "") - if(stringFind(sData,sPattern)) then - pnRec = AddLineListView(pnListView,frUsed,iNdex) - if(not IsExistent(pnRec)) then - return StatusLog(false,"UpdateListView: Failed to add line <" - ..sData.."> pattern <"..sPattern.."> on <"..sField.."> #"..tostring(iNdex)) end - end - end - iNdex = iNdex + 1 - end - pnListView:SetVisible(true) - return StatusLog(true,"UpdateListView: Crated #"..tostring(iNdex-1)) -end - -local function PushSortValues(tTable,snCnt,nsValue,tData) - local iCnt = mathFloor(tonumber(snCnt) or 0) - if(not (tTable and (type(tTable) == "table") and (iCnt > 0))) then return 0 end - local iInd = 1 - if(not tTable[iInd]) then - tTable[iInd] = {Value = nsValue, Table = tData } - return iInd - else - while(tTable[iInd] and (tTable[iInd].Value < nsValue)) do - iInd = iInd + 1 - end - if(iInd > iCnt) then return iInd end - while(iInd < iCnt) do - tTable[iCnt] = tTable[iCnt - 1] - iCnt = iCnt - 1 - end - tTable[iInd] = { Value = nsValue, Table = tData } - return iInd - end -end - -function GetFrequentModels(snCount) - local snCount = tonumber(snCount) or 0 - if(snCount < 1) then - return StatusLog(nil,"GetFrequentModels: Count not applicable") end - local defTable = GetOpVar("DEFTABLE_PIECES") - if(not IsExistent(defTable)) then - return StatusLog(nil,"GetFrequentModels: Missing table definition") end - local tCache = libCache[defTable.Name] - if(not IsExistent(tCache)) then - return StatusLog(nil,"GetFrequentModels: Missing table cache space") end - local iInd, tmNow = 1, Time() - local frUsed = GetOpVar("TABLE_FREQUENT_MODELS") - tableEmpty(frUsed) - for Model, Record in pairs(tCache) do - if(IsExistent(Record.Used) and IsExistent(Record.Kept) and Record.Kept > 0) then - iInd = PushSortValues(frUsed,snCount,tmNow-Record.Used,{ - [defTable[1][1]] = Model, - [defTable[2][1]] = Record.Type, - [defTable[3][1]] = Record.Name, - [defTable[4][1]] = Record.Kept - }) - if(iInd < 1) then return StatusLog(nil,"GetFrequentModels: Array index out of border") end - end - end - if(IsExistent(frUsed) and IsExistent(frUsed[1])) then return frUsed, snCount end - return StatusLog(nil,"GetFrequentModels: Array is empty or not available") -end - -function RoundValue(nvExact, nFrac) - local nExact = tonumber(nvExact) - if(not IsExistent(nExact)) then - return StatusLog(nil,"RoundValue: Cannot round NAN {"..type(nvExact).."}<"..tostring(nvExact)..">") end - local nFrac = tonumber(nFrac) or 0 - if(nFrac == 0) then - return StatusLog(nil,"RoundValue: Fraction must be <> 0") end - local q, f = mathModf(nExact/nFrac) - return nFrac * (q + (f > 0.5 and 1 or 0)) -end - -function SnapValue(nvVal, nvSnap) - if(not nvVal) then return 0 end - local nVal = tonumber(nvVal) - if(not IsExistent(nVal)) then - return StatusLog(0,"SnapValue: Convert value NAN {"..type(nvVal).."}<"..tostring(nvVal)..">") end - if(not IsExistent(nvSnap)) then return nVal end - local nSnap = tonumber(nvSnap) - if(not IsExistent(nSnap)) then - return StatusLog(0,"SnapValue: Convert snap NAN {"..type(nvSnap).."}<"..tostring(nvSnap)..">") end - if(nSnap == 0) then return nVal end - local nvSnp, nvVal = mathAbs(nSnap), mathAbs(nVal) - local nRst, nRez = (nvVal % nvSnp), 0 - if((nvSnp - nRst) < nRst) then nRez = nvVal + nvSnp - nRst else nRez = nvVal - nRst end - if(nVal < 0) then return -nRez; end - return nRez; -end - -function GetCenterMC(oEnt) - -- Set the ENT's Angles first! - if(not (oEnt and oEnt:IsValid())) then - return StatusLog(Vector(0,0,0),"GetCenterMC: Entity Invalid") end - local Phys = oEnt:GetPhysicsObject() - if(not (Phys and Phys:IsValid())) then - return StatusLog(Vector(0,0,0),"GetCenterMC: Phys object Invalid") end - local vRez = Phys:GetMassCenter() - vRez[cvX] = -vRez[cvX]; vRez[cvY] = -vRez[cvY]; vRez[cvZ] = 0 - vRez:Rotate(oEnt:GetAngles()) - return vRez -end - -function IsPhysTrace(Trace) - if(not Trace) then return false end - if(not Trace.Hit) then return false end - if(Trace.HitWorld) then return false end - local eEnt = Trace.Entity - if(not eEnt) then return false end - if(not eEnt:IsValid()) then return false end - if(not eEnt:GetPhysicsObject():IsValid()) then return false end - return true -end - -local function RollValue(nVal,nMin,nMax) - if(nVal > nMax) then return nMin end - if(nVal < nMin) then return nMax end - return nVal -end - -local function BorderValue(nsVal,sName) - if(not IsString(sName)) then return nsVal end - if(not (IsString(nsVal) or tonumber(nsVal))) then - return StatusLog(nsVal,"BorderValue: Value not comparable") end - local Border = GetOpVar("TABLE_BORDERS") - Border = Border[sName] - if(IsExistent(Border)) then - if (nsVal < Border[1]) then return Border[1] - elseif(nsVal > Border[2]) then return Border[2] end - end - return nsVal -end - -function IncDecPointID(ivPointID,sDir,rPiece) - local iPointID = tonumber(ivPointID) - if(not IsExistent(iPointID)) then - return StatusLog(1,"IncDecPointID: Point ID NAN {"..type(ivPointID).."}<"..tostring(ivPointID)..">") end - local stPOA = LocatePOA(rPiece,iPointID) - if(not IsExistent(stPOA)) then - return StatusLog(1,"IncDecPointID: Point ID #"..tostring(iPointID).." not located") end - local sDir, nDir = stringSub(tostring(sDir),1,1), 0 - if (sDir == "+") then nDir = 1 - elseif(sDir == "-") then nDir = -1 - else return StatusLog(iPointID,"IncDecPointID: Direction <"..sDir.."> mismatch") end - iPointID = RollValue(iPointID + nDir,1,rPiece.Kept) - stPOA = LocatePOA(rPiece,iPointID) -- Skip disabled O ( Origin ) - while(stPOA and stPOA.O[csD]) do - LogInstance("IncDecPointID: Point ID #"..tostring(iPointID).." disabled") - iPointID = RollValue(iPointID + nDir,1,rPiece.Kept) - stPOA = LocatePOA(rPiece,iPointID) -- Skip disabled O ( Origin ) - end; iPointID = RollValue(iPointID,1,rPiece.Kept) - if(not IsExistent(LocatePOA(rPiece,iPointID))) then - return StatusLog(1,"IncDecPointID["..sDir.."]: Offset PnextID #"..tostring(iPointID).." not located") end - return iPointID -end - -function IncDecPnextID(ivPnextID,ivPointID,sDir,rPiece) - local iPointID, iPnextID = tonumber(ivPointID), tonumber(ivPnextID) - if(not IsExistent(iPointID)) then - return StatusLog(1,"IncDecPnextID: PointID NAN {"..type(ivPointID).."}<"..tostring(ivPointID)..">") end - if(not IsExistent(iPnextID)) then - return StatusLog(1,"IncDecPnextID: PnextID NAN {"..type(ivPnextID).."}<"..tostring(ivPnextID)..">") end - if(not IsExistent(LocatePOA(rPiece,iPointID))) then - return StatusLog(1,"IncDecPointID: Offset PointID #"..tostring(iPointID).." not located") end - if(not IsExistent(LocatePOA(rPiece,iPnextID))) then - return StatusLog(1,"IncDecPointID: Offset PnextID #"..tostring(iPnextID).." not located") end - local sDir, nDir = stringSub(tostring(sDir),1,1), 0 - if (sDir == "+") then nDir = 1 - elseif(sDir == "-") then nDir = -1 - else return StatusLog(iPnextID,"IncDecPnextID: Direction <"..sDir.."> mismatch") end - iPnextID = RollValue(iPnextID + nDir,1,rPiece.Kept) - if(iPnextID == iPointID) then iPnextID = RollValue(iPnextID + nDir,1,rPiece.Kept) end - if(not IsExistent(LocatePOA(rPiece,iPnextID))) then - return StatusLog(1,"IncDecPointID["..sDir.."]: Offset PnextID #"..tostring(iPnextID).." not located") end - return iPnextID -end - -function PointOffsetUp(oEnt,ivPointID) - if(not (oEnt and oEnt:IsValid())) then - return StatusLog(nil,"PointOffsetUp: Entity Invalid") end - local sModel = oEnt:GetModel() - local iPointID = tonumber(ivPointID) - if(not IsExistent(iPointID)) then - return StatusLog(nil,"PointOffsetUp: PointID NAN {" - ..type(ivPointID).."}<"..tostring(ivPointID).."> for <"..sModel..">") end - local hdRec = CacheQueryPiece(sModel) - if(not IsExistent(hdRec)) then - return StatusLog(nil,"PointOffsetUp: Record not found for <"..sModel..">") end - local hdPnt = LocatePOA(hdRec,iPointID) - if(not IsExistent(hdPnt)) then - return StatusLog(nil,"PointOffsetUp: Point #"..tostring(iPointID) - .." not located on model <"..sModel..">") end - if(not (hdPnt.O and hdPnt.A)) then - return StatusLog(nil,"PointOffsetUp: Invalid POA #"..tostring(iPointID).." for <"..sModel..">") end - local aDiffBB = Angle() - local vDiffBB = oEnt:OBBMins() - SetAngle(aDiffBB,hdPnt.A) - aDiffBB:RotateAroundAxis(aDiffBB:Up(),180) - SubVector(vDiffBB,hdPnt.O) - DecomposeByAngle(vDiffBB,aDiffBB) - return mathAbs(vDiffBB[cvZ]) -end - -function ModelToName(sModel) - if(not IsString(sModel)) then - return StatusLog("","ModelToName: Argument {"..type(sModel).."}<"..tostring(sModel)..">") end - if(IsEmptyString(sModel)) then return StatusLog("","ModelToName: Empty string") end - local fCh, bCh, Cnt = "", "", 1 - local sSymDiv = GetOpVar("OPSYM_DIVIDER") - local sSymDir = GetOpVar("OPSYM_DIRECTORY") - local sModel = stringGsub(stringToFileName(sModel),GetOpVar("FILE_MODEL"),"") - local gModel = stringSub(sModel,1,-1) -- Create a copy so we can select cut-off parts later on - local tCut, tSub, tApp = SettingsModelToName("GET") - if(tCut and tCut[1]) then - while(tCut[Cnt] and tCut[Cnt+1]) do - fCh = tonumber(tCut[Cnt]) - bCh = tonumber(tCut[Cnt+1]) - if(not (IsExistent(fCh) and IsExistent(bCh))) then - return StatusLog("","ModelToName: Cannot cut the model in {" - ..tostring(tCut[Cnt])..","..tostring(tCut[Cnt+1]).."} for "..sModel) - end - LogInstance("ModelToName[CUT]: {"..tostring(tCut[Cnt])..", "..tostring(tCut[Cnt+1]).."} << "..gModel) - gModel = stringGsub(gModel,stringSub(sModel,fCh,bCh),"") - LogInstance("ModelToName[CUT]: {"..tostring(tCut[Cnt])..", "..tostring(tCut[Cnt+1]).."} >> "..gModel) - Cnt = Cnt + 2 - end - Cnt = 1 - end - -- Replace the unneeded parts by finding an in-string gModel - if(tSub and tSub[1]) then - while(tSub[Cnt]) do - fCh = tostring(tSub[Cnt] or "") - bCh = tostring(tSub[Cnt+1] or "") - LogInstance("ModelToName[SUB]: {"..tostring(tSub[Cnt])..", "..tostring(tSub[Cnt+1]).."} << "..gModel) - gModel = stringGsub(gModel,fCh,bCh) - LogInstance("ModelToName[SUB]: {"..tostring(tSub[Cnt])..", "..tostring(tSub[Cnt+1]).."} >> "..gModel) - Cnt = Cnt + 2 - end - Cnt = 1 - end - -- Append something if needed - if(tApp and tApp[1]) then - LogInstance("ModelToName[APP]: {"..tostring(tApp[Cnt])..", "..tostring(tApp[Cnt+1]).."} << "..gModel) - gModel = tostring(tApp[1] or "")..gModel..tostring(tApp[2] or "") - LogInstance("ModelToName[APP]: {"..tostring(tSub[Cnt])..", "..tostring(tSub[Cnt+1]).."} >> "..gModel) - end - -- Trigger the capital-space using the divider - if(stringSub(gModel,1,1) ~= sSymDiv) then gModel = sSymDiv..gModel end - -- Here in gModel we have: _aaaaa_bbbb_ccccc - fCh, bCh, sModel = stringFind(gModel,sSymDiv,1), 1, "" - while(fCh) do - if(fCh > bCh) then - sModel = sModel..stringSub(gModel,bCh+2,fCh-1) - end - if(not IsEmptyString(sModel)) then - sModel = sModel.." " - end - sModel = sModel..stringUpper(stringSub(gModel,fCh+1,fCh+1)) - bCh = fCh - fCh = stringFind(gModel,sSymDiv,fCh+1) - end - return sModel..stringSub(gModel,bCh+2,-1) -end - -function LocatePOA(oRec, ivPointID) - if(not oRec) then - return StatusLog(nil,"LocatePOA: Missing record") end - if(not oRec.Offs) then - return StatusLog(nil,"LocatePOA: Missing offsets for <"..tostring(oRec.Slot)..">") end - local iPointID = mathFloor(tonumber(ivPointID) or 0) - local stPOA = oRec.Offs[iPointID] - if(not IsExistent(stPOA)) then - return StatusLog(nil,"LocatePOA: Missing ID #"..tostring(iPointID).." <" - ..tostring(ivPointID).."> for <"..tostring(oRec.Slot)..">") end - return stPOA -end - -local function ReloadPOA(nXP,nYY,nZR,nSX,nSY,nSZ,nSD) - local arPOA = GetOpVar("ARRAY_DECODEPOA") - arPOA[1] = tonumber(nXP) or 0 - arPOA[2] = tonumber(nYY) or 0 - arPOA[3] = tonumber(nZR) or 0 - arPOA[4] = tonumber(nSX) or 1 - arPOA[5] = tonumber(nSY) or 1 - arPOA[6] = tonumber(nSZ) or 1 - arPOA[7] = (tonumber(nSD) and (nSD ~= 0)) and true or false - return arPOA -end - -local function IsEqualPOA(staPOA,stbPOA) - if(not IsExistent(staPOA)) then - return StatusLog(false,"EqualPOA: Missing offset A") end - if(not IsExistent(stbPOA)) then - return StatusLog(false,"EqualPOA: Missing offset B") end - for kKey, vComp in pairs(staPOA) do - if(kKey ~= csD and stbPOA[kKey] ~= vComp) then return false end - end - return true -end - -local function IsZeroPOA(stPOA,sOffs) - if(not IsString(sOffs)) then - return StatusLog(nil,"IsZeroPOA: Mode {"..type(sOffs).."}<"..tostring(sOffs).."> not string") end - if(not IsExistent(stPOA)) then - return StatusLog(nil,"IsZeroPOA: Missing offset") end - local ctA, ctB, ctC - if (sOffs == "V") then ctA, ctB, ctC = cvX, cvY, cvZ - elseif(sOffs == "A") then ctA, ctB, ctC = caP, caY, caR - else return StatusLog(nil,"IsZeroPOA: Missed offset mode "..sOffs) end - if(stPOA[ctA] == 0 and stPOA[ctB] == 0 and stPOA[ctC] == 0) then return true end - return false -end - -local function StringPOA(stPOA,sOffs) - if(not IsString(sOffs)) then - return StatusLog(nil,"StringPOA: Mode {"..type(sOffs).."}<"..tostring(sOffs).."> not string") end - if(not IsExistent(stPOA)) then - return StatusLog(nil,"StringPOA: Missing Offsets") end - local symRevs = GetOpVar("OPSYM_REVSIGN") - local symDisa = GetOpVar("OPSYM_DISABLE") - local symSepa = GetOpVar("OPSYM_SEPARATOR") - local sModeDB = GetOpVar("MODE_DATABASE") - if (sOffs == "V") then ctA, ctB, ctC = cvX, cvY, cvZ - elseif(sOffs == "A") then ctA, ctB, ctC = caP, caY, caR - else return StatusLog(nil,"StringPOA: Missed offset mode "..sOffs) end - return stringGsub((stPOA[csD] and symDisa or "") -- Get rid of the spaces - ..((stPOA[csA] == -1) and symRevs or "")..tostring(stPOA[ctA])..symSepa - ..((stPOA[csB] == -1) and symRevs or "")..tostring(stPOA[ctB])..symSepa - ..((stPOA[csC] == -1) and symRevs or "")..tostring(stPOA[ctC])," ","") -end - -local function TransferPOA(stOffset,sMode) - if(not IsExistent(stOffset)) then - return StatusLog(nil,"TransferPOA: Destination needed") end - if(not IsString(sMode)) then - return StatusLog(nil,"TransferPOA: Mode {"..type(sMode).."}<"..tostring(sMode).."> not string") end - local arPOA = GetOpVar("ARRAY_DECODEPOA") - if (sMode == "V") then stOffset[cvX] = arPOA[1]; stOffset[cvY] = arPOA[2]; stOffset[cvZ] = arPOA[3] - elseif(sMode == "A") then stOffset[caP] = arPOA[1]; stOffset[caY] = arPOA[2]; stOffset[caR] = arPOA[3] - else return StatusLog(nil,"TransferPOA: Missed mode "..sMode) end - stOffset[csA] = arPOA[4]; stOffset[csB] = arPOA[5]; stOffset[csC] = arPOA[6]; stOffset[csD] = arPOA[7] - return arPOA -end - -local function DecodePOA(sStr) - if(not IsString(sStr)) then - return StatusLog(nil,"DecodePOA: Argument {"..type(sStr).."}<"..tostring(sStr).."> not string") end - local sCh = "" - local dInd, iSep = 1, 0 - local S, E, iCnt = 1, 1, 1 - local strLen = stringLen(sStr) - local symOff = GetOpVar("OPSYM_DISABLE") - local symRev = GetOpVar("OPSYM_REVSIGN") - local symSep = GetOpVar("OPSYM_SEPARATOR") - local arPOA = GetOpVar("ARRAY_DECODEPOA") - ReloadPOA() - if(stringSub(sStr,iCnt,iCnt) == symOff) then - arPOA[7] = true; iCnt = iCnt + 1; S = S + 1 end - while(iCnt <= strLen) do - sCh = stringSub(sStr,iCnt,iCnt) - if(sCh == symRev) then - arPOA[3+dInd] = -arPOA[3+dInd]; S = S + 1 - elseif(sCh == symSep) then - iSep = iSep + 1; E = iCnt - 1 - if(iSep > 2) then break end - arPOA[dInd] = tonumber(stringSub(sStr,S,E)) or 0 - dInd = dInd + 1; S = iCnt + 1; E = S - else E = E + 1 end - iCnt = iCnt + 1 - end - arPOA[dInd] = tonumber(stringSub(sStr,S,E)) or 0 - return arPOA -end - -local function RegisterPOA(stPiece, ivID, sP, sO, sA) - if(not stPiece) then - return StatusLog(nil,"RegisterPOA: Cache record invalid") end - local iID = tonumber(ivID) - if(not IsExistent(iID)) then - return StatusLog(nil,"RegisterPOA: OffsetID NAN {"..type(ivID).."}<"..tostring(ivID)..">") end - local sP = sP or "NULL" - local sO = sO or "NULL" - local sA = sA or "NULL" - if(not IsString(sP)) then - return StatusLog(nil,"RegisterPOA: Point {"..type(sP).."}<"..tostring(sP)..">") end - if(not IsString(sO)) then - return StatusLog(nil,"RegisterPOA: Origin {"..type(sO).."}<"..tostring(sO)..">") end - if(not IsString(sA)) then - return StatusLog(nil,"RegisterPOA: Angle {"..type(sA).."}<"..tostring(sA)..">") end - if(not stPiece.Offs) then - if(iID > 1) then return StatusLog(nil,"RegisterPOA: First ID cannot be #"..tostring(iID)) end - stPiece.Offs = {} - end - local tOffs = stPiece.Offs - if(tOffs[iID]) then - return StatusLog(nil,"RegisterPOA: Exists ID #"..tostring(iID)) - else - if((iID > 1) and (not tOffs[iID - 1])) then - return StatusLog(nil,"RegisterPOA: No sequential ID #"..tostring(iID - 1)) - end - tOffs[iID] = {} - tOffs[iID].P = {} - tOffs[iID].O = {} - tOffs[iID].A = {} - tOffs = tOffs[iID] - end - ---------------- Origin ---------------- - if((sO ~= "NULL") and not IsEmptyString(sO)) then DecodePOA(sO) else ReloadPOA() end - if(not IsExistent(TransferPOA(tOffs.O,"V"))) then - return StatusLog(nil,"RegisterPOA: Cannot transfer origin") end - ---------------- Point ---------------- - local sD = stringGsub(sP,GetOpVar("OPSYM_DISABLE"),"") - if((sP ~= "NULL") and not IsEmptyString(sP)) then DecodePOA(sP) else ReloadPOA() end - if(not IsExistent(TransferPOA(tOffs.P,"V"))) then - return StatusLog(nil,"RegisterPOA: Cannot transfer point") end - if((sD == "NULL") or IsEmptyString(sD)) then -- If empty use origin - tOffs.P[cvX] = tOffs.O[cvX]; tOffs.P[cvY] = tOffs.O[cvY]; tOffs.P[cvZ] = tOffs.O[cvZ]; - tOffs.P[csA] = tOffs.O[csA]; tOffs.P[csB] = tOffs.O[csB]; tOffs.P[csC] = tOffs.O[csC]; - end - ---------------- Angle ---------------- - if((sA ~= "NULL") and not IsEmptyString(sA)) then DecodePOA(sA) else ReloadPOA() end - if(not IsExistent(TransferPOA(tOffs.A,"A"))) then - return StatusLog(nil,"RegisterPOA: Cannot transfer angle") end - return tOffs -end - -local function Sort(tTable,tKeys,tFields) - - local function QuickSort(Data,Lo,Hi) - if(not (Lo and Hi and (Lo > 0) and (Lo < Hi))) then - return StatusLog(nil,"QuickSort: Data dimensions mismatch") end - local iMid = mathRandom(Hi-(Lo-1))+Lo-1 - Data[Lo], Data[iMid] = Data[iMid], Data[Lo] - iMid = Lo - local vMid = Data[Lo].Val - local iCnt = Lo + 1 - while(iCnt <= Hi)do - if(Data[iCnt].Val < vMid) then - iMid = iMid + 1 - Data[iMid], Data[iCnt] = Data[iCnt], Data[iMid] - end - iCnt = iCnt + 1 - end - Data[Lo], Data[iMid] = Data[iMid], Data[Lo] - QuickSort(Data,Lo,iMid-1) - QuickSort(Data,iMid+1,Hi) - end - - local Match = {} - local tKeys = tKeys or {} - local tFields = tFields or {} - local iCnt, iInd, sKey, vRec, sFld = 1, nil, nil, nil, nil - if(not tKeys[1]) then - for k,v in pairs(tTable) do - tKeys[iCnt] = k; iCnt = iCnt + 1 - end; iCnt = 1 - end - while(tKeys[iCnt]) do - sKey = tKeys[iCnt]; vRec = tTable[sKey] - if(not vRec) then - return StatusLog(nil,"Sort: Key <"..sKey.."> does not exist in the primary table") end - Match[iCnt] = {} - Match[iCnt].Key = sKey - if(type(vRec) == "table") then - Match[iCnt].Val, iInd = "", 1 - while(tFields[iInd]) do - sFld = tFields[iInd] - if(not IsExistent(vRec[sFld])) then - return StatusLog(nil,"Sort: Field <"..sFld.."> not found on the current record") end - Match[iCnt].Val = Match[iCnt].Val..tostring(vRec[sFld]) - iInd = iInd + 1 - end - else Match[iCnt].Val = vRec end - iCnt = iCnt + 1 - end; QuickSort(Match,1,iCnt-1) - return Match -end - ---------------------- STRING ----------------------- - -function DisableString(sBase, anyDisable, anyDefault) - if(IsString(sBase)) then - local sFirst = stringSub(sBase,1,1) - if(sFirst ~= GetOpVar("OPSYM_DISABLE") and not IsEmptyString(sBase)) then - return sBase - elseif(sFirst == GetOpVar("OPSYM_DISABLE")) then - return anyDisable - end - end - return anyDefault -end - -function DefaultString(sBase, sDefault) - if(IsString(sBase)) then - if(not IsEmptyString(sBase)) then return sBase end - end - if(IsString(sDefault)) then return sDefault end - return "" -end - -------------- VARIABLE INTERFACES -------------- - -local function SQLBuildError(anyError) - if(not IsExistent(anyError)) then - return GetOpVar("SQL_BUILD_ERR") or "" end - SetOpVar("SQL_BUILD_ERR", tostring(anyError)) - return nil -- Nothing assembled -end - -function SettingsModelToName(sMode, gCut, gSub, gApp) - if(not IsString(sMode)) then - return StatusLog(false,"SettingsModelToName: Mode {"..type(sMode).."}<"..tostring(sMode).."> not string") end - if(sMode == "SET") then - if(gCut and gCut[1]) then SetOpVar("TABLE_GCUT_MODEL",gCut) else SetOpVar("TABLE_GCUT_MODEL",{}) end - if(gSub and gSub[1]) then SetOpVar("TABLE_GSUB_MODEL",gSub) else SetOpVar("TABLE_GSUB_MODEL",{}) end - if(gApp and gApp[1]) then SetOpVar("TABLE_GAPP_MODEL",gApp) else SetOpVar("TABLE_GAPP_MODEL",{}) end - elseif(sMode == "GET") then - return GetOpVar("TABLE_GCUT_MODEL"), GetOpVar("TABLE_GSUB_MODEL"), GetOpVar("TABLE_GAPP_MODEL") - elseif(sMode == "CLR") then - SetOpVar("TABLE_GCUT_MODEL",{}) - SetOpVar("TABLE_GSUB_MODEL",{}) - SetOpVar("TABLE_GAPP_MODEL",{}) - else - return StatusLog(false,"SettingsModelToName: Wrong mode name "..sMode) - end -end - -function DefaultType(anyType) - if(not IsExistent(anyType)) then - return GetOpVar("DEFAULT_TYPE") or "" end - SetOpVar("DEFAULT_TYPE",tostring(anyType)) - SettingsModelToName("CLR") -end - -function DefaultTable(anyTable) - if(not IsExistent(anyTable)) then - return GetOpVar("DEFAULT_TABLE") or "" end - SetOpVar("DEFAULT_TABLE",anyTable) - SettingsModelToName("CLR") -end - -------------------------- PLAYER ----------------------------------- - -function ConCommandPly(pPly,sCvar,snValue) - if(not pPly) then return StatusLog("","ConCommandPly: Player invalid") end - if(not IsString(sCvar)) then - return StatusLog("","ConCommandPly: Convar {"..type(sCvar).."}<"..tostring(sCvar).."> not string") end - return pPly:ConCommand(GetOpVar("TOOLNAME_PL")..sCvar.." "..tostring(snValue).."\n") -end - -function PrintNotifyPly(pPly,sText,sNotifType) - if(not pPly) then - return StatusLog(false,"PrintNotifyPly: Player invalid") end - if(SERVER) then - pPly:SendLua("GAMEMODE:AddNotify(\""..sText.."\", NOTIFY_"..sNotifType..", 6)") - pPly:SendLua("surface.PlaySound(\"ambient/water/drip"..mathRandom(1, 4)..".wav\")") - end - return StatusLog(true,"PrintNotifyPly: Success") -end - -function UndoCratePly(anyMessage) - SetOpVar("LABEL_UNDO",tostring(anyMessage)) - undoCreate(GetOpVar("LABEL_UNDO")) - return true -end - -function UndoAddEntityPly(oEnt) - if(not (oEnt and oEnt:IsValid())) then - return StatusLog(false,"UndoAddEntityPly: Entity invalid") end - undoAddEntity(oEnt) - return true -end - -function UndoFinishPly(pPly,anyMessage) - if(not pPly) then return StatusLog(false,"UndoFinishPly: Player invalid") end - pPly:EmitSound("physics/metal/metal_canister_impact_hard"..mathFloor(mathRandom(3))..".wav") - undoSetCustomUndoText(GetOpVar("LABEL_UNDO")..tostring(anyMessage or "")) - undoSetPlayer(pPly) - undoFinish() - return true -end - -function LoadKeyPly(pPly, sKey) - local keyPly = GetOpVar("HASH_PLAYER_KEYDOWN") - local plyCache = libCache[keyPly] - if(not IsExistent(plyCache)) then - libCache[keyPly] = {} - plyCache = libCache[keyPly] - end - if(not pPly) then - return StatusLog(false,"LoadKeyPly: Player not available") end - local spName = pPly:GetName() - local plyPlace = plyCache[spName] - if(not IsExistent(plyPlace)) then - plyCache[spName] = { - ["ALTLFT"] = false, - ["ALTRGH"] = false, - ["ATTLFT"] = false, - ["ATTRGH"] = false, - ["FORWARD"] = false, - ["BACK"] = false, - ["MOVELFT"] = false, - ["MOVERGH"] = false, - ["RELOAD"] = false, - ["USE"] = false, - ["DUCK"] = false, - ["JUMP"] = false, - ["SPEED"] = false, - ["SCORE"] = false, - ["ZOOM"] = false, - ["LEFT"] = false, - ["RIGHT"] = false, - ["WALK"] = false - } - plyPlace = plyCache[spName] - end - if(IsExistent(sKey)) then - if(not IsString(sKey)) then - return StatusLog(false,"LoadKeyPly: Key hash {"..type(sKey).."}<"..tostring(sKey).."> not string") end - if(sKey == "DEBUG") then - return plyPlace - end - LogInstance("LoadKeyPly: NamePK <"..sKey.."> = "..tostring(plyPlace[sKey])) - return plyPlace[sKey] - end - plyPlace["ALTLFT"] = pPly:KeyDown(IN_ALT1 ) - plyPlace["ALTRGH"] = pPly:KeyDown(IN_ALT2 ) - plyPlace["ATTLFT"] = pPly:KeyDown(IN_ATTACK ) - plyPlace["ATTRGH"] = pPly:KeyDown(IN_ATTACK2 ) - plyPlace["FORWARD"] = pPly:KeyDown(IN_FORWARD ) - plyPlace["BACK"] = pPly:KeyDown(IN_BACK ) - plyPlace["MOVELFT"] = pPly:KeyDown(IN_MOVELEFT ) - plyPlace["MOVERGH"] = pPly:KeyDown(IN_MOVERIGHT ) - plyPlace["RELOAD"] = pPly:KeyDown(IN_RELOAD ) - plyPlace["USE"] = pPly:KeyDown(IN_USE ) - plyPlace["DUCK"] = pPly:KeyDown(IN_DUCK ) - plyPlace["JUMP"] = pPly:KeyDown(IN_JUMP ) - plyPlace["SPEED"] = pPly:KeyDown(IN_SPEED ) - plyPlace["SCORE"] = pPly:KeyDown(IN_SCORE ) - plyPlace["ZOOM"] = pPly:KeyDown(IN_ZOOM ) - plyPlace["LEFT"] = pPly:KeyDown(IN_LEFT ) - plyPlace["RIGHT"] = pPly:KeyDown(IN_RIGHT ) - plyPlace["WALK"] = pPly:KeyDown(IN_WALK ) - return StatusLog(true,"LoadKeyPly: Player <"..spName.."> keys loaded") -end - --------------------------- BUILDSQL ------------------------------ - -local function MatchType(defTable,snValue,ivIndex,bQuoted,sQuote,bStopRevise,bStopEmpty) - if(not defTable) then - return StatusLog(nil,"MatchType: Missing table definition") end - local nIndex = tonumber(ivIndex) - if(not IsExistent(nIndex)) then - return StatusLog(nil,"MatchType: Field NAN {"..type(ivIndex)"}<" - ..tostring(ivIndex).."> invalid on table "..defTable.Name) end - local defField = defTable[nIndex] - if(not IsExistent(defField)) then - return StatusLog(nil,"MatchType: Invalid field #" - ..tostring(nIndex).." on table "..defTable.Name) end - local snOut - local tipField = tostring(defField[2]) - local sModeDB = GetOpVar("MODE_DATABASE") - if(tipField == "TEXT") then - snOut = tostring(snValue) - if(not bStopEmpty and (snOut == "nil" or IsEmptyString(snOut))) then - if (sModeDB == "SQL") then snOut = "NULL" - elseif(sModeDB == "LUA") then snOut = "NULL" - else return StatusLog(nil,"MatchType: Wrong database mode <"..sModeDB..">") end - end - if (defField[3] == "LOW") then snOut = stringLower(snOut) - elseif(defField[3] == "CAP") then snOut = stringUpper(snOut) end - if(not bStopRevise and sModeDB == "SQL" and defField[4] == "QMK") then - snOut = stringGsub(snOut,"'","''") - end - if(bQuoted) then - local sqChar - if(sQuote) then - sqChar = stringSub(tostring(sQuote),1,1) - else - if (sModeDB == "SQL") then sqChar = "'" - elseif(sModeDB == "LUA") then sqChar = "\"" end - end - snOut = sqChar..snOut..sqChar - end - elseif(tipField == "REAL" or tipField == "INTEGER") then - snOut = tonumber(snValue) - if(not IsExistent(snOut)) then - return StatusLog(nil,"MatchType: Failed converting {" - ..type(snValue).."}<"..tostring(snValue).."> to NUMBER for table " - ..defTable.Name.." field #"..nIndex) end - if(tipField == "INTEGER") then - if(defField[3] == "FLR") then - snOut = mathFloor(snOut) - elseif(defField[3] == "CEL") then - snOut = mathCeil(snOut) - end - end - else - return StatusLog(nil,"MatchType: Invalid field type <" - ..tipField.."> on table "..defTable.Name) end - return snOut -end - -local function SQLBuildCreate(defTable) - if(not defTable) then - return SQLBuildError("SQLBuildCreate: Missing table definition") end - local indTable = defTable.Index - if(not defTable[1]) then - return SQLBuildError("SQLBuildCreate: Missing table definition is empty for "..defTable.Name) end - if(not (defTable[1][1] and defTable[1][2])) then - return SQLBuildError("SQLBuildCreate: Missing table "..defTable.Name.." field definitions") end - local Command, iInd = {}, 1 - Command.Drop = "DROP TABLE "..defTable.Name..";" - Command.Delete = "DELETE FROM "..defTable.Name..";" - Command.Create = "CREATE TABLE "..defTable.Name.." ( " - while(defTable[iInd]) do - local v = defTable[iInd] - if(not v[1]) then - return SQLBuildError("SQLBuildCreate: Missing Table "..defTable.Name - .."'s field #"..tostring(iInd)) end - if(not v[2]) then - return SQLBuildError("SQLBuildCreate: Missing Table "..defTable.Name - .."'s field type #"..tostring(iInd)) end - Command.Create = Command.Create..stringUpper(v[1]).." "..stringUpper(v[2]) - if(defTable[iInd+1]) then Command.Create = Command.Create ..", " end - iInd = iInd + 1 - end - Command.Create = Command.Create.." );" - if(indTable and - indTable[1] and - type(indTable[1]) == "table" and - indTable[1][1] and - type(indTable[1][1]) == "number" - ) then - Command.Index = {} - iInd, iCnt = 1, 1 - while(indTable[iInd]) do - local vI = indTable[iInd] - if(type(vI) ~= "table") then - return SQLBuildError("SQLBuildCreate: Index creator mismatch on " - ..defTable.Name.." value "..vI.." is not a table for index ["..tostring(iInd).."]") end - local FieldsU = "" - local FieldsC = "" - Command.Index[iInd] = "CREATE INDEX IND_"..defTable.Name - iCnt = 1 - while(vI[iCnt]) do - local vF = vI[iCnt] - if(type(vF) ~= "number") then - return SQLBuildError("SQLBuildCreate: Index creator mismatch on " - ..defTable.Name.." value "..vF.." is not a number for index [" - ..tostring(iInd).."]["..tostring(iCnt).."]") end - if(not defTable[vF]) then - return SQLBuildError("SQLBuildCreate: Index creator mismatch on " - ..defTable.Name..". The table does not have field index #" - ..vF..", max is #"..Table.Size) end - FieldsU = FieldsU.."_" ..stringUpper(defTable[vF][1]) - FieldsC = FieldsC..stringUpper(defTable[vF][1]) - if(vI[iCnt+1]) then FieldsC = FieldsC ..", " end - iCnt = iCnt + 1 - end - Command.Index[iInd] = Command.Index[iInd]..FieldsU.." ON "..defTable.Name.." ( "..FieldsC.." );" - iInd = iInd + 1 - end - end - SQLBuildError("") - return Command -end - -local function SQLStoreQuery(defTable,tFields,tWhere,tOrderBy,sQuery) - if(not GetOpVar("EN_QUERY_STORE")) then return sQuery end - local Val, Base - if(not defTable) then - return StatusLog(nil,"SQLStoreQuery: Missing table definition") end - local tTimer = defTable.Timer - if(not (tTimer and ((tonumber(tTimer[2]) or 0) > 0))) then - return StatusLog(sQuery,"SQLStoreQuery: Skipped. Cache persistent forever") end - local Field, Where, Order = 1, 1, 1 - local keyStr = GetOpVar("HASH_QUERY_STORE") - local tCache = libCache[keyStr] - if(not IsExistent(tCache)) then - libCache[keyStr] = {}; tCache = libCache[keyStr] end - local Place = tCache[defTable.Name] - if(not IsExistent(Place)) then - tCache[defTable.Name] = {}; Place = tCache[defTable.Name] end - if(tFields) then - while(tFields[Field]) do - Val = defTable[tFields[Field]][1] - if(not IsExistent(Val)) then - return StatusLog(nil,"SQLStoreQuery: Missing field key for #"..tostring(Field)) end - if(Place[Val]) then - Place = Place[Val] - elseif(sQuery) then - Base = Place - Place[Val] = {} - Place = Place[Val] - else - return nil - end - if(not Place) then return nil end - Field = Field + 1 - end - else - Val = "ALL_FIELDS" - if(Place[Val]) then - Place = Place[Val] - elseif(sQuery) then - Base = Place - Place[Val] = {} - Place = Place[Val] - else - return nil - end - end - if(tOrderBy) then - while(tOrderBy[Order]) do - Val = tOrderBy[Order] - if(Place[Val]) then - Base = Place - Place = Place[Val] - elseif(sQuery) then - Base = Place - Place[Val] = {} - Place = Place[Val] - else return StatusLog(nil,"SQLStoreQuery: Missing order field key for #"..tostring(Order)) end - Order = Order + 1 - end - end - if(tWhere) then - while(tWhere[Where]) do - Val = defTable[tWhere[Where][1]][1] - if(not IsExistent(Val)) then - return StatusLog(nil,"SQLStoreQuery: Missing where field key for #"..tostring(Where)) end - if(Place[Val]) then - Base = Place - Place = Place[Val] - elseif(sQuery) then - Base = Place - Place[Val] = {} - Place = Place[Val] - else - return nil - end - Val = tWhere[Where][2] - if(not IsExistent(Val)) then - return StatusLog(nil,"SQLStoreQuery: Missing where value key for #"..tostring(Where)) end - if(Place[Val]) then - Base = Place - Place = Place[Val] - elseif(sQuery) then - Base = Place - Place[Val] = {} - Place = Place[Val] - end - Where = Where + 1 - end - end - if(sQuery) then Base[Val] = sQuery end - return Base[Val] -end - -local function SQLBuildSelect(defTable,tFields,tWhere,tOrderBy) - if(not defTable) then - return SQLBuildError("SQLBuildSelect: Missing table definition") end - if(not (defTable[1][1] and defTable[1][2])) then - return SQLBuildError("SQLBuildSelect: Missing table "..defTable.Name.." field definitions") end - local Command = SQLStoreQuery(defTable,tFields,tWhere,tOrderBy) - if(IsString(Command)) then - SQLBuildError("") - return Command - else Command = "SELECT " end - local Cnt = 1 - if(tFields) then - while(tFields[Cnt]) do - local v = tonumber(tFields[Cnt]) - if(not IsExistent(v)) then - return SQLBuildError("SQLBuildSelect: Select index NAN {" - ..type(tFields[Cnt]).."}<"..tostring(tFields[Cnt]) - .."> type mismatch in "..defTable.Name) end - if(defTable[v]) then - if(defTable[v][1]) then - Command = Command..defTable[v][1] - else - return SQLBuildError("SQLBuildSelect: Select no such field name by index #" - ..v.." in the table "..defTable.Name) end - end - if(tFields[Cnt+1]) then - Command = Command ..", " - end - Cnt = Cnt + 1 - end - else - Command = Command.."*" - end - Command = Command .." FROM "..defTable.Name - if(tWhere and - type(tWhere == "table") and - type(tWhere[1]) == "table" and - tWhere[1][1] and - tWhere[1][2] and - type(tWhere[1][1]) == "number" and - (type(tWhere[1][2]) == "string" or type(tWhere[1][2]) == "number") - ) then - Cnt = 1 - while(tWhere[Cnt]) do - k = tonumber(tWhere[Cnt][1]) - v = tWhere[Cnt][2] - t = defTable[k][2] - if(not (k and v and t) ) then - return SQLBuildError("SQLBuildSelect: Where clause inconsistent on " - ..defTable.Name.." field index, {"..tostring(k)..","..tostring(v)..","..tostring(t) - .."} value or type in the table definition") end - v = MatchType(defTable,v,k,true) - if(not IsExistent(v)) then - return SQLBuildError("SQLBuildSelect: Data matching failed on " - ..defTable.Name.." field index #"..Cnt.." value <"..tostring(v)..">") end - if(Cnt == 1) then - Command = Command.." WHERE "..defTable[k][1].." = "..v - else - Command = Command.." AND "..defTable[k][1].." = "..v - end - Cnt = Cnt + 1 - end - end - if(tOrderBy and (type(tOrderBy) == "table")) then - local Dire = "" - Command = Command.." ORDER BY " - Cnt = 1 - while(tOrderBy[Cnt]) do - local v = tOrderBy[Cnt] - if(v ~= 0) then - if(v > 0) then - Dire = " ASC" - else - Dire = " DESC" - v = -v - end - else - return SQLBuildError("SQLBuildSelect: Order wrong for " - ..defTable.Name .." field index #"..Cnt) end - Command = Command..defTable[v][1]..Dire - if(tOrderBy[Cnt+1]) then - Command = Command..", " - end - Cnt = Cnt + 1 - end - end - SQLBuildError("") - return SQLStoreQuery(defTable,tFields,tWhere,tOrderBy,Command..";") -end - -local function SQLBuildInsert(defTable,tInsert,tValues) - if(not defTable) then - return SQLBuildError("SQLBuildInsert: Missing Table definition") end - if(not tValues) then - return SQLBuildError("SQLBuildInsert: Missing Table value fields") end - if(not defTable[1]) then - return SQLBuildError("SQLBuildInsert: The table and the chosen fields must not be empty") end - if(not (defTable[1][1] and defTable[1][2])) then - return SQLBuildError("SQLBuildInsert: Missing table "..defTable.Name.." field definition") end - local tInsert = tInsert or {} - if(not tInsert[1]) then - local iCnt = 1 - while(defTable[iCnt]) do - tInsert[iCnt] = iCnt - iCnt = iCnt + 1 - end - end - local iCnt = 1 - local qVal = " VALUES ( " - local qIns = "INSERT INTO "..defTable.Name.." ( " - local Val, iInd, dFld - while(tInsert[iCnt]) do - iInd = tInsert[iCnt] - dFld = defTable[iInd] - if(not IsExistent(dFld)) then - return SQLBuildError("SQLBuildInsert: No such field #"..iInd.." on table "..defTable.Name) - end - Val = MatchType(defTable,tValues[iCnt],iInd,true) - if(not IsExistent(Val)) then - return SQLBuildError("SQLBuildInsert: Cannot match value <"..tostring(tValues[iCnt]).."> #"..iInd.." on table "..defTable.Name) - end - qIns = qIns..dFld[1] - qVal = qVal..Val - if(tInsert[iCnt+1]) then - qIns = qIns ..", " - qVal = qVal ..", " - else - qIns = qIns .." ) " - qVal = qVal .." );" - end - iCnt = iCnt + 1 - end - SQLBuildError("") - return qIns..qVal -end - -function CreateTable(sTable,defTable,bDelete,bReload) - if(not IsString(sTable)) then - return StatusLog(false,"CreateTable: Table key {"..type(sTable).."}<"..tostring(sTable).."> not string") end - if(not (type(defTable) == "table")) then - return StatusLog(false,"CreateTable: Table definition missing for "..sTable) end - if(#defTable <= 0) then - return StatusLog(false,"CreateTable: Record definition missing for "..sTable) end - if(#defTable ~= tableMaxn(defTable)) then - return StatusLog(false,"CreateTable: Record definition mismatch for "..sTable) end - SetOpVar("DEFTABLE_"..sTable,defTable) - defTable.Size = #defTable - defTable.Name = GetOpVar("TOOLNAME_PU")..sTable - local sModeDB = GetOpVar("MODE_DATABASE") - local sTable = stringUpper(sTable) - local symDis = GetOpVar("OPSYM_DISABLE") - local iCnt, defField = 1, nil - while(defTable[iCnt]) do - defField = defTable[iCnt] - defField[3] = DefaultString(tostring(defField[3] or symDis), symDis) - defField[4] = DefaultString(tostring(defField[4] or symDis), symDis) - iCnt = iCnt + 1 - end - libCache[defTable.Name] = {} - if(sModeDB == "SQL") then - defTable.Life = tonumber(defTable.Life) or 0 - local tQ = SQLBuildCreate(defTable) - if(not IsExistent(tQ)) then return StatusLog(false,"CreateTable: "..SQLBuildError()) end - if(bDelete and sqlTableExists(defTable.Name)) then - local qRez = sqlQuery(tQ.Delete) - if(not qRez and IsBool(qRez)) then - LogInstance("CreateTable: Table "..sTable.." is not present. Skipping delete !") - else - LogInstance("CreateTable: Table "..sTable.." deleted !") - end - end - if(bReload) then - local qRez = sqlQuery(tQ.Drop) - if(not qRez and IsBool(qRez)) then - LogInstance("CreateTable: Table "..sTable.." is not present. Skipping drop !") - else - LogInstance("CreateTable: Table "..sTable.." dropped !") - end - end - if(sqlTableExists(defTable.Name)) then - LogInstance("CreateTable: Table "..sTable.." exists!") - return true - else - local qRez = sqlQuery(tQ.Create) - if(not qRez and IsBool(qRez)) then - return StatusLog(false,"CreateTable: Table "..sTable - .." failed to create because of "..sqlLastError()) end - if(sqlTableExists(defTable.Name)) then - for k, v in pairs(tQ.Index) do - qRez = sqlQuery(v) - if(not qRez and IsBool(qRez)) then - return StatusLog(false,"CreateTable: Table "..sTable.. - " failed to create index ["..k.."] > "..v .." > because of "..sqlLastError()) end - end return StatusLog(true,"CreateTable: Indexed Table "..sTable.." created !") - else - return StatusLog(false,"CreateTable: Table "..sTable.. - " failed to create because of "..sqlLastError().." Query ran > "..tQ.Create) end - end - elseif(sModeDB == "LUA") then sModeDB = "LUA" else -- Just to do something here. - return StatusLog(false,"CreateTable: Wrong database mode <"..sModeDB..">") - end -end - -function InsertRecord(sTable,tData) - if(not IsExistent(sTable)) then - return StatusLog(false,"InsertRecord: Missing table name/values") - end - if(type(sTable) == "table") then - tData = sTable - sTable = DefaultTable() - if(not (IsExistent(sTable) and sTable ~= "")) then - return StatusLog(false,"InsertRecord: Missing table default name for "..sTable) end - end - if(not IsString(sTable)) then - return StatusLog(false,"InsertRecord: Table name {"..type(sTable).."}<"..tostring(sTable).."> not string") end - local defTable = GetOpVar("DEFTABLE_"..sTable) - if(not defTable) then - return StatusLog(false,"InsertRecord: Missing table definition for "..sTable) end - if(not defTable[1]) then - return StatusLog(false,"InsertRecord: Missing table definition is empty for "..sTable) end - if(not tData) then - return StatusLog(false,"InsertRecord: Missing data table for "..sTable) end - if(not tData[1]) then - return StatusLog(false,"InsertRecord: Missing data table is empty for "..sTable) end - - if(sTable == "PIECES") then - tData[2] = DisableString(tData[2],DefaultType(),"TYPE") - tData[3] = DisableString(tData[3],ModelToName(tData[1]),"MODEL") - elseif(sTable == "PHYSPROPERTIES") then - tData[1] = DisableString(tData[1],DefaultType(),"TYPE") - end - - local sModeDB = GetOpVar("MODE_DATABASE") - if(sModeDB == "SQL") then - local Q = SQLBuildInsert(defTable,nil,tData) - if(not IsExistent(Q)) then return StatusLog(false,"InsertRecord: Build error <"..SQLBuildError()..">") end - local qRez = sqlQuery(Q) - if(not qRez and IsBool(qRez)) then - return StatusLog(false,"InsertRecord: Failed to insert a record because of <" - ..sqlLastError().."> Query ran <"..Q..">") end - return true - elseif(sModeDB == "LUA") then - local snPrimaryKey = MatchType(defTable,tData[1],1) - if(not IsExistent(snPrimaryKey)) then -- If primary key becomes a number - return StatusLog(nil,"InsertRecord: Cannot match primary key " - ..sTable.." <"..tostring(tData[1]).."> to " - ..defTable[1][1].." for "..tostring(snPrimaryKey)) end - local tCache = libCache[defTable.Name] - if(not IsExistent(tCache)) then - return StatusLog(false,"InsertRecord: Cache not allocated for "..defTable.Name) end - if(sTable == "PIECES") then - local tLine = tCache[snPrimaryKey] - if(not tLine) then - tCache[snPrimaryKey] = {}; tLine = tCache[snPrimaryKey] end - if(not IsExistent(tLine.Type)) then tLine.Type = tData[2] end - if(not IsExistent(tLine.Name)) then tLine.Name = tData[3] end - if(not IsExistent(tLine.Kept)) then tLine.Kept = 0 end - if(not IsExistent(tLine.Slot)) then tLine.Slot = snPrimaryKey end - local nOffsID = MatchType(defTable,tData[4],4) -- LineID has to be set properly - if(not IsExistent(nOffsID)) then - return StatusLog(nil,"InsertRecord: Cannot match " - ..sTable.." <"..tostring(tData[4]).."> to " - ..defTable[4][1].." for "..tostring(snPrimaryKey)) - end - local stRezul = RegisterPOA(tLine,nOffsID,tData[5],tData[6],tData[7]) - if(not IsExistent(stRezul)) then - return StatusLog(nil,"InsertRecord: Cannot process offset #"..tostring(nOffsID).." for "..tostring(snPrimaryKey)) end - if(nOffsID > tLine.Kept) then tLine.Kept = nOffsID else - return StatusLog(nil,"InsertRecord: Offset #"..tostring(nOffsID).." sequentiality mismatch") end - elseif(sTable == "ADDITIONS") then - local tLine = tCache[snPrimaryKey] - if(not tLine) then - tCache[snPrimaryKey] = {}; tLine = tCache[snPrimaryKey] end - if(not IsExistent(tLine.Kept)) then tLine.Kept = 0 end - if(not IsExistent(tLine.Slot)) then tLine.Slot = snPrimaryKey end - local nCnt, sFld, nAddID = 2, "", MatchType(defTable,tData[4],4) - if(not IsExistent(nAddID)) then -- LineID has to be set properly - return StatusLog(nil,"InsertRecord: Cannot match " - ..sTable.." <"..tostring(tData[4]).."> to " - ..defTable[4][1].." for "..tostring(snPrimaryKey)) end - tLine[nAddID] = {} - while(nCnt <= defTable.Size) do - sFld = defTable[nCnt][1] - tLine[nAddID][sFld] = MatchType(defTable,tData[nCnt],nCnt) - if(not IsExistent(tLine[nAddID][sFld])) then -- ADDITIONS is full of numbers - return StatusLog(nil,"InsertRecord: Cannot match " - ..sTable.." <"..tostring(tData[nCnt]).."> to " - ..defTable[nCnt][1].." for "..tostring(snPrimaryKey)) end - nCnt = nCnt + 1 - end - tLine.Kept = nAddID - elseif(sTable == "PHYSPROPERTIES") then - local sKeyName = GetOpVar("HASH_PROPERTY_NAMES") - local sKeyType = GetOpVar("HASH_PROPERTY_TYPES") - local tTypes = tCache[sKeyType] - local tNames = tCache[sKeyName] - -- Handle the Type - if(not tTypes) then - tCache[sKeyType] = {} - tTypes = tCache[sKeyType] - tTypes.Kept = 0 - end - if(not tNames) then - tCache[sKeyName] = {} - tNames = tCache[sKeyName] - end - local iNameID = MatchType(defTable,tData[2],2) - if(not IsExistent(iNameID)) then -- LineID has to be set properly - return StatusLog(nil,"InsertRecord: Cannot match " - ..sTable.." <"..tostring(tData[2]).."> to " - ..defTable[2][1].." for "..tostring(snPrimaryKey)) end - if(not IsExistent(tNames[snPrimaryKey])) then - -- If a new type is inserted - tTypes.Kept = tTypes.Kept + 1 - tTypes[tTypes.Kept] = snPrimaryKey - tNames[snPrimaryKey] = {} - tNames[snPrimaryKey].Kept = 0 - tNames[snPrimaryKey].Slot = snPrimaryKey - end -- MatchType crashes only on numbers - tNames[snPrimaryKey].Kept = iNameID - tNames[snPrimaryKey][iNameID] = MatchType(defTable,tData[3],3) - else - return StatusLog(false,"InsertRecord: No settings for table "..sTable) - end - end -end - ---------------- TIMER MEMORY MANAGMENT ---------------------------- - -local function NavigateTable(oLocation,tKeys) - if(not IsExistent(oLocation)) then - return StatusLog(nil,"NavigateTable: Location missing") end - if(not IsExistent(tKeys)) then - return StatusLog(nil,"NavigateTable: Key table missing") end - if(not IsExistent(tKeys[1])) then - return StatusLog(nil,"NavigateTable: First key missing") end - local oPlace, kKey, iCnt = oLocation, tKeys[1], 1 - while(tKeys[iCnt]) do - kKey = tKeys[iCnt] - if(tKeys[iCnt+1]) then - oPlace = oPlace[kKey] - if(not IsExistent(oPlace)) then - return StatusLog(nil,"NavigateTable: Key #"..tostring(kKey).." irrelevant to location") end - end - iCnt = iCnt + 1 - end - return oPlace, kKey -end - -function TimerSetting(sTimerSet) -- Generates a timer settings table and keeps the defaults - if(not IsExistent(sTimerSet)) then - return StatusLog(nil,"TimerSetting: Timer set missing for setup") end - if(not IsString(sTimerSet)) then - return StatusLog(nil,"TimerSetting: Timer set {"..type(sTimerSet).."}<"..tostring(sTimerSet).."> not string") end - local tBoom = stringExplode(GetOpVar("OPSYM_REVSIGN"),sTimerSet) - tBoom[1] = tostring(tBoom[1] or "CQT") - tBoom[2] = (tonumber(tBoom[2]) or 0) - tBoom[3] = ((tonumber(tBoom[3]) or 0) ~= 0) and true or false - tBoom[4] = ((tonumber(tBoom[4]) or 0) ~= 0) and true or false - return tBoom -end - -local function TimerAttach(oLocation,tKeys,defTable,anyMessage) - if(not defTable) then - return StatusLog(nil,"TimerAttach: Missing table definition") end - local Place, Key = NavigateTable(oLocation,tKeys) - if(not (IsExistent(Place) and IsExistent(Key))) then - return StatusLog(nil,"TimerAttach: Navigation failed") end - if(not IsExistent(Place[Key])) then - return StatusLog(nil,"TimerAttach: Data not found") end - local sModeDB = GetOpVar("MODE_DATABASE") - LogInstance("TimerAttach: Called by <"..tostring(anyMessage).."> for Place["..tostring(Key).."]") - if(sModeDB == "SQL") then - local nNowTM = Time() -- When is "now" ? - -- If we have a timer, and it does speak, we advise you send your regards.. - local tTimer = defTable.Timer - if(not IsExistent(tTimer)) then - return StatusLog(Place[Key],"TimerAttach: Missing timer settings") end - Place[Key].Used = nNowTM -- Make the first selected deletable to avoid phantom records - -- Get the proper line count to avoid doing in every caching function" - if(IsExistent(Place[Key].Kept)) then Place[Key].Kept = Place[Key].Kept - 1 end - local nLifeTM = tTimer[2] - if(nLifeTM <= 0) then - return StatusLog(Place[Key],"TimerAttach: Timer attachment ignored") end - local sModeTM, bKillRC, bCollGB = tTimer[1], tTimer[3], tTimer[4] - LogInstance("TimerAttach: ["..sModeTM.."] ("..tostring(nLifeTM)..") "..tostring(bKillRC)..", "..tostring(bCollGB)) - if(sModeTM == "CQT") then - Place[Key].Load = nNowTM - for k, v in pairs(Place) do - if(IsExistent(v.Load) and IsExistent(v.Used) and ((nNowTM - v.Used) > nLifeTM)) then - LogInstance("TimerAttach: ("..tostring(RoundValue(nNowTM - v.Used,0.01)).." > "..tostring(nLifeTM)..") > Dead") - if(bKillRC) then - LogInstance("TimerAttach: Killed <"..tostring(k)..">") - Place[k] = nil - end - end - end - if(bCollGB) then - collectgarbage() - LogInstance("TimerAttach: Garbage collected") - end - return StatusLog(Place[Key],"TimerAttach: Place["..tostring(Key).."].Load = "..tostring(RoundValue(nNowTM,0.01))) - elseif(sModeTM == "OBJ") then - local TimerID = stringImplode(GetOpVar("OPSYM_DIVIDER"),tKeys) - LogInstance("TimerAttach: TimID <"..TimerID..">") - if(timerExists(TimerID)) then return StatusLog(Place[Key],"TimerAttach: Timer exists") end - timerCreate(TimerID, nLifeTM, 1, function() - LogInstance("TimerAttach["..TimerID.."]("..nLifeTM..") > Dead") - if(bKillRC) then - LogInstance("TimerAttach: Killed <"..Key..">") - Place[Key] = nil - end - timerStop(TimerID) - timerDestroy(TimerID) - if(bCollGB) then - collectgarbage() - LogInstance("TimerAttach: Garbage collected") - end - end) - timerStart(TimerID) - return Place[Key] - else - return StatusLog(Place[Key],"TimerAttach: Timer mode not found <"..sModeTM..">") - end - elseif(sModeDB == "LUA") then - return StatusLog(Place[Key],"TimerAttach: Memory manager not available") - else - return StatusLog(nil,"TimerAttach: Wrong database mode") - end -end - -local function TimerRestart(oLocation,tKeys,defTable,anyMessage) - if(not defTable) then - return StatusLog(nil,"TimerRestart: Missing table definition") end - local Place, Key = NavigateTable(oLocation,tKeys) - if(not (IsExistent(Place) and IsExistent(Key))) then - return StatusLog(nil,"TimerRestart: Navigation failed") end - if(not IsExistent(Place[Key])) then - return StatusLog(nil,"TimerRestart: Place not found") end - local sModeDB = GetOpVar("MODE_DATABASE") - if(sModeDB == "SQL") then - local tTimer = defTable.Timer - if(not IsExistent(tTimer)) then - return StatusLog(Place[Key],"TimerRestart: Missing timer settings") end - Place[Key].Used = Time() - local nLifeTM = tTimer[2] - if(nLifeTM <= 0) then - return StatusLog(Place[Key],"TimerRestart: Timer life ignored") end - local sModeTM = tTimer[1] - if(sModeTM == "CQT") then - sModeTM = "CQT" -- Just for something to do here and to be known that this is mode CQT - elseif(sModeTM == "OBJ") then - local keyTimerID = stringImplode(GetOpVar("OPSYM_DIVIDER"),tKeys) - if(not timerExists(keyTimerID)) then - return StatusLog(nil,"TimerRestart: Timer missing <"..keyTimerID..">") end - timerStart(keyTimerID) - else return StatusLog(nil,"TimerRestart: Timer mode not found <"..sModeTM..">") end - elseif(sModeDB == "LUA") then Place[Key].Used = Time() - else return StatusLog(nil,"TimerRestart: Wrong database mode") end - return Place[Key] -end - -function CacheBoxLayout(oEnt,nRot,nCamX,nCamZ) - if(not (oEnt and oEnt:IsValid())) then - return StatusLog(nil,"CacheBoxLayout: Entity invalid <"..tostring(oEnt)..">") end - local sMod = oEnt:GetModel() - local oRec = CacheQueryPiece(sMod) - if(not IsExistent(oRec)) then - return StatusLog(nil,"CacheBoxLayout: Piece record invalid <"..sMod..">") end - local Box = oRec.Layout - if(not IsExistent(Box)) then - local vMin, vMax - oRec.Layout = {}; Box = oRec.Layout - if (CLIENT) then vMin, vMax = oEnt:GetRenderBounds() - elseif(SERVER) then vMin, vMax = oEnt:OBBMins(), oEnt:OBBMaxs() - else return StatusLog(nil,"CacheBoxLayout: Wrong instance") end - Box.Ang = Angle () -- Layout entity angle - Box.Cen = Vector() -- Layout entity centre - Box.Cen:Set(vMax); Box.Cen:Add(vMin); Box.Cen:Mul(0.5) - Box.Eye = oEnt:LocalToWorld(Box.Cen) -- Layout camera eye - Box.Len = ((vMax - vMin):Length() / 2) -- Layout border sphere radius - Box.Cam = Vector(); Box.Cam:Set(Box.Eye) -- Layout camera position - AddVectorXYZ(Box.Cam,Box.Len*(tonumber(nCamX) or 0),0,Box.Len*(tonumber(nCamZ) or 0)) - LogInstance("CacheBoxLayout: "..tostring(Box.Cen).." # "..tostring(Box.Len)) - end; Box.Ang[caY] = (tonumber(nRot) or 0) * Time() - return Box -end - ---------------------------- PIECE QUERY ----------------------------- - -function CacheQueryPiece(sModel) - if(not IsExistent(sModel)) then - return StatusLog(nil,"CacheQueryPiece: Model does not exist") end - if(not IsString(sModel)) then - return StatusLog(nil,"CacheQueryPiece: Model {"..type(sModel).."}<"..tostring(sModel).."> not string") end - if(IsEmptyString(sModel)) then - return StatusLog(nil,"CacheQueryPiece: Model empty string") end - if(not utilIsValidModel(sModel)) then - return StatusLog(nil,"CacheQueryPiece: Model invalid <"..sModel..">") end - local defTable = GetOpVar("DEFTABLE_PIECES") - if(not defTable) then - return StatusLog(nil,"CacheQueryPiece: Table definition missing") end - local tCache = libCache[defTable.Name] -- Match the model casing - local sModel = MatchType(defTable,sModel,1,false,"",true,true) - if(not IsExistent(tCache)) then - return StatusLog(nil,"CacheQueryPiece: Cache not allocated for <"..defTable.Name..">") end - local caInd = GetOpVar("NAV_PIECE") - if(not IsExistent(caInd[1])) then caInd[1] = defTable.Name end caInd[2] = sModel - local stPiece = tCache[sModel] - if(IsExistent(stPiece) and IsExistent(stPiece.Kept)) then - if(stPiece.Kept > 0) then - return TimerRestart(libCache,caInd,defTable,"CacheQueryPiece") end - return nil - else - local sModeDB = GetOpVar("MODE_DATABASE") - if(sModeDB == "SQL") then - LogInstance("CacheQueryPiece: Model >> Pool <"..stringToFileName(sModel)..">") - tCache[sModel] = {}; stPiece = tCache[sModel]; stPiece.Kept = 0 - local Q = SQLBuildSelect(defTable,nil,{{1,sModel}},{4}) - if(not IsExistent(Q)) then - return StatusLog(nil,"CacheQueryPiece: Build error <"..SQLBuildError()..">") end - local qData = sqlQuery(Q) - if(not qData and IsBool(qData)) then - return StatusLog(nil,"CacheQueryPiece: SQL exec error <"..sqlLastError()..">") end - if(not (qData and qData[1])) then - return StatusLog(nil,"CacheQueryPiece: No data found <"..Q..">") end - stPiece.Kept = 1 --- Found at least one record - stPiece.Slot = sModel - stPiece.Type = qData[1][defTable[2][1]] - stPiece.Name = qData[1][defTable[3][1]] - local qRec, qRez - while(qData[stPiece.Kept]) do - qRec = qData[stPiece.Kept] - qRez = RegisterPOA(stPiece, - stPiece.Kept, - qRec[defTable[5][1]], - qRec[defTable[6][1]], - qRec[defTable[7][1]]) - if(not IsExistent(qRez)) then - return StatusLog(nil,"CacheQueryPiece: Cannot process offset #"..tostring(stPiece.Kept).." for <"..sModel..">") - end - stPiece.Kept = stPiece.Kept + 1 - end - return TimerAttach(libCache,caInd,defTable,"CacheQueryPiece") - elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryPiece: Record not located") - else return StatusLog(nil,"CacheQueryPiece: Wrong database mode <"..sModeDB..">") end - end -end - -function CacheQueryAdditions(sModel) - if(not IsExistent(sModel)) then - return StatusLog(nil,"CacheQueryAdditions: Model does not exist") end - if(not IsString(sModel)) then - return StatusLog(nil,"CacheQueryAdditions: Model {"..type(sModel).."}<"..tostring(sModel).."> not string") end - if(IsEmptyString(sModel)) then - return StatusLog(nil,"CacheQueryAdditions: Model empty string") end - if(not utilIsValidModel(sModel)) then - return StatusLog(nil,"CacheQueryAdditions: Model invalid") end - local defTable = GetOpVar("DEFTABLE_ADDITIONS") - if(not defTable) then - return StatusLog(nil,"CacheQueryAdditions: Missing table definition") end - local tCache = libCache[defTable.Name] -- Match the model casing - local sModel = MatchType(defTable,sModel,1,false,"",true,true) - if(not IsExistent(tCache)) then - return StatusLog(nil,"CacheQueryAdditions: Cache not allocated for <"..defTable.Name..">") end - local caInd = GetOpVar("NAV_ADDITION") - if(not IsExistent(caInd[1])) then caInd[1] = defTable.Name end caInd[2] = sModel - local stAddition = tCache[sModel] - if(IsExistent(stAddition) and IsExistent(stAddition.Kept)) then - if(stAddition.Kept > 0) then - return TimerRestart(libCache,caInd,defTable,"CacheQueryAdditions") end - return nil - else - local sModeDB = GetOpVar("MODE_DATABASE") - if(sModeDB == "SQL") then - LogInstance("CacheQueryAdditions: Model >> Pool <"..stringToFileName(sModel)..">") - tCache[sModel] = {}; stAddition = tCache[sModel]; stAddition.Kept = 0 - local Q = SQLBuildSelect(defTable,{2,3,4,5,6,7,8,9,10,11,12},{{1,sModel}},{4}) - if(not IsExistent(Q)) then - return StatusLog(nil,"CacheQueryAdditions: Build error <"..SQLBuildError()..">") end - local qData = sqlQuery(Q) - if(not qData and IsBool(qData)) then - return StatusLog(nil,"CacheQueryAdditions: SQL exec error <"..sqlLastError()..">") end - if(not (qData and qData[1])) then - return StatusLog(nil,"CacheQueryAdditions: No data found <"..Q..">") end - stAddition.Kept = 1 - stAddition.Slot = sModel - while(qData[stAddition.Kept]) do - local qRec = qData[stAddition.Kept] - stAddition[stAddition.Kept] = {} - for Field, Val in pairs(qRec) do - stAddition[stAddition.Kept][Field] = Val - end - stAddition.Kept = stAddition.Kept + 1 - end - return TimerAttach(libCache,caInd,defTable,"CacheQueryAdditions") - elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryAdditions: Record not located") - else return StatusLog(nil,"CacheQueryAdditions: Wrong database mode <"..sModeDB..">") end - end -end - ------------------------ PANEL QUERY ------------------------------- - ---- Used to Populate the CPanel Tree -function CacheQueryPanel() - local defTable = GetOpVar("DEFTABLE_PIECES") - if(not defTable) then - return StatusLog(false,"CacheQueryPanel: Missing table definition") end - if(not IsExistent(libCache[defTable.Name])) then - return StatusLog(nil,"CacheQueryPanel: Cache not allocated for <"..defTable.Name..">") end - local caInd = GetOpVar("NAV_PANEL") - local keyPan = GetOpVar("HASH_USER_PANEL") - if(not IsExistent(caInd[1])) then caInd[1] = keyPan end - local stPanel = libCache[keyPan] - if(IsExistent(stPanel) and IsExistent(stPanel.Kept)) then - LogInstance("CacheQueryPanel: From Pool") - if(stPanel.Kept > 0) then - return TimerRestart(libCache,caInd,defTable,"CacheQueryPanel") end - return nil - else - libCache[keyPan] = {}; stPanel = libCache[keyPan] - local sModeDB = GetOpVar("MODE_DATABASE") - if(sModeDB == "SQL") then - local Q = SQLBuildSelect(defTable,{1,2,3},{{4,1}},{2,3}) - if(not IsExistent(Q)) then - return StatusLog(nil,"CacheQueryPanel: Build error: <"..SQLBuildError()..">") end - local qData = sqlQuery(Q) - if(not qData and IsBool(qData)) then - return StatusLog(nil,"CacheQueryPanel: SQL exec error <"..sqlLastError()..">") end - if(not (qData and qData[1])) then - return StatusLog(nil,"CacheQueryPanel: No data found <"..Q..">") end - stPanel.Kept = 1 - while(qData[stPanel.Kept]) do - stPanel[stPanel.Kept] = qData[stPanel.Kept] - stPanel.Kept = stPanel.Kept + 1 - end - return TimerAttach(libCache,caInd,defTable,"CacheQueryPanel") - elseif(sModeDB == "LUA") then - local tCache = libCache[defTable.Name] - local tData = {} - local iNdex = 0 - for sModel, tRecord in pairs(tCache) do - tData[sModel] = { - [defTable[1][1]] = sModel, - [defTable[2][1]] = tRecord.Type, - [defTable[3][1]] = tRecord.Name - } - end - local tSorted = Sort(tData,nil,{defTable[2][1],defTable[3][1]}) - if(not tSorted) then - return StatusLog(nil,"CacheQueryPanel: Cannot sort cache data") end - iNdex = 1 - while(tSorted[iNdex]) do - stPanel[iNdex] = tData[tSorted[iNdex].Key] - iNdex = iNdex + 1 - end - return stPanel - else return StatusLog(nil,"CacheQueryPanel: Wrong database mode <"..sModeDB..">") end - LogInstance("CacheQueryPanel: To Pool") - end -end - ---- Used to Populate the CPanel Phys Materials -function CacheQueryProperty(sType) - local defTable = GetOpVar("DEFTABLE_PHYSPROPERTIES") - if(not defTable) then - return StatusLog(nil,"CacheQueryProperty: Missing table definition") end - local tCache = libCache[defTable.Name] - if(not tCache) then - return StatusLog(nil,"CacheQueryProperty["..tostring(sType).."]: Cache not allocated for <"..defTable.Name..">") end - local sModeDB = GetOpVar("MODE_DATABASE") - if(IsString(sType) and not IsEmptyString(sType)) then - local sType = MatchType(defTable,sType,1,false,"",true,true) - local keyName = GetOpVar("HASH_PROPERTY_NAMES") - local arNames = tCache[keyName] - local caInd = GetOpVar("NAV_PROPERTY_NAMES") - if(not IsExistent(caInd[1])) then - caInd[1] = defTable.Name; caInd[2] = keyName end caInd[3] = sType - if(not IsExistent(arNames)) then - tCache[keyName] = {}; arNames = tCache[keyName] - end - local stName = arNames[sType] - if(IsExistent(stName) and IsExistent(stName.Kept)) then - LogInstance("CacheQueryProperty["..sType.."]: Names << Pool") - if(stName.Kept > 0) then - return TimerRestart(libCache,caInd,defTable,"CacheQueryProperty") end - return nil - else - if(sModeDB == "SQL") then - arNames[sType] = {}; stName = arNames[sType]; stName.Kept = 0 - local Q = SQLBuildSelect(defTable,{3},{{1,sType}},{2}) - if(not IsExistent(Q)) then - return StatusLog(nil,"CacheQueryProperty["..sType.."]: Build error: <"..SQLBuildError()..">") end - local qData = sqlQuery(Q) - if(not qData and IsBool(qData)) then - return StatusLog(nil,"CacheQueryProperty: SQL exec error <"..sqlLastError()..">") end - if(not (qData and qData[1])) then - return StatusLog(nil,"CacheQueryProperty["..sType.."]: No data found <"..Q..">") end - stName.Kept = 1 - stName.Slot = sType - while(qData[stName.Kept]) do - stName[stName.Kept] = qData[stName.Kept][defTable[3][1]] - stName.Kept = stName.Kept + 1 - end - LogInstance("CacheQueryProperty["..sType.."]: Names >> Pool") - return TimerAttach(libCache,caInd,defTable,"CacheQueryProperty") - elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryProperty["..sType.."]: Record not located") - else return StatusLog(nil,"CacheQueryProperty["..sType.."]: Wrong database mode <"..sModeDB..">") end - end - else - local keyType = GetOpVar("HASH_PROPERTY_TYPES") - local stType = tCache[keyType] - local caInd = GetOpVar("NAV_PROPERTY_TYPES") - if(not IsExistent(caInd[1])) then caInd[1] = defTable.Name; caInd[2] = keyType end - if(IsExistent(stType) and IsExistent(stType.Kept)) then - LogInstance("CacheQueryProperty: Types << Pool") - if(stType.Kept > 0) then - return TimerRestart(libCache,caInd,defTable,"CacheQueryProperty") end - return nil - else - if(sModeDB == "SQL") then - tCache[keyType] = {}; stType = tCache[keyType]; stType.Kept = 0 - local Q = SQLBuildSelect(defTable,{1},{{2,1}},{1}) - if(not IsExistent(Q)) then - return StatusLog(nil,"CacheQueryProperty: Build error: <"..SQLBuildError()..">") end - local qData = sqlQuery(Q) - if(not qData and IsBool(qData)) then - return StatusLog(nil,"CacheQueryProperty: SQL exec error <"..sqlLastError()..">") end - if(not (qData and qData[1])) then - return StatusLog(nil,"CacheQueryProperty: No data found <"..Q..">") end - stType.Kept = 1 - while(qData[stType.Kept]) do - stType[stType.Kept] = qData[stType.Kept][defTable[1][1]] - stType.Kept = stType.Kept + 1 - end - LogInstance("CacheQueryProperty: Types >> Pool") - return TimerAttach(libCache,caInd,defTable,"CacheQueryProperty") - elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryProperty: Record not located") - else return StatusLog(nil,"CacheQueryProperty: Wrong database mode <"..sModeDB..">") end - end - end -end - ----------------------- EXPORT -------------------------------- - -local function GetFieldsName(defTable,sDelim) - if(not IsExistent(sDelim)) then return "" end - local sDelim = stringSub(tostring(sDelim),1,1) - local sResult = "" - if(IsEmptyString(sDelim)) then - return StatusLog("","GetFieldsName: Invalid delimiter for <"..defTable.Name..">") end - local iCount = 1 - local namField - while(defTable[iCount]) do - namField = defTable[iCount][1] - if(not IsString(namField)) then - return StatusLog("","GetFieldsName: Field #"..iCount - .." {"..type(namField).."}<"..tostring(namField).."> not string") end - sResult = sResult..namField - if(defTable[iCount + 1]) then sResult = sResult..sDelim end - iCount = iCount + 1 - end - return sResult -end - ---[[ - * Save/Load the DB Using Excel or - * anything that supports delimiter - * separated digital tables - * sPrefix = Something that separates exported table from the rest ( e.g. db_ ) - * sTable = Definition KEY to export to - * sDelim = Delimiter CHAR data separator - * bCommit = true to insert the read values -]]-- -function ImportDSV(sTable,sDelim,bCommit,sPrefix) - if(not IsString(sTable)) then - return StatusLog(false,"ImportDSV: Table {"..type(sTable).."}<"..tostring(sTable).."> not string") end - local defTable = GetOpVar("DEFTABLE_"..sTable) - if(not defTable) then - return StatusLog(false,"ImportDSV: Missing table definition for <"..sTable..">") end - local fName = GetOpVar("DIRPATH_BAS")..GetOpVar("DIRPATH_DSV") - fName = fName..tostring(sPrefix or GetInstPref())..defTable.Name..".txt" - local F = fileOpen(fName, "r", "DATA") - if(not F) then return StatusLog(false,"ImportDSV: fileOpen("..fName..".txt) Failed") end - local symOff = GetOpVar("OPSYM_DISABLE") - local tabLen = stringLen(defTable.Name) - local sLine, sChar, lenLine = "", "X", 0 - while(sChar) do - sChar = F:Read(1) - if(not sChar) then return end - if(sChar == "\n") then - lenLine = stringLen(sLine) - if(stringSub(sLine,lenLine,lenLine) == "\r") then - sLine = stringSub(sLine,1,lenLine-1) - lenLine = lenLine - 1 - end - if((stringSub(sLine,1,1) ~= symOff) and (stringSub(sLine,1,tabLen) == defTable.Name)) then - local Data = stringExplode(sDelim,stringSub(sLine,tabLen+2,lenLine)) - for k,v in pairs(Data) do - local vLen = stringLen(v) - if(stringSub(v,1,1) == "\"" and stringSub(v,vLen,vLen) == "\"") then - Data[k] = stringSub(v,2,vLen-1) - end - end - if(bCommit) then InsertRecord(sTable,Data) end - end - sLine = "" - else sLine = sLine..sChar end - end - F:Close() -end - -function DeleteExternalDatabase(sTable,sMethod,sPrefix) - if(not IsString(sTable)) then - return StatusLog(false,"DeleteExternalDatabase: Table {"..type(sTable).."}<"..tostring(sTable).."> not string") end - if(not IsString(sMethod)) then - return StatusLog(false,"DeleteExternalDatabase: Delete method {"..type(sMethod).."}<"..tostring(sMethod).."> not string") end - local defTable = GetOpVar("DEFTABLE_"..sTable) - if(not defTable) then - return StatusLog(false,"DeleteExternalDatabase: Missing table definition for <"..sTable..">") end - local fName = GetOpVar("DIRPATH_BAS") - if(not GetOpVar("DIRPATH_"..sMethod)) then - return StatusLog(false,"DeleteExternalDatabase: Directory index <"..sMethod.."> missing") end - fName = fName..GetOpVar("DIRPATH_"..sMethod) - fName = fName..tostring(sPrefix or GetInstPref())..defTable.Name..".txt" - if(not fileExists(fName,"DATA")) then - return StatusLog(true,"DeleteExternalDatabase: File <"..fName.."> missing") end - fileDelete(fName) - return StatusLog(true,"DeleteExternalDatabase: Success") -end - -function DeleteDirectoryPath(sMethod) - if(not IsString(sMethod)) then - return StatusLog(false,"DeleteDirectoryPath: Delete method {"..type(sMethod).."}<"..tostring(sMethod).."> not string") end - local fName = GetOpVar("DIRPATH_BAS") - if(not GetOpVar("DIRPATH_"..sMethod)) then - return StatusLog(false,"DeleteDirectoryPath: Directory index <"..sMethod.."> missing") end - fName = fName..GetOpVar("DIRPATH_"..sMethod) - if(not fileExists(fName,"DATA")) then - return StatusLog(true,"DeleteDirectoryPath: Directory <"..fName.."> missing") end - fileDelete(fName) - return StatusLog(true,"DeleteDirectoryPath: Success") -end - -function StoreExternalDatabase(sTable,sDelim,sMethod,sPrefix) - if(not IsString(sTable)) then - return StatusLog(false,"StoreExternalDatabase: Table {"..type(sTable).."}<"..tostring(sTable).."> not string") end - if(not IsString(sMethod)) then - return StatusLog(false,"StoreExternalDatabase: Export mode {"..type(sMethod).."}<"..tostring(sMethod).."> not string") end - local defTable = GetOpVar("DEFTABLE_"..sTable) - if(not defTable) then - return StatusLog(false,"StoreExternalDatabase: Missing table definition for <"..sTable..">") end - local fName = GetOpVar("DIRPATH_BAS") - if(not fileExists(fName,"DATA")) then fileCreateDir(fName) end - if(not GetOpVar("DIRPATH_"..sMethod)) then - return StatusLog(false,"StoreExternalDatabase: Directory index <"..sMethod.."> missing") end - fName = fName..GetOpVar("DIRPATH_"..sMethod) - if(not fileExists(fName,"DATA")) then fileCreateDir(fName) end - fName = fName..tostring(sPrefix or GetInstPref())..defTable.Name..".txt" - local F = fileOpen(fName, "w", "DATA" ) - if(not F) then return StatusLog(false,"StoreExternalDatabase: fileOpen("..fName..") Failed") end - local sData, sTemp = "", "" - local sModeDB, symOff = GetOpVar("MODE_DATABASE"), GetOpVar("OPSYM_DISABLE") - F:Write("# StoreExternalDatabase( "..sMethod.." ): "..osDate().." [ "..sModeDB.." ]".."\n") - F:Write("# Data settings: "..GetFieldsName(defTable,sDelim).."\n") - if(sModeDB == "SQL") then - local Q = "" - if (sTable == "PIECES" ) then Q = SQLBuildSelect(defTable,nil,nil,{2,3,1,4}) - elseif(sTable == "ADDITIONS" ) then Q = SQLBuildSelect(defTable,nil,nil,{1,4}) - elseif(sTable == "PHYSPROPERTIES") then Q = SQLBuildSelect(defTable,nil,nil,{1,2}) - else Q = SQLBuildSelect(defTable,nil,nil,nil) end - if(not IsExistent(Q)) then return StatusLog(false,"StoreExternalDatabase: Build error <"..SQLBuildError()..">") end - F:Write("# Query ran: <"..Q..">\n") - local qData = sqlQuery(Q) - if(not qData and IsBool(qData)) then - return StatusLog(nil,"StoreExternalDatabase: SQL exec error <"..sqlLastError()..">") end - if(not (qData and qData[1])) then - return StatusLog(false,"StoreExternalDatabase: No data found <"..Q..">") end - local iCnt, iInd, qRec = 1, 1, nil - if (sMethod == "DSV") then sData = defTable.Name..sDelim - elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end - while(qData[iCnt]) do - iInd = 1 - sTemp = sData - qRec = qData[iCnt] - while(defTable[iInd]) do -- The data is already inserted, so matching will not crash - sTemp = sTemp..MatchType(defTable,qRec[defTable[iInd][1]],iInd,true,"\"",true) - if(defTable[iInd + 1]) then sTemp = sTemp..sDelim end - iInd = iInd + 1 - end - if (sMethod == "DSV") then sTemp = sTemp.."\n" - elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end - F:Write(sTemp) - iCnt = iCnt + 1 - end - elseif(sModeDB == "LUA") then - local tCache = libCache[defTable.Name] - if(not IsExistent(tCache)) then - return StatusLog(false,"StoreExternalDatabase: Table <"..defTable.Name.."> cache not allocated") end - if(sTable == "PIECES") then - local tData = {} - for sModel, tRecord in pairs(tCache) do - sData = tRecord.Type..tRecord.Name..sModel - tData[sModel] = {[defTable[1][1]] = sData} - end - local tSorted = Sort(tData,nil,{defTable[1][1]}) - if(not tSorted) then - return StatusLog(false,"StoreExternalDatabase: Cannot sort cache data") end - local iInd iNdex = 1, 1 - while(tSorted[iNdex]) do - iInd = 1 - tData = tCache[tSorted[iNdex].Key] - if (sMethod == "DSV") then sData = defTable.Name..sDelim - elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end - sData = sData..MatchType(defTable,tSorted[iNdex].Key,1,true,"\"")..sDelim.. - MatchType(defTable,tData.Type,2,true,"\"")..sDelim.. - MatchType(defTable,((ModelToName(tSorted[iNdex].Key) == tData.Name) and symOff or tData.Name),3,true,"\"")..sDelim - -- Matching crashes only for numbers - while(tData.Offs[iInd]) do -- The number is already inserted, so there will be no crash - sTemp = sData..MatchType(defTable,iInd,4,true,"\"")..sDelim.. - "\""..(IsEqualPOA(tData.Offs[iInd].P,tData.Offs[iInd].O) and "" or StringPOA(tData.Offs[iInd].P,"V")).."\""..sDelim.. - "\"".. StringPOA(tData.Offs[iInd].O,"V").."\""..sDelim.. - "\""..( IsZeroPOA(tData.Offs[iInd].A,"A") and "" or StringPOA(tData.Offs[iInd].A,"A")).."\"" - if (sMethod == "DSV") then sTemp = sTemp.."\n" - elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end - F:Write(sTemp) - iInd = iInd + 1 - end - iNdex = iNdex + 1 - end - elseif(sTable == "ADDITIONS") then - local iNdex, tData - for sModel, tRecord in pairs(tCache) do - if (sMethod == "DSV") then sData = defTable.Name..sDelim..sModel..sDelim - elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end - iNdex = 1 - while(tRecord[iNdex]) do -- Data is already inserted, there will be no crash - tData = tRecord[iNdex] - sTemp = sData..MatchType(defTable,tData[defTable[2 ][1]],2 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[3 ][1]],3 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[4 ][1]],4 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[5 ][1]],5 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[6 ][1]],6 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[7 ][1]],7 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[8 ][1]],8 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[9 ][1]],9 ,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[10][1]],10,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[11][1]],11,true,"\"")..sDelim.. - MatchType(defTable,tData[defTable[12][1]],12,true,"\"") - if (sMethod == "DSV") then sTemp = sTemp.."\n" - elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end - F:Write(sTemp) - iNdex = iNdex + 1 - end - end - elseif(sTable == "PHYSPROPERTIES") then - local tTypes = tCache[GetOpVar("HASH_PROPERTY_TYPES")] - local tNames = tCache[GetOpVar("HASH_PROPERTY_NAMES")] - if(not (tTypes or tNames)) then - return StatusLog(false,"StoreExternalDatabase: No data found") end - local tType - local iInd , iCnt = 1 , 1 - local sType, sName = "", "" - while(tTypes[iInd]) do - sType = tTypes[iInd] - tType = tNames[sType] - if(not tType) then return - StatusLog(false,"StoreExternalDatabase: Missing index #"..iInd.." on type <"..sType..">") end - if (sMethod == "DSV") then sData = defTable.Name..sDelim - elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end - iCnt = 1 - while(tType[iCnt]) do -- The number is already inserted, there will be no crash - sTemp = sData..MatchType(defTable,sType ,1,true,"\"")..sDelim.. - MatchType(defTable,iCnt ,2,true,"\"")..sDelim.. - MatchType(defTable,tType[iCnt],3,true,"\"") - if (sMethod == "DSV") then sTemp = sTemp.."\n" - elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end - F:Write(sTemp) - iCnt = iCnt + 1 - end - iInd = iInd + 1 - end - end - end - F:Flush() - F:Close() -end - ------------------------------ SNAPPING ------------------------------ - ---[[ - * This function calculates the cross product normal angle of - * a player by a given trace. If the trace is missing it takes player trace - * It has options for snap to surface and yaw snap - * oPly = The player we need the normal angle from - * oTrace = A trace structure if nil, it takes oPly's - * nSnap = Snap to the trace surface flag - * nYSnap = Yaw snap amount -]]-- -function GetNormalAngle(oPly, oTrace, nSnap, nYSnap) - local aAng = Angle() - if(not oPly) then return aAng end - local nSnap = tonumber(nSnap) or 0 - if(nSnap and (nSnap ~= 0)) then -- Snap to the surface - local oTrace = oTrace - if(not (oTrace and oTrace.Hit)) then - oTrace = utilTraceLine(utilGetPlayerTrace(oPly)) - if(not (oTrace and oTrace.Hit)) then return aAng end - end - local vLeft = -oPly:GetAimVector():Angle():Right() - aAng:Set(vLeft:Cross(oTrace.HitNormal):AngleEx(oTrace.HitNormal)) - else -- Get only the player yaw, pitch and roll are not needed - local nYSnap = tonumber(nYSnap) or 0 - if(nYSnap and (nYSnap >= 0) and (nYSnap <= GetOpVar("MAX_ROTATION"))) then - aAng[caY] = SnapValue(oPly:GetAimVector():Angle()[caY],nYSnap) - end - end - return aAng -end - ---[[ - * This function is the backbone of the tool snapping and spawning. - * Anything related to dealing with the track assembly database - * Calculates SPos, SAng based on the DB inserts and input parameters - * ucsPos = Base UCS Pos - * ucsAng = Base UCS Ang - * shdModel = Client Model - * ivhdPointID = Client Point ID - * ucsPos(X,Y,Z) = Offset position - * ucsAng(P,Y,R) = Offset angle -]]-- -function GetNormalSpawn(ucsPos,ucsAng,shdModel,ivhdPointID,ucsPosX,ucsPosY,ucsPosZ,ucsAngP,ucsAngY,ucsAngR) - local hdRec = CacheQueryPiece(shdModel) - if(not IsExistent(hdRec)) then - return StatusLog(nil,"GetNormalSpawn: No record located") end - local ihdPointID = tonumber(ivhdPointID) - if(not IsExistent(ihdPointID)) then - return StatusLog(nil,"GetNormalSpawn: Index NAN {"..type(ivhdPointID).."}<"..tostring(ivhdPointID)..">") end - local hdPOA = LocatePOA(hdRec,ihdPointID) - if(not IsExistent(hdPOA)) then - return StatusLog(nil,"GetNormalSpawn: Holder point ID invalid #"..tostring(ihdPointID)) end - local stSpawn = GetOpVar("STRUCT_SPAWN"); stSpawn.HRec = hdRec - if(ucsPos) then SetVector(stSpawn.OPos,ucsPos) end - if(ucsAng) then SetAngle (stSpawn.OAng,ucsAng) end - -- Initialize F, R, U Copy the UCS like that to support database POA - stSpawn.R:Set(stSpawn.OAng:Right()) - stSpawn.U:Set(stSpawn.OAng:Up()) - stSpawn.OAng:RotateAroundAxis(stSpawn.R, (tonumber(ucsAngP) or 0)) - stSpawn.OAng:RotateAroundAxis(stSpawn.U,-(tonumber(ucsAngY) or 0)) - stSpawn.F:Set(stSpawn.OAng:Forward()) - stSpawn.OAng:RotateAroundAxis(stSpawn.F, (tonumber(ucsAngR) or 0)) - stSpawn.R:Set(stSpawn.OAng:Right()) - stSpawn.U:Set(stSpawn.OAng:Up()) - -- Get Holder model data - SetVector(stSpawn.HPnt,hdPOA.P) - SetVector(stSpawn.HPos,hdPOA.O); NegVector(stSpawn.HPos) -- Origin to Position - if(hdPOA.A[csD]) then SetAnglePYR(stSpawn.HAng) else SetAngle(stSpawn.HAng,hdPOA.A) end - -- Calculate spawn relation - stSpawn.HAng:RotateAroundAxis(stSpawn.HAng:Up(),180) - DecomposeByAngle(stSpawn.HPos,stSpawn.HAng) - -- Spawn Position - stSpawn.SPos:Set(stSpawn.OPos) - stSpawn.SPos:Add((hdPOA.O[csA] * stSpawn.HPos[cvX] + (tonumber(ucsPosX) or 0)) * stSpawn.F) - stSpawn.SPos:Add((hdPOA.O[csB] * stSpawn.HPos[cvY] + (tonumber(ucsPosY) or 0)) * stSpawn.R) - stSpawn.SPos:Add((hdPOA.O[csC] * stSpawn.HPos[cvZ] + (tonumber(ucsPosZ) or 0)) * stSpawn.U) - -- Spawn Angle - stSpawn.SAng:Set(stSpawn.OAng); NegAngle(stSpawn.HAng) - stSpawn.SAng:RotateAroundAxis(stSpawn.U,stSpawn.HAng[caY] * hdPOA.A[csB]) - stSpawn.SAng:RotateAroundAxis(stSpawn.R,stSpawn.HAng[caP] * hdPOA.A[csA]) - stSpawn.SAng:RotateAroundAxis(stSpawn.F,stSpawn.HAng[caR] * hdPOA.A[csC]) - -- Store the active point position of holder - stSpawn.HPnt:Rotate(stSpawn.SAng) - stSpawn.HPnt:Add(stSpawn.SPos) - return stSpawn -end - ---[[ - * This function is the backbone of the tool on entity snapping - * Calculates SPos, SAng based on the DB inserts and input parameters - * trEnt = Trace.Entity - * trHitPos = Trace.HitPos - * shdModel = Spawn data will be obtained for this model - * ivhdPointID = Active point ID selected via Right click ... - * nvActRadius = Minimal radius to get an active point from the client - * ucsPos(X,Y,Z) = Offset position - * ucsAng(P,Y,R) = Offset angle -]]-- -function GetEntitySpawn(trEnt,trHitPos,shdModel,ivhdPointID, - nvActRadius,enFlatten,enIgnTyp,ucsPosX, - ucsPosY,ucsPosZ,ucsAngP,ucsAngY,ucsAngR) - if(not (trEnt and trHitPos and shdModel and ivhdPointID and nvActRadius)) then - return StatusLog(nil,"GetEntitySpawn: Mismatched input parameters") end - if(not trEnt:IsValid()) then - return StatusLog(nil,"GetEntitySpawn: Trace entity not valid") end - if(IsOther(trEnt)) then - return StatusLog(nil,"GetEntitySpawn: Trace is of other type") end - local ihdPointID = tonumber(ivhdPointID) - if(not IsExistent(ihdPointID)) then - return StatusLog(nil,"GetEntitySpawn: Holder PointID NAN {"..type(ivhdPointID).."}<"..tostring(ivhdPointID)..">") end - local nActRadius = tonumber(nvActRadius) - if(not IsExistent(nActRadius)) then - return StatusLog(nil,"GetEntitySpawn: Active radius NAN {"..type(nvActRadius).."}<"..tostring(nvActRadius)..">") end - local trRec = CacheQueryPiece(trEnt:GetModel()) - if(not IsExistent(trRec)) then - return StatusLog(nil,"GetEntitySpawn: Trace model missing <"..trEnt:GetModel()..">") end - if(not IsExistent(LocatePOA(trRec,1))) then - return StatusLog(nil,"GetEntitySpawn: Trace has no points") end - local hdRec = CacheQueryPiece(shdModel) - if(not IsExistent(hdRec)) then - return StatusLog(nil,"GetEntitySpawn: Holder model missing <"..tostring(shdModel)..">") end - local hdOffs = LocatePOA(hdRec,ihdPointID) - if(not IsExistent(hdOffs)) then - return StatusLog(nil,"GetEntitySpawn: Holder point invalid #"..tostring(ihdPointID)) end - -- If there is no Type field exit immediately - if(not IsExistent(trRec.Type)) then - return StatusLog(nil,"GetEntitySpawn: Trace type missing") end - if(not IsExistent(hdRec.Type)) then - return StatusLog(nil,"GetEntitySpawn: Holder type missing") end - -- If the types are different and disabled - if((not enIgnTyp or enIgnTyp == 0) and trRec.Type ~= hdRec.Type ) then - return StatusLog(nil,"GetEntitySpawn: Types are different") end - -- We have the next Piece Offset - local vTemp = Vector() - local stSpawn, trPOA = GetOpVar("STRUCT_SPAWN") - stSpawn.TRec = trRec - stSpawn.RLen = nActRadius - stSpawn.HID = ihdPointID - stSpawn.TID = 0 - stSpawn.TPos:Set(trEnt:GetPos()) - stSpawn.TAng:Set(trEnt:GetAngles()) - for ID = 1, trRec.Kept do - -- Indexing is actually with 70% faster using this method than pairs - local stPOA = LocatePOA(trRec,ID) - if(not IsExistent(stPOA)) then - return StatusLog(nil,"GetEntitySpawn: Trace point count mismatch on #"..tostring(ID)) end - if(not stPOA.P[csD]) then -- Skip the disabled P - SetVector(vTemp,stPOA.P) - vTemp[cvX] = vTemp[cvX] * stPOA.P[csA] - vTemp[cvY] = vTemp[cvY] * stPOA.P[csB] - vTemp[cvZ] = vTemp[cvZ] * stPOA.P[csC] - vTemp:Rotate(stSpawn.TAng) - vTemp:Add(stSpawn.TPos) - vTemp:Sub(trHitPos) - local trAcDis = vTemp:Length() - if(trAcDis < stSpawn.RLen) then - trPOA = stPOA - stSpawn.TID = ID - stSpawn.RLen = trAcDis - stSpawn.TPnt:Set(vTemp) - stSpawn.TPnt:Add(trHitPos) - end - end - end - if(not IsExistent(trPOA)) then - return StatusLog(nil,"GetEntitySpawn: Not hitting active point") end - -- Found the active point ID on trEnt. Initialize origins - SetVector(stSpawn.OPos,trPOA.O) -- Use {0,0,0} for disabled A (Angle) - if(trPOA.A[csD]) then SetAnglePYR(stSpawn.OAng) else SetAngle(stSpawn.OAng,trPOA.A) end - stSpawn.OPos:Rotate(stSpawn.TAng) - stSpawn.OPos:Add(stSpawn.TPos) - stSpawn.OAng:Set(trEnt:LocalToWorldAngles(stSpawn.OAng)) - -- Do the flatten flag right now Its important ! - if(enFlatten and enFlatten ~= 0) then - stSpawn.OAng[caP] = 0; stSpawn.OAng[caR] = 0 - end - return GetNormalSpawn(nil,nil,shdModel,ihdPointID,ucsPosX,ucsPosY,ucsPosZ,ucsAngP,ucsAngY,ucsAngR) -end - -function AttachAdditions(ePiece) - if(not (ePiece and ePiece:IsValid())) then - return StatusLog(false,"AttachAdditions: Piece invalid") end - local LocalAng = ePiece:GetAngles() - local LocalPos = ePiece:GetPos() - local LocalMod = ePiece:GetModel() - local stAddition = CacheQueryAdditions(LocalMod) - if(not IsExistent(stAddition)) then - return StatusLog(true,"AttachAdditions: Model <"..LocalMod.."> has no additions") end - LogInstance("AttachAdditions: Called for model <"..LocalMod..">") - local Cnt = 1 - local defTable = GetOpVar("DEFTABLE_ADDITIONS") - while(stAddition[Cnt]) do - local Record = stAddition[Cnt] - LogInstance("\n\nEnt [ "..Record[defTable[4][1]].." ] INFO : ") - local Addition = entsCreate(Record[defTable[3][1]]) - if(Addition and Addition:IsValid()) then - LogInstance("Addition Class: "..Record[defTable[3][1]]) - if(fileExists(Record[defTable[2][1]], "GAME")) then - Addition:SetModel(Record[defTable[2][1]]) - LogInstance("Addition:SetModel("..Record[defTable[2][1]]..")") - else return StatusLog(false,"AttachAdditions: No such attachment model "..Record[defTable[2][1]]) end - local OffPos = Record[defTable[5][1]] - if(not IsString(OffPos)) then - return StatusLog(false,"AttachAdditions: Position {"..type(OffPos).."}<"..tostring(OffPos).."> not string") end - if(OffPos and OffPos ~= "" and OffPos ~= "NULL") then - local AdditionPos = Vector() - local arConv = DecodePOA(OffPos) - arConv[1] = arConv[1] * arConv[4] - arConv[2] = arConv[2] * arConv[5] - arConv[3] = arConv[3] * arConv[6] - AdditionPos:Set(LocalPos) - AdditionPos:Add(arConv[1] * LocalAng:Forward()) - AdditionPos:Add(arConv[2] * LocalAng:Right()) - AdditionPos:Add(arConv[3] * LocalAng:Up()) - Addition:SetPos(AdditionPos) - LogInstance("Addition:SetPos(AdditionPos)") - else - Addition:SetPos(LocalPos) - LogInstance("Addition:SetPos(LocalPos)") - end - local OffAng = Record[defTable[6][1]] - if(not IsString(OffAng)) then - return StatusLog(false,"AttachAdditions: Angle {"..type(OffAng).."}<"..tostring(OffAng).."> not string") end - if(OffAng and OffAng ~= "" and OffAng ~= "NULL") then - local AdditionAng = Angle() - local arConv = DecodePOA(OffAng) - AdditionAng[caP] = arConv[1] * arConv[4] + LocalAng[caP] - AdditionAng[caY] = arConv[2] * arConv[5] + LocalAng[caY] - AdditionAng[caR] = arConv[3] * arConv[6] + LocalAng[caR] - Addition:SetAngles(AdditionAng) - LogInstance("Addition:SetAngles(AdditionAng)") - else - Addition:SetAngles(LocalAng) - LogInstance("Addition:SetAngles(LocalAng)") - end - local MoveType = (tonumber(Record[defTable[7][1]]) or -1) - if(MoveType >= 0) then - Addition:SetMoveType(MoveType) - LogInstance("Addition:SetMoveType("..MoveType..")") - end - local PhysInit = (tonumber(Record[defTable[8][1]]) or -1) - if(PhysInit >= 0) then - Addition:PhysicsInit(PhysInit) - LogInstance("Addition:PhysicsInit("..PhysInit..")") - end - if((tonumber(Record[defTable[9][1]]) or -1) >= 0) then - Addition:DrawShadow(false) - LogInstance("Addition:DrawShadow(false)") - end - Addition:SetParent( ePiece ) - LogInstance("Addition:SetParent(ePiece)") - Addition:Spawn() - LogInstance("Addition:Spawn()") - phAddition = Addition:GetPhysicsObject() - if(phAddition and phAddition:IsValid()) then - if((tonumber(Record[defTable[10][1]]) or -1) >= 0) then - phAddition:EnableMotion(false) - LogInstance("phAddition:EnableMotion(false)") - end - if((tonumber(Record[defTable[11][1]]) or -1) >= 0) then - phAddition:Sleep() - LogInstance("phAddition:Sleep()") - end - end - Addition:Activate() - LogInstance("Addition:Activate()") - ePiece:DeleteOnRemove(Addition) - LogInstance("ePiece:DeleteOnRemove(Addition)") - local Solid = (tonumber(Record[defTable[12][1]]) or -1) - if(Solid >= 0) then - Addition:SetSolid(Solid) - LogInstance("Addition:SetSolid("..Solid..")") - end - else - return StatusLog(false,"Failed to allocate Addition #"..Cnt.." memory:" - .."\n Modelbse: "..stAddition[Cnt][defTable[1][1]] - .."\n Addition: "..stAddition[Cnt][defTable[2][1]] - .."\n ENTclass: "..stAddition[Cnt][defTable[3][1]]) - end - Cnt = Cnt + 1 - end - return StatusLog(true,"AttachAdditions: Success") -end - -local function GetEntityOrTrace(oEnt) - if(oEnt and oEnt:IsValid()) then return oEnt end - local Ply = LocalPlayer() - if(not IsExistent(Ply)) then - return StatusLog(nil,"GetEntityOrTrace: Player missing") end - local Trace = Ply:GetEyeTrace() - if(not IsExistent(Trace)) then - return StatusLog(nil,"GetEntityOrTrace: Trace missing") end - if(not Trace.Hit) then -- Boolean - return StatusLog(nil,"GetEntityOrTrace: Trace not hit") end - if(Trace.HitWorld) then -- Boolean - return StatusLog(nil,"GetEntityOrTrace: Trace hit world") end - local trEnt = Trace.Entity - if(not (trEnt and trEnt:IsValid())) then - return StatusLog(nil,"GetEntityOrTrace: Trace entity invalid") end - return StatusLog(trEnt,"GetEntityOrTrace: Success "..tostring(trEnt)) -end - -function GetPropSkin(oEnt) - local skEnt = GetEntityOrTrace(oEnt) - if(not IsExistent(skEnt)) then - return StatusLog("","GetPropSkin: Failed to gather entity") end - if(IsOther(skEnt)) then - return StatusLog("","GetPropSkin: Entity other type") end - local Skin = tonumber(skEnt:GetSkin()) - if(not IsExistent(Skin)) then return StatusLog("","GetPropSkin: Skin number mismatch") end - return StatusLog(tostring(Skin),"GetPropSkin: Success "..tostring(skEn)) -end - -function GetPropBodyGrp(oEnt) - local bgEnt = GetEntityOrTrace(oEnt) - if(not IsExistent(bgEnt)) then - return StatusLog("","GetPropBodyGrp: Failed to gather entity") end - if(IsOther(bgEnt)) then - return StatusLog("","GetPropBodyGrp: Entity other type") end - local BGs = bgEnt:GetBodyGroups() - if(not (BGs and BGs[1])) then - return StatusLog("","GetPropBodyGrp: Bodygroup table empty") end - local sRez, iCnt = "", 1 - local symSep = GetOpVar("OPSYM_SEPARATOR") - while(BGs[iCnt]) do - sRez = sRez..symSep..tostring(bgEnt:GetBodygroup(BGs[iCnt].id) or 0) - iCnt = iCnt + 1 - end - sRez = stringSub(sRez,2,-1) - Print(BGs,"GetPropBodyGrp: BGs") - return StatusLog(sRez,"GetPropBodyGrp: Success <"..sRez..">") -end - -function AttachBodyGroups(ePiece,sBgrpIDs) - if(not (ePiece and ePiece:IsValid())) then - return StatusLog(false,"AttachBodyGroups: Base entity invalid") end - local sBgrpIDs = tostring(sBgrpIDs or "") - LogInstance("AttachBodyGroups: <"..sBgrpIDs..">") - local iCnt = 1 - local BGs = ePiece:GetBodyGroups() - local IDs = stringExplode(GetOpVar("OPSYM_SEPARATOR"),sBgrpIDs) - while(BGs[iCnt] and IDs[iCnt]) do - local itrBG = BGs[iCnt] - local maxID = (ePiece:GetBodygroupCount(itrBG.id) - 1) - local itrID = mathClamp(mathFloor(tonumber(IDs[iCnt]) or 0),0,maxID) - LogInstance("ePiece:SetBodygroup("..tostring(itrBG.id)..","..tostring(itrID)..") ["..tostring(maxID).."]") - ePiece:SetBodygroup(itrBG.id,itrID) - iCnt = iCnt + 1 - end - return StatusLog(true,"AttachBodyGroups: Success") -end - -function MakePiece(sModel,vPos,aAng,nMass,sBgSkIDs,clColor) - if(CLIENT) then return StatusLog(nil,"MakePiece: Working on client") end - local stPiece = CacheQueryPiece(sModel) - if(not IsExistent(stPiece)) then - return StatusLog(nil,"MakePiece: Record missing <"..sModel..">") end - local ePiece = entsCreate("prop_physics") - if(not (ePiece and ePiece:IsValid())) then - return StatusLog(nil,"MakePiece: Entity invalid") end - ePiece:SetCollisionGroup(COLLISION_GROUP_NONE) - ePiece:SetSolid(SOLID_VPHYSICS) - ePiece:SetMoveType(MOVETYPE_VPHYSICS) - ePiece:SetNotSolid(false) - ePiece:SetModel(sModel) - ePiece:SetPos(vPos or GetOpVar("VEC_ZERO")) - ePiece:SetAngles(aAng or GetOpVar("ANG_ZERO")) - ePiece:Spawn() - ePiece:Activate() - ePiece:SetRenderMode(RENDERMODE_TRANSALPHA) - ePiece:SetColor(clColor or Color(255,255,255,255)) - ePiece:DrawShadow(false) - ePiece:PhysWake() - local phPiece = ePiece:GetPhysicsObject() - if(not (phPiece and phPiece:IsValid())) then ePiece:Remove() - return StatusLog(nil,"MakePiece: Entity phys object invalid") end - phPiece:EnableMotion(false) - phPiece:SetMass(mathClamp(tonumber(nMass) or 1,1,GetOpVar("MAX_MASS"))) - local BgSk = stringExplode(GetOpVar("OPSYM_DIRECTORY"),(sBgSkIDs or "")) - ePiece:SetSkin(mathClamp(tonumber(BgSk[2]) or 0,0,ePiece:SkinCount()-1)) - if(not AttachBodyGroups(ePiece,BgSk[1] or "")) then ePiece:Remove() - return StatusLog(nil,"MakePiece: Failed to attach bodygroups") end - if(not AttachAdditions(ePiece)) then ePiece:Remove() - return StatusLog(nil,"MakePiece: Failed to attach additions") end - return StatusLog(ePiece,"MakePiece: Success "..tostring(ePiece)) -end - -function ApplyPhysicalAnchor(ePiece,eBase,nWe,nNc) - if(CLIENT) then return StatusLog(true,"ApplyPhysicalAnchor: Working on client") end - local nWe = tonumber(nWe) or 0 - local nNc = tonumber(nNc) or 0 - LogInstance("ApplyPhysicalAnchor: {"..nWe..","..nNc.."}") - if(not (ePiece and ePiece:IsValid())) then - return StatusLog(false,"ApplyPhysicalAnchor: Piece entity not valid") end - if(not (eBase and eBase:IsValid())) then - return StatusLog(true,"ApplyPhysicalAnchor: Base constraint ignored") end - if(nWe ~= 0) then -- Weld - local nWe = constraintWeld(ePiece, eBase, 0, 0, 0, false, false) - if(nWe and nWe:IsValid()) then - ePiece:DeleteOnRemove(nWe) - eBase:DeleteOnRemove(nWe) - else LogInstance("ApplyPhysicalAnchor: Weld ignored") end - end - if(nNc ~= 0) then -- NoCollide - local nNc = constraintNoCollide(ePiece, eBase, 0, 0) - if(nNc and nNc:IsValid()) then - ePiece:DeleteOnRemove(nNc) - eBase:DeleteOnRemove(nNc) - else LogInstance("ApplyPhysicalAnchor: NoCollide ignored") end - end - return StatusLog(true,"ApplyPhysicalAnchor: Success") -end - -function ApplyPhysicalSettings(ePiece,nPi,nFr,nGr,sPh) - if(CLIENT) then return StatusLog(true,"ApplyPhysicalSettings: Working on client") end - local nPi = tonumber(nPi) or 0 - local nFr = tonumber(nFr) or 0 - local nGr = tonumber(nGr) or 0 - local sPh = tostring(sPh or "") - LogInstance("ApplyPhysicalSettings: {"..nPi..","..nFr..","..nGr..","..sPh.."}") - if(not (ePiece and ePiece:IsValid())) then - return StatusLog(false,"ApplyPhysicalSettings: Piece entity not valid") end - -- Initialize dupe settings using this array - local dataSettings = {} - if(nPi ~= 0) then - ePiece.PhysgunDisabled = true - ePiece:SetUnFreezable(true) - ePiece:SetMoveType(MOVETYPE_VPHYSICS) - dataSettings[1] = 1 -- Enabled - end - local pyPiece = ePiece:GetPhysicsObject() - if(not (pyPiece and pyPiece:IsValid())) then - return StatusLog(false,"ApplyPhysicalSettings: Piece physical object not valid") end - if(nFr ~= 0) then pyPiece:EnableMotion(false) else pyPiece:EnableMotion(true) end - if(nGr ~= 0) then constructSetPhysProp(nil,ePiece,0,pyPiece,{GravityToggle = true }) - else constructSetPhysProp(nil,ePiece,0,pyPiece,{GravityToggle = false}) end - if(sPh ~= "") then constructSetPhysProp(nil,ePiece,0,pyPiece,{Material = sPh}) end - if(tableMaxn(dataSettings) > 0) then -- Are there any settings to be saved - duplicatorStoreEntityModifier(ePiece,GetOpVar("TOOLNAME_PL").."dupe_phys_set",dataSettings) end - return StatusLog(true,"ApplyPhysicalSettings: Success") -end - -function SetBoundPos(ePiece,vPos,oPly,sMode) - if(not (ePiece and ePiece:IsValid())) then - return StatusLog(false,"Piece:SetBoundPos: Entity invalid") end - if(not vPos) then - return StatusLog(false,"Piece:SetBoundPos: Position invalid") end - if(not oPly) then - return StatusLog(false,"Piece:SetBoundPos: Player invalid") end - local sMode = tostring(sMode or "LOG") - if(sMode == "OFF") then - ePiece:SetPos(vPos) - return StatusLog(true,"Piece:SetBoundPos("..sMode..") Tuned off") - end - if(utilIsInWorld(vPos)) then -- Error mode is "LOG" by default - ePiece:SetPos(vPos) - else - ePiece:Remove() - if(sMode == "HINT" or sMode == "GENERIC" or sMode == "ERROR") then - PrintNotifyPly(oPly,"Position out of map bounds!",sMode) end - return StatusLog(false,"Piece:SetBoundPos("..sMode.."): Position out of map bounds") - end - return StatusLog(true,"Piece:SetBoundPos("..sMode.."): Success") -end - -function MakeCoVar(sShortName, sValue, tBorder, nFlags, sInfo) - if(not IsString(sShortName)) then - return StatusLog(nil,"MakeCvar: CVar name {"..type(sShortName).."}<"..tostring(sShortName).."> not string") end - if(not IsExistent(sValue)) then - return StatusLog(nil,"MakeCvar: Wrong default value <"..tostring(sValue)..">") end - if(not IsString(sInfo)) then - return StatusLog(nil,"MakeCvar: CVar info {"..type(sInfo).."}<"..tostring(sInfo).."> not string") end - local sVar = GetOpVar("TOOLNAME_PL")..stringLower(sShortName) - if(tBorder and (type(tBorder) == "table") and tBorder[1] and tBorder[2]) then - local Border = GetOpVar("TABLE_BORDERS") - Border["cvar_"..sVar] = tBorder - end - return CreateConVar(sVar, sValue, nFlags, sInfo) -end - -function GetCoVar(sShortName, sMode) - if(not IsString(sShortName)) then - return StatusLog(nil,"GetCoVar: CVar name {"..type(sShortName).."}<"..tostring(sShortName).."> not string") end - if(not IsString(sMode)) then - return StatusLog(nil,"GetCoVar: CVar mode {"..type(sMode).."}<"..tostring(sMode).."> not string") end - local sVar = GetOpVar("TOOLNAME_PL")..stringLower(sShortName) - local CVar = GetConVar(sVar) - if(not IsExistent(CVar)) then - return StatusLog(nil,"GetCoVar("..sShortName..", "..sMode.."): Missing CVar object") end - if (sMode == "INT") then - return (tonumber(BorderValue(CVar:GetInt(),"cvar_"..sVar)) or 0) - elseif(sMode == "FLT") then - return (tonumber(BorderValue(CVar:GetFloat(),"cvar_"..sVar)) or 0) - elseif(sMode == "STR") then - return tostring(CVar:GetString() or "") - elseif(sMode == "BUL") then - return (CVar:GetBool() or false) - elseif(sMode == "DEF") then - return CVar:GetDefault() - elseif(sMode == "INF") then - return CVar:GetHelpText() - elseif(sMode == "NAM") then - return CVar:GetName() - end - return StatusLog(nil,"GetCoVar("..sShortName..", "..sMode.."): Missed mode") -end +--- Because Vec[1] is actually faster than Vec.X + +--- Vector Component indexes --- +local cvX -- Vector X component +local cvY -- Vector Y component +local cvZ -- Vector Z component + +--- Angle Component indexes --- +local caP -- Angle Pitch component +local caY -- Angle Yaw component +local caR -- Angle Roll component + +--- Component Status indexes --- +local csA -- Sign of the first component +local csB -- Sign of the second component +local csC -- Sign of the third component +local csD -- Flag for disabling the point + +---------------- Localizing instances ------------------ +local SERVER = SERVER +local CLIENT = CLIENT + +---------------- Localizing Player keys ---------------- +local IN_ALT1 = IN_ALT1 +local IN_ALT2 = IN_ALT2 +local IN_ATTACK = IN_ATTACK +local IN_ATTACK2 = IN_ATTACK2 +local IN_BACK = IN_BACK +local IN_DUCK = IN_DUCK +local IN_FORWARD = IN_FORWARD +local IN_JUMP = IN_JUMP +local IN_LEFT = IN_LEFT +local IN_MOVELEFT = IN_MOVELEFT +local IN_MOVERIGHT = IN_MOVERIGHT +local IN_RELOAD = IN_RELOAD +local IN_RIGHT = IN_RIGHT +local IN_SCORE = IN_SCORE +local IN_SPEED = IN_SPEED +local IN_USE = IN_USE +local IN_WALK = IN_WALK +local IN_ZOOM = IN_ZOOM + +---------------- Localizing ENT Properties ---------------- +local SOLID_VPHYSICS = SOLID_VPHYSICS +local MOVETYPE_VPHYSICS = MOVETYPE_VPHYSICS +local COLLISION_GROUP_NONE = COLLISION_GROUP_NONE +local RENDERMODE_TRANSALPHA = RENDERMODE_TRANSALPHA + +---------------- Localizing needed functions ---------------- +local next = next +local type = type +local Angle = Angle +local Color = Color +local pairs = pairs +local print = print +local tobool = tobool +local Vector = Vector +local include = include +local IsValid = IsValid +local require = require +local Time = SysTime +local tonumber = tonumber +local tostring = tostring +local GetConVar = GetConVar +local LocalPlayer = LocalPlayer +local CreateConVar = CreateConVar +local getmetatable = getmetatable +local setmetatable = setmetatable +local collectgarbage = collectgarbage +local osClock = os and os.clock +local osDate = os and os.date +local sqlQuery = sql and sql.Query +local sqlLastError = sql and sql.LastError +local sqlTableExists = sql and sql.TableExists +local utilTraceLine = util and util.TraceLine +local utilIsInWorld = util and util.IsInWorld +local utilIsValidModel = util and util.IsValidModel +local utilGetPlayerTrace = util and util.GetPlayerTrace +local entsCreate = ents and ents.Create +local fileOpen = file and file.Open +local fileExists = file and file.Exists +local fileAppend = file and file.Append +local fileDelete = file and file.Delete +local fileCreateDir = file and file.CreateDir +local mathPi = math and math.pi +local mathAbs = math and math.abs +local mathSin = math and math.sin +local mathCos = math and math.cos +local mathCeil = math and math.ceil +local mathModf = math and math.modf +local mathSqrt = math and math.sqrt +local mathFloor = math and math.floor +local mathClamp = math and math.Clamp +local mathRandom = math and math.random +local undoCreate = undo and undo.Create +local undoFinish = undo and undo.Finish +local undoAddEntity = undo and undo.AddEntity +local undoSetPlayer = undo and undo.SetPlayer +local undoSetCustomUndoText = undo and undo.SetCustomUndoText +local timerStop = timer and timer.Stop +local timerStart = timer and timer.Start +local timerExists = timer and timer.Exists +local timerCreate = timer and timer.Create +local timerDestroy = timer and timer.Destroy +local tableEmpty = table and table.Empty +local tableMaxn = table and table.maxn +local stringLen = string and string.len +local stringSub = string and string.sub +local stringFind = string and string.find +local stringGsub = string and string.gsub +local stringUpper = string and string.upper +local stringLower = string and string.lower +local stringFormat = string and string.format +local stringExplode = string and string.Explode +local stringImplode = string and string.Implode +local stringToFileName = string and string.GetFileFromFilename +local surfaceSetFont = surface and surface.SetFont +local surfaceDrawLine = surface and surface.DrawLine +local surfaceDrawText = surface and surface.DrawText +local surfaceDrawCircle = surface and surface.DrawCircle +local surfaceSetTexture = surface and surface.SetTexture +local surfaceSetTextPos = surface and surface.SetTextPos +local surfaceGetTextSize = surface and surface.GetTextSize +local surfaceGetTextureID = surface and surface.GetTextureID +local surfaceSetDrawColor = surface and surface.SetDrawColor +local surfaceSetTextColor = surface and surface.SetTextColor +local constructSetPhysProp = construct and construct.SetPhysProp +local constraintWeld = constraint and constraint.Weld +local constraintNoCollide = constraint and constraint.NoCollide +local surfaceDrawTexturedRect = surface and surface.DrawTexturedRect +local duplicatorStoreEntityModifier = duplicator and duplicator.StoreEntityModifier + +---------------- CASHES SPACE -------------------- + +local libCache = {} -- Used to cache stuff in a Pool +local libAction = {} -- Used to attach external function to the lib +local libOpVars = {} -- Used to Store operational Variable Values + +module("trackasmlib") + +---------------------------- PRIMITIVES ---------------------------- + +function Delay(nAdd) + local nAdd = tonumber(nAdd) or 0 + if(nAdd > 0) then + local tmEnd = osClock() + nAdd + while(osClock() < tmEnd) do end + end +end + +function GetInstPref() + if (CLIENT) then return "cl_" + elseif(SERVER) then return "sv_" end + return "na_" +end + +function GetOpVar(sName) + return libOpVars[sName] +end + +function SetOpVar(sName, anyValue) + libOpVars[sName] = anyValue +end + +function IsExistent(anyValue) + return (anyValue ~= nil) +end + +function IsString(anyValue) + return (getmetatable(anyValue) == GetOpVar("TYPEMT_STRING")) +end + +local function IsEmptyString(anyValue) + if(not IsString(anyValue)) then return false end + return (anyValue == "") +end + +function IsBool(anyValue) + if (anyValue == true ) then return true + elseif(anyValue == false) then return true end + return false +end + +function IsNumber(anyValue) + return ((tonumber(anyValue) and true) or false) +end + +------------------ LOGS ------------------------ + +local function FormatNumberMax(nNum,nMax) + local nNum = tonumber(nNum) + local nMax = tonumber(nMax) + if(not (nNum and nMax)) then return "" end + return stringFormat("%"..stringLen(tostring(mathFloor(nMax))).."d",nNum) +end + +function SetLogControl(nLines,sFile) + SetOpVar("LOG_CURLOGS",0) + SetOpVar("LOG_LOGFILE",tostring(sFile or "")) + SetOpVar("LOG_MAXLOGS",mathFloor(tonumber(nLines) or 0)) + if(not fileExists(GetOpVar("DIRPATH_BAS"),"DATA") and + not IsEmptyString(GetOpVar("LOG_LOGFILE"))) then + fileCreateDir(GetOpVar("DIRPATH_BAS")) + end +end + +local function Log(anyStuff) + local nMaxLogs = GetOpVar("LOG_MAXLOGS") + if(nMaxLogs <= 0) then return end + local sLogFile = GetOpVar("LOG_LOGFILE") + local nCurLogs = GetOpVar("LOG_CURLOGS") + if(sLogFile ~= "") then + local fName = GetOpVar("DIRPATH_BAS")..GetOpVar("DIRPATH_LOG")..sLogFile..".txt" + fileAppend(fName,FormatNumberMax(nCurLogs,nMaxLogs).." >> "..tostring(anyStuff).."\n") + nCurLogs = nCurLogs + 1 + if(nCurLogs > nMaxLogs) then + fileDelete(fName) + nCurLogs = 0 + end + SetOpVar("LOG_CURLOGS",nCurLogs) + else + print(FormatNumberMax(nCurLogs,nMaxLogs).." >> "..tostring(anyStuff)) + nCurLogs = nCurLogs + 1 + if(nCurLogs > nMaxLogs) then + nCurLogs = 0 + end + SetOpVar("LOG_CURLOGS",nCurLogs) + end +end + +function PrintInstance(anyStuff) + local sModeDB = GetOpVar("MODE_DATABASE") + if(SERVER) then + print("SERVER > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..tostring(anyStuff)) + elseif(CLIENT) then + print("CLIENT > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..tostring(anyStuff)) + else + print("NOINST > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..tostring(anyStuff)) + end +end + +function LogInstance(anyStuff) + if(GetOpVar("LOG_MAXLOGS") <= 0) then return end + local anyStuff = tostring(anyStuff) + local logStats = GetOpVar("LOG_SKIP") + if(logStats and logStats[1]) then + local iNdex = 1 + while(logStats[iNdex]) do + if(stringFind(anyStuff,tostring(logStats[iNdex]))) then return end + iNdex = iNdex + 1 + end + end -- Should the current log being skipped + logStats = GetOpVar("LOG_ONLY") + if(logStats and logStats[1]) then + local iNdex = 1 + local logMe = false + while(logStats[iNdex]) do + if(stringFind(anyStuff,tostring(logStats[iNdex]))) then + logMe = true + end + iNdex = iNdex + 1 + end + if(not logMe) then return end + end -- Only the chosen messages are processed + local sModeDB = GetOpVar("MODE_DATABASE") + if(SERVER) then + Log("SERVER > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..anyStuff) + elseif(CLIENT) then + Log("CLIENT > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..anyStuff) + else + Log("NOINST > "..GetOpVar("TOOLNAME_NU").." ["..sModeDB.."] "..anyStuff) + end +end + +function StatusPrint(anyStatus,sError) + PrintInstance(sError) + return anyStatus +end + +function StatusLog(anyStatus,sError) + LogInstance(sError) + return anyStatus +end + +function Print(tT,sS) + if(not IsExistent(tT)) then + return StatusLog(nil,"Print: {nil, name="..tostring(sS or "\"Data\"").."}") end + local S = type(sS) + local T = type(tT) + local Key = "" + if (S == "string") then S = sS + elseif(S == "number") then S = tostring(sS) + else S = "Data" end + if(T ~= "table") then + LogInstance("{"..T.."}["..tostring(sS or "N/A").."] = "..tostring(tT)) + return + end + T = tT + if(next(T) == nil) then + LogInstance(S.." = {}") + return + end + LogInstance(S) + for k,v in pairs(T) do + if(type(k) == "string") then + Key = S.."[\""..k.."\"]" + else + Key = S.."["..tostring(k).."]" + end + if(type(v) ~= "table") then + if(type(v) == "string") then + LogInstance(Key.." = \""..v.."\"") + else + LogInstance(Key.." = "..tostring(v)) + end + else + Print(v,Key) + end + end +end + +----------------- INITAIALIZATION ----------------- + +function GetIndexes(sType) + if(not IsString(sType)) then + return StatusLog(nil,"GetIndexes: Type {"..type(sType).."}<"..tostring(sType).."> not string") end + if (sType == "V") then return cvX, cvY, cvZ + elseif(sType == "A") then return caP, caY, caR + elseif(sType == "S") then return csA, csB, csC, csD + else return StatusLog(nil,"GetIndexes: Type <"..sType.."> not found") end +end + +function SetIndexes(sType,I1,I2,I3,I4) + if(not IsString(sType)) then + return StatusLog(false,"SetIndexes: Type {"..type(sType).."}<"..tostring(sType).."> not string") end + if (sType == "V") then cvX, cvY, cvZ = I1, I2, I3 + elseif(sType == "A") then caP, caY, caR = I1, I2, I3 + elseif(sType == "S") then csA, csB, csC, csD = I1, I2, I3, I4 + else return StatusLog(false,"SetIndexes: Type <"..sType.."> not found") end + return StatusLog(true,"SetIndexes["..sType.."]: Success") +end + +function InitAssembly(sName,sPurpose) + SetOpVar("TYPEMT_STRING",getmetatable("TYPEMT_STRING")) + SetOpVar("TYPEMT_SCREEN",{}) + SetOpVar("TYPEMT_CONTAINER",{}) + if(not IsString(sName)) then + return StatusPrint(false,"InitAssembly: Name <"..tostring(sName).."> not string") end + if(not IsString(sPurpose)) then + return StatusPrint(false,"InitAssembly: Purpose <"..tostring(sPurpose).."> not string") end + if(IsEmptyString(sName) or tonumber(stringSub(sName,1,1))) then + return StatusPrint(false,"InitAssembly: Name invalid") end + if(IsEmptyString(sPurpose) or tonumber(stringSub(sPurpose,1,1))) then + return StatusPrint(false,"InitAssembly: Purpose invalid") end + SetOpVar("TIME_INIT",Time()) + SetOpVar("MAX_MASS",50000) + SetOpVar("MAX_LINEAR",1000) + SetOpVar("MAX_ROTATION",360) + SetOpVar("LOG_MAXLOGS",0) + SetOpVar("LOG_CURLOGS",0) + SetOpVar("LOG_LOGFILE","") + SetOpVar("ANG_ZERO",Angle()) + SetOpVar("VEC_ZERO",Vector()) + SetOpVar("OPSYM_DISABLE","#") + SetOpVar("OPSYM_REVSIGN","@") + SetOpVar("OPSYM_DIVIDER","_") + SetOpVar("OPSYM_DIRECTORY","/") + SetOpVar("OPSYM_SEPARATOR",",") + SetOpVar("GOLDEN_RATIO",1.61803398875) + SetOpVar("NAME_INIT",stringLower(sName)) + SetOpVar("NAME_PERP",stringLower(sPurpose)) + SetOpVar("TOOLNAME_NL",stringLower(GetOpVar("NAME_INIT")..GetOpVar("NAME_PERP"))) + SetOpVar("TOOLNAME_NU",stringUpper(GetOpVar("NAME_INIT")..GetOpVar("NAME_PERP"))) + SetOpVar("TOOLNAME_PL",GetOpVar("TOOLNAME_NL").."_") + SetOpVar("TOOLNAME_PU",GetOpVar("TOOLNAME_NU").."_") + SetOpVar("DIRPATH_BAS",GetOpVar("TOOLNAME_NL")..GetOpVar("OPSYM_DIRECTORY")) + SetOpVar("DIRPATH_INS","exp"..GetOpVar("OPSYM_DIRECTORY")) + SetOpVar("DIRPATH_DSV","dsv"..GetOpVar("OPSYM_DIRECTORY")) + SetOpVar("DIRPATH_LOG","") + SetOpVar("MISS_NOID","N") -- No ID selected + SetOpVar("MISS_NOAV","N/A") -- Not Available + SetOpVar("MISS_NOMD","X") -- No model + SetOpVar("ARRAY_DECODEPOA",{0,0,0,1,1,1,false}) + SetOpVar("TABLE_FREQUENT_MODELS",{}) + SetOpVar("TABLE_BORDERS",{}) + SetOpVar("FILE_MODEL","%.mdl") + SetOpVar("MODE_DATABASE",GetOpVar("MISS_NOAV")) + SetOpVar("HASH_USER_PANEL",GetOpVar("TOOLNAME_PU").."USER_PANEL") + SetOpVar("HASH_QUERY_STORE",GetOpVar("TOOLNAME_PU").."QHASH_QUERY") + SetOpVar("HASH_PLAYER_KEYDOWN","PLAYER_KEYDOWN") + SetOpVar("HASH_PROPERTY_NAMES","PROPERTY_NAMES") + SetOpVar("HASH_PROPERTY_TYPES","PROPERTY_TYPES") + SetOpVar("NAV_PIECE",{}) + SetOpVar("NAV_PANEL",{}) + SetOpVar("NAV_ADDITION",{}) + SetOpVar("NAV_PROPERTY_NAMES",{}) + SetOpVar("NAV_PROPERTY_TYPES",{}) + SetOpVar("STRUCT_SPAWN",{ + F = Vector(), + R = Vector(), + U = Vector(), + OPos = Vector(), + OAng = Angle (), + SPos = Vector(), + SAng = Angle (), + RLen = 0, + --- Holder --- + HRec = 0, + HID = 0, + HPnt = Vector(), -- P + HPos = Vector(), -- O + HAng = Angle (), -- A + --- Traced --- + TRec = 0, + TID = 0, + TPnt = Vector(), -- P + TPos = Vector(), -- O + TAng = Angle () -- A + }) + return StatusPrint(true,"InitAssembly: Success") +end + +------------- ANGLE --------------- +function ToAngle(aBase) + if(not aBase) then return StatusLog(nil,"ToAngle: Base invalid") end + return Angle((tonumber(aBase[caP]) or 0), (tonumber(aBase[caY]) or 0), (tonumber(aBase[caR]) or 0)) +end + +function ExpAngle(aBase) + if(not aBase) then return StatusLog(nil,"ExpAngle: Base invalid") end + return (tonumber(aBase[caP]) or 0), (tonumber(aBase[caY]) or 0), (tonumber(aBase[caR]) or 0) +end + +function AddAngle(aBase, aUnit) + if(not aBase) then return StatusLog(nil,"AddAngle: Base invalid") end + if(not aUnit) then return StatusLog(nil,"AddAngle: Unit invalid") end + aBase[caP] = (tonumber(aBase[caP]) or 0) + (tonumber(aUnit[caP]) or 0) + aBase[caY] = (tonumber(aBase[caY]) or 0) + (tonumber(aUnit[caY]) or 0) + aBase[caR] = (tonumber(aBase[caR]) or 0) + (tonumber(aUnit[caR]) or 0) +end + +function AddAnglePYR(aBase, nP, nY, nR) + if(not aBase) then return StatusLog(nil,"AddAnglePYR: Base invalid") end + aBase[caP] = (tonumber(aBase[caP]) or 0) + (tonumber(nP) or 0) + aBase[caY] = (tonumber(aBase[caY]) or 0) + (tonumber(nY) or 0) + aBase[caR] = (tonumber(aBase[caR]) or 0) + (tonumber(nR) or 0) +end + +function SubAngle(aBase, aUnit) + if(not aBase) then return StatusLog(nil,"SubAngle: Base invalid") end + if(not aUnit) then return StatusLog(nil,"SubAngle: Unit invalid") end + aBase[caP] = (tonumber(aBase[caP]) or 0) - (tonumber(aUnit[caP]) or 0) + aBase[caY] = (tonumber(aBase[caY]) or 0) - (tonumber(aUnit[caY]) or 0) + aBase[caR] = (tonumber(aBase[caR]) or 0) - (tonumber(aUnit[caR]) or 0) +end + +function SubAnglePYR(aBase, nP, nY, nR) + if(not aBase) then return StatusLog(nil,"SubAnglePYR: Base invalid") end + aBase[caP] = (tonumber(aBase[caP]) or 0) - (tonumber(nP) or 0) + aBase[caY] = (tonumber(aBase[caY]) or 0) - (tonumber(nY) or 0) + aBase[caR] = (tonumber(aBase[caR]) or 0) - (tonumber(nR) or 0) +end + +function NegAngle(aBase) + if(not aBase ) then return StatusLog(nil,"NegAngle: Base invalid") end + aBase[caP] = -(tonumber(aBase[caP]) or 0) + aBase[caY] = -(tonumber(aBase[caY]) or 0) + aBase[caR] = -(tonumber(aBase[caR]) or 0) +end + +function SetAngle(aBase, aUnit) + if(not aBase) then return StatusLog(nil,"SetAngle: Base invalid") end + if(not aUnit) then return StatusLog(nil,"SetAngle: Unit invalid") end + aBase[caP] = (tonumber(aUnit[caP]) or 0) + aBase[caY] = (tonumber(aUnit[caY]) or 0) + aBase[caR] = (tonumber(aUnit[caR]) or 0) +end + +function SetAnglePYR(aBase, nP, nY, nR) + if(not aBase) then return StatusLog(nil,"SetAnglePYR: Base invalid") end + aBase[caP] = (tonumber(nP) or 0) + aBase[caY] = (tonumber(nY) or 0) + aBase[caR] = (tonumber(nR) or 0) +end + +------------- VECTOR --------------- + +function ToVector(vBase) + if(not vBase) then return StatusLog(nil,"ToVector: Base invalid") end + return Vector((tonumber(vBase[cvX]) or 0), (tonumber(vBase[cvY]) or 0), (tonumber(vBase[cvZ]) or 0)) +end + +function ExpVector(vBase) + if(not vBase) then return StatusLog(nil,"ExpVector: Base invalid") end + return (tonumber(vBase[cvX]) or 0), (tonumber(vBase[cvY]) or 0), (tonumber(vBase[cvZ]) or 0) +end + +function GetLengthVector(vBase) + if(not vBase) then return StatusLog(nil,"GetLengthVector: Base invalid") end + local X = (tonumber(vBase[cvX]) or 0); X = X * X + local Y = (tonumber(vBase[cvY]) or 0); Y = Y * Y + local Z = (tonumber(vBase[cvZ]) or 0); Z = Z * Z + return mathSqrt(X + Y + Z) +end + +function RoundVector(vBase,nvRound) + if(not vBase) then return StatusLog(nil,"RoundVector: Base invalid") end + local R = tonumber(nvRound) + if(not IsExistent(R)) then + return StatusLog(nil,"RoundVector: Round NAN {"..type(nvRound).."}<"..tostring(nvRound)..">") end + local X = (tonumber(vBase[cvX]) or 0); X = RoundValue(X,R); vBase[cvX] = X + local Y = (tonumber(vBase[cvY]) or 0); Y = RoundValue(Y,R); vBase[cvY] = Y + local Z = (tonumber(vBase[cvZ]) or 0); Z = RoundValue(Z,R); vBase[cvZ] = Z +end + +function AddVector(vBase, vUnit) + if(not vBase) then return StatusLog(nil,"AddVector: Base invalid") end + if(not vUnit) then return StatusLog(nil,"AddVector: Unit invalid") end + vBase[cvX] = (tonumber(vBase[cvX]) or 0) + (tonumber(vUnit[cvX]) or 0) + vBase[cvY] = (tonumber(vBase[cvY]) or 0) + (tonumber(vUnit[cvY]) or 0) + vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) + (tonumber(vUnit[cvZ]) or 0) +end + +function AddVectorXYZ(vBase, nX, nY, nZ) + if(not vBase) then return StatusLog(nil,"AddVectorXYZ: Base invalid") end + vBase[cvX] = (tonumber(vBase[cvX]) or 0) + (tonumber(nX) or 0) + vBase[cvY] = (tonumber(vBase[cvY]) or 0) + (tonumber(nY) or 0) + vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) + (tonumber(nZ) or 0) +end + +function SubVector(vBase, vUnit) + if(not vBase) then return StatusLog(nil,"SubVector: Base invalid") end + if(not vUnit) then return StatusLog(nil,"SubVector: Unit invalid") end + vBase[cvX] = (tonumber(vBase[cvX]) or 0) - (tonumber(vUnit[cvX]) or 0) + vBase[cvY] = (tonumber(vBase[cvY]) or 0) - (tonumber(vUnit[cvY]) or 0) + vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) - (tonumber(vUnit[cvZ]) or 0) +end + +function SubVectorXYZ(vBase, nX, nY, nZ) + if(not vBase) then return StatusLog(nil,"SubVectorXYZ: Base invalid") end + vBase[cvX] = (tonumber(vBase[cvX]) or 0) - (tonumber(nX) or 0) + vBase[cvY] = (tonumber(vBase[cvY]) or 0) - (tonumber(nY) or 0) + vBase[cvZ] = (tonumber(vBase[cvZ]) or 0) - (tonumber(nZ) or 0) +end + +function NegVector(vBase) + if(not vBase) then return StatusLog(nil,"NegVector: Base invalid") end + vBase[cvX] = -(tonumber(vBase[cvX]) or 0) + vBase[cvY] = -(tonumber(vBase[cvY]) or 0) + vBase[cvZ] = -(tonumber(vBase[cvZ]) or 0) +end + +function SetVector(vBase, vUnit) + if(not vBase) then return StatusLog(nil,"SetVector: Base invalid") end + if(not vUnit) then return StatusLog(nil,"SetVector: Unit invalid") end + vBase[cvX] = (tonumber(vUnit[cvX]) or 0) + vBase[cvY] = (tonumber(vUnit[cvY]) or 0) + vBase[cvZ] = (tonumber(vUnit[cvZ]) or 0) +end + +function SetVectorXYZ(vBase, nX, nY, nZ) + if(not vBase) then return StatusLog(nil,"SetVector: Base invalid") end + vBase[cvX] = (tonumber(nX or 0)) + vBase[cvY] = (tonumber(nY or 0)) + vBase[cvZ] = (tonumber(nZ or 0)) +end + +function DecomposeByAngle(vBase,aUnit) + if(not vBase) then return StatusLog(Vector(),"DecomposeByAngle: Base invalid") end + if(not aUnit) then return StatusLog(Vector(),"DecomposeByAngle: Unit invalid") end + local X = vBase:DotProduct(aUnit:Forward()) + local Y = vBase:DotProduct(aUnit:Right()) + local Z = vBase:DotProduct(aUnit:Up()) + SetVectorXYZ(vBase,X,Y,Z) +end + +---------- OOP ----------------- + +function MakeContainer(sInfo,sDefKey) + local Curs = 0 + local Data = {} + local sSel, sIns, sDel, sMet = "", "", "", "" + local Info = tostring(sInfo or "Store Container") + local Key = sDefKey or "(!_+*#-$@DEFKEY@$-#*+_!)" + local self = {} + function self:GetInfo() return Info end + function self:GetSize() return Curs end + function self:GetData() return Data end + function self:Insert(nsKey,anyValue) + sIns = nsKey or Key + sMet = "I" + if(not IsExistent(Data[sIns])) then + Curs = Curs + 1 + end + Data[sIns] = anyValue + end + function self:Select(nsKey) + sSel = nsKey or Key + return Data[sSel] + end + function self:Delete(nsKey,fnDel) + sDel = nsKey or Key + sMet = "D" + if(IsExistent(Data[sDel])) then + if(IsExistent(fnDel)) then + fnDel(Data[sDel]) + end + Data[sDel] = nil + Curs = Curs - 1 + end + end + function self:GetHistory() + return tostring(sMet)..GetOpVar("OPSYM_REVSIGN").. + tostring(sSel)..GetOpVar("OPSYM_DIRECTORY").. + tostring(sIns)..GetOpVar("OPSYM_DIRECTORY").. + tostring(sDel) + end + setmetatable(self,GetOpVar("TYPEMT_CONTAINER")) + return self +end + +function MakeScreen(sW,sH,eW,eH,conPalette) + if(SERVER) then return nil end + local sW, sH = (tonumber(sW) or 0), (tonumber(sH) or 0) + local eW, eH = (tonumber(eW) or 0), (tonumber(eH) or 0) + if(eW <= 0 or eH <= 0) then return nil end + if(type(conPalette) ~= "table") then return nil end + local White = Color(255,255,255,255) + local Palette + local ColorKey + local Text = {} + Text.Font = "Trebuchet18" + Text.DrawX = 0 + Text.DrawY = 0 + Text.ScrW = 0 + Text.ScrH = 0 + Text.LastW = 0 + Text.LastH = 0 + if(getmetatable(conPalette) == GetOpVar("TYPEMT_CONTAINER")) then + Palette = conPalette + end + local Texture = {} + Texture.Path = "vgui/white" + Texture.ID = surfaceGetTextureID(Texture.Path) + local self = {} + function self:GetSize() return (eW-sW), (eH-sH) end + function self:GetCenter(nX,nY) + local nW, nH = self:GetSize() + nW = (nW / 2) + (tonumber(nX) or 0) + nH = (nH / 2) + (tonumber(nY) or 0) + return nW, nH + end + function self:SetColor(keyColor) + if(not keyColor) then return end + local keyColor = keyColor or ColorKey; ColorKey = keyColor + local rgbColor = (Palette and keyColor) and Palette:Select(keyColor) or White + surfaceSetDrawColor(rgbColor.r, rgbColor.g, rgbColor.b, rgbColor.a) + surfaceSetTextColor(rgbColor.r, rgbColor.g, rgbColor.b, rgbColor.a) + end + function self:SetTexture(sTexture) + if(not IsString(sTexture)) then return end + if(IsEmptyString(sTexture)) then return end + Texture.Path = sTexture + Texture.ID = surfaceGetTextureID(Texture.Path) + end + function self:GetTexture() return Texture.ID, Texture.Path end + function self:DrawBackGround(keyColor) + self:SetColor(keyColor) + surfaceSetTexture(Texture.ID) + surfaceDrawTexturedRect(sW,sH,eW-sW,eH-sH) + end + function self:DrawRect(nX,nY,nW,nH,keyColor) + self:SetColor(keyColor) + surfaceSetTexture(Texture.ID) + surfaceDrawTexturedRect(nX,nY,nW,nH) + end + function self:SetTextEdge(nX,nY) + Text.DrawX = (tonumber(nX) or 0) + Text.DrawY = (tonumber(nY) or 0) + Text.ScrW = 0 + Text.ScrH = 0 + Text.LastW = 0 + Text.LastH = 0 + end + function self:SetFont(sFont) + if(not IsString(sFont)) then return end + Text.Font = sFont or "Trebuchet18" + surfaceSetFont(Text.Font) + end + function self:GetTextState(nX,nY,nW,nH) + return (Text.DrawX + (nX or 0)), (Text.DrawY + (nY or 0)), + (Text.ScrW + (nW or 0)), (Text.ScrH + (nH or 0)), + Text.LastW, Text.LastH + end + function self:DrawText(sText,keyColor) + surfaceSetTextPos(Text.DrawX,Text.DrawY) + self:SetColor(keyColor) + surfaceDrawText(sText) + Text.LastW, Text.LastH = surfaceGetTextSize(sText) + Text.DrawY = Text.DrawY + Text.LastH + if(Text.LastW > Text.ScrW) then + Text.ScrW = Text.LastW + end + Text.ScrH = Text.DrawY + end + function self:DrawTextAdd(sText,keyColor) + surfaceSetTextPos(Text.DrawX + Text.LastW,Text.DrawY - Text.LastH) + self:SetColor(keyColor) + surfaceDrawText(sText) + local LastW, LastH = surfaceGetTextSize(sText) + Text.LastW = Text.LastW + LastW + Text.LastH = LastH + if(Text.LastW > Text.ScrW) then + Text.ScrW = Text.LastW + end + Text.ScrH = Text.DrawY + end + function self:Enclose(xyPnt) + if(xyPnt.x < sW) then return -1 end + if(xyPnt.x > eW) then return -1 end + if(xyPnt.y < sH) then return -1 end + if(xyPnt.y > eH) then return -1 end + return 1 + end + function self:DrawLine(xyS,xyE,keyColor,sMeth,tArg) + self:SetColor(keyColor) + if(not (xyS and xyE)) then return end + if(not (xyS.x and xyS.y and xyE.x and xyE.y)) then return end + if(self:Enclose(xyS) == -1 or self:Enclose(xyE) == -1) then return end + local sdrwMeth = tostring(sMeth or "API") + if(sdrwMeth == "API") then + surfaceDrawLine(xyS.x,xyS.y,xyE.x,xyE.y) + elseif(sdrwMeth == "LIN") then + local nIter = tonumber(tArg[1]) or 0 + if(nIter <= 0) then return end + local nLx, nLy = (xyE.x - xyS.x), (xyE.y - xyS.y) + local xyD = {x = (nLx / nIter), y = (nLy / nIter)} + local xyOld, xyNew = {x = xyS.x, y = xyS.y}, {x = 0,y = 0} + while(nIter > 0) do + xyNew.x = xyOld.x + xyD.x + xyNew.y = xyOld.y + xyD.y + self:DrawLine(xyOld,xyNew,keyColor) + surfaceDrawCircle(xyNew.x, xyNew.y, 10, Color(255,0,0)) + xyOld.x, xyOld.y = xyNew.x, xyNew.y + nIter = nIter - 1; + end + end + end + function self:DrawCircle(xyPos,nRad,keyColor,sMeth,tArg) + local sdrwMeth = tostring(sMeth or "API") + local keyColor = keyColor or ColorKey; ColorKey = keyColor + local rgbColor = (Palette and keyColor) and Palette:Select(keyColor) or White + if(sdrwMeth == "API") then surfaceDrawCircle(xyPos.x, xyPos.y, nRad, rgbColor) + elseif(sdrwMeth == "LIN") then + local nIter = tonumber(tArg[1]) or 0 + if(nIter <= 0) then return end + local nCurAng = 0 + local nMaxRot = (GetOpVar("MAX_ROTATION") * mathPi / 180) + local nStpRot = nMaxRot / nIter + local xyOld, xyNew, xyRad = {x=0,y=0}, {x=0,y=0}, {x=nRad,y=0} + xyOld.x = xyPos.x + xyRad.x + xyOld.y = xyPos.y + xyRad.y + while(nIter > 0) do + nCurAng = nCurAng + nStpRot + local nSin, nCos = mathSin(nCurAng), mathCos(nCurAng) + xyNew.x = xyPos.x + (xyRad.x * nCos - xyRad.y * nSin) + xyNew.y = xyPos.y + (xyRad.x * nSin + xyRad.y * nCos) + self:DrawLine(xyOld,xyNew,keyColor) + xyOld.x, xyOld.y = xyNew.x, xyNew.y + nIter = nIter - 1; + end + end + end + setmetatable(self,GetOpVar("TYPEMT_SCREEN")) + return self +end + +function SetAction(sKey,fAct,tDat) + if(not (sKey and IsString(sKey))) then return false end + if(not (fAct and type(fAct) == "function")) then return false end + if(not libAction[sKey]) then + libAction[sKey] = {} + end + libAction[sKey].Act = fAct + libAction[sKey].Dat = tDat + return true +end + +function GetActionCode(sKey) + if(not (sKey and IsString(sKey))) then return StatusLog(nil,"GetActionCode: ") end + if(not (libAction and libAction[sKey])) then return nil end + return libAction[sKey].Act +end + +function GetActionData(sKey) + if(not (sKey and IsString(sKey))) then return nil end + if(not (libAction and libAction[sKey])) then return nil end + return libAction[sKey].Dat +end + +function CallAction(sKey,A1,A2,A3,A4) + if(not (sKey and IsString(sKey))) then return false end + if(not (libAction and libAction[sKey])) then return false end + return libAction[sKey].Act(A1,A2,A3,A4,libAction[sKey].Dat) +end + +function IsOther(oEnt) + if(not oEnt) then return true end + if(not oEnt:IsValid()) then return true end + if(oEnt:IsPlayer()) then return true end + if(oEnt:IsVehicle()) then return true end + if(oEnt:IsNPC()) then return true end + if(oEnt:IsRagdoll()) then return true end + if(oEnt:IsWeapon()) then return true end + if(oEnt:IsWidget()) then return true end + return false +end + +local function AddLineListView(pnListView,frUsed,ivNdex) + if(not IsExistent(pnListView)) then + return StatusLog(nil,"LineAddListView: Missing panel") end + if(not IsValid(pnListView)) then + return StatusLog(nil,"LineAddListView: Invalid panel") end + if(not IsExistent(frUsed)) then + return StatusLog(nil,"LineAddListView: Missing data") end + local iNdex = tonumber(ivNdex) + if(not IsExistent(iNdex)) then + return StatusLog(nil,"LineAddListView: Index NAN {"..type(ivNdex).."}<"..tostring(ivNdex)..">") end + local tValue = frUsed[iNdex] + if(not IsExistent(tValue)) then + return StatusLog(nil,"LineAddListView: Missing data on index #"..tostring(iNdex)) end + local defTable = GetOpVar("DEFTABLE_PIECES") + if(not IsExistent(defTable)) then + return StatusLog(nil,"LineAddListView: Missing table definition") end + local sModel = tValue.Table[defTable[1][1]] + local sType = tValue.Table[defTable[2][1]] + local nAct = tValue.Table[defTable[4][1]] + local nUsed = RoundValue(tValue.Value,0.001) + local pnRec = pnListView:AddLine(nUsed,nAct,sType,sModel) + if(not IsExistent(pnRec)) then + return StatusLog(nil,"LineAddListView: Failed to create a ListView line for <"..sModel.."> #"..tostring(iNdex)) end + return pnRec, tValue +end + +--[[ + * Updates a VGUI pnListView with a search preformed in the already generated + * frequently used pieces "frUsed" for the pattern "sPattern" given by the user + * and a field name selected "sField". + * On success populates "pnListView" with the search preformed + * On fail a parameter is not valid or missing and returns non-success +]]-- +function UpdateListView(pnListView,frUsed,nCount,sField,sPattern) + if(not (IsExistent(frUsed) and IsExistent(frUsed[1]))) then + return StatusLog(false,"UpdateListView: Missing data") end + local nCount = tonumber(nCount) or 0 + if(nCount <= 0) then + return StatusLog(false,"UpdateListView: Count not applicable") end + if(IsExistent(pnListView)) then + if(not IsValid(pnListView)) then + return StatusLog(false,"UpdateListView: Invalid ListView") end + pnListView:SetVisible(false) + pnListView:Clear() + else + return StatusLog(false,"UpdateListView: Missing ListView") + end + local sField = tostring(sField or "") + local sPattern = tostring(sPattern or "") + local iNdex, pnRec, sData = 1, nil, nil + while(frUsed[iNdex]) do + if(IsEmptyString(sPattern)) then + pnRec = AddLineListView(pnListView,frUsed,iNdex) + if(not IsExistent(pnRec)) then + return StatusLog(false,"UpdateListView: Failed to add line on #"..tostring(iNdex)) end + else + sData = tostring(frUsed[iNdex].Table[sField] or "") + if(stringFind(sData,sPattern)) then + pnRec = AddLineListView(pnListView,frUsed,iNdex) + if(not IsExistent(pnRec)) then + return StatusLog(false,"UpdateListView: Failed to add line <" + ..sData.."> pattern <"..sPattern.."> on <"..sField.."> #"..tostring(iNdex)) end + end + end + iNdex = iNdex + 1 + end + pnListView:SetVisible(true) + return StatusLog(true,"UpdateListView: Crated #"..tostring(iNdex-1)) +end + +local function PushSortValues(tTable,snCnt,nsValue,tData) + local iCnt = mathFloor(tonumber(snCnt) or 0) + if(not (tTable and (type(tTable) == "table") and (iCnt > 0))) then return 0 end + local iInd = 1 + if(not tTable[iInd]) then + tTable[iInd] = {Value = nsValue, Table = tData } + return iInd + else + while(tTable[iInd] and (tTable[iInd].Value < nsValue)) do + iInd = iInd + 1 + end + if(iInd > iCnt) then return iInd end + while(iInd < iCnt) do + tTable[iCnt] = tTable[iCnt - 1] + iCnt = iCnt - 1 + end + tTable[iInd] = { Value = nsValue, Table = tData } + return iInd + end +end + +function GetFrequentModels(snCount) + local snCount = tonumber(snCount) or 0 + if(snCount < 1) then + return StatusLog(nil,"GetFrequentModels: Count not applicable") end + local defTable = GetOpVar("DEFTABLE_PIECES") + if(not IsExistent(defTable)) then + return StatusLog(nil,"GetFrequentModels: Missing table definition") end + local tCache = libCache[defTable.Name] + if(not IsExistent(tCache)) then + return StatusLog(nil,"GetFrequentModels: Missing table cache space") end + local iInd, tmNow = 1, Time() + local frUsed = GetOpVar("TABLE_FREQUENT_MODELS") + tableEmpty(frUsed) + for Model, Record in pairs(tCache) do + if(IsExistent(Record.Used) and IsExistent(Record.Kept) and Record.Kept > 0) then + iInd = PushSortValues(frUsed,snCount,tmNow-Record.Used,{ + [defTable[1][1]] = Model, + [defTable[2][1]] = Record.Type, + [defTable[3][1]] = Record.Name, + [defTable[4][1]] = Record.Kept + }) + if(iInd < 1) then return StatusLog(nil,"GetFrequentModels: Array index out of border") end + end + end + if(IsExistent(frUsed) and IsExistent(frUsed[1])) then return frUsed, snCount end + return StatusLog(nil,"GetFrequentModels: Array is empty or not available") +end + +function RoundValue(nvExact, nFrac) + local nExact = tonumber(nvExact) + if(not IsExistent(nExact)) then + return StatusLog(nil,"RoundValue: Cannot round NAN {"..type(nvExact).."}<"..tostring(nvExact)..">") end + local nFrac = tonumber(nFrac) or 0 + if(nFrac == 0) then + return StatusLog(nil,"RoundValue: Fraction must be <> 0") end + local q, f = mathModf(nExact/nFrac) + return nFrac * (q + (f > 0.5 and 1 or 0)) +end + +function SnapValue(nvVal, nvSnap) + if(not nvVal) then return 0 end + local nVal = tonumber(nvVal) + if(not IsExistent(nVal)) then + return StatusLog(0,"SnapValue: Convert value NAN {"..type(nvVal).."}<"..tostring(nvVal)..">") end + if(not IsExistent(nvSnap)) then return nVal end + local nSnap = tonumber(nvSnap) + if(not IsExistent(nSnap)) then + return StatusLog(0,"SnapValue: Convert snap NAN {"..type(nvSnap).."}<"..tostring(nvSnap)..">") end + if(nSnap == 0) then return nVal end + local nvSnp, nvVal = mathAbs(nSnap), mathAbs(nVal) + local nRst, nRez = (nvVal % nvSnp), 0 + if((nvSnp - nRst) < nRst) then nRez = nvVal + nvSnp - nRst else nRez = nvVal - nRst end + if(nVal < 0) then return -nRez; end + return nRez; +end + +function GetCenterMC(oEnt) + -- Set the ENT's Angles first! + if(not (oEnt and oEnt:IsValid())) then + return StatusLog(Vector(0,0,0),"GetCenterMC: Entity Invalid") end + local Phys = oEnt:GetPhysicsObject() + if(not (Phys and Phys:IsValid())) then + return StatusLog(Vector(0,0,0),"GetCenterMC: Phys object Invalid") end + local vRez = Phys:GetMassCenter() + vRez[cvX] = -vRez[cvX]; vRez[cvY] = -vRez[cvY]; vRez[cvZ] = 0 + vRez:Rotate(oEnt:GetAngles()) + return vRez +end + +function IsPhysTrace(Trace) + if(not Trace) then return false end + if(not Trace.Hit) then return false end + if(Trace.HitWorld) then return false end + local eEnt = Trace.Entity + if(not eEnt) then return false end + if(not eEnt:IsValid()) then return false end + if(not eEnt:GetPhysicsObject():IsValid()) then return false end + return true +end + +local function RollValue(nVal,nMin,nMax) + if(nVal > nMax) then return nMin end + if(nVal < nMin) then return nMax end + return nVal +end + +local function BorderValue(nsVal,sName) + if(not IsString(sName)) then return nsVal end + if(not (IsString(nsVal) or tonumber(nsVal))) then + return StatusLog(nsVal,"BorderValue: Value not comparable") end + local Border = GetOpVar("TABLE_BORDERS") + Border = Border[sName] + if(IsExistent(Border)) then + if (nsVal < Border[1]) then return Border[1] + elseif(nsVal > Border[2]) then return Border[2] end + end + return nsVal +end + +function IncDecPointID(ivPointID,sDir,rPiece) + local iPointID = tonumber(ivPointID) + if(not IsExistent(iPointID)) then + return StatusLog(1,"IncDecPointID: Point ID NAN {"..type(ivPointID).."}<"..tostring(ivPointID)..">") end + local stPOA = LocatePOA(rPiece,iPointID) + if(not IsExistent(stPOA)) then + return StatusLog(1,"IncDecPointID: Point ID #"..tostring(iPointID).." not located") end + local sDir, nDir = stringSub(tostring(sDir),1,1), 0 + if (sDir == "+") then nDir = 1 + elseif(sDir == "-") then nDir = -1 + else return StatusLog(iPointID,"IncDecPointID: Direction <"..sDir.."> mismatch") end + iPointID = RollValue(iPointID + nDir,1,rPiece.Kept) + stPOA = LocatePOA(rPiece,iPointID) -- Skip disabled O ( Origin ) + while(stPOA and stPOA.O[csD]) do + LogInstance("IncDecPointID: Point ID #"..tostring(iPointID).." disabled") + iPointID = RollValue(iPointID + nDir,1,rPiece.Kept) + stPOA = LocatePOA(rPiece,iPointID) -- Skip disabled O ( Origin ) + end; iPointID = RollValue(iPointID,1,rPiece.Kept) + if(not IsExistent(LocatePOA(rPiece,iPointID))) then + return StatusLog(1,"IncDecPointID["..sDir.."]: Offset PnextID #"..tostring(iPointID).." not located") end + return iPointID +end + +function IncDecPnextID(ivPnextID,ivPointID,sDir,rPiece) + local iPointID, iPnextID = tonumber(ivPointID), tonumber(ivPnextID) + if(not IsExistent(iPointID)) then + return StatusLog(1,"IncDecPnextID: PointID NAN {"..type(ivPointID).."}<"..tostring(ivPointID)..">") end + if(not IsExistent(iPnextID)) then + return StatusLog(1,"IncDecPnextID: PnextID NAN {"..type(ivPnextID).."}<"..tostring(ivPnextID)..">") end + if(not IsExistent(LocatePOA(rPiece,iPointID))) then + return StatusLog(1,"IncDecPointID: Offset PointID #"..tostring(iPointID).." not located") end + if(not IsExistent(LocatePOA(rPiece,iPnextID))) then + return StatusLog(1,"IncDecPointID: Offset PnextID #"..tostring(iPnextID).." not located") end + local sDir, nDir = stringSub(tostring(sDir),1,1), 0 + if (sDir == "+") then nDir = 1 + elseif(sDir == "-") then nDir = -1 + else return StatusLog(iPnextID,"IncDecPnextID: Direction <"..sDir.."> mismatch") end + iPnextID = RollValue(iPnextID + nDir,1,rPiece.Kept) + if(iPnextID == iPointID) then iPnextID = RollValue(iPnextID + nDir,1,rPiece.Kept) end + if(not IsExistent(LocatePOA(rPiece,iPnextID))) then + return StatusLog(1,"IncDecPointID["..sDir.."]: Offset PnextID #"..tostring(iPnextID).." not located") end + return iPnextID +end + +function PointOffsetUp(oEnt,ivPointID) + if(not (oEnt and oEnt:IsValid())) then + return StatusLog(nil,"PointOffsetUp: Entity Invalid") end + local sModel = oEnt:GetModel() + local iPointID = tonumber(ivPointID) + if(not IsExistent(iPointID)) then + return StatusLog(nil,"PointOffsetUp: PointID NAN {" + ..type(ivPointID).."}<"..tostring(ivPointID).."> for <"..sModel..">") end + local hdRec = CacheQueryPiece(sModel) + if(not IsExistent(hdRec)) then + return StatusLog(nil,"PointOffsetUp: Record not found for <"..sModel..">") end + local hdPnt = LocatePOA(hdRec,iPointID) + if(not IsExistent(hdPnt)) then + return StatusLog(nil,"PointOffsetUp: Point #"..tostring(iPointID) + .." not located on model <"..sModel..">") end + if(not (hdPnt.O and hdPnt.A)) then + return StatusLog(nil,"PointOffsetUp: Invalid POA #"..tostring(iPointID).." for <"..sModel..">") end + local aDiffBB = Angle() + local vDiffBB = oEnt:OBBMins() + SetAngle(aDiffBB,hdPnt.A) + aDiffBB:RotateAroundAxis(aDiffBB:Up(),180) + SubVector(vDiffBB,hdPnt.O) + DecomposeByAngle(vDiffBB,aDiffBB) + return mathAbs(vDiffBB[cvZ]) +end + +function ModelToName(sModel) + if(not IsString(sModel)) then + return StatusLog("","ModelToName: Argument {"..type(sModel).."}<"..tostring(sModel)..">") end + if(IsEmptyString(sModel)) then return StatusLog("","ModelToName: Empty string") end + local fCh, bCh, Cnt = "", "", 1 + local sSymDiv = GetOpVar("OPSYM_DIVIDER") + local sSymDir = GetOpVar("OPSYM_DIRECTORY") + local sModel = stringGsub(stringToFileName(sModel),GetOpVar("FILE_MODEL"),"") + local gModel = stringSub(sModel,1,-1) -- Create a copy so we can select cut-off parts later on + local tCut, tSub, tApp = SettingsModelToName("GET") + if(tCut and tCut[1]) then + while(tCut[Cnt] and tCut[Cnt+1]) do + fCh = tonumber(tCut[Cnt]) + bCh = tonumber(tCut[Cnt+1]) + if(not (IsExistent(fCh) and IsExistent(bCh))) then + return StatusLog("","ModelToName: Cannot cut the model in {" + ..tostring(tCut[Cnt])..","..tostring(tCut[Cnt+1]).."} for "..sModel) + end + LogInstance("ModelToName[CUT]: {"..tostring(tCut[Cnt])..", "..tostring(tCut[Cnt+1]).."} << "..gModel) + gModel = stringGsub(gModel,stringSub(sModel,fCh,bCh),"") + LogInstance("ModelToName[CUT]: {"..tostring(tCut[Cnt])..", "..tostring(tCut[Cnt+1]).."} >> "..gModel) + Cnt = Cnt + 2 + end + Cnt = 1 + end + -- Replace the unneeded parts by finding an in-string gModel + if(tSub and tSub[1]) then + while(tSub[Cnt]) do + fCh = tostring(tSub[Cnt] or "") + bCh = tostring(tSub[Cnt+1] or "") + LogInstance("ModelToName[SUB]: {"..tostring(tSub[Cnt])..", "..tostring(tSub[Cnt+1]).."} << "..gModel) + gModel = stringGsub(gModel,fCh,bCh) + LogInstance("ModelToName[SUB]: {"..tostring(tSub[Cnt])..", "..tostring(tSub[Cnt+1]).."} >> "..gModel) + Cnt = Cnt + 2 + end + Cnt = 1 + end + -- Append something if needed + if(tApp and tApp[1]) then + LogInstance("ModelToName[APP]: {"..tostring(tApp[Cnt])..", "..tostring(tApp[Cnt+1]).."} << "..gModel) + gModel = tostring(tApp[1] or "")..gModel..tostring(tApp[2] or "") + LogInstance("ModelToName[APP]: {"..tostring(tSub[Cnt])..", "..tostring(tSub[Cnt+1]).."} >> "..gModel) + end + -- Trigger the capital-space using the divider + if(stringSub(gModel,1,1) ~= sSymDiv) then gModel = sSymDiv..gModel end + -- Here in gModel we have: _aaaaa_bbbb_ccccc + fCh, bCh, sModel = stringFind(gModel,sSymDiv,1), 1, "" + while(fCh) do + if(fCh > bCh) then + sModel = sModel..stringSub(gModel,bCh+2,fCh-1) + end + if(not IsEmptyString(sModel)) then + sModel = sModel.." " + end + sModel = sModel..stringUpper(stringSub(gModel,fCh+1,fCh+1)) + bCh = fCh + fCh = stringFind(gModel,sSymDiv,fCh+1) + end + return sModel..stringSub(gModel,bCh+2,-1) +end + +function LocatePOA(oRec, ivPointID) + if(not oRec) then + return StatusLog(nil,"LocatePOA: Missing record") end + if(not oRec.Offs) then + return StatusLog(nil,"LocatePOA: Missing offsets for <"..tostring(oRec.Slot)..">") end + local iPointID = mathFloor(tonumber(ivPointID) or 0) + local stPOA = oRec.Offs[iPointID] + if(not IsExistent(stPOA)) then + return StatusLog(nil,"LocatePOA: Missing ID #"..tostring(iPointID).." <" + ..tostring(ivPointID).."> for <"..tostring(oRec.Slot)..">") end + return stPOA +end + +local function ReloadPOA(nXP,nYY,nZR,nSX,nSY,nSZ,nSD) + local arPOA = GetOpVar("ARRAY_DECODEPOA") + arPOA[1] = tonumber(nXP) or 0 + arPOA[2] = tonumber(nYY) or 0 + arPOA[3] = tonumber(nZR) or 0 + arPOA[4] = tonumber(nSX) or 1 + arPOA[5] = tonumber(nSY) or 1 + arPOA[6] = tonumber(nSZ) or 1 + arPOA[7] = (tonumber(nSD) and (nSD ~= 0)) and true or false + return arPOA +end + +local function IsEqualPOA(staPOA,stbPOA) + if(not IsExistent(staPOA)) then + return StatusLog(false,"EqualPOA: Missing offset A") end + if(not IsExistent(stbPOA)) then + return StatusLog(false,"EqualPOA: Missing offset B") end + for kKey, vComp in pairs(staPOA) do + if(kKey ~= csD and stbPOA[kKey] ~= vComp) then return false end + end + return true +end + +local function IsZeroPOA(stPOA,sOffs) + if(not IsString(sOffs)) then + return StatusLog(nil,"IsZeroPOA: Mode {"..type(sOffs).."}<"..tostring(sOffs).."> not string") end + if(not IsExistent(stPOA)) then + return StatusLog(nil,"IsZeroPOA: Missing offset") end + local ctA, ctB, ctC + if (sOffs == "V") then ctA, ctB, ctC = cvX, cvY, cvZ + elseif(sOffs == "A") then ctA, ctB, ctC = caP, caY, caR + else return StatusLog(nil,"IsZeroPOA: Missed offset mode "..sOffs) end + if(stPOA[ctA] == 0 and stPOA[ctB] == 0 and stPOA[ctC] == 0) then return true end + return false +end + +local function StringPOA(stPOA,sOffs) + if(not IsString(sOffs)) then + return StatusLog(nil,"StringPOA: Mode {"..type(sOffs).."}<"..tostring(sOffs).."> not string") end + if(not IsExistent(stPOA)) then + return StatusLog(nil,"StringPOA: Missing Offsets") end + local symRevs = GetOpVar("OPSYM_REVSIGN") + local symDisa = GetOpVar("OPSYM_DISABLE") + local symSepa = GetOpVar("OPSYM_SEPARATOR") + local sModeDB = GetOpVar("MODE_DATABASE") + if (sOffs == "V") then ctA, ctB, ctC = cvX, cvY, cvZ + elseif(sOffs == "A") then ctA, ctB, ctC = caP, caY, caR + else return StatusLog(nil,"StringPOA: Missed offset mode "..sOffs) end + return stringGsub((stPOA[csD] and symDisa or "") -- Get rid of the spaces + ..((stPOA[csA] == -1) and symRevs or "")..tostring(stPOA[ctA])..symSepa + ..((stPOA[csB] == -1) and symRevs or "")..tostring(stPOA[ctB])..symSepa + ..((stPOA[csC] == -1) and symRevs or "")..tostring(stPOA[ctC])," ","") +end + +local function TransferPOA(stOffset,sMode) + if(not IsExistent(stOffset)) then + return StatusLog(nil,"TransferPOA: Destination needed") end + if(not IsString(sMode)) then + return StatusLog(nil,"TransferPOA: Mode {"..type(sMode).."}<"..tostring(sMode).."> not string") end + local arPOA = GetOpVar("ARRAY_DECODEPOA") + if (sMode == "V") then stOffset[cvX] = arPOA[1]; stOffset[cvY] = arPOA[2]; stOffset[cvZ] = arPOA[3] + elseif(sMode == "A") then stOffset[caP] = arPOA[1]; stOffset[caY] = arPOA[2]; stOffset[caR] = arPOA[3] + else return StatusLog(nil,"TransferPOA: Missed mode "..sMode) end + stOffset[csA] = arPOA[4]; stOffset[csB] = arPOA[5]; stOffset[csC] = arPOA[6]; stOffset[csD] = arPOA[7] + return arPOA +end + +local function DecodePOA(sStr) + if(not IsString(sStr)) then + return StatusLog(nil,"DecodePOA: Argument {"..type(sStr).."}<"..tostring(sStr).."> not string") end + local sCh = "" + local dInd, iSep = 1, 0 + local S, E, iCnt = 1, 1, 1 + local strLen = stringLen(sStr) + local symOff = GetOpVar("OPSYM_DISABLE") + local symRev = GetOpVar("OPSYM_REVSIGN") + local symSep = GetOpVar("OPSYM_SEPARATOR") + local arPOA = GetOpVar("ARRAY_DECODEPOA") + ReloadPOA() + if(stringSub(sStr,iCnt,iCnt) == symOff) then + arPOA[7] = true; iCnt = iCnt + 1; S = S + 1 end + while(iCnt <= strLen) do + sCh = stringSub(sStr,iCnt,iCnt) + if(sCh == symRev) then + arPOA[3+dInd] = -arPOA[3+dInd]; S = S + 1 + elseif(sCh == symSep) then + iSep = iSep + 1; E = iCnt - 1 + if(iSep > 2) then break end + arPOA[dInd] = tonumber(stringSub(sStr,S,E)) or 0 + dInd = dInd + 1; S = iCnt + 1; E = S + else E = E + 1 end + iCnt = iCnt + 1 + end + arPOA[dInd] = tonumber(stringSub(sStr,S,E)) or 0 + return arPOA +end + +local function RegisterPOA(stPiece, ivID, sP, sO, sA) + if(not stPiece) then + return StatusLog(nil,"RegisterPOA: Cache record invalid") end + local iID = tonumber(ivID) + if(not IsExistent(iID)) then + return StatusLog(nil,"RegisterPOA: OffsetID NAN {"..type(ivID).."}<"..tostring(ivID)..">") end + local sP = sP or "NULL" + local sO = sO or "NULL" + local sA = sA or "NULL" + if(not IsString(sP)) then + return StatusLog(nil,"RegisterPOA: Point {"..type(sP).."}<"..tostring(sP)..">") end + if(not IsString(sO)) then + return StatusLog(nil,"RegisterPOA: Origin {"..type(sO).."}<"..tostring(sO)..">") end + if(not IsString(sA)) then + return StatusLog(nil,"RegisterPOA: Angle {"..type(sA).."}<"..tostring(sA)..">") end + if(not stPiece.Offs) then + if(iID > 1) then return StatusLog(nil,"RegisterPOA: First ID cannot be #"..tostring(iID)) end + stPiece.Offs = {} + end + local tOffs = stPiece.Offs + if(tOffs[iID]) then + return StatusLog(nil,"RegisterPOA: Exists ID #"..tostring(iID)) + else + if((iID > 1) and (not tOffs[iID - 1])) then + return StatusLog(nil,"RegisterPOA: No sequential ID #"..tostring(iID - 1)) + end + tOffs[iID] = {} + tOffs[iID].P = {} + tOffs[iID].O = {} + tOffs[iID].A = {} + tOffs = tOffs[iID] + end + ---------------- Origin ---------------- + if((sO ~= "NULL") and not IsEmptyString(sO)) then DecodePOA(sO) else ReloadPOA() end + if(not IsExistent(TransferPOA(tOffs.O,"V"))) then + return StatusLog(nil,"RegisterPOA: Cannot transfer origin") end + ---------------- Point ---------------- + local sD = stringGsub(sP,GetOpVar("OPSYM_DISABLE"),"") + if((sP ~= "NULL") and not IsEmptyString(sP)) then DecodePOA(sP) else ReloadPOA() end + if(not IsExistent(TransferPOA(tOffs.P,"V"))) then + return StatusLog(nil,"RegisterPOA: Cannot transfer point") end + if((sD == "NULL") or IsEmptyString(sD)) then -- If empty use origin + tOffs.P[cvX] = tOffs.O[cvX]; tOffs.P[cvY] = tOffs.O[cvY]; tOffs.P[cvZ] = tOffs.O[cvZ]; + tOffs.P[csA] = tOffs.O[csA]; tOffs.P[csB] = tOffs.O[csB]; tOffs.P[csC] = tOffs.O[csC]; + end + ---------------- Angle ---------------- + if((sA ~= "NULL") and not IsEmptyString(sA)) then DecodePOA(sA) else ReloadPOA() end + if(not IsExistent(TransferPOA(tOffs.A,"A"))) then + return StatusLog(nil,"RegisterPOA: Cannot transfer angle") end + return tOffs +end + +local function Sort(tTable,tKeys,tFields) + + local function QuickSort(Data,Lo,Hi) + if(not (Lo and Hi and (Lo > 0) and (Lo < Hi))) then + return StatusLog(nil,"QuickSort: Data dimensions mismatch") end + local iMid = mathRandom(Hi-(Lo-1))+Lo-1 + Data[Lo], Data[iMid] = Data[iMid], Data[Lo] + iMid = Lo + local vMid = Data[Lo].Val + local iCnt = Lo + 1 + while(iCnt <= Hi)do + if(Data[iCnt].Val < vMid) then + iMid = iMid + 1 + Data[iMid], Data[iCnt] = Data[iCnt], Data[iMid] + end + iCnt = iCnt + 1 + end + Data[Lo], Data[iMid] = Data[iMid], Data[Lo] + QuickSort(Data,Lo,iMid-1) + QuickSort(Data,iMid+1,Hi) + end + + local Match = {} + local tKeys = tKeys or {} + local tFields = tFields or {} + local iCnt, iInd, sKey, vRec, sFld = 1, nil, nil, nil, nil + if(not tKeys[1]) then + for k,v in pairs(tTable) do + tKeys[iCnt] = k; iCnt = iCnt + 1 + end; iCnt = 1 + end + while(tKeys[iCnt]) do + sKey = tKeys[iCnt]; vRec = tTable[sKey] + if(not vRec) then + return StatusLog(nil,"Sort: Key <"..sKey.."> does not exist in the primary table") end + Match[iCnt] = {} + Match[iCnt].Key = sKey + if(type(vRec) == "table") then + Match[iCnt].Val, iInd = "", 1 + while(tFields[iInd]) do + sFld = tFields[iInd] + if(not IsExistent(vRec[sFld])) then + return StatusLog(nil,"Sort: Field <"..sFld.."> not found on the current record") end + Match[iCnt].Val = Match[iCnt].Val..tostring(vRec[sFld]) + iInd = iInd + 1 + end + else Match[iCnt].Val = vRec end + iCnt = iCnt + 1 + end; QuickSort(Match,1,iCnt-1) + return Match +end + +--------------------- STRING ----------------------- + +function DisableString(sBase, anyDisable, anyDefault) + if(IsString(sBase)) then + local sFirst = stringSub(sBase,1,1) + if(sFirst ~= GetOpVar("OPSYM_DISABLE") and not IsEmptyString(sBase)) then + return sBase + elseif(sFirst == GetOpVar("OPSYM_DISABLE")) then + return anyDisable + end + end + return anyDefault +end + +function DefaultString(sBase, sDefault) + if(IsString(sBase)) then + if(not IsEmptyString(sBase)) then return sBase end + end + if(IsString(sDefault)) then return sDefault end + return "" +end + +------------- VARIABLE INTERFACES -------------- + +local function SQLBuildError(anyError) + if(not IsExistent(anyError)) then + return GetOpVar("SQL_BUILD_ERR") or "" end + SetOpVar("SQL_BUILD_ERR", tostring(anyError)) + return nil -- Nothing assembled +end + +function SettingsModelToName(sMode, gCut, gSub, gApp) + if(not IsString(sMode)) then + return StatusLog(false,"SettingsModelToName: Mode {"..type(sMode).."}<"..tostring(sMode).."> not string") end + if(sMode == "SET") then + if(gCut and gCut[1]) then SetOpVar("TABLE_GCUT_MODEL",gCut) else SetOpVar("TABLE_GCUT_MODEL",{}) end + if(gSub and gSub[1]) then SetOpVar("TABLE_GSUB_MODEL",gSub) else SetOpVar("TABLE_GSUB_MODEL",{}) end + if(gApp and gApp[1]) then SetOpVar("TABLE_GAPP_MODEL",gApp) else SetOpVar("TABLE_GAPP_MODEL",{}) end + elseif(sMode == "GET") then + return GetOpVar("TABLE_GCUT_MODEL"), GetOpVar("TABLE_GSUB_MODEL"), GetOpVar("TABLE_GAPP_MODEL") + elseif(sMode == "CLR") then + SetOpVar("TABLE_GCUT_MODEL",{}) + SetOpVar("TABLE_GSUB_MODEL",{}) + SetOpVar("TABLE_GAPP_MODEL",{}) + else + return StatusLog(false,"SettingsModelToName: Wrong mode name "..sMode) + end +end + +function DefaultType(anyType) + if(not IsExistent(anyType)) then + return GetOpVar("DEFAULT_TYPE") or "" end + SetOpVar("DEFAULT_TYPE",tostring(anyType)) + SettingsModelToName("CLR") +end + +function DefaultTable(anyTable) + if(not IsExistent(anyTable)) then + return GetOpVar("DEFAULT_TABLE") or "" end + SetOpVar("DEFAULT_TABLE",anyTable) + SettingsModelToName("CLR") +end + +------------------------- PLAYER ----------------------------------- + +function ConCommandPly(pPly,sCvar,snValue) + if(not pPly) then return StatusLog("","ConCommandPly: Player invalid") end + if(not IsString(sCvar)) then + return StatusLog("","ConCommandPly: Convar {"..type(sCvar).."}<"..tostring(sCvar).."> not string") end + return pPly:ConCommand(GetOpVar("TOOLNAME_PL")..sCvar.." "..tostring(snValue).."\n") +end + +function PrintNotifyPly(pPly,sText,sNotifType) + if(not pPly) then + return StatusLog(false,"PrintNotifyPly: Player invalid") end + if(SERVER) then + pPly:SendLua("GAMEMODE:AddNotify(\""..sText.."\", NOTIFY_"..sNotifType..", 6)") + pPly:SendLua("surface.PlaySound(\"ambient/water/drip"..mathRandom(1, 4)..".wav\")") + end + return StatusLog(true,"PrintNotifyPly: Success") +end + +function UndoCratePly(anyMessage) + SetOpVar("LABEL_UNDO",tostring(anyMessage)) + undoCreate(GetOpVar("LABEL_UNDO")) + return true +end + +function UndoAddEntityPly(oEnt) + if(not (oEnt and oEnt:IsValid())) then + return StatusLog(false,"UndoAddEntityPly: Entity invalid") end + undoAddEntity(oEnt) + return true +end + +function UndoFinishPly(pPly,anyMessage) + if(not pPly) then return StatusLog(false,"UndoFinishPly: Player invalid") end + pPly:EmitSound("physics/metal/metal_canister_impact_hard"..mathFloor(mathRandom(3))..".wav") + undoSetCustomUndoText(GetOpVar("LABEL_UNDO")..tostring(anyMessage or "")) + undoSetPlayer(pPly) + undoFinish() + return true +end + +function LoadKeyPly(pPly, sKey) + local keyPly = GetOpVar("HASH_PLAYER_KEYDOWN") + local plyCache = libCache[keyPly] + if(not IsExistent(plyCache)) then + libCache[keyPly] = {} + plyCache = libCache[keyPly] + end + if(not pPly) then + return StatusLog(false,"LoadKeyPly: Player not available") end + local spName = pPly:GetName() + local plyPlace = plyCache[spName] + if(not IsExistent(plyPlace)) then + plyCache[spName] = { + ["ALTLFT"] = false, + ["ALTRGH"] = false, + ["ATTLFT"] = false, + ["ATTRGH"] = false, + ["FORWARD"] = false, + ["BACK"] = false, + ["MOVELFT"] = false, + ["MOVERGH"] = false, + ["RELOAD"] = false, + ["USE"] = false, + ["DUCK"] = false, + ["JUMP"] = false, + ["SPEED"] = false, + ["SCORE"] = false, + ["ZOOM"] = false, + ["LEFT"] = false, + ["RIGHT"] = false, + ["WALK"] = false + } + plyPlace = plyCache[spName] + end + if(IsExistent(sKey)) then + if(not IsString(sKey)) then + return StatusLog(false,"LoadKeyPly: Key hash {"..type(sKey).."}<"..tostring(sKey).."> not string") end + if(sKey == "DEBUG") then + return plyPlace + end + LogInstance("LoadKeyPly: NamePK <"..sKey.."> = "..tostring(plyPlace[sKey])) + return plyPlace[sKey] + end + plyPlace["ALTLFT"] = pPly:KeyDown(IN_ALT1 ) + plyPlace["ALTRGH"] = pPly:KeyDown(IN_ALT2 ) + plyPlace["ATTLFT"] = pPly:KeyDown(IN_ATTACK ) + plyPlace["ATTRGH"] = pPly:KeyDown(IN_ATTACK2 ) + plyPlace["FORWARD"] = pPly:KeyDown(IN_FORWARD ) + plyPlace["BACK"] = pPly:KeyDown(IN_BACK ) + plyPlace["MOVELFT"] = pPly:KeyDown(IN_MOVELEFT ) + plyPlace["MOVERGH"] = pPly:KeyDown(IN_MOVERIGHT ) + plyPlace["RELOAD"] = pPly:KeyDown(IN_RELOAD ) + plyPlace["USE"] = pPly:KeyDown(IN_USE ) + plyPlace["DUCK"] = pPly:KeyDown(IN_DUCK ) + plyPlace["JUMP"] = pPly:KeyDown(IN_JUMP ) + plyPlace["SPEED"] = pPly:KeyDown(IN_SPEED ) + plyPlace["SCORE"] = pPly:KeyDown(IN_SCORE ) + plyPlace["ZOOM"] = pPly:KeyDown(IN_ZOOM ) + plyPlace["LEFT"] = pPly:KeyDown(IN_LEFT ) + plyPlace["RIGHT"] = pPly:KeyDown(IN_RIGHT ) + plyPlace["WALK"] = pPly:KeyDown(IN_WALK ) + return StatusLog(true,"LoadKeyPly: Player <"..spName.."> keys loaded") +end + +-------------------------- BUILDSQL ------------------------------ + +local function MatchType(defTable,snValue,ivIndex,bQuoted,sQuote,bStopRevise,bStopEmpty) + if(not defTable) then + return StatusLog(nil,"MatchType: Missing table definition") end + local nIndex = tonumber(ivIndex) + if(not IsExistent(nIndex)) then + return StatusLog(nil,"MatchType: Field NAN {"..type(ivIndex)"}<" + ..tostring(ivIndex).."> invalid on table "..defTable.Name) end + local defField = defTable[nIndex] + if(not IsExistent(defField)) then + return StatusLog(nil,"MatchType: Invalid field #" + ..tostring(nIndex).." on table "..defTable.Name) end + local snOut + local tipField = tostring(defField[2]) + local sModeDB = GetOpVar("MODE_DATABASE") + if(tipField == "TEXT") then + snOut = tostring(snValue) + if(not bStopEmpty and (snOut == "nil" or IsEmptyString(snOut))) then + if (sModeDB == "SQL") then snOut = "NULL" + elseif(sModeDB == "LUA") then snOut = "NULL" + else return StatusLog(nil,"MatchType: Wrong database mode <"..sModeDB..">") end + end + if (defField[3] == "LOW") then snOut = stringLower(snOut) + elseif(defField[3] == "CAP") then snOut = stringUpper(snOut) end + if(not bStopRevise and sModeDB == "SQL" and defField[4] == "QMK") then + snOut = stringGsub(snOut,"'","''") + end + if(bQuoted) then + local sqChar + if(sQuote) then + sqChar = stringSub(tostring(sQuote),1,1) + else + if (sModeDB == "SQL") then sqChar = "'" + elseif(sModeDB == "LUA") then sqChar = "\"" end + end + snOut = sqChar..snOut..sqChar + end + elseif(tipField == "REAL" or tipField == "INTEGER") then + snOut = tonumber(snValue) + if(not IsExistent(snOut)) then + return StatusLog(nil,"MatchType: Failed converting {" + ..type(snValue).."}<"..tostring(snValue).."> to NUMBER for table " + ..defTable.Name.." field #"..nIndex) end + if(tipField == "INTEGER") then + if(defField[3] == "FLR") then + snOut = mathFloor(snOut) + elseif(defField[3] == "CEL") then + snOut = mathCeil(snOut) + end + end + else + return StatusLog(nil,"MatchType: Invalid field type <" + ..tipField.."> on table "..defTable.Name) end + return snOut +end + +local function SQLBuildCreate(defTable) + if(not defTable) then + return SQLBuildError("SQLBuildCreate: Missing table definition") end + local indTable = defTable.Index + if(not defTable[1]) then + return SQLBuildError("SQLBuildCreate: Missing table definition is empty for "..defTable.Name) end + if(not (defTable[1][1] and defTable[1][2])) then + return SQLBuildError("SQLBuildCreate: Missing table "..defTable.Name.." field definitions") end + local Command, iInd = {}, 1 + Command.Drop = "DROP TABLE "..defTable.Name..";" + Command.Delete = "DELETE FROM "..defTable.Name..";" + Command.Create = "CREATE TABLE "..defTable.Name.." ( " + while(defTable[iInd]) do + local v = defTable[iInd] + if(not v[1]) then + return SQLBuildError("SQLBuildCreate: Missing Table "..defTable.Name + .."'s field #"..tostring(iInd)) end + if(not v[2]) then + return SQLBuildError("SQLBuildCreate: Missing Table "..defTable.Name + .."'s field type #"..tostring(iInd)) end + Command.Create = Command.Create..stringUpper(v[1]).." "..stringUpper(v[2]) + if(defTable[iInd+1]) then Command.Create = Command.Create ..", " end + iInd = iInd + 1 + end + Command.Create = Command.Create.." );" + if(indTable and + indTable[1] and + type(indTable[1]) == "table" and + indTable[1][1] and + type(indTable[1][1]) == "number" + ) then + Command.Index = {} + iInd, iCnt = 1, 1 + while(indTable[iInd]) do + local vI = indTable[iInd] + if(type(vI) ~= "table") then + return SQLBuildError("SQLBuildCreate: Index creator mismatch on " + ..defTable.Name.." value "..vI.." is not a table for index ["..tostring(iInd).."]") end + local FieldsU = "" + local FieldsC = "" + Command.Index[iInd] = "CREATE INDEX IND_"..defTable.Name + iCnt = 1 + while(vI[iCnt]) do + local vF = vI[iCnt] + if(type(vF) ~= "number") then + return SQLBuildError("SQLBuildCreate: Index creator mismatch on " + ..defTable.Name.." value "..vF.." is not a number for index [" + ..tostring(iInd).."]["..tostring(iCnt).."]") end + if(not defTable[vF]) then + return SQLBuildError("SQLBuildCreate: Index creator mismatch on " + ..defTable.Name..". The table does not have field index #" + ..vF..", max is #"..Table.Size) end + FieldsU = FieldsU.."_" ..stringUpper(defTable[vF][1]) + FieldsC = FieldsC..stringUpper(defTable[vF][1]) + if(vI[iCnt+1]) then FieldsC = FieldsC ..", " end + iCnt = iCnt + 1 + end + Command.Index[iInd] = Command.Index[iInd]..FieldsU.." ON "..defTable.Name.." ( "..FieldsC.." );" + iInd = iInd + 1 + end + end + SQLBuildError("") + return Command +end + +local function SQLStoreQuery(defTable,tFields,tWhere,tOrderBy,sQuery) + if(not GetOpVar("EN_QUERY_STORE")) then return sQuery end + local Val, Base + if(not defTable) then + return StatusLog(nil,"SQLStoreQuery: Missing table definition") end + local tTimer = defTable.Timer + if(not (tTimer and ((tonumber(tTimer[2]) or 0) > 0))) then + return StatusLog(sQuery,"SQLStoreQuery: Skipped. Cache persistent forever") end + local Field, Where, Order = 1, 1, 1 + local keyStr = GetOpVar("HASH_QUERY_STORE") + local tCache = libCache[keyStr] + if(not IsExistent(tCache)) then + libCache[keyStr] = {}; tCache = libCache[keyStr] end + local Place = tCache[defTable.Name] + if(not IsExistent(Place)) then + tCache[defTable.Name] = {}; Place = tCache[defTable.Name] end + if(tFields) then + while(tFields[Field]) do + Val = defTable[tFields[Field]][1] + if(not IsExistent(Val)) then + return StatusLog(nil,"SQLStoreQuery: Missing field key for #"..tostring(Field)) end + if(Place[Val]) then + Place = Place[Val] + elseif(sQuery) then + Base = Place + Place[Val] = {} + Place = Place[Val] + else + return nil + end + if(not Place) then return nil end + Field = Field + 1 + end + else + Val = "ALL_FIELDS" + if(Place[Val]) then + Place = Place[Val] + elseif(sQuery) then + Base = Place + Place[Val] = {} + Place = Place[Val] + else + return nil + end + end + if(tOrderBy) then + while(tOrderBy[Order]) do + Val = tOrderBy[Order] + if(Place[Val]) then + Base = Place + Place = Place[Val] + elseif(sQuery) then + Base = Place + Place[Val] = {} + Place = Place[Val] + else return StatusLog(nil,"SQLStoreQuery: Missing order field key for #"..tostring(Order)) end + Order = Order + 1 + end + end + if(tWhere) then + while(tWhere[Where]) do + Val = defTable[tWhere[Where][1]][1] + if(not IsExistent(Val)) then + return StatusLog(nil,"SQLStoreQuery: Missing where field key for #"..tostring(Where)) end + if(Place[Val]) then + Base = Place + Place = Place[Val] + elseif(sQuery) then + Base = Place + Place[Val] = {} + Place = Place[Val] + else + return nil + end + Val = tWhere[Where][2] + if(not IsExistent(Val)) then + return StatusLog(nil,"SQLStoreQuery: Missing where value key for #"..tostring(Where)) end + if(Place[Val]) then + Base = Place + Place = Place[Val] + elseif(sQuery) then + Base = Place + Place[Val] = {} + Place = Place[Val] + end + Where = Where + 1 + end + end + if(sQuery) then Base[Val] = sQuery end + return Base[Val] +end + +local function SQLBuildSelect(defTable,tFields,tWhere,tOrderBy) + if(not defTable) then + return SQLBuildError("SQLBuildSelect: Missing table definition") end + if(not (defTable[1][1] and defTable[1][2])) then + return SQLBuildError("SQLBuildSelect: Missing table "..defTable.Name.." field definitions") end + local Command = SQLStoreQuery(defTable,tFields,tWhere,tOrderBy) + if(IsString(Command)) then + SQLBuildError("") + return Command + else Command = "SELECT " end + local Cnt = 1 + if(tFields) then + while(tFields[Cnt]) do + local v = tonumber(tFields[Cnt]) + if(not IsExistent(v)) then + return SQLBuildError("SQLBuildSelect: Select index NAN {" + ..type(tFields[Cnt]).."}<"..tostring(tFields[Cnt]) + .."> type mismatch in "..defTable.Name) end + if(defTable[v]) then + if(defTable[v][1]) then + Command = Command..defTable[v][1] + else + return SQLBuildError("SQLBuildSelect: Select no such field name by index #" + ..v.." in the table "..defTable.Name) end + end + if(tFields[Cnt+1]) then + Command = Command ..", " + end + Cnt = Cnt + 1 + end + else + Command = Command.."*" + end + Command = Command .." FROM "..defTable.Name + if(tWhere and + type(tWhere == "table") and + type(tWhere[1]) == "table" and + tWhere[1][1] and + tWhere[1][2] and + type(tWhere[1][1]) == "number" and + (type(tWhere[1][2]) == "string" or type(tWhere[1][2]) == "number") + ) then + Cnt = 1 + while(tWhere[Cnt]) do + k = tonumber(tWhere[Cnt][1]) + v = tWhere[Cnt][2] + t = defTable[k][2] + if(not (k and v and t) ) then + return SQLBuildError("SQLBuildSelect: Where clause inconsistent on " + ..defTable.Name.." field index, {"..tostring(k)..","..tostring(v)..","..tostring(t) + .."} value or type in the table definition") end + v = MatchType(defTable,v,k,true) + if(not IsExistent(v)) then + return SQLBuildError("SQLBuildSelect: Data matching failed on " + ..defTable.Name.." field index #"..Cnt.." value <"..tostring(v)..">") end + if(Cnt == 1) then + Command = Command.." WHERE "..defTable[k][1].." = "..v + else + Command = Command.." AND "..defTable[k][1].." = "..v + end + Cnt = Cnt + 1 + end + end + if(tOrderBy and (type(tOrderBy) == "table")) then + local Dire = "" + Command = Command.." ORDER BY " + Cnt = 1 + while(tOrderBy[Cnt]) do + local v = tOrderBy[Cnt] + if(v ~= 0) then + if(v > 0) then + Dire = " ASC" + else + Dire = " DESC" + v = -v + end + else + return SQLBuildError("SQLBuildSelect: Order wrong for " + ..defTable.Name .." field index #"..Cnt) end + Command = Command..defTable[v][1]..Dire + if(tOrderBy[Cnt+1]) then + Command = Command..", " + end + Cnt = Cnt + 1 + end + end + SQLBuildError("") + return SQLStoreQuery(defTable,tFields,tWhere,tOrderBy,Command..";") +end + +local function SQLBuildInsert(defTable,tInsert,tValues) + if(not defTable) then + return SQLBuildError("SQLBuildInsert: Missing Table definition") end + if(not tValues) then + return SQLBuildError("SQLBuildInsert: Missing Table value fields") end + if(not defTable[1]) then + return SQLBuildError("SQLBuildInsert: The table and the chosen fields must not be empty") end + if(not (defTable[1][1] and defTable[1][2])) then + return SQLBuildError("SQLBuildInsert: Missing table "..defTable.Name.." field definition") end + local tInsert = tInsert or {} + if(not tInsert[1]) then + local iCnt = 1 + while(defTable[iCnt]) do + tInsert[iCnt] = iCnt + iCnt = iCnt + 1 + end + end + local iCnt = 1 + local qVal = " VALUES ( " + local qIns = "INSERT INTO "..defTable.Name.." ( " + local Val, iInd, dFld + while(tInsert[iCnt]) do + iInd = tInsert[iCnt] + dFld = defTable[iInd] + if(not IsExistent(dFld)) then + return SQLBuildError("SQLBuildInsert: No such field #"..iInd.." on table "..defTable.Name) + end + Val = MatchType(defTable,tValues[iCnt],iInd,true) + if(not IsExistent(Val)) then + return SQLBuildError("SQLBuildInsert: Cannot match value <"..tostring(tValues[iCnt]).."> #"..iInd.." on table "..defTable.Name) + end + qIns = qIns..dFld[1] + qVal = qVal..Val + if(tInsert[iCnt+1]) then + qIns = qIns ..", " + qVal = qVal ..", " + else + qIns = qIns .." ) " + qVal = qVal .." );" + end + iCnt = iCnt + 1 + end + SQLBuildError("") + return qIns..qVal +end + +function CreateTable(sTable,defTable,bDelete,bReload) + if(not IsString(sTable)) then + return StatusLog(false,"CreateTable: Table key {"..type(sTable).."}<"..tostring(sTable).."> not string") end + if(not (type(defTable) == "table")) then + return StatusLog(false,"CreateTable: Table definition missing for "..sTable) end + if(#defTable <= 0) then + return StatusLog(false,"CreateTable: Record definition missing for "..sTable) end + if(#defTable ~= tableMaxn(defTable)) then + return StatusLog(false,"CreateTable: Record definition mismatch for "..sTable) end + SetOpVar("DEFTABLE_"..sTable,defTable) + defTable.Size = #defTable + defTable.Name = GetOpVar("TOOLNAME_PU")..sTable + local sModeDB = GetOpVar("MODE_DATABASE") + local sTable = stringUpper(sTable) + local symDis = GetOpVar("OPSYM_DISABLE") + local iCnt, defField = 1, nil + while(defTable[iCnt]) do + defField = defTable[iCnt] + defField[3] = DefaultString(tostring(defField[3] or symDis), symDis) + defField[4] = DefaultString(tostring(defField[4] or symDis), symDis) + iCnt = iCnt + 1 + end + libCache[defTable.Name] = {} + if(sModeDB == "SQL") then + defTable.Life = tonumber(defTable.Life) or 0 + local tQ = SQLBuildCreate(defTable) + if(not IsExistent(tQ)) then return StatusLog(false,"CreateTable: "..SQLBuildError()) end + if(bDelete and sqlTableExists(defTable.Name)) then + local qRez = sqlQuery(tQ.Delete) + if(not qRez and IsBool(qRez)) then + LogInstance("CreateTable: Table "..sTable.." is not present. Skipping delete !") + else + LogInstance("CreateTable: Table "..sTable.." deleted !") + end + end + if(bReload) then + local qRez = sqlQuery(tQ.Drop) + if(not qRez and IsBool(qRez)) then + LogInstance("CreateTable: Table "..sTable.." is not present. Skipping drop !") + else + LogInstance("CreateTable: Table "..sTable.." dropped !") + end + end + if(sqlTableExists(defTable.Name)) then + LogInstance("CreateTable: Table "..sTable.." exists!") + return true + else + local qRez = sqlQuery(tQ.Create) + if(not qRez and IsBool(qRez)) then + return StatusLog(false,"CreateTable: Table "..sTable + .." failed to create because of "..sqlLastError()) end + if(sqlTableExists(defTable.Name)) then + for k, v in pairs(tQ.Index) do + qRez = sqlQuery(v) + if(not qRez and IsBool(qRez)) then + return StatusLog(false,"CreateTable: Table "..sTable.. + " failed to create index ["..k.."] > "..v .." > because of "..sqlLastError()) end + end return StatusLog(true,"CreateTable: Indexed Table "..sTable.." created !") + else + return StatusLog(false,"CreateTable: Table "..sTable.. + " failed to create because of "..sqlLastError().." Query ran > "..tQ.Create) end + end + elseif(sModeDB == "LUA") then sModeDB = "LUA" else -- Just to do something here. + return StatusLog(false,"CreateTable: Wrong database mode <"..sModeDB..">") + end +end + +function InsertRecord(sTable,tData) + if(not IsExistent(sTable)) then + return StatusLog(false,"InsertRecord: Missing table name/values") + end + if(type(sTable) == "table") then + tData = sTable + sTable = DefaultTable() + if(not (IsExistent(sTable) and sTable ~= "")) then + return StatusLog(false,"InsertRecord: Missing table default name for "..sTable) end + end + if(not IsString(sTable)) then + return StatusLog(false,"InsertRecord: Table name {"..type(sTable).."}<"..tostring(sTable).."> not string") end + local defTable = GetOpVar("DEFTABLE_"..sTable) + if(not defTable) then + return StatusLog(false,"InsertRecord: Missing table definition for "..sTable) end + if(not defTable[1]) then + return StatusLog(false,"InsertRecord: Missing table definition is empty for "..sTable) end + if(not tData) then + return StatusLog(false,"InsertRecord: Missing data table for "..sTable) end + if(not tData[1]) then + return StatusLog(false,"InsertRecord: Missing data table is empty for "..sTable) end + + if(sTable == "PIECES") then + tData[2] = DisableString(tData[2],DefaultType(),"TYPE") + tData[3] = DisableString(tData[3],ModelToName(tData[1]),"MODEL") + elseif(sTable == "PHYSPROPERTIES") then + tData[1] = DisableString(tData[1],DefaultType(),"TYPE") + end + + local sModeDB = GetOpVar("MODE_DATABASE") + if(sModeDB == "SQL") then + local Q = SQLBuildInsert(defTable,nil,tData) + if(not IsExistent(Q)) then return StatusLog(false,"InsertRecord: Build error <"..SQLBuildError()..">") end + local qRez = sqlQuery(Q) + if(not qRez and IsBool(qRez)) then + return StatusLog(false,"InsertRecord: Failed to insert a record because of <" + ..sqlLastError().."> Query ran <"..Q..">") end + return true + elseif(sModeDB == "LUA") then + local snPrimaryKey = MatchType(defTable,tData[1],1) + if(not IsExistent(snPrimaryKey)) then -- If primary key becomes a number + return StatusLog(nil,"InsertRecord: Cannot match primary key " + ..sTable.." <"..tostring(tData[1]).."> to " + ..defTable[1][1].." for "..tostring(snPrimaryKey)) end + local tCache = libCache[defTable.Name] + if(not IsExistent(tCache)) then + return StatusLog(false,"InsertRecord: Cache not allocated for "..defTable.Name) end + if(sTable == "PIECES") then + local tLine = tCache[snPrimaryKey] + if(not tLine) then + tCache[snPrimaryKey] = {}; tLine = tCache[snPrimaryKey] end + if(not IsExistent(tLine.Type)) then tLine.Type = tData[2] end + if(not IsExistent(tLine.Name)) then tLine.Name = tData[3] end + if(not IsExistent(tLine.Kept)) then tLine.Kept = 0 end + if(not IsExistent(tLine.Slot)) then tLine.Slot = snPrimaryKey end + local nOffsID = MatchType(defTable,tData[4],4) -- LineID has to be set properly + if(not IsExistent(nOffsID)) then + return StatusLog(nil,"InsertRecord: Cannot match " + ..sTable.." <"..tostring(tData[4]).."> to " + ..defTable[4][1].." for "..tostring(snPrimaryKey)) + end + local stRezul = RegisterPOA(tLine,nOffsID,tData[5],tData[6],tData[7]) + if(not IsExistent(stRezul)) then + return StatusLog(nil,"InsertRecord: Cannot process offset #"..tostring(nOffsID).." for "..tostring(snPrimaryKey)) end + if(nOffsID > tLine.Kept) then tLine.Kept = nOffsID else + return StatusLog(nil,"InsertRecord: Offset #"..tostring(nOffsID).." sequentiality mismatch") end + elseif(sTable == "ADDITIONS") then + local tLine = tCache[snPrimaryKey] + if(not tLine) then + tCache[snPrimaryKey] = {}; tLine = tCache[snPrimaryKey] end + if(not IsExistent(tLine.Kept)) then tLine.Kept = 0 end + if(not IsExistent(tLine.Slot)) then tLine.Slot = snPrimaryKey end + local nCnt, sFld, nAddID = 2, "", MatchType(defTable,tData[4],4) + if(not IsExistent(nAddID)) then -- LineID has to be set properly + return StatusLog(nil,"InsertRecord: Cannot match " + ..sTable.." <"..tostring(tData[4]).."> to " + ..defTable[4][1].." for "..tostring(snPrimaryKey)) end + tLine[nAddID] = {} + while(nCnt <= defTable.Size) do + sFld = defTable[nCnt][1] + tLine[nAddID][sFld] = MatchType(defTable,tData[nCnt],nCnt) + if(not IsExistent(tLine[nAddID][sFld])) then -- ADDITIONS is full of numbers + return StatusLog(nil,"InsertRecord: Cannot match " + ..sTable.." <"..tostring(tData[nCnt]).."> to " + ..defTable[nCnt][1].." for "..tostring(snPrimaryKey)) end + nCnt = nCnt + 1 + end + tLine.Kept = nAddID + elseif(sTable == "PHYSPROPERTIES") then + local sKeyName = GetOpVar("HASH_PROPERTY_NAMES") + local sKeyType = GetOpVar("HASH_PROPERTY_TYPES") + local tTypes = tCache[sKeyType] + local tNames = tCache[sKeyName] + -- Handle the Type + if(not tTypes) then + tCache[sKeyType] = {} + tTypes = tCache[sKeyType] + tTypes.Kept = 0 + end + if(not tNames) then + tCache[sKeyName] = {} + tNames = tCache[sKeyName] + end + local iNameID = MatchType(defTable,tData[2],2) + if(not IsExistent(iNameID)) then -- LineID has to be set properly + return StatusLog(nil,"InsertRecord: Cannot match " + ..sTable.." <"..tostring(tData[2]).."> to " + ..defTable[2][1].." for "..tostring(snPrimaryKey)) end + if(not IsExistent(tNames[snPrimaryKey])) then + -- If a new type is inserted + tTypes.Kept = tTypes.Kept + 1 + tTypes[tTypes.Kept] = snPrimaryKey + tNames[snPrimaryKey] = {} + tNames[snPrimaryKey].Kept = 0 + tNames[snPrimaryKey].Slot = snPrimaryKey + end -- MatchType crashes only on numbers + tNames[snPrimaryKey].Kept = iNameID + tNames[snPrimaryKey][iNameID] = MatchType(defTable,tData[3],3) + else + return StatusLog(false,"InsertRecord: No settings for table "..sTable) + end + end +end + +--------------- TIMER MEMORY MANAGMENT ---------------------------- + +local function NavigateTable(oLocation,tKeys) + if(not IsExistent(oLocation)) then + return StatusLog(nil,"NavigateTable: Location missing") end + if(not IsExistent(tKeys)) then + return StatusLog(nil,"NavigateTable: Key table missing") end + if(not IsExistent(tKeys[1])) then + return StatusLog(nil,"NavigateTable: First key missing") end + local oPlace, kKey, iCnt = oLocation, tKeys[1], 1 + while(tKeys[iCnt]) do + kKey = tKeys[iCnt] + if(tKeys[iCnt+1]) then + oPlace = oPlace[kKey] + if(not IsExistent(oPlace)) then + return StatusLog(nil,"NavigateTable: Key #"..tostring(kKey).." irrelevant to location") end + end + iCnt = iCnt + 1 + end + return oPlace, kKey +end + +function TimerSetting(sTimerSet) -- Generates a timer settings table and keeps the defaults + if(not IsExistent(sTimerSet)) then + return StatusLog(nil,"TimerSetting: Timer set missing for setup") end + if(not IsString(sTimerSet)) then + return StatusLog(nil,"TimerSetting: Timer set {"..type(sTimerSet).."}<"..tostring(sTimerSet).."> not string") end + local tBoom = stringExplode(GetOpVar("OPSYM_REVSIGN"),sTimerSet) + tBoom[1] = tostring(tBoom[1] or "CQT") + tBoom[2] = (tonumber(tBoom[2]) or 0) + tBoom[3] = ((tonumber(tBoom[3]) or 0) ~= 0) and true or false + tBoom[4] = ((tonumber(tBoom[4]) or 0) ~= 0) and true or false + return tBoom +end + +local function TimerAttach(oLocation,tKeys,defTable,anyMessage) + if(not defTable) then + return StatusLog(nil,"TimerAttach: Missing table definition") end + local Place, Key = NavigateTable(oLocation,tKeys) + if(not (IsExistent(Place) and IsExistent(Key))) then + return StatusLog(nil,"TimerAttach: Navigation failed") end + if(not IsExistent(Place[Key])) then + return StatusLog(nil,"TimerAttach: Data not found") end + local sModeDB = GetOpVar("MODE_DATABASE") + LogInstance("TimerAttach: Called by <"..tostring(anyMessage).."> for Place["..tostring(Key).."]") + if(sModeDB == "SQL") then + -- Get the proper line count to avoid doing in every caching function" + if(IsExistent(Place[Key].Kept)) then Place[Key].Kept = Place[Key].Kept - 1 end + local nNowTM, tTimer = Time(), defTable.Timer -- See that there is a timer and get "now" + if(not IsExistent(tTimer)) then + return StatusLog(Place[Key],"TimerAttach: Missing timer settings") end + Place[Key].Used = nNowTM -- Make the first selected deletable to avoid phantom records + local nLifeTM = tTimer[2] + if(nLifeTM <= 0) then + return StatusLog(Place[Key],"TimerAttach: Timer attachment ignored") end + local sModeTM, bKillRC, bCollGB = tTimer[1], tTimer[3], tTimer[4] + LogInstance("TimerAttach: ["..sModeTM.."] ("..tostring(nLifeTM)..") "..tostring(bKillRC)..", "..tostring(bCollGB)) + if(sModeTM == "CQT") then + Place[Key].Load = nNowTM + for k, v in pairs(Place) do + if(IsExistent(v.Load) and IsExistent(v.Used) and ((nNowTM - v.Used) > nLifeTM)) then + LogInstance("TimerAttach: ("..tostring(RoundValue(nNowTM - v.Used,0.01)).." > "..tostring(nLifeTM)..") > Dead") + if(bKillRC) then + LogInstance("TimerAttach: Killed <"..tostring(k)..">") + Place[k] = nil + end + end + end + if(bCollGB) then + collectgarbage() + LogInstance("TimerAttach: Garbage collected") + end + return StatusLog(Place[Key],"TimerAttach: Place["..tostring(Key).."].Load = "..tostring(RoundValue(nNowTM,0.01))) + elseif(sModeTM == "OBJ") then + local TimerID = stringImplode(GetOpVar("OPSYM_DIVIDER"),tKeys) + LogInstance("TimerAttach: TimID <"..TimerID..">") + if(timerExists(TimerID)) then return StatusLog(Place[Key],"TimerAttach: Timer exists") end + timerCreate(TimerID, nLifeTM, 1, function() + LogInstance("TimerAttach["..TimerID.."]("..nLifeTM..") > Dead") + if(bKillRC) then + LogInstance("TimerAttach: Killed <"..Key..">") + Place[Key] = nil + end + timerStop(TimerID) + timerDestroy(TimerID) + if(bCollGB) then + collectgarbage() + LogInstance("TimerAttach: Garbage collected") + end + end) + timerStart(TimerID) + return Place[Key] + else + return StatusLog(Place[Key],"TimerAttach: Timer mode not found <"..sModeTM..">") + end + elseif(sModeDB == "LUA") then + return StatusLog(Place[Key],"TimerAttach: Memory manager not available") + else + return StatusLog(nil,"TimerAttach: Wrong database mode") + end +end + +local function TimerRestart(oLocation,tKeys,defTable,anyMessage) + if(not defTable) then + return StatusLog(nil,"TimerRestart: Missing table definition") end + local Place, Key = NavigateTable(oLocation,tKeys) + if(not (IsExistent(Place) and IsExistent(Key))) then + return StatusLog(nil,"TimerRestart: Navigation failed") end + if(not IsExistent(Place[Key])) then + return StatusLog(nil,"TimerRestart: Place not found") end + local sModeDB = GetOpVar("MODE_DATABASE") + if(sModeDB == "SQL") then + local tTimer = defTable.Timer + if(not IsExistent(tTimer)) then + return StatusLog(Place[Key],"TimerRestart: Missing timer settings") end + Place[Key].Used = Time() + local nLifeTM = tTimer[2] + if(nLifeTM <= 0) then + return StatusLog(Place[Key],"TimerRestart: Timer life ignored") end + local sModeTM = tTimer[1] + if(sModeTM == "CQT") then + sModeTM = "CQT" -- Just for something to do here and to be known that this is mode CQT + elseif(sModeTM == "OBJ") then + local keyTimerID = stringImplode(GetOpVar("OPSYM_DIVIDER"),tKeys) + if(not timerExists(keyTimerID)) then + return StatusLog(nil,"TimerRestart: Timer missing <"..keyTimerID..">") end + timerStart(keyTimerID) + else return StatusLog(nil,"TimerRestart: Timer mode not found <"..sModeTM..">") end + elseif(sModeDB == "LUA") then Place[Key].Used = Time() + else return StatusLog(nil,"TimerRestart: Wrong database mode") end + return Place[Key] +end + +function CacheBoxLayout(oEnt,nRot,nCamX,nCamZ) + if(not (oEnt and oEnt:IsValid())) then + return StatusLog(nil,"CacheBoxLayout: Entity invalid <"..tostring(oEnt)..">") end + local sMod = oEnt:GetModel() + local oRec = CacheQueryPiece(sMod) + if(not IsExistent(oRec)) then + return StatusLog(nil,"CacheBoxLayout: Piece record invalid <"..sMod..">") end + local Box = oRec.Layout + if(not IsExistent(Box)) then + local vMin, vMax + oRec.Layout = {}; Box = oRec.Layout + if (CLIENT) then vMin, vMax = oEnt:GetRenderBounds() + elseif(SERVER) then vMin, vMax = oEnt:OBBMins(), oEnt:OBBMaxs() + else return StatusLog(nil,"CacheBoxLayout: Wrong instance") end + Box.Ang = Angle () -- Layout entity angle + Box.Cen = Vector() -- Layout entity centre + Box.Cen:Set(vMax); Box.Cen:Add(vMin); Box.Cen:Mul(0.5) + Box.Eye = oEnt:LocalToWorld(Box.Cen) -- Layout camera eye + Box.Len = ((vMax - vMin):Length() / 2) -- Layout border sphere radius + Box.Cam = Vector(); Box.Cam:Set(Box.Eye) -- Layout camera position + AddVectorXYZ(Box.Cam,Box.Len*(tonumber(nCamX) or 0),0,Box.Len*(tonumber(nCamZ) or 0)) + LogInstance("CacheBoxLayout: "..tostring(Box.Cen).." # "..tostring(Box.Len)) + end; Box.Ang[caY] = (tonumber(nRot) or 0) * Time() + return Box +end + +--------------------------- PIECE QUERY ----------------------------- + +function CacheQueryPiece(sModel) + if(not IsExistent(sModel)) then + return StatusLog(nil,"CacheQueryPiece: Model does not exist") end + if(not IsString(sModel)) then + return StatusLog(nil,"CacheQueryPiece: Model {"..type(sModel).."}<"..tostring(sModel).."> not string") end + if(IsEmptyString(sModel)) then + return StatusLog(nil,"CacheQueryPiece: Model empty string") end + if(not utilIsValidModel(sModel)) then + return StatusLog(nil,"CacheQueryPiece: Model invalid <"..sModel..">") end + local defTable = GetOpVar("DEFTABLE_PIECES") + if(not defTable) then + return StatusLog(nil,"CacheQueryPiece: Table definition missing") end + local tCache = libCache[defTable.Name] -- Match the model casing + local sModel = MatchType(defTable,sModel,1,false,"",true,true) + if(not IsExistent(tCache)) then + return StatusLog(nil,"CacheQueryPiece: Cache not allocated for <"..defTable.Name..">") end + local caInd = GetOpVar("NAV_PIECE") + if(not IsExistent(caInd[1])) then caInd[1] = defTable.Name end caInd[2] = sModel + local stPiece = tCache[sModel] + if(IsExistent(stPiece) and IsExistent(stPiece.Kept)) then + if(stPiece.Kept > 0) then + return TimerRestart(libCache,caInd,defTable,"CacheQueryPiece") end + return nil + else + local sModeDB = GetOpVar("MODE_DATABASE") + if(sModeDB == "SQL") then + LogInstance("CacheQueryPiece: Model >> Pool <"..stringToFileName(sModel)..">") + tCache[sModel] = {}; stPiece = tCache[sModel]; stPiece.Kept = 0 + local Q = SQLBuildSelect(defTable,nil,{{1,sModel}},{4}) + if(not IsExistent(Q)) then + return StatusLog(nil,"CacheQueryPiece: Build error <"..SQLBuildError()..">") end + local qData = sqlQuery(Q) + if(not qData and IsBool(qData)) then + return StatusLog(nil,"CacheQueryPiece: SQL exec error <"..sqlLastError()..">") end + if(not (qData and qData[1])) then + return StatusLog(nil,"CacheQueryPiece: No data found <"..Q..">") end + stPiece.Kept = 1 --- Found at least one record + stPiece.Slot = sModel + stPiece.Type = qData[1][defTable[2][1]] + stPiece.Name = qData[1][defTable[3][1]] + local qRec, qRez + while(qData[stPiece.Kept]) do + qRec = qData[stPiece.Kept] + qRez = RegisterPOA(stPiece, + stPiece.Kept, + qRec[defTable[5][1]], + qRec[defTable[6][1]], + qRec[defTable[7][1]]) + if(not IsExistent(qRez)) then + return StatusLog(nil,"CacheQueryPiece: Cannot process offset #"..tostring(stPiece.Kept).." for <"..sModel..">") + end + stPiece.Kept = stPiece.Kept + 1 + end + return TimerAttach(libCache,caInd,defTable,"CacheQueryPiece") + elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryPiece: Record not located") + else return StatusLog(nil,"CacheQueryPiece: Wrong database mode <"..sModeDB..">") end + end +end + +function CacheQueryAdditions(sModel) + if(not IsExistent(sModel)) then + return StatusLog(nil,"CacheQueryAdditions: Model does not exist") end + if(not IsString(sModel)) then + return StatusLog(nil,"CacheQueryAdditions: Model {"..type(sModel).."}<"..tostring(sModel).."> not string") end + if(IsEmptyString(sModel)) then + return StatusLog(nil,"CacheQueryAdditions: Model empty string") end + if(not utilIsValidModel(sModel)) then + return StatusLog(nil,"CacheQueryAdditions: Model invalid") end + local defTable = GetOpVar("DEFTABLE_ADDITIONS") + if(not defTable) then + return StatusLog(nil,"CacheQueryAdditions: Missing table definition") end + local tCache = libCache[defTable.Name] -- Match the model casing + local sModel = MatchType(defTable,sModel,1,false,"",true,true) + if(not IsExistent(tCache)) then + return StatusLog(nil,"CacheQueryAdditions: Cache not allocated for <"..defTable.Name..">") end + local caInd = GetOpVar("NAV_ADDITION") + if(not IsExistent(caInd[1])) then caInd[1] = defTable.Name end caInd[2] = sModel + local stAddition = tCache[sModel] + if(IsExistent(stAddition) and IsExistent(stAddition.Kept)) then + if(stAddition.Kept > 0) then + return TimerRestart(libCache,caInd,defTable,"CacheQueryAdditions") end + return nil + else + local sModeDB = GetOpVar("MODE_DATABASE") + if(sModeDB == "SQL") then + LogInstance("CacheQueryAdditions: Model >> Pool <"..stringToFileName(sModel)..">") + tCache[sModel] = {}; stAddition = tCache[sModel]; stAddition.Kept = 0 + local Q = SQLBuildSelect(defTable,{2,3,4,5,6,7,8,9,10,11,12},{{1,sModel}},{4}) + if(not IsExistent(Q)) then + return StatusLog(nil,"CacheQueryAdditions: Build error <"..SQLBuildError()..">") end + local qData = sqlQuery(Q) + if(not qData and IsBool(qData)) then + return StatusLog(nil,"CacheQueryAdditions: SQL exec error <"..sqlLastError()..">") end + if(not (qData and qData[1])) then + return StatusLog(nil,"CacheQueryAdditions: No data found <"..Q..">") end + stAddition.Kept = 1 + stAddition.Slot = sModel + while(qData[stAddition.Kept]) do + local qRec = qData[stAddition.Kept] + stAddition[stAddition.Kept] = {} + for Field, Val in pairs(qRec) do + stAddition[stAddition.Kept][Field] = Val + end + stAddition.Kept = stAddition.Kept + 1 + end + return TimerAttach(libCache,caInd,defTable,"CacheQueryAdditions") + elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryAdditions: Record not located") + else return StatusLog(nil,"CacheQueryAdditions: Wrong database mode <"..sModeDB..">") end + end +end + +----------------------- PANEL QUERY ------------------------------- + +--- Used to Populate the CPanel Tree +function CacheQueryPanel() + local defTable = GetOpVar("DEFTABLE_PIECES") + if(not defTable) then + return StatusLog(false,"CacheQueryPanel: Missing table definition") end + if(not IsExistent(libCache[defTable.Name])) then + return StatusLog(nil,"CacheQueryPanel: Cache not allocated for <"..defTable.Name..">") end + local caInd = GetOpVar("NAV_PANEL") + local keyPan = GetOpVar("HASH_USER_PANEL") + if(not IsExistent(caInd[1])) then caInd[1] = keyPan end + local stPanel = libCache[keyPan] + if(IsExistent(stPanel) and IsExistent(stPanel.Kept)) then + LogInstance("CacheQueryPanel: From Pool") + if(stPanel.Kept > 0) then + return TimerRestart(libCache,caInd,defTable,"CacheQueryPanel") end + return nil + else + libCache[keyPan] = {}; stPanel = libCache[keyPan] + local sModeDB = GetOpVar("MODE_DATABASE") + if(sModeDB == "SQL") then + local Q = SQLBuildSelect(defTable,{1,2,3},{{4,1}},{2,3}) + if(not IsExistent(Q)) then + return StatusLog(nil,"CacheQueryPanel: Build error: <"..SQLBuildError()..">") end + local qData = sqlQuery(Q) + if(not qData and IsBool(qData)) then + return StatusLog(nil,"CacheQueryPanel: SQL exec error <"..sqlLastError()..">") end + if(not (qData and qData[1])) then + return StatusLog(nil,"CacheQueryPanel: No data found <"..Q..">") end + stPanel.Kept = 1 + while(qData[stPanel.Kept]) do + stPanel[stPanel.Kept] = qData[stPanel.Kept] + stPanel.Kept = stPanel.Kept + 1 + end + return TimerAttach(libCache,caInd,defTable,"CacheQueryPanel") + elseif(sModeDB == "LUA") then + local tCache = libCache[defTable.Name] + local tData = {} + local iNdex = 0 + for sModel, tRecord in pairs(tCache) do + tData[sModel] = { + [defTable[1][1]] = sModel, + [defTable[2][1]] = tRecord.Type, + [defTable[3][1]] = tRecord.Name + } + end + local tSorted = Sort(tData,nil,{defTable[2][1],defTable[3][1]}) + if(not tSorted) then + return StatusLog(nil,"CacheQueryPanel: Cannot sort cache data") end + iNdex = 1 + while(tSorted[iNdex]) do + stPanel[iNdex] = tData[tSorted[iNdex].Key] + iNdex = iNdex + 1 + end + return stPanel + else return StatusLog(nil,"CacheQueryPanel: Wrong database mode <"..sModeDB..">") end + LogInstance("CacheQueryPanel: To Pool") + end +end + +--- Used to Populate the CPanel Phys Materials +function CacheQueryProperty(sType) + local defTable = GetOpVar("DEFTABLE_PHYSPROPERTIES") + if(not defTable) then + return StatusLog(nil,"CacheQueryProperty: Missing table definition") end + local tCache = libCache[defTable.Name] + if(not tCache) then + return StatusLog(nil,"CacheQueryProperty["..tostring(sType).."]: Cache not allocated for <"..defTable.Name..">") end + local sModeDB = GetOpVar("MODE_DATABASE") + if(IsString(sType) and not IsEmptyString(sType)) then + local sType = MatchType(defTable,sType,1,false,"",true,true) + local keyName = GetOpVar("HASH_PROPERTY_NAMES") + local arNames = tCache[keyName] + local caInd = GetOpVar("NAV_PROPERTY_NAMES") + if(not IsExistent(caInd[1])) then + caInd[1] = defTable.Name; caInd[2] = keyName end caInd[3] = sType + if(not IsExistent(arNames)) then + tCache[keyName] = {}; arNames = tCache[keyName] + end + local stName = arNames[sType] + if(IsExistent(stName) and IsExistent(stName.Kept)) then + LogInstance("CacheQueryProperty["..sType.."]: Names << Pool") + if(stName.Kept > 0) then + return TimerRestart(libCache,caInd,defTable,"CacheQueryProperty") end + return nil + else + if(sModeDB == "SQL") then + arNames[sType] = {}; stName = arNames[sType]; stName.Kept = 0 + local Q = SQLBuildSelect(defTable,{3},{{1,sType}},{2}) + if(not IsExistent(Q)) then + return StatusLog(nil,"CacheQueryProperty["..sType.."]: Build error: <"..SQLBuildError()..">") end + local qData = sqlQuery(Q) + if(not qData and IsBool(qData)) then + return StatusLog(nil,"CacheQueryProperty: SQL exec error <"..sqlLastError()..">") end + if(not (qData and qData[1])) then + return StatusLog(nil,"CacheQueryProperty["..sType.."]: No data found <"..Q..">") end + stName.Kept = 1 + stName.Slot = sType + while(qData[stName.Kept]) do + stName[stName.Kept] = qData[stName.Kept][defTable[3][1]] + stName.Kept = stName.Kept + 1 + end + LogInstance("CacheQueryProperty["..sType.."]: Names >> Pool") + return TimerAttach(libCache,caInd,defTable,"CacheQueryProperty") + elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryProperty["..sType.."]: Record not located") + else return StatusLog(nil,"CacheQueryProperty["..sType.."]: Wrong database mode <"..sModeDB..">") end + end + else + local keyType = GetOpVar("HASH_PROPERTY_TYPES") + local stType = tCache[keyType] + local caInd = GetOpVar("NAV_PROPERTY_TYPES") + if(not IsExistent(caInd[1])) then caInd[1] = defTable.Name; caInd[2] = keyType end + if(IsExistent(stType) and IsExistent(stType.Kept)) then + LogInstance("CacheQueryProperty: Types << Pool") + if(stType.Kept > 0) then + return TimerRestart(libCache,caInd,defTable,"CacheQueryProperty") end + return nil + else + if(sModeDB == "SQL") then + tCache[keyType] = {}; stType = tCache[keyType]; stType.Kept = 0 + local Q = SQLBuildSelect(defTable,{1},{{2,1}},{1}) + if(not IsExistent(Q)) then + return StatusLog(nil,"CacheQueryProperty: Build error: <"..SQLBuildError()..">") end + local qData = sqlQuery(Q) + if(not qData and IsBool(qData)) then + return StatusLog(nil,"CacheQueryProperty: SQL exec error <"..sqlLastError()..">") end + if(not (qData and qData[1])) then + return StatusLog(nil,"CacheQueryProperty: No data found <"..Q..">") end + stType.Kept = 1 + while(qData[stType.Kept]) do + stType[stType.Kept] = qData[stType.Kept][defTable[1][1]] + stType.Kept = stType.Kept + 1 + end + LogInstance("CacheQueryProperty: Types >> Pool") + return TimerAttach(libCache,caInd,defTable,"CacheQueryProperty") + elseif(sModeDB == "LUA") then return StatusLog(nil,"CacheQueryProperty: Record not located") + else return StatusLog(nil,"CacheQueryProperty: Wrong database mode <"..sModeDB..">") end + end + end +end + +---------------------- EXPORT -------------------------------- + +local function GetFieldsName(defTable,sDelim) + if(not IsExistent(sDelim)) then return "" end + local sDelim = stringSub(tostring(sDelim),1,1) + local sResult = "" + if(IsEmptyString(sDelim)) then + return StatusLog("","GetFieldsName: Invalid delimiter for <"..defTable.Name..">") end + local iCount = 1 + local namField + while(defTable[iCount]) do + namField = defTable[iCount][1] + if(not IsString(namField)) then + return StatusLog("","GetFieldsName: Field #"..iCount + .." {"..type(namField).."}<"..tostring(namField).."> not string") end + sResult = sResult..namField + if(defTable[iCount + 1]) then sResult = sResult..sDelim end + iCount = iCount + 1 + end + return sResult +end + +--[[ + * Save/Load the DB Using Excel or + * anything that supports delimiter + * separated digital tables + * sPrefix = Something that separates exported table from the rest ( e.g. db_ ) + * sTable = Definition KEY to export to + * sDelim = Delimiter CHAR data separator + * bCommit = true to insert the read values +]]-- +function ImportDSV(sTable,sDelim,bCommit,sPrefix) + if(not IsString(sTable)) then + return StatusLog(false,"ImportDSV: Table {"..type(sTable).."}<"..tostring(sTable).."> not string") end + local defTable = GetOpVar("DEFTABLE_"..sTable) + if(not defTable) then + return StatusLog(false,"ImportDSV: Missing table definition for <"..sTable..">") end + local fName = GetOpVar("DIRPATH_BAS")..GetOpVar("DIRPATH_DSV") + fName = fName..tostring(sPrefix or GetInstPref())..defTable.Name..".txt" + local F = fileOpen(fName, "r", "DATA") + if(not F) then return StatusLog(false,"ImportDSV: fileOpen("..fName..".txt) Failed") end + local symOff = GetOpVar("OPSYM_DISABLE") + local tabLen = stringLen(defTable.Name) + local sLine, sChar, lenLine = "", "X", 0 + while(sChar) do + sChar = F:Read(1) + if(not sChar) then return end + if(sChar == "\n") then + lenLine = stringLen(sLine) + if(stringSub(sLine,lenLine,lenLine) == "\r") then + sLine = stringSub(sLine,1,lenLine-1) + lenLine = lenLine - 1 + end + if((stringSub(sLine,1,1) ~= symOff) and (stringSub(sLine,1,tabLen) == defTable.Name)) then + local Data = stringExplode(sDelim,stringSub(sLine,tabLen+2,lenLine)) + for k,v in pairs(Data) do + local vLen = stringLen(v) + if(stringSub(v,1,1) == "\"" and stringSub(v,vLen,vLen) == "\"") then + Data[k] = stringSub(v,2,vLen-1) + end + end + if(bCommit) then InsertRecord(sTable,Data) end + end + sLine = "" + else sLine = sLine..sChar end + end + F:Close() +end + +function DeleteExternalDatabase(sTable,sMethod,sPrefix) + if(not IsString(sTable)) then + return StatusLog(false,"DeleteExternalDatabase: Table {"..type(sTable).."}<"..tostring(sTable).."> not string") end + if(not IsString(sMethod)) then + return StatusLog(false,"DeleteExternalDatabase: Delete method {"..type(sMethod).."}<"..tostring(sMethod).."> not string") end + local defTable = GetOpVar("DEFTABLE_"..sTable) + if(not defTable) then + return StatusLog(false,"DeleteExternalDatabase: Missing table definition for <"..sTable..">") end + local fName = GetOpVar("DIRPATH_BAS") + if(not GetOpVar("DIRPATH_"..sMethod)) then + return StatusLog(false,"DeleteExternalDatabase: Directory index <"..sMethod.."> missing") end + fName = fName..GetOpVar("DIRPATH_"..sMethod) + fName = fName..tostring(sPrefix or GetInstPref())..defTable.Name..".txt" + if(not fileExists(fName,"DATA")) then + return StatusLog(true,"DeleteExternalDatabase: File <"..fName.."> missing") end + fileDelete(fName) + return StatusLog(true,"DeleteExternalDatabase: Success") +end + +function StoreExternalDatabase(sTable,sDelim,sMethod,sPrefix) + if(not IsString(sTable)) then + return StatusLog(false,"StoreExternalDatabase: Table {"..type(sTable).."}<"..tostring(sTable).."> not string") end + if(not IsString(sMethod)) then + return StatusLog(false,"StoreExternalDatabase: Export mode {"..type(sMethod).."}<"..tostring(sMethod).."> not string") end + local defTable = GetOpVar("DEFTABLE_"..sTable) + if(not defTable) then + return StatusLog(false,"StoreExternalDatabase: Missing table definition for <"..sTable..">") end + local fName = GetOpVar("DIRPATH_BAS") + if(not fileExists(fName,"DATA")) then fileCreateDir(fName) end + if(not GetOpVar("DIRPATH_"..sMethod)) then + return StatusLog(false,"StoreExternalDatabase: Directory index <"..sMethod.."> missing") end + fName = fName..GetOpVar("DIRPATH_"..sMethod) + if(not fileExists(fName,"DATA")) then fileCreateDir(fName) end + fName = fName..tostring(sPrefix or GetInstPref())..defTable.Name..".txt" + local F = fileOpen(fName, "w", "DATA" ) + if(not F) then return StatusLog(false,"StoreExternalDatabase: fileOpen("..fName..") Failed") end + local sData, sTemp = "", "" + local sModeDB, symOff = GetOpVar("MODE_DATABASE"), GetOpVar("OPSYM_DISABLE") + F:Write("# StoreExternalDatabase( "..sMethod.." ): "..osDate().." [ "..sModeDB.." ]".."\n") + F:Write("# Data settings: "..GetFieldsName(defTable,sDelim).."\n") + if(sModeDB == "SQL") then + local Q = "" + if (sTable == "PIECES" ) then Q = SQLBuildSelect(defTable,nil,nil,{2,3,1,4}) + elseif(sTable == "ADDITIONS" ) then Q = SQLBuildSelect(defTable,nil,nil,{1,4}) + elseif(sTable == "PHYSPROPERTIES") then Q = SQLBuildSelect(defTable,nil,nil,{1,2}) + else Q = SQLBuildSelect(defTable,nil,nil,nil) end + if(not IsExistent(Q)) then return StatusLog(false,"StoreExternalDatabase: Build error <"..SQLBuildError()..">") end + F:Write("# Query ran: <"..Q..">\n") + local qData = sqlQuery(Q) + if(not qData and IsBool(qData)) then + return StatusLog(nil,"StoreExternalDatabase: SQL exec error <"..sqlLastError()..">") end + if(not (qData and qData[1])) then + return StatusLog(false,"StoreExternalDatabase: No data found <"..Q..">") end + local iCnt, iInd, qRec = 1, 1, nil + if (sMethod == "DSV") then sData = defTable.Name..sDelim + elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end + while(qData[iCnt]) do + iInd = 1 + sTemp = sData + qRec = qData[iCnt] + while(defTable[iInd]) do -- The data is already inserted, so matching will not crash + sTemp = sTemp..MatchType(defTable,qRec[defTable[iInd][1]],iInd,true,"\"",true) + if(defTable[iInd + 1]) then sTemp = sTemp..sDelim end + iInd = iInd + 1 + end + if (sMethod == "DSV") then sTemp = sTemp.."\n" + elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end + F:Write(sTemp) + iCnt = iCnt + 1 + end + elseif(sModeDB == "LUA") then + local tCache = libCache[defTable.Name] + if(not IsExistent(tCache)) then + return StatusLog(false,"StoreExternalDatabase: Table <"..defTable.Name.."> cache not allocated") end + if(sTable == "PIECES") then + local tData = {} + for sModel, tRecord in pairs(tCache) do + sData = tRecord.Type..tRecord.Name..sModel + tData[sModel] = {[defTable[1][1]] = sData} + end + local tSorted = Sort(tData,nil,{defTable[1][1]}) + if(not tSorted) then + return StatusLog(false,"StoreExternalDatabase: Cannot sort cache data") end + local iInd iNdex = 1, 1 + while(tSorted[iNdex]) do + iInd = 1 + tData = tCache[tSorted[iNdex].Key] + if (sMethod == "DSV") then sData = defTable.Name..sDelim + elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end + sData = sData..MatchType(defTable,tSorted[iNdex].Key,1,true,"\"")..sDelim.. + MatchType(defTable,tData.Type,2,true,"\"")..sDelim.. + MatchType(defTable,((ModelToName(tSorted[iNdex].Key) == tData.Name) and symOff or tData.Name),3,true,"\"")..sDelim + -- Matching crashes only for numbers + while(tData.Offs[iInd]) do -- The number is already inserted, so there will be no crash + sTemp = sData..MatchType(defTable,iInd,4,true,"\"")..sDelim.. + "\""..(IsEqualPOA(tData.Offs[iInd].P,tData.Offs[iInd].O) and "" or StringPOA(tData.Offs[iInd].P,"V")).."\""..sDelim.. + "\"".. StringPOA(tData.Offs[iInd].O,"V").."\""..sDelim.. + "\""..( IsZeroPOA(tData.Offs[iInd].A,"A") and "" or StringPOA(tData.Offs[iInd].A,"A")).."\"" + if (sMethod == "DSV") then sTemp = sTemp.."\n" + elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end + F:Write(sTemp) + iInd = iInd + 1 + end + iNdex = iNdex + 1 + end + elseif(sTable == "ADDITIONS") then + local iNdex, tData + for sModel, tRecord in pairs(tCache) do + if (sMethod == "DSV") then sData = defTable.Name..sDelim..sModel..sDelim + elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end + iNdex = 1 + while(tRecord[iNdex]) do -- Data is already inserted, there will be no crash + tData = tRecord[iNdex] + sTemp = sData..MatchType(defTable,tData[defTable[2 ][1]],2 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[3 ][1]],3 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[4 ][1]],4 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[5 ][1]],5 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[6 ][1]],6 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[7 ][1]],7 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[8 ][1]],8 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[9 ][1]],9 ,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[10][1]],10,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[11][1]],11,true,"\"")..sDelim.. + MatchType(defTable,tData[defTable[12][1]],12,true,"\"") + if (sMethod == "DSV") then sTemp = sTemp.."\n" + elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end + F:Write(sTemp) + iNdex = iNdex + 1 + end + end + elseif(sTable == "PHYSPROPERTIES") then + local tTypes = tCache[GetOpVar("HASH_PROPERTY_TYPES")] + local tNames = tCache[GetOpVar("HASH_PROPERTY_NAMES")] + if(not (tTypes or tNames)) then + return StatusLog(false,"StoreExternalDatabase: No data found") end + local tType + local iInd , iCnt = 1 , 1 + local sType, sName = "", "" + while(tTypes[iInd]) do + sType = tTypes[iInd] + tType = tNames[sType] + if(not tType) then return + StatusLog(false,"StoreExternalDatabase: Missing index #"..iInd.." on type <"..sType..">") end + if (sMethod == "DSV") then sData = defTable.Name..sDelim + elseif(sMethod == "INS") then sData = " asmlib.InsertRecord(\""..sTable.."\", {" end + iCnt = 1 + while(tType[iCnt]) do -- The number is already inserted, there will be no crash + sTemp = sData..MatchType(defTable,sType ,1,true,"\"")..sDelim.. + MatchType(defTable,iCnt ,2,true,"\"")..sDelim.. + MatchType(defTable,tType[iCnt],3,true,"\"") + if (sMethod == "DSV") then sTemp = sTemp.."\n" + elseif(sMethod == "INS") then sTemp = sTemp.."})\n" end + F:Write(sTemp) + iCnt = iCnt + 1 + end + iInd = iInd + 1 + end + end + end + F:Flush() + F:Close() +end + +----------------------------- SNAPPING ------------------------------ + +--[[ + * This function calculates the cross product normal angle of + * a player by a given trace. If the trace is missing it takes player trace + * It has options for snap to surface and yaw snap + * oPly = The player we need the normal angle from + * oTrace = A trace structure if nil, it takes oPly's + * nSnap = Snap to the trace surface flag + * nYSnap = Yaw snap amount +]]-- +function GetNormalAngle(oPly, oTrace, nSnap, nYSnap) + local aAng = Angle() + if(not oPly) then return aAng end + local nSnap = tonumber(nSnap) or 0 + if(nSnap and (nSnap ~= 0)) then -- Snap to the surface + local oTrace = oTrace + if(not (oTrace and oTrace.Hit)) then + oTrace = utilTraceLine(utilGetPlayerTrace(oPly)) + if(not (oTrace and oTrace.Hit)) then return aAng end + end + local vLeft = -oPly:GetAimVector():Angle():Right() + aAng:Set(vLeft:Cross(oTrace.HitNormal):AngleEx(oTrace.HitNormal)) + else -- Get only the player yaw, pitch and roll are not needed + local nYSnap = tonumber(nYSnap) or 0 + if(nYSnap and (nYSnap >= 0) and (nYSnap <= GetOpVar("MAX_ROTATION"))) then + aAng[caY] = SnapValue(oPly:GetAimVector():Angle()[caY],nYSnap) + end + end + return aAng +end + +--[[ + * This function is the backbone of the tool snapping and spawning. + * Anything related to dealing with the track assembly database + * Calculates SPos, SAng based on the DB inserts and input parameters + * ucsPos = Base UCS Pos + * ucsAng = Base UCS Ang + * shdModel = Client Model + * ivhdPointID = Client Point ID + * ucsPos(X,Y,Z) = Offset position + * ucsAng(P,Y,R) = Offset angle +]]-- +function GetNormalSpawn(ucsPos,ucsAng,shdModel,ivhdPointID,ucsPosX,ucsPosY,ucsPosZ,ucsAngP,ucsAngY,ucsAngR) + local hdRec = CacheQueryPiece(shdModel) + if(not IsExistent(hdRec)) then + return StatusLog(nil,"GetNormalSpawn: No record located") end + local ihdPointID = tonumber(ivhdPointID) + if(not IsExistent(ihdPointID)) then + return StatusLog(nil,"GetNormalSpawn: Index NAN {"..type(ivhdPointID).."}<"..tostring(ivhdPointID)..">") end + local hdPOA = LocatePOA(hdRec,ihdPointID) + if(not IsExistent(hdPOA)) then + return StatusLog(nil,"GetNormalSpawn: Holder point ID invalid #"..tostring(ihdPointID)) end + local stSpawn = GetOpVar("STRUCT_SPAWN"); stSpawn.HRec = hdRec + if(ucsPos) then SetVector(stSpawn.OPos,ucsPos) end + if(ucsAng) then SetAngle (stSpawn.OAng,ucsAng) end + -- Initialize F, R, U Copy the UCS like that to support database POA + stSpawn.R:Set(stSpawn.OAng:Right()) + stSpawn.U:Set(stSpawn.OAng:Up()) + stSpawn.OAng:RotateAroundAxis(stSpawn.R, (tonumber(ucsAngP) or 0)) + stSpawn.OAng:RotateAroundAxis(stSpawn.U,-(tonumber(ucsAngY) or 0)) + stSpawn.F:Set(stSpawn.OAng:Forward()) + stSpawn.OAng:RotateAroundAxis(stSpawn.F, (tonumber(ucsAngR) or 0)) + stSpawn.R:Set(stSpawn.OAng:Right()) + stSpawn.U:Set(stSpawn.OAng:Up()) + -- Get Holder model data + SetVector(stSpawn.HPnt,hdPOA.P) + SetVector(stSpawn.HPos,hdPOA.O); NegVector(stSpawn.HPos) -- Origin to Position + if(hdPOA.A[csD]) then SetAnglePYR(stSpawn.HAng) else SetAngle(stSpawn.HAng,hdPOA.A) end + -- Calculate spawn relation + stSpawn.HAng:RotateAroundAxis(stSpawn.HAng:Up(),180) + DecomposeByAngle(stSpawn.HPos,stSpawn.HAng) + -- Spawn Position + stSpawn.SPos:Set(stSpawn.OPos) + stSpawn.SPos:Add((hdPOA.O[csA] * stSpawn.HPos[cvX] + (tonumber(ucsPosX) or 0)) * stSpawn.F) + stSpawn.SPos:Add((hdPOA.O[csB] * stSpawn.HPos[cvY] + (tonumber(ucsPosY) or 0)) * stSpawn.R) + stSpawn.SPos:Add((hdPOA.O[csC] * stSpawn.HPos[cvZ] + (tonumber(ucsPosZ) or 0)) * stSpawn.U) + -- Spawn Angle + stSpawn.SAng:Set(stSpawn.OAng); NegAngle(stSpawn.HAng) + stSpawn.SAng:RotateAroundAxis(stSpawn.U,stSpawn.HAng[caY] * hdPOA.A[csB]) + stSpawn.SAng:RotateAroundAxis(stSpawn.R,stSpawn.HAng[caP] * hdPOA.A[csA]) + stSpawn.SAng:RotateAroundAxis(stSpawn.F,stSpawn.HAng[caR] * hdPOA.A[csC]) + -- Store the active point position of holder + stSpawn.HPnt:Rotate(stSpawn.SAng) + stSpawn.HPnt:Add(stSpawn.SPos) + return stSpawn +end + +--[[ + * This function is the backbone of the tool on entity snapping + * Calculates SPos, SAng based on the DB inserts and input parameters + * trEnt = Trace.Entity + * trHitPos = Trace.HitPos + * shdModel = Spawn data will be obtained for this model + * ivhdPointID = Active point ID selected via Right click ... + * nvActRadius = Minimal radius to get an active point from the client + * ucsPos(X,Y,Z) = Offset position + * ucsAng(P,Y,R) = Offset angle +]]-- +function GetEntitySpawn(trEnt,trHitPos,shdModel,ivhdPointID, + nvActRadius,enFlatten,enIgnTyp,ucsPosX, + ucsPosY,ucsPosZ,ucsAngP,ucsAngY,ucsAngR) + if(not (trEnt and trHitPos and shdModel and ivhdPointID and nvActRadius)) then + return StatusLog(nil,"GetEntitySpawn: Mismatched input parameters") end + if(not trEnt:IsValid()) then + return StatusLog(nil,"GetEntitySpawn: Trace entity not valid") end + if(IsOther(trEnt)) then + return StatusLog(nil,"GetEntitySpawn: Trace is of other type") end + local ihdPointID = tonumber(ivhdPointID) + if(not IsExistent(ihdPointID)) then + return StatusLog(nil,"GetEntitySpawn: Holder PointID NAN {"..type(ivhdPointID).."}<"..tostring(ivhdPointID)..">") end + local nActRadius = tonumber(nvActRadius) + if(not IsExistent(nActRadius)) then + return StatusLog(nil,"GetEntitySpawn: Active radius NAN {"..type(nvActRadius).."}<"..tostring(nvActRadius)..">") end + local trRec = CacheQueryPiece(trEnt:GetModel()) + if(not IsExistent(trRec)) then + return StatusLog(nil,"GetEntitySpawn: Trace model missing <"..trEnt:GetModel()..">") end + if(not IsExistent(LocatePOA(trRec,1))) then + return StatusLog(nil,"GetEntitySpawn: Trace has no points") end + local hdRec = CacheQueryPiece(shdModel) + if(not IsExistent(hdRec)) then + return StatusLog(nil,"GetEntitySpawn: Holder model missing <"..tostring(shdModel)..">") end + local hdOffs = LocatePOA(hdRec,ihdPointID) + if(not IsExistent(hdOffs)) then + return StatusLog(nil,"GetEntitySpawn: Holder point invalid #"..tostring(ihdPointID)) end + -- If there is no Type field exit immediately + if(not IsExistent(trRec.Type)) then + return StatusLog(nil,"GetEntitySpawn: Trace type missing") end + if(not IsExistent(hdRec.Type)) then + return StatusLog(nil,"GetEntitySpawn: Holder type missing") end + -- If the types are different and disabled + if((not enIgnTyp or enIgnTyp == 0) and trRec.Type ~= hdRec.Type ) then + return StatusLog(nil,"GetEntitySpawn: Types are different") end + -- We have the next Piece Offset + local vTemp = Vector() + local stSpawn, trPOA = GetOpVar("STRUCT_SPAWN") + stSpawn.TRec = trRec + stSpawn.RLen = nActRadius + stSpawn.HID = ihdPointID + stSpawn.TID = 0 + stSpawn.TPos:Set(trEnt:GetPos()) + stSpawn.TAng:Set(trEnt:GetAngles()) + for ID = 1, trRec.Kept do + -- Indexing is actually with 70% faster using this method than pairs + local stPOA = LocatePOA(trRec,ID) + if(not IsExistent(stPOA)) then + return StatusLog(nil,"GetEntitySpawn: Trace point count mismatch on #"..tostring(ID)) end + if(not stPOA.P[csD]) then -- Skip the disabled P + SetVector(vTemp,stPOA.P) + vTemp[cvX] = vTemp[cvX] * stPOA.P[csA] + vTemp[cvY] = vTemp[cvY] * stPOA.P[csB] + vTemp[cvZ] = vTemp[cvZ] * stPOA.P[csC] + vTemp:Rotate(stSpawn.TAng) + vTemp:Add(stSpawn.TPos) + vTemp:Sub(trHitPos) + local trAcDis = vTemp:Length() + if(trAcDis < stSpawn.RLen) then + trPOA = stPOA + stSpawn.TID = ID + stSpawn.RLen = trAcDis + stSpawn.TPnt:Set(vTemp) + stSpawn.TPnt:Add(trHitPos) + end + end + end + if(not IsExistent(trPOA)) then + return StatusLog(nil,"GetEntitySpawn: Not hitting active point") end + -- Found the active point ID on trEnt. Initialize origins + SetVector(stSpawn.OPos,trPOA.O) -- Use {0,0,0} for disabled A (Angle) + if(trPOA.A[csD]) then SetAnglePYR(stSpawn.OAng) else SetAngle(stSpawn.OAng,trPOA.A) end + stSpawn.OPos:Rotate(stSpawn.TAng) + stSpawn.OPos:Add(stSpawn.TPos) + stSpawn.OAng:Set(trEnt:LocalToWorldAngles(stSpawn.OAng)) + -- Do the flatten flag right now Its important ! + if(enFlatten and enFlatten ~= 0) then + stSpawn.OAng[caP] = 0; stSpawn.OAng[caR] = 0 + end + return GetNormalSpawn(nil,nil,shdModel,ihdPointID,ucsPosX,ucsPosY,ucsPosZ,ucsAngP,ucsAngY,ucsAngR) +end + +function AttachAdditions(ePiece) + if(not (ePiece and ePiece:IsValid())) then + return StatusLog(false,"AttachAdditions: Piece invalid") end + local LocalAng = ePiece:GetAngles() + local LocalPos = ePiece:GetPos() + local LocalMod = ePiece:GetModel() + local stAddition = CacheQueryAdditions(LocalMod) + if(not IsExistent(stAddition)) then + return StatusLog(true,"AttachAdditions: Model <"..LocalMod.."> has no additions") end + LogInstance("AttachAdditions: Called for model <"..LocalMod..">") + local Cnt = 1 + local defTable = GetOpVar("DEFTABLE_ADDITIONS") + while(stAddition[Cnt]) do + local Record = stAddition[Cnt] + LogInstance("\n\nEnt [ "..Record[defTable[4][1]].." ] INFO : ") + local Addition = entsCreate(Record[defTable[3][1]]) + if(Addition and Addition:IsValid()) then + LogInstance("Addition Class: "..Record[defTable[3][1]]) + if(fileExists(Record[defTable[2][1]], "GAME")) then + Addition:SetModel(Record[defTable[2][1]]) + LogInstance("Addition:SetModel("..Record[defTable[2][1]]..")") + else return StatusLog(false,"AttachAdditions: No such attachment model "..Record[defTable[2][1]]) end + local OffPos = Record[defTable[5][1]] + if(not IsString(OffPos)) then + return StatusLog(false,"AttachAdditions: Position {"..type(OffPos).."}<"..tostring(OffPos).."> not string") end + if(OffPos and OffPos ~= "" and OffPos ~= "NULL") then + local AdditionPos = Vector() + local arConv = DecodePOA(OffPos) + arConv[1] = arConv[1] * arConv[4] + arConv[2] = arConv[2] * arConv[5] + arConv[3] = arConv[3] * arConv[6] + AdditionPos:Set(LocalPos) + AdditionPos:Add(arConv[1] * LocalAng:Forward()) + AdditionPos:Add(arConv[2] * LocalAng:Right()) + AdditionPos:Add(arConv[3] * LocalAng:Up()) + Addition:SetPos(AdditionPos) + LogInstance("Addition:SetPos(AdditionPos)") + else + Addition:SetPos(LocalPos) + LogInstance("Addition:SetPos(LocalPos)") + end + local OffAng = Record[defTable[6][1]] + if(not IsString(OffAng)) then + return StatusLog(false,"AttachAdditions: Angle {"..type(OffAng).."}<"..tostring(OffAng).."> not string") end + if(OffAng and OffAng ~= "" and OffAng ~= "NULL") then + local AdditionAng = Angle() + local arConv = DecodePOA(OffAng) + AdditionAng[caP] = arConv[1] * arConv[4] + LocalAng[caP] + AdditionAng[caY] = arConv[2] * arConv[5] + LocalAng[caY] + AdditionAng[caR] = arConv[3] * arConv[6] + LocalAng[caR] + Addition:SetAngles(AdditionAng) + LogInstance("Addition:SetAngles(AdditionAng)") + else + Addition:SetAngles(LocalAng) + LogInstance("Addition:SetAngles(LocalAng)") + end + local MoveType = (tonumber(Record[defTable[7][1]]) or -1) + if(MoveType >= 0) then + Addition:SetMoveType(MoveType) + LogInstance("Addition:SetMoveType("..MoveType..")") + end + local PhysInit = (tonumber(Record[defTable[8][1]]) or -1) + if(PhysInit >= 0) then + Addition:PhysicsInit(PhysInit) + LogInstance("Addition:PhysicsInit("..PhysInit..")") + end + if((tonumber(Record[defTable[9][1]]) or -1) >= 0) then + Addition:DrawShadow(false) + LogInstance("Addition:DrawShadow(false)") + end + Addition:SetParent( ePiece ) + LogInstance("Addition:SetParent(ePiece)") + Addition:Spawn() + LogInstance("Addition:Spawn()") + phAddition = Addition:GetPhysicsObject() + if(phAddition and phAddition:IsValid()) then + if((tonumber(Record[defTable[10][1]]) or -1) >= 0) then + phAddition:EnableMotion(false) + LogInstance("phAddition:EnableMotion(false)") + end + if((tonumber(Record[defTable[11][1]]) or -1) >= 0) then + phAddition:Sleep() + LogInstance("phAddition:Sleep()") + end + end + Addition:Activate() + LogInstance("Addition:Activate()") + ePiece:DeleteOnRemove(Addition) + LogInstance("ePiece:DeleteOnRemove(Addition)") + local Solid = (tonumber(Record[defTable[12][1]]) or -1) + if(Solid >= 0) then + Addition:SetSolid(Solid) + LogInstance("Addition:SetSolid("..Solid..")") + end + else + return StatusLog(false,"Failed to allocate Addition #"..Cnt.." memory:" + .."\n Modelbse: "..stAddition[Cnt][defTable[1][1]] + .."\n Addition: "..stAddition[Cnt][defTable[2][1]] + .."\n ENTclass: "..stAddition[Cnt][defTable[3][1]]) + end + Cnt = Cnt + 1 + end + return StatusLog(true,"AttachAdditions: Success") +end + +local function GetEntityOrTrace(oEnt) + if(oEnt and oEnt:IsValid()) then return oEnt end + local Ply = LocalPlayer() + if(not IsExistent(Ply)) then + return StatusLog(nil,"GetEntityOrTrace: Player missing") end + local Trace = Ply:GetEyeTrace() + if(not IsExistent(Trace)) then + return StatusLog(nil,"GetEntityOrTrace: Trace missing") end + if(not Trace.Hit) then -- Boolean + return StatusLog(nil,"GetEntityOrTrace: Trace not hit") end + if(Trace.HitWorld) then -- Boolean + return StatusLog(nil,"GetEntityOrTrace: Trace hit world") end + local trEnt = Trace.Entity + if(not (trEnt and trEnt:IsValid())) then + return StatusLog(nil,"GetEntityOrTrace: Trace entity invalid") end + return StatusLog(trEnt,"GetEntityOrTrace: Success "..tostring(trEnt)) +end + +function GetPropSkin(oEnt) + local skEnt = GetEntityOrTrace(oEnt) + if(not IsExistent(skEnt)) then + return StatusLog("","GetPropSkin: Failed to gather entity") end + if(IsOther(skEnt)) then + return StatusLog("","GetPropSkin: Entity other type") end + local Skin = tonumber(skEnt:GetSkin()) + if(not IsExistent(Skin)) then return StatusLog("","GetPropSkin: Skin number mismatch") end + return StatusLog(tostring(Skin),"GetPropSkin: Success "..tostring(skEn)) +end + +function GetPropBodyGroup(oEnt) + local bgEnt = GetEntityOrTrace(oEnt) + if(not IsExistent(bgEnt)) then + return StatusLog("","GetPropBodyGrp: Failed to gather entity") end + if(IsOther(bgEnt)) then + return StatusLog("","GetPropBodyGrp: Entity other type") end + local BGs = bgEnt:GetBodyGroups() + if(not (BGs and BGs[1])) then + return StatusLog("","GetPropBodyGrp: Bodygroup table empty") end + local sRez, iCnt = "", 1 + local symSep = GetOpVar("OPSYM_SEPARATOR") + while(BGs[iCnt]) do + sRez = sRez..symSep..tostring(bgEnt:GetBodygroup(BGs[iCnt].id) or 0) + iCnt = iCnt + 1 + end + sRez = stringSub(sRez,2,-1) + Print(BGs,"GetPropBodyGrp: BGs") + return StatusLog(sRez,"GetPropBodyGrp: Success <"..sRez..">") +end + +function AttachBodyGroups(ePiece,sBgrpIDs) + if(not (ePiece and ePiece:IsValid())) then + return StatusLog(false,"AttachBodyGroups: Base entity invalid") end + local sBgrpIDs = tostring(sBgrpIDs or "") + LogInstance("AttachBodyGroups: <"..sBgrpIDs..">") + local iCnt = 1 + local BGs = ePiece:GetBodyGroups() + local IDs = stringExplode(GetOpVar("OPSYM_SEPARATOR"),sBgrpIDs) + while(BGs[iCnt] and IDs[iCnt]) do + local itrBG = BGs[iCnt] + local maxID = (ePiece:GetBodygroupCount(itrBG.id) - 1) + local itrID = mathClamp(mathFloor(tonumber(IDs[iCnt]) or 0),0,maxID) + LogInstance("ePiece:SetBodygroup("..tostring(itrBG.id)..","..tostring(itrID)..") ["..tostring(maxID).."]") + ePiece:SetBodygroup(itrBG.id,itrID) + iCnt = iCnt + 1 + end + return StatusLog(true,"AttachBodyGroups: Success") +end + +function MakePiece(sModel,vPos,aAng,nMass,sBgSkIDs,clColor) + if(CLIENT) then return StatusLog(nil,"MakePiece: Working on client") end + local stPiece = CacheQueryPiece(sModel) + if(not IsExistent(stPiece)) then + return StatusLog(nil,"MakePiece: Record missing <"..sModel..">") end + local ePiece = entsCreate("prop_physics") + if(not (ePiece and ePiece:IsValid())) then + return StatusLog(nil,"MakePiece: Entity invalid") end + ePiece:SetCollisionGroup(COLLISION_GROUP_NONE) + ePiece:SetSolid(SOLID_VPHYSICS) + ePiece:SetMoveType(MOVETYPE_VPHYSICS) + ePiece:SetNotSolid(false) + ePiece:SetModel(sModel) + ePiece:SetPos(vPos or GetOpVar("VEC_ZERO")) + ePiece:SetAngles(aAng or GetOpVar("ANG_ZERO")) + ePiece:Spawn() + ePiece:Activate() + ePiece:SetRenderMode(RENDERMODE_TRANSALPHA) + ePiece:SetColor(clColor or Color(255,255,255,255)) + ePiece:DrawShadow(false) + ePiece:PhysWake() + local phPiece = ePiece:GetPhysicsObject() + if(not (phPiece and phPiece:IsValid())) then ePiece:Remove() + return StatusLog(nil,"MakePiece: Entity phys object invalid") end + phPiece:EnableMotion(false) + phPiece:SetMass(mathClamp(tonumber(nMass) or 1,1,GetOpVar("MAX_MASS"))) + local BgSk = stringExplode(GetOpVar("OPSYM_DIRECTORY"),(sBgSkIDs or "")) + ePiece:SetSkin(mathClamp(tonumber(BgSk[2]) or 0,0,ePiece:SkinCount()-1)) + if(not AttachBodyGroups(ePiece,BgSk[1] or "")) then ePiece:Remove() + return StatusLog(nil,"MakePiece: Failed to attach bodygroups") end + if(not AttachAdditions(ePiece)) then ePiece:Remove() + return StatusLog(nil,"MakePiece: Failed to attach additions") end + return StatusLog(ePiece,"MakePiece: Success "..tostring(ePiece)) +end + +function ApplyPhysicalAnchor(ePiece,eBase,nWe,nNc) + if(CLIENT) then return StatusLog(true,"ApplyPhysicalAnchor: Working on client") end + local nWe = tonumber(nWe) or 0 + local nNc = tonumber(nNc) or 0 + LogInstance("ApplyPhysicalAnchor: {"..nWe..","..nNc.."}") + if(not (ePiece and ePiece:IsValid())) then + return StatusLog(false,"ApplyPhysicalAnchor: Piece entity not valid") end + if(not (eBase and eBase:IsValid())) then + return StatusLog(true,"ApplyPhysicalAnchor: Base constraint ignored") end + if(nWe ~= 0) then -- Weld + local nWe = constraintWeld(ePiece, eBase, 0, 0, 0, false, false) + if(nWe and nWe:IsValid()) then + ePiece:DeleteOnRemove(nWe) + eBase:DeleteOnRemove(nWe) + else LogInstance("ApplyPhysicalAnchor: Weld ignored") end + end + if(nNc ~= 0) then -- NoCollide + local nNc = constraintNoCollide(ePiece, eBase, 0, 0) + if(nNc and nNc:IsValid()) then + ePiece:DeleteOnRemove(nNc) + eBase:DeleteOnRemove(nNc) + else LogInstance("ApplyPhysicalAnchor: NoCollide ignored") end + end + return StatusLog(true,"ApplyPhysicalAnchor: Success") +end + +function ApplyPhysicalSettings(ePiece,nPi,nFr,nGr,sPh) + if(CLIENT) then return StatusLog(true,"ApplyPhysicalSettings: Working on client") end + local nPi = tonumber(nPi) or 0 + local nFr = tonumber(nFr) or 0 + local nGr = tonumber(nGr) or 0 + local sPh = tostring(sPh or "") + LogInstance("ApplyPhysicalSettings: {"..nPi..","..nFr..","..nGr..","..sPh.."}") + if(not (ePiece and ePiece:IsValid())) then + return StatusLog(false,"ApplyPhysicalSettings: Piece entity not valid") end + -- Initialize dupe settings using this array + local dataSettings = {} + if(nPi ~= 0) then + ePiece.PhysgunDisabled = true + ePiece:SetUnFreezable(true) + ePiece:SetMoveType(MOVETYPE_VPHYSICS) + dataSettings[1] = 1 -- Enabled + end + local pyPiece = ePiece:GetPhysicsObject() + if(not (pyPiece and pyPiece:IsValid())) then + return StatusLog(false,"ApplyPhysicalSettings: Piece physical object not valid") end + if(nFr ~= 0) then pyPiece:EnableMotion(false) else pyPiece:EnableMotion(true) end + if(nGr ~= 0) then constructSetPhysProp(nil,ePiece,0,pyPiece,{GravityToggle = true }) + else constructSetPhysProp(nil,ePiece,0,pyPiece,{GravityToggle = false}) end + if(sPh ~= "") then constructSetPhysProp(nil,ePiece,0,pyPiece,{Material = sPh}) end + if(tableMaxn(dataSettings) > 0) then -- Are there any settings to be saved + duplicatorStoreEntityModifier(ePiece,GetOpVar("TOOLNAME_PL").."dupe_phys_set",dataSettings) end + return StatusLog(true,"ApplyPhysicalSettings: Success") +end + +function SetBoundPos(ePiece,vPos,oPly,sMode) + if(not (ePiece and ePiece:IsValid())) then + return StatusLog(false,"Piece:SetBoundPos: Entity invalid") end + if(not vPos) then + return StatusLog(false,"Piece:SetBoundPos: Position invalid") end + if(not oPly) then + return StatusLog(false,"Piece:SetBoundPos: Player invalid") end + local sMode = tostring(sMode or "LOG") + if(sMode == "OFF") then + ePiece:SetPos(vPos) + return StatusLog(true,"Piece:SetBoundPos("..sMode..") Tuned off") + end + if(utilIsInWorld(vPos)) then -- Error mode is "LOG" by default + ePiece:SetPos(vPos) + else + ePiece:Remove() + if(sMode == "HINT" or sMode == "GENERIC" or sMode == "ERROR") then + PrintNotifyPly(oPly,"Position out of map bounds!",sMode) end + return StatusLog(false,"Piece:SetBoundPos("..sMode.."): Position out of map bounds") + end + return StatusLog(true,"Piece:SetBoundPos("..sMode.."): Success") +end + +function MakeCoVar(sShortName, sValue, tBorder, nFlags, sInfo) + if(not IsString(sShortName)) then + return StatusLog(nil,"MakeCvar: CVar name {"..type(sShortName).."}<"..tostring(sShortName).."> not string") end + if(not IsExistent(sValue)) then + return StatusLog(nil,"MakeCvar: Wrong default value <"..tostring(sValue)..">") end + if(not IsString(sInfo)) then + return StatusLog(nil,"MakeCvar: CVar info {"..type(sInfo).."}<"..tostring(sInfo).."> not string") end + local sVar = GetOpVar("TOOLNAME_PL")..stringLower(sShortName) + if(tBorder and (type(tBorder) == "table") and tBorder[1] and tBorder[2]) then + local Border = GetOpVar("TABLE_BORDERS") + Border["cvar_"..sVar] = tBorder + end + return CreateConVar(sVar, sValue, nFlags, sInfo) +end + +function GetCoVar(sShortName, sMode) + if(not IsString(sShortName)) then + return StatusLog(nil,"GetCoVar: CVar name {"..type(sShortName).."}<"..tostring(sShortName).."> not string") end + if(not IsString(sMode)) then + return StatusLog(nil,"GetCoVar: CVar mode {"..type(sMode).."}<"..tostring(sMode).."> not string") end + local sVar = GetOpVar("TOOLNAME_PL")..stringLower(sShortName) + local CVar = GetConVar(sVar) + if(not IsExistent(CVar)) then + return StatusLog(nil,"GetCoVar("..sShortName..", "..sMode.."): Missing CVar object") end + if (sMode == "INT") then + return (tonumber(BorderValue(CVar:GetInt(),"cvar_"..sVar)) or 0) + elseif(sMode == "FLT") then + return (tonumber(BorderValue(CVar:GetFloat(),"cvar_"..sVar)) or 0) + elseif(sMode == "STR") then + return tostring(CVar:GetString() or "") + elseif(sMode == "BUL") then + return (CVar:GetBool() or false) + elseif(sMode == "DEF") then + return CVar:GetDefault() + elseif(sMode == "INF") then + return CVar:GetHelpText() + elseif(sMode == "NAM") then + return CVar:GetName() + end + return StatusLog(nil,"GetCoVar("..sShortName..", "..sMode.."): Missed mode") +end diff --git a/lua/weapons/gmod_tool/stools/trackassembly.lua b/lua/weapons/gmod_tool/stools/trackassembly.lua index 8a6236c..08ceb9a 100644 --- a/lua/weapons/gmod_tool/stools/trackassembly.lua +++ b/lua/weapons/gmod_tool/stools/trackassembly.lua @@ -1,1385 +1,1385 @@ ----------------- Localizing Libraries --------------- -local type = type -local pairs = pairs -local print = print -local Angle = Angle -local Color = Color -local Vector = Vector -local IsValid = IsValid -local tostring = tostring -local tonumber = tonumber -local LocalPlayer = LocalPlayer -local RunConsoleCommand = RunConsoleCommand -local RestoreCursorPosition = RestoreCursorPosition -local osDate = os and os.date -local vguiCreate = vgui and vgui.Create -local gameSinglePlayer = game and game.SinglePlayer -local utilTraceLine = util and util.TraceLine -local utilIsValidModel = util and util.IsValidModel -local utilPrecacheModel = util and util.PrecacheModel -local utilIsValidRagdoll = util and util.IsValidRagdoll -local utilGetPlayerTrace = util and util.GetPlayerTrace -local mathSqrt = math and math.sqrt -local mathClamp = math and math.Clamp -local mathFloor = math and math.floor -local entsCreate = ents and ents.Create -local entsCreateClientProp = ents and ents.CreateClientProp -local fileExists = file and file.Exists -local fileDelete = file and file.Delete -local stringLen = string and string.len -local stringRep = string and string.rep -local stringSub = string and string.sub -local stringGsub = string and string.gsub -local stringUpper = string and string.upper -local stringLower = string and string.lower -local stringExplode = string and string.Explode -local stringToFileName = string and string.GetFileFromFilename -local cleanupRegister = cleanup and cleanup.Register -local languageAdd = language and language.Add -local languageGetPhrase = language and language.GetPhrase -local concommandAdd = concommand and concommand.Add -local duplicatorRegisterEntityModifier = duplicator and duplicator.RegisterEntityModifier - ------------------ TOOL Global Parameters ---------------- ---- Because Vec[1] is actually faster than Vec.X ---- Store a pointer to our module -local asmlib = trackasmlib - ---- Vector Component indexes --- -local cvX, cvY, cvZ = asmlib.GetIndexes("V") - ---- Angle Component indexes --- -local caP, caY, caR = asmlib.GetIndexes("A") - ---- ZERO Objects -local VEC_ZERO = asmlib.GetOpVar("VEC_ZERO") -local ANG_ZERO = asmlib.GetOpVar("ANG_ZERO") - ---- Global References -local goToolScr -local goMonitor -local gnMaxMass = asmlib.GetOpVar("MAX_MASS") -local gnMaxOffLin = asmlib.GetOpVar("MAX_LINEAR") -local gnMaxOffRot = asmlib.GetOpVar("MAX_ROTATION") -local gsToolPrefL = asmlib.GetOpVar("TOOLNAME_PL") -local gsToolNameL = asmlib.GetOpVar("TOOLNAME_NL") -local gsToolPrefU = asmlib.GetOpVar("TOOLNAME_PU") -local gsToolNameU = asmlib.GetOpVar("TOOLNAME_NU") -local gsModeDataB = asmlib.GetOpVar("MODE_DATABASE") -local gsNameInitF = asmlib.GetOpVar("NAME_INIT") - gsNameInitF = stringUpper(stringSub(gsNameInitF,1,1))..stringSub(gsNameInitF,2,-1) -local gsNamePerpF = asmlib.GetOpVar("NAME_PERP") - gsNamePerpF = stringUpper(stringSub(gsNamePerpF,1,1))..stringSub(gsNamePerpF,2,-1) -local gsUndoPrefN = gsNameInitF..": " -local gsNoID = asmlib.GetOpVar("MISS_NOID") -- No such ID -local gsNoAV = asmlib.GetOpVar("MISS_NOAV") -- Not available -local gsNoMD = asmlib.GetOpVar("MISS_NOMD") -- No model -local gsSymRev = asmlib.GetOpVar("OPSYM_REVSIGN") -local gsSymDir = asmlib.GetOpVar("OPSYM_DIRECTORY") -local gsNoAnchor = gsNoID..gsSymRev..gsNoMD -local gsVersion = asmlib.GetOpVar("TOOL_VERSION") -local gnRatio = asmlib.GetOpVar("GOLDEN_RATIO") -local gsQueryStr = asmlib.GetOpVar("EN_QUERY_STORE") - ---- Render Base Colours -local conPalette = asmlib.MakeContainer("Colours") - conPalette:Insert("r" ,Color(255, 0 , 0 ,255)) - conPalette:Insert("g" ,Color( 0 ,255, 0 ,255)) - conPalette:Insert("b" ,Color( 0 , 0 ,255,255)) - conPalette:Insert("c" ,Color( 0 ,255,255,255)) - conPalette:Insert("m" ,Color(255, 0 ,255,255)) - conPalette:Insert("y" ,Color(255,255, 0 ,255)) - conPalette:Insert("w" ,Color(255,255,255,255)) - conPalette:Insert("k" ,Color( 0 , 0 , 0 ,255)) - conPalette:Insert("gh",Color(255,255,255,240)) -- self.GhostEntity - conPalette:Insert("tx",Color(80 ,80 ,80 ,255)) -- Panel mode names - conPalette:Insert("an",Color(180,255,150,255)) -- Selected anchor - conPalette:Insert("db",Color(220,164,52 ,255)) -- Database mode - -if(CLIENT) then - languageAdd("tool."..gsToolNameL..".category" , "Construction") - languageAdd("tool."..gsToolNameL..".name" , gsNameInitF.." "..gsNamePerpF) - languageAdd("tool."..gsToolNameL..".desc" , "Assembles a track for vehicles to run on") - languageAdd("tool."..gsToolNameL..".0" , "Left Click to continue the track, Right to change active position, Reload to remove a piece") - languageAdd("tool."..gsToolNameL..".tree" , "Select a piece to start/continue your track with by expanding a type and clicking on a node") - languageAdd("tool."..gsToolNameL..".phytype" , "Select physical properties type of the ones listed here") - languageAdd("tool."..gsToolNameL..".phyname" , "Select physical properties name to use when creating the track as this will affect the surface friction") - languageAdd("tool."..gsToolNameL..".bgskids" , "Selection code of comma delimited Bodygroup/Skin IDs > ENTER to accept, TAB to auto-fill from trace") - languageAdd("tool."..gsToolNameL..".mass" , "How heavy the piece spawned will be") - languageAdd("tool."..gsToolNameL..".activrad" , "Minimum distance needed to select an active point") - languageAdd("tool."..gsToolNameL..".count" , "Maximum number of pieces to create while stacking") - languageAdd("tool."..gsToolNameL..".ydegsnp" , "Snap the first piece spawned at this much degrees") - languageAdd("tool."..gsToolNameL..".resetvars", "Click to reset the additional values") - languageAdd("tool."..gsToolNameL..".nextpic" , "Additional origin angular pitch offset") - languageAdd("tool."..gsToolNameL..".nextyaw" , "Additional origin angular yaw offset") - languageAdd("tool."..gsToolNameL..".nextrol" , "Additional origin angular roll offset") - languageAdd("tool."..gsToolNameL..".nextx" , "Additional origin linear X offset") - languageAdd("tool."..gsToolNameL..".nexty" , "Additional origin linear Y offset") - languageAdd("tool."..gsToolNameL..".nextz" , "Additional origin linear Z offset") - languageAdd("tool."..gsToolNameL..".gravity" , "Controls the gravity on the piece spawned") - languageAdd("tool."..gsToolNameL..".weld" , "Creates welds between pieces or pieces/anchor") - languageAdd("tool."..gsToolNameL..".ignphysgn", "Ignores physics gun grab on the piece spawned/snapped/stacked") - languageAdd("tool."..gsToolNameL..".nocollide", "Puts a no-collide between pieces or pieces/anchor") - languageAdd("tool."..gsToolNameL..".freeze" , "Makes the piece spawn in a frozen state") - languageAdd("tool."..gsToolNameL..".igntype" , "Makes the tool ignore the different piece types on snapping/stacking") - languageAdd("tool."..gsToolNameL..".spnflat" , "The next piece will be spawned/snapped/stacked horizontally") - languageAdd("tool."..gsToolNameL..".mcspawn" , "Spawns the piece at the mass-centre, else spawns relative to the active point chosen") - languageAdd("tool."..gsToolNameL..".surfsnap" , "Snaps the piece to the surface the player is pointing at") - languageAdd("tool."..gsToolNameL..".adviser" , "Controls rendering the tool position/angle adviser") - languageAdd("tool."..gsToolNameL..".pntasist" , "Controls rendering the tool snap point assistant") - languageAdd("tool."..gsToolNameL..".ghosthold", "Controls rendering the tool ghosted holder piece") - languageAdd("cleanup."..gsToolNameL , "Undone assembly") - languageAdd("cleaned."..gsToolNameL.."s", "Cleaned up all Pieces") - concommandAdd(gsToolPrefL.."openframe", asmlib.GetActionCode("OPEN_FRAME")) - concommandAdd(gsToolPrefL.."resetvars", asmlib.GetActionCode("RESET_VARIABLES")) -end - -if(SERVER) then - cleanupRegister(gsToolNameU.."s") - duplicatorRegisterEntityModifier(gsToolPrefL.."dupe_phys_set",asmlib.GetActionCode("DUPE_PHYS_SETTINGS")) -end - -TOOL.Category = languageGetPhrase and languageGetPhrase("tool."..gsToolNameL..".category") -TOOL.Name = languageGetPhrase and languageGetPhrase("tool."..gsToolNameL..".name") -TOOL.Command = nil -- Command on click (nil for default) -TOOL.ConfigName = nil -- Configure file name (nil for default) - -TOOL.ClientConVar = { - [ "weld" ] = "1", - [ "mass" ] = "25000", - [ "model" ] = "models/props_phx/trains/tracks/track_1x.mdl", - [ "nextx" ] = "0", - [ "nexty" ] = "0", - [ "nextz" ] = "0", - [ "count" ] = "5", - [ "freeze" ] = "1", - [ "anchor" ] = gsNoAnchor, - [ "igntype" ] = "0", - [ "spnflat" ] = "0", - [ "ydegsnp" ] = "45", - [ "pointid" ] = "1", - [ "pnextid" ] = "2", - [ "nextpic" ] = "0", - [ "nextyaw" ] = "0", - [ "nextrol" ] = "0", - [ "logsmax" ] = "0", - [ "logfile" ] = "", - [ "mcspawn" ] = "0", - [ "bgskids" ] = "", - [ "gravity" ] = "1", - [ "adviser" ] = "1", - [ "activrad" ] = "50", - [ "pntasist" ] = "0", - [ "surfsnap" ] = "0", - [ "exportdb" ] = "0", - [ "offsetup" ] = "0", - [ "ignphysgn" ] = "0", - [ "ghosthold" ] = "1", - [ "maxstatts" ] = "3", - [ "nocollide" ] = "1", - [ "physmater" ] = "metal" -} - -function TOOL:GetModel() - return (self:GetClientInfo("model") or "") -end - -function TOOL:GetCount() - return mathClamp(self:GetClientNumber("count"),1,asmlib.GetCoVar("maxstcnt", "INT")) -end - -function TOOL:GetMass() - return mathClamp(self:GetClientNumber("mass"),1,gnMaxMass) -end - -function TOOL:GetDeveloperMode() - return asmlib.GetCoVar("devmode" ,"INT") -end - -function TOOL:GetPosOffsets() - return (mathClamp(self:GetClientNumber("nextx") or 0,-gnMaxOffLin,gnMaxOffLin)), - (mathClamp(self:GetClientNumber("nexty") or 0,-gnMaxOffLin,gnMaxOffLin)), - (mathClamp(self:GetClientNumber("nextz") or 0,-gnMaxOffLin,gnMaxOffLin)) -end - -function TOOL:GetAngOffsets() - return (mathClamp(self:GetClientNumber("nextpic") or 0,-gnMaxOffRot,gnMaxOffRot)), - (mathClamp(self:GetClientNumber("nextyaw") or 0,-gnMaxOffRot,gnMaxOffRot)), - (mathClamp(self:GetClientNumber("nextrol") or 0,-gnMaxOffRot,gnMaxOffRot)) -end - -function TOOL:GetOffsetUp() - return (self:GetClientNumber("offsetup") or 0) -end - -function TOOL:GetPointAssist() - return (self:GetClientNumber("pntasist") or 0) -end - -function TOOL:GetFreeze() - return (self:GetClientNumber("freeze") or 0) -end - -function TOOL:GetIgnoreType() - return (self:GetClientNumber("igntype") or 0) -end - -function TOOL:GetBodyGroupSkin() - return self:GetClientInfo("bgskids") or "" -end - -function TOOL:GetGravity() - return (self:GetClientNumber("gravity") or 0) -end - -function TOOL:GetGhostHolder() - return (self:GetClientNumber("ghosthold") or 0) -end - -function TOOL:GetNoCollide() - return (self:GetClientNumber("nocollide") or 0) -end - -function TOOL:GetSpawnFlat() - return (self:GetClientNumber("spnflat") or 0) -end - -function TOOL:GetExportDB() - return (self:GetClientNumber("exportdb") or 0) -end - -function TOOL:GetLogLines() - return (self:GetClientNumber("logsmax") or 0) -end - -function TOOL:GetLogFile() - return (self:GetClientInfo("logfile") or "") -end - -function TOOL:GetAdviser() - return (self:GetClientNumber("adviser") or 0) -end - -function TOOL:GetPointID() - return (self:GetClientNumber("pointid") or 1), - (self:GetClientNumber("pnextid") or 2) -end - -function TOOL:GetActiveRadius() - return mathClamp(self:GetClientNumber("activrad") or 1,1,asmlib.GetCoVar("maxactrad", "FLT")) -end - -function TOOL:GetYawSnap() - return mathClamp(self:GetClientNumber("ydegsnp"),0,gnMaxOffRot) -end - -function TOOL:GetWeld() - return (self:GetClientNumber("weld") or 0) -end - -function TOOL:GetIgnorePhysgun() - return (self:GetClientNumber("ignphysgn") or 0) -end - -function TOOL:GetSpawnMC() - return self:GetClientNumber("mcspawn") or 0 -end - -function TOOL:GetStackAttempts() - return (mathClamp(self:GetClientNumber("maxstaatts"),1,5)) -end - -function TOOL:GetPhysMeterial() - return (self:GetClientInfo("physmater") or "metal") -end - -function TOOL:GetBoundErrorMode() - return asmlib.GetCoVar("bnderrmod" ,"STR") -end - -function TOOL:GetSurfaceSnap() - return (self:GetClientNumber("surfsnap") or 0) -end - -function TOOL:SetAnchor(stTrace) - self:ClearAnchor() - if(not stTrace) then return asmlib.StatusLog(false,"TOOL:SetAnchor(): Trace invalid") end - if(not stTrace.Hit) then return asmlib.StatusLog(false,"TOOL:SetAnchor(): Trace not hit") end - local trEnt = stTrace.Entity - if(not (trEnt and trEnt:IsValid())) then return asmlib.StatusLog(false,"TOOL:SetAnchor(): Trace no entity") end - local phEnt = trEnt:GetPhysicsObject() - if(not (phEnt and phEnt:IsValid())) then return asmlib.StatusLog(false,"TOOL:SetAnchor(): Trace no physics") end - local plPly = self:GetOwner() - if(not (plPly and plPly:IsValid())) then return asmlib.StatusLog(false,"TOOL:SetAnchor(): Player invalid") end - local sAnchor = trEnt:EntIndex()..gsSymRev..stringToFileName(trEnt:GetModel()) - trEnt:SetRenderMode(RENDERMODE_TRANSALPHA) - trEnt:SetColor(conPalette:Select("an")) - self:SetObject(1,trEnt,stTrace.HitPos,phEnt,stTrace.PhysicsBone,stTrace.HitNormal) - asmlib.ConCommandPly(plPly,"anchor",sAnchor) - asmlib.PrintNotifyPly(plPly,"Anchor: Set "..sAnchor.." !","UNDO") - return asmlib.StatusLog(true,"TOOL:SetAnchor("..sAnchor..")") -end - -function TOOL:ClearAnchor() - local svEnt = self:GetEnt(1) - local plPly = self:GetOwner() - if(svEnt and svEnt:IsValid()) then - svEnt:SetRenderMode(RENDERMODE_TRANSALPHA) - svEnt:SetColor(conPalette:Select("w")) - end - self:ClearObjects() - asmlib.PrintNotifyPly(plPly,"Anchor: Cleaned !","CLEANUP") - asmlib.ConCommandPly(plPly,"anchor",gsNoAnchor) - return asmlib.StatusLog(true,"TOOL:ClearAnchor(): Anchor cleared") -end - -function TOOL:GetAnchor() - local svEnt = self:GetEnt(1) - if(not (svEnt and svEnt:IsValid())) then svEnt = nil end - return (self:GetClientInfo("anchor") or gsNoAnchor), svEnt -end - -function TOOL:GetStatus(stTrace,anyMessage,hdEnt) - local sDelim = "\n" - local iCurLog = asmlib.GetOpVar("LOG_CURLOGS") - local sFleLog = asmlib.GetOpVar("LOG_LOGFILE") - local iMaxlog = asmlib.GetOpVar("LOG_MAXLOGS") - local sSpace = stringRep(" ",6 + stringLen(tostring(iMaxlog))) - local ply = self:GetOwner() - local plyKeys = asmlib.LoadKeyPly(ply,"DEBUG") - local aninfo , anEnt = self:GetAnchor() - local pointid, pnextid = self:GetPointID() - local nextx , nexty , nextz = self:GetPosOffsets() - local nextpic, nextyaw, nextrol = self:GetAngOffsets() - local hdModel, trModel, trRec = self:GetModel() - local hdRec = asmlib.CacheQueryPiece(hdModel) - if(stTrace and stTrace.Entity and stTrace.Entity:IsValid()) then - trModel = stTrace.Entity:GetModel() - trRec = asmlib.CacheQueryPiece(trModel) - end - local sDu = "" - sDu = sDu..tostring(anyMessage)..sDelim - sDu = sDu..sSpace.."Dumping logs state:"..sDelim - sDu = sDu..sSpace.." LogsMax: <"..tostring(iMaxlog)..">"..sDelim - sDu = sDu..sSpace.." LogsCur: <"..tostring(iCurLog)..">"..sDelim - sDu = sDu..sSpace.." LogFile: <"..tostring(sFleLog)..">"..sDelim - sDu = sDu..sSpace.."Dumping player keys:"..sDelim - sDu = sDu..sSpace.." Player: "..stringGsub(tostring(ply),"Player%s","")..sDelim - sDu = sDu..sSpace.." IN.USE: <"..tostring(plyKeys["USE"])..">"..sDelim - sDu = sDu..sSpace.." IN.DUCK: <"..tostring(plyKeys["DUCK"])..">"..sDelim - sDu = sDu..sSpace.." IN.SPEED: <"..tostring(plyKeys["SPEED"])..">"..sDelim - sDu = sDu..sSpace.." IN.RELOAD: <"..tostring(plyKeys["RELOAD"])..">"..sDelim - sDu = sDu..sSpace.." IN.SCORE: <"..tostring(plyKeys["SCORE"])..">"..sDelim - sDu = sDu..sSpace.."Dumping trace data state:"..sDelim - sDu = sDu..sSpace.." Trace: <"..tostring(stTrace)..">"..sDelim - sDu = sDu..sSpace.." TR.Hit: <"..tostring(stTrace and stTrace.Hit or gsNoAV)..">"..sDelim - sDu = sDu..sSpace.." TR.HitW: <"..tostring(stTrace and stTrace.HitWorld or gsNoAV)..">"..sDelim - sDu = sDu..sSpace.." TR.ENT: <"..tostring(stTrace and stTrace.Entity or gsNoAV)..">"..sDelim - sDu = sDu..sSpace.." TR.Model: <"..tostring(trModel or gsNoAV)..">["..tostring(trRec and trRec.Kept or gsNoID).."]"..sDelim - sDu = sDu..sSpace.." TR.File: <"..stringToFileName(tostring(trModel or gsNoAV))..">"..sDelim - sDu = sDu..sSpace.."Dumping console variables state:"..sDelim - sDu = sDu..sSpace.." HD.Entity: {"..tostring(hdEnt or gsNoAV).."}"..sDelim - sDu = sDu..sSpace.." HD.Model: <"..tostring(hdModel or gsNoAV)..">["..tostring(hdRec and hdRec.Kept or gsNoID).."]"..sDelim - sDu = sDu..sSpace.." HD.File: <"..stringToFileName(tostring(hdModel or gsNoAV))..">"..sDelim - sDu = sDu..sSpace.." HD.Weld: <"..tostring(self:GetWeld())..">"..sDelim - sDu = sDu..sSpace.." HD.Mass: <"..tostring(self:GetMass())..">"..sDelim - sDu = sDu..sSpace.." HD.StackCNT: <"..tostring(self:GetCount())..">"..sDelim - sDu = sDu..sSpace.." HD.Freeze: <"..tostring(self:GetFreeze())..">"..sDelim - sDu = sDu..sSpace.." HD.SpawnMC: <"..tostring(self:GetSpawnMC())..">"..sDelim - sDu = sDu..sSpace.." HD.YawSnap: <"..tostring(self:GetYawSnap())..">"..sDelim - sDu = sDu..sSpace.." HD.Gravity: <"..tostring(self:GetGravity())..">"..sDelim - sDu = sDu..sSpace.." HD.Adviser: <"..tostring(self:GetAdviser())..">"..sDelim - sDu = sDu..sSpace.." HD.OffsetUp: <"..tostring(self:GetOffsetUp())..">"..sDelim - sDu = sDu..sSpace.." HD.ExportDB: <"..tostring(self:GetExportDB())..">"..sDelim - sDu = sDu..sSpace.." HD.NoCollide: <"..tostring(self:GetNoCollide())..">"..sDelim - sDu = sDu..sSpace.." HD.SpawnFlat: <"..tostring(self:GetSpawnFlat())..">"..sDelim - sDu = sDu..sSpace.." HD.IgnoreType: <"..tostring(self:GetIgnoreType())..">"..sDelim - sDu = sDu..sSpace.." HD.SurfSnap: <"..tostring(self:GetSurfaceSnap())..">"..sDelim - sDu = sDu..sSpace.." HD.PntAssist: <"..tostring(self:GetPointAssist())..">"..sDelim - sDu = sDu..sSpace.." HD.GhostHold: <"..tostring(self:GetGhostHolder())..">"..sDelim - sDu = sDu..sSpace.." HD.PhysMeter: <"..tostring(self:GetPhysMeterial())..">"..sDelim - sDu = sDu..sSpace.." HD.ActRadius: <"..tostring(self:GetActiveRadius())..">"..sDelim - sDu = sDu..sSpace.." HD.SkinBG: <"..tostring(self:GetBodyGroupSkin())..">"..sDelim - sDu = sDu..sSpace.." HD.StackAtempt: <"..tostring(self:GetStackAttempts())..">"..sDelim - sDu = sDu..sSpace.." HD.IgnorePG: <"..tostring(self:GetIgnorePhysgun())..">"..sDelim - sDu = sDu..sSpace.." HD.MaxARadius: <"..tostring(asmlib.GetCoVar("maxactrad","INT"))..">"..sDelim - sDu = sDu..sSpace.." HD.EnableWire: <"..tostring(asmlib.GetCoVar("enwiremod","INT"))..">"..sDelim - sDu = sDu..sSpace.." HD.DevelopMode: <"..tostring(asmlib.GetCoVar("devmode" ,"INT"))..">"..sDelim - sDu = sDu..sSpace.." HD.MaxStackCnt: <"..tostring(asmlib.GetCoVar("maxstcnt" ,"INT"))..">"..sDelim - sDu = sDu..sSpace.." HD.BoundErrMod: <"..tostring(asmlib.GetCoVar("bnderrmod","STR"))..">"..sDelim - sDu = sDu..sSpace.." HD.ModDataBase: <"..gsModeDataB..","..tostring(asmlib.GetCoVar("modedb" ,"STR"))..">"..sDelim - sDu = sDu..sSpace.." HD.EnableStore: <"..tostring(gsQueryStr)..","..tostring(asmlib.GetCoVar("enqstore","INT"))..">"..sDelim - sDu = sDu..sSpace.." HD.TimerMode: <"..tostring(asmlib.GetCoVar("timermode","STR"))..">"..sDelim - sDu = sDu..sSpace.." HD.Anchor: {"..tostring(anEnt or gsNoAV).."}<"..tostring(aninfo)..">"..sDelim - sDu = sDu..sSpace.." HD.PointID: ["..tostring(pointid).."] >> ["..tostring(pnextid).."]"..sDelim - sDu = sDu..sSpace.." HD.AngOffsets: ["..tostring(nextx)..","..tostring(nexty)..","..tostring(nextz).."]"..sDelim - sDu = sDu..sSpace.." HD.PosOffsets: ["..tostring(nextpic)..","..tostring(nextyaw)..","..tostring(nextrol).."]"..sDelim - if(hdEnt and hdEnt:IsValid()) then hdEnt:Remove() end - return sDu -end - -function TOOL:LeftClick(stTrace) - if(CLIENT) then - return asmlib.StatusLog(true,"TOOL:LeftClick(): Working on client") end - if(not stTrace) then - return asmlib.StatusLog(false,"TOOL:LeftClick(): Trace missing") end - if(not stTrace.Hit) then - return asmlib.StatusLog(false,"TOOL:LeftClick(): Trace not hit") end - local trEnt = stTrace.Entity - local weld = self:GetWeld() - local mass = self:GetMass() - local model = self:GetModel() - local count = self:GetCount() - local ply = self:GetOwner() - local freeze = self:GetFreeze() - local mcspawn = self:GetSpawnMC() - local ydegsnp = self:GetYawSnap() - local gravity = self:GetGravity() - local offsetup = self:GetOffsetUp() - local nocollide = self:GetNoCollide() - local spnflat = self:GetSpawnFlat() - local igntype = self:GetIgnoreType() - local surfsnap = self:GetSurfaceSnap() - local physmater = self:GetPhysMeterial() - local actrad = self:GetActiveRadius() - local bgskids = self:GetBodyGroupSkin() - local staatts = self:GetStackAttempts() - local ignphysgn = self:GetIgnorePhysgun() - local bnderrmod = self:GetBoundErrorMode() - local fnmodel = stringToFileName(model) - local aninfo , anEnt = self:GetAnchor() - local pointid, pnextid = self:GetPointID() - local nextx , nexty , nextz = self:GetPosOffsets() - local nextpic, nextyaw, nextrol = self:GetAngOffsets() - asmlib.LoadKeyPly(ply) - if(stTrace.HitWorld) then -- Spawn it on the map ... - local ePiece = asmlib.MakePiece(model,stTrace.HitPos,ANG_ZERO,mass,bgskids,conPalette:Select("w")) - if(ePiece) then - local aAng = asmlib.GetNormalAngle(ply,stTrace,surfsnap,ydegsnp) - if(mcspawn ~= 0) then - ePiece:SetAngles(aAng) - local vCen = asmlib.GetCenterMC(ePiece) - local vOBB = ePiece:OBBMins() - vCen:Add(stTrace.HitPos) - vCen:Add(offsetup * stTrace.HitNormal) - vCen:Add(nextx * aAng:Forward()) - vCen:Add(nexty * aAng:Right()) - vCen:Add(nextz * aAng:Up()) - aAng:RotateAroundAxis(aAng:Up() ,-nextyaw) - aAng:RotateAroundAxis(aAng:Right() , nextpic) - aAng:RotateAroundAxis(aAng:Forward(), nextrol) - ePiece:SetAngles(aAng) - if(not asmlib.SetBoundPos(ePiece,vCen,ply,bnderrmod)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(World): Bound position invalid",ePiece)) end - else -- Spawn on Active point - local stSpawn = asmlib.GetNormalSpawn(stTrace.HitPos + offsetup * stTrace.HitNormal,aAng,model, - pointid,nextx,nexty,nextz,nextpic,nextyaw,nextrol) - if(not stSpawn) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(World): No spawn data",ePiece)) end - ePiece:SetAngles(stSpawn.SAng) - if(not asmlib.SetBoundPos(ePiece,stSpawn.SPos,ply,bnderrmod)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(World): Bound position invalid",ePiece)) end - end - if(not asmlib.ApplyPhysicalSettings(ePiece,ignphysgn,freeze,gravity,physmater)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(World): Failed to apply physical settings",ePiece)) end - if(not asmlib.ApplyPhysicalAnchor(ePiece,anEnt,weld,nocollide)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(World): Failed to apply physical anchor",ePiece)) end - asmlib.UndoCratePly(gsUndoPrefN..fnmodel.." ( World spawn )") - asmlib.UndoAddEntityPly(ePiece) - asmlib.UndoFinishPly(ply) - return asmlib.StatusLog(true,"TOOL:LeftClick(World): Success hit world") - end - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(World): Failed to create")) - end - - if(not (trEnt and trEnt:IsValid())) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Prop): Trace entity invalid")) end - if(asmlib.IsOther(trEnt)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Prop): Trace is other type of object")) end - if(not asmlib.IsPhysTrace(stTrace)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Prop): Trace is not physical object")) end - - local trModel = trEnt:GetModel() - local fntrmod = stringToFileName(trModel) - - -- No need stacking relative to non-persistent props or using them... - local trRec = asmlib.CacheQueryPiece(trModel) - local hdRec = asmlib.CacheQueryPiece(model) - - if(not trRec) then return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Prop): Trace model not a piece")) end - - if(asmlib.LoadKeyPly(ply,"DUCK")) then - -- IN_DUCK: Use the VALID stTrace.Entity as a piece - asmlib.PrintNotifyPly(ply,"Model: "..fntrmod.." selected !","UNDO") - asmlib.ConCommandPly(ply,"model",trModel) - asmlib.ConCommandPly(ply,"pointid",1) - asmlib.ConCommandPly(ply,"pnextid",2) - return asmlib.StatusLog(true,"TOOL:LeftClick(Select): New piece <"..trModel.."> success") - end - - if(not hdRec) then return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Prop): Holder model not a piece")) end - - local stSpawn = asmlib.GetEntitySpawn(trEnt,stTrace.HitPos,model,pointid, - actrad,spnflat,igntype,nextx,nexty,nextz,nextpic,nextyaw,nextrol) - if(not stSpawn) then -- Not aiming into an active point update properties - if(asmlib.LoadKeyPly(ply,"USE")) then -- Physical - if(not asmlib.ApplyPhysicalSettings(trEnt,ignphysgn,freeze,gravity,physmater)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Physical): Failed to apply physical settings",ePiece)) end - print(trEnt,anEnt) - if(not asmlib.ApplyPhysicalAnchor(trEnt,anEnt,weld,nocollide)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Physical): Failed to apply physical anchor",ePiece)) end - trEnt:GetPhysicsObject():SetMass(mass) - return asmlib.StatusLog(true,"TOOL:LeftClick(Physical): Success") - else -- Visual - local IDs = stringExplode(gsSymDir,bgskids) - if(not asmlib.AttachBodyGroups(trEnt,IDs[1] or "")) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Bodygroup/Skin): Failed")) end - trEnt:SetSkin(mathClamp(tonumber(IDs[2]) or 0,0,trEnt:SkinCount()-1)) - return asmlib.StatusLog(true,"TOOL:LeftClick(Bodygroup/Skin): Success") - end - end - - if(asmlib.LoadKeyPly(ply,"SPEED") and hdRec.Kept > 1) then -- IN_SPEED: Switch the tool mode ( Stacking ) - if(count <= 0) then return asmlib.StatusLog(false,self:GetStatus(stTrace,"Stack count not properly picked")) end - if(pointid == pnextid) then return asmlib.StatusLog(false,self:GetStatus(stTrace,"Point ID overlap")) end - local ePieceO, ePieceN - local iNdex, iTrys = 1, staatts - local vTemp, trPos = Vector(), trEnt:GetPos() - local hdOffs = asmlib.LocatePOA(stSpawn.HRec,pnextid) - if(not hdOffs) then - asmlib.PrintNotifyPly(ply,"Cannot find next PointID !","ERROR") - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Stack): Missing next point ID")) - end -- Validate existent next point ID - asmlib.UndoCratePly(gsUndoPrefN..fnmodel.." ( Stack #"..tostring(count).." )") - while(iNdex <= count) do - local sIterat = "["..tostring(iNdex).."]" - ePieceN = asmlib.MakePiece(model,trPos,ANG_ZERO,mass,bgskids,conPalette:Select("w")) - if(ePieceN) then - ePieceN:SetAngles(stSpawn.SAng) - if(not asmlib.SetBoundPos(ePieceN,stSpawn.SPos,ply,bnderrmod)) then - asmlib.UndoFinishPly(ply,sIterat) -- Make it shoot but throw the error - return asmlib.StatusLog(true,self:GetStatus(stTrace,"TOOL:LeftClick(Stack)"..sIterat..": Position irrelevant")) - end -- Set position is valid - if(not asmlib.ApplyPhysicalSettings(ePieceN,ignphysgn,freeze,gravity,physmater)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Stack)"..sIterat..": Apply physical settings failed")) end - if(not asmlib.ApplyPhysicalAnchor(ePieceN,(anEnt or ePieceO),weld,nil)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Stack)"..sIterat..": Apply weld failed")) end - if(not asmlib.ApplyPhysicalAnchor(ePieceN,ePieceO,nil,nocollide)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Stack)"..sIterat..": Apply no-collide failed")) end - asmlib.SetVector(vTemp,hdOffs.P) - vTemp:Rotate(stSpawn.SAng) - vTemp:Add(ePieceN:GetPos()) - asmlib.UndoAddEntityPly(ePieceN) - stSpawn = asmlib.GetEntitySpawn(ePieceN,vTemp,model,pointid, - actrad,spnflat,igntype,nextx,nexty,nextz,nextpic,nextyaw,nextrol) - if(not stSpawn) then - asmlib.PrintNotifyPly(ply,"Cannot obtain spawn data!","ERROR") - asmlib.UndoFinishPly(ply,sIterat) - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Stack)"..sIterat..": Stacking has invalid user data")) - end -- Spawn data is valid for the current iteration iNdex - ePieceO = ePieceN - iNdex = iNdex + 1 - iTrys = staatts - else - iTrys = iTrys - 1 - end - if(iTrys <= 0) then - asmlib.PrintNotifyPly(ply,"Spawn attempts ran off!","ERROR") - asmlib.UndoFinishPly(ply,sIterat) - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Stack)"..sIterat..": Allocate memory failed")) - end -- We still have enough memory to preform the stacking - if(hdRec.Kept == 1) then - asmlib.LogInstance("TOOL:LeftClick(Stack)"..sIterat..": Player "..ply:GetName() - .." tried to stack a piece <"..fnmodel.."> with only one active point") - break -- If holder's model has only one point, we cannot stack - end - end - asmlib.UndoFinishPly(ply) - return asmlib.StatusLog(true,"TOOL:LeftClick(Stack): Success stacking") - else - local ePiece = asmlib.MakePiece(model,stTrace.HitPos,ANG_ZERO,mass,bgskids,conPalette:Select("w")) - if(ePiece) then - ePiece:SetAngles(stSpawn.SAng) - if(not asmlib.SetBoundPos(ePiece,stSpawn.SPos,ply,bnderrmod)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Snap): Position irrelevant")) end - if(not asmlib.ApplyPhysicalSettings(ePiece,ignphysgn,freeze,gravity,physmater)) then - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Snap): Apply physical settings failed")) end - if(not asmlib.ApplyPhysicalAnchor(ePiece,(anEnt or trEnt),weld,nil)) then -- Weld all created to the anchor/previous - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Snap): Apply weld failed")) end - if(not asmlib.ApplyPhysicalAnchor(ePiece,trEnt,nil,nocollide)) then -- NoCollide all to previous - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Snap): Apply no-collide failed")) end - asmlib.UndoCratePly(gsUndoPrefN..fnmodel.." ( Snap prop )") - asmlib.UndoAddEntityPly(ePiece) - asmlib.UndoFinishPly(ply) - return asmlib.StatusLog(true,"TOOL:LeftClick(Snap): Success") - end - return asmlib.StatusLog(false,self:GetStatus(stTrace,"TOOL:LeftClick(Snap): Crating piece failed")) - end -end - ---[[ - * If tells what will happen if the RightClick of the mouse is pressed - * Changes the active point chosen by the holder -]]-- -function TOOL:RightClick(stTrace) - if(CLIENT) then return asmlib.StatusLog(true,"TOOL:RightClick(): Working on client") end - if(not stTrace) then return asmlib.StatusLog(false,"TOOL:RightClick(): Trace missing") end - local ply = self:GetOwner() - local model = self:GetModel() - local hdRec = asmlib.CacheQueryPiece(model) - if(not hdRec) then - return asmlib.StatusLog(false,"TOOL:RightClick(): Model <"..model.."> not a piece") end - local pointid, pnextid = self:GetPointID() - local pointbu = pointid - asmlib.LoadKeyPly(ply) - if(stTrace.HitWorld and asmlib.LoadKeyPly(ply,"USE")) then - asmlib.ConCommandPly(ply,"openframe",asmlib.GetCoVar("maxfruse" ,"INT")) - return asmlib.StatusLog(true,"TOOL:RightClick(World): Success open frame") - end - if(asmlib.LoadKeyPly(ply,"DUCK")) then -- Crouch ( Ctrl ) - if(asmlib.LoadKeyPly(ply,"SPEED")) then -- Run ( Left Shift ) - pnextid = asmlib.IncDecPnextID(pnextid,pointid,"-",hdRec) - else - pnextid = asmlib.IncDecPnextID(pnextid,pointid,"+",hdRec) - end - else -- Not Crouch ( Ctrl ) - if(asmlib.LoadKeyPly(ply,"SPEED")) then -- Run ( Left Shift ) - pointid = asmlib.IncDecPointID(pointid,"-",hdRec) - else - pointid = asmlib.IncDecPointID(pointid,"+",hdRec) - end - end - if(pointid == pnextid) then - pnextid = pointbu - end - asmlib.ConCommandPly(ply,"pnextid",pnextid) - asmlib.ConCommandPly(ply,"pointid",pointid) - return asmlib.StatusLog(true,"TOOL:RightClick(): Success") -end - -function TOOL:Reload(stTrace) - if(CLIENT) then return asmlib.StatusLog(true,"TOOL:Reload(): Working on client") end - if(not stTrace) then return asmlib.StatusLog(false,"TOOL:Reload(): Invalid trace") end - local ply = self:GetOwner() - local trEnt = stTrace.Entity - asmlib.LoadKeyPly(ply) - if(stTrace.HitWorld) then - if(asmlib.LoadKeyPly(ply,"SPEED")) then self:ClearAnchor() end - asmlib.SetLogControl(self:GetLogLines(),self:GetLogFile()) - if(self:GetExportDB() ~= 0) then - asmlib.LogInstance("TOOL:Reload(World): Exporting DB") - asmlib.StoreExternalDatabase("PIECES",",","INS") - asmlib.StoreExternalDatabase("ADDITIONS",",","INS") - asmlib.StoreExternalDatabase("PHYSPROPERTIES",",","INS") - asmlib.StoreExternalDatabase("PIECES","\t","DSV") - asmlib.StoreExternalDatabase("ADDITIONS","\t","DSV") - asmlib.StoreExternalDatabase("PHYSPROPERTIES","\t","DSV") - end - return asmlib.StatusLog(true,"TOOL:Reload(World): Success") - elseif(trEnt and trEnt:IsValid()) then - if(not asmlib.IsPhysTrace(stTrace)) then return false end - if(asmlib.IsOther(trEnt)) then return false end - if(asmlib.LoadKeyPly(ply,"SPEED")) then - self:SetAnchor(stTrace) - return asmlib.StatusLog(true,"TOOL:Reload(Prop): Anchor set") - end - local trRec = asmlib.CacheQueryPiece(trEnt:GetModel()) - if(asmlib.IsExistent(trRec)) then - trEnt:Remove() - return asmlib.StatusLog(true,"TOOL:Reload(Prop): Removed a piece") - end - end - return false -end - -function TOOL:Holster() - self:ReleaseGhostEntity() - if(self.GhostEntity and self.GhostEntity:IsValid()) then self.GhostEntity:Remove() end -end - -function TOOL:DrawHUD() - if(SERVER) then return end - if(not goMonitor) then - goMonitor = asmlib.MakeScreen(0,0, - surface.ScreenWidth(), - surface.ScreenHeight(),conPalette) - if(not goMonitor) then - return asmlib.StatusPrint(nil,"DrawHUD: Invalid screen") - end - goMonitor:SetFont("Trebuchet24") - end - local adv = self:GetAdviser() - if(adv == 0) then return end - local ply = LocalPlayer() - local stTrace = ply:GetEyeTrace() - if(not stTrace) then return end - local ratioc = (gnRatio - 1) * 100 - local ratiom = (gnRatio * 1000) - local plyd = (stTrace.HitPos - ply:GetPos()):Length() - local trEnt = stTrace.Entity - local model = self:GetModel() - local pointid, pnextid = self:GetPointID() - local nextx, nexty, nextz = self:GetPosOffsets() - local nextpic, nextyaw, nextrol = self:GetAngOffsets() - if(trEnt and trEnt:IsValid()) then - if(asmlib.IsOther(trEnt)) then return end - local actrad = self:GetActiveRadius() - local igntype = self:GetIgnoreType() - local spnflat = self:GetSpawnFlat() - local stSpawn = asmlib.GetEntitySpawn(trEnt,stTrace.HitPos,model,pointid, - actrad,spnflat,igntype,nextx,nexty,nextz,nextpic,nextyaw,nextrol) - if(not stSpawn) then - if(self:GetPointAssist() == 0) then return end - local trRec = asmlib.CacheQueryPiece(trEnt:GetModel()) - if(not trRec) then return end - local ID, O, R = 1, Vector(), (actrad * ply:GetRight()) - while(ID <= trRec.Kept) do - local stPOA = asmlib.LocatePOA(trRec,ID) - if(not stPOA) then - return asmlib.StatusLog(nil,"DrawHUD: Cannot assist point #"..tostring(ID)) end - asmlib.SetVector(O,stPOA.O) - O:Rotate(trEnt:GetAngles()) - O:Add(trEnt:GetPos()) - local Op = O:ToScreen() - O:Add(R); ID = ID + 1 - local Rp = O:ToScreen() - local mX = (Rp.x - Op.x); mX = mX * mX - local mY = (Rp.y - Op.y); mY = mY * mY - local mR = mathSqrt(mX + mY) - goMonitor:DrawCircle(Op, mR,"y","LIN",{250}) - end; return - end - stSpawn.F:Mul(30) - stSpawn.F:Add(stSpawn.OPos) - stSpawn.R:Mul(30) - stSpawn.R:Add(stSpawn.OPos) - stSpawn.U:Mul(30) - stSpawn.U:Add(stSpawn.OPos) - local RadScale = mathClamp((ratiom / plyd) * (stSpawn.RLen / actrad),1,ratioc) - local Os = stSpawn.OPos:ToScreen() - local Ss = stSpawn.SPos:ToScreen() - local Xs = stSpawn.F:ToScreen() - local Ys = stSpawn.R:ToScreen() - local Zs = stSpawn.U:ToScreen() - local Pp = stSpawn.TPnt:ToScreen() - local Tp = stTrace.HitPos:ToScreen() - if(asmlib.LocatePOA(stSpawn.HRec,pnextid) and stSpawn.HRec.Kept > 1) then - local vNext = Vector() - asmlib.SetVector(vNext,stSpawn.HRec.Offs[pnextid].O) - vNext:Rotate(stSpawn.SAng) - vNext:Add(stSpawn.SPos) - local Np = vNext:ToScreen() - -- Draw Next Point - goMonitor:DrawLine(Os,Np,"g") - goMonitor:DrawCircle(Np, RadScale / 2, "g") - end - -- Draw Elements - goMonitor:DrawLine(Os,Xs,"r") - goMonitor:DrawLine(Os,Pp) - goMonitor:DrawCircle(Pp, RadScale / 2) - goMonitor:DrawLine(Os,Ys,"g") - goMonitor:DrawLine(Os,Zs,"b") - goMonitor:DrawCircle(Os, RadScale,"y") - goMonitor:DrawLine(Os,Tp) - goMonitor:DrawCircle(Tp, RadScale / 2) - goMonitor:DrawLine(Os,Ss,"m") - goMonitor:DrawCircle(Ss, RadScale,"c") - if(self:GetDeveloperMode() == 0) then return end - local x,y = goMonitor:GetCenter(10,10) - goMonitor:SetTextEdge(x,y) - goMonitor:DrawText("Act Rad: "..tostring(stSpawn.RLen),"k") - goMonitor:DrawText("Org POS: "..tostring(stSpawn.OPos)) - goMonitor:DrawText("Org ANG: "..tostring(stSpawn.OAng)) - goMonitor:DrawText("Mod POS: "..tostring(stSpawn.HPos)) - goMonitor:DrawText("Mod ANG: "..tostring(stSpawn.HAng)) - goMonitor:DrawText("Spn POS: "..tostring(stSpawn.SPos)) - goMonitor:DrawText("Spn ANG: "..tostring(stSpawn.SAng)) - elseif(stTrace.HitWorld) then - local offsetup = self:GetOffsetUp() - local mcspawn = self:GetSpawnMC() - local ydegsnp = self:GetYawSnap() - local surfsnap = self:GetSurfaceSnap() - local RadScale = mathClamp(ratiom / plyd,1,ratioc) - local aAng = asmlib.GetNormalAngle(ply,stTrace,surfsnap,ydegsnp) - if(mcspawn ~= 0) then -- Relative to MC - local vPos = Vector() - vPos:Set(stTrace.HitPos + offsetup * stTrace.HitNormal) - vPos:Add(nextx * aAng:Forward()) - vPos:Add(nexty * aAng:Right()) - vPos:Add(nextz * aAng:Up()) - aAng:RotateAroundAxis(aAng:Up() ,-nextyaw) - aAng:RotateAroundAxis(aAng:Right() , nextpic) - aAng:RotateAroundAxis(aAng:Forward(), nextrol) - local F = aAng:Forward() - F:Mul(30) - F:Add(vPos) - local R = aAng:Right() - R:Mul(30) - R:Add(vPos) - local U = aAng:Up() - U:Mul(30) - U:Add(vPos) - local Os = vPos:ToScreen() - local Xs = F:ToScreen() - local Ys = R:ToScreen() - local Zs = U:ToScreen() - local Tp = stTrace.HitPos:ToScreen() - goMonitor:DrawLine(Os,Xs,"r") - goMonitor:DrawLine(Os,Ys,"g") - goMonitor:DrawLine(Os,Zs,"b") - goMonitor:DrawLine(Os,Tp,"y") - goMonitor:DrawCircle(Tp, RadScale / 2) - goMonitor:DrawCircle(Os, RadScale) - if(self:GetDeveloperMode() == 0) then return end - local x,y = goMonitor:GetCenter(10,10) - goMonitor:SetTextEdge(x,y) - goMonitor:DrawText("Org POS: "..tostring(vPos),"k") - goMonitor:DrawText("Org ANG: "..tostring(aAng)) - else -- Relative to the active Point - if(not (pointid > 0 and pnextid > 0)) then return end - local stSpawn = asmlib.GetNormalSpawn(stTrace.HitPos + offsetup * stTrace.HitNormal,aAng,model, - pointid,nextx,nexty,nextz,nextpic,nextyaw,nextrol) - if(not stSpawn) then return end - stSpawn.F:Mul(30) - stSpawn.F:Add(stSpawn.OPos) - stSpawn.R:Mul(30) - stSpawn.R:Add(stSpawn.OPos) - stSpawn.U:Mul(30) - stSpawn.U:Add(stSpawn.OPos) - local Os = stSpawn.OPos:ToScreen() - local Ss = stSpawn.SPos:ToScreen() - local Xs = stSpawn.F:ToScreen() - local Ys = stSpawn.R:ToScreen() - local Zs = stSpawn.U:ToScreen() - local Pp = stSpawn.HPnt:ToScreen() - local Tp = stTrace.HitPos:ToScreen() - if(stSpawn.HRec.Kept > 1 and stSpawn.HRec.Offs[pnextid]) then - local vNext = Vector() - asmlib.SetVector(vNext,stSpawn.HRec.Offs[pnextid].O) - vNext:Rotate(stSpawn.SAng) - vNext:Add(stSpawn.SPos) - local Np = vNext:ToScreen() - -- Draw Next Point - goMonitor:DrawLine(Os,Np,"g") - goMonitor:DrawCircle(Np,RadScale / 2) - end - -- Draw Elements - goMonitor:DrawLine(Os,Xs,"r") - goMonitor:DrawLine(Os,Pp) - goMonitor:DrawCircle(Pp, RadScale / 2) - goMonitor:DrawLine(Os,Ys,"g") - goMonitor:DrawLine(Os,Zs,"b") - goMonitor:DrawLine(Os,Ss,"m") - goMonitor:DrawCircle(Ss, RadScale, "c") - goMonitor:DrawCircle(Os, RadScale, "y") - goMonitor:DrawLine(Os,Tp) - goMonitor:DrawCircle(Tp, RadScale / 2) - if(self:GetDeveloperMode() == 0) then return end - local x,y = goMonitor:GetCenter(10,10) - goMonitor:SetTextEdge(x,y) - goMonitor:DrawText("Org POS: "..tostring(stSpawn.OPos),"k") - goMonitor:DrawText("Org ANG: "..tostring(stSpawn.OAng)) - goMonitor:DrawText("Mod POS: "..tostring(stSpawn.HPos)) - goMonitor:DrawText("Mod ANG: "..tostring(stSpawn.HAng)) - goMonitor:DrawText("Spn POS: "..tostring(stSpawn.SPos)) - goMonitor:DrawText("Spn ANG: "..tostring(stSpawn.SAng)) - end - end -end - -function TOOL:DrawToolScreen(w, h) - if(SERVER) then return end - if(not goToolScr) then - goToolScr = asmlib.MakeScreen(0,0,w,h,conPalette) - if(not goToolScr) then - return asmlib.StatusPrint(nil,"DrawToolScreen: Invalid screen") - end - end - goToolScr:DrawBackGround("k") - goToolScr:SetFont("Trebuchet24") - goToolScr:SetTextEdge(0,0) - local stTrace = LocalPlayer():GetEyeTrace() - local anInfo, anEnt = self:GetAnchor() - local tInfo = stringExplode(gsSymRev,anInfo) - if(not (stTrace and stTrace.Hit)) then - goToolScr:DrawText("Trace status: Invalid","r") - goToolScr:DrawTextAdd(" ["..(tInfo[1] or gsNoID).."]","an") - return - end - goToolScr:DrawText("Trace status: Valid","g") - goToolScr:DrawTextAdd(" ["..(tInfo[1] or gsNoID).."]","an") - local model = self:GetModel() - local hdRec = asmlib.CacheQueryPiece(model) - if(not hdRec) then - goToolScr:DrawText("Holds Model: Invalid","r") - goToolScr:DrawTextAdd(" ["..gsModeDataB.."]","db") - return - end - goToolScr:DrawText("Holds Model: Valid","g") - goToolScr:DrawTextAdd(" ["..gsModeDataB.."]","db") - local trEnt = stTrace.Entity - local actrad = self:GetActiveRadius() - local pointid, pnextid = self:GetPointID() - local trMaxCN, trModel, trOID, trRLen - if(trEnt and trEnt:IsValid()) then - if(asmlib.IsOther(trEnt)) then return end - trModel = trEnt:GetModel() - local spnflat = self:GetSpawnFlat() - local igntype = self:GetIgnoreType() - local trRec = asmlib.CacheQueryPiece(trModel) - local nextx, nexty, nextz = self:GetPosOffsets() - local nextpic, nextyaw, nextrol = self:GetAngOffsets() - local stSpawn = asmlib.GetEntitySpawn(trEnt,stTrace.HitPos,model,pointid, - actrad,spnflat,igntype,nextx,nexty,nextz,nextpic,nextyaw,nextrol) - if(stSpawn) then - trOID = stSpawn.TID - trRLen = asmlib.RoundValue(stSpawn.RLen,0.01) - end - if(trRec) then - trMaxCN = trRec.Kept - trModel = stringToFileName(trModel) - else - trModel = "["..gsNoMD.."]"..stringToFileName(trModel) - end - end - model = stringToFileName(model) - actrad = asmlib.RoundValue(actrad,0.01) - maxrad = asmlib.GetCoVar("maxactrad", "FLT") - goToolScr:DrawText("TM: " ..(trModel or gsNoAV),"y") - goToolScr:DrawText("HM: " ..(model or gsNoAV),"m") - goToolScr:DrawText("ID: ["..(trMaxCN or gsNoID) - .."] " ..(trOID or gsNoID) - .." >> "..(pointid or gsNoID) - .. " (" ..(pnextid or gsNoID) - ..") [" ..(hdRec.Kept or gsNoID).."]","g") - goToolScr:DrawText("CurAR: "..(trRLen or gsNoAV),"y") - goToolScr:DrawText("MaxCL: "..actrad.." < ["..maxrad.."]","c") - local txX, txY, txW, txH, txsX, txsY = goToolScr:GetTextState() - local nRad = mathClamp(h - txH - (txsY / 2),0,h) / 2 - local cPos = mathClamp(h - nRad - (txsY / 3),0,h) - local xyPos = {x = cPos, y = cPos} - if(trRLen) then - goToolScr:DrawCircle(xyPos, nRad * mathClamp(trRLen/maxrad,0,1),"y") - end - goToolScr:DrawCircle(xyPos, mathClamp(actrad/maxrad,0,1)*nRad, "c") - goToolScr:DrawCircle(xyPos, nRad, "m") - goToolScr:DrawText(osDate(),"w") -end - -function TOOL.BuildCPanel(CPanel) - Header = CPanel:AddControl( "Header", {Text = languageGetPhrase("tool."..gsToolNameL..".name"), - Description = languageGetPhrase("tool."..gsToolNameL..".desc")}) - local CurY = Header:GetTall() + 2 - - local Combo = {} - Combo["Label"] = "#Presets" - Combo["MenuButton"] = "1" - Combo["Folder"] = gsToolNameL - Combo["CVars"] = {} - Combo["CVars"][0 ] = gsToolPrefL.."weld" - Combo["CVars"][1 ] = gsToolPrefL.."ignphysgn" - Combo["CVars"][2 ] = gsToolPrefL.."mass" - Combo["CVars"][3 ] = gsToolPrefL.."model" - Combo["CVars"][4 ] = gsToolPrefL.."nextx" - Combo["CVars"][5 ] = gsToolPrefL.."nexty" - Combo["CVars"][6 ] = gsToolPrefL.."nextz" - Combo["CVars"][7 ] = gsToolPrefL.."count" - Combo["CVars"][8 ] = gsToolPrefL.."freeze" - Combo["CVars"][9 ] = gsToolPrefL.."adviser" - Combo["CVars"][10] = gsToolPrefL.."adviser" - Combo["CVars"][11] = gsToolPrefL.."igntype" - Combo["CVars"][12] = gsToolPrefL.."spnflat" - Combo["CVars"][13] = gsToolPrefL.."pointid" - Combo["CVars"][14] = gsToolPrefL.."pnextid" - Combo["CVars"][15] = gsToolPrefL.."nextpic" - Combo["CVars"][16] = gsToolPrefL.."nextyaw" - Combo["CVars"][17] = gsToolPrefL.."nextrol" - Combo["CVars"][18] = gsToolPrefL.."ghosthold" - Combo["CVars"][19] = gsToolPrefL.."ydegsnp" - Combo["CVars"][20] = gsToolPrefL.."mcspawn" - Combo["CVars"][21] = gsToolPrefL.."activrad" - Combo["CVars"][22] = gsToolPrefL.."nocollide" - Combo["CVars"][23] = gsToolPrefL.."gravity" - Combo["CVars"][24] = gsToolPrefL.."physmater" - - CPanel:AddControl("ComboBox",Combo) - CurY = CurY + 25 - local defTable = asmlib.GetOpVar("DEFTABLE_PIECES") - local Panel = asmlib.CacheQueryPanel() - if(not Panel) then return asmlib.StatusPrint(nil,"TOOL:BuildCPanel(cPanel): Panel population empty") end - local pTree = vguiCreate("DTree") - pTree:SetPos(2, CurY) - pTree:SetSize(2, 250) - pTree:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".tree")) - pTree:SetIndentSize(0) - local pFolders = {} - local pNode, pItem - local Cnt = 1 - while(Panel[Cnt]) do - local Rec = Panel[Cnt] - local Mod = Rec[defTable[1][1]] - local Typ = Rec[defTable[2][1]] - local Nam = Rec[defTable[3][1]] - if(fileExists(Mod, "GAME")) then - if(Typ ~= "" and not pFolders[Typ]) then - -- No Folder, Make one xD - pItem = pTree:AddNode(Typ) - pItem:SetName(Typ) - pItem.Icon:SetImage("icon16/disconnect.png") - pItem.InternalDoClick = function() end - pItem.DoClick = function() return false end - pItem.Label.UpdateColours = function(pSelf) - return pSelf:SetTextStyleColor(conPalette:Select("tx")) - end - pFolders[Typ] = pItem - end - if(pFolders[Typ]) then - pItem = pFolders[Typ] - else - pItem = pTree - end - pNode = pItem:AddNode(Nam) - pNode:SetName(Nam) - pNode.Icon:SetImage("icon16/control_play_blue.png") - pNode.DoClick = function(pSelf) - RunConsoleCommand(gsToolPrefL.."model" , Mod) - RunConsoleCommand(gsToolPrefL.."pointid", 1) - RunConsoleCommand(gsToolPrefL.."pnextid", 2) - end - else - asmlib.PrintInstance("Piece <"..Mod.."> from extension <"..Typ.."> not available .. SKIPPING !") - end - Cnt = Cnt + 1 - end - CPanel:AddItem(pTree) - CurY = CurY + pTree:GetTall() + 2 - asmlib.LogInstance("Found #"..tostring(Cnt-1).." piece items.") - - -- http://wiki.garrysmod.com/page/Category:DComboBox - local pComboPhysType = vguiCreate("DComboBox") - pComboPhysType:SetPos(2, CurY) - pComboPhysType:SetTall(18) - pComboPhysType:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".phytype")) - pComboPhysType:SetValue("")) - CurY = CurY + pComboPhysName:GetTall() + 2 - local Property = asmlib.CacheQueryProperty() - if(not Property) then return asmlib.StatusPrint(nil,"TOOL:BuildCPanel(cPanel): Property population empty") end - asmlib.Print(Property,"Property") - local CntTyp = 1 - local qNames, Type - while(Property[CntTyp]) do - Type = Property[CntTyp] - pComboPhysType:AddChoice(Type) - pComboPhysType.OnSelect = function(pnSelf, nInd, sVal, anyData) - qNames = asmlib.CacheQueryProperty(sVal) - if(qNames) then - pComboPhysName:Clear() - pComboPhysName:SetValue("") + CurY = CurY + pComboPhysType:GetTall() + 2 + local pComboPhysName = vguiCreate("DComboBox") + pComboPhysName:SetPos(2, CurY) + pComboPhysName:SetTall(18) + pComboPhysName:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".phyname")) + pComboPhysName:SetValue(asmlib.DefaultString(asmlib.GetCoVar("physmater","STR"),"") + local CntNam = 1 + while(qNames[CntNam]) do + local Nam = qNames[CntNam] + pComboPhysName:AddChoice(Nam) + pComboPhysName.OnSelect = function(pnSelf, nInd, sVal, anyData) + RunConsoleCommand(gsToolPrefL.."physmater", sVal) + end + CntNam = CntNam + 1 + end + else + asmlib.PrintInstance("Property type <"..sVal.."> has no names available") + end + end + CntTyp = CntTyp + 1 + end + CPanel:AddItem(pComboPhysType) + CPanel:AddItem(pComboPhysName) + asmlib.LogInstance("Found #"..(CntTyp-1).." material types.") + + -- http://wiki.garrysmod.com/page/Category:DTextEntry + local pText = vguiCreate("DTextEntry") + pText:SetPos(2, CurY) + pText:SetTall(18) + pText:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".bgskids")) + pText:SetText(asmlib.DefaultString(asmlib.GetCoVar("bgskids", "STR"),"Write selection code here. For example 1,0,0,2,1/3")) + pText.OnKeyCodeTyped = function(pnSelf, nKeyEnum) + if(nKeyEnum == KEY_TAB) then + local sTX = asmlib.GetPropBodyGroup()..gsSymDir..asmlib.GetPropSkin() + pnSelf:SetText(sTX) + pnSelf:SetValue(sTX) + elseif(nKeyEnum == KEY_ENTER) then + local sTX = pnSelf:GetValue() or "" + RunConsoleCommand(gsToolPrefL.."bgskids",sTX) + end + end + CurY = CurY + pText:GetTall() + 2 + CPanel:AddItem(pText) + + pItem = CPanel:AddControl("Slider", { + Label = "Piece mass:", + Type = "Integer", + Min = 1, + Max = gnMaxMass, + Command = gsToolPrefL.."mass"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".mass")) + + pItem = CPanel:AddControl("Slider", { + Label = "Active radius:", + Type = "Float", + Min = 1, + Max = asmlib.GetCoVar("maxactrad", "FLT"), + Command = gsToolPrefL.."activrad"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".activrad")) + + pItem = CPanel:AddControl("Slider", { + Label = "Pieces count:", + Type = "Integer", + Min = 1, + Max = asmlib.GetCoVar("maxstcnt", "INT"), + Command = gsToolPrefL.."count"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".count")) + + pItem = CPanel:AddControl("Slider", { + Label = "Yaw snap amount:", + Type = "Float", + Min = 0, + Max = gnMaxOffRot, + Command = gsToolPrefL.."ydegsnp"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".ydegsnp")) + + pItem = CPanel:AddControl("Button", { + Label = "V Reset variables V", + Command = gsToolPrefL.."resetvars", + Text = "Reset variables" }) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".resetvars")) + + pItem = CPanel:AddControl("Slider", { + Label = "Origin pitch:", + Type = "Float", + Min = -gnMaxOffRot, + Max = gnMaxOffRot, + Command = gsToolPrefL.."nextpic"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nextpic")) + + pItem = CPanel:AddControl("Slider", { + Label = "Origin yaw:", + Type = "Float", + Min = -gnMaxOffRot, + Max = gnMaxOffRot, + Command = gsToolPrefL.."nextyaw"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nextyaw")) + + pItem = CPanel:AddControl("Slider", { + Label = "Origin roll:", + Type = "Float", + Min = -gnMaxOffRot, + Max = gnMaxOffRot, + Command = gsToolPrefL.."nextrol"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nextrol")) + + pItem = CPanel:AddControl("Slider", { + Label = "Offset X:", + Type = "Float", + Min = -gnMaxOffLin, + Max = gnMaxOffLin, + Command = gsToolPrefL.."nextx"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nextx")) + + pItem = CPanel:AddControl("Slider", { + Label = "Offset Y:", + Type = "Float", + Min = -gnMaxOffLin, + Max = gnMaxOffLin, + Command = gsToolPrefL.."nexty"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nexty")) + + pItem = CPanel:AddControl("Slider", { + Label = "Offset Z:", + Type = "Float", + Min = -gnMaxOffLin, + Max = gnMaxOffLin, + Command = gsToolPrefL.."nextz"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nextz")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Weld", + Command = gsToolPrefL.."weld"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".weld")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "NoCollide", + Command = gsToolPrefL.."nocollide"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".nocollide")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Freeze on spawn", + Command = gsToolPrefL.."freeze"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".freeze")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Ignore physics gun grab", + Command = gsToolPrefL.."ignphysgn"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".ignphysgn")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Apply piece gravity", + Command = gsToolPrefL.."gravity"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".gravity")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Ignore track type", + Command = gsToolPrefL.."igntype"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".igntype")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Spawn horizontally", + Command = gsToolPrefL.."spnflat"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".spnflat")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Origin from mass-centre", + Command = gsToolPrefL.."mcspawn"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".mcspawn")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Snap to trace surface", + Command = gsToolPrefL.."surfsnap"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".surfsnap")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Draw adviser", + Command = gsToolPrefL.."adviser"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".adviser")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Draw assistant", + Command = gsToolPrefL.."pntasist"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".pntasist")) + + pItem = CPanel:AddControl("Checkbox", { + Label = "Draw holder ghost", + Command = gsToolPrefL.."ghosthold"}) + pItem:SetTooltip(languageGetPhrase("tool."..gsToolNameL..".ghosthold")) +end + +function TOOL:MakeGhostEntity(sModel) + -- Check for invalid model + if(not utilIsValidModel(sModel)) then return end + utilPrecacheModel(sModel) + -- We do ghosting serverside in single player + -- It's done clientside in multiplayer + if(SERVER and not gameSinglePlayer()) then return end + if(CLIENT and gameSinglePlayer()) then return end + -- Release the old ghost entity + self:ReleaseGhostEntity() + if(CLIENT) then + self.GhostEntity = entsCreateClientProp(sModel) + else + if(utilIsValidRagdoll(sModel)) then + self.GhostEntity = entsCreate("prop_dynamic") + else + self.GhostEntity = entsCreate("prop_physics") + end + end + -- If there are too many entities we might not spawn.. + if(not self.GhostEntity:IsValid()) then + self.GhostEntity = nil + return + end + self.GhostEntity:SetModel(sModel) + self.GhostEntity:SetPos(VEC_ZERO) + self.GhostEntity:SetAngles(ANG_ZERO) + self.GhostEntity:Spawn() + self.GhostEntity:SetSolid(SOLID_VPHYSICS); + self.GhostEntity:SetMoveType(MOVETYPE_NONE) + self.GhostEntity:SetNotSolid(true); + self.GhostEntity:SetRenderMode(RENDERMODE_TRANSALPHA) + self.GhostEntity:SetColor(conPalette:Select("gh")) +end + +function TOOL:UpdateGhost(oEnt, oPly) + if(not (oEnt and oEnt:IsValid())) then return end + oEnt:SetNoDraw(true) + oEnt:DrawShadow(false) + local stTrace = utilTraceLine(utilGetPlayerTrace(oPly)) + if(not stTrace) then return end + local trEnt = stTrace.Entity + if(stTrace.HitWorld) then + local model = self:GetModel() + local mcspawn = self:GetSpawnMC() + local ydegsnp = self:GetYawSnap() + local surfsnap = self:GetSurfaceSnap() + local pointid, pnextid = self:GetPointID() + local nextx, nexty, nextz = self:GetPosOffsets() + local nextpic, nextyaw, nextrol = self:GetAngOffsets() + local aAng = asmlib.GetNormalAngle(oPly,stTrace,surfsnap,ydegsnp) + if(mcspawn ~= 0) then + oEnt:SetAngles(aAng) + local vCen = asmlib.GetCenterMC(oEnt) + local vOBB = oEnt:OBBMins() + vCen:Add(stTrace.HitPos) + vCen:Add(-vOBB[cvZ] * stTrace.HitNormal) + vCen:Add(nextx * aAng:Forward()) + vCen:Add(nexty * aAng:Right()) + vCen:Add(nextz * aAng:Up()) + asmlib.ConCommandPly(oPly,"offsetup",-vOBB[cvZ]) + aAng:RotateAroundAxis(aAng:Up() ,-nextyaw) + aAng:RotateAroundAxis(aAng:Right() , nextpic) + aAng:RotateAroundAxis(aAng:Forward(), nextrol) + oEnt:SetAngles(aAng) + oEnt:SetPos(vCen) + oEnt:SetNoDraw(false) + else + local pointUp = (asmlib.PointOffsetUp(oEnt,pointid) or 0) + local stSpawn = asmlib.GetNormalSpawn(stTrace.HitPos + pointUp * stTrace.HitNormal,aAng,model, + pointid,nextx,nexty,nextz,nextpic,nextyaw,nextrol) + if(stSpawn) then + asmlib.ConCommandPly(oPly,"offsetup",pointUp) + oEnt:SetAngles(stSpawn.SAng) + oEnt:SetPos(stSpawn.SPos) + oEnt:SetNoDraw(false) + end + end + elseif(trEnt and trEnt:IsValid()) then + if(asmlib.IsOther(trEnt)) then return end + local trRec = asmlib.CacheQueryPiece(trEnt:GetModel()) + if(trRec) then + local model = self:GetModel() + local spnflat = self:GetSpawnFlat() + local igntype = self:GetIgnoreType() + local actrad = self:GetActiveRadius() + local pointid, pnextid = self:GetPointID() + local nextx, nexty, nextz = self:GetPosOffsets() + local nextpic, nextyaw, nextrol = self:GetAngOffsets() + local stSpawn = asmlib.GetEntitySpawn(trEnt,stTrace.HitPos,model,pointid, + actrad,spnflat,igntype,nextx,nexty,nextz,nextpic,nextyaw,nextrol) + if(stSpawn) then + oEnt:SetPos(stSpawn.SPos) + oEnt:SetAngles(stSpawn.SAng) + oEnt:SetNoDraw(false) + end + end + end +end + +function TOOL:Think() + local model = self:GetModel() + if(self:GetGhostHolder() ~= 0 and utilIsValidModel(model)) then + if (not self.GhostEntity or + not self.GhostEntity:IsValid() or + self.GhostEntity:GetModel() ~= model + ) then -- If none ... + self:MakeGhostEntity(model) + end + self:UpdateGhost(self.GhostEntity, self:GetOwner()) + else + self:ReleaseGhostEntity() + if(self.GhostEntity and self.GhostEntity:IsValid()) then + self.GhostEntity:Remove() + end + end +end diff --git a/readme.md b/readme.md index d16af48..d05e142 100644 --- a/readme.md +++ b/readme.md @@ -133,7 +133,7 @@ A: Here they are, with available status, why I did not do some of them ( in the 20) Mr. Train's G-Gauge rails 21) Ron's 56 gauge rails ( Removed by the add-on owner. Discontinued ) 22) Ron's 2ft track pack - 23) PHX Tubes ( In DEV 0% Done ) + 23) PHX Tubes Q: Dude the rails are not showing in the menu, what should I do ? A: SUBSCRIBE TO THE OWNER OF THE ADDON !!!! @@ -160,6 +160,17 @@ A: Remember when I got suggestions to do the switchers. is chosen when stacking is in place. The end of the line with the green circle points to the next active position that is chosen. +Q: Dude I've messed up my console variables, how can I factory-reset them ? +A: Easy. First you need to enable the developer mode via "trackassembly_devmode 1" + Then in the bodygroup/skin text box ( or "trackassembly_bgskids" variable ) enter: + "reset cvars": + reset all cvars to the factory default settings + "delete" + followed by space for deleting the exported database without quitting + the game, followed by either "cl" or "sv" or both, separated by space + to delete the client or server or both instance generated databases +N: The console variables being set in this question will be reset also + Q: How can I control errors when the clients are flooding my server with rails, and stacking/spawning outside of the map bounds? A: Easy, :D Just set "trackassembly_bnderrmod" to one of the following values