GM:StartCommand
Bu hook öngörülebilirdir. Bu, tek oyunculu modda, İstemci (Client) alanında çağrılmayacağı anlamına gelir.
Açıklama
Oyuncunun girdilerini sunucu tarafından işlenmeden önce değiştirmenize olanak tanır. Bu fonksiyon aynı zamanda botlar için de çağrılır, bu da onu botları kontrol etmek için en iyi çözüm haline getirir.
Bu temel olarak GM:CreateMove'in paylaşılan (shared) bir versiyonudur.
Bu hook öngörülebilirdir, ancak alışılagelmiş yollarla değil; istemcide bir CUserCmd oluşturulduğunda ve sunucuda alındığında çağrılır. Bu nedenle bu hook'un tek oyunculu modda bile istemci tarafında çağrılması gerekir.
Argümanlar
Örnek
Bu hook'u kullanarak bir botu nasıl kontrol edeceğinize dair bir örnek.
Örnek, tüm botların levye (crowbar) ile ulaşabildikleri tüm oyuncuları öldürmeye gitmesine neden olur.
hook.Add( "StartCommand", "StartCommandExample", function( ply, cmd )
-- Eğer oyuncu bir bot değilse veya bot ölmüşse, hiçbir şey yapma
-- TODO: Belki bot öldüyse burada manuel olarak yeniden doğdurulabilir
if ( !ply:IsBot() or !ply:Alive() ) then return end
-- Tüm varsayılan hareketleri veya eylemleri temizle
cmd:ClearMovement()
cmd:ClearButtons()
-- Botun düşmanı yok, bir tane bulmaya çalış
if ( !IsValid( ply.CustomEnemy ) ) then
-- Tüm oyuncuları tara ve ölü olmayan birini seç
for id, pl in ipairs( player.GetAll() ) do
if ( !pl:Alive() or pl == ply ) then continue end -- Ölü oyuncuları veya kendini düşman olarak seçme
ply.CustomEnemy = pl
end
-- TODO: Belki botların hedeflerine ulaşmak için duvarlara yürümemesi için bir Görüş Hattı (Line of Sight) kontrolü eklenebilir
-- Veya botların düşmanlarına giden yolu bulabilmesi için yol bulma (path finding) eklenebilir
end
-- Bir düşman bulamadık, hiçbir şey yapma
if ( !IsValid( ply.CustomEnemy ) ) then return end
-- Botun normal yürüme hızında ileri hareket et
cmd:SetForwardMove( ply:GetWalkSpeed() )
-- Düşmanımıza nişan al
if ( ply.CustomEnemy:IsPlayer() ) then
cmd:SetViewAngles( ( ply.CustomEnemy:GetShootPos() - ply:GetShootPos() ):GetNormalized():Angle() )
ply:SetEyeAngles( ( ply.CustomEnemy:GetShootPos() - ply:GetShootPos() ):GetNormalized():Angle() )
else
cmd:SetViewAngles( ( ply.CustomEnemy:GetPos() - ply:GetShootPos() ):GetNormalized():Angle() )
ply:SetEyeAngles( ( ply.CustomEnemy:GetPos() - ply:GetShootPos() ):GetNormalized():Angle() )
end
-- Eğer botun henüz bir levyeye sahip değilse, ona bir levye ver
if ( SERVER and !ply:HasWeapon( "weapon_crowbar" ) ) then ply:Give( "weapon_crowbar" ) end
-- Levyeyi seç
cmd:SelectWeapon( ply:GetWeapon( "weapon_crowbar" ) )
-- Botun saldırmasını sağlamak için Fare 1'i basılı tut
cmd:SetButtons( IN_ATTACK )
-- Düşman öldü, yeni bir tane edinebilmek için düşmanımızı temizle
if ( !ply.CustomEnemy:Alive() ) then
ply.CustomEnemy = nil
end
end )
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord