Jump to content

Vamp1r

Members
  • Posts

    68
  • Joined

  • Last visited

Everything posted by Vamp1r

  1. Какие, мать его, таблицы ты собираешь перебирать? isElementWithinColShape вернет тебе true, если игрок в зоне! Все! Этого достаточно! Ты говорил про getElementsByType. Если использовать getElementsByType("colshape"), то она вернет таблицу со всеми используемыми колшейпами. Отсюда и таблица и такое число (10000, например). Как я понял, ты не видишь смысла запоминать колшейпу, в которую вошел игрок. Но видишь смысл перебирать все колшейпы, когда они понадобятся. Отсюда я и высказался про не оптимальность твоего кода. Нет смысла спорить в оптимальности.
  2. Хм. Представим, что зон 300, а колшейп, примерно 10000. Если перебирать таблицу со всеми колшейпами, уйдет больше времени, нежели перебирать 300 известных. Опять же, всплывает массив. Если не пользоваться им изначально, его придется создать. Если пользоваться им изначально, то мы лишь добавим один элемент, например zoneInfo["attackersCount"]. И когда игроки будут входить или покидать зону мы будем прибавлять или отнимать значение от текущего. Если пользоваться массивом изначально, то проходиться по ему уже не нужно, т.к. у игрока уже есть информация о текущей колшейпе, в которой он стоит. Нужно будет возвратить zoneInfo[инфа _из_игрока_о_его_колшейпе]["attackersCount"]. А если нужно будет найти всех игроков в колшейпе текущего игрока, то тут нам просто поможет getElementsWithinColShape . P.S. Мой вариант более оптимальный, т.к. практически вся информация о зоне будет храниться в таблице этой зоны. И для доступа к этой таблице, нам будет нужен только ее индекс, который хранится в игроке, породивший какое-то событие с зоной.
  3. Да, можно. Создать файл/базу (или использовать имеющуюся), в которой бы хранился этот промежуток времени для определенного ника. И когда игрок входит на сервер, сравнивать информацию из файла/базы с текущим временем (getRealTime()).
  4. Проверка при заходе игрока в зону необходима, например, для учета количества нападающих. Ведь куда интереснее будет, когда от количества нападающих на зону она захватывается быстрее. А вот isElementWithinColShape пригодилась бы для самой первой аттаке, нежели для подключающихся игроков к атаке.
  5. Flakker, да, совершенно забыл про функцию isElementWithinColShape Колшейпы цилиндры или сферы для турфов - это не то, само оптимально прямоугольник.
  6. Проще всего в данном случае использовать таблицы. При инициализации каждой зоны создаем для ее таблицу, в которой хранится вся информация о ней и в ней же хранится указатель на саму radar area + colshape. В то время как в colshape будет хранится указатель на нужный элемент таблицы, в котором вся информация о зоне. Что мы имеем? Игрок вошел в колшейп, ему через getElementData из колшейпа присваивается указатель на табличный элемент. Игрок пишет команду, например, /attackZone и там мы проверяем игрока на расположенность в той зоне, указатель на которую он содержит. Если игрок в данной зоне, то начинаем захват, если нет - сообщение об ошибке. Это почти тоже самое что написал Flaker. Пример: local zoneInfo = {} ... -- инициализация всех зон из файла/базы в цикле, например, где i - счетчик zoneInfo[i] = {} zoneInfo[i]["x"] = -- достаешь нужные координаты zoneInfo[i]["y"] = -- zoneInfo[i]["width"] = -- zoneInfo[i]["height"] = -- -- заполнение таблицы другими данными zoneInfo[i]["radarArea"] = createRadarArea(x, y, width, height) zoneInfo[i]["colShape"] = createColRectangle(x, y, x+width, y+height) setElementData(zoneInfo[i]["colShape"], "type", "turf") -- для того, чтобы определить среди других колшейп, что данная колшейпа именно для зон, например в onColShapeHit setElementData(zoneInfo[i]["colShape"], "ID", i) -- присвоим ей текущий номер из счетчика ... Вот примерно так инициализировать зону. Когда игрок входит в колшейп, сделать что-то типа такого: addEventHandler("onColShapeHit", getRootElement(), function(player, matchingDimension) if(matchingDimension) then if(getElementData(source, "type") == "turf") then local id = getElementData(source, "ID") if(getPlayerTurf(player) == id) then -- игрок в колшейпе зоны, присвоем ему ее ид setElementData(player, "turfID", id) end end end end ) function getPlayerTurf(player) local x, y, _ = getElementPosition(player) for i, _ in ipairs(zoneInfo) do if(x >= zoneInfo[i]["x"] and y >= zoneInfo[i]["y"] and x <= (zoneInfo[i]["x"]+zoneInfo[i]["width"]) and y <= (zoneInfo[i]["y"]+zoneInfo[i]["height"])) then return i end end return -1 end Потом, при захвате просто проверять, getPlayerTurf(player) с getElementData(player, "turfID"). Если совпадают - захват. P.S. Заранее извиняюсь, мог намудрить что-то лишнее, т.к. спать хочу. Может кто исправит.
  7. Скорее всего дело в клиенте ГТА. Всегда использовал лицензию от 1С и такое не встречал ни я, ни те, у кого такая же лицензия (имею ввиду друзей).
  8. Максимум элементов на одном сервере - 65 тысяч? Какие элементы входят в этот лимит? Только эти: https://wiki.multitheftauto.com/wiki/Entity , или все https://wiki.multitheftauto.com/wiki/Element ?
  9. Можно в onClientRender проверять на принадлежность транспорта дороге. А если не совпадает, то сдвинуть и повернуть в нужном направлении. Не очень понимаю, зачем это вообще нужно
  10. Если я правильно понял, ты хочешь, чтобы данную команду мог использовать только игрок с определенным ником? Если да, то получится у тебя вот так (на серверной стороне): function greetingCommandOne ( playerSource, commandName, playerName ) if playerName then if getPlayerName(playerSource) ~= "Ололош" then return outputChatBox("Ты не Ололош!", thePlayerSource) end local thePlayer = getPlayerFromName ( playerName ) if thePlayer then triggerClientEvent ( thePlayer, "onGreeting", getRootElement(), "Превед медвед!" ) else -- указано неправильное имя end else -- не указано имя end end addCommandHandler ( "greet_one", greetingCommandOne )
  11. Что значит нельзя задать первоначальное положение шлагбаума? Поясни
  12. В таком случае, куда удобнее написать свою функцию: function addEventHandlerEx(eventName, attachedTo, handlerFunction) addEvent(eventName, true) addEventHandler(eventName, attachedTo, handlerFunction) end И не заморачиваться каждый раз
  13. Такая проблема: Нужно создать произвольное событие, которое бы вызывалось везде, где надо, через addEventHandler . В моем случае, если нету addEvent, то addEventHandler не дает никаких результатов. Что-то вроде этого (один и тот же ресурс): Файл test1c.lua (клиент): ... triggerServerEvent("test", getLocalPlayer()) ... Файл test1s.lua (сервер): addEventHandler("test", true) addEventHandler("test", getRootElement(), function() outputChatBox("Ололо я вызывался") end ) А вот если создать файл test2s.lua (сервер): addEventHandler("test", getRootElement(), function() outputChatBox("Ололо я вызывался опять") end ) Второй раз событие не вызовется, если не добавить addEventHandler("test", true) . Возможно ли как-то решить данную проблему? Или для таких вещей придется писать свой addEventHandler ?
  14. Есть ли плюсы производительности, если отдельные функции будут выполнены в качестве модуля, а не lua-скрипта?
  15. Людям нужен игровой режим. Если игровой режим будет достоин, то люди потянуться, иначе нет.
  16. Такой вот вопрос: Как лучше организовать гуи вход игрока на сервер? Т.е. из какого события trigger'ить клиент событие, чтобы оно отображалось всегда? Например, если я из onPlayerJoin сразу триггерю, то иногда ресурсы не успевают докачаться и гуи просто не отображается.
  17. По-моему удалить - никак. Если только отследить ее вызов (на F11), потом при помощи forcePlayerMap скрыть ее и нарисовать свою.
  18. Прочитай подробнее про https://wiki.multitheftauto.com/wiki/BindKey Первый аргумент должен содержать элемент - player. А так же, по-моему, агрументы, которые есть у тебя - нет в bindKey. А так же, вместо переменных типа, driverDoctor, docCar_x и т.д. используй таблицы, т.к. если два игрока сядут в два докторских автомобиля, данная переменная будет содержать инфу о том, кто последний сел в автомобиль.
  19. Нужно опасаться, что захотят ли люди качать текстуры размерами в 100+ мб. А так опасений нет
  20. local a, b = 1, 2 -- Инициализуем две переменные. а = 1, b = 2 local tabl = {} -- Инициализуем табилцу tabl["1"] = a -- Заносим в таблицу значение a tabl["2"] = b -- Заносим в таблицу значение b -- Внутри квадратных скобок может быть что угодно, т.е. там может быть tabl[a] или tabl["Ololo"]. Это всего лишь индекс нужного элемента таблицы a = tabl["2"] -- Меняем значение а, на значение из таблицы b = tabl["1"] -- Меняем значение b, на значение из таблицы tabl = nil -- Удаляем таблицу Данный пример занес значения a и b в таблицу, а потом эти значения были изъяты из таблицы (в таблице эти значения все равно остались неизменными) в обратном порядке. Т.е. a = 2, а b = 1.
  21. local button = guiCreateButton(0.7, 0.1, 0.2, 0.1, "Кнопка", true) addEventHandler("onClientGUIClick", getRootElement(), function() if source == button then -- Тут вызов функции end end )
  22. Можно удалять и на клиенте. Да, но мой пример удаляет именно на сервере. А если он хочет удалить все объекты на сервере и заменить своими, то не вижу смысла удалять объекты каждому игроку в отдельности.
  23. Она исчезнет для всех игроков, но ты можешь её вернуть с помощью этой функции. то есть даже если я перезайду на сервер, карты не будет? Удаляет на серверной стороне, а не на стороне клиента. Поэтому хоть ты 20 раз перезайди - объектов не будет.
  24. Если я правильно понял, то ты хочешь сделать команду типа "/recon", при вводе которой у игрока появляется возможность следить за игроком и переключаться между игроками при помощи кнопок? Если да, то тебе поможет https://wiki.multitheftauto.com/wiki/GetElementsByType Сохраняешь текущий индекс игрока в таблице. При нажатии на кнопку вперед индекс увеличивается на 1, при нажатии на кнопку назад индекс уменьшается на 1. Как-то коротко вот так.
×
×
  • Create New...