drive.Register
Açıklama
Yeni bir varlık sürüş modu/yöntemi kaydeder.
Argümanlar
2 table data
Sürüş modunu/yöntemini oluşturmak için gereken veri. Bu, sürüş tarafından kullanılan fonksiyonları içerir. Bkz. DRIVE_Hooks.
Örnek
Bir noclip sürüş türü ekler.
drive.Register( "drive_noclip",
{
--
-- Her hareketten önce çağrılır. Varlığınızı ve cmd'yi kullanarak
-- mv'yi hareketiniz için ihtiyacınız olan bilgilerle doldurmalısınız.
--
StartMove = function( self, mv, cmd )
--
-- Hareket pozisyonunu ve hızını varlığımızdan güncelle
--
mv:SetOrigin( self.Entity:GetNetworkOrigin() )
mv:SetVelocity( self.Entity:GetAbsVelocity() )
end,
--
-- Gerçek hareketi çalıştırır. İstemcide tahmin
-- hataları olduğunda bu birden çok kez çalıştırılabilir.
-- Sadece mv'yi değiştirmeye çalışmalısınız.
--
Move = function( self, mv )
--
-- Bir hız ayarla, shift tuşuna basılı tutulursa daha hızlı git
--
local speed = 0.0005 * FrameTime()
if ( mv:KeyDown( IN_SPEED ) ) then speed = 0.005 * FrameTime() end
--
-- Hareket verisinden (movedata) bilgi al
--
local ang = mv:GetMoveAngles()
local pos = mv:GetOrigin()
local vel = mv:GetVelocity()
--
-- Hızları ekle. Bu karmaşık görünebilir. İlk satırda
-- temel olarak ileri vektörünü al, sonra onu
-- ileri hızımızla çarp (W'ye basıyorsak > 0, S'ye basıyorsak < 0
-- ve ikisine de basmıyorsak 0 olacak) - ve bunu hıza ekle diyoruz.
-- Bunu sağ ve yukarı için de yapıyoruz, bu da bize serbest hareketimizi sağlıyor.
--
vel = vel + ang:Forward() * mv:GetForwardSpeed() * speed
vel = vel + ang:Right() * mv:GetSideSpeed() * speed
vel = vel + ang:Up() * mv:GetUpSpeed() * speed
--
-- Hızımızın kontrolden çıkmasını istemediğimiz için biraz
-- hava direnci uyguluyoruz. Hiçbir tuşa basılmıyorsa daha fazla
-- direnç uygulayarak daha fazla yavaşlamasını sağlıyoruz.
--
if ( math.abs(mv:GetForwardSpeed()) + math.abs(mv:GetSideSpeed()) + math.abs(mv:GetUpSpeed()) < 0.1 ) then
vel = vel * 0.90
else
vel = vel * 0.99
end
--
-- Hızı pozisyona ekle (hareket budur)
--
pos = pos + vel
--
-- Yeni hesaplanan değerleri varlığın kendisine ayarlamıyoruz,
-- bunun yerine onları hareket verisinde (movedata) saklıyoruz. Bunlar FinishMove'da uygulanır.
--
mv:SetVelocity( vel )
mv:SetOrigin( pos )
end,
--
-- Hareket tamamlandı. Yeni pozisyonları ayarlamak için mv'yi kullanın,
-- varlıklarınız/oyuncularınız üzerinde.
--
FinishMove = function( self, mv )
--
-- Varlığımızı güncelle!
--
self.Entity:SetNetworkOrigin( mv:GetOrigin() )
self.Entity:SetAbsVelocity( mv:GetVelocity() )
self.Entity:SetAngles( mv:GetMoveAngles() )
--
-- Eğer bir fizik nesnemiz varsa onu da güncelle. Ama sadece sunucuda.
--
if ( SERVER && IsValid( self.Entity:GetPhysicsObject() ) ) then
self.Entity:GetPhysicsObject():EnableMotion( true )
self.Entity:GetPhysicsObject():SetPos( mv:GetOrigin() );
self.Entity:GetPhysicsObject():Wake()
self.Entity:GetPhysicsObject():EnableMotion( false )
end
end,
--
-- Varlığı sürerken görünümü hesaplar
--
CalcView = function( self, view )
--
-- Bize 3. şahıs görünümü vermek için drive_base.lua'daki yardımcı metodu kullan
--
local idealdist = math.max( 10, self.Entity:BoundingRadius() ) * 4
self:CalcView_ThirdPerson( view, idealdist, 2, { self.Entity } )
end,
}, "drive_base" );
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord