Welcome to Сообщество игровых серверов NETZONA.ORG

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. Зарегистрировавшись и войдя в систему, вы сможете создавать темы, публиковать ответы в существующих темах, давать репутацию другим участникам, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?
  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта NetZONA.org: https://netzona.org/help/public-offer/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами использования Ваших файлов cookie на Проекте NetZONA.org: https://netzona.org/help/cookies/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с Политикой конфиденциальности Проекта NetZONA.org: https://netzona.org/pages/privacy-policy/

  • Ответы на основные вопросы: https://netzona.org/threads/populjarnye-voprosy-i-otvety-na-nix.6122/

  • Приветствуем на сайте, Гость! Приобрести (купить) Информационную услугу (в том числе группу "Проверенный") на Проекте NetZONA.org: https://netzona.org/account/upgrades

Не получается присвоить значение переменной.

Статус
В этой теме нельзя размещать новые ответы.

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
Имеется данный код
Код:
npc_name = ""  -- объявление глобальной переменной

function PlayerUseRagdoll(ply, key)

    if key == IN_USE and IsValid(ply) then
        local tr = util.TraceLine({
        start  = ply:GetShootPos(),
        endpos = ply:GetShootPos() + ply:GetAimVector() * 84,
        filter = ply,
        mask   = MASK_SHOT
        })
         ent = tr.Entity
        
        if tr.Hit and IsValid(ent) and ent:GetClass() == "prop_ragdoll" and ent.Useable then       
        npc_return(ent)
        --print (npc_name)
         umsg.Start("call_vgui", ply)
                       umsg.End()
        return true
                end
    end
end
hook.Add("KeyRelease", "KeyReleasedHook", PlayerUseRagdoll)

function npc_return(ent) -- присвоение значения переменно npc_name
  npc_name = ent.Name
end

hook.Add("KeyRelease", "KeyReleasedHook", PlayerUseRagdoll)

function hud_loot() 
print (npc_name)
 local DermaPanel = vgui.Create( "DFrame" ) -- Creates the frame itself
 DermaPanel:SetPos( 50,50 ) -- Position on the players screen
 DermaPanel:SetSize( 250, 400 ) -- Size of the frame
 DermaPanel:SetTitle( "Инвентарь" ) -- Title of the frame
 DermaPanel:SetVisible( true )
 DermaPanel:SetDraggable( true ) -- Draggable by mouse?
 DermaPanel:ShowCloseButton( true ) -- Show the close button?
 DermaPanel:MakePopup() -- Show the frame
 local DermaButton = vgui.Create( "DButton" )
 DermaButton:SetParent( DermaPanel ) -- Set parent to our "DermaPanel"
 DermaButton:SetText( "Забрать" )
 DermaButton:SetPos( 13, 325 )
 DermaButton:SetSize( 225, 50)
 local icon = vgui.Create( "SpawnIcon", DermaPanel )
  icon:SetModel("models/props_combine/breenglobe.mdl")
  icon:SetPos(13,50)
  icon:SetSize(225,225)
 end

В функции PlayerUseRagdoll глобальной переменной npc_name должно присваивать значение ent.Name(для этого используется функция npc_return, не спрашивайте зачем), но значение переменной npc_name не изсеняется(вывод print (npc_name) в функции hud_loot() выводит начальное значение "")

PS знаю,что всё криво написано, но это потому что я уже чего только не перепробывал.
PSS С lua я пока на Вы, и изучаю его по мере надобности.
 

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Необходимо функцию npc_return поместить над функцией PlayerUseRagdoll, т.к. функция должна быть определена перед вызовом.
 

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
Необходимо функцию npc_return поместить над функцией PlayerUseRagdoll, т.к. функция должна быть определена перед вызовом.
С этой функцией всё нормально, и даже если мы вызовем print (npc_name) в нутре тела PlayerUseRagdoll, то получим значение равное ent.Name, но когда мы этот же print(npc_name) вызовем в hud_loot , то получим либо nil , либо первоначально заданное значение, в данном случае "" . Мне кажется, что проблема в hook.
 

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
Вот сейчас привёл свой треш в порядок, вот файл cl_init
Код:
include('init.lua')

function hud_loot()
print (npc_name)
 local DermaPanel = vgui.Create( "DFrame" ) -- Creates the frame itself
 DermaPanel:SetPos( 50,50 ) -- Position on the players screen
 DermaPanel:SetSize( 250, 400 ) -- Size of the frame
 DermaPanel:SetTitle( "Инвентарь" ) -- Title of the frame
 DermaPanel:SetVisible( true )
 DermaPanel:SetDraggable( true ) -- Draggable by mouse?
 DermaPanel:ShowCloseButton( true ) -- Show the close button?
 DermaPanel:MakePopup() -- Show the frame
 local DermaButton = vgui.Create( "DButton" )
 DermaButton:SetParent( DermaPanel ) -- Set parent to our "DermaPanel"
 DermaButton:SetText( "Забрать" )
 DermaButton:SetPos( 13, 325 )
 DermaButton:SetSize( 225, 50)
