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

Dosyadan istediğimiz satırı silme işlemi

Mesaj gönderen Colditz »

Dosyadan istediğimiz satırı silerken write_file kullanmak yerine tek bir stock ile bunu daha pratik hâle getirebiliyoruz. İlk başlarda zor gelse de alışınca çok daha kolay olduğunu anlayacaksınız. write_file kullanmamamızın nedeni artık tercih edilmemesidir. Basitçe anlatmaya çalıştım, umarım anlamışsınızdır.

Kod: Tümünü seç

#include <amxmodx>

//Bir şeyleri kayıt ettiğimiz dosyamız (steamid olarak anlatacağım.)
new const g_szFileName[] = "addons/amxmodx/configs/steamid.ini"

//Rastgele bir public üzerinden anlatacağım.
public steamidsildigimizpublic() {
	//Burada oluşturduğumuz komutu kullanıyoruz.
	//RemoveLine(dosya adı, sileceğimiz bölüm)
	RemoveLine(g_szFileName, "STEAM_0:00000000000000");

	//Bunu fmt ile de yapabilirsiniz örneğin
	//Sunucudaki bütün oyuncuların steamidlerini dosyadan sileceğiz.
	//32 lik döngü oluşturup bu RemoveLine komutu kullanacağız.
	//Bütün oyuncuları çekmeyi anlatmıştım.
	//Authidlerini almak için yeni bir değişken oluşturuyoruz.
	for(new pPlayer = 1, szAuthid[MAX_AUTHID_LENGTH]; pPlayer <= MaxClients; pPlayer++) {
		if(!is_user_connected(pPlayer)) {
			continue;
		}

		//Authidlerini değere çektik
		get_user_authid(pPlayer, szAuthid, charsmax(szAuthid));
		//Dosyadan authidsini sildik.
		RemoveLine(g_szFileName, szAuthid);
	}
}

//Şimdi asıl yere gelelim. Dosyadan yazı silme stocku.
//Stock olarak da kullanabilirsiniz, stocku silip başına bir şey yazmadan da, fark etmez.
stock RemoveLine(const szFileName[], const szOldLine[]) {
	//Değerleri aktarmak için yeni bir dosya oluşturacağız.
	//Bu dosyanın yeri, kayıt ettiğiniz dosya yeriyle aynı olmalı
	//Yani kayıt ettiğiniz dosya addons/amxmodx/configs içindeyse diğeri de orada olmalı.
	new const szTempFile[] = "addons/amxmodx/configs/tempfile.ini";

	//Kayıt ettiğiniz dosyayı okutuyoruz. Sadece okumak için açtığımız için rt kullanıyoruz.
	new iFile = fopen(szFileName, "rt");

	if(iFile) {
		//Şimdi kayıtlı authidleri kaydedeceğimiz geçici dosyayı oluşturuyoruz ve okutuyoruz.
		//Böyle bir dosya olmadığı için kendisi otomatik oluşturacak ve üstüne yazacak, bu yüzden wt

		new iTempFile = fopen(szTempFile, "wt");

		if(iTempFile) {
			//Authidleri çekmek için 128lik yeni bir değişken oluşturuyoruz.
			new szBuffer[MAX_FMT_LENGTH];

			//Şimdi authidlerin olduğu dosyayı açıp, içindekileri bu değere atıyoruz.
			while(fgets(iFile, szBuffer, charsmax(szBuffer))) {
				trim(szBuffer);

				//Boş satırı ve sileceğimiz authidyi burada boş geçiyoruz.
				if(szBuffer[0] == EOS || equali(szBuffer, szOldLine)) {
					continue;
				}

				//Şimdi bu atadığımız değerleri geçici dosyaya aktarıyoruz.
				//Satır atlamak için sonuna ^n koyuyoruz yoksa hepsi tek satırda olur.
				fprintf(iTempFile, "%s^n", szBuffer);
			}

			//Şimdi dosyaları kapatıyoruz.
			fclose(iFile);
			fclose(iTempFile);

			//Eski dosyayı siliyoruz
			delete_file(iFile);
			//Geçici olarak oluşturduğumuz dosyanın ismini eski dosyanın ismiyle değiştiriyoruz.
			//Bu sayede dosya ismimiz aynı kalıyor fakat silmek istediğimiz authidyi silmiş oluyoruz.
			rename_file(szFileName, szTempFile, 1);
		}
	}
}

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

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

Basit Array Oluşturma ve Arraya değer atama

Mesaj gönderen Colditz »

Array konusunu basitçe geçmeye çalıştım. Anlamak için biraz deneyiminiz olması gerekiyor, biraz karışık olay.
Anlatabildiğim kadar anlattım.

Kod: Tümünü seç

#include <amxmodx>

//Öncelikle global bir Array değişkeni oluşturmamız gerekiyor. Değerin önünde Array: olmalı.
new Array:g_aArray;

public plugin_init() {
	register_plugin("Steamidleri Array Kaydetme", "0.0.1", "PurposeLess");

	//Burada global array değerimizi oluşturuyoruz.
	//ArrayCreate(değerlerinin maksimum karakter sayısı)
	g_aArray = ArrayCreate(32);
}

public plugin_end() {
	//Harita değiştiğinde veya sunucu çöktüğünde arrayı siliyoruz.
	//ArrayDestroy(array değeri)
	ArrayDestroy(g_aArray);
}

//Bu publicte steamidleri arraya nasıl kaydedeceğimizi göstereceğim.
//Örnek olarak sunucuda olan bütün herkesin steamidsini aktaracağım.
public SaveArrays() {
	//33lük döngü ile bütün herkesi çekiyoruz.
	for(new pPlayer = 1, szAuthid[MAX_AUTHID_LENGTH]; pPlayer <= MaxClients; pPlayer++) {
		if(!is_user_connected(pPlayer)) {
			continue;
		}

		//Şimdi string yani yazı kaydedeceğimiz için ArrayPushString kullanacağız.
		//ArrayPushString(array değişkeni, kaydeceğimiz yazı)
		get_user_authid(pPlayer, szAuthid, charsmax(szAuthid));
		ArrayPushString(g_aArray, szAuthid);

		//Eğer yazı yerine değer kaydedeceksek ArrayPushCell kullanacağız.
		//Burada oyuncu sayısının useridsini kaydediyoruz.
		//userid = get_user_userid
		ArrayPushCell(g_aArray, i);
	}
}

//Bu publicte arraydakileri değere çekeceğiz.
public ReadArrays() {
	//Arraydaki değerlerin toplamı kadar döngü döndüreceğiz.
	//Böylece sunucudaki oyuncuları çeker gibi Arraydaki değerleri çekeceğiz.
	//Bunun için ArraySize komutunu kullanacağız. Arraydakilerin içeriğin sayısını gösterir.
	new iArraySize = ArraySize(g_aArray);

	//Array değeri 0 dan başlar, bu yüzden i yi sıfırdan başlatıp, toplam sayıdan küçük okutuyoruz.
	for(new i = 0, szString[MAX_AUTHID_LENGTH]; i < iArraySize; i++) {
		//Burada string yani yazıyı algılatacağız. Bunun için bir değişkene ihtiyacımız var.
		//Bu değişkeni authid sayısına eşitledim çünkü sadece authidleri kaydedeceğim.
		//Eğer başka değer çekeceksiniz o değere göre değer girebilirsiniz.
		//ArrayGetString(array değeri, i sayısı, string değeri, charsmax string);
		//Böylece string değeri kaydettiğiniz authid oldu.
		ArrayGetString(g_aArray, i, szString, charsmax(szString));

		//String verme örneği
		client_print_color(0, 0, "Authid : %s", szString);

		//Sayı değerini çekmek için ise ArrayGetCell kullanacağız.
		//Bu değer direkt sayıyı verecektir.
		//ArrayGetCell(array değeri, i sayısı);
		client_print_color(0, 0, "Sayi : %i", ArrayGetCell(g_aArray, i));
	}
}

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

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

