Eğitimler - Sandalye Fırlatma Silahı

Giriş

Bu eğitimde sandalye fırlatan bir silah oluşturacağız.

Dosya Düzeni

  • garry's mod klasörünüzü açın.
  • 'addons' klasörünü açın.
  • 'chairlauncher' adında bir klasör oluşturun.
  • İçine 'lua' adında bir klasör oluşturun.
  • İçine 'weapons' adında bir klasör oluşturun.
  • 'weapon_chairgun.lua' adında bir dosya oluşturun.

Klasör yapınız bu şekilde olmalıdır:

garrysmod/addons/chairlauncher/lua/weapons/weapon_chairgun.lua

weapon_chairgun adında bir silah içeren chairlauncher adında bir eklenti oluşturdunuz. Yeni bir silah oluşturduğunuzda, çoğu kişi weapon_ önekini kullanır, çünkü varsayılan silah adlarının çoğu da weapon_ ile başlar.

Kod

Bunları anladıktan sonra silahınıza ekleyin.

Bilgilendirme

Bu kod sadece bilgilendirme amaçlıdır. Spawn menüsünde ve silah seçim menüsünde görünür.. bu nedenle silahınızın kullanımı karmaşıksa insanlara yardımcı olacaktır. Ayrıca, kimin yaptığını insanların bilmesi için yazar alanına adınızı koyabilirsiniz.

SWEP.PrintName = "Sandalye Fırlatıcı" -- Bu, spawn menüsünde ve silah seçim menüsünde gösterilecektir SWEP.Author = "(adınız)" -- Bu iki seçenek, silah seçim menüsünde silahı vurguladığınızda gösterilecektir SWEP.Instructions = "Bir sandalye fırlatmak için sol fare tuşu!"

Spawn Bilgisi

Oyuncuların bu silahı spawn menüsünden spawn edip edemeyeceğini.. ve sadece adminlerin spawn edip edemeyeceğini tanımlar.

SWEP.Spawnable = true SWEP.AdminOnly = true

Şarjör Bilgisi

Silahımız herhangi bir mermi veya şarjör kullanmadığı için şarjör boyutlarını -1'e ve mermiyi "none" olarak ayarladık.

Birincil saldırıyı otomatik olarak ayarladık. Bu, oyuncunun fare düğmesini bırakıp tekrar basmak zorunda olmadığı anlamına gelir - sürekli ateş edecektir.

SWEP.Primary.ClipSize = -1 SWEP.Primary.DefaultClip = -1 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "none" SWEP.Secondary.ClipSize = -1 SWEP.Secondary.DefaultClip = -1 SWEP.Secondary.Automatic = false SWEP.Secondary.Ammo = "none"

Daha Fazla Bilgi

Bunlar çoğunlukla kendini açıklamaktadır. Ağırlık ne kadar yüksekse, ona geçme olasılığınız o kadar artar. Slot ve SlotPos, silah menünüzde silahın nerede olacağına karar verir.

SWEP.Weight = 5 SWEP.AutoSwitchTo = false SWEP.AutoSwitchFrom = false SWEP.Slot = 1 SWEP.SlotPos = 2 SWEP.DrawAmmo = false SWEP.DrawCrosshair = true

Modeller

Kullanılacak görüş modeli (view-model) ve dünya modeli (world-model).

SWEP.ViewModel = "models/weapons/v_pistol.mdl" SWEP.WorldModel = "models/weapons/w_pistol.mdl"

Sesleri Önbelleğe Alma

Sound fonksiyonunu kullanarak sesleri yerel (local) veya SWEP değişkenleri olarak tanımlayarak önbelleğe alabilirsiniz. Bu, silahla ilk ateş ettiğinizde sesin yüklenmesini ve takılmaya neden olmasını engeller.

SWEP.ShootSound = Sound( "Metal.SawbladeStick" )

Gerçek Sandalye Fırlatma Kodu

Öğrenme keyfiniz için yorum satırları eklendi

-- Sol fare düğmesine basıldığında çağrılır function SWEP:PrimaryAttack() -- Bu silah 'otomatiktir'. Aşağıdaki bu fonksiyon çağrısı -- atış hızını tanımlar. Burada her 0.5 saniyede bir ateş etmesini ayarladık. self:SetNextPrimaryFire( CurTime() + 0.5 ) -- Bu modelle kendi üzerinde 'ThrowChair' fonksiyonunu çağır self:ThrowChair( "models/props/cs_office/Chair_office.mdl" ) end -- Sağ fare düğmesine basıldığında çağrılır function SWEP:SecondaryAttack() -- İkincil ateş otomatik olmasa da -- oyuncular çok hızlı ateş edememelidir self:SetNextSecondaryFire( CurTime() + 0.1 ) self:ThrowChair( "models/props_c17/FurnitureChair001a.mdl" ) end -- Eklediğimiz özel bir fonksiyon. Bunu çağırdığınızda oyuncu bir sandalye fırlatır! function SWEP:ThrowChair( model_file ) local owner = self:GetOwner() -- Bir sandalye fırlatmaya çalışmadan önce silahın tutulduğundan emin olun if ( not owner:IsValid() ) then return end -- Daha önce önbelleğe aldığımız atış sesini çal! self:EmitSound( self.ShootSound ) -- Eğer istemciysek, yapmak istediğimiz tek şey bu. -- Tahmin (prediction) nedeniyle yukarıdaki sesi istemcide çalıyoruz. -- ( eğer yapmasaydık, çok oyunculu modda bir ping gecikmesi hissederlerdi ) if ( CLIENT ) then return end -- Bir prop_physics objesi oluştur local ent = ents.Create( "prop_physics" ) -- Her zaman oluşturulan objelerin gerçekten oluşturulduğundan emin olun! if ( not ent:IsValid() ) then return end -- Objenin modelini, fonksiyona geçirilen model olarak ayarla ent:SetModel( model_file ) -- Bu, owner:EyePos() + (self:GetOwner():GetAimVector() * 16) ile aynıdır -- ancak vektör metotları yinelenen nesnelerin oluşturulmasını engeller -- bu daha hızlı ve bellek açısından daha verimlidir -- AimVector, fonksiyonun ilerleyen kısımlarında tekrar kullanılacağı için doğrudan değiştirilmez local aimvec = owner:GetAimVector() local pos = aimvec * 16 -- Bu yeni bir vektör nesnesi oluşturur pos:Add( owner:EyePos() ) -- Bu, yerel nişan vektörünü dünya koordinatlarına çevirir -- Pozisyonu, oyuncunun göz pozisyonunun 16 birim ilerisine ayarla. ent:SetPos( pos ) -- Açıları oyuncunun göz açılarına ayarla. Sonra spawn et. ent:SetAngles( owner:EyeAngles() ) ent:Spawn() -- Şimdi fizik nesnesini alalım. Bir fizik nesnesi aldığımızda her zaman -- kullanmadan önce geçerli olduğundan emin olmak için test etmemiz gerekir. -- Eğer değilse, objeyi kaldıracağız. local phys = ent:GetPhysicsObject() if ( not phys:IsValid() ) then ent:Remove() return end -- Şimdi kuvveti uyguluyoruz - böylece sandalye sadece yere düşmek yerine -- gerçekten fırlatılır. Buradaki bu değerle oynayarak -- ne kadar hızlı fırlattığımızı ayarlayabilirsiniz. -- Oluşturduğumuz aimvector vektörünün son kullanımı bu olduğuna göre, -- başka bir kopya oluşturmak yerine onu doğrudan değiştirebiliriz aimvec:Mul( 100 ) aimvec:Add( VectorRand( -10, 10 ) ) -- Elemanları [-10, 10) aralığında olan rastgele bir vektör ekle phys:ApplyForceCenter( aimvec ) -- Sandbox modunda oynadığımızı varsayarsak, bu objeyi -- temizleme ve geri alma listelerine eklemek isteriz. Bu şu şekilde yapılır. cleanup.Add( owner, "props", ent ) undo.Create( "Fırlatılan_Sandalye" ) undo.AddEntity( ent ) undo.SetPlayer( owner ) undo.Finish() -- Çok sayıda eşya çalışma alanını dağıtabilir. -- Bunu düzeltmek için, sandalye spawnlandıktan 10 saniye sonra onu kaldıracak bir gecikme ekliyoruz. -- ent:IsValid(), eşyayı kaldırmadan önce hala var olup olmadığını kontrol ederek hataları ortadan kaldırır. timer.Simple( 10, function() if ent and ent:IsValid() then ent:Remove() end end ) end

Meydan Okumalar

Yeni silahı şunları yapacak şekilde düzenleyebilir misiniz:

  • Sol/sağ tıklama için farklı bir ateş etme sesi kullanın
  • Şarjör değiştirme tuşuna bastığınızda bir karpuz fırlatın? (ipucu: WEAPON:Reload)
  • Aynı anda 3 sandalye fırlatın

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord