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.
#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);
}
}
}
#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));
}
}
#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);
}