-- if (!loot_item == nil) then
 local icon = vgui.Create( "SpawnIcon", DermaPanel )
  icon:SetModel("models/props_combine/breenglobe.mdl")
  icon:SetPos(13,50)
  icon:SetSize(225,225)
-- end
 end
 usermessage.Hook( "call_vgui", hud_loot)

вот init
Код:
AddCSLuaFile("/lua/autorun/client/cl_loot.lua")

function npc_return(ent)
      npc_name = ent.Name
end


function PlayerUseRagdoll(ply, key)
print (npc_name)
  if key == IN_USE and IsValid(ply) then
    local tr = util.TraceLine({
    start  = ply:GetShootPos(),
    endpos = ply:GetShootPos() + ply:GetAimVector() * 84,
    filter = ply,
    mask   = MASK_SHOT
    })
     ent = tr.Entity
    
    if tr.Hit and IsValid(ent) and ent:GetClass() == "prop_ragdoll" and ent.Useable then

     
      
        --print(npc_name_local)
        npc_return(ent)
        print (npc_name)
        umsg.Start("call_vgui", ply)
        umsg.End()
    --  if !npc_table[npc_name] == nil then
    --  loot_item = table.Random(npc_table[npc_name])
      --umsg.Start("call_vgui", ply)
      --                umsg.End()
      return true
      --end
    end
  end
end
hook.Add("KeyRelease", "KeyReleasedHook", PlayerUseRagdoll)
 

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Всё верно. ты пытаешься получить значение npc_name на стороне клиента, которое назначено на стороне сервера. Так делать нельзя. Чтобы получить название, тебе надо передать значение переменной npc_name, например, через функцию umsg вместе с открытием худа.
 

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
Всё верно. ты пытаешься получить значение npc_name на стороне клиента, которое назначено на стороне сервера. Так делать нельзя. Чтобы получить название, тебе надо передать значение переменной npc_name, например, через функцию umsg вместе с открытием худа.
Спасибо, проблема решена.
 

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
Всё верно. ты пытаешься получить значение npc_name на стороне клиента, которое назначено на стороне сервера. Так делать нельзя. Чтобы получить название, тебе надо передать значение переменной npc_name, например, через функцию umsg вместе с открытием худа.
А можете дать пример кода (для nutscript) , добавляющий в инвентарь игрока какой-нибудь item, а то моё знанение английского и кол-во документаций по ns не по позволяют полностью понять, что к чему.
 

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
client:getChar():getInv():add("itemclass")
 

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
client:getChar():getInv():add("itemclass")
фунция inventory:add("itemclass") не работает.
PHP:
[ERROR] addons/fallout_snpcs/lua/autorun/cl_init.lua:10: attempt to call method 'add' (a nil value)
Хотя, функция inventory:printAll отлично работает. В чём может быть проблема.Itemclass - это uniqueID, так?
Вот код
PHP:
include('init.lua')

function hud_loot(data)
local loot_name = data:ReadString();
local ply_id = data:ReadChar();
local ply = Player (ply_id)
inv = ply:getChar():getInv()

local DermaPanel = vgui.Create( "DFrame" )
DermaPanel:SetPos( 50,50 )
DermaPanel:SetSize( 250, 400 )
DermaPanel:SetTitle( "Инвентарь" ) 
DermaPanel:SetVisible( true )
DermaPanel:SetDraggable( true ) 
DermaPanel:ShowCloseButton( true ) 
DermaPanel:MakePopup() -- Show the frame
print(loot_name)

if !(loot_name == "nil") then

local icon = vgui.Create( "DModelPanel", DermaPanel )
icon:SetModel(items[loot_name].model)
icon:SetPos(13,50)
icon:SetSize(225,225)

local DLabel = vgui.Create( "DLabel", DermaPanel )

DLabel:SetPos( 13, 175 )

DLabel:SetFont("Fallout")
DLabel:SetText( "Super! You have found: " .. items[loot_name].name )
DLabel:SizeToContents()
local DermaButton = vgui.Create( "DButton" )
DermaButton:SetParent( DermaPanel ) -- Set parent to our "DermaPanel"
DermaButton:SetFont ("Fallout")
DermaButton:SetText( "Take to yourself" )
DermaButton:SetPos( 13, 325 )
DermaButton:SetSize( 225, 50)
DermaButton.DoClick = give_loot(inv)
else

local DLabel = vgui.Create( "DLabel", DermaPanel )

DLabel:SetPos( 13, 175 )

DLabel:SetFont("Fallout")
DLabel:SetText( "Sorry, you haven't found anything :(" )
DLabel:SizeToContents()
end
end
usermessage.Hook( "call_vgui", hud_loot)
 

Ледкол

Пользователь
Регистрация
5 Ноя 2015
Сообщения
108
Реакции
0
Баллы
29
Возраст
23
Пол
И саму функцию забыл :)
PHP:
function give_loot(inv)
   inv:add(items[loot_name].uid)
end
 

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Функция :add() будет работать только на серверной стороне.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу