Discord sunucumuz açılmıştır, hepinizi bekleriz

https://discord.gg/43gGDQe6tS

Eklenti Yazma ile ilgili bazı bilgiler

Hazır fonksiyonlar, kütüphaneler, düzenleme programları/araçları/gereçleri, editörler kısacası geliştirme ortamı

Moderatör: Moderatörler

Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Eklenti Yazma ile ilgili bazı bilgiler

Mesaj gönderen Colditz »

Merhabalar,
Yeni yazarlarımız için birkaç şey paylaşmak istedim. Eklenti yazarken bunlara dikkat ederseniz çok daha iyi şekilde kendinizi geliştireceğinizi düşünüyorum.
Eski tarzda eklentilere desteğimi kestim. Bunun için herkesin daha güncel, daha güzel kodlama sistemini öğrenmesini istiyorum.
Buradan yardım alınıp çeviri yapılmıştır. Tamamen aynısı değil, yeni hâle uyarlıdır. https://forums.alliedmods.net/showthread.php?t=46364
Umarım yardımcı olabilmişimdir.

İstediğiniz bir konu olursa buraya yazabilirsiniz.
konu-disi/eklenti-yazma-ile-ilgili-istekler-t47504.html


BAŞLIKLAR

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Basit Menü Nasıl Yapılır?

Mesaj gönderen Colditz »

Basit bir menü oluştururken herkes eski tarzda komutlar kullanır. Bunun için bir örnekle size nasıl yazılması gerektiğini göstereceğim

Kod: Tümünü seç

#include <amxmodx>

public plugin_init() {
	//...

	register_clcmd("say /menuyegiris", "MenuyeGiris");
	//Bu zorunlu değil, bir çeşit menüye giriş sistemi.
}

//Menüye giriş işlevi menüyü oluşturacaktır.
public MenuyeGiris(pPlayer) {
	//Öncelikle menü ve menü değeri oluşturmalıyız.
	new iMenu = menu_create("Menu basligi", "MenuyeGiris_handler");
	// menu_create
	// Birinci değer menünün başlığı.
	// İkinci değer menü kullanıldığında ne olacağını belirleyen işleve giriş.

	//Sonradan menüye değer ekleyeceğiz
	menu_additem(iMenu, "Secenek 1")
	menu_additem(iMenu, "Secenek 2");
	menu_additem(iMenu, "Senecek 3", "", 0, ADMIN_ADMIN);
	// menu_additem
	// Birinci değer oluşturduğumuz menünün değeri
	// İkinci değer menüde gözükecek olan seçenek
	// Üçüncü değer bu seçeneğin bilgisi
	// Dördüncü değer bu seçeneği kullanabilecek admin yetkisi
	// Beşinci değer etkinleştirmek/devre dışı bırakmak için geri çağırmadır. Geri çağırma kullanma pek kullanılmadığı için burayı atlayacağım.

	//Menünün özelliklerini değiştirebiliriz.
	menu_setprop(iMenu, MPROP_EXITNAME, "Çıkış");
	// menu_setprop
	// Birinci değer oluşturduğumuz menünün değeri
	// İkinci değer modifiye edeceğimiz yer (amxconst.inc kütüphanesinde bulabilirsiniz)
	// Üçüncü değer modifiye ettiğimiz şey (Burada exit yazısını Çıkış yaptık.Siz istediğiniz şeyi değiştirebilirsiniz)
	// MPROP_EXIT için MPROP_ALL varsayılandır. Kullanılmaya gerek yoktur.

	//Son olarak menüyü gösterelim.
	menu_display(pPlayer, iMenu);
	// menu_display
	// Birinci değer menüyü gösterdiğimiz kişi (0 yazarak herkese gösteremezsiniz, döngü gerekiyor)
	// İkinci değer oluşturduğumuz menünün değeri
	// Üçüncü değer göstereceğimiz sayfa (varsayılan ilk sayfa olduğu için gerek yok)
	// Dördüncü değer menünün kullanılma süresi (varsayılan sınırsız)
}

//Menüyü gösterdik, şimdi menüde neler olacağını ayarlayacağız.
public MenuyeGiris_handler(pPlayer, iMenu, iItem) {
	//iItem komutu bize hangi seçeneğin seçildiğini açıklıyor. Fakat 1 den değil 0 dan başlıyor
	switch(iItem) {
		case 0: {
			client_print_color(0, 0, "BİRİNCİ SEÇENEĞE BASTIM.");

			//Menüye devam ettirmek istemediğimiz zaman önce menüyü yok etmemiz gerekiyor. Basit bir örnek.
			menu_destroy(iMenu);
			return PLUGIN_HANDLED;
		}
		case 1: {
			client_print_color(0, 0, "İKİNCİ SEÇENEĞE BASTIM");
		}
		case 2: {
			client_print_color(0, 0, "ÜÇÜNCÜ SEÇENEĞE BASTIM ADMİNİM");
		}
		//Bu zorunlu değil sadece MENU_EXIT ile menüden çıktığını algılatabiliyorsunuz.
		case MENU_EXIT: {
			client_print_color(0, 0, "MENÜDEN ÇIKTIM");
		}
	}

	//En son olarak menüyü yok edip bu fonksiyonu bitiriyoruz.
	menu_destroy(iMenu);
	return PLUGIN_HANDLED;
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Oyuncu Menü Nasıl Yapılır?

Mesaj gönderen Colditz »

Oyuncu Menüsü yapılırken basit menüde önemsemediğimiz menüdeki seçenek bilgisini kullanacağız. Buna geçmeden önce basit menüdeki her şeyi
anladığınızdan emin olun. Direkt Menü oluşmasından başlayacağım

Kod: Tümünü seç

#include <amxmodx>

public OyuncuMenusu(pPlayer) {
	//Öncelikle menü ve menü değeri oluşturmalıyız.
	new iMenu = menu_create("Oyuncu Menüsü", "OyuncuMenusu_handler");

	//Bütün oyuncuları algılatmak için bir döngüye ihtiyacımız var. Bu döngüyü for ile yapacağız.
	// İlk seçeneğe 1 yazıyoruz çünkü oyuncu değeri 1den başlıyor, 32ye kadar devam ediyor.
	// İkinci seçeneğe oyuncu değerinin 32 den küçük veya eşit olup olmadığını algılatıyoruz.
	// Üçüncü seçeneğe algılatmamızın sonuna gelene kadar oyuncu değerini artırıyoruz.
	for(new id = 1; id <= MaxClients; id++) {
		// Oyundaysa --> is_user_connected
	 	// Oyundaysa ve ölüyse --> is_user_connected && !is_user_alive
	 	// Oyundaysa ve yaşıyorsa --> is_user_alive
	 	if(is_user_connected(id)) {
			//fmt komutunun amacı bir yazıya değer vermemizi sağlıyor.
			//Örneğin bir oyuncunun ismini almak için %n kullanıyoruz. formatex komutunun benzeridir.
			//Burada ilk fmtde oyuncunun adını, ikinci fmtde oyuncunun userid sini algılatıyoruz.
			menu_additem(iMenu, fmt("%n", id), fmt("%i", id));
			// menu_additem
			// Üçüncü değer bu seçeneğin bilgisi (oyuncunun useridsi)
		}
	}

    //Son olarak menüyü gösterelim.
	menu_display(pPlayer, iMenu);
 }

 public OyuncuMenusu_handler(pPlayer, iMenu, iItem) {
 	//Öncelikle iItem ile oyuncunun menüden çıkıp çıkmadığını algılatıp, menüden çıktıysa fonksiyonu bitirmeliyiz.
 	if(iItem == MENU_EXIT) {
 		menu_destroy(iMenu);
 		return PLUGIN_HANDLED;
 	}

 	//Burada menünün değerini çekmek için birkaç değer oluşturacağız.
 	new szData[6], iKey;
 	//Burada ise bilgiyi çekeceğiz.
 	menu_item_getinfo(iMenu, iItem, _, szData, charsmax(szData));

 	//Verdiğimiz userid bilgisini burada iKey değerine aktarıyoruz. Tabii ki değer sayı olacağı için str_to_num kullanacağız.
 	//Her oyuncu sunucuya girerken (1 ile 32) arasında bir sayı alır. Bu sayıya göre işlem yapılır.
 	//iKey değerini yukarda algılattık. Yukarıdakini silip burada da algılatabilirsiniz. (Aynı işlem)
 	iKey = str_to_num(szData);

 	//Oyuncunun kontrolünü burada da yapacağız.
 	// Oyundaysa --> is_user_connected
 	// Oyundaysa ve ölüyse --> is_user_connected && !is_user_alive
 	// Oyundaysa ve yaşıyorsa --> is_user_alive
 	if(is_user_connected(id)) {
 		//Burada oyuncuya işlem yapılır
 	}

 	//Ve menü yok edilir.
 	menu_destroy(iMenu);
 	return PLUGIN_HANDLED;
 }
 

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Basit Oylama Menüsü Nasıl Yapılır?

Mesaj gönderen Colditz »

Basit Oylama Menüsü yapılırken menüyü herkese göstermek gerekiyor. O bölümü iyi anlamanız gerekiyor.

Kod: Tümünü seç

#include <amxmodx>

//Menüyü oluşturmak için global bir değişken belirleyeceğiz.
new g_iVoteMenu;
//Oyları çekebilmemiz için bir oy değeri oluşturacağız. [] içindeki değer menü seçeneği + 1 sayısında olmalıdır.
new g_iVotes[2];
//Oylamanın devam edip etmediğini algılatmak için bir değer oluşturmamız gerekiyor.
new g_iVoting;

public OylamaMenusu(pPlayer) {
	//Oylama varsa, tekrardan başlamaması için koruma yapıyoruz.
	if(g_blVoting) {
		client_print_color(pPlayer, pPlayer, "Oylama Devam Ediyor");
		return PLUGIN_HANDLED;
	}

	//Oylamaya başlamadan önce değerleri sıfırlıyoruz.
	g_iVotes[0] = g_iVotes[1] = 0;
	// Eğer 2den fazla değere sahipse, aşağıdaki gibi yapmanız daha iyi olacaktır.
	//arrayset(g_iVotes, 0, sizeof g_iVotes);

	//Öncelikle menü ve menü değeri oluşturmalıyız. Oluşturduğumuz global değere bağlıyoruz.
	g_iVoteMenu = menu_create("Oylama Başlığı", "OylamaMenusu_handler");

	//Menüye seçenek ekleyin
	menu_additem(g_iVoteMenu, "Seçenek 1");
	menu_additem(g_iVoteMenu, "Seçenek 2");

	//Herkese yollamak için bir döngü oluşturacağız. Döngü olayını Oyuncu Menüsünde anlattım.
	for(new id = 1; id <= MaxClients; id++) {
		if(is_user_connected(id)) {
			//Oylamayı göster
			menu_display(id, g_iVoteMenu);

			//Oylamaya katılan sayı kadar artacaktır.
			g_iVoting++;
		}
	}

	//Oylamayı belirlediğin saniye sonra bitir.
	set_task(10.0, "OylamayiBitir");

	return PLUGIN_HANDLED;
}

public OylamaMenusu_handler(pPlayer, iMenu, iItem) {
	//Menüden çıktıysa veya hiç oy yoksa menüyü kapatacak
	if(iItem == MENU_EXIT || !g_iVoting) {
		//Burada menüyü yok etmiyoruz. Aksi takdirde oy vermeyenlerde de menü yok olacaktır.
		return PLUGIN_HANDLED;
	}

	//Seçilen seçeneğin oyunu artırır.
	g_iVotes[iItem]++;

	//Menüyü yok etmiyoruz.
	return PLUGIN_HANDLED;
}

public OylamayiBitir() {
	//En çok oy alan seçeneği belirliyoruz. Birinci seçenecek > İkinci Seçenek
	if(g_iVotes[0] > g_iVotes[1]) {
		client_print_color(0, 0, "Birinci seçenek kazandı");
	}

	//Değilse, tam tersini deniyoruz. İkinci Seçenek > Birinci Seçenek
	else if(g_iVotes[1] > g_iVotes[2]) {
		client_print_color(0, 0, "İkinci seçenek kazandı");
	}

	//Değilse, berabere
	else {
		client_print_color(0, 0, "Berabere");
	}

	//Oylama bittiğine göre menüyü yok edebiliriz.
	menu_destroy(iMenu);

	//Oy sayısını da sıfırlayabiliriz
	g_iVoting = 0;
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Enum ile Sabit Değerden Nasıl Değer Çekerim?

Mesaj gönderen Colditz »

Birçok kişi enum kullanımını bilmiyor. Bunun kısa bir kullanımını göstereceğim.
Enum u kullanarak sabit yazı değerinden yazı çekeceğiz.

Kod: Tümünü seç

#include <amxmodx>

//Enum ile birçok şey yapılabilir. Burayı okuyabilirsiniz. https://forums.alliedmods.net/showthread.php?t=140103
//Ben burada sadece basit bir kullanımını göstereceğim.
//Öncelikle enum komudumuzu kullanıyoruz. _: etiketimizin adı
//Oluşturduğumuz değerler de bu etiketin sabit değişkenidir. (İstediğiniz adı verebilirsiniz)
enum _:SilahIsimleri {
	USP,
	GLOCK,
	GUZELM4A1,
	RUSKELESI,
	KELLEKESICIAWP,
	CSDURAGIBICAGI,
	ODIN
};

//Ardından bu sabitleri kullanabileceğimiz bir sabit yazı değişkeni oluşturalım.
// İlk değerine deminki oluşturduğumuz etiketi yazıyoruz. Sabit değerler kadar değişken oluşturuyor.
// İkinci değeri boş bırakabiliriz. Yazıların maksimum karakter sayısını belirliyor.
new const szSilahIsimleri[SilahIsimleri][] = {
	"USP",
	"glock",
	"m4a1",
	"ak47",
	"awp",
	"knife",
	"m249"
};

//Şimdi oluşturduğumuz sabitlerden değer çekme vakti.
public SilahIsminiSoyle(pPlayer) {
	//Bana M4A1 'in ismini vermesini istiyorum. Bu yüzden  szSilahIsimleri[M4A1] şeklinde kullanacağım.
	//Sabit yazı değeri[Kullandığımız enum sabiti]
	//Bir yazı değeri vereceği için %s kullanıyoruz.
	client_print_color(0, 0, "%s", szSilahIsimleri[GUZELM4A1]);

	//Peki birçok değer arasında bazılarının isimlerini vereceğim nasıl olacak?
	//Bunu yapmak için döngü oluşturacağız.
	// Birinci değere değer oluşturun ve hangi itemden başlayacağını ayarlayın.
	// İkinci değere ise hangi itemle sona ereceğini ayarlayın
	// Üçüncü değere ise oluşturduğunuz değeri sona kadar ilerletin.
	// <= yaparsanız sonuncu dahil olur < yaparsanız sonuncu dahil olmaz.
	for(new i = GUZELM4A1; i <= ODIN; i++) {
		//Şimdi m4a1 ile m249 arasındaki silahların isimlerini vereceğiz.
		// Sabit yazı değeri[Kullandığımız enum sabiti] kullanıyorduk. Enum sabitini i değerine atadık.
		// Sabit değer yerine i değerini kullanacağız.
		client_print_color(0, 0, "%s", szSilahIsimleri[i]);
	}

	//Eğer sırasıyla değilse, örneğin usp, m4a1 ve odin vermek istiyorsanız ayrı ayrı yazabilirsiniz.
	client_print_color(pPlayer, pPlayer, "%s", szSilahIsimleri[USP]);
	client_print_color(pPlayer, pPlayer, "%s", szSilahIsimleri[GUZELM4A1]);
	client_print_color(pPlayer, pPlayer, "%s", szSilahIsimleri[ODIN]);
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Nasıl Dosya Okutulur veya Dosyaya Yazı Yazdırılır?

Mesaj gönderen Colditz »

Dosya okutulurken veya dosyaya yazı yazdırılırken hâlâ eski komutlar kullanılmakta. bkz . read_file & write_file
Bunların artık çöp olduğunu hatırlayıp yeni komutlara yönelmeliyiz.

Kod: Tümünü seç

#include <amxmodx>

//Öncelikle global bir dosya adı değişkeni oluşturmamız gerekiyor.
new szFileName[128];

//Plugin init bölümünde dosya adını ayarlıyoruz.
public plugin_init() {
	//...

	//Burada addons/amxmodx/configs/ yazdırdık.
	get_localinfo("amxx_configsdir", szFileName, charsmax(szFileName));

	//Burada da devamını yazdırdık.
	add(szFileName, charsmax(szFileName), "/dosyaadi.ini");
}

//Dosya Okuma
public DosyayiSadeceOku() {
	//Öncelikle dosyayı okuyacağımız yeri algılatıp değere aktarıyoruz.
	new iFile = fopen(szFileName, "r");
	// fopen
	// Birinci değer dosya adı
	// İkinci değer fopen komutunun özelliği (file.inc de bulabilirsiniz)

	//Dosyanın açılıp açılmadığını kontrol edeceğiz.
	if(iFile) {
		//İçindeki değerleri bu değere aktarmamız için değişken oluşturuyoruz.
		//MAX_FMT_LENGTH = 128 , bunu artırabilir veya azaltabilirsiniz.
		new szBuffer[MAX_FMT_LENGTH];

		//Dosyanın sonuna kadar okuyacağız
		//feof gerek duyulmuyor. https://forums.alliedmods.net/showpost.php?p=2679189&postcount=6
		while(fgets(iFile, szBuffer, charsmax(szBuffer))) {
			//Boş satırları çıkaracağız. Eğer satır boşsa çıkarıyor.
			if(szBuffer[0] == EOS) {
				continue;
			}

			//Burada çektiğiniz kodlarla istediğini yapabilirsiniz.
			//Array oluşturup çektiğiniz komutları Array'a aktarabileceğiniz bölümdür.
		}

		//Daha sonra dosyayı kapatıyoruz.
		fclose(iFile);
	}
}

//Dosyaya bir şey yazma
public DosyayaYaz() {
	//Öncelikle dosyayı okuyacağımız yeri algılatıp değere aktarıyoruz.
	new iFile = fopen(szFileName, "a+");
	// fopen
	// Birinci değer dosya adı
	// İkinci değer fopen komutunun özelliği (file.inc de bulabilirsiniz)

	//Dosyanın açılıp açılmadığını kontrol edeceğiz.
	if(iFile) {
		// İki çeşit yazma şekli var. [İkinciyi öneririm]

		//Birinci yol, var olan bir değişkeni dosyaya yazmak
		//MAX_FMT_LENGTH = 128 , bunu artırabilir veya azaltabilirsiniz.
		new szYazi[MAX_FMT_LENGTH];
		formatex(szYazi, charsmax(szYazi), "Yazılacak yazı: Dosya adını yazıya ekle %s", szFileName);

		fputs(iFile, szYazi);
		// fputs
		// Birinci değer dosya değişkeni
		// İkinci değer yazılacak yazı

		//İkinci yol
		fprintf(iFile, "Yazılacak yazı: Dosya adını yazıya ekle %s", szFileName);
		// fprintf
		// Birinci değer dosya değişkeni
		// İkinci değer yazılacak yazı
		// Üçüncü değer yazılacak yazının ekleri (%s -> dosya adı gibi)

		//Daha sonra dosyayı kapatıyoruz.
		fclose(iFile);
	}
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Döngüyle Oyuncu Çekme Nasıl Olmalıdır?

Mesaj gönderen Colditz »

Oyuncu çekerken ne kullandığınız pek önemi yoktur. Vereceğim iki örnekte neredeyse aynıdır. Ben
for döngüsünü tercih ediyorum. Size iki şeklini de göstereceğim.

Kod: Tümünü seç


public DonguyleOyundakiOyunculariCek() {
	//Öncelikle döngümüzü ayarlıyoruz.
	//pPlayer = 1 olmalıdır çünkü oyuncu 1 ile 32 arasında değer alır.
	//MaxClients sunucunun desteklediği maksimum oyuncu sayısına eşittir.
	//Bu yüzden pPlayer en fazla bu değere eşit olabilir yani (pPlayer <= 32 olabilir)
	//Son olarak pPlayer değerini son değere kadar artırıyoruz.
	for(new pPlayer = 1; pPlayer <= MaxClients; pPlayer++) {
		//Daha sonra çekeceğimiz değerleri ayarlıyoruz.
		//Minimum olarak oyunda olup olmadığını kontrol etmemiz gerekiyor.
		// Oyundaysa ve yaşıyorsa --> is_user_alive
		// Oyundaysa fakat yaşamıyorsa --> is_user_connected && !is_user_alive
		// Oyundaysa --> is_user_connected
		// Eğer bir takımı kontrol edecekseniz yine minimum oyunda olup olmadığını kontrol etmeniz gerekiyor.
		if(is_user_connected(pPlayer)) {
			//Burada istediğinizi yaptırabilirsiniz.
			//...
		}
	}
}

public GetPlayersileOyunculariCek() {
	//Öncelikle oyuncuları çekeceğimiz değerleri oluşturmalıyız.
	//Burada oyuncuların değeri sıfırdan başladığı için MAX_PLAYERS yani 32 değerini ayarlıyoruz.
	new iPlayers[MAX_PLAYERS], iNum, pPlayer;

	// get_players (https://www.amxmodx.org/api/amxmodx/get_players)
	// İlk seçeneğe belirlediğimiz oyuncuları ayarlayan değeri giriyoruz.
	// İkinci seçeneğe belirlediğimiz oyuncu sayısını ayarlayan değeri giriyoruz.
	// Üçüncü seçeneğe bayrak giriyoruz. Burada takım özel vs. ayarlayabiliyoruz.
	// Dördüncü seçeneğe (takım veya isim ayarı yaptıysak) hangi yazı değerlerini alacağımızı belirliyoruz.
	// Örneğin ("TERRORIST" veya "CT")
	get_players(iPlayers, iNum);

	//Daha sonra döngümüzü ayarlıyoruz.
	//Döngüde önceki döngüye nazaran değeri sıfırdan başlatıyoruz.
	//Sıfırdan başladığı için oyuncu sayısından küçük ayarlıyoruz
	//Küçük yapmamızın nedeni (1. oyuncu 0, 2. oyuncu 1, ... 32. oyuncu 31 olduğundan 32 değeri boş kalıyor)
	for(new i = 0; i < iNum; i++) {
		//Daha sonra döngüdeki oyuncuları değere aktarıyoruz.
		pPlayer = iPlayers[i];

		//Burada istediğinizi yaptırabilirsiniz.
		//Takımını, yaşayıp yaşamadığını vs. get_players komutunda ayarlıyorsunuz.
	}
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Reapide Silaha Nasıl Model Verilir?

Mesaj gönderen Colditz »

Eskilerden kalan şekilde silah model olayı dönüyor. Bu olayı kısa bir şekilde anlatmaya çalıştım.
Bu olayda Reapi kütüphanesini kullanacağız.

Kod: Tümünü seç

#include <amxmodx>
#include <reapi>

//Silahımıza bir değer atıyoruz. Bu şekilde bu değeri kontrol edip silaha model yüklüyoruz.
//Herhangi bir değer atayabilirsiniz.
new const WeaponUid = 1337;

public plugin_init() {
	//Silahı elimize aldığımızda modelini ayarlamak için DefaultDeploy komutunu kullanıyoruz. (post false olmalı)
	RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", .post = false);

	//Silahı yere attığımızda modelini ayarlamak için SetModel komutunu kullanıyoruz. (post false olmalı)
	RegisterHookChain(RG_CWeaponBox_SetModel, "CWeaponBox_SetModel_Pre", .post = false);
}

public SkinliSilahVer(pPlayer) {
	//Eğer sadece modelini değiştirecekseniz bir değere ihtiyaç yok.
	rg_give_custom_item(pPlayer, "weapon_deagle", GT_REPLACE, WeaponUid);
	// Birinci değer oyuncu indeksi
	// İkinci değer silahın ismi
	// Üçüncü değer silahı verdiğinde olacak olay [Aşağıda değerler bulunmakta]
	// Dördüncü değer silaha özgün bir değer

	// [-- Üçüncü değer örnekleri --];
	// GT_APPEND - Sadece itemi verir
	// GT_REPLACE - İtemi verir ve o slottaki bütün silahları siler.
	// GT_DROP_AND_REPLACE - İtemi verir ve o slottaki bütün silahları yere atar (drop)

	//Eğer silaha değer atayacaksanız bir değer oluşturmanız gerek (örneğin tek tek sıkan deagle gibi)
	new iWeapon = rg_give_custom_item(pPlayer, "weapon_deagle", GT_REPLACE, WeaponUid);

	//Her mermi sıktığında reload atma olayını burada ayarlıyoruz. Maksimum mermi sayısını 1 ayarladık.
	//Burada silaha istediğiniz ayarı yapabilirsiniz. Reapi bunun için bayağı gelişmiş bir kütüphane.
	set_member(iWeapon, m_Weapon_iClip, 1);
	rg_set_iteminfo(iWeapon, ItemInfo_iMaxClip, 1);
}

public CBasePlayerWeapon_DefaultDeploy_Pre(const iWeapon, szViewModel[], szWeaponModel[], iAnim, szAnimExt[], skiplocal) {
	//Burada silahımızın özgün değerlerinin eşit olup olmadığını kontrol ediyoruz.
	if(get_entvar(iWeapon, var_impulse) == WeaponUid) {
		//v modelini değiştirir.
		SetHookChainArg(2, ATYPE_STRING, "models/v_deagle.mdl");
		//p modelini değiştirir
		SetHookChainArg(3, ATYPE_STRING, "models/p_deagle.mdl");
	}

	//Eğer birden fazla silahınız varsa silahın özgün değerini switch ile alabilirsiniz.
	new iImpulse = get_entvar(iWeapon, var_impulse);
	switch(iImpulse) {
		case WeaponUid: {
			//
		}
		case ... {
			//diger özgün sayılar vs.
		}
	}
}

public CWeaponBox_SetModel_Pre(const iWeaponBox, const szModelName[]) {
	//Öncelikle silahın hangi silah olduğunu değere atıyoruz.
	new iWeapon = GetWeaponBoxWeapon(iWeaponBox);

	//Değer -1 olarak yani hiçbir silah olarak çıkabiliyor. Bu yüzden NULLENT yani (-1) kontrolü yapıyoruz.
	if(iWeapon == NULLENT) {
		return;
	}

	//Şimdi silahın ne olduğunu ve özgün değerini alabiliriz.
	//Tek bir silah yapıyorsanız direkt özgün değeri kontrol edin.
	if(get_entvar(iWeapon, var_impulse) == WeaponUid) {
		//Bu komut silahın yerdeki modelini ayarlar.
		SetHookChainArg(2, ATYPE_STRING, "models/w_deagle.mdl");
	}

	//Eğer birden fazla silahınız varsa silahın özgün değerini switch ile alabilirsiniz.
	new iImpulse = get_entvar(iWeapon, var_impulse);
	switch(iImpulse) {
		case WeaponUid: {
			//
		}
		case ... {
			//diger özgün sayılar vs.
		}
	}
}

//Yerdeki silahın kontrolünü yapmak için bunu kullanmalısınız.
//Burada değiştirmeniz gereken bir yer yok. Direkt kullanabilirsiniz.
//Direkt kopyalayabilmeniz için burada anlatacağım

//Döngüde maksimum slot sayısı kadar dönüyor. (slotlar sıfırdan başlıyor, 0-1-2-3-4-5)
//Ardından get_member ile var olduğu slottan silahın değerini çekiyor.
//Silahın varlığını kontrol ediyor. Eğer silahın değeri sıfırdan büyükse silahı çekiyor.
//Değilse NULLENT yani -1 olarak çekiyor.
GetWeaponBoxWeapon(const iWeaponBox) {
	for(new i = 0, iWeapon; i < MAX_ITEM_TYPES; i++) {
	
		iWeapon = get_member(iWeaponBox, m_WeaponBox_rgpPlayerItems, i);

		if(!is_nullent(iWeapon)) {
			return iWeapon;
		}
	}
	return NULLENT;
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

Reapide Oyuncu Modelleri Nasıl Ayarlanır?

Mesaj gönderen Colditz »

CT-T-Admin... özel model tarzı bir eklentinin nasıl yapılacağını anlatmaya çalıştım.
Bu olayda Reapi kütüphanesini kullanacağız.

Kod: Tümünü seç

#include <amxmodx>
#include <reapi>

//Burada modelimizin ismini ayarlıyoruz. models/player/isim/isim.mdl şeklinde yükleyeceksiniz.
// Örnekte leet yazdım. --> models/player/leet/leet.mdl
// Örnekte gsg9 yazdım. --> models/player/gsg9/gsg9.mdl
new const g_szTModelIsmi[] = "leet";
new const g_szCTModelIsmi[] = "gsg9";

public plugin_init() {
	//Oyuncunun modelini bu komutla ayarlıyoruz. (post false olmalı)
	RegisterHookChain(RG_CBasePlayer_SetClientUserInfoModel, "CBasePlayer_SetClientUserInfoModel_Pre", .post = false);
}

public plugin_precache() {
	//Modelleri sunucunun tanımasını sağlıyoruz.
	precache_model(fmt("models/player/%s/%s.mdl", g_szTModelIsmi, g_szTModelIsmi));
	precache_model(fmt("models/player/%s/%s.mdl", g_szCTModelIsmi, g_szCTModelIsmi));
}

public CBasePlayer_SetClientUserInfoModel_Pre(const pPlayer, infobuffer[], szNewModel[]) {
	//Burada ayarlamak istediğimize göre devam ettireceğiz.
	//Admine özel yapacağınız zaman burada yetki kontrolü yapacaksınız.
	//Ben CT ve T için yapmak istediğim için böyle devam ettireceğim.
	new TeamName:iTeam = get_member(pPlayer, m_iTeam);

	switch(iTeam) {
		case TEAM_TERRORIST: {
			SetHookChainArg(3, ATYPE_STRING, g_szTModelIsmi);
		}
		case TEAM_CT: {
			SetHookChainArg(3, ATYPE_STRING, g_szCTModelIsmi);
		}
	}
}

BAŞKA BİR ŞEKİLDE YAZMA (BEN BU ŞEKİLDE YAZARDIM)
Bu olayı aynı şekilde enum ile de yapabiliriz ve çok daha güzel görüneceğini düşünüyorum.
Hem enum kullanımını da biraz kavramış olursunuz.
Yukarıdaki komutlar yerine ne yazdığımı anlamanız için eski komutların başına ///** koyacağım.

Kod: Tümünü seç

#include <amxmodx>
#include <reapi>

//Buraya modelin genel ismini yazabilirsiniz.
enum _:szModelIsimleri {
	TERR_MODELI,
	CT_MODELI
};

//Bu modelleri değere atıyoruz.
//Enumda ayarladığımız sırada olmak zorunda!!
new const g_szModelIsimleri[szModelIsimleri][] = {
	"leet",
	"gsg9"
};

///**new const g_szTModelIsmi[] = "leet";
///**new const g_szCTModelIsmi[] = "gsg9";

public plugin_init() {
	//Oyuncunun modelini bu komutla ayarlıyoruz. (post false olmalı)
	RegisterHookChain(RG_CBasePlayer_SetClientUserInfoModel, "CBasePlayer_SetClientUserInfoModel_Pre", .post = false);
}

public plugin_precache() {
	///**precache_model(fmt("models/player/%s/%s.mdl", g_szTModelIsmi, g_szTModelIsmi));
	///**precache_model(fmt("models/player/%s/%s.mdl", g_szCTModelIsmi, g_szCTModelIsmi));

	//Burayı döngü ile ayarlayacağız. Değer sıfırdan başlar ve sayısı model sayısından bir küçük olur. (model sayısı - 1 = değer sayısı)
	//enum ismi model sayısına eşit olur ve değeri sıfırdan başlattığımız için küçüktür yapıyoruz.
	for(new i = 0; i < szModelIsimleri; i++) {
		//Modelleri sunucunun tanımasını sağlıyoruz.
		//Değerin i. değerindeki yazıyı çeker. Örneğin g_szModelIsimleri[0] = "leet"
		precache_model(fmt("models/player/%s/%s.mdl", g_szModelIsimleri[i], g_szModelIsimleri[i]));
	}
}

public CBasePlayer_SetClientUserInfoModel_Pre(const pPlayer, infobuffer[], szNewModel[]) {
	//Burada ayarlamak istediğimize göre devam ettireceğiz.
	//Admine özel yapacağınız zaman burada yetki kontrolü yapacaksınız.
	//Ben CT ve T için yapmak istediğim için böyle devam ettireceğim.
	new TeamName:iTeam = get_member(pPlayer, m_iTeam);

	switch(iTeam) {
		case TEAM_TERRORIST: {
			///**SetHookChainArg(3, ATYPE_STRING, g_szTModelIsmi);

			//Burayı direkt enum da belirlediğimiz isimle çekiyoruz.
			SetHookChainArg(3, ATYPE_STRING, g_szModelIsimleri[TERR_MODELI]);
		}
		case TEAM_CT: {
			///**SetHookChainArg(3, ATYPE_STRING, g_szCTModelIsmi);
			SetHookChainArg(3, ATYPE_STRING, g_szModelIsimleri[CT_MODELI]);
		}
	}
}

Link:
Linklerini gizle
Linki Kopyala
Kullanıcı avatarı

Konu Sahibi
Colditz
Mesajlar: 2574
Kayıt: Çrş Ağu 23, 2017 9:17 pm

(re)HLDS için güncel dosyalar

Mesaj gönderen Colditz »

Derleyicim eski veya reapi kuramadım vs. diyen arkadaşlar için güncel sunucu dosyalarını bir zip içine attım. Bunu hlds sunucunuzun bulunduğu dosyaya atarsanız en güncel modülleri kullanıyor olursunuz.
Bu mesaja eklenen dosyaları görüntülemek için gerekli izinlere sahip değilsiniz.

Link:
Linklerini gizle
Linki Kopyala
Kilitli