Evolv Posted November 11, 2014 Share Posted November 11, 2014 Допустим, вся информация о игроке(дата последнего подключения, деньги, имя и т.п) хранится в элементе игрока, мне нужно сохранить эту информацию в MySQL, и для получения значения, допустим денег, мне нужно писать money = getElementData ( thePlayer, "money" )) ? И так для каждого элемента? Это же огромное количество работы, как быть? Нельзя ли просто хранить информацию о игроке в player = { money ={} } А потом просто забирать значение с помощью player.money[playeid] Но опять таки, как получить ид игрока? Господи, как же все непривычно и сложно после сампа Link to comment
Kernell Posted November 11, 2014 Share Posted November 11, 2014 В Lua, в качестве ключа таблицы может выступать всё что угодно. Не получай ID игрока (которого нет). Просто используй самого игрока как индекс таблицы. ElementData используется обычно только для того чтобы быстро и просто синхронизировать данные между сервером и всеми игроками (включая тех которые зайдут позже). Под самим игроком я имею ввиду его element (userdata). Тут нет айдишников, тут каждая сущность - это элемент, который не является числом. Если знаком с C++, то считай это указателем на объект. Link to comment
iAxel Posted November 12, 2014 Share Posted November 12, 2014 Слышал что использовать ElemetData в клиентской части не надежно, как с этим быть? Link to comment
iAxel Posted November 12, 2014 Share Posted November 12, 2014 И еще подтяните в коде) Какой вариант лучше? 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
N1kS Posted November 12, 2014 Share Posted November 12, 2014 Слышал что использовать ElemetData в клиентской части не надежно, как с этим быть? Да вообще использовать: setElementData Медленнее, чем таблицы. Уже не раз на буржуйском форуме это показывали, доказывали и т.д. По поводу элемент даты - прочитай предыдущей пост от Kernell'a, он там доходчиво изложил. От себя единственное добавлю, что еще есть смысл использовать элемент дату для синхронизации от сервер к клиенту. По поводу вашего локального чата - нужно проверить, что делается быстрее, но мне кажется, что лучше через: getDistanceBetweenPoints3D Так же рекомендую добавить в ваш локальный чат функцию, она добавит реализма: isLineOfSightClear Link to comment
iAxel Posted November 12, 2014 Share Posted November 12, 2014 Слышал что использовать ElemetData в клиентской части не надежно, как с этим быть? Да вообще использовать: setElementData Медленнее, чем таблицы. Уже не раз на буржуйском форуме это показывали, доказывали и т.д. По поводу элемент даты - прочитай предыдущей пост от Kernell'a, он там доходчиво изложил. От себя единственное добавлю, что еще есть смысл использовать элемент дату для синхронизации от сервер к клиенту. По поводу вашего локального чата - нужно проверить, что делается быстрее, но мне кажется, что лучше через: getDistanceBetweenPoints3D Так же рекомендую добавить в ваш локальный чат функцию, она добавит реализма: isLineOfSightClear Большое спасибо! Можете привести примеры isLineOfSightClear для чата Link to comment
N1kS Posted November 12, 2014 Share Posted November 12, 2014 Большое спасибо! Можете привести примеры isLineOfSightClear для чата Сам код разве, что только вечером, теорию сейчас. Когда игрок пишет сообщение - проверяйте не отделяет ли его от другого игрока объект, машина и т.д. Если же отделяет, то дальность можно уменьшить(с 30 до 10, например). Link to comment
Kernell Posted November 12, 2014 Share Posted November 12, 2014 Не надо использовать колшейпы в циклах, они для этого не предназначены. Колшейпы нужно использовать в событиях когда элемент вошел или вышел из него. Link to comment
iAxel Posted November 12, 2014 Share Posted November 12, 2014 Не надо использовать колшейпы в циклах, они для этого не предназначены. Колшейпы нужно использовать в событиях когда элемент вошел или вышел из него. Я знаю, но как новичок я открыл вики https://wiki.multitheftauto.com/wiki/OnPlayerChat Link to comment
Evolv Posted November 12, 2014 Share Posted November 12, 2014 (edited) Можете, пожалуйста, показать примеры передачи массива от сервера клиенту, и обратно? Или как вернуть результат проверки пароля клиенту? Клиент передает пароль и логин серверу, сервер проверяет пароль через MySQL, но как вернуть результат обратно клиенту? Edited November 12, 2014 by Guest Link to comment
Elengar Posted November 12, 2014 Share Posted November 12, 2014 Можете, пожалуйста, показать примеры передачи массива от сервера клиенту, и обратно? Тригером: --------------------------- -- 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
Evolv Posted November 12, 2014 Share Posted November 12, 2014 Спасибо большое Еще вопрос, у каждого типа элементов нумерация 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
Elengar Posted November 12, 2014 Share Posted November 12, 2014 Спасибо большое Еще вопрос, у каждого типа элементов нумерация 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
N1kS Posted November 13, 2014 Share Posted November 13, 2014 Имеем окружность, имеем координаты центра, имеем координаты конца вектора 1, значит знаем длину вектора (это радиус). Нужно повернуть наш вектор 1, как повернут вектор 2. Тоесть нужно вычислить координаты конца вектора 2, зная процент, на который нужно повернуть. Link to comment
Kernell Posted November 13, 2014 Share Posted November 13, 2014 Имеем окружность, имеем координаты центра, имеем координаты конца вектора 1, значит знаем длину вектора (это радиус). Нужно повернуть наш вектор 1, как повернут вектор 2. Тоесть нужно вычислить координаты конца вектора 2, зная процент, на который нужно повернуть. Скину наработки из 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 ); } 1 Link to comment
N1kS Posted November 13, 2014 Share Posted November 13, 2014 Все оказалось гараздо легче: https://wiki.multitheftauto.com/wiki/Get ... ceRotation Спасибо Лексу. Link to comment
N1kS Posted November 13, 2014 Share Posted November 13, 2014 Author: robhol. Ну мне Лекс скинул ссылку на функцию, этому парню отдельно спасибо. Link to comment
Evolv Posted November 13, 2014 Share Posted November 13, 2014 Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как? Link to comment
Elengar Posted November 13, 2014 Share Posted November 13, 2014 Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как? Нет, но можно "показать" изображение. Link to comment
Evolv Posted November 13, 2014 Share Posted November 13, 2014 Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как? Нет, но можно "показать" изображение. Да это я знаю... Нашел архив с изображениями скинов, аж на 50 мб! Я не сторонник большого "веса" сервера Link to comment
N1kS Posted November 13, 2014 Share Posted November 13, 2014 Всем большое спасибо за помощь, как нибудь, надеюсь, сочтемся. Ну и вопрос - можно ли в GUI показать объект или скин? Если да, то как? Нет, но можно "показать" изображение. Да это я знаю... Нашел архив с изображениями скинов, аж на 50 мб! Я не сторонник большого "веса" сервера Конверт в .gif. А что сделать то вообще нужно? Возможно смогу предложить другой, альтернативный способ, но не менее годный. Link to comment
Kenix Posted November 13, 2014 Share Posted November 13, 2014 1. Создаем педа на экране 2. Вращаем педа 3. Пишем шейдер, который уменьшает размер элемента https://wiki.multitheftauto.com/wiki/Sh ... #Ped_morph (посмотреть и сделать на основе его, там используется уменьшение/увеличение частей всего тела, думаю можно поэкспериментировать) 4. Применяем шейдер к этому педу createPed setElementPosition setElementRotation getWorldFromScreenPosition dxCreateShader engineApplyShaderToWorldTexture Link to comment
N1kS Posted November 13, 2014 Share Posted November 13, 2014 1. Создаем педа на экране2. Вращаем педа 3. Пишем шейдер, который уменьшает размер элемента https://wiki.multitheftauto.com/wiki/Sh ... #Ped_morph (посмотреть и сделать на основе его, там используется уменьшение/увеличение частей всего тела, думаю можно поэкспериментировать) createPed setElementPosition getWorldFromScreenPosition Это мой патент, вообще то. Link to comment
Elengar Posted November 14, 2014 Share Posted November 14, 2014 1. Создаем педа на экране2. Вращаем педа 3. Пишем шейдер, который уменьшает размер элемента https://wiki.multitheftauto.com/wiki/Sh ... #Ped_morph (посмотреть и сделать на основе его, там используется уменьшение/увеличение частей всего тела, думаю можно поэкспериментировать) 4. Применяем шейдер к этому педу createPed setElementPosition setElementRotation getWorldFromScreenPosition dxCreateShader engineApplyShaderToWorldTexture И как же его потом запихнуть в гуи окно ? 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