KruGoZor Posted January 23, 2012 Share Posted January 23, 2012 (edited) Здравствуйте. У меня 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 January 24, 2012 by Guest Link to comment
Kenix Posted January 23, 2012 Share Posted January 23, 2012 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
KruGoZor Posted January 23, 2012 Author Share Posted January 23, 2012 Спасибо! 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
Kenix Posted January 23, 2012 Share Posted January 23, 2012 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
KruGoZor Posted January 23, 2012 Author Share Posted January 23, 2012 О, вообще класс. за WarpPedIntoVehicle и SetControlState спасибо, а вот SetElementVisibleTo на транспорт не действует (на вике даже написано). Да и мне не нужно чтобы он был невидимым. Нужно чтобы другие игроки не могли сесть на него. Так можно сделать ? И остаётся вопрос с gui по прежнему нажимаются сразу все кнопки. Что может быть ? Link to comment
DakiLLa Posted January 23, 2012 Share Posted January 23, 2012 Если крепите обработчик к какому-то определенному элементу (в вашем случае это gui кнопки), пишите false в последнем параметре. Вот например: addEventHandler("onClientGUIClick", mbRentBtn, mbRent, false) Нужно чтобы другие игроки не могли сесть на него. Используйте cancelEvent для события onPlayerVehicleEnter, либо для onVehicleEnter (они почти что идентичны, разницу, думаю, сами найдете), ну а внутри самого обработчика уже вертите, что вам удобнее. Link to comment
Kenix Posted January 23, 2012 Share Posted January 23, 2012 SetElementVisibleTo на транспорт не действует (на вике даже написано) Действительно не уследил. Ну тогда просто на клиенте создавай велосипед , тогда никто не сможет увидеть кроме тебя. Link to comment
KruGoZor Posted January 23, 2012 Author Share Posted January 23, 2012 Огромное спасибо ребят, все работает! Сделал так: при рождении велика записываю в setElementID ник игрока который его родил. А при onVehicleStartEnter сравниваю ID с ником пытающегося сесть и если не совпадает, делаю cancelEvent (). Без вас бы ещё неделю тыкался) Link to comment
DakiLLa Posted January 23, 2012 Share Posted January 23, 2012 onVehicleStartEnter Брр, точно. Это я неправильные события написал Link to comment
KruGoZor Posted January 23, 2012 Author Share Posted January 23, 2012 Ещё вопрос появился. 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
Fro Posted January 24, 2012 Share Posted January 24, 2012 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
KruGoZor Posted January 24, 2012 Author Share Posted January 24, 2012 пробовал уже подобное, не работает. В чате все равно "оставшееся время аренды 59", только бесконечно. Таймер не останавливается. Link to comment
Kenix Posted January 24, 2012 Share Posted January 24, 2012 Клиент 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
KruGoZor Posted January 24, 2012 Author Share Posted January 24, 2012 Спасибо работает! Только не понял разницы. Почему мой код не работал ? Link to comment
KruGoZor Posted January 25, 2012 Author Share Posted January 25, 2012 ну вот опять. Как показывать гуи только одному игроку ? Если можно поясните хоть. А то в тот раз код не очень понял. 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
MX_Master Posted January 26, 2012 Share Posted January 26, 2012 на неизвестно как и с какими параметрами вызывается событие onRent Link to comment
KruGoZor Posted January 26, 2012 Author Share Posted January 26, 2012 Вот так вызывается. сервер triggerClientEvent ( "onRent", getRootElement(), c) клиент addEvent( "onRent", true ) addEventHandler( "onRent", getRootElement(), onRentHandler ) Link to comment
Scripting Moderators Sarrum Posted January 26, 2012 Scripting Moderators Share Posted January 26, 2012 triggerClientEvent ( source, "onRent", source, c) Если нужно, source замени на свое. Link to comment
KruGoZor Posted January 26, 2012 Author Share Posted January 26, 2012 Так что-то вообще не работает. Только если вместо обоих source указать getRootElement(), Что там должно быть то ? 1 это кому показывать? указываю client, source, player, localPlayer ничего. 2 не понял вообще что тут должно быть ? Link to comment
MX_Master Posted January 26, 2012 Share Posted January 26, 2012 вместо всяких root, тебе нужно указать конкретного игрока Link to comment
KruGoZor Posted January 26, 2012 Author Share Posted January 26, 2012 вместо обоих? что-то пока не выходит. Ещё покопаю. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now