====== advtrains.decode_pos ====== //Decodes a Advtrains position string.// //Note: this page has been written for Advtrains 2.0.1 TSS and Minetest 5.1.0. Examples and practices described in this page don't take advantage of improvements introduced in later releases.// ===== Syntax ===== advtrains.decode_pos(pts) ===== Extended description ===== This function creates a string from the given Minetest position vector, suitable for use as a table index. See also ''[[dev:core:funref:encode_pos|advtrains.encode_pos]]''. ===== Parameters ===== * ''pts'' //(string)//: a table index string created by ''[[dev:core:funref:encode_pos|advtrains.encode_pos]]''. ===== Returns ===== A Minetest position vector. ===== Errors and warnings ===== It gives a runtime error if the ''pts'' parameter: * is not at least 12 characters long * contains characters not part of the [[wp>Hexadecimal|hexadecimal notation]] ../mods/advtrains/advtrains/helpers.lua:373: attempt to perform arithmetic on a nil value stack traceback: ../mods/advtrains/advtrains/helpers.lua:373: in function 'dec' ../mods/advtrains/advtrains/helpers.lua:388: in function 'decode_pos' ???:?: in main chunk [C]: in ? ===== How it works internally ===== This function converts back strings created by ''[[dev:core:funref:encode_pos|advtrains.encode_pos]]'' to their original vector form. Y, X and Z coordinates are treated separately: the corresponding parts of the argument are extracted and passed to ''dec'', which converts the hexadecimal form of a number to its decimal form. - Y coordinate is encoded in characters 1 to 4. - X coordinate is encoded in characters 5 to 8. - Z coordinate is encoded in characters 9 to 12. ===== Examples ===== advtrains.decode_pos("800080008000") -- {x=0,y=0,z=0} advtrains.decode_pos("807B7DC07F62") -- {x=-576,y=123,z=-158} advtrains.decode_pos("1C401E5858F0") -- {x=-25000,y=-25536,z=-10000} ===== In source code ===== advtrains/helpers.lua, lines 383 to 389: -- DEPENDENCY CODE local hext = { [0]="0",[1]="1",[2]="2",[3]="3",[4]="4",[5]="5",[6]="6",[7]="7",[8]="8",[9]="9",[10]="A",[11]="B",[12]="C",[13]="D",[14]="E",[15]="F"} local dect = { ["0"]=0,["1"]=1,["2"]=2,["3"]=3,["4"]=4,["5"]=5,["6"]=6,["7"]=7,["8"]=8,["9"]=9,["A"]=10,["B"]=11,["C"]=12,["D"]=13,["E"]=14,["F"]=15} local function c(s,i) return dect[string.sub(s,i,i)] end local function dec(s) return (c(s,1)*4096 + c(s,2)*256 + c(s,3)*16 + c(s,4))-32768 end -- [...] function advtrains.decode_pos(pts) if not pts or not #pts==6 then return nil end local stry = string.sub(pts, 1,4) local strx = string.sub(pts, 5,8) local strz = string.sub(pts, 9,12) return vector.new(dec(strx), dec(stry), dec(strz)) end