From 662bab2a9a9fe1ce27d54b9c1ae76426917741a5 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Tue, 13 Dec 2016 13:12:02 -0500 Subject: [PATCH] Updated client stuff --- client/GuiManager.lua | 4027 +++++++++++++++++++++++++++++++++++++++ client/bg.jpg | Bin 0 -> 97594 bytes client/chat.png | Bin 0 -> 114946 bytes client/conf.lua | 2 +- client/login.lua | 128 ++ client/main.lua | 482 ++++- client/net/chatting.lua | 107 +- client/net/identity.lua | 6 +- 8 files changed, 4649 insertions(+), 103 deletions(-) create mode 100644 client/GuiManager.lua create mode 100644 client/bg.jpg create mode 100644 client/chat.png create mode 100644 client/login.lua diff --git a/client/GuiManager.lua b/client/GuiManager.lua new file mode 100644 index 0000000..eeb83f3 --- /dev/null +++ b/client/GuiManager.lua @@ -0,0 +1,4027 @@ +utf8 = require("utf8") +_defaultfont = love.graphics.getFont() +gui = {} +gui.__index = gui +gui.TB={} +gui.Version="8.0.0" -- Is it really ready for release? +_GuiPro={GBoost=true,hasDrag=false,DragItem={},Children={},Visible=true,count=0,x=0,y=0,height=0,width=0,update=function(self) local things=GetAllChildren2(self) UpdateThings(things) end,draw=function(self) local things=GetAllChildren(self) DrawThings(things) end,getChildren=function(self) return self.Children end} +_GuiPro.Clips={} +_GuiPro.rotate=0 +setmetatable(_GuiPro, gui) +function gui:LoadInterface(file) + local add=".int" + if string.find(file,".",1,true) then add="" end + if love.filesystem.exists(file..add) then + a,b=pcall(love.filesystem.load(file..add)) + if a then + print("Loaded: "..file) + else + print("Error loading file: "..file) + print(a,b) + end + else + print("File does not exist!") + return false + end +end +function gui.LoadAll(dir) + files=love.filesystem.getDirectoryItems(dir) + for i=1,#files do + if string.sub(files[i],-4)==".int" then + gui:LoadInterface(dir.."/"..files[i]) + end + end +end + +function gui:Clickable() + local x,y,w,h=love.graphics.getScissor() + local mx=love.mouse.getX() + local my=love.mouse.getY() + if _GuiPro.HasStencel then + local obj=_GuiPro.StencelHolder + if self:isDescendant(obj) then + return math.sqrt((mx-obj.x)^2+(my-obj.y)^2)<=(obj.offset.size.x or 0) + end + end + if not(x) then + return true + end + return not(mx>x+w or mxy+h or myx+w or mxy+h or my self.x and x < self.x+self.width and y > self.y and y < self.y+self.height and self:TClickable(x,y) and self:eventable()) + end + end + self.id=-1 +end +multi:newTask(function() -- A bit of post-loading haha + gui.touchpressed=multi:newConnection() + gui.touchreleased=multi:newConnection() + gui.touchmoved=multi:newConnection() + love.touchpressed=Library.convert(love.touchpressed or function() end) + love.touchreleased=Library.convert(love.touchreleased or function() end) + love.touchmoved=Library.convert(love.touchmoved or function() end) + love.touchpressed:inject(function(id, x, y, dx, dy, pressure) gui.touchpressed:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1) + love.touchreleased:inject(function(id, x, y, dx, dy, pressure) gui.touchreleased:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1) + love.touchmoved:inject(function(id, x, y, dx, dy, pressure) gui.touchmoved:Fire(id, x, y, dx, dy, pressure) return {id, x, y, dx, dy, pressure} end,1) + _GuiPro.TouchReady=true + _GuiPro.TouchRegister={} + gui.touchpressed:connect(function(id, x, y, dx, dy, pressure) + for i,v in pairs(_GuiPro.TouchRegister) do + if #v.tid==0 then + if (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then + v:addTID(id) + v.touchcount=1 + for i=1,#v.ToFuncP do + v.ToFuncP[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1) + end + end + elseif not(v:hasTID(id)) then + if (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then + v:addTID(id) + v.touchcount=v.touchcount+1 + for i=1,#v.ToFuncP do + v.ToFuncP[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1) + end + end + end + end + end) + gui.touchreleased:connect(function(id, x, y, dx, dy, pressure) + for i,v in pairs(_GuiPro.TouchRegister) do + if v:hasTID(id) then + v:removeTID(id) + for i=1,#v.ToFuncR do + v.ToFuncR[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1) + end + end + end + end) + gui.touchmoved:connect(function(id, x, y, dx, dy, pressure) + for i,v in pairs(_GuiPro.TouchRegister) do + if v:hasTID(id) and (x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable()) then + for i=1,#v.ToFuncM do + v.ToFuncM[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1) + end + elseif v:hasTID(id) and not((x > v.x and x < v.x+v.width and y > v.y and y < v.y+v.height and v:TClickable(x,y) and v:eventable())) then + v:removeTID(id) + for i=1,#v.ToFuncR do + v.ToFuncR[i](v,id, x-v.x, y-v.y, dx, dy or 0, pressure or 1) + end + end + end + end) +end) +-- now that that is done lets set up some more post loading checks +_GuiPro.int=multi:newProcess() +_GuiPro.int:Start() +_GuiPro.int:setJobSpeed(.001) +_GuiPro.EXACT=0 +_GuiPro.LAX=.01 +_GuiPro.LAZY=.05 +-- now lets define the reg function +function gui.Compare(a,b,v,tp) + if tp==">" then + if (a+v>b or a-v>b) then + return true + end + elseif tp=="<" then + if (a+v=" then + if (a+v>=b or a-v>=b) then + return true + end + elseif tp=="==" then -- this one is gonna be tricky + if (a>=b-v and a<=b+v) or (b>=a-v and b<=a+v) then + return true + end + end + return false +end +function gui:regesterTouch() + local obj=self + obj.ToFuncP={} + obj.ToFuncM={} + obj.ToFuncR={} + obj.To2Func={} + obj.ToDTFunc={} + obj.touchRendering =_GuiPro.EXACT -- exact(0), lax(), # + function obj:removeTID(id) + for i=1,#self.tid do + if self.tid[i]==id then + table.remove(self.tid,i) + self.touchcount=self.touchcount-1 + return + end + end + end + function obj:hasTID(id) + for i=1,#self.tid do + if self.tid[i]==id then + return true + end + end + return false + end + obj.txl1=0 + obj.tyl1=0 + obj.txl2=0 + obj.tyl2=0 + obj.LS=0 + obj:OnUpdate(function(self) + if self.touchcount==2 then + local x1,y1=love.touch.getPosition( self.tid[1] ) + local x2,y2=love.touch.getPosition( self.tid[2] ) + local CS=math.sqrt((x2-x1)^2+(y2-y1)^2) + if gui.Compare(CS,self.LS,self.touchRendering,">") then + for i=1,#self.To2Func do + self.To2Func[i](self,CS,x1-self.x,y1-self.y,x2-self.x,y2-self.y) + end + elseif gui.Compare(CS,self.LS,self.touchRendering,"<") then + for i=1,#self.To2Func do + self.To2Func[i](self,-CS,x1-self.x,y1-self.y,x2-self.x,y2-self.y) + end + elseif gui.Compare(CS,self.LS,self.touchRendering,"==") then + for i=1,#self.To2Func do + self.To2Func[i](self,0,x1-self.x,y1-self.y,x2-self.x,y2-self.y) + end + end + -- if self.txl1~=x1 or self.txl2~=x2 or self.tyl1~=y1 or self.tyl2~=y2 then + -- for i=1,#self.To2Func do + -- self.To2Func[i](self,0,x1-self.x,y1-self.y,x2-self.x,y2-self.y) + -- end + -- end + self.LS=CS + self.txl1=x1 + self.txl2=x2 + self.tyl1=y1 + self.tyl2=y2 + end + end) + function obj:OnDoubleTap(func) + table.insert(self.ToDTFunc,func) + end + function obj:On2TouchMoved(func) + table.insert(self.To2Func,func) + end + function obj:addTID(id) + table.insert(self.tid,id) + end + function obj:OnTouchPressed(func) + table.insert(self.ToFuncP,func) -- event for touches + end + function obj:OnTouchReleased(func) -- event for touches + table.insert(self.ToFuncR,func) + end + function obj:OnTouchMoved(func) -- event for touches + table.insert(self.ToFuncM,func) + end + if _GuiPro.TouchReady then -- my sneaky test + print("Registred: "..tostring(obj)) + table.insert(_GuiPro.TouchRegister,obj) + else + print("Attempting to register: "..tostring(obj)) + _GuiPro.int:newJob(function() table.insert(_GuiPro.TouchRegister,obj) end) -- a sneaky way to ensure that your object gets registered eventually, even if you call the method before the touch patch was activated. + end +end + +function UpdateThings(items) + for i=#items,1,-1 do + if items[i]:LClicked() then + for g=1,#items[i].funcs do + items[i].funcs[g]("l",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + elseif items[i]:RClicked() then + for g=1,#items[i].funcs do + items[i].funcs[g]("r",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + elseif items[i]:MClicked() then + for g=1,#items[i].funcs do + items[i].funcs[g]("m",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + end + if not(items[i]:LClicked()) and items[i].LRE then + for g=1,#items[i].funcs2 do + items[i].funcs2[g]("l",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + elseif not(items[i]:RClicked()) and items[i].RRE then + for g=1,#items[i].funcs2 do + items[i].funcs2[g]("r",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + elseif not(items[i]:MClicked()) and items[i].MRE then + for g=1,#items[i].funcs2 do + items[i].funcs2[g]("m",items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + end + if items[i]:Hovering() and items[i].HE==false then + for g=1,#items[i].funcs3 do + items[i].funcs3[g](items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + elseif not(items[i]:Hovering()) and items[i].HE==true then + for g=1,#items[i].funcs4 do + items[i].funcs4[g](items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + elseif items[i]:Hovering() then + for g=1,#items[i].func9 do + items[i].func9[g](items[i],love.mouse.getX()-items[i].x,love.mouse.getY()-items[i].y) + end + end + for g=1,#items[i].funcs5 do + items[i].funcs5[g](items[i]) + end + end +end +function GetAllChildren(Object) + local Stuff = {} + function Seek(Items) + for i=1,#Items do + if Items[i].Visible==true then + table.insert(Stuff,Items[i]) + local NItems = Items[i]:getChildren() + if NItems ~= nil then + Seek(NItems) + end + end + end + end + local Objs = Object:getChildren() + for i=1,#Objs do + if Objs[i].Visible==true then + table.insert(Stuff,Objs[i]) + local Items = Objs[i]:getChildren() + if Items ~= nil then + Seek(Items) + end + end + end + return Stuff +end +function GetAllChildren2(Object) + local Stuff = {} + function Seek(Items) + for i=1,#Items do + table.insert(Stuff,Items[i]) + local NItems = Items[i]:getChildren() + if NItems ~= nil then + Seek(NItems) + end + end + end + local Objs = Object:getChildren() + for i=1,#Objs do + table.insert(Stuff,Objs[i]) + local Items = Objs[i]:getChildren() + if Items ~= nil then + Seek(Items) + end + end + return Stuff +end +function gui:getTile(i,x,y,w,h)-- returns imagedata + if type(i)=="string" then + i=love.graphics.newImage(i) + elseif type(i)=="userdata" then + -- do nothing + elseif string.find(self.Type,"Image",1,true) then + local i,x,y,w,h=self.Image,i,x,y,w + else + error("getTile invalid args!!! Usage: ImageElement:getTile(x,y,w,h) or gui:getTile(imagedata,x,y,w,h)") + end + local iw,ih=i:getDimensions() + local id,_id=i:getData(),love.image.newImageData(w,h) + for _x=x,w+x-1 do + for _y=y,h+y-1 do + -- + _id:setPixel(_x-x,_y-y,id:getPixel(_x,_y)) + end + end + return love.graphics.newImage(_id) +end +function gui:newAnim(file,delay, x, y, w, h, sx ,sy ,sw ,sh) + local x,y,w,h,sx,sy,sw,sh=filter(file, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("ImageAnimation",file, x, y, w, h, sx ,sy ,sw ,sh) + c.Visibility=0 + c.ImageVisibility=1 + c.delay=delay or .05 + c.files={} + c.AnimStart={} + c.AnimEnd={} + local _files=alphanumsort(love.filesystem.getDirectoryItems(file)) + for i=1,#_files do + if string.sub(_files[i],-1,-1)~="b" then + table.insert(c.files,love.graphics.newImage(file.."/".._files[i])) + end + end + c.step=multi:newTStep(1,#c.files,1,c.delay) + c.step.parent=c + c.rotation=0 + c.step:OnStart(function(step) + for i=1,#step.parent.AnimStart do + step.parent.AnimStart[i](step.parent) + end + end) + c.step:OnStep(function(pos,step) + step.parent:SetImage(step.parent.files[pos]) + end) + c.step:OnEnd(function(step) + for i=1,#step.parent.AnimEnd do + step.parent.AnimEnd[i](step.parent) + end + end) + function c:OnAnimStart(func) + table.insert(self.AnimStart,func) + end + function c:OnAnimEnd(func) + table.insert(self.AnimEnd,func) + end + function c:Pause() + self.step:Pause() + end + function c:Resume() + self.step:Resume() + end + function c:Reset() + self.step.pos=1 + end + function c:getFrames() + return #self.files + end + function c:getFrame() + return self.step.pos + end + function c:setFrame(n) + return self:SetImage(self.files[n]) + end + return c +end +function gui:newAnimFromData(data,delay, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("ImageAnimation","FromFile", x, y, w, h, sx ,sy ,sw ,sh) + c.Visibility=0 + c.ImageVisibility=1 + c.delay=delay or .05 + c.files=data + c.AnimStart={} + c.AnimEnd={} + c:SetImage(c.files[1]) + c.step=multi:newTStep(1,#c.files,1,c.delay) + c.step.parent=c + c.rotation=0 + c.step:OnStart(function(step) + for i=1,#step.parent.AnimStart do + step.parent.AnimStart[i](step.parent) + end + end) + c.step:OnStep(function(pos,step) + step.parent:SetImage(step.parent.files[pos]) + end) + c.step:OnEnd(function(step) + for i=1,#step.parent.AnimEnd do + step.parent.AnimEnd[i](step.parent) + end + end) + function c:OnAnimStart(func) + table.insert(self.AnimStart,func) + end + function c:OnAnimEnd(func) + table.insert(self.AnimEnd,func) + end + function c:Pause() + self.step:Pause() + end + function c:Resume() + self.step:Resume() + end + function c:Reset() + self.step.pos=1 + end + function c:getFrames() + return #self.files + end + function c:getFrame() + return self.step.pos + end + function c:setFrame(n) + return self:SetImage(self.files[n]) + end + return c +end +function gui:newAnimFromTiles(file,xd,yd,delay, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(file, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("ImageAnimation",file, x, y, w, h, sx ,sy ,sw ,sh) + local im=love.graphics.newImage(file) + local _x,_y=im:getDimensions() + c.Visibility=0 + c.ImageVisibility=1 + c.delay=delay or .05 + c.files={} + c.AnimStart={} + c.AnimEnd={} + for i=0,_y/yd-1 do + for j=0,_x/xd-1 do + table.insert(c.files,gui:getTile(im,j*xd,i*yd,xd,yd)) + end + end + c:SetImage(c.files[1]) + c.step=multi:newTStep(1,#c.files,1,c.delay) + c.step.parent=c + c.rotation=0 + c.step:OnStart(function(step) + for i=1,#step.parent.AnimStart do + step.parent.AnimStart[i](step.parent) + end + end) + c.step:OnStep(function(pos,step) + step.parent:SetImage(step.parent.files[pos]) + end) + c.step:OnEnd(function(step) + for i=1,#step.parent.AnimEnd do + step.parent.AnimEnd[i](step.parent) + end + end) + function c:OnAnimStart(func) + table.insert(self.AnimStart,func) + end + function c:OnAnimEnd(func) + table.insert(self.AnimEnd,func) + end + function c:Pause() + self.step:Pause() + end + function c:Resume() + self.step:Resume() + end + function c:Reset() + self.step.pos=1 + end + function c:getFrames() + return #self.files + end + function c:getFrame() + return self.step.pos + end + function c:setFrame(n) + return self:SetImage(self.files[n]) + end + return c +end +function gui:newFullImageLabel(i,name) + return self:newImageLabel(i,name,0,0,0,0,0,0,1,1) +end +function gui:newImageButton(i,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("ImageButton",name, x, y, w, h, sx ,sy ,sw ,sh) + if type(i)=="string" then + c.Image=love.graphics.newImage(i) + else + c.Image=i + end + c.Visibility=0 + c.ImageVisibility=1 + c.rotation=0 + if c.Image~=nil then + c.ImageHeigth=c.Image:getHeight() + c.ImageHeight=c.Image:getHeight() + c.ImageWidth=c.Image:getWidth() + c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth) + end + c:OnEnter(function() + love.mouse.setCursor(_GuiPro.CursorH) + end) + c:OnExit(function() + love.mouse.setCursor(_GuiPro.CursorN) + end) + return c +end +function gui:newImageLabel(i,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("ImageLabel",name, x, y, w, h, sx ,sy ,sw ,sh) + if type(i)=="string" then + c.Image=love.graphics.newImage(i) + else + c.Image=i + end + c.Visibility=0 + c.ImageVisibility=1 + c.rotation=0 + if c.Image~=nil then + c.ImageHeigth=c.Image:getHeight() + c.ImageWidth=c.Image:getWidth() + c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth) + end + return c +end +function gui:newVideo(name,i,x,y,w,h,sx,sy,sw,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("Video",name, x, y, w, h, sx ,sy ,sw ,sh) + if type(i)=="string" then + c.Video=love.graphics.newVideo(i) + else + c.Video=i + end + c.Visibility=0 + c.VideoVisibility=1 + c.rotation=0 + if c.Video~=nil then + c.VideoHeigth=c.Video:getHeight() + c.VideoWidth=c.Video:getWidth() + c.Quad=love.graphics.newQuad(0,0,w,h,c.VideoWidth,c.VideoHeigth) + end + c.funcV={} + function c:Play() + self.handStart=true + self.Video:play() + end + function c:Pause() + self.Video:pause() + end + c.Resume=c.Play + function c:Stop() + self.handStart=false + self:Pause() + self:Rewind() + for i=1,# self.funcV do + self.funcV[i](self) + end + end + function c:OnVideoStopped(func) + table.insert(self.funcV,func) + end + function c:Rewind() + self.Video:rewind() + end + function c:Restart() + self:Rewind() + self:Play() + end + function c:Seek(o) + self.Video:seek(o) + end + function c:Tell() + self.Video:tell() + end + function c:SetFilter(min, mag, anisotropy) + self.Video:setFilter(min, mag, anisotropy) + end + function c:IsPlaying() + return self.Video:isPlaying() + end + c:OnUpdate(function(self) + if self.Video:isPlaying()==false and self.handStart == true then + self:Stop() + end + end) + return c +end +function gui:SetImage(i) + if type(i)=="string" then + self.Image=love.graphics.newImage(i) + else + self.Image=i + end + if self.Image~=nil then + self.ImageHeigth=self.Image:getHeight() + self.ImageWidth=self.Image:getWidth() + self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth) + end + return self.ImageWidth,self.ImageHeigth +end +function gui:UpdateImage() + self.ImageHeigth=self.Image:getHeight() + self.ImageWidth=self.Image:getWidth() + self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth) +end +function gui:newDropFrame(name,x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("DropFrame",name, x, y, w, h, sx ,sy ,sw ,sh) + c.WasBeingDragged=false + c.IsBeingDragged=false + c.Draggable=false + c.funcD={} + function c:GetDroppedItems() + local t=self:getChildren() + local tab={} + for i=1,#t do + if t[i].Type=="TextImageButtonFrameDrag" then + table.insert(tab,t[i]) + end + end + return tab + end + function c:OnDropped(func) + table.insert(self.funcD,func) + end + c:OnUpdate(function(self) + if _GuiPro.DragItem then + if _GuiPro.DragItem.Type=="TextImageButtonFrameDrag" and love.mouse.isDown(_GuiPro.DragItem.dragbut or "m")==false and self:IsHovering() then + local t=_GuiPro.DragItem + _GuiPro.DragItem={} + for i=1,#t.funcD do + t.funcD[i](self,t) + end + for i=1,#self.funcD do + self.funcD[i](self,t) + end + _GuiPro.hasDrag=false + end + end + end) + return c +end +function gui:newFrame(name,x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("Frame",name, x, y, w, h, sx ,sy ,sw ,sh) + c.WasBeingDragged=false + c.IsBeingDragged=false + c.Draggable=false + return c +end +function gui:newFullFrame(name) + name=name or "" + return self:newFrame(name,0,0,0,0,0,0,1,1) +end + +function gui:newTabFrame(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=gui:newFrame(name, x, y, w, h, sx ,sy ,sw ,sh) + c.tabheight=20 + c.Holder=c:newFrame("Holder",0,c.tabheight,0,0,0,0,1,1) + c.TabHolder=c:newFrame("TabHolder",0,0,0,c.tabheight,0,0,1) + function c:setTabHeight(n) + self.tabheight=n + self.Holder:SetDualDim(0,-self.tabheight,0,0,0,0,1,1) + end + function c:addTab(name,colorT,colorH) + if colorT and not(colorH) then + colorH=colorT + end + local tab=self.TabHolder:newTextButton(name,name,0,0,0,0,0,0,0,1) + tab.Tween=-3 + if colorT then + tab.Color=colorT + end + local holder=self.Holder:newFrame(name,0,0,0,0,0,0,1,1) + if colorH then + holder.Color=colorH + end + tab.frame=holder + tab:OnReleased(function(b,self) + if b=="l" then + local tt=self.Parent:getChildren() + local th=self.Parent.Parent.Holder:getChildren() + for i=1,#th do + th[i].Visible=false + end + for i=1,#tt do + tt[i].frame.Visible=false + tt[i].BorderSize=1 + end + self.BorderSize=0 + self.frame.Visible=true + end + end) + local tt=self.TabHolder:getChildren() + for i=1,#tt do + tt[i].frame.Visible=false + tt[i].BorderSize=1 + end + tab.frame.Visible=true + tab.BorderSize=0 + return tab,holder + end + c:OnUpdate(function(self) + local th=self.TabHolder:getChildren() + local l=self.width/#th + for i=1,#th do + th[i]:SetDualDim(l*(i-1),0,l) + end + if #th==0 then + self:Destroy() + end + end) + return c +end +function gui:newDragItem(t,i,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("TextImageButtonFrameDrag",name, x, y, w, h, sx ,sy ,sw ,sh) + c.WasBeingDragged=false + c.IsBeingDragged=false + c.Draggable=true + c.funcD={} + if type(i)=="string" then + c.Image=love.graphics.newImage(i) + c.ImageVisibility=1 + c.ImageHeigth=c.Image:getHeight() + c.ImageWidth=c.Image:getWidth() + c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth) + elseif type(i)=="image" then + c.Image=i + c.ImageVisibility=1 + c.ImageHeigth=c.Image:getHeight() + c.ImageWidth=c.Image:getWidth() + c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth) + end + c:OnDragStart(function(self,x,y) + if _GuiPro.hasDrag==false then + self:setParent(_GuiPro) + self:SetDualDim(x,y) + self:TopStack() + end + end) + c.rotation=0 + c.Tween=0 + c.XTween=0 + c.text = t + c.AutoScaleText=false + c.FontHeight=_defaultfont:getHeight() + c.Font=_defaultfont + c.FontSize=15 + c.TextFormat="center" + c.TextVisibility=1 + c.TextColor = {0, 0, 0} + function c:OnDropped(func) + table.insert(self.funcD,func) + end + c:OnUpdate(function(self) + if love.mouse.isDown("m" or self.dragbut)==false and self==_GuiPro.DragItem and self.hovering==false then + _GuiPro.DragItem={} + for i=1,#self.func7 do + self.func7[i](self,(love.mouse.getX())-self.width/2,(love.mouse.getY())-self.height/2) + end + end + end) + return c +end +function gui:newItem(t,i,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("TextImageButtonFrame",name, x, y, w, h, sx ,sy ,sw ,sh) + if type(i)=="string" then + c.Image=love.graphics.newImage(i) + else + c.Image=i + end + c.rotation=0 + c.ImageVisibility=1 + c.Draggable=false + if c.Image~=nil then + c.ImageHeigth=c.Image:getHeight() + c.ImageWidth=c.Image:getWidth() + c.Quad=love.graphics.newQuad(0,0,w,h,c.ImageWidth,c.ImageHeigth) + end + c.Tween=0 + c.XTween=0 + c.text = t + c.AutoScaleText=false + c.FontHeight=_defaultfont:getHeight() + c.Font=_defaultfont + c.FontSize=15 + c.TextFormat="center" + c.TextVisibility=1 -- 0=invisible,1=solid (self.TextVisibility*254+1) + c.TextColor = {0, 0, 0} + return c +end +function gui:addDominance() + _GuiPro.TopHovered=self +end +function gui:addHotKey(key) + local temp=self:newFrame(0,0,0,0) + temp.Visible=false + temp:setHotKey(key) + return temp +end +function gui:AdvTextBox(txt,x,y,w,h,sx,sy,sw,sh) + name="AdvTextBox" + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("AdvTextBoxFrame",name, x, y, w, 30, sx ,sy ,sw ,sh) + c.Draggable=true + c.dragbut="r" + c.BorderSize=0 + c:ApplyGradient{Color.Blue,Color.sexy_purple} + c:newTextLabel(txt,"Holder",0,0,0,h-30,0,1,1,0).Color=Color.sexy_purple + c.funcO={} + c.funcX={} + c:OnDragStart(function(self) + self:TopStack() + end) + --local temp = c:newTextButton("X","Close",-25,5,20,20,1) + --temp.Tween=-5 + --temp.XTween=-2 + --temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent) end end) + --temp.Color=Color.Red + c.tLink=c:newTextBox("puttext","TextBox",5,h-95,-40,30,0,1,1,1) + c.tLink.Color=Color.light_gray + c.tLink.ClearOnFocus=true + c.tLink:OnFocus(function(self) self.ClearOnFocus=false end) + local temp=c:newTextButton("OK","Ok",-35,h-65,30,30,1,1) + temp:OnReleased(function(b,self) for i=1,#self.Parent.funcO do self.Parent.funcO[i](self.Parent,self.Parent.tLink.text) end end) + temp.Color=Color.Green + temp.XTween=-2 + local temp=c:newTextButton("X","Cancel",-35,h-95,30,30,1,1) + temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent,self.Parent.tLink.text) end end) + temp.Color=Color.Red + temp.XTween=-2 + function c:Close() + self.Visible=false + end + function c:Open() + self.Visible=true + end + function c:OnOk(func) + table.insert(self.funcO,func) + end + function c:OnX(func) + table.insert(self.funcX,func) + end + return c +end +function alphanumsort(o) + local function padnum(d) local dec, n = string.match(d, "(%.?)0*(.+)") + return #dec > 0 and ("%.12f"):format(d) or ("%s%03d%s"):format(dec, #n, n) + end + table.sort(o, function(a,b) return tostring(a):gsub("%.?%d+",padnum)..("%3d"):format(#b)< tostring(b):gsub("%.?%d+",padnum)..("%3d"):format(#a) end) + return o +end +function gui:anchorRight(n) + self:SetDualDim(-(self.width+n),nil,nil,nil,1) +end +function _GuiPro.gradient(colors) + local direction = colors.direction or "horizontal" + colors.direction=nil + trans = colors.trans or 255 + trans=math.floor(trans) + if direction == "horizontal" then + direction = true + elseif direction == "vertical" then + direction = false + else + error("Invalid direction '" .. tostring(direction) "' for gradient. Horizontal or vertical expected.") + end + local result = love.image.newImageData(direction and 1 or #colors, direction and #colors or 1) + for __i, color in ipairs(colors) do + local x, y + if direction then + x, y = 0, __i - 1 + else + x, y = __i - 1, 0 + end + result:setPixel(x, y, color[1], color[2], color[3], trans) + end + result = love.graphics.newImage(result) + result:setFilter('linear', 'linear') + return result +end +function _GuiPro.drawinrect(img, x, y, w, h, r, ox, oy, kx, ky) + love.graphics.draw(img, x, y, r, w / img:getWidth(), h / img:getHeight(), ox, oy, kx, ky) +end +function gui:ApplyGradient(rules) + self.Image=nil + self.Type=self.Type.."w/GradImage" + self.rotation=0 + self.ImageVisibility=rules.visibility or 1 + self:SetImage(_GuiPro.gradient(rules)) +end +function gui:BottomStack() + childs=self.Parent:getChildren() + for i=1,#childs do + if childs[i]==self then + table.remove(self.Parent.Children,i) + table.insert(self.Parent.Children,1,self) + break + end + end +end +function gui:Center() + local x,y=self:getFullSize() + self:SetDualDim(-math.floor(x/2),-math.floor(y/2),nil,nil,.5,.5) +end +function gui:centerX() + self:SetDualDim(-(self.width/2),nil,nil,nil,.5) +end +function gui:centerY() + self:SetDualDim(nil,-(self.height/2),nil,nil,nil,.5) +end +function gui:Destroy() + check=self.Parent:getChildren() + local cc=0 + for cc=1,#check do + if check[cc]==self then + table.remove(self.Parent.Children,cc) + end + end +end +function gui:disrespectHierarchy() + _GuiPro.Hierarchy=false +end +function gui:GetAllChildren() + local Stuff = {} + function Seek(Items) + for i=1,#Items do + if Items[i].Visible==true then + table.insert(Stuff,Items[i]) + local NItems = Items[i]:getChildren() + if NItems ~= nil then + Seek(NItems) + end + end + end + end + local Objs = self:getChildren() + for i=1,#Objs do + if Objs[i].Visible==true then + table.insert(Stuff,Objs[i]) + local Items = Objs[i]:getChildren() + if Items ~= nil then + Seek(Items) + end + end + end + return Stuff +end +function gui:GetChild(name) + return self.Children[name] or self +end +function gui:getChildren() + return self.Children +end +function gui:getColor(cindex) + return Color[cindex] +end +function gui:getFullSize() + local maxx,maxy=-math.huge,-math.huge + local temp = self:GetAllChildren() + for i=1,#temp do + if temp[i].width>maxx then + maxx=temp[i].width+temp[i].offset.pos.x + elseif temp[i].height>maxy then + maxy=temp[i].height+temp[i].offset.pos.y + end + end + return maxx,maxy +end +function gui:getHighest() + if self.Children[#self.Children]~=nil then + return self.Children[#self.Children] + end +end +function gui:getLowest() + if self.Children[1]~=nil then + return self.Children[1] + end +end +function InGrid(i,x,y,s) + return math.floor((i-1)/x)*s,(i-1)*s-(math.floor((i-1)/y)*(s*x)) +end +function InGridX(i,w,h,xs,ys) + local xc,yc=math.floor(w/xs),math.floor(h/ys) + local xi,yi=(i-1)%xc,math.floor((i-1)/xc) + return xi*xs,yi*ys +end +function InGridY(i,w,h,xs,ys) + local xc,yc=math.floor(w/xs),math.floor(h/ys) + local xi,yi=math.floor((i-1)/yc),(i-1)%yc + return xi*xs,yi*ys +end +function gui:isDescendant(obj) + local things=obj:GetAllChildren() + for i=1,#things do + if things[i]==self then + return true + end + end + return false +end +function gui:isHighest() + return (self==self.Parent:getHighest()) +end +function gui:IsHovering() + return (love.mouse.getX() > self.x and love.mouse.getX() < self.x+self.width and love.mouse.getY() > self.y and love.mouse.getY() < self.y+self.height) +end +function gui:isLowest() + return (self==self.Parent:getLowest()) +end +function gui.massMutate(t,...) + local mut={...} + for i=1,#mut do + mut[i]:Mutate(t) + end +end +function gui:Move(x,y) + self.offset.pos.x=self.offset.pos.x+x + self.offset.pos.y=self.offset.pos.y+y +end +if love.filesystem.exists("CheckBoxes.png") then + _GuiPro.UC=gui:getTile("CheckBoxes.png",0,0,16,16) + _GuiPro.C=gui:getTile("CheckBoxes.png",16,0,16,16) + _GuiPro.UCH=gui:getTile("CheckBoxes.png",0,16,16,16) + _GuiPro.CH=gui:getTile("CheckBoxes.png",16,16,16,16) +end +function gui:newCheckBox(name,x,y) + if not(_GuiPro.UC) then error("CheckBoxes.png not found! Cannot currently use checkbox without the data") end + if type(name)~="String" then + x,y,name=name,x,"CheckBox" + end + local c=self:newImageLabel(_GuiPro.UC,name, x, y, 16,16) + c.Visibility=0 + c.check=false + c:OnEnter(function(self) + if self.check then + self:SetImage(_GuiPro.CH) + else + self:SetImage(_GuiPro.UCH) + end + end) + function c:isChecked() + return self.check + end + c:OnExit(function(self) + if self.check then + self:SetImage(_GuiPro.C) + else + self:SetImage(_GuiPro.UC) + end + end) + c:OnReleased(function(b,self) + self.check=not(self.check) + if self.check then + self:SetImage(_GuiPro.CH) + else + self:SetImage(_GuiPro.UCH) + end + end) + return c +end +function gui:newMessageBox(txt,x,y,w,h,sx,sy,sw,sh) + name="MessageBox" + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("MessageBoxFrame",name, x, y, w, 30, sx ,sy ,sw ,sh) + c.Draggable=true + c.dragbut="r" + c:ApplyGradient{Color.Blue,Color.sexy_purple} + c.BorderSize=0 + c:newTextLabel(txt,"Holder",0,0,0,h-30,0,1,1,0).Color=Color.sexy_purple + c.funcO={} + c.funcX={} + c:OnDragStart(function(self) + self:TopStack() + end) + local temp = c:newTextButton("X","Close",-25,5,20,20,1) + temp.Tween=-5 + temp.XTween=-2 + temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent) end end) + temp.Color=Color.Red + local temp=c:newTextButton("OK","Ok",0,h-65,0,30,.25,1,.5) + temp:OnReleased(function(b,self) for i=1,#self.Parent.funcO do self.Parent.funcO[i](self.Parent) end end) + temp.Color=Color.Green + function c:Close() + self.Visible=false + end + function c:Open() + self.Visible=true + end + function c:OnOk(func) + table.insert(self.funcO,func) + end + function c:OnX(func) + table.insert(self.funcX,func) + end + return c +end +function gui:newPart(x, y,w ,h , sx ,sy ,sw ,sh) + local c = {} + setmetatable(c, gui) + if self==gui then + c.Parent=_GuiPro + else + c.Parent=self + end + c.funcs={} + c.funcs2={} + c.funcs3={} + c.funcs4={} + c.funcs5={} + c.func6={} + c.func7={} + c.func8={} + c.func9={} + c.func10={} + c.form="rectangle" + c.Color = {255, 255, 255} + c.scale={} + c.scale.size={} + c.scale.size.x=sw or 0 + c.scale.size.y=sh or 0 + c.offset={} + c.offset.size={} + c.offset.size.x=w or 0 + c.offset.size.y=h or 0 + c.scale.pos={} + c.scale.pos.x=sx or 0 + c.scale.pos.y=sy or 0 + c.offset.pos={} + c.offset.pos.x=x or 0 + c.offset.pos.y=y or 0 + c.VIS=true + c.Visible=true + c.Visibility=1 + c.BorderColor={0,0,0} + c.BorderSize=0 + c.Type="Part" + c.Name="GuiPart" + _GuiPro.count=_GuiPro.count+1 + c.x=(c.Parent.width*c.scale.pos.x)+c.offset.pos.x+c.Parent.x + c.y=(c.Parent.height*c.scale.pos.y)+c.offset.pos.y+c.Parent.y + c.width=(c.Parent.width*c.scale.size.x)+c.offset.size.x + c.height=(c.Parent.height*c.scale.size.y)+c.offset.size.y + table.insert(c.Parent.Children,c) + return c +end +function gui:newProgressBar(txt,x,y,w,h,sx,sy,sw,sh) + name="newProgressBar" + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("newProgressBarFrame",name, x, y, w, 30, sx ,sy ,sw ,sh) + c.Draggable=true + c.dragbut="r" + c.BorderSize=0 + c:ApplyGradient{Color.Blue,Color.sexy_purple} + c:newTextLabel(txt,"Holder",0,0,0,h-30,0,1,1,0).Color=Color.sexy_purple + c.funcO={} + c.funcX={} + c:OnDragStart(function(self) + self:TopStack() + end) + local temp = c:newTextButton("X","Close",-25,5,20,20,1) + temp.Tween=-5 + temp.XTween=-2 + temp:OnReleased(function(b,self) for i=1,#self.Parent.funcX do self.Parent.funcX[i](self.Parent) end end) + temp.Color=Color.Red + c.BarBG=c:newTextButton("",5,h-65,-10,30,0,1,1) + c.BarBG:ApplyGradient{Color.Red,Color.light_red} + c.Bar=c.BarBG:newTextLabel("",0,0,0,0,0,0,0,1) + c.Bar:ApplyGradient{Color.Green,Color.light_green} + c.BarDisp=c.BarBG:newTextLabel("0%","0%",0,0,0,0,0,0,1,1) + c.BarDisp.Visibility=0 + c.BarDisp.Link=c.Bar + c.BarDisp:OnUpdate(function(self) + self.text=self.Link.scale.size.x*100 .."%" + end) + c.Func1={} + function c:On100(func) + table.insert(self.Func1,func) + end + c:OnUpdate(function(self) + if self.Bar.scale.size.x*100>=100 then + for P=1,#self.Func1 do + self.Func1[P](self) + end + end + end) + function c:SetPercentage(n) + self.Bar:SetDualDim(0,0,0,0,0,0,n/100,1) + end + return c +end +function gui:newScrollBar(color1,color2) + local scrollbar=self:newFrame(-20,0,20,0,1,0,0,1) + scrollbar.funcS={} + scrollbar.Color=color1 or Color.saddle_brown + scrollbar:OnClicked(function(b,self,x,y) + love.mouse.setX(self.x+10) + if y>=10 and y<=self.height-10 then + self.mover:SetDualDim(0,y-10) + end + if y<10 then + love.mouse.setY(10+self.y) + end + if y>self.height-10 then + love.mouse.setY((self.height-10)+self.y) + end + for i=1,#self.funcS do + self.funcS[i](self,self:getPosition()) + end + end) + scrollbar:OnEnter(function(self) + self:addDominance() + end) + scrollbar:OnExit(function(self) + self:removeDominance() + end) + scrollbar.mover=scrollbar:newTextButton("","",0,0,20,20) + scrollbar.mover.Color=color2 or Color.light_brown + function scrollbar:getPosition() + return ((self.mover.offset.pos.y)/(self.height-20))*100 + end + function scrollbar:setPosition(n) + print((self.height-20),n) + self.mover.offset.pos.y=((self.height-20)/(100/n)) + for i=1,#self.funcS do + self.funcS[i](self,self:getPosition()) + end + end + function scrollbar:OnScroll(func) + table.insert(self.funcS,func) + end + return scrollbar +end +function gui:newScrollMenu(title,tabN,onloop,x, y, w, h, sx ,sy ,sw ,sh) + local Main = self:newFrame(x, y, w, h, sx ,sy ,sw ,sh) + local Title=Main:newTextButton(title,"Title",0,0,0,20,0,0,1) + Title.Tween=-4 + Title.FontSize=12 + Title:OnReleased(function(b,self) + self.Parent.Tick=not(self.Parent.Tick) + end) + local scroll=Main:newTextButton("","Scroll",-20,20,20,-20,1,0,0,1) + scroll:OnClicked(function(b,self,x,y) + self.Parent.Mover:SetDualDim(0,y-10,20,20) + if self.Parent.Mover.offset.pos.y<0 then + self.Parent.Mover:SetDualDim(0,0,20,20) + end + if self.Parent.Mover.offset.pos.y>self.Parent.height-40 then + self.Parent.Mover:SetDualDim(0,self.Parent.height-40,20,20) + end + local temp = #self.Parent.TList + self.Parent.pos=(math.floor((temp*self.Parent.Mover.offset.pos.y)/self.height))+1 + end) + Main:OnUpdate(function(self) + if self.Tick==false then + self.Visibility=0 + end + end) + scroll:OnUpdate(function(self) + self.Visible=self.Parent.Tick + end) + local Mover=scroll:newTextLabel("",0,0,20,20) + Main.Mover=Mover + Main.TList=tabN + Main.pos=1 + Main.Tick=true + function Main:Update(title,tabN,onloop) + ch=self:getChildren() + for i=#ch,1,-1 do + ch[i]:Destroy() + end + Title=Main:newTextButton(title,"Title",0,0,0,20,0,0,1) + Title.Tween=-4 + Title.FontSize=12 + Title:OnReleased(function(b,self) + self.Parent.Tick=not(self.Parent.Tick) + end) + scroll=Main:newTextButton("","Scroll",-20,20,20,-20,1,0,0,1) + scroll:OnClicked(function(b,self,x,y) + self.Parent.Mover:SetDualDim(0,y-10,20,20) + if self.Parent.Mover.offset.pos.y<0 then + self.Parent.Mover:SetDualDim(0,0,20,20) + end + if self.Parent.Mover.offset.pos.y>self.Parent.height-40 then + self.Parent.Mover:SetDualDim(0,self.Parent.height-40,20,20) + end + local temp = #self.Parent.TList + self.Parent.pos=(math.floor((temp*self.Parent.Mover.offset.pos.y)/self.height))+1 + end) + local Mover=scroll:newTextLabel("",0,0,20,20) + Main.Mover=Mover + Main.TList=tabN + Main.pos=1 + Main.Tick=true + scroll:OnUpdate(function(self) + self.Visible=self.Parent.Tick + end) + for i=1,math.floor(Main.height/20)-1 do + local temp=Main:newTextButton("","Item"..i,0,i*20,-20,20,0,0,1) + temp.FontSize=10 + temp.Tween=-4 + temp.pos=i + temp:OnUpdate(function(self) + self.text=self.Parent.TList[(self.Parent.pos+self.pos)-1] + self.Visible=self.Parent.Tick + end) + if onloop then + onloop(temp,i) + end + end + end + io.write(tostring(Main.height).."\n") + for i=1,math.floor(Main.height/20)-1 do + local temp=Main:newTextButton("Item"..i,0,i*20,-20,20,0,0,1) + temp.FontSize=10 + temp.Tween=-4 + temp.pos=i + temp:OnUpdate(function(self) + if self.Parent.TList[(self.Parent.pos+self.pos)-1]~=nil then + self.text=self.Parent.TList[(self.Parent.pos+self.pos)-1] + else + self.text="" + end + self.Visible=self.Parent.Tick + end) + if onloop then + onloop(temp,i) + end + end + return Main +end +function gui:destroyAllChildren() + local c=self.Children + for i=1,#c do + c[i]:Destroy() + end +end +function gui:removeDominance() + _GuiPro.TopHovered=nil +end +function gui:respectHierarchy() + _GuiPro.Hierarchy=true +end +function gui.round(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end +function gui.setBG(i) + gui.ff:SetImage(i) +end +function gui:setColor(a,b,c) + if type(a)=="string" then + self.Color=Color[a] + elseif type(a)=="number" then + self.Color=Color.new(a,b,c) + end +end +function gui:setTextColor(a,b,c) + if type(a)=="string" then + self.TextColor=Color[a] + elseif type(a)=="number" then + self.TextColor=Color.new(a,b,c) + end +end +function gui:setDefualtFont(font) + _defaultfont = font +end +function gui:SetDualDim(x, y, w, h, sx ,sy ,sw ,sh) + if _GuiPro.DPI_ENABLED then + if x then + x=self.DPI*x + end + if y then + y=self.DPI*y + end + if w then + w=self.DPI*w + end + if h then + h=self.DPI*h + end + end + if sx then + self.scale.pos.x=sx + end + if sy then + self.scale.pos.y=sy + end + if x then + self.offset.pos.x=x + end + if y then + self.offset.pos.y=y + end + if sw then + self.scale.size.x=sw + end + if sh then + self.scale.size.y=sh + end + if w then + self.offset.size.x=w + end + if h then + self.offset.size.y=h + end + if self.Image then + self:SetImage(self.Image) + end +end +function gui:setDualDim(...) + self:SetDualDim(...) +end +function gui:setText(txt) + self.text=txt +end +function gui:getText(txt) + return self.text +end +_GuiPro.CursorN=love.mouse.getSystemCursor("arrow") +_GuiPro.CursorH=love.mouse.getSystemCursor("hand") +function gui:SetHand(img,x,y) + _GuiPro.CursorN=love.mouse.newCursor(img,x,y) +end +function gui:setHotKey(key) + local tab=key:split("+") + self.hotkeys=tab + self.cooldown=false + self.Alarm=multi:newAlarm(1) + self.Alarm.parent=self + self.args={} + self.funcHK=multi:newConnection() + self.Alarm:OnRing(function(alarm) alarm.parent.cooldown=false end) + function self:OnHotKey(func) + self.funcHK:connect(func) + end + self:OnUpdate(function(self) + if self.cooldown then return end + for i=1,#self.hotkeys do + if not(love.keyboard.isDown(self.hotkeys[i])) then + return + end + end + self.cooldown=true + self.funcHK:Fire(self) + self.Alarm:Reset() + end) +end +function gui:SetHover(img,x,y) + _GuiPro.CursorH=love.mouse.newCursor(img,x,y) +end +function gui:SetName(name) + self.Parent.Children[name]=self + self.Name=name +end +function gui:setNewFont(FontSize) + self.Font=love.graphics.setNewFont(tonumber(FontSize)) +end +function gui:setParent(parent,name)-- Needs fixing!!! + local temp=self.Parent:getChildren() + for i=1,#temp do + if temp[i]==self then + table.remove(self.Parent.Children,i) + break + end + end + table.insert(parent.Children,self) + self.Parent=parent + if name then + self:SetName(name) + end +end +function gui:setVisiblity(val) + self.Visible=val + self.oV=val + doto=self:GetAllChildren() + if val==false then + for i=1,#doto do + doto[i].Visible=val + end + else + for i=1,#doto do + doto[i].Visible=doto[i].oV + end + end +end +function gui:TopStack() + childs=self.Parent:getChildren() + for i=1,#childs do + if childs[i]==self then + table.remove(self.Parent.Children,i) + table.insert(self.Parent.Children,self) + break + end + end +end +function string:insert(p,s) + return ("%s%s%s"):format(self:sub(1,p), s, self:sub(p+1)) +end +function string:remove(p,l) + l=l or 1 + return ("%s%s"):format(self:sub(1,p-1), self:sub(p+l)) +end +function gui:newTextBox(t,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("TextBox",name, x, y, w, h, sx ,sy ,sw ,sh) + c.ClearOnFocus=false + c.LoseFocusOnEnter=true + c.Tween=0 + c.XTween=0 + c.FontHeight=_defaultfont:getHeight() + c.Font=_defaultfont + c.FontSize=15 + c.TextFormat="center" + c.text = t + c.ttext= t + c.AutoScaleText=false + c.TextVisibility=1 + c.Color = {220, 220, 220} + c.TextColor = {0, 0, 0} + c.Active=false + c.hidden=false + c.cursor={0,1} + c.mark=nil + c.arrowkeys=false + c.funcF={function() + love.keyboard.setTextInput(true) + end} + c.cooldown=false + c.cooldown2=false + c.funcE={function() + love.keyboard.setTextInput(false) + end} + function c:triggerEnter() + for cc=1,#self.funcE do + self.funcE[cc](self,self.ttext) + end + self.text="" + self.ttext="" + end + c.Enter=true + c.Alarm=multi:newAlarm(.1) + c.Alarm.parent=c + c.Alarm:OnRing(function(alarm) alarm.parent.cooldown=false end) + c.Alarm2=multi:newAlarm(.5) + c.Alarm2.parent=c + c.Alarm2:OnRing(function(alarm) alarm.parent.cooldown2=false end) + c.ArrowAlarm=multi:newAlarm(.1) + c.ArrowAlarm.parent=c + c.ArrowAlarm:OnRing(function(alarm) alarm.parent.arrowkeys=false end) + function c:OnFocus(func) + table.insert(self.funcF,func) + end + function c:OnEnter(func) + table.insert(self.funcE,func) + end + c:OnClicked(function(b,self) + for cc=1,#self.funcF do + self.funcF[cc](self) + end + if self.Active==false then + if self.ClearOnFocus==true then + self.text="" + self.ttext="" + end + for tb=1,#gui.TB do + if gui.TB[tb]~=nil then + gui.TB[tb].Active=false + end + end + self.Active=true + end + end) + c:OnClicked(function(b,self,x,y) + local dwidth, wrappedtext = _defaultfont:getWrap(self.text:sub(1,self.cursor[1]), self.width) + local height = _defaultfont:getHeight() + if #wrappedtext>=1 then + width= _defaultfont:getWidth(wrappedtext[#wrappedtext]) + self.cursor[2]=#wrappedtext + else + self.cursor[2]=1 + width=0 + end + yc=math.ceil(((y/self.DPI)-(self.FontHeight/2)+self.Tween-self.y)/height) + xc=math.floor(x) + end) + c:AddDrawRuleE(function(self) + if self.Active then + local dwidth, wrappedtext = _defaultfont:getWrap(self.text:sub(1,self.cursor[1]), self.width) + local height = _defaultfont:getHeight() + if #wrappedtext>=1 then + width= _defaultfont:getWidth(wrappedtext[#wrappedtext]) + self.cursor[2]=#wrappedtext + else + self.cursor[2]=1 + width=0 + end + x1=width+2+self.x+self.XTween + y1=(self.y+(height*(self.cursor[2]-1))+(self.FontHeight/2)+self.Tween)*self.DPI + x2=width+2+self.x+self.XTween + y2=(self.y+(self.FontHeight/2)+self.Tween*self.DPI)+height*self.cursor[2] + love.graphics.line(x1,y1,x2,y2) + end + end) + c:OnUpdate(function(self) + if love.keyboard.isDown("backspace") and self.Active and self.cooldown==false then + if #self.text>0 then + self.text = self.text:remove(self.cursor[1]) + self.ttext = self.ttext:remove(self.cursor[1]) + self.cursor[1]=self.cursor[1]-1 + end + self.cooldown=true + self.Alarm:Reset() + elseif love.keyboard.isDown("backspace")==false then + self.cooldown=false + end + if love.keyboard.isDown("left") and self.arrowkeys==false and self.Active then + self.arrowkeys=true + self.cursor[1]=self.cursor[1]-1 + if self.cursor[1]<0 then + self.cursor[1]=0 + end + self.ArrowAlarm:Reset() + elseif love.keyboard.isDown("right") and self.arrowkeys==false and self.Active then + self.arrowkeys=true + self.cursor[1]=self.cursor[1]+1 + if self.cursor[1]>#self.text then + self.cursor[1]=#self.text + end + self.ArrowAlarm:Reset() + end + if love.keyboard.isDown("delete") and self.Active then + if #self.text>0 then + self.text = "" + self.ttext = "" + self.cursor[1]=1 + end + elseif (love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")) and love.keyboard.isDown("return") and self.cooldown2==false then + self.text=self.text.."\n" + self.ttext=self.ttext.."\n" + self.cooldown2=true + c.Alarm2:Reset() + elseif (love.keyboard.isDown("return") or love.keyboard.isDown("enter") or love.keyboard.isDown("kpenter")) and self.Active and self.Enter and not(love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")) then + if self.LoseFocusOnEnter then + self.Active=false + else + self.Active=true + end + for cc=1,#self.funcE do + self.funcE[cc](self,self.ttext) + end + end + end) + table.insert(gui.TB,c) + return c +end +--TEXT BOX HELPER FUNCTION +function love.textinput(t) + for tb=1,#gui.TB do + if gui.TB[tb]~=nil then + if gui.TB[tb].Active then + if gui.TB[tb].hidden then + --gui.TB[tb].text=gui.TB[tb].text.."*" + gui.TB[tb].text=gui.TB[tb].text:insert(gui.TB[tb].cursor[1],"*") + else + --gui.TB[tb].text=gui.TB[tb].text..t + gui.TB[tb].text=gui.TB[tb].text:insert(gui.TB[tb].cursor[1],t) + end + gui.TB[tb].ttext=gui.TB[tb].ttext:insert(gui.TB[tb].cursor[1],t) + gui.TB[tb].cursor[1]=gui.TB[tb].cursor[1]+1 + end + end + end +end +function gui:newTextButton(t,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("TextButton",name, x, y, w, h, sx ,sy ,sw ,sh) + c.Tween=0 + c.XTween=0 + c.FontHeight=_defaultfont:getHeight() + c.Font=_defaultfont + c.FontSize=15 + c.TextFormat="center" + c.text = t + c.AutoScaleText=false + c.TextVisibility=1 -- 0=invisible,1=solid (self.TextVisibility*254+1) + c.Color = {220, 220, 220} + c.TextColor = {0, 0, 0} + c:OnEnter(function() + love.mouse.setCursor(_GuiPro.CursorH) + end) + c:OnExit(function() + love.mouse.setCursor(_GuiPro.CursorN) + end) + return c +end +function gui:newTextLabel(t,name, x, y, w, h, sx ,sy ,sw ,sh) + x,y,w,h,sx,sy,sw,sh=filter(name, x, y, w, h, sx ,sy ,sw ,sh) + local c=self:newBase("TextLabel",name, x, y, w, h, sx ,sy ,sw ,sh) + c.Tween=0 + c.XTween=0 + c.FontHeight=_defaultfont:getHeight() + c.Font=_defaultfont + c.FontSize=15 + c.TextFormat="center" + c.text = t + c.AutoScaleText=false + c.TextVisibility=1 -- 0=invisible,1=solid (self.TextVisibility*254+1) + c.Color = {220, 220, 220} + c.TextColor = {0, 0, 0} + return c +end +function gui:AddDrawRuleB(rule) + if not(self.DrawRulesB) then self.DrawRulesB={} end + table.insert(self.DrawRulesB,rule) +end +function gui:AddDrawRuleE(rule) + if not(self.DrawRulesE) then self.DrawRulesE={} end + table.insert(self.DrawRulesE,rule) +end +function gui:draw() + if _GuiPro.rotate~=0 then + love.graphics.rotate(math.rad(_GuiPro.rotate)) + end + if self.FormFactor:lower()=="rectangle" then + self:drawR() + elseif self.FormFactor:lower()=="circle" then + self:drawC() + else + error("Unsupported FormFactor: "..self.FormFactor.."!") + end +end +function gui:drawC() + if love.mouse.isDown("l")==false and love.mouse.isDown("m")==false and love.mouse.isDown("r")==false then + _GuiPro.DragItem={} + _GuiPro.hasDrag=false + end + if self.Visible==true and self.VIS==true then + local b=true + for i,v in pairs(_GuiPro.Clips) do + if self:isDescendant(v)==true then + b=false + end + end + if b then + love.graphics.setStencilTest( ) + _GuiPro.HasStencel=false + _GuiPro.StencelHolder=nil + end + local x,y,r,s=(self.offset.pos.x or 0)+self.Parent.x,(self.offset.pos.y or 0)+self.Parent.y,self.offset.size.x or 0,self.offset.size.y or 360 + if self.CC then + x,y=x+r,y+r + end + self.x,self.y=x,y + _GuiPro.circleStencilFunction = function() + love.graphics.circle("fill",x,y,r,s) + end + if math.sqrt((love.mouse.getX()-x)^2+(love.mouse.getY()-y)^2)<=r and self:eventable() and self:Clickable() and self.Active==true then + self.hovering=true + if love.mouse.isDown("l") and _GuiPro.hasDrag==false then + if string.find(self.Type, "Button") then + love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.lclicked=true + elseif love.mouse.isDown("r") and _GuiPro.hasDrag==false then + if string.find(self.Type, "Button") then + love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.rclicked=true + elseif love.mouse.isDown("m") and _GuiPro.hasDrag==false then + if string.find(self.Type, "Button") then + love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.mclicked=true + else + if string.find(self.Type, "Button") and _GuiPro.hasDrag==false then + love.graphics.setColor(self.Color[1]-5, self.Color[2]-5, self.Color[3]-5,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.rclicked=false + self.lclicked=false + self.mclicked=false + end + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + self.hovering=false + self.rclicked=false + self.lclicked=false + self.mclicked=false + end + if self.ClipDescendants==true then + _GuiPro.Clips[tostring(self)]=self + _GuiPro.HasStencel=true + _GuiPro.StencelHolder=self + love.graphics.stencil(_GuiPro.circleStencilFunction) + love.graphics.setStencilTest("notequal",0) + end + love.graphics.circle("fill",x,y,r,s) + love.graphics.setColor(self.BorderColor[1], self.BorderColor[2], self.BorderColor[3],self.Visibility*254) + for b=0,self.BorderSize-1 do + love.graphics.circle("line",x,y,r+b,s) + end + if string.find(self.Type, "Text") then + if self.text~=nil then + if self.AutoScaleText then + self.FontSize=math.floor(self.height/1.45833) + end + love.graphics.setColor(self.TextColor[1],self.TextColor[2],self.TextColor[3],self.TextVisibility*254) + love.graphics.setFont(self.Font) + love.graphics.printf(self.text, x-(r/2)+(self.XTween), y-(r/2)+self.Tween, r, self.TextFormat) + end + end + end +end +function gui:drawR() + if love.mouse.isDown("l")==false and love.mouse.isDown("m")==false and love.mouse.isDown("r")==false then + _GuiPro.DragItem={} + _GuiPro.hasDrag=false + end + if self.Visible==true and self.VIS==true then + local b=true + for i,v in pairs(_GuiPro.Clips) do + if self:isDescendant(v)==true then + b=false + end + end + if b==true then + love.graphics.setStencilTest() + love.graphics.setScissor() + end + self.x=(self.Parent.width*self.scale.pos.x)+self.offset.pos.x+self.Parent.x + self.y=(self.Parent.height*self.scale.pos.y)+self.offset.pos.y+self.Parent.y + self.width=(self.Parent.width*self.scale.size.x)+self.offset.size.x + self.height=(self.Parent.height*self.scale.size.y)+self.offset.size.y + if self.DrawRulesB then + for dr=1,#self.DrawRulesB do + self.DrawRulesB[dr](self) + end + end + if (love.mouse.getX() > self.x and love.mouse.getX() < self.x+self.width and love.mouse.getY() > self.y and love.mouse.getY() < self.y+self.height and self:Clickable() and self:eventable()) or self:touchable("r") and self.Active==true then + self.hovering=true + if love.mouse.isDown("l") or self:touchable("r") and _GuiPro.hasDrag==false then + if string.find(self.Type, "Button") then + love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.lclicked=true + elseif love.mouse.isDown("r") or self:touchable("r") and _GuiPro.hasDrag==false then + if string.find(self.Type, "Button") then + love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.rclicked=true + elseif love.mouse.isDown("m") or self:touchable("r") and _GuiPro.hasDrag==false then + if string.find(self.Type, "Button") then + love.graphics.setColor(self.Color[1]-10, self.Color[2]-10, self.Color[3]-10,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.mclicked=true + else + if string.find(self.Type, "Button") or self:touchable("r") and _GuiPro.hasDrag==false then + love.graphics.setColor(self.Color[1]-5, self.Color[2]-5, self.Color[3]-5,self.Visibility*254) + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + end + self.rclicked=false + self.lclicked=false + self.mclicked=false + end + else + love.graphics.setColor(self.Color[1],self.Color[2],self.Color[3],self.Visibility*254) + self.hovering=false + self.rclicked=false + self.lclicked=false + self.mclicked=false + end + if self.ClipDescendants==true then + _GuiPro.Clips[tostring(self)]=self + love.graphics.setScissor(self.x, self.y, self.width, self.height) + end + if self:hasRoundness() then + love.graphics.stencil(self.stfunc, "replace", 1) + love.graphics.setStencilTest("greater", 0) + end + love.graphics.rectangle("fill", self.x, self.y, self.width, self.height,(self.rx or 1)*self.DPI,(self.ry or 1)*self.DPI,(self.segments or 1)*self.DPI) + if string.find(self.Type, "Image") then + self:ImageRule() + end + if self.Type=="Video" then + self:VideoRule() + end + if self:hasRoundness() then + love.graphics.setStencilTest() + end + love.graphics.setColor(self.BorderColor[1], self.BorderColor[2], self.BorderColor[3],self.Visibility*254) + for b=0,self.BorderSize-1 do + love.graphics.rectangle("line", self.x-(b/2), self.y-(b/2), self.width+b, self.height+b,(self.rx or 1)*self.DPI,(self.ry or 1)*self.DPI,(self.segments or 1)*self.DPI) + end + if string.find(self.Type, "Text") then + if self.text~=nil then + if self.AutoScaleText then + self.FontSize=math.floor(self.height/1.45833) + end + love.graphics.setColor(self.TextColor[1],self.TextColor[2],self.TextColor[3],self.TextVisibility*254) + if self.Font==_defaultfont then + love.graphics.setFont(self.Font) + love.graphics.printf(self.text, self.x+2+(self.XTween*self.DPI)+((self.marginL or 0)*self.DPI or self.XTween*self.DPI), self.y+(self.FontHeight/2)+self.Tween*self.DPI, self.width+(0 or (self.marginR or 0)*self.DPI), self.TextFormat) + else + if type(self.Font)=="string" then + self.Font=love.graphics.newFont(self.Font,self.FontSize) + self.FontHeight=self.Font:getHeight() + else + love.graphics.setFont(self.Font) + end + if type(self.FontSize)=="string" then + self.FontSize=tonumber(self.FontSize) + love.graphics.setNewFont(self.FontSize) + end + love.graphics.printf(self.text, self.x+2+((self.marginL or 0)*self.DPI or self.XTween*self.DPI), self.y+math.floor((self.FontHeight-self.FontSize)/2)+self.Tween*self.DPI, self.width+(0 or (self.marginR or 0)*self.DPI), self.TextFormat) + end + end + end + if self.DrawRulesE then + for dr=1,#self.DrawRulesE do + self.DrawRulesE[dr](self) + end + end + end +end + +gui:respectHierarchy() +_GuiPro.width,_GuiPro.height=love.graphics.getDimensions() +multi:newLoop():OnLoop(function() _GuiPro.width,_GuiPro.height=love.graphics.getDimensions() _GuiPro:update() end) +multi:onDraw(function() _GuiPro:draw() end) +gui.ff=gui:newFrame("",0,0,0,0,0,0,1,1) +gui.ff.Color={255,255,255} +gui.ff:OnUpdate(function(self) + self:BottomStack() +end) + diff --git a/client/bg.jpg b/client/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e0c2a31230868bc084974ea8127a5f197a635e7 GIT binary patch literal 97594 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 literal 0 HcmV?d00001 diff --git a/client/chat.png b/client/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..a778e709dafc6c16bcdbccecfab61557c1d998c2 GIT binary patch literal 114946 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 d+fu&@4TrAg(aoh^>-|Qhalt~ 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 uqxm0=;PiiK{%_I$H<xs=+|69#{EB>0Y+&6 literal 0 HcmV?d00001 diff --git a/client/conf.lua b/client/conf.lua index 33f07f8..b19cef6 100644 --- a/client/conf.lua +++ b/client/conf.lua @@ -3,7 +3,7 @@ function love.conf(t) t.version = "0.10.1" -- The LOVE version this game was made for (string) t.console = true -- Attach a console (boolean, Windows only) - t.window.title = "game" -- The window title (string) + t.window.title = "Chat Client" -- The window title (string) t.window.icon = nil -- Filepath to an image to use as the window's icon (string) t.window.width = 400 -- The window width (number) t.window.height = 600 -- The window height (number) diff --git a/client/login.lua b/client/login.lua new file mode 100644 index 0000000..9f45ff8 --- /dev/null +++ b/client/login.lua @@ -0,0 +1,128 @@ +gui.LoadAll("Interface") +if not client then + -- handle client not being created! +else + client.OnUserLoggedIn:connect(function(self,data) + lMenu.bar.text="Logged In!" + lMenu.anim.Visible=false + end) + client.OnBadLogin:connect(function(self) + lMenu.bar.text="Pass/User incorrect!" + lMenu.anim.Visible=false + end) + client.OnUserAlreadyRegistered:connect(function(self,nick) + lMenu.bar.text="Username Taken!" + lMenu.anim.Visible=false + end) + client.OnUserAlreadyLoggedIn:connect(function(self) + lMenu.bar.text="Already logged in!" + lMenu.anim.Visible=false + end) + client.OnUserRegistered:connect(function(self,nick) + lMenu.bar.text="Register Success!" + lMenu.anim.Visible=false + end) + client.OnNoUserWithName:connect(function(self,nick) + lMenu.bar.text="No User with that name!" + lMenu.anim.Visible=false + end) + client.OnPasswordRequest:connect(function(self) + lMenu.bar.text="Password request sent!" + lMenu.anim.Visible=false + end) +end +--gui.setBG("fire.jpg") +--Login Windows +lMenu=gui:newFrame(0,0,200,100) +lMenu.ClipDescendants=true +lMenu:ApplyGradient{Color.Lighten(Color.Blue,.40),Color.Lighten(Color.Blue,.25),direction="vertical"} +lMenu.bar=lMenu:newTextLabel("","",0,0,0,20,0,0,1) +lMenu.bar:ApplyGradient{Color.Blue,Color.Darken(Color.Blue,.25)} +lMenu.bar.TextColor=Color.Lighten(Color.Red,.25) +lMenu.user=lMenu:newTextBox("username","username",5,25,190,20) +lMenu.pass=lMenu:newTextBox("password","password",5,50,190,20) +lMenu.email=lMenu:newTextBox("email","email",5,100,190,20) +lMenu.nick=lMenu:newTextBox("nick","nick",5,75,190,20) +lMenu.user.TextFormat="left" +lMenu.pass.TextFormat="left" +lMenu.email.TextFormat="left" +lMenu.nick.TextFormat="left" +lMenu.bar.TextFormat="left" +lMenu.bar.Tween=-3 +lMenu.user.Tween=-3 +lMenu.pass.Tween=-3 +lMenu.email.Tween=-3 +lMenu.nick.Tween=-3 +lMenu.user.ClearOnFocus=true +lMenu.pass.ClearOnFocus=true +lMenu.email.ClearOnFocus=true +lMenu.nick.ClearOnFocus=true +lMenu.user:ApplyGradient{Color.Darken(Color.Blue,.20),Color.Blue,direction="vertical"} +lMenu.pass:ApplyGradient{Color.Darken(Color.Blue,.20),Color.Blue,direction="vertical"} +lMenu.pass.hidden=true +lMenu.email:ApplyGradient{Color.Darken(Color.Blue,.20),Color.Blue,direction="vertical"} +lMenu.nick:ApplyGradient{Color.Darken(Color.Blue,.20),Color.Blue,direction="vertical"} +lMenu.hider=lMenu:newFrame("",1,-29,-2,28,0,1,1) +lMenu.hider.BorderSize=0 +lMenu.hider:ApplyGradient{Color.Lighten(Color.Blue,.40),Color.Lighten(Color.Blue,.25),direction="vertical"} +lMenu.Login=lMenu:newTextButton("Login","Login",5,-25,90,20,0,1) +lMenu.Register=lMenu:newTextButton("Register","Register",105,-25,90,20,0,1) +lMenu.Login.Tween=-3 +lMenu.Register.Tween=-3 +lMenu.Login.Color=Color.Green +lMenu.Register.Color=Color.Red +lMenu.step=multi:newTStep(1,80,1,.01) +lMenu.step:Pause() +lMenu.step.link=lMenu +lMenu.step:OnStep(function(pos,self) + if self.link.height<=150 then + self.link:SetDualDim(nil,nil,nil,self.link.height+1) + lMenu:centerY() + end + print(self.link.height) +end) +lMenu.step2=multi:newTStep(1,80,1,.01) +lMenu.step2:Pause() +lMenu.step2.link=lMenu +lMenu.step2:OnStep(function(pos,self) + if self.link.height>=101 then + self.link:SetDualDim(nil,nil,nil,self.link.height-1) + lMenu:centerY() + end + print(self.link.height) +end) +lMenu.Register:OnReleased(function(b,self) + if self.Parent.Login.text=="Back" then + print(lMenu.pass.ttext) + client:register(lMenu.user.text,lMenu.pass.ttext,lMenu.nick.text,{email=lMenu.email.text}) + lMenu.anim.Visible=true + else + self.Parent.Login.text="Back" + self.Parent.Login.Color=Color.saddle_brown + self.Parent.nick.text="nick" + self.Parent.step:Update() + end +end) +lMenu.Login:OnReleased(function(b,self) + if self.text=="Back" then + self.text="Login" + self.Color=Color.Green + self.Parent.step2:Update() + else + print(lMenu.pass.ttext) + client:logIn(lMenu.user.text,lMenu.pass.ttext) + lMenu.anim.Visible=true + end +end) +lMenu:centerX() +lMenu:centerY() +lMenu.anim=lMenu:newAnim("loading",.01, 0, 0, 41, 39) +lMenu.anim:OnAnimEnd(function(self) + self:Reset() + self:Resume() +end) +lMenu.anim:OnUpdate(function(self) + self:centerX() + self:centerY() +end) +lMenu.anim.Visible=false diff --git a/client/main.lua b/client/main.lua index 0db1de8..8811910 100644 --- a/client/main.lua +++ b/client/main.lua @@ -9,105 +9,415 @@ require("Libs/lovebind") -- binds my libraies to the love2d engine that i am usi require("GuiManager") -- allows the use of graphics in the program. require("net") -- Loads the networking library require("net.chatting") -client=net:newTCPClient("localhost",12345) -- Connects to the server +require("net.settings") -- loads the networking settings module +require("net.identity") -- loads the networking identity module +client=net:newTCPClient("69.113.201.7",12345) if type(client)=="boolean" then error("Please run the server file first!") end +client.OnUserLoggedIn:connect(function(self,data) + anim.Visible=false + login:Destroy() + MY_Name=data.nick + INIT() +end) +client.OnBadLogin:connect(function(self) + header.text="Login/Register (Pass/User incorrect!)" + anim.Visible=false +end) +client.OnUserAlreadyRegistered:connect(function(self,nick) + header.text="Login/Register (Username Taken!)" + anim.Visible=false +end) +client.OnUserRegistered:connect(function(self,nick) + header.text="Login/Register (Register Success!)" + anim.Visible=false +end) +client.OnNoUserWithName:connect(function(self,nick) + header.text="Login/Register (No User with that name!)" + anim.Visible=false +end) +client.OnPasswordRequest:connect(function(self) + header.text="Login/Register (Password request sent!)" + anim.Visible=false +end) +gui.ff.BorderSize=0 +login=gui:newFrame("Login",0,0,0,0,0,0,1,1) +login.Color=Color.Black +header=login:newTextLabel("Login/Register",0,10,0,20,0,0,1) +header.TextColor=Color.White +header:setNewFont(20) +header.Visibility=0 +username=login:newTextBox("","Username",11,52,-22,35,0,0,1) +t1=username:newTextLabel("Username",0,10,0,30,0,-1,1) +password=login:newTextBox("","Password",11,117,-22,35,0,0,1) +password.hidden=true +t2=password:newTextLabel("Password",0,10,0,30,0,-1,1) +Login=password:newTextButton("Login",0,10,100,30,0,1) +Login.Color=Color.Green +Register=Login:newTextButton("Register",10,0,100,30,1) +Register.Color=Color.Blue +nickname=login:newTextBox("","Nick",11,182,-22,35,0,0,1) +nickname.Visible=false +t3=nickname:newTextLabel("Nickname",0,10,0,30,0,-1,1) +email=login:newTextBox("","Email",11,247,-22,35,0,0,1) +email.Visible=false +t4=email:newTextLabel("Email",0,10,0,30,0,-1,1) +Back=email:newTextButton("Back",0,10,100,30,0,1) +Back.Color=Color.Red +DoRegister=Back:newTextButton("Register",10,0,100,30,1) +DoRegister.Color=Color.Blue +Login:OnReleased(function(b,self) + client:logIn(username.text,password.ttext) + anim.Visible=true +end) +Register:OnReleased(function(b,self) + Login.Visible=false + email.Visible=true + nickname.Visible=true +end) +Back:OnReleased(function(b,self) + Login.Visible=true + nickname.Visible=false + email.Visible=false +end) +DoRegister:OnReleased(function(b,self) + client:register(username.text,password.ttext,nickname.text,{email=email.text}) + Login.Visible=true + nickname.Visible=false + email.Visible=false + Register.Visible=false +end) +gui.massMutate({ + "setRoundness(10,10,360)", + Tween=1, + XTween=-3, +},Login,Register,Back,DoRegister) +gui.massMutate({ + Visibility=0, + TextFormat="left", + TextColor=Color.White, +},t1,t2,t3,t4) +gui.massMutate({ + "setRoundness(5,5,360)", + Visibility=1, + TextFormat="left", + Tween=4, + Color=Color.White, + XTween=4, +},username,password,nickname,email) client.OnChatRecieved(function(user,msg,isself) -- hook to grab chat data - Chat:AddChatBubble(user,msg,isself) + AG.holder:AddChatBubble(user,msg,isself) end) ---gui.enableAutoWindowScaling(true) -- allows mobile support. Not needed for PC use -nameframe=gui:newFrame("",0,0,200,100) -nameframe.Color=Color.Lighten(Color.Brown,.15) -nameframe:setRoundness(15,15,360) -nameframe:centerX() -nameframe:centerY() -namer=nameframe:newTextBox("Please enter a name to use!",0,0,180,30) -namer:centerX() -namer:centerY() -namer.Color=Color.tan -namer.ClearOnFocus=true -namer:setRoundness(5,5,360) -namer:OnEnter(function(self,txt) - MY_Name=txt:gsub("%s","_") - InitEngine() - nameframe:Destroy() - gui.ff:Destroy() -end) -gui.ff.C1=45 -gui.ff.C2=193 -gui.ff.C3=92 -gui.ff.C1m=-1 -gui.ff.C2m=1 -gui.ff.C3m=-1 -gui.ff.Color=Color.Blue -func=multi:newFunction(function(l,self) -- not needed just adds color change when chosing a name - l:hold(.05) - self.C1=self.C1+(({1,2,3})[math.random(1,3)]*self.C1m) - self.C2=self.C2+(({1,2,3})[math.random(1,3)]*self.C2m) - self.C3=self.C3+(({1,2,3})[math.random(1,3)]*self.C3m) - if self.C1>255 then self.C1=254 self.C1m=-1 end - if self.C2>255 then self.C2=254 self.C2m=-1 end - if self.C3>255 then self.C3=254 self.C3m=-1 end - if self.C1<0 then self.C1=1 self.C1m=1 end - if self.C2<0 then self.C2=1 self.C2m=1 end - if self.C3<0 then self.C3=1 self.C3m=1 end - self.Color=Color.new(self.C1,self.C2,self.C3) +client.OnPrivateChatRecieved(function(user,msg,USERID) -- hook to grab chat data + print("Matching: ",app[USERID],USERID) + local lastCFrame=CFrame + if app[USERID] then + CFrame=app[USERID] + --local c=AC.holder:getChildren() + --for i=1,#c do + -- c[i].Visible=false + --end + --CFrame.Visible=true + --local c=Chatting:getChildren() + --for i=1,#c do + -- c[i].Color=Color.Yellow + --end + --CFrame.button.Color=Color.Green + end + AC:PopulateChat(user,msg) + CFrame=lastCFrame -- reset cframe after stuff has been done end) function love.wheelmoved(x, y) -- handle scrolling - if mainapp then else return end - if y > 0 then - Chat.bubbles:SetDualDim(nil,Chat.bubbles.y+10) - elseif y < 0 then - Chat.bubbles:SetDualDim(nil,Chat.bubbles.y-50) - end - if Chat.bubbles.offset.pos.y>0 then - Chat.bubbles.offset.pos.y=0 + if CFrame==nil then return end + local c=CFrame.holder:getChildren() + if y > 0 then + CFrame.holder.offset.pos.y=CFrame.holder.offset.pos.y+10 + elseif y < 0 then + CFrame.holder.offset.pos.y=CFrame.holder.offset.pos.y-10 + end + if CFrame.holder.offset.pos.y>0 then + CFrame.holder.offset.pos.y=0 + elseif CFrame.holder.offset.pos.y<-(#c*35) then + CFrame.holder.offset.pos.y=-(#c*35) end - print(Chat.bubbles.offset.pos.y) end -gui.ff:OnUpdate(func) -function InitEngine() - mainapp=gui:newFrame("",0,0,0,0,0,0,1,1) -- creates a frame that takes up the enitre window - mainapp.Color=Color.Lighten(Color.Brown,.25) - mainapp.BorderSize=0 - mainapp.header=mainapp:newTextLabel("Now chatting as: "..MY_Name,1,-10,-2,30,0,0,1) -- creates the header for the app - mainapp.header:setRoundness(15,15,360) - mainapp.header.Tween=7 -- moves the text up by a factor of 3 pixels - mainapp.header.Color=Color.Lighten(Color.Blue,.25) -- Sets the Color of the header object to light blue - mainapp.chatFrame=mainapp:newFrame("",0,21,0,-20,0,0,1,1) -- creates the chat frame where users can see the text that is sent - mainapp.chatFrame.Color=Color.Lighten(Color.Brown,.25) -- Color stuff - mainapp.chatFrame.ClipDescendants=true - mainapp.chatFrame.bubbles=mainapp.chatFrame:newFrame("",0,0,0,0,0,0,1) - mainapp.chatFrame.bubbles.Visibility=0 - Chat=mainapp.chatFrame - Chat.lastBubbleHeight=0 - function Chat:AddChatBubble(user,txt,isself) +function INIT() + love.mouse.setCursor(love.mouse.getSystemCursor("arrow")) + app=gui:newImageLabel("bg.jpg",0,0,0,0,0,0,1,1) + app.PrivateChats={} + app.PrivateChatsRef={} + app.ServerUpdate=multi:newAlarm(30)-- every 30 seconds + app.ServerUpdate:OnRing(function(alarm) + client:getUserList() + alarm:Reset() + end) + header=app:newFrame("Header",0,0,0,60,0,0,1) + header:ApplyGradient{Color.Black,Color.Lighten(Color.Black,.10)} + header.BorderSize=0 + loggedInAs=header:newTextLabel("Logged in as: "..MY_Name,-250,0,250,20,1) + loggedInAs.TextColor=Color.White + loggedInAs.Tween=2 + loggedInAs.Visibility=0 + Options=header:newFrame("OptionHolder",0,0,0,30,0,1,1) + Options.Color=Color.Lighten(Color.Black,.10) + Options.BorderSize=0 + Online=Options:newTextLabel("Online",0,0,0,0,2/3,0,1/3,1) + CChat=Options:newTextLabel("Private Chats",0,0,0,0,0,0,1/3,1) + Global=Options:newTextLabel("Global Chat",0,0,0,0,1/3,0,1/3,1) + app["Online"]=app:newFrame(0,90,0,-150,0,0,1,1) + AO=app["Online"] + --Online.Visible=false + AO.holder=AO:newFrame("Holder",0,0,0,0,0,0,1,1) + AO.holder.Visibility=0 + app["Private Chats"]=app:newFrame(0,90,0,-90,0,0,1,1) + AC=app["Private Chats"] + AC.holder=AC:newFrame("Holder",0,0,0,0,.4,0,.6,1) + AC.holder.Visibility=0 + AC.CurrentUSERID="" + AC.CurrentNick="" + Chatting=AC:newFrame("Chatting",0, 0, 0, 0, 0 ,0 ,.4 ,1) + Chatting.Color=Color.Lighten(Color.Black,.10) + app["Global Chat"]=app:newFrame(0,90,0,-150,0,0,1,1) + AG=app["Global Chat"] + AG.holder=AG:newFrame("Holder",0,0,0,0,0,0,1,1) + AG.holder.Visibility=0 + AC.lastBubbleHeight=0 + AG.holder.lastBubbleHeight=0 + function AC:sendChat(msg) + -- + end + function AG.holder:AddChatBubble(user,txt,USERID) local msg=user..": "..txt - local bubble=self.bubbles:newTextLabel(msg,0,self.lastBubbleHeight+5,math.floor(mainapp.width/2),(math.ceil(#msg/24)*12)+5) - bubble.TextFormat="left" - bubble.XTween=2 - bubble.Tween=-4 + local width, wrappedtext = _defaultfont:getWrap(msg, math.floor(app.width/2)-10) + local height = _defaultfont:getHeight() + local bubble=self:newTextLabel("",0,self.lastBubbleHeight+5,math.floor(app.width/2),#wrappedtext*height+6) + bubble.TFrame=bubble:newTextLabel(msg,8,0,-16,0,0,0,1,1) + bubble.TFrame.Visibility=0 + bubble.TFrame.TextFormat="left" + bubble.TFrame.Tween=-4 + bubble.TFrame.TextColor=Color.White + bubble.Color=Color.White bubble:setRoundness(5,5,360) - if isself then + bubble.Visibility=.5 + bubble.Color=Color.Black + if user==MY_Name then + bubble.TFrame.text=bubble.TFrame.text:gsub("("..user.."):","You:") bubble:anchorRight(1) end - self.lastBubbleHeight=self.lastBubbleHeight+(math.ceil(#msg/24)*12)+13 - if self.lastBubbleHeight>mainapp.height-60 then - self.bubbles.offset.pos.y=-(self.lastBubbleHeight-(mainapp.height-60)) + self.lastBubbleHeight=self.lastBubbleHeight+#wrappedtext*height+11 + if self.lastBubbleHeight>self.height-20 then + self.offset.pos.y=-(self.lastBubbleHeight-(self.height-20)) end end - mainapp.textbox=mainapp:newTextBox("",5,-35,-10,30,0,1,1) -- creates a textbox that allows the user to be able to send messages - mainapp.textbox.TextFormat="left" -- sets the format to left hand side of screen - mainapp.textbox.Color=Color.tan - mainapp.textbox:setRoundness(5,5,360) - mainapp.textbox:OnEnter(function(self,txt) -- handles the send event - client:sendChat(MY_Name,txt) -- sends the data to the server + function AG:sendChat(msg) + client:sendChat(MY_Name,msg) + end + function AC:PopulateChat(user,msg,isself) + if CFrame.IsPChat then + local width, wrappedtext = _defaultfont:getWrap(msg, math.floor((CFrame.width)/2)) + local height = _defaultfont:getHeight() + local bubble; + if #wrappedtext>1 then + bubble=CFrame:newTextLabel("",0,CFrame.lastBubbleHeight+5,0,(#wrappedtext+1)*height+6,0,0,.5) + else + bubble=CFrame:newTextLabel("",0,CFrame.lastBubbleHeight+5,0,(#wrappedtext)*height+6,0,0,.5) + end + bubble.TFrame=bubble:newTextLabel(msg,8,0,-16,0,0,0,1,1) + bubble.TFrame.Visibility=0 + bubble.TFrame.TextFormat="left" + bubble.TFrame.Tween=-4 + bubble.TFrame.TextColor=Color.White + bubble.Color=Color.White + bubble:setRoundness(5,5,360) + bubble.Visibility=.5 + bubble.Color=Color.Black + if isself then + bubble.TFrame.text="You: "..msg + bubble:anchorRight(1) + else + bubble.TFrame.text=CFrame.Nick..": "..msg + end + print(#wrappedtext) + if #wrappedtext>1 then + CFrame.lastBubbleHeight=CFrame.lastBubbleHeight+(#wrappedtext+1)*height+11 + else + CFrame.lastBubbleHeight=CFrame.lastBubbleHeight+(#wrappedtext)*height+11 + end + if CFrame.lastBubbleHeight>CFrame.height-20 then + CFrame.offset.pos.y=-(CFrame.lastBubbleHeight-(self.height-20)) + end + end + end + CFrame=nil + client.OnUserList(function(list) + if input.Visible then + c=0 + local collections={} + local childs=AC.holder:getChildren() + for i=1,#childs do + collections[childs[i].Name]=childs[i] + end + for i,v in pairs(list) do + collections[v]=nil + if i~=MY_Name and not(AC.holder.Children[v]) then + local temp=Chatting:newTextLabel(i,0,20*(c+#Chatting:getChildren()),0,20,0,0,1) + c=c+1 + temp:setRoundness(7,7,360) + temp.Color=Color.Yellow + temp.Tween=-4 + temp.USERID=v + temp.link=AC.holder:newFrame(v,0,0,0,0,0,0,1,1) + temp.link.Visibility=0 + app[v]=temp.link + temp.link.Visible=false + temp.link.USERID=v + temp.link.Nick=i + temp.link.holder=temp.link + temp.link.button=temp + function temp.link:sendChat(txt) + AC:PopulateChat("",txt,true) + client:sendChatTo(MY_Name,self.USERID,txt) + end + temp.link.IsPChat=true + temp.link.lastBubbleHeight=0 + temp:OnReleased(function(b,self) + CFrame=self.link + local c=Chatting:getChildren() + for i=1,#c do + c[i].Color=Color.Yellow + end + temp.Color=Color.Green + local c=AC.holder:getChildren() + for i=1,#c do + c[i].Visible=false + end + self.link.Visible=true + end) + end + end + for i,v in pairs(collections) do + collections[i].button:Destroy() + collections[i]:Destroy() + AC.holder.Children[i]=nil + end + local c=Chatting:getChildren() + for i=1,#c do + c[i]:SetDualDim(0,20*(i-1),0,20,0,0,1) + end + else + anim.Visible=false + local c=AO.holder:getChildren() + for i=1,#c do + c[i]:Destroy() + end + c=0 + for i,v in pairs(list) do + if i~=MY_Name then + local temp=AO.holder:newTextLabel(i,0,(c)*35,0,30,0,0,.5) + c=c+1 + temp.USERID=v + temp:setRoundness(5,5,360) + temp.Color=Color.dark_gray + temp.Tween=2 + temp:OnReleased(function(b,self) + table.insert(app.PrivateChats,{i,self.USERID}) + end) + end + end + end + end) + function AO:Act() + CFrame=self + anim.Visible=true + input.Visible=false + client:getUserList() + end + function AC:Act() + input.Visible=true + CFrame=self + input:setDualDim(0,-60,0,60,.4,1,.6) + input:setRoundness(nil,nil,nil) + client:getUserList() + end + function AG:Act() + input.Visible=true + CFrame=self + input:setDualDim(0,-60,0,60,0,1,1) + input:setRoundness(10,10,360) + end + function app:hideOptions() + gui.massMutate({ + Visible=false, + },app["Online"],app["Private Chats"],app["Global Chat"]) + end + gui.massMutate({ + Visibility=0, + ClipDescendants=true, + Visible=false, + },app["Online"],app["Private Chats"],app["Global Chat"]) + gui.massMutate({ + Tween=2, + Visibility=0, + TextColor=Color.Darken(Color.White,.3), + "setNewFont(18)", + [[OnEnter(function(self) + self.TextColor=Color.White + end)]], + [[OnExit(function(self) + self.TextColor=Color.Darken(Color.White,.3) + end)]], + [[OnReleased(function(b,self) + app:hideOptions() + app[self.text].Visible=true + app[self.text]:Act() + end)]], + },Online,CChat,Global) + textDisp=header:newTextLabel("Chats",10,15,100,30) + textDisp.TextFormat="left" + textDisp:setNewFont(28) + textDisp.TextColor=Color.White + textDisp.Visibility=0 + input=app:newFrame("InputHolder",0,-60,0,60,0,1,1) + input:anchorRight(1) + input.Visibility=1 + input.BorderSize=0 + input:setRoundness(10,10,360) + input:ApplyGradient{Color.Black,Color.Lighten(Color.Black,.10)} + input.Visible=false + textbox=input:newTextBox("",11,14,-22,-25,0,0,1,1) + textbox:setRoundness(5,5,360) + textbox.Visibility=1 + textbox.TextFormat="left" + textbox.Tween=4 + textbox.Color=Color.White + textbox.XTween=4 + textbox.ClipDescendants=true + input:OnUpdate(function(self) + local width, wrappedtext = _defaultfont:getWrap(textbox.text, textbox.width) + local height = _defaultfont:getHeight() + if #wrappedtext==0 then + input:SetDualDim(0,-60,0,60,0,1,1) + else + input:SetDualDim(0,-60-((#wrappedtext-1)*(height)),0,60+((height)*(#wrappedtext-1)),0,1,1) + end + end) + textbox:OnEnter(function(self,txt) + CFrame:sendChat(txt) self.text="" - self.Color=Color.tan + self.ttext="" end) - mainapp.textbox:OnFocus(function(self) - self.Color=Color.Lighten(Color.tan,.25) - end) - mainapp.textbox.ClearOnFocus=true - mainapp.textbox.XTween=2 - mainapp.textbox.Tween=2 -- positions the text in the text box + AG.Visible=true + AG:Act() end +--must be last object created! +anim=gui:newAnim("loading",.01, 0, 0, 41, 39) +anim.Visible=false +anim:OnAnimEnd(function(self) + self:Reset() + self:Resume() +end) +anim:OnUpdate(function(self) + self:centerX() + self:centerY() +end) +--~ bubble=gui:newFrame("Test",100,100,100,100) + diff --git a/client/net/chatting.lua b/client/net/chatting.lua index 4def550..ff50086 100644 --- a/client/net/chatting.lua +++ b/client/net/chatting.lua @@ -1,4 +1,5 @@ require("net") +require("net.identity") --General Stuff --[[ What this module does! Adds @@ -8,25 +9,78 @@ client:OnChatRecieved(function(user,msg) end) client:sendChat(user,msg) ]] net:registerModule("chatting",{2,1,0}) +net.chatting.users={} +function net.chatting:getUserIdFromIP(ip) + return net.chatting.users[ip] +end function net.chatting:init() -- calling this initilizes the library and binds it to the servers and clients created --Server Stuff net.OnServerCreated:connect(function(s) print("The Chatting Module has been loaded onto the server!") + s.OnUserLoggedIn(function(user,cid,ip,port,dTable) + dTable=loadstring("return "..dTable)() + local USERID=bin.new(user):getHash(32) + print(USERID) + net.chatting.users[USERID]={dTable.nick,cid,ip,port,dTable} -- add users that log in to the userlist + net.chatting.users[ip]=USERID -- add users that log in to the userlist + local users={} + for i,v in pairs(net.chatting.users) do + if type(i)~="userdata" then + table.insert(users,i.."|"..net.chatting.users[i][1]) + end + end + table.insert(users,"") + for i,v in pairs(s.ips) do + s:send(v,"!chatting! $Users|NIL|NIL '"..table.concat(users,",").."'") + end + end) + s.OnUserLoggerOut(function(self,user) + local USERID=bin.new(user):getHash(32) + local ip=net.chatting.users[USERID] + print(USERID) + net.chatting.users[USERID]=nil + net.chatting.users[ip]=nil + end) s.OnDataRecieved:connect(function(self,data,cid,ip,port) -- when the server recieves data this method is triggered --First Lets make sure we are getting chatting data local user,msg = data:match("!chatting! (%S-) '(.+)'") if user and msg then - local struct={ -- pack the info up as a table so the server can do filtering and whatnot to the chat - user=user, - msg=msg - } - self.OnChatRecieved:Fire(struct) -- trigger the chat event - for i,v in pairs(self.ips) do - if ip==v then - print("Self: "..struct.user) - self:send(v,"!chatting! 1 "..struct.user.." '"..struct.msg.."'") - else - self:send(v,"!chatting! 0 "..struct.user.." '"..struct.msg.."'") + if user:sub(1,1)=="$" then + local cmd,arg=user:match("$(.+)|(.+)") + print("Using extended chatting protocal!") + if cmd=="DM" then + local struct={ -- pack the info up as a table so the server can do filtering and whatnot to the chat + user=user, + msg=msg + } + self.OnChatRecieved:Fire(struct,"PRIVATE") + print("USERID",arg) + self:send(net.chatting.users[arg][3],"!chatting! $DM|"..net.chatting.users[arg][1].."|"..net.chatting:getUserIdFromIP(ip).." '"..msg.."'",net.chatting.users[arg][4]) + elseif cmd=="getUsers" then + local users={} + for i,v in pairs(net.chatting.users) do + if type(i)~="userdata" then + table.insert(users,i.."|"..net.chatting.users[i][1]) + end + end + table.insert(users,"") + self:send(ip,"!chatting! $Users|NIL|NIL '"..table.concat(users,",").."'",port) + elseif cmd=="getPrivateChat" then -- will do later! + --send: "!sft! *...*" + end + else + local struct={ -- pack the info up as a table so the server can do filtering and whatnot to the chat + user=user, + msg=msg + } + self.OnChatRecieved:Fire(struct,"GROUP") -- trigger the chat event + local USERID=net.chatting:getUserIdFromIP(ip) + for i,v in pairs(self.ips) do + if ip==v then + self:send(v,"!chatting! 1|"..struct.user.."|"..USERID.." '"..struct.msg.."'") + else + self:send(v,"!chatting! 0|"..struct.user.."|"..USERID.." '"..struct.msg.."'") + end end end end @@ -41,16 +95,39 @@ function net.chatting:init() -- calling this initilizes the library and binds it net.OnClientCreated:connect(function(c) c.OnDataRecieved:connect(function(self,data) -- when the client recieves data this method is triggered --First Lets make sure we are getting chatting data - local isself, user,msg = data:match("!chatting! (%d) (%S-) '(.+)'") - if user and msg then + local isself,user,USERID,msg = data:match("!chatting! (%S-)|(%S-)|(%S-) '(.+)'") + if not isself then return end + if tonumber(isself) then --This is the client so our job here is done - print(isself) - self.OnChatRecieved:Fire(user,msg,({["1"]=true, ["0"]=false})[isself]) -- trigger the chat event + self.OnChatRecieved:Fire(user,msg,({["1"]=true, ["0"]=false})[isself],USERID) -- trigger the chat event + elseif isself:sub(1,1)=="$" then + local cmd=isself:match("$(.+)") + if cmd=="DM" then + print("DM: ",user,msg,USERID) + c.OnPrivateChatRecieved:Fire(user,msg,USERID) + elseif cmd=="Users" then + local tab={} + for ID,nick in msg:gmatch("(%S-)|(%S-),") do + tab[nick]=ID + end + c.OnUserList:Fire(tab) + end end end) function c:sendChat(user,msg) self:send("!chatting! "..user.." '"..msg.."'") end + function c:sendChatTo(user,touser,msg) + self:send("!chatting! $DM|"..touser.." '"..msg.."'") + end + function c:getUserList() + self:send("!chatting! $getUsers|NIL 'NIL'") + end + function c:getChatFrom(userID) + self:send("!chatting! getPrivateChat|NIL '"..userID.."'") -- add if time permits + end + c.OnPrivateChatRecieved=multi:newConnection() + c.OnUserList=multi:newConnection() c.OnChatRecieved=multi:newConnection() -- create a chat event end) end diff --git a/client/net/identity.lua b/client/net/identity.lua index 2cf9d0f..8997496 100644 --- a/client/net/identity.lua +++ b/client/net/identity.lua @@ -10,6 +10,8 @@ function net.hash(text,n) n=n or 16 return bin.new(text.."jgmhktyf"):getHash(n) end +net.identity.UIDS={} +net.identity.UIDS.ids={} function net.identity:init() -- calling this initilizes the library and binds it to the servers and clients created --Server Stuff net.OnServerCreated:connect(function(s) @@ -39,6 +41,7 @@ function net.identity:init() -- calling this initilizes the library and binds it self.userFolder=loc end function s:loginUserOut(user) + net.identity.UIDS.ids[user.UID]=nil self.loggedIn[user]=nil end function s:loginUserIn(user,cid) @@ -47,6 +50,7 @@ function net.identity:init() -- calling this initilizes the library and binds it table.merge(self.loggedIn[user],dTable or {}) self.loggedIn[user].cid=cid self.loggedIn[user].nick=nick + self.loggedIn[user].UID=net.resolveID(net.identity.UIDS) return self:getUserDataHandle(user) end function s:getUserDataHandle(user) @@ -100,7 +104,7 @@ function net.identity:init() -- calling this initilizes the library and binds it end local handle=self:loginUserIn(user,cid) -- binds the cid to username self:send(ip,"!identity! LOGINGOOD <-|"..bin.ToStr(handle).."|->",port) - self.OnUserLoggedIn:Fire(user,cid,ip,port) + self.OnUserLoggedIn:Fire(user,cid,ip,port,bin.ToStr(handle)) return else self:send(ip,"!identity! LOGINBAD <-|nil|->",port)