Entity Oluşturma

Mesaj gönderen Colditz »

Entity oluştururken ne yapmalı, kolay bir şekilde anlatmaya çalıştım. Tabii ki detay çok fazla, bu yüzden basit tutmak istedim.

Kod: Tümünü seç

#include <amxmodx>
#include <reapi>

//Varlığımızın modeli
new const g_szEntityModel[] = "models/entitymodel.mdl";

//Varlığımızın model indeksi
new g_iEntityModelIndex;

public plugin_init() {
	register_plugin("Entity Olustur", "0.0.1", "PurposeLess");

	EntityOlustur();
}

//Varlığımızın modelini sunucuya tanıtıyoruz.
public plugin_precache() {
	//Tanıtacağımız modeli indekse de tanıtıyoruz.
	g_iEntityModelIndex = precache_model(g_szEntityModel);
}

public EntityOlustur() {
	//Bir değer oluşturuyoruz. Sonra bu değerimizle varlık oluşturuyoruz.
	//Varlığa doğru E (+use) basınca algılatmasını istiyorsanız func_button kullanın (SetTouch)
	//İstemiyorsanız info_target kullanabilirsiniz.
	//Ben e basınca algılatabilecek şekilde anlatacağım.
	new iEntity = rg_create_entity("func_button");

	//Varlığın oluşup oluşmadığını kontrol ediyoruz.
	if(is_nullent(iEntity)) {
		return PLUGIN_HANDLED;
	}

	//Varlığa model vereceğiz. Sadece oluşturduğumuz indeksi tanıtsak yetiyor.
	set_entvar(iEntity, var_modelindex, g_iEntityModelIndex);

	//Varlığımıza can vs verebiliriz. Bunun için reapi kütüphanelerini incelemeniz gerekli.
	set_entvar(iEntity, var_health, 100.0);
	set_entvar(iEntity, var_takedamage, DAMAGE_NO);

	set_entvar(iEntity(iEnt, var_movetype, MOVETYPE_TOSS);
    set_entvar(iEntity(iEnt, var_solid, SOLID_TRIGGER);

	//Varlığımıza E basılınca ne olacağını ayarlamak için SetUse komutunu kullanacağız.
	//Oluşturduğunuz varlığın sınıfı func_button olmalıdır.
	//"EntityEBastim" yazdığım yeri "" yaparsanız e basma olayını bitirirsiniz.
	SetUse(iEntity, "EntityEBastim");

	//Varlığımıza dokunulunca ne olacağını ayarlamak için SetTouch komutunu kullanacağız.
	//"EntityDokundum" yazdığım yeri "" yaparsanız dokunulma olayını bitirirsiniz.
	SetTouch(iEntity, "EntityDokundum");

	//Varlığımızı düşündürerek ilerideki sürelerde görevler verebiliyoruz.
	//Örneğin 5 saniye sonra kaybolması
	//Düşünceyi 5 saniyeye ayarlıyoruz ardından yok ediyoruz.
	//Bunun için var_nextthink kullanacağız.
	//"EntityTask" yazdığım yeri "" yaparsanız düşünceyi bitirirsiniz.
	SetThink(iEntity, "EntityTask");
	set_entvar(iEntity, var_nextthink, 5.0);
}

public EntityEBastim(const iEntity, const activator, const caller, USE_TYPE:useType, Float:value)"
	//E Basılınca olacaklar...
}

public EntityDokundum(const iEntity, const pPlayer) {
	//Dokunulunca olacaklar...
}

public EntityTask(const iEntity) {
	//Ayarladığınız süre sonunda olacaklar.
	//Bu süreyi burada tekrardan artırabilirsiniz.
	//Tekrardan o süre sonunda public dönecektir.
	//SetThink ile döneceği publici de değiştirebilirsiniz.

	//Ben yok olmasını anlattığım için direkt yok ediyorum.
	set_entvar(iEntity, var_flags, FL_KILLME);
}

Link:
Linklerini gizle
Linki Kopyala
Kilitli