--WSMENU V1b BY DEVENGER. RELEASED FREELY; PLEASE USE WHEREVER IT IS USEFUL! --DOESN'T REQUIRE GMX. MUHAHAHAHA! if wsmenu then if wsmenu.hooks then for i,j in wsmenu.hooks do UnHookEvent(j) end end end wsmenu = {} function wsmenu.color4(r,g,b,a) return {r=r,g=g,b=b,a=a}; end wsmenu.menus = {} wsmenu.players = {} for i=1, _MaxPlayers() do wsmenu.players[i] = {} wsmenu.players[i].opened = {} end wsmenu.hooks = {} wsmenu.templates = {} wsmenu.screenWidth = 1024 wsmenu.screenHeight = 768 wsmenu.debug = false function wsmenu.SetAsTemplate (id, template) wsmenu.templates[template] = wsmenu.menus[id] end function wsmenu.Msg (msg) if wsmenu.debug then _Msg(msg) end end function wsmenu.Create (id, template) wsmenu.menus[id] = {} wsmenu.menus[id].currentmax = 0 wsmenu.menus[id].text = {} wsmenu.menus[id].rect = {} wsmenu.menus[id].selecter = {} wsmenu.menus[id].pos = {} wsmenu.menus[id].items = {} if template then wsmenu.menus[id].pos.x = wsmenu.templates[template].pos.x wsmenu.menus[id].pos.y = wsmenu.templates[template].pos.y wsmenu.menus[id].rect.texture = wsmenu.templates[template].rect.texture wsmenu.menus[id].rect.colour = wsmenu.templates[template].rect.colour wsmenu.menus[id].rect.width = wsmenu.templates[template].rect.width wsmenu.menus[id].rect.border = wsmenu.templates[template].rect.border wsmenu.menus[id].text.font = wsmenu.templates[template].text.font wsmenu.menus[id].text.colour = wsmenu.templates[template].text.colour wsmenu.menus[id].text.height = wsmenu.templates[template].text.height wsmenu.menus[id].selecter.texture = wsmenu.templates[template].selecter.texture wsmenu.menus[id].selecter.colour = wsmenu.templates[template].selecter.colour wsmenu.menus[id].selecter.leftinc = wsmenu.templates[template].selecter.leftinc wsmenu.menus[id].selecter.rightdec = wsmenu.templates[template].selecter.rightdec end return id end function wsmenu.Position (id, x, y) wsmenu.menus[id].pos.x = x wsmenu.menus[id].pos.y = y end function wsmenu.RectProperties (id, texture, colour, width, border) wsmenu.menus[id].rect.texture = texture wsmenu.menus[id].rect.colour = colour wsmenu.menus[id].rect.width = width wsmenu.menus[id].rect.border = border end function wsmenu.TextProperties (id, font, colour, height) wsmenu.menus[id].text.font = font wsmenu.menus[id].text.colour = colour wsmenu.menus[id].text.height = height end function wsmenu.SelecterProperties (id, texture, colour, leftinc, rightdec) wsmenu.menus[id].selecter.texture = texture wsmenu.menus[id].selecter.colour = colour wsmenu.menus[id].selecter.leftinc = leftinc wsmenu.menus[id].selecter.rightdec = rightdec end function wsmenu.Add (id, itemid, text, selectable, actions) wsmenu.menus[id].items[itemid] = {} wsmenu.menus[id].items[itemid].text = text wsmenu.menus[id].items[itemid].selectable = selectable if actions ~= nil then wsmenu.menus[id].items[itemid].actions = actions end if selectable == true then wsmenu.menus[id].items[itemid].colour = wsmenu.menus[id].text.colour else wsmenu.menus[id].items[itemid].colour = wsmenu.menus[id].text.colour end if itemid > wsmenu.menus[id].currentmax then wsmenu.menus[id].currentmax = itemid end end function wsmenu.Spawn (id, PlayerID) for j=1, 10 do used = false for k,l in wsmenu.players[PlayerID].opened do if l == j then used = true end end if not used then wsmenu.players[PlayerID].opened[id] = j _Msg("Menu identity: "..j.."\n") break end end for i in wsmenu.menus[id].items do wsmenu.Msg("Writing text "..wsmenu.menus[id].items[i].text.."\n") --gmx.makeText("m"..id.."i"..i,PlayerID,wsmenu.menus[id].text.font,wsmenu.menus[id].items[i].text,wsmenu.menus[id].pos.x,wsmenu.menus[id].pos.y+(wsmenu.menus[id].text.height*(i-1)),wsmenu.menus[id].items[i].colour,0,0,9999,0.2) col = wsmenu.menus[id].items[i].colour _GModText_Start(wsmenu.menus[id].text.font); _GModText_SetPos(wsmenu.menus[id].pos.x/wsmenu.screenWidth,(wsmenu.menus[id].pos.y+(wsmenu.menus[id].text.height*(i-1)))/wsmenu.screenHeight); _GModText_SetText(wsmenu.menus[id].items[i].text); _GModText_SetTime(9999,0,0); _GModText_SetColor(col.r,col.g,col.b,col.a); _GModText_Send(PlayerID, 20000+(wsmenu.players[PlayerID].opened[id]*100)+i); wsmenu.Msg("Text written.\n") end col = wsmenu.menus[id].rect.colour --gmx.makeRect("back"..id,PlayerID,wsmenu.menus[id].rect.texture,wsmenu.menus[id].pos.x-wsmenu.menus[id].rect.border,wsmenu.menus[id].pos.y-wsmenu.menus[id].rect.border,wsmenu.menus[id].rect.width,wsmenu.menus[id].text.height*wsmenu.menus[id].currentmax+wsmenu.menus[id].rect.border*2,wsmenu.menus[id].rect.colour,0,0,9999,0.3) _GModRect_Start(wsmenu.menus[id].rect.texture); _GModRect_SetPos((wsmenu.menus[id].pos.x-wsmenu.menus[id].rect.border)/wsmenu.screenWidth,(wsmenu.menus[id].pos.y-wsmenu.menus[id].rect.border)/wsmenu.screenHeight,wsmenu.menus[id].rect.width/wsmenu.screenWidth,(wsmenu.menus[id].text.height*wsmenu.menus[id].currentmax+wsmenu.menus[id].rect.border*2)/wsmenu.screenHeight); _GModRect_SetColor(col.r,col.g,col.b,col.a); _GModRect_SetTime(9999,0,0); _GModRect_Send(PlayerID, 20000+wsmenu.players[PlayerID].opened[id]); end function wsmenu.Select (id, PlayerID) wsmenu.players[PlayerID].selected = {} wsmenu.players[PlayerID].selected.menuid = id wsmenu.players[PlayerID].selected.option = 1 wsmenu.FindNextSelectableOption(PlayerID) end function wsmenu.Hide (id, PlayerID) for i in wsmenu.menus[id].items do --gmx.hideText("m"..id.."i"..i, PlayerID, 0) _GModText_Hide(PlayerID, 20000+(wsmenu.players[PlayerID].opened[id]*100)+i) end --gmx.hideRect("back"..id, PlayerID, 0) _GModRect_Hide(PlayerID, 20000+wsmenu.players[PlayerID].opened[id]) _GModRect_Hide(PlayerID, 21000+wsmenu.players[PlayerID].opened[id]) --gmx.hideRect("option", PlayerID, 0) wsmenu.players[PlayerID].opened[id] = nil wsmenu.players[PlayerID].selected = nil end function wsmenu.FindNextSelectableOption (PlayerID) found = false while found == false do if wsmenu.menus[wsmenu.players[PlayerID].selected.menuid].items[wsmenu.players[PlayerID].selected.option] then if wsmenu.menus[wsmenu.players[PlayerID].selected.menuid].items[wsmenu.players[PlayerID].selected.option].selectable then found = true else wsmenu.players[PlayerID].selected.option = wsmenu.players[PlayerID].selected.option + 1 end else wsmenu.players[PlayerID].selected.option = 1 end end wsmenu.DrawSelecter(PlayerID) end function wsmenu.FindLastSelectableOption (PlayerID) found = false while found == false do if wsmenu.menus[wsmenu.players[PlayerID].selected.menuid].items[wsmenu.players[PlayerID].selected.option] then if wsmenu.menus[wsmenu.players[PlayerID].selected.menuid].items[wsmenu.players[PlayerID].selected.option].selectable then found = true else wsmenu.players[PlayerID].selected.option = wsmenu.players[PlayerID].selected.option - 1 end else wsmenu.players[PlayerID].selected.option = wsmenu.menus[wsmenu.players[PlayerID].selected.menuid].currentmax end end wsmenu.DrawSelecter(PlayerID) end function wsmenu.DrawSelecter (PlayerID) r = wsmenu.players[PlayerID].selected.menuid col = wsmenu.menus[r].selecter.colour --gmx.makeRect("option",PlayerID,wsmenu.menus[r].selecter.texture,wsmenu.menus[r].pos.x-wsmenu.menus[r].rect.border+wsmenu.menus[r].selecter.leftinc,wsmenu.menus[r].pos.y-wsmenu.menus[r].text.height+wsmenu.players[PlayerID].selected.option*wsmenu.menus[r].text.height,wsmenu.menus[r].rect.width-wsmenu.menus[r].selecter.leftinc-wsmenu.menus[r].selecter.rightdec,wsmenu.menus[r].text.height-1,wsmenu.menus[r].selecter.colour,0,0,9999,0.3) _GModRect_Start(wsmenu.menus[r].selecter.texture); _GModRect_SetPos((wsmenu.menus[r].pos.x-wsmenu.menus[r].rect.border+wsmenu.menus[r].selecter.leftinc)/wsmenu.screenWidth,(wsmenu.menus[r].pos.y-wsmenu.menus[r].text.height+wsmenu.players[PlayerID].selected.option*wsmenu.menus[r].text.height)/wsmenu.screenHeight,(wsmenu.menus[r].rect.width-wsmenu.menus[r].selecter.leftinc-wsmenu.menus[r].selecter.rightdec)/wsmenu.screenWidth,(wsmenu.menus[r].text.height-1)/wsmenu.screenHeight); _GModRect_SetColor(col.r,col.g,col.b,col.a); _GModRect_SetTime(9999,0,0); _GModRect_Send(PlayerID, 21000+wsmenu.players[PlayerID].opened[r]); end function wsmenu.HookKeyPressed (PlayerID, key) if _PlayerInfo(PlayerID, "alive") then if wsmenu.players[PlayerID].selected then if key == IN_BACK then wsmenu.players[PlayerID].selected.option = wsmenu.players[PlayerID].selected.option + 1 wsmenu.FindNextSelectableOption(PlayerID) r = wsmenu.players[PlayerID].selected.menuid end if key == IN_FORWARD then wsmenu.players[PlayerID].selected.option = wsmenu.players[PlayerID].selected.option - 1 wsmenu.FindLastSelectableOption(PlayerID) r = wsmenu.players[PlayerID].selected.menuid end if key == IN_JUMP or key == IN_USE then PID = PlayerID _RunString(wsmenu.menus[wsmenu.players[PlayerID].selected.menuid].items[wsmenu.players[PlayerID].selected.option].actions) end end end end table.insert(wsmenu.hooks, HookEvent("eventKeyPressed", wsmenu.HookKeyPressed)) if txted then if txted.hooks then for i,j in txted.hooks do UnHookEvent(j) end end end txted = {} txted.lines = 15 txted.hooks = {} txted.players = {} txted.allowed = {} function txted.addUser (SID, l) table.insert(txted.allowed, {SID, l}) end txted.addUser ("UNKNOWN", 2) txted.addUser ("STEAM_0:0:9842692", 2) --'cus he's liek l33t txted.addUser ("STEAM_0:1:2355621", 1) --'cus he pwnz0r a little for i=1, _MaxPlayers() do txted.players[i] = {} txted.players[i].file = "" txted.players[i].folder = nil txted.players[i].lines = {} txted.players[i].linesel = nil txted.players[i].lineview = 0 end function txted.loadFile (PlayerID, file) if _file.Exists(file) then _Msg("\tFile "..file.." exists.\n") txted.players[PlayerID].file = file txted.players[PlayerID].lines = {} contents = _file.Read(file) contents = string.gsub(contents, "\t", " ").."\n" finished = false while not finished do r = string.find(contents, "\n") if r then line = string.gsub(string.sub(contents, 1, r), "\n", "", 1) table.insert(txted.players[PlayerID].lines, line) contents = string.sub(contents, r) contents = string.gsub(contents, "\n", "", 1) else finished = true end end txted.emptyLastLine(PlayerID) txted.printFile (PlayerID) else txted.showMessage(PlayerID,{"File does not exist.", "TXTED's root directory is SourceMods/gmod9/"}, 3); end end --CONCOMMAND("txtedLoad", txted.loadFile) function txted.createFile (PlayerID, file) if not _file.Exists(file) then _file.Write(file, "I am your new file. Please edit and expand me!\n") txted.loadFile(PlayerID, file) else txted.showMessage(PlayerID,{"File already exists, so should be loaded.", "Use \load "..file}, 3); end end function txted.getlines (PlayerID) j = 0 for i in txted.players[PlayerID].lines do j = j + 1 end return j end function txted.emptyLastLine (PlayerID) n = txted.getlines(PlayerID) if txted.players[PlayerID].lines[n] ~= "" then txted.players[PlayerID].lines[n+2] = "" end end function txted.printFile (PlayerID, x, line) if wsmenu.players[PlayerID].opened["txted"..PlayerID] then wsmenu.Hide("txted"..PlayerID, PlayerID) end if line == nil then line = 1 txted.showMessage(PlayerID,{"Controls:", "W and S to move up and down lines, E to select a line.", "Save before you close the file or changes will be lost."}, 4); end txted.players[PlayerID].lineview = line mid = wsmenu.Create("txted"..PlayerID) wsmenu.Position(mid, 20, 20) wsmenu.RectProperties (mid, "gmod/white", wsmenu.color4(0,0,0,255), 984, 5) wsmenu.TextProperties (mid, "DebugFixed", wsmenu.color4(255,255,255,255), 15) wsmenu.SelecterProperties (mid, "gmod/white", wsmenu.color4(255,255,255,50), 0, 5) tot = 1 latestline = line+txted.lines-1 if latestline > txted.getlines(PlayerID) then latestline = txted.getlines(PlayerID) end wsmenu.Add(mid, tot, "TXTED by Devenger - File: "..txted.players[PlayerID].file.." - Lines "..line.." to "..latestline, false) tot = tot + 1 wsmenu.Add(mid, tot, "", false) tot = tot + 1 wsmenu.Add(mid, tot, "USES ", false) for i=line, line+txted.lines do k = txted.players[PlayerID].lines[i] if k then if string.len(k) > 140 then k = string.sub(k, 1, 137).."..." end wsmenu.Add(mid, tot, k, true, [[ txted.players[PID].linesel = ]]..i..[[ txted.showMessage(PID,{"This line is now selected.", "Type in chat what you wish to overwrite it's contents with.", "Overrides:", "\\abort - leave line unchanged", "\\remove - delete the line", "\\newline - create a new line"}, 3); ]]) tot = tot + 1 end end wsmenu.Add(mid, tot, "", false) tot = tot + 1 if txted.players[PlayerID].lines[line+txted.lines] ~= nil then wsmenu.Add(mid, tot, "NEXT PAGE", true, [[ txted.printFile(PID, 0, ]]..(line+txted.lines)..[[) ]]) tot = tot + 1 end if txted.players[PlayerID].lines[line-txted.lines] ~= nil then wsmenu.Add(mid, tot, "LAST PAGE", true, [[ txted.printFile(PID, 0, ]]..(line-txted.lines)..[[) ]]) tot = tot + 1 end wsmenu.Add(mid, tot, "SAVE", true, [[ txted.saveFile(PID) ]]) tot = tot + 1 wsmenu.Add(mid, tot, "CLOSE", true, [[ wsmenu.Hide("txted"..PID, PID) txted.players[PID].linesel = nil ]]) wsmenu.Spawn(mid, PlayerID) wsmenu.Select(mid, PlayerID) end --CONCOMMAND("txtedPrint", txted.printFile) function txted.showMessage (PlayerID, message, timer) --[[mid = wsmenu.Create("txtedm"..PlayerID) wsmenu.Position(mid, 300, 600) wsmenu.RectProperties (mid, "gmod/white", wsmenu.color4(255,255,255,255), 424, 5) wsmenu.TextProperties (mid, "DebugFixed", wsmenu.color4(0,0,0,255), 15) wsmenu.SelecterProperties (mid, "gmod/white", wsmenu.color4(0,0,0,50), 0, 5)]] str = "" for i,j in message do _Msg(j.."\n") --wsmenu.Add(mid, i, j, false) str = str..j.."\n" end --wsmenu.Spawn(mid, PlayerID) if timer == nil then timer = 10 end ----_PrintMessage(PlayerID, 4, str) _GModText_Start("Default"); _GModText_SetPos(-1, 0.7); _GModText_SetColor(255, 255, 255, 255); _GModText_SetTime(tonumber(timer), 0, 0); _GModText_SetText(str); _GModText_Send(PlayerID, 19364); end function txted.hideMessage (PlayerID) --wsmenu.Hide("txtedm"..PlayerID, PlayerID) end function txted.saveFile (PlayerID) file = "" for i,k in txted.players[PlayerID].lines do file = file..k.."\n" end _file.Write(txted.players[PlayerID].file, file) _Msg("\tFile saved.\n") end --CONCOMMAND("txtedSave", txted.saveFile) function txted.writeLine (PlayerID, line) txted.players[PlayerID].lines[txted.players[PlayerID].linesel] = line txted.emptyLastLine (PlayerID) txted.printFile (PlayerID, 0, txted.players[PlayerID].lineview) end --CONCOMMAND("txtedWrite", txted.writeLine) function txted.newLine (PlayerID) i = txted.getlines(PlayerID) while i > txted.players[PlayerID].linesel do txted.players[PlayerID].lines[i+1] = txted.players[PlayerID].lines[i] i = i - 1 end txted.players[PlayerID].lines[txted.players[PlayerID].linesel+1] = "" txted.printFile (PlayerID, 0, txted.players[PlayerID].lineview) end function txted.deleteLine (PlayerID) i = txted.players[PlayerID].linesel t = txted.getlines(PlayerID) while i <= t do txted.players[PlayerID].lines[i] = txted.players[PlayerID].lines[i+1] i = i + 1 end txted.players[PlayerID].lines[t] = nil txted.printFile (PlayerID, 0, txted.players[PlayerID].lineview) end function eventPlayerSay (PlayerID, text, team) nt = string.sub(text, string.len(_PlayerInfo(PlayerID, "name"))+3) if team then nt = string.sub(nt, 8) end if txted.players[PlayerID].linesel then txted.hideMessage (PlayerID) if string.find(nt, "\\newline") then txted.newLine(PlayerID) txted.showMessage(PlayerID,{"New line created."}, 3); elseif string.find(nt, "\\removeline") then txted.deleteLine(PlayerID) txted.showMessage(PlayerID,{"Selected line deleted."}, 3); elseif nt ~= "\\abort" then nt = string.gsub(nt, "\\n", "") txted.writeLine(PlayerID, nt) txted.players[PlayerID].linesel = nil else txted.showMessage(PlayerID,{"Line left unchanged."}, 3); end return "" elseif nt == "\\save" then txted.saveFile (PlayerID) txted.showMessage(PlayerID,{"Line contents overwritten."}, 3); elseif string.find(nt, "\\load ") then nt = string.sub(nt, 7) txted.loadFile (PlayerID, nt) elseif string.find(nt, "\\create ") then nt = string.sub(nt, 9) txted.createFile (PlayerID, nt) elseif string.find(nt, "\\explore ") then nt = string.sub(nt, 10) string.gsub(nt, "\\", "/") txted.players[PlayerID].folder = nt txted.readDir (PlayerID) else return text end end function txted.readDir (PlayerID) dir = txted.players[PlayerID].folder files = _file.Find(dir.."/*") txted.players[PlayerID].filetable = {} txted.players[PlayerID].foldertable = {} for i,filename in files do if not (filename == "." or filename == "..") then if _file.IsDir(dir.."/"..filename) then table.insert(txted.players[PlayerID].foldertable, filename) else table.insert(txted.players[PlayerID].filetable, filename) end end end txted.printDir (PlayerID) end function txted.getfiles (PlayerID) j = 0 for i in txted.players[PlayerID].filetable do j = j + 1 end for i in txted.players[PlayerID].foldertable do j = j + 1 end return j end function txted.getfolders (PlayerID) j = 0 for i in txted.players[PlayerID].foldertable do j = j + 1 end return j end function txted.printDir (PlayerID, line) if wsmenu.players[PlayerID].opened["txted"..PlayerID] then wsmenu.Hide("txted"..PlayerID, PlayerID) end if line == nil then line = 1 txted.showMessage(PlayerID,{"Controls:", "W and S to move up and down files, E to open a file."}, 4); end mid = wsmenu.Create("txted"..PlayerID) wsmenu.Position(mid, 20, 20) wsmenu.RectProperties (mid, "gmod/white", wsmenu.color4(0,0,0,255), 984, 5) wsmenu.TextProperties (mid, "DebugFixed", wsmenu.color4(255,255,255,255), 15) wsmenu.SelecterProperties (mid, "gmod/white", wsmenu.color4(255,255,255,50), 0, 5) tot = 1 latestline = line+txted.lines-1 if latestline > txted.getfiles(PlayerID) then latestline = txted.getfiles(PlayerID) end wsmenu.Add(mid, tot, "TXTED File Browser by Devenger - Folder: "..txted.players[PlayerID].folder.." - Files/folders "..line.." to "..latestline, false) tot = tot + 1 wsmenu.Add(mid, tot, "", false) tot = tot + 1 for i,j in txted.players[PlayerID].foldertable do _Msg(j.."\n") end for i,j in txted.players[PlayerID].filetable do _Msg(j.."\n") end ontofiles = false for i=line, line+txted.lines do if not ontofiles then k = txted.players[PlayerID].foldertable[i] if k then len = string.len(k) spcs = "" if 50-len > 0 then for i=1, 50-len do spcs = spcs.." " end end wsmenu.Add(mid, tot, k..spcs.."FOLDER", true, [[ txted.players[PID].folder = txted.players[PID].folder.."/]]..k..[[" txted.readDir(PID) ]]) tot = tot + 1 else ontofiles = true end end if ontofiles then k = txted.players[PlayerID].filetable[i-txted.getfolders(PlayerID)] if k then len = string.len(k) spcs = "" if 100-len > 0 then for i=1, 100-len do spcs = spcs.." " end end wsmenu.Add(mid, tot, k..spcs.."FILE", true, [[ txted.loadFile (PID, txted.players[PID].folder.."/]]..k..[[") ]]) tot = tot + 1 end end end wsmenu.Add(mid, tot, "", false) tot = tot + 1 if txted.getfiles(PlayerID) >= line+txted.lines then wsmenu.Add(mid, tot, "NEXT PAGE", true, [[ txted.printDir(PID, ]]..(line+txted.lines)..[[) ]]) tot = tot + 1 end if line-txted.lines > 0 then wsmenu.Add(mid, tot, "LAST PAGE", true, [[ txted.printDir(PID, ]]..(line-txted.lines)..[[) ]]) tot = tot + 1 end wsmenu.Add(mid, tot, "GO UP A FOLDER", true, [[ fcop = txted.players[PID].folder done = false subs = 0 while not done do fcop2 = string.gsub(fcop, "/", "", 1) if not string.find(fcop2, "/") then p = string.find(fcop, "/") + subs txted.players[PID].folder = string.sub(txted.players[PID].folder, 1, p-1) done = true else fcop = fcop2 subs = subs + 1 end end txted.readDir(PID, 1) ]]) tot = tot + 1 wsmenu.Add(mid, tot, "CLOSE", true, [[ wsmenu.Hide("txted"..PID, PID) txted.players[PID].folder = nil ]]) wsmenu.Spawn(mid, PlayerID) wsmenu.Select(mid, PlayerID) end