MaKc1M2401RU Posted July 31, 2013 Share Posted July 31, 2013 Всем привет. Есть одна проблемка. В общем, я в MTA-скриптинге совсем новичок (до этого имел дело лишь с SCM и CLEO) и скоро завершу работу над своим первым скриптом, однако у меня есть одна проблема. Суть такова: мой скрипт создаёт бота-стрелка, мне худо-бедно удалось научить его стрелять в одну точку, однако я уже долго ломаю голову над тем, как можно сделать так, чтобы он стрелял в ближайшего к нему игрока или другого бота, который носит какой-то определённый скин. Ну например, сам стрелок носит скин какого-нибудь члена банды Grove Street и отстреливает всех, кто носит скины банды Ballas. Или какой-нибудь выживший отстреливает зомби. Но, в прочем, сейчас эти подробности не так важны. Скрипт может выглядеть как-то не так и содержать кучу ошибок, потому что я его писал через внутриигровой редактор. Хотя в игре всё работает без перебоев. SERVER: NPC_Model = 30 NPC_CoordX = 2486.41 NPC_CoordY = -1651.35 NPC_CoordZ = 13.48 NPC_Angle = 180.0 NPC_Armor = 100 NPC_WeaponID = 30 NPC_SyncState = true NPC_FrozenState = true NPC_DeadTime = 45000 function createNPC() NPC = createPed(NPC_Model, NPC_CoordX, NPC_CoordY, NPC_CoordZ, NPC_Angle, NPC_SyncState) setElementFrozen(NPC, NPC_FrozenState) setPedArmor(NPC, NPC_Armor) end function giveWeaponToNPC() if (getElementHealth(NPC) > 0) then giveWeapon(NPC, NPC_WeaponID, 100, true) end end function setActionPerformedByNPC() triggerClientEvent("ActionForNPC", getRootElement(), NPC) end function removeDeadNPC() if (getElementHealth(NPC) < 1) then setTimer(takeAllWeapons, 75, 1, NPC) setTimer(destroyElement, NPC_DeadTime, 1, NPC) end end setTimer(createNPC, 50, 1) setTimer(giveWeaponToNPC, 50, 0) setTimer(setActionPerformedByNPC, 50, 0) setTimer(removeDeadNPC, 50, 0) CLIENT: function setActionForNPC(ped) setPedAimTarget(ped, 2486.88, -1700.13, 13.3337) setPedControlState(ped, "aim_weapon", true) setPedControlState(ped, "fire", true) end addEvent("ActionForNPC", true) addEventHandler("ActionForNPC", getRootElement(), setActionForNPC) Возможно ли зафиксировать координаты ближайшего к стрелку человека (то есть игрока или бота) и создать список скинов, по которому стрелок будет определять противника? Link to comment
TEDERIs Posted August 1, 2013 Share Posted August 1, 2013 Найти ближайшего игрока можно например так: local skins = { [ 77 ] = true, [ 78 ] = true, [ 79 ] = true } local pedx, pedy, pedz = 0, 0, 0 setTimer ( function ( ) local minDist = 300 local minPlayer for _, player in ipairs ( getElementsByType ( "player" ) ) do if skins [ getElementModel ( player ) ] ~= nil then local x, y, z = getElementPosition ( player ) local dist = getDistanceBetweenPoints3D ( pedx, pedy, pedz, x, y, z ) if dist < minDist then minDist, minPlayer = dist, player end end end if minDist < 10 then -- Стрелять по игроку minPlayer end end , 1000, 0 ) (Серверная сторона) Link to comment
Flaker Posted August 1, 2013 Share Posted August 1, 2013 Ухх, Tederis, вы из тех, кто шашлык в белых кедах делает? Зачем же так в лоб то... Привязываем колшейп(окружность) к педу, при его создании... Это будет наша зона видимости врагов( А если точнее дальность чувствительности педом врагов, ведь зона видимости надо рассчитывать относительно поворота башни и предметов на пути, ну да ладно, пока так ). Устанавливаем синкера( Тот игрок, через которого будем синхронизировать ) Теперь на клиентской части синкера: Получаем игроков внутри нашего колшейпа ( Это оптимальнее по производительности, так как: "ColShape'ы значительно быстрее, потому что реализованы через R-древо" )... Ну и собственно получаем ближайшего из них... Запоминаем таргет... Дальше с синкера отправляем команду "this бот стрелять" на сервер. С сервера ее пересылаем root'у... И собственно стреляем... Стрелять надо так: немного стреляем, немного стреляем, потом немного не стреляем и так в цикле... Ну, собссно, все. Link to comment
Flaker Posted August 1, 2013 Share Posted August 1, 2013 (edited) del Edited August 2, 2013 by Guest 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