# NPC:SetEnemy

- **Ortam:** Sunucu
- **İngilizce aslı:** https://wiki.facepunch.com/gmod/NPC:SetEnemy
- **Çeviri tarihi:** 2025-09-08

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

## Açıklama

Bir NPC için hedef belirler.

## Argümanlar

1. [Entity](https://gmod.tr/wiki/Entity) **enemy**: NPC'nin hedef alması gereken düşman
2. [boolean](https://gmod.tr/wiki/boolean) **newenemy** = true: Eğer yeni düşman geçerliyse ve son düşmana eşit değilse [NPC:SetCondition](https://gmod.tr/wiki/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](https://gmod.tr/wiki/Global.CurTime) bekleme süresi eklemeyi düşünün.

```lua
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 )
```

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/NPC:SetEnemy
