NPC:SetEnemy
Açıklama
Bir NPC için hedef belirler.
Argümanlar
2 boolean newenemy = true
Eğer yeni düşman geçerliyse ve son düşmana eşit değilse NPC:SetCondition(COND.NEW_ENEMY) fonksiyonunu çağırır.
Örnek
Eğer bir NPC'nin belirli bir hedefi yoksa, düşman olduğu en yakın oyuncuyu hedeflemeye başlar veya hiç oyuncu yoksa hiçbir şeyi hedeflemez. Bu, sunucuda her tikte (tick) çalışır ve oyuncu ve/veya varlık sayısı yüksekse bir performans sorunu (bottleneck) yaratabilir, bu yüzden bu kodu oyun içinde kullanmayı planlıyorsanız bir CurTime bekleme süresi eklemeyi düşünün.
hook.Add( "Think", "NPCAutoSeekPlayer", function()
local npcs = ents.GetAll()
local plys = player.GetAll()
local plyCount = #plys
-- Hiç oyuncu olmadığında NPC'lere bir oyuncu atamaya çalışmanın bir anlamı yok
if ( plyCount == 0 ) then
return
end
-- Tüm varlıkları döngüye al ve NPC'leri kontrol et
for i = 1, #npcs do
local npc = npcs[ i ]
-- Eğer bu varlık düşmanı olmayan bir NPC ise, ona bir tane ata
if ( npc:IsNPC() && !IsValid( npc:GetEnemy() ) ) then
local curPly = nil -- En yakın oyuncu
local curPlyPos = nil -- En yakın oyuncunun pozisyonu
local curDist = math.huge -- NPC ve oyuncu arasındaki en düşük mesafe
local npcPos = npc:GetPos() -- NPC'nin pozisyonu
-- NPC'ye olan mesafelerini kontrol etmek için tüm oyuncuları döngüye al
for i = 1, plyCount do
local ply = plys[ i ]
-- Sadece bu NPC'nin nefret ettiği oyuncuları dikkate al
if ( npc:Disposition( ply ) == D_HT ) then
-- TODO: Her oyuncunun pozisyonunu (sabit) aramayı optimize edebilirsiniz
-- her NPC için aşağıdaki gibi bir tablo oluşturarak:
--- anahtar = oyuncu tanımlayıcısı (varlık nesnesi, UserID, EntIndex, vb.)
--- değer = oyuncunun pozisyon vektörü
-- kodun bu kısmına geçen ilk NPC için,
-- sonra diğer NPC'ler için yeniden kullanın
local plyPos = ply:GetPos()
-- Mesafe karşılaştırmaları için DistToSqr kullanın çünkü
-- bu, Distance'dan daha verimlidir ve
-- karesi alınmamış mesafeye herhangi bir şey için gerek yoktur
local dist = npcPos:DistToSqr( plyPos )
-- Eğer yeni mesafe daha düşükse, oyuncu bilgilerini güncelle
if ( dist < curDist ) then
curPly = ply
curPlyPos = plyPos
curDist = dist
end
end
end
-- curPly'nin geçerli olduğu garanti edilir çünkü bu kod
-- sadece en az bir oyuncu varsa çalışacaktır
npc:SetEnemy( curPly )
npc:UpdateEnemyMemory( curPly, curPlyPos )
end
end
end )
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord