SweetyWolf Posted May 21, 2013 Share Posted May 21, 2013 Всем привет. Возникла тут проблемка. Есть у меня пед, который следует за игроком (с помощью npc_hlc), садится (вернее тпшится с помощью warpPedIntoVehicle) в машину к игроку. Но вот как сделать выход педа из машины, я понять не могу, это вообще возможно? Пед серверный. Вот код. Сервер: function remMilitiaPedInVehicle ( theVehicle ) local ped = getElementData ( source, "pedLink" ) if isElement ( ped ) then if isPedInVehicle ( ped ) then local syncer = getElementSyncer ( ped ) if syncer then triggerClientEvent ( "removeMilPedFromVehS", getRootElement(), ped ) end end end end removeEventHandler ( "onPlayerVehicleExit", source, remMilitiaPedInVehicle ) Клиент: function removeMilPedFromVeh ( ped ) if isElement ( ped ) then if isElementSyncer ( ped ) then setPedControlState ( ped, "enter_exit", true ) end end end addEvent( "removeMilPedFromVehS", true ) addEventHandler( "removeMilPedFromVehS", getRootElement(), removeMilPedFromVeh ) setPedControlState ( ped, "enter_exit", true ) возвращает true, но пед как сидел в тачке, так в ней и остается Link to comment
Kenix Posted May 21, 2013 Share Posted May 21, 2013 Попробуй это. removePedFromVehicle А это ещё зачем? Где сам обработчик? removeEventHandler ( "onPlayerVehicleExit", source, remMilitiaPedInVehicle ) И ещё у тебя источник в событии "removeMilPedFromVehS" это root, но ты можешь своего педа делать источником, и не передавать клиенту лишнюю инфу. Link to comment
CocaColaBear Posted May 21, 2013 Share Posted May 21, 2013 Мой игровой режим будет состоять из множества скриптов, которые будут работать как единый ресурс (т.е. система автомобилей будет в одной скрипте, игроков в другом и т.д.). Так вот, если у меня некоторые события будут повторяться много раз. К примеру, событие: addEventHandler("onColShapeLeave", root, function(hitElem) end ) Вызывается множество раз в различных скриптах. Есть ли разница: использовать все так как сейчас (множество таких объявлений событий), или создать одно такое событие и туда просто вписывать функции, которые будут описаны в других скриптах? Спасибо! Link to comment
SweetyWolf Posted May 21, 2013 Share Posted May 21, 2013 Попробуй это. removePedFromVehicle А это ещё зачем? Где сам обработчик? removeEventHandler ( "onPlayerVehicleExit", source, remMilitiaPedInVehicle ) И ещё у тебя источник в событии "removeMilPedFromVehS" это root, но ты можешь своего педа делать источником, и не передавать клиенту лишнюю инфу. removePedFromVehicle ведь удаляет педа из тачки без анимации По поводу removeEventHandler - это я не углядел, когда код на форум копировал, там на самом деле add И по источнику root спасибо Link to comment
Kenix Posted May 21, 2013 Share Posted May 21, 2013 setPedControlState не работает со всеми действиями, это так. Link to comment
Ruga Posted May 23, 2013 Share Posted May 23, 2013 подскажет кто нибудь как проверить ip адрес подключенного на код страны, тоесть определить страну. Link to comment
Kenix Posted May 23, 2013 Share Posted May 23, 2013 В ресурсе admin есть такое. Это называется geoip. Там есть база ip. Link to comment
Ruga Posted May 23, 2013 Share Posted May 23, 2013 да я решил экспортировать )) вот что вышло addEventHandler('onPlayerJoin',root, function () local ip = exports.admin:getPlayerCountry(source) if ip == 'RU' then outputChatBox("Yes",source,255,255,255) elseif ip == 'UK' then outputChatBox("Yes",source,255,255,255) elseif ip == 'BY' then outputChatBox("Yes",source,255,255,255) else outputChatBox("No",source,0,0,0) kickPlayer ( source ) end end ); мб пригодится кому нибудь)))) Link to comment
SweetyWolf Posted May 25, 2013 Share Posted May 25, 2013 setPedControlState не работает со всеми действиями, это так. жалко конешно, придется без всяких красивостей в виде анимаций выхода из тачки обходится. Спасибо. Но у меня тут возник другой вопрос, на этот раз уже связанный совсем с другим. В моем моде аккаунты хранятся в mysql. И так вышло, что чем дальше в лес, тем больше дров, а вернее тем больше столбцов для сохранения. Сейчас акканты сохраняются так: при выходе игрока, собираются все необходимые данные для сохранения, и они отправляются в базу данных в трех запросах (тк все данные в один mysql запрос не умещаются, вылетает ошибка). Но мне кажется, что это не шибко рационально. В одном ресурсе, который добавляет систему домов на сервер, видел такое сохранение: Есть функция setHouseData ( ид дома, переменная для сохранения, значение), которая выполняет setElementData и тут-же отправляет данные в mysql. Вот ее код: local saveableValues = { ["MONEY"] = "MONEY", ["WEAP1"] = "WEAP1", ["WEAP2"] = "WEAP2", ["WEAP3"] = "WEAP3", ["LOCKED"] = "LOCKED", ["OWNER"] = "OWNER", ["RENTABLE"] = "RENTABLE", ["RENTALPRICE"] = "RENTALPRICE", ["RENT1"] = "RENT1", ["RENT2"] = "RENT2", ["RENT3"] = "RENT3", ["RENT4"] = "RENT4", ["RENT5"] = "RENT5", ["PLAYERID"] = "PLAYERID", } function setHouseData(ID, typ, value) -- Security array -- houseData[ID][typ] = value setElementData(house[ID], typ, value) if(saveableValues[typ]) then local query = dbQuery(handler, "UPDATE houses SET "..saveableValues[typ].." = '"..value.."' WHERE ID = '"..ID.."';" ) local result = dbPoll(query, dbpTime) if(result) then dbFree(query) else error("Can't save Data: "..typ.." with the value: "..value.." for house ID "..ID.."!") end end end И я решил свою систему переделать на такую-же. Единственное, что вызывает небольшую проблему - это то, что я не могу сейчас перелепачивать весь мод и менять все setElementData для игроков на какую-нибуть setPlayerData (по типу той, что я выше написал). Поэтому я думаю, что может стоит воспользоваться onElementDataChange. Тоесть примерно так написать: function saveChange(dataName,oldValue) if getElementType(source) == "player" then -- check if the element is a player if(saveableValues[dataName]) then local query = dbQuery(handler, "UPDATE accounts SET "..saveableValues[dataName].." = '"..getElementData ( source, dataName ).."' WHERE ID = '"..ID.."';" ) local result = dbPoll(query, dbpTime) if(result) then dbFree(query) else error("Can't save Data: "..dataName.." with the value: "..getElementData ( source, dataName ).." for player ID "..ID.."!") end end end end addEventHandler("onElementDataChange",getRootElement(), saveChange) Как вам такая идея? Есть ли тут проблемные места, которые я не учел? Буду надеятся, что мне помогут Link to comment
Kenix Posted May 25, 2013 Share Posted May 25, 2013 При изменении любой даты, которые ты указал в таблице, сервер будет в простое некоторое время если аргумент timeout у функции dbPoll это - 1. Link to comment
Ruga Posted May 26, 2013 Share Posted May 26, 2013 dxDrawText можно ли скрывать/показывать для игроков? или что то еще похожее чтобы была точка с текстом которую можно скрыть? Link to comment
CocaColaBear Posted May 26, 2013 Share Posted May 26, 2013 dxDrawText можно ли скрывать/показывать для игроков? или что то еще похожее чтобы была точка с текстом которую можно скрыть? local show = false addEventHandler("onClientRender", root, function() if(show) then dxDrawText("Текст", 500, 500) end end ) addCommandHandler("showText", function() show = not show end ) Показывает и скрывает текст по команде /showText Link to comment
Ruga Posted May 26, 2013 Share Posted May 26, 2013 спасибо конечно, я вопрос не правильно поставил)) мне нужно что то наподобие setElementVisibleTo, что то не могу додумать как можно скрыть для всехз и лишь для одного в пространстве отображать, хотел пользовать это textCreateTextItem но на экране не красиво нежели в пространстве Link to comment
CocaColaBear Posted May 26, 2013 Share Posted May 26, 2013 спасибо конечно, я вопрос не правильно поставил)) мне нужно что то наподобие setElementVisibleTo, что то не могу додумать как можно скрыть для всехз и лишь для одного в пространстве отображать, хотел пользовать это textCreateTextItem но на экране не красиво нежели в пространстве Почти тоже самое. Сервер: function setTextVisibleTo(player, visible) triggerClientEvent(player, "showText", root, visible) end addCommandHandler("showText", function(player, command, plName) local pl = getPlayerFromName(plName) if(pl) setTextVisibleTo(pl, true) else outputChatBox("Такого игрока нет", player) end ) Клиент: local show = false addEventHandler("onClientRender", root, function() if(show) then dxDrawText("Текст", 500, 500) end end ) addEvent("showText", true) addEventHandler("showText", getLocalPlayer(), function(visible) show = visible end ) При помощи команды /showText [Имя_игрока] показывает указаеерму игроку текст Link to comment
Ruga Posted May 26, 2013 Share Posted May 26, 2013 можно укоротить ваш код до простого условия, только что проверил)) конечно для единичного случая, как раз по мне, когда есть маркер и его положение отображается лишь у одного игрока. спасибо что попытались помочь)))) вопрос решен ElementData... лениво))) Link to comment
Ruga Posted May 31, 2013 Share Posted May 31, 2013 ребят я сново со своими тараканами)) задавал этот вопрос, забросил и так и не сделал, вообщем сам вопрос нужно удалить строку в xml - xmlDestroyNode, сама строка выглядит так <car> <cars> <vehicle model="561" id="2350"></vehicle> </cars> </car> нужно осуществить поиск по id и удалить именно ту строку которая содержит id атрибут, local root = xmlLoadFile ("cars.xml") local houseroot = xmlFindChild (root,"cars",0) local car = xmlFindChild ( houseroot, "vehicle",0) что далее? помогите разобраться Link to comment
Kenix Posted May 31, 2013 Share Posted May 31, 2013 Можно конкретнее? Тебе это надо удалить, верно? <vehicle model="561" id="2350"></vehicle> Link to comment
Ruga Posted May 31, 2013 Share Posted May 31, 2013 Kenix да именно, только выборочно, конкретнее... заливаю строки в файл, даю им атрибуты один из коих id , но мне понадобилось что бы эти строки можно было удалять, соотвественно как проверить в цикле на наличие id в строке и удалить ее к примеру player сел в машину и если у нее id совпадает с id одной из строк удалить эту строку из xml как это осуществить ? function sod (source,cmd) local car = getPedOccupiedVehicle(source) local root = xmlLoadFile ("cars.xml") local houseroot = xmlFindChild (root,"cars",0) if (houseroot) then for i,v in ipairs (xmlNodeGetChildren(houseroot)) do local id = xmlNodeGetAttribute (v,"id") if id == getElemenData(car, 'id' ) then xmlDestroyNode( v ) xmlSaveFile(root) destroyElement(car) end end end end addCommandHandler('1', sod) это чудотворство не работает..(( как искать id в строке? Link to comment
AMARANT Posted May 31, 2013 Share Posted May 31, 2013 Попробуй получить значение своего тега "id" с помощью этой функции, если я правильно понял что ты хочешь сделать. Link to comment
Ruga Posted May 31, 2013 Share Posted May 31, 2013 id в принципе получать можно так local id = xmlNodeGetAttribute (v,"id") и получаем число tonumber(id) только все равно при удалении получаю что удаленные данные некоторые записываются в предедущую строку, ничего не понимаю, в инете толком не найти нормального описания а примеров тем более, ладно ребят спасибо, буду по старинке ручками удалять(( Link to comment
Scripting Moderators Sarrum Posted June 1, 2013 Scripting Moderators Share Posted June 1, 2013 function sod (source,cmd) local car = getPedOccupiedVehicle(source) local root = xmlLoadFile ("cars.xml") local houseroot = xmlFindChild (root,"cars",0) if (houseroot) then for i,v in ipairs (xmlNodeGetChildren(houseroot)) do local id = xmlNodeGetAttribute (v,"id") if id == getElemenData(car, 'id' ) then xmlDestroyNode( v ) xmlSaveFile(root) destroyElement(car) end end end end addCommandHandler('1', sod) 8 строку заменить на это: if tonumber ( id ) == getElementData ( car, 'id' ) then Ребята, нужна помощь. У меня возникла проблемка с lower, функция не держит юникод. print ( string.lower ( 'Test' ) ) --> test print ( string.lower ( 'Тест' ) ) --> Тест Собственно мне нужно заменить заглавные буквы на строчные. Может знает кто, как решить эту фигню? Link to comment
Kenix Posted June 1, 2013 Share Posted June 1, 2013 function sod (source,cmd) local car = getPedOccupiedVehicle(source) local root = xmlLoadFile ("cars.xml") local houseroot = xmlFindChild (root,"cars",0) if (houseroot) then for i,v in ipairs (xmlNodeGetChildren(houseroot)) do local id = xmlNodeGetAttribute (v,"id") if id == getElemenData(car, 'id' ) then xmlDestroyNode( v ) xmlSaveFile(root) destroyElement(car) end end end end addCommandHandler('1', sod) 8 строку заменить на это: if tonumber ( id ) == getElementData ( car, 'id' ) then Ребята, нужна помощь. У меня возникла проблемка с lower, функция не держит юникод. print ( string.lower ( 'Test' ) ) --> test print ( string.lower ( 'Тест' ) ) --> Тест Собственно мне нужно заменить заглавные буквы на строчные. Может знает кто, как решить эту фигню? utf функции - решение. Link to comment
Ruga Posted June 1, 2013 Share Posted June 1, 2013 function sod (source,cmd) local car = getPedOccupiedVehicle(source) local root = xmlLoadFile ("cars.xml") local houseroot = xmlFindChild (root,"cars",0) if (houseroot) then for i,v in ipairs (xmlNodeGetChildren(houseroot)) do local id = xmlNodeGetAttribute (v,"id") if id == getElemenData(car, 'id' ) then xmlDestroyNode( v ) xmlSaveFile(root) destroyElement(car) end end end end addCommandHandler('1', sod) 8 строку заменить на это: if tonumber ( id ) == getElementData ( car, 'id' ) then Ребята, нужна помощь. У меня возникла проблемка с lower, функция не держит юникод. print ( string.lower ( 'Test' ) ) --> test print ( string.lower ( 'Тест' ) ) --> Тест Собственно мне нужно заменить заглавные буквы на строчные. Может знает кто, как решить эту фигню? собственно я 8 строку и заменил. и написал вывод далее, что при сохранении файла строки перезаписываются данными по порядку, получается что удаляет просто по порядку, вообщем белеберда, лучше на sql попробую там по крайней мере есть что поучить и где что вычитать... Link to comment
~Gangsta~ Posted June 2, 2013 Share Posted June 2, 2013 (edited) . Edited June 6, 2013 by Guest 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