Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

Всем привет. Возникла тут проблемка. Есть у меня пед, который следует за игроком (с помощью 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

Попробуй это.

removePedFromVehicle 

А это ещё зачем? Где сам обработчик?

removeEventHandler ( "onPlayerVehicleExit", source, remMilitiaPedInVehicle ) 

И ещё у тебя источник в событии "removeMilPedFromVehS" это root, но ты можешь своего педа делать источником, и не передавать клиенту лишнюю инфу.

Link to comment

Мой игровой режим будет состоять из множества скриптов, которые будут работать как единый ресурс (т.е. система автомобилей будет в одной скрипте, игроков в другом и т.д.). Так вот, если у меня некоторые события будут повторяться много раз. К примеру, событие:

addEventHandler("onColShapeLeave", root, 
    function(hitElem) 
         
    end 
) 

Вызывается множество раз в различных скриптах.

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

Спасибо!

Link to comment
Попробуй это.
removePedFromVehicle 

А это ещё зачем? Где сам обработчик?

removeEventHandler ( "onPlayerVehicleExit", source, remMilitiaPedInVehicle ) 

И ещё у тебя источник в событии "removeMilPedFromVehS" это root, но ты можешь своего педа делать источником, и не передавать клиенту лишнюю инфу.

removePedFromVehicle ведь удаляет педа из тачки без анимации

По поводу removeEventHandler - это я не углядел, когда код на форум копировал, там на самом деле add

И по источнику root спасибо

Link to comment

да я решил экспортировать )) вот что вышло

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
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

При изменении любой даты, которые ты указал в таблице, сервер будет в простое некоторое время если аргумент timeout у функции dbPoll это - 1.

Link to comment

dxDrawText можно ли скрывать/показывать для игроков? или что то еще похожее чтобы была точка с текстом которую можно скрыть?

Link to comment
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

спасибо конечно, я вопрос не правильно поставил)) мне нужно что то наподобие setElementVisibleTo, что то не могу додумать как можно скрыть для всехз и лишь для одного в пространстве отображать, хотел пользовать это textCreateTextItem но на экране не красиво нежели в пространстве

Link to comment
спасибо конечно, я вопрос не правильно поставил)) мне нужно что то наподобие 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

можно укоротить ваш код до простого условия, только что проверил)) конечно для единичного случая, как раз по мне, когда есть маркер и его положение отображается лишь у одного игрока. спасибо что попытались помочь))))

вопрос решен ElementData... лениво)))

Link to comment

ребят я сново со своими тараканами)) задавал этот вопрос, забросил и так и не сделал, вообщем сам вопрос

нужно удалить строку в 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 да именно, только выборочно, конкретнее... заливаю строки в файл, даю им атрибуты один из коих 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

id в принципе получать можно так local id = xmlNodeGetAttribute (v,"id") и получаем число tonumber(id)

только все равно при удалении получаю что удаленные данные некоторые записываются в предедущую строку, ничего не понимаю, в инете толком не найти нормального описания а примеров тем более, ладно ребят спасибо, буду по старинке ручками удалять((

Link to comment
  • Scripting Moderators
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
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
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

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...