Jump to content

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


Recommended Posts

Допустим, вся информация о игроке(дата последнего подключения, деньги, имя и т.п) хранится в элементе игрока, мне нужно сохранить эту информацию в MySQL, и для получения значения, допустим денег, мне нужно писать

money = getElementData ( thePlayer, "money" ))  

?

И так для каждого элемента? Это же огромное количество работы, как быть? Нельзя ли просто хранить информацию о игроке в

player = { 
money ={} 
} 

А потом просто забирать значение с помощью player.money[playeid]

Но опять таки, как получить ид игрока? Господи, как же все непривычно и сложно после сампа

Link to comment

В Lua, в качестве ключа таблицы может выступать всё что угодно. Не получай ID игрока (которого нет). Просто используй самого игрока как индекс таблицы.

ElementData используется обычно только для того чтобы быстро и просто синхронизировать данные между сервером и всеми игроками (включая тех которые зайдут позже).

Под самим игроком я имею ввиду его element (userdata). Тут нет айдишников, тут каждая сущность - это элемент, который не является числом. Если знаком с C++, то считай это указателем на объект.

Link to comment

И еще подтяните в коде)

Какой вариант лучше?

  
function PlayerChat(msg, mType) 
    if mType == 0 then 
        cancelEvent() 
        local x, y, z = getElementPosition(source) 
        local chatSphere = createColSphere(x, y, z, 30) 
        destroyElement(chatSphere) 
        for k, v in ipairs(getElementsWithinColShape(chatSphere, "player")) do 
            outputChatBox(string.gsub((getPlayerName(source).." : "..msg), '#%x%x%x%x%x%x', ''), v, 211, 211, 211, true) 
        end 
    end  
end 
addEventHandler("onPlayerChat", root, PlayerChat) 
  

  
function PlayerChat(msg, mtype) 
    if mtype == 0 then 
        cancelEvent() 
        local x, y, z = getElementPosition(source) 
        for k, v in ipairs(getElementsByType("player")) do 
            local x2, y2, z2 = getElementPosition(v) 
            if getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) < 30 then 
                outputChatBox(string.gsub((getPlayerName(source).." : "..msg), '#%x%x%x%x%x%x', ''), v, 211, 211, 211, true) 
            end 
        end 
    end 
end 
addEventHandler("onPlayerChat", root, PlayerChat) 
  

Link to comment
Слышал что использовать ElemetData в клиентской части не надежно, как с этим быть?

Да вообще использовать:

setElementData 

Медленнее, чем таблицы. Уже не раз на буржуйском форуме это показывали, доказывали и т.д. По поводу элемент даты - прочитай предыдущей пост от Kernell'a, он там доходчиво изложил. От себя единственное добавлю, что еще есть смысл использовать элемент дату для синхронизации от сервер к клиенту. По поводу вашего локального чата - нужно проверить, что делается быстрее, но мне кажется, что лучше через:

getDistanceBetweenPoints3D 

Так же рекомендую добавить в ваш локальный чат функцию, она добавит реализма:

isLineOfSightClear 

Link to comment
Слышал что использовать ElemetData в клиентской части не надежно, как с этим быть?

Да вообще использовать:

setElementData 

Медленнее, чем таблицы. Уже не раз на буржуйском форуме это показывали, доказывали и т.д. По поводу элемент даты - прочитай предыдущей пост от Kernell'a, он там доходчиво изложил. От себя единственное добавлю, что еще есть смысл использовать элемент дату для синхронизации от сервер к клиенту. По поводу вашего локального чата - нужно проверить, что делается быстрее, но мне кажется, что лучше через:

getDistanceBetweenPoints3D 

Так же рекомендую добавить в ваш локальный чат функцию, она добавит реализма:

isLineOfSightClear 

Большое спасибо!

Можете привести примеры

isLineOfSightClear 

для чата

Link to comment

Большое спасибо!

Можете привести примеры

isLineOfSightClear 

для чата

Сам код разве, что только вечером, теорию сейчас. :-) Когда игрок пишет сообщение - проверяйте не отделяет ли его от другого игрока объект, машина и т.д. Если же отделяет, то дальность можно уменьшить(с 30 до 10, например).

Link to comment

Не надо использовать колшейпы в циклах, они для этого не предназначены. Колшейпы нужно использовать в событиях когда элемент вошел или вышел из него.

Link to comment

Можете, пожалуйста, показать примеры передачи массива от сервера клиенту, и обратно?

Или как вернуть результат проверки пароля клиенту?

Клиент передает пароль и логин серверу, сервер проверяет пароль через MySQL, но как вернуть результат обратно клиенту?

Edited by Guest
Link to comment
Можете, пожалуйста, показать примеры передачи массива от сервера клиенту, и обратно?

Тригером:

--------------------------- 
-- Server 
--------------------------- 
someArr = {1, 2, 3} 
triggerClientEvent( "eventName", root, someArr ) -- Почитай вики по этому. В первом аргументе можно указзать, какому именно клиенту передавать, если не указано - всем. 
  
--------------------------- 
-- Client 
--------------------------- 
function someNameToo( array ) --  Принимаем тот самый массив 
    if type(array) ~= 'table' then return end -- К примеру, проверим, пришел ли нам массив 
  
    outputChatBox( #array ) -- Ну и зачем-то выведем его длинну в чат 
end 
addEvent( "eventName", true ) -- Создаем новый ивент. Первый арг - название, второй - возможность вызывать его с другой стороны(сервера в нашем случае) 
addEventHandler( "eventName", root, someNameToo ) -- Присваиваем ивенту функцию-обработчик, которая он будет вызывать когда его будут вызывать 

Ну, или можно еще через set/getElementData

--------------------------- 
-- Server 
--------------------------- 
someArr = {1, 2, 3} 
setElementData( someElement, "someKey", someKey ) 
  
--------------------------- 
-- Client 
--------------------------- 
receivedArray = getElementData( someElement, "someKey") 

Link to comment

Спасибо большое :) Еще вопрос, у каждого типа элементов нумерация ID своя? Допустим, создам я два элемента разных типов - чекпоинты и пикапы, все они будут начинаться с единицы? И правильная будет ли такая запись?

checkpoints = createElement ( "posX", 1234.56 ) 
setElementData(checkpoints, "posY", 789.10 ) 
outputConsole(getElementData(checkpoints, "posY") 

Выведет ли в консоль "789.1"? По идее, наверное тут создается информация только об одном чекпоинте, я прав? Если да, то как создать элемент, который будет хранить информацию о нескольких чекпоинтах?

checkpoints[] = createElement ( "posX", 1234.56 ) 
setElementData(checkpoints[1], "posY", 789.10 ) 
outputConsole(getElementData(checkpoints[1], "posY") 

Так будет правильно?

Link to comment
Спасибо большое :) Еще вопрос, у каждого типа элементов нумерация ID своя? Допустим, создам я два элемента разных типов - чекпоинты и пикапы, все они будут начинаться с единицы? И правильная будет ли такая запись?
checkpoints = createElement ( "posX", 1234.56 ) 
setElementData(checkpoints, "posY", 789.10 ) 
outputConsole(getElementData(checkpoints, "posY") 

Выведет ли в консоль "789.1"? По идее, наверное тут создается информация только об одном чекпоинте, я прав? Если да, то как создать элемент, который будет хранить информацию о нескольких чекпоинтах?

checkpoints[] = createElement ( "posX", 1234.56 ) 
setElementData(checkpoints[1], "posY", 789.10 ) 
outputConsole(getElementData(checkpoints[1], "posY") 

Так будет правильно?

Да зачем тебе эти IDы, и тут их нашел. Это вообще не нумерация. Это больше таблица ключ-элемент, она общая для всех элементов. Ключи не нумерируется и задается строкой. Вообще, зачем тебе createElement ? Если ты хочешь чекпоинт, то тебе нужно createMarker .

Выведет ли в консоль "789.1"?

Выведет

У тебя еще ошибка тут checkpoints[]. Это ошибка была бы даже в большинстве С-подобных языков(не знаю как в pawn'е). Так как создание массива желает увидеть массив, а ты ему объект даешь.

checkpoints[#checkpoints  + 1] = createMarker(...) 

Вот так создать. Только это не элемент, а массив. Если нужен элемент, то можно этот же массив присвоить какому-то элементу, и так же в него писать. Делать какую-то систему типа setElementData(el, 'element' .. i, storeEl) не очень хорошо, так как тебе придется перебирать все ключи элемент даты, а это долго.

Кстати, про чекпоинты, в МТА есть такая штука как colshape, это почти тот же чекпоинт, только невидимый и может быть произвольного размера и формы.

Link to comment

Имеем окружность, имеем координаты центра, имеем координаты конца вектора 1, значит знаем длину вектора (это радиус). Нужно повернуть наш вектор 1, как повернут вектор 2. Тоесть нужно вычислить координаты конца вектора 2, зная процент, на который нужно повернуть.

thumb.png

Link to comment
Имеем окружность, имеем координаты центра, имеем координаты конца вектора 1, значит знаем длину вектора (это радиус). Нужно повернуть наш вектор 1, как повернут вектор 2. Тоесть нужно вычислить координаты конца вектора 2, зная процент, на который нужно повернуть.

thumb.png

Скину наработки из MTA RP, думаю под Lua переписать не составит труда

Angle - чтобы узнать угол между двумя векторами

Rotate - чтобы повернуть вектор на указанный угол (возвращает новый вектор)

  
public float Angle( Vector3 to ) 
{ 
    return ( 360.0f - ( (float)Math.Atan2( to.X - this.X, to.Y - this.Y ) * 180.0f / (float)Math.PI ) ) % 360.0f; 
} 
  
public Vector3 Rotate( float angle ) 
{ 
    angle = (float)Math.PI * angle / 180.0f; 
  
    return new Vector3( 
        this.X * (float)Math.Cos( angle ) - this.Y * (float)Math.Sin( angle ), 
        this.X * (float)Math.Sin( angle ) + this.Y * (float)Math.Cos( angle ),  
        this.Z 
    ); 
} 
  

  • Like 1
Link to comment
Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как?

Нет, но можно "показать" изображение.

Link to comment
Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как?

Нет, но можно "показать" изображение.

Да это я знаю... Нашел архив с изображениями скинов, аж на 50 мб! Я не сторонник большого "веса" сервера

Link to comment
Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как?

Нет, но можно "показать" изображение.

Да это я знаю... Нашел архив с изображениями скинов, аж на 50 мб! Я не сторонник большого "веса" сервера

Конверт в .gif. :-)

А что сделать то вообще нужно? Возможно смогу предложить другой, альтернативный способ, но не менее годный.

Link to comment

1. Создаем педа на экране

2. Вращаем педа

3. Пишем шейдер, который уменьшает размер элемента

https://wiki.multitheftauto.com/wiki/Sh ... #Ped_morph (посмотреть и сделать на основе его, там используется уменьшение/увеличение частей всего тела, думаю можно поэкспериментировать)

4. Применяем шейдер к этому педу

createPed 
setElementPosition 
setElementRotation 
getWorldFromScreenPosition 
dxCreateShader 
engineApplyShaderToWorldTexture 
  

Link to comment
1. Создаем педа на экране

2. Вращаем педа

3. Пишем шейдер, который уменьшает размер элемента

https://wiki.multitheftauto.com/wiki/Sh ... #Ped_morph (посмотреть и сделать на основе его, там используется уменьшение/увеличение частей всего тела, думаю можно поэкспериментировать)

createPed 
setElementPosition 
getWorldFromScreenPosition 
  

Это мой патент, вообще то. :x

Link to comment
1. Создаем педа на экране

2. Вращаем педа

3. Пишем шейдер, который уменьшает размер элемента

https://wiki.multitheftauto.com/wiki/Sh ... #Ped_morph (посмотреть и сделать на основе его, там используется уменьшение/увеличение частей всего тела, думаю можно поэкспериментировать)

4. Применяем шейдер к этому педу

createPed 
setElementPosition 
setElementRotation 
getWorldFromScreenPosition 
dxCreateShader 
engineApplyShaderToWorldTexture 
  

И как же его потом запихнуть в гуи окно ?

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