NPC:SetEnemy

  NPC:SetEnemy( Entity enemy, boolean newenemy = true )

Açıklama

Bir NPC için hedef belirler.

Argümanlar

1 Entity enemy
NPC'nin hedef alması gereken düşman
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