-
Posts
619 -
Joined
-
Last visited
Everything posted by Flaker
-
Я бы наверно так сделал: (Если я конечно понял правильно все) Получаешь всех игроков на сервере Получаешь половину размера массива всех игроков сервера Дальше создаешь массив A и в него записываешь первую половину игроков, а в массив B вторую половину. Ну потом, если еще игроки заходят сравниваешь размеры массива, и пихаешь зашедшего игрока в меньший массив... Ну при спавне, проверяешь в каком массиве игрок, и в зависимости от миссва спавнишь его на определенной машине
-
This function return x & y coords in front of theElement function getPositionInFrontOfElement(theElement) local rotz = getPedRotation(theElement) local x,y,z = getElementPosition(theElement) x = x + ( math.cos ( math.rad ( rotz+90 ) ) * 1.2) y = y + ( math.sin ( math.rad ( rotz+90 ) ) * 1.2) return x, y end
-
Try this code for Zombie Wasted Event: addEvent ( "onZombieWasted", true ) function addEXP(killer) if (killer and killer ~= source) then local playerAccount = getPlayerAccount ( killer ) if ( playerAccount ) and not isGuestAccount ( playerAccount ) then givePlayerMoney(7, killer) local experiance = getAccountData ( playerAccount, "levels.exp" ) if ( experiance ) then experiance = experiance + 1 setAccountData(playerAccount, "levels.exp", experiance) triggerClientEvent ( killer, "expDisplay", killer ) else setAccountData(playerAccount, "levels.exp", 1) triggerClientEvent ( killer, "expDisplay", killer ) end end end end addEventHandler( "onZombieWasted", getRootElement(), addEXP) P.S. i can't find where u trigger LevelUP function.
-
Machine, what u want to do in this code? If u want warp admin to base, then u should set any event... For example: 1) Create Col shape. https://wiki.multitheftauto.com/wiki/CreateColCuboid Then u should addEvent for this colshape... 2) Add Event OnColshapeHit (https://wiki.multitheftauto.com/wiki/OnColShapeHit) Example: local Colshape = createColCuboid ( 1024, 1024, 0, 500, 500, 500 ) --Create colshape function OnHit ( hitElement, matchingDimension ) if ( source == Colshape ) then --If Source is our colshape then if ( matchingDimension and getElementType ( hitElement ) == "player" ) then -- chech if hit element is player if isObjectInACLGroup ( "user."..getAccountName(getPlayerAccount(hitElement)), aclGetGroup ( "Admin" ) ) then --If player is admin setElementPosition ( hitElement, 1549.88953, -1685, 13 ) --Warp to admin's position else setElementPosition ( hitElement, 0, 0, 0 ) --Warp to not admin's position end end end end addEventHandler ( "onColShapeLeave", root, OnHit)
-
Ну если FFS сделали значит можно... Всмысле самому сделать можно!
-
local BadWords = { ["xyu"] = "***"; ["lol"] = "123"; } function blockChatMessage(message) cancelEvent() for word, text in pairs(BadWords) do msg = message:gsub(" "..word.." ", " "..text.." ") end outputChatBox( "CHAT: " .. getPlayerName(source) .. ": " .. msg, root ) end addEventHandler( "onPlayerChat", getRootElement(), blockChatMessage )
-
You can create .xml or .map file for this. Example of syntax: <gates> <gate x="1" y="2" z="3" moveX="1" moveY="2" moveZ="3"/> </gates> x, y, z - Gate's start position moveX, moveY, moveZ - Gate's move position moveX=
-
In function https://wiki.multitheftauto.com/wiki/OnElementDataChange, first argument is the name of the element data entry that changed Player can be source of this event. Also, u should check that the element is a player before acting on it. So, this code is more correct: function onTeamJoin(dataName) if (source and getElementType(source) == "player" and getPlayerTeam(source) ) then if ( getTeamName(getPlayerTeam(source)) == "Mailmen" ) then local x, y, z = getNewMailLocation(source, 1) setElementData(source, "mailData", 1) end end end addEventHandler("onElementDataChange",root,onTeamJoin) Also u can check data name. For example: function func(dataName) if ( dataName == "mailData" ) then --Data Name Check -- CODE HERE end end addEventHandler("onElementDataChange",root,func)
-
AirKite, на мой взгляд иметь платформу, на которой ты можешь делать практически все, что душа желает, немного более практичнее и приятнее в конце концов, чем просто мод, который ты толком и изменить не можешь... Вобще я не очень люблю холивары такие и так далее, но лично мое мнение насчет SAMP vs MTA MTA лучше тем что использует именно Lua... Почему же Lua лучше? Просто потому что это практически полноценный1 язык програмирования... Его синтаксис и вобще работа в целом схожи со множеством популярных языков... Так как GTA:SA в целом уже устарела, то на мой взгляд нет смысла учить PAWN, только что бы уметь делать что то для GTA. А выучив LUA на достаточном уровне, ты начнешь быстрее осваивать более сложные языки... Тот же C++ например... Ну и вобще LUA более распространене. И кстати на сколько я знаю в C++ можно внедрять Lua... Так, что лично мне MTA более интересна именно потому что язык скриптинга тут LUA.
-
Я и работаю с MySQL обычно... Потому и удивляюсь проблемам с функцией LIMIT в SQLite... Просто щас пишу скрипт на заказ, так вот попросили на SQLite сделать... Приходится мириться с такими странностями SQLite'a(
-
Это я понимаю... Значит изменить без компиляции невозможно?
-
Народ, кто хорошо знаком с SQLite. Что там за херня с DELETE по лимиту? Вот пример SQL запроса: DELETE FROM `TableName` WHERE `ColName` = 'Lol' LIMIT 2 Такую ошибку выдает дебагер: dbExec failed; near "LIMIT": syntax error Читал, что вроде как нужно надстройку "DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1" установить... Но не представляю даже где найти настройки SQLite в MTA Server... Вобщем, кто знаком хорошо c SQLite, подскажите в чем проблема. P.S. SELECT с LIMIT работает отлично
-
Я предполагаю, что можно сделать так: В Map Editore находишь самый ненужный объект) Заменяешь его модель и прикрепляешь к игроку как оружие... Хотя конечно такой замененный объект может на карте оригинальной встретится Ну это вобщем как вариант...
-
Ты когда смотришь функцию, ты первым делом смотри что она возвращает. так вот getPedWeapon возвращает id оружия:
-
addEventHandler ( "onPlayerSpawn", root, function ( posX, posY, posZ, spawnRotation, theTeam, theSkin, theInterior, theDimension ) if ( getTeamName ( theTeam ) == "Police" ) then setElementPosition ( source, 0, 0, 0, true ) end end )
-
O____________O Тебе надо когда игрок заспавнился за полицию, его телепортировало на базу? Так?
-
Поясни... Не очень понятно что конкретно нужно...
-
Незнаю незнаю... Можно конечно и так... Но лично я бы не стал бы так грузить сервак. Но тут уж каждый сам решает, так что не буду осуждать этот вариант.
-
Помему просто обработаться и востановится урон не успевает! По алгоритму то, при любом виде дамага, повреждения востанавливаются! Слишком большая нагрузка! Таймер который проверяет все машины, да и еще массив, который должен хранить дамаг! Вобщем все это дело очень сильно нагружать сервер будет! И кстати всеравно таймер не будет успевать проверить все машины... Их могут подорвать раньше чем сработает таймер!
-
Если я правильно тебя понял, то ты хочешь, чтобы автомобиль не терял хп, когда лежит на крыше? Если да, то вот: addEventHandler("onVehicleDamage", getRootElement(), function(lossHP) if isVehicleOnRoof(source) then setElementHealth(source, getElementHealth(source)+lossHP) end end ) Вот функция isVehicleOnRoof: function isVehicleOnRoof(vehicle) local rx,ry=getElementRotation(vehicle) if (rx>90 and rx<270) or (ry>90 and ry<270) then return true end return false end Не проверял, но должно работать. По-моему ивент onVehicleDamage нельзя отменить, поэтому нужно устанавливать хп. В данном случае, если машина лежит перевернутая, то при стрельбе и таране и всех остальных видах урона, машина не получит дамаг. (Так как он востановится)
-
Я бы попробовал так: делаю свою модель здания (В 3D Max), все модель полностью! А потом ее в MTA сую (Заменяю какое нибудь другое здание, моим объектом)... Ну так как 1 здание это 1 объект, то 300 объектов в зоне видимости вполне достаточно...
-
Этот символ: #, вернет цифру равную кол-ву строк в таблице. Он эквивалентен функции count в PHP. #sobchak Можно использовать примерно так: local intNumRows = #sobchak print( tostring(intNumRows) ) --4
-
Вот небольшое объяснение я написал. Почитай коментарии в коде, возможно что то прояснится: Задаем игроку язык: --При коннекте задаешь игроку элемент дата со значением языка, например английский --(Это нужно что б у игрока всегда был задан хоть какой нибудь язык) --Далее, если игрок потом указывает язык, просто изменяем елемент дату. addEventHandler( "onPlayerJoin", root, --Задаем английский язык игроку, как только он зашел на сервер. function () setElementData(source, "lang", "Eng") end ) Ресурс с названием "MultiLangRes". В нем и содержится таблица со всеми фразами и тд... --Ресурс с Названием "MultiLangRes" (Серверная часть) ( Не забываем перегнать в "UTF-8 без BOM" ) local Languages = { ["Rus"] = { ["you_arested"] = "Вас арестовали!", ["receive_money"] = "Вы получили деньги!" }; ["Eng"] = { ["you_arested"] = "You're arested!", ["receive_money"] = "You received money!" }; } function getTranslatedText(lang, row) --Аргумент lang это getElementData(player, "lang"), тоесть язык игрока! --Аргумент row это название колонки( например "you_arested" ) из которой получаем текст на языке игрока. local curTranslated = Languages[lang][row] --Получаем переведенный текст return curTranslated --Возвращаем переведенный текст --Для тех кто будет придираться к моему коду: --Да, можно сделать так: return Languages[lang][row], но мне нравится именно мой вариант, так как наиболее понятен! end --note: Если функция экспортируется только из серверной части, то ты можешь использовать ее только в серверной части! -- Да, ты можешь сделать экспорт с клиентской части, но [b][u]не просто дописав[/u][/b] эту фразу в meta.xml: --Meta.xml ресурса "MultiLangRes" function="getTranslatedText" type="server" /> --аргументы: (Язык Игрока, Название ключа таблицы) function="changeUsersLang" type="server" /> --аргументы: (Игрок, Название языка) Далее в другом ресурсе мы можем вывести игроку фразу на его языке: --Пример такой функции: function enterVehicle ( theVehicle, seat, jacked ) --when a player enters a vehicle outputChatBox( exports["MultiLangRes"]:getTranslatedText( getElementData(source, "lang"), "receive_money" ), source, 255,255,0 ) end addEventHandler ( "onPlayerVehicleEnter", getRootElement(), enterVehicle ) Вот как то так все это делается. Код не тестил, так что если ошибки или вопросы, пиши.
-
Вот написал пример функции сохранения логина и пароля в клиетский .xml файл ( Один из способов сделать save password функцию в логин панеле ) function saveLoginToXML(username, password) --Сохрание логина и пароля в XML local xml_save_log_File = xmlLoadFile ("files/xml/userdata.xml") --Пробуем открыть нужный нам файл if not xml_save_log_File then xml_save_log_File = xmlCreateFile("files/xml/userdata.xml", "login") --Если он не открылся, создаем его. Главный node будет: end if (username ~= "") then --Если Аргумент "username" не пустой записываем его local usernameNode = xmlFindChild (xml_save_log_File, "username", 0) if not usernameNode then usernameNode = xmlCreateChild(xml_save_log_File, "username") --Если нету node тогда создаем его end xmlNodeSetValue (usernameNode, tostring(username)) --Устанавливаем nod'у текст из аргумента "username" end if (password ~= "") then local passwordNode = xmlFindChild (xml_save_log_File, "password", 0) if not passwordNode then passwordNode = xmlCreateChild(xml_save_log_File, "password") end xmlNodeSetValue (passwordNode, tostring(password)) end xmlSaveFile(xml_save_log_File) --Сохраняем файл xmlUnloadFile (xml_save_log_File) --Закрываем файл (Выгружаем его из памяти) end Вот так будет выглядеть .xml файл при этом: Valera kepka228