• Declaring Clientside Table?
    22 replies, posted
Am I doing something wrong? It's supposed to declare the table on LocalPlayer() defined as selfPlayer however it isn't working. [code] function inventoryHook(mess) local selfPlayer=LocalPlayer() if(selfPlayer.inventory==nil) then selfPlayer.inventory={} end local invInd=mess:ReadLong() local indEnt=mess:ReadEntity() selfPlayer.inventory[invInd]=indEnt end [/code] [editline]18th March 2011[/editline] Also how would I get it again clientside?
You don't need to put the table on the player client side, client side will always be just that one player. Also it would help if you said how it's not working, errors or messed up behavior and such.
Right, sorry I'm just getting frustrated sorry. But it gives me an error when I try to access an index of the table by using selfPlayer.inventory[0] in a function but it's not working. [editline]18th March 2011[/editline] It generates this error; [Spies\gamemode\cl_init.lua:102] attempt to index field '?' (a nil value) I believe this to be the code that is necessary and relevant to know. :v [code] function inventoryHook(mess) local selfPlayer=LocalPlayer() if(selfPlayer.inventory==nil) then selfPlayer.inventory={} else table.insert(selfPlayer.inventory,indEnt) end local invInd=mess:ReadLong() local indEnt=mess:ReadEntity() end usermessage.Hook("InventorySend",inventoryHook) function OpenAgentPanel() local inventoryWindow=vgui.Create("DFrame") inventoryWindow:SetPos(50,0) inventoryWindow:SetSize(ScrW()-50,ScrH()) inventoryWindow:SetTitle("Myself...") inventoryWindow:SetVisible(true) inventoryWindow:SetDraggable(false) inventoryWindow:ShowCloseButton(true) inventoryWindow:MakePopup() local selfPlayer=LocalPlayer() if(selfPlayer.inventory!=nil) then local slot1=vgui.Create("SpawnIcon",inventoryWindow) slot1:SetPos(0,20) slot1:SetModel(selfPlayer.inventory[0]:GetModel()) slot1.DoClick=function(btn) selfPlayer:ChatPrint("Class is: "..selfPlayer.inventory[0]:GetClass()) local slot1Ops=DermaMenu() if(selfPlayer.inventory[0]:GetClass()=="spies_doc") then slot1Ops:AddOption("Check Destination",function() local myDest=selfPlayer.inventory[0]:GetVar("DestObj") selfPlayer:ChatPrint("Destination is: "..myDest:GetName()) end) end end end end concommand.Add("OpenAgentPanel",OpenAgentPanel) [/code]
which line is 102? and please use lua tags([noparse][lua][/lua][/noparse]) it will give line numbers, if it's not the whole file then say which line equals which like this is lines 50 - 168, the more information the better. Also you can try defining selfPlayer outside of the functions and use it in all of them. [editline]18th March 2011[/editline] Also it could be trying to access the table before you added any values if you make a table and set it to {} value [0] will be nil and unusable till you set it. so besides checking for inventory to be nil you should check that the value you are trying to get is not nill also so check if selfPlayer.inventory[0] == nil before using it. And... I just noticed in your usermessage hook, you try an assign a value to the table before you read it. [lua] function inventoryHook(mess) local selfPlayer=LocalPlayer() if(selfPlayer.inventory==nil) then selfPlayer.inventory={} -- Giving no value else table.insert(selfPlayer.inventory,indEnt) -- VAlue isn't defined when we get here end local invInd=mess:ReadLong() --Should be at top local indEnt=mess:ReadEntity() -- Should be at top end usermessage.Hook("InventorySend",inventoryHook) ---------------------------------------------------- Old Above, New Below ----------------- function inventoryHook(mess) local selfPlayer=LocalPlayer() local invInd=mess:ReadLong() -- Read first local indEnt=mess:ReadEntity() -- Read First if(selfPlayer.inventory==nil) then selfPlayer.inventory={ } -- Only do this if there is no table end --Check here to see you got good values from above before trying to insert into table. table.insert(selfPlayer.inventory, indEnt) -- But insert everytime end usermessage.Hook("InventorySend",inventoryHook) [/lua]
If you missed it in the other thread [lua] Inventory = { } usermessage.Hook( "SendItem", function (data) Item = {} Item.Class = data:ReadString() Item.Name = data:ReadString() Item.Dec = data:ReadString() Inventory[Item.Class] = Item end) [/lua] also in the code above me why are you doing a check to see if the table exists it seems pointless just declare it at the top of a Clientside file and I don't see the point of saving the data in a variable if you are only using it once
Neither seems to be working, any other ideas?
Its working perfectly for me I am using it right this second
I don't even think it's possible. :/
What isn't possible?
Making an inventory system, not for me anyways. :/
I don't understand what the problem is
Problem inventory is still nil after everything. :/
Poste the codes in pastebin.com, paste them like this: code xyz.lua pastebin.com/adjasfdasd code yz.lua pastebin.com/a232azsd ... code z.lua pastebin.com/bvzxc OR .rar the gamemode and host it on mediafire.com Then we talk about this.
[QUOTE=JohnnyOnFlame;28672415]Poste the codes in pastebin.com, paste them like this: code xyz.lua pastebin.com/adjasfdasd code yz.lua pastebin.com/a232azsd ... code z.lua pastebin.com/bvzxc OR .rar the gamemode and host it on mediafire.com Then we talk about this.[/QUOTE] Why is that necessary?
So we can help you.
Alright, fine. XP Just paranoid, but okay. Thanks for helping guys. Link is: [url]http://www.mediafire.com/?exs8dxc13irq7ru[/url] Try not to steal it. Not that the code's anything worth stealing, but the idea... XP
Nerdpest, what you wanted was to use DATASTREAM. Here you are, the altered files: INIT.Lua: [url]http://pastebin.com/qk0Sd7bT[/url] CL_Init.lua: [url]http://pastebin.com/rYLRYizZ[/url] (Check if I didn't mistakenly named INIT as CL_INIT and backwards.) Didn't test, and also never messed with DATASTREAMs, but it might be working (cross the damn fingers!)
Datastream should not be used for this usermessages are much better in this situation and most situations
[QUOTE=King Fagless;28673540]Datastream should not be used for this usermessages are much better in this situation and most situations[/QUOTE] Usermessage is good for small stuff. Datastream is good for big stuff. If the player is a freacking addict, and his inventory is full of items of all sorts with all having big ammounts, you might break through the limit of 255bytes.
That is why you compress the data before you send it or use [url]http://www.facepunch.com/threads/980338-User-messages-without-a-size-limit[/url] Datastream should be avoided at all costs unless you really need to use it and you should never really need to
[QUOTE=JohnnyOnFlame;28673582]Usermessage is good for small stuff. Datastream is good for big stuff. If the player is a freacking addict, and his inventory is full of items of all sorts with all having big ammounts, you might break through the limit of 255bytes.[/QUOTE] Because sending multiple user messages isn't possible.
I got inventory working, thanks for the help guys. But any idea how to save the properties of an entity? XP If not I'm sure I can figure it out. [editline]18th March 2011[/editline] Also is table.Random() not working?
table.Random works fine
Sorry, you need to Log In to post a reply to this thread.