Jump to content

Vamp1r

Members
  • Posts

    68
  • Joined

  • Last visited

1 Follower

About Vamp1r

  • Birthday May 29

Details

  • Location
    Беларусь, г. Лида

Vamp1r's Achievements

Snitch

Snitch (10/54)

0

Reputation

  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. Людям нужен игровой режим. Если игровой режим будет достоин, то люди потянуться, иначе нет.
×
×
  • Create New...