Jump to content

2 проблемы с GUI и 1 с таймером.


Recommended Posts

Здравствуйте. У меня 2 проблемы с ГУИ.

1:По нажатию в пустую область окна, происходит нажатие всех кнопок дочерних от этого окна.

2:Когда игрок заходит на маркер ГУИ окно показывается сразу всем игрокам, а не только тому который зашел.

Посмотрите пожалуйста мой говнокод, а то уже запарился.

Выкладываю только клиентскую часть, думаю серверная не нужна.

test = createMarker(1707.8544921875, -1849.412109375, 13.075799942017, "cylinder", 2, 255, 0, 0, 150)    
function GUISpawnVehicleQ() 
  
  
GUIEditor_Button = {} 
GUIEditor_Label = {} 
GUIEditor_Edit = {} 
GUIEditor_Image = {} 
GUIEditor_Scrollbar = {} 
RentBicycleWin = guiCreateWindow(194,178,646,356,"Аренда велосипедов",false) 
guiWindowSetMovable(RentBicycleWin,false) 
guiWindowSetSizable(RentBicycleWin,false) 
GUIEditor_Image[1] = guiCreateStaticImage(35,41,178,142,"images/bike.png",false,RentBicycleWin) 
GUIEditor_Image[2] = guiCreateStaticImage(235,41,179,143,"images/bmx.png",false,RentBicycleWin) 
GUIEditor_Image[3] = guiCreateStaticImage(435,41,180,143,"images/mb.png",false,RentBicycleWin) 
local mbScrol = guiCreateScrollBar(436,218,178,20,true,false,RentBicycleWin) 
local mbRentBtn = guiCreateButton(435,249,179,27,"Арендовать Mountain Bike",false,RentBicycleWin) 
local bikeRentBtn = guiCreateButton(35,249,179,27,"Арендовать Bike",false,RentBicycleWin) 
local bikeScrol = guiCreateScrollBar(36,218,178,20,true,false,RentBicycleWin) 
local bmxRentBtn = guiCreateButton(235,249,179,27,"Арендовать BMX",false,RentBicycleWin) 
local bmxScrol = guiCreateScrollBar(236,218,178,20,true,false,RentBicycleWin) 
local exitBtn = guiCreateButton(294,307,72,27,"Выход",false,RentBicycleWin)     
GUIEditor_Label[1] = guiCreateLabel(90,192,64,22,"мин. Цена:",false,RentBicycleWin) 
local bikeTime = guiCreateEdit(33,188,52,25,"1",false,RentBicycleWin) 
local bikePrice = guiCreateEdit(158,189,55,23,"15",false,RentBicycleWin) 
guiEditSetReadOnly( bikePrice, true ) 
GUIEditor_Label[2] = guiCreateLabel(493,192,64,22,"мин. Цена:",false,RentBicycleWin) 
local mbTime = guiCreateEdit(436,188,52,25,"1",false,RentBicycleWin) 
local mbPrice = guiCreateEdit(561,189,55,23,"40",false,RentBicycleWin) 
guiEditSetReadOnly( mbPrice, true ) 
GUIEditor_Label[3] = guiCreateLabel(291,192,64,22,"мин. Цена:",false,RentBicycleWin) 
local bmxTime = guiCreateEdit(234,188,52,25,"1",false,RentBicycleWin) 
local bmxPrice = guiCreateEdit(359,189,55,23,"20",false,RentBicycleWin) 
guiEditSetReadOnly( bmxPrice, true ) 
--guiSetInputEnabled(true) 
  
function exitGui () 
        showCursor(false) 
        guiSetVisible(RentBicycleWin,false) 
        guiSetInputEnabled(false)   
end 
addEventHandler("onClientGUIClick", exitBtn, exitGui) 
  
  
--оброботка интерфейса 
function TimeBike () 
        local a = guiGetText ( bikeTime ) 
        guiScrollBarSetScrollPosition ( bikeScrol, a ) 
        a=a*15 
        guiSetText ( bikePrice, a ) 
end 
function TimeBmx ()  
        local c = guiGetText ( bmxTime ) 
        c=c*20 
        guiSetText ( bmxPrice, c ) 
end 
function TimeMb ()       
        local b = guiGetText ( mbTime ) 
        b=b*40 
        guiSetText ( mbPrice, b ) 
end 
function bikeScrolto ()  
        local a = guiScrollBarGetScrollPosition ( bikeScrol ) 
        a=a*15 
        guiSetText ( bikePrice, a ) 
        a=a/15 
        guiSetText ( bikeTime, a ) 
end 
function mbScrolto ()    
        local b = guiScrollBarGetScrollPosition ( mbScrol ) 
        b=b*40 
        guiSetText ( mbPrice, b ) 
        b=b/40 
        guiSetText ( mbTime, b ) 
end 
function bmxScrolto ()   
        local c = guiScrollBarGetScrollPosition ( bmxScrol ) 
        c=c*20 
        guiSetText ( bmxPrice, c ) 
        c=c/20 
        guiSetText ( bmxTime, c ) 
end 
addEventHandler("onClientGUIChanged", bikeTime, TimeBike) 
addEventHandler("onClientGUIChanged", bmxTime, TimeBmx) 
addEventHandler("onClientGUIChanged", mbTime, TimeMb) 
addEventHandler("onClientGUIScroll", bikeScrol, bikeScrolto) 
addEventHandler("onClientGUIScroll", mbScrol, mbScrolto) 
addEventHandler("onClientGUIScroll", bmxScrol, bmxScrolto) 
--кнопка покупки байка 
function bikeRent () 
    local priceA = guiGetText ( bikePrice ) 
    local timeA = guiGetText ( bikeTime ) 
    triggerServerEvent ( "onClickBike", getRootElement(), priceA, timeA )  
end 
addEventHandler("onClientGUIClick", bikeRentBtn, bikeRent) 
--/кнопка покупки байка 
--кнопка покупки BMX 
function bmxRent () 
    local priceC = guiGetText ( bmxPrice ) 
    local timeC = guiGetText ( bmxTime ) 
    triggerServerEvent ( "onClickBmx", getRootElement(), priceC, timeC )  
end 
addEventHandler("onClientGUIClick", bmxRentBtn, bmxRent) 
--/кнопка покупки BMX 
--кнопка покупки MB 
function mbRent () 
    local priceB = guiGetText ( mbPrice ) 
    local timeB = guiGetText ( mbTime ) 
    triggerServerEvent ( "onClickMb", getRootElement(), priceB, timeB )  
end 
addEventHandler("onClientGUIClick", mbRentBtn, mbRent) 
--/кнопка покупки MB 
  
--/оброботка интерфейса 
guiSetVisible(RentBicycleWin, false) 
showCursor(false) 
end           
  
  
function GUISpawnVehicleShow() 
            if (RentBicycleWin ~= nil) then 
                 guiSetVisible(RentBicycleWin, true) 
            end  
  
            showCursor(true) 
            guiSetInputEnabled(true) 
end 
  
addEventHandler ( "onClientMarkerHit", test, GUISpawnVehicleShow ) 
addEventHandler("onClientResourceStart", client, GUISpawnVehicleQ()) 

Edited by Guest
Link to comment

1.https://wiki.multitheftauto.com/wiki/AddEventHandler getPropagated = false

2.

  
addEventHandler( "onClientMarkerHit",test, 
    function( player ) 
        if player == localPlayer then 
            if RentBicycleWin then 
                 guiSetVisible( RentBicycleWin, true ) 
            end  
  
            showCursor( true ) 
            guiSetInputEnabled( true ) 
        end 
    end 
,false ) 
  

И ещё

Это не правильно client не может быть аттачен к обработчику события и функция и так вызывается

addEventHandler("onClientResourceStart", client, GUISpawnVehicleQ()) 

Правильно вот так:

addEventHandler( "onClientResourceStart", resourceRoot, GUISpawnVehicleQ ) 

P.S Код не весь посмотрел.

Link to comment

Спасибо! 2ая проблема решилась. А вот первая нет.

Сделал вот так, но всё тоже самое.

addEventHandler( "onClientMarkerHit",test, 
    function( player ) 
        if player == localPlayer then 
            if RentBicycleWin then 
                 guiSetVisible( RentBicycleWin, true ) 
            end 
  
            showCursor( true ) 
            guiSetInputEnabled( true ) 
        end 
    end 
,false ) 
addEventHandler("onClientResourceStart", resourceRoot, GUISpawnVehicleQ,false) 

И ещё появилось 2 вопросика:

1.Как скриптом посадить/высадить игрока на велосипед

2.Есть ли стандартная функция, чтобы сделать определенный транспорт доступным только для 1 игрока? или нужно изобретать свой велосипед ?)

Заранее спасибо.

Link to comment
1.Как скриптом посадить/высадить игрока на велосипед

1.Телепортировать в велосипед или заставить сесть в велосипед?

-1 https://wiki.multitheftauto.com/wiki/WarpPedIntoVehicle

-2 https://wiki.multitheftauto.com/wiki/SetControlState

2.Есть ли стандартная функция, чтобы сделать определенный транспорт доступным только для 1 игрока? или нужно изобретать свой велосипед ?)

https://wiki.multitheftauto.com/wiki/SetElementVisibleTo

Link to comment

О, вообще класс. за WarpPedIntoVehicle и SetControlState спасибо, а вот SetElementVisibleTo на транспорт не действует (на вике даже написано). Да и мне не нужно чтобы он был невидимым. Нужно чтобы другие игроки не могли сесть на него. Так можно сделать ?

И остаётся вопрос с gui по прежнему нажимаются сразу все кнопки. Что может быть ?

Link to comment

Если крепите обработчик к какому-то определенному элементу (в вашем случае это gui кнопки), пишите false в последнем параметре. Вот например:

addEventHandler("onClientGUIClick", mbRentBtn, mbRent, false) 

Нужно чтобы другие игроки не могли сесть на него.

Используйте cancelEvent для события onPlayerVehicleEnter, либо для onVehicleEnter (они почти что идентичны, разницу, думаю, сами найдете), ну а внутри самого обработчика уже вертите, что вам удобнее.

Link to comment
SetElementVisibleTo на транспорт не действует (на вике даже написано)

Действительно не уследил.

Ну тогда просто на клиенте создавай велосипед , тогда никто не сможет увидеть кроме тебя.

Link to comment

Огромное спасибо ребят, все работает!

Сделал так:

при рождении велика записываю в setElementID ник игрока который его родил. А при onVehicleStartEnter сравниваю ID с ником пытающегося сесть и если не совпадает, делаю cancelEvent ().

Без вас бы ещё неделю тыкался)

Link to comment

Ещё вопрос появился.

  
local timerGUIsec = timeA/1000 
    function timerGUI () 
        local a = timerGUIsec - 1 
        outputChatBox ( "оставшееся время аренды" ..a ,client) 
    end 
setTimer ( timerGUI, 1000, timerGUIsec ) 
  

к примеру timerGUIsec = 60, этот код выводит в чат 60 раз "оставшееся время аренды 59". Может я туплю, но как заставить его считать от 60 до 0 и выводить это в чат раз в секунду ?

Я вообще это в гуи хотел вывести. в чат это просто для пробы.

Link to comment
local timerGUIsec = timeA/1000 
    function timerGUI () 
        timerGUIsec = timerGUIsec - 1 
        outputChatBox ( "оставшееся время аренды " ..tostring(timerGUIsec) ,client) 
        if timerGUIsec > 0 then setTimer ( timerGUI, 1000, 1) end 
    end 
setTimer ( timerGUI, 1000, 1) 

Link to comment

Клиент

addCommandHandler( "timer", 
    function( ) 
        local fullTime = 50 
        local c = fullTime+1 
        local timer = setTimer (  
            function( ) 
                c = c - 1 
                outputChatBox ( "оставшееся время аренды " ..tostring( c ) ) 
            end, 
        1000, 
        fullTime+1 )     
    end 
) 

Link to comment

ну вот опять.

Как показывать гуи только одному игроку ? Если можно поясните хоть. А то в тот раз код не очень понял.

function rentGUItime() 
        GUIEditor_Label = {} 
        rentTimeLabel = guiCreateLabel(28,731,188,26,"до конца аренды:",false) 
        guiSetAlpha(GUIEditor_Label[1],1) 
        guiSetFont(GUIEditor_Label[1],"clear-normal") 
        guiSetVisible( rentTimeLabel, false ) 
    end 
  
addEventHandler("onClientResourceStart",resourceRoot,rentGUItime) 
  
function onRentHandler ( c ) 
if rentTimeLabel~=nil then 
guiSetVisible( rentTimeLabel, true ) 
guiSetText ( rentTimeLabel, "до конца аренды осталось "..c ) 
if c==0 then guiSetVisible( rentTimeLabel, false ) end 
end 
end 
addEvent( "onRent", true ) 
addEventHandler( "onRent", getRootElement(), onRentHandler ) 

Link to comment

Так что-то вообще не работает. Только если вместо обоих source указать getRootElement(), Что там должно быть то ?

1 это кому показывать? указываю client, source, player, localPlayer ничего.

2 не понял вообще что тут должно быть ?

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...