Jump to content

Стреляющий NPC


Recommended Posts

Всем привет. Есть одна проблемка. :?

В общем, я в 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

Найти ближайшего игрока можно например так:

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

Ухх, Tederis, вы из тех, кто шашлык в белых кедах делает? Зачем же так в лоб то...

Привязываем колшейп(окружность) к педу, при его создании... Это будет наша зона видимости врагов( А если точнее дальность чувствительности педом врагов, ведь зона видимости надо рассчитывать относительно поворота башни и предметов на пути, ну да ладно, пока так ).

Устанавливаем синкера( Тот игрок, через которого будем синхронизировать )

Теперь на клиентской части синкера:

Получаем игроков внутри нашего колшейпа ( Это оптимальнее по производительности, так как: "ColShape'ы значительно быстрее, потому что реализованы через R-древо" )... Ну и собственно получаем ближайшего из них...

Запоминаем таргет...

Дальше с синкера отправляем команду "this бот стрелять" на сервер. С сервера ее пересылаем root'у... И собственно стреляем...

Стрелять надо так: немного стреляем, немного стреляем, потом немного не стреляем и так в цикле...

Ну, собссно, все.

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...