SAMP Discord Connector Kullanımı

Yazıya geçmeden önce sizinle benim için gurur verici bir bilgi paylaşmak istiyorum. Şu an okumakta olduğunuz yazı, bu sitede yayımladığım 100. yazı oluyor.

Aslına bakarsanız bundan öncesi de vardı. Şu meşhur tr.gg döneminden bahsediyorum. Orada paylaştığım içerikleri saymadım. Test bölümü bile açmıştım; evet, onu şimdilerde biraz gereksiz buluyorum ama arada konsept dışına çıkmak, biraz eğlenmek gerekiyor. Daha sonra platform öyle kalmadı. 5 sayfa sınırı getirildi. Neyse ki eski içeriklerimizi silmemişler, sağ olsunlar! 😒

Bu sitede de yayından kaldırdığım bir ton yazı vardır. 100. yazımın şerefine sizinle gerçekten faydalı bir makale sunmak istedim. Discord artık olmazsa olmazımız oldu. İster roleplay ister CnR -şunu yazmayı da hiç sevmem- ister freeroam sunucunuz olsun, mutlaka bir Discord'a ihtiyacınız oluyor çünkü siz o sunucunuzla aslında bir topluluk geliştiriyorsunuz.

SA:MP (San Andreas Multiplayer diye bilinir) sunucunuzla Discord sunucunuzu bağlamak için kullanabileceğiniz Discord Connector ile birçok işlem yapabiliyorsunuz. All-in-one tool olduğu için sadece hazır fonksiyonları kullanıyorsunuz.

Tamam, ne işimize yarayacağını biliyoruz. Nasıl kurulacağına ve kullanacağına geçelim…

SAMP Discord Connector Kullanımı

SA:MP Discord Connector Nasıl Kurulur?

  1. Discord Connector'ün Github sayfasından içeriği indiriyorsunuz.
  2. Dosya içeriğini sunucu dosyalarının olduğu klasöre ayıklıyorsunuz.
  3. cfg dosyasına sağ tıklayıp Birlikte Aç'a basıyorsunuz.
  4. Not defteri ya da Notepad++ gibi uygulamalardan birini seçerek dosyayı açıyorsunuz.
  5. Plugins karşısına Windows kullanıyorsanız "discord-connector", Linux kullanıyorsanız discord-connector.so yazıyorsunuz.
  6. Daha sonra boş satıra şunu yazıyorsunuz ve ilgili kısımları kendinize göre düzenliyorsunuz: discord_bot_token YOURDISCORDBOTTOKEN DCC_BOT_TOKEN (Not: Token kimseyle paylaşılmaz!)
  7. Control + S veya Dosya > Kaydet diyerek değişikliği kaydediyorsunuz.

Discord Connector Nasıl Kullanılır?

Kurulumu yaptıktan sonra oyun modunuzu açıp modun en başına "#include discord-connector" yazın. Bunu yaptıktan sonra aşağıda vereceğim nativeleri kullanmaya başlayabilirsiniz.

  • DCC_CreatePrivateChannel
  • DCC_FindGuildById
  • DCC_FindGuildByName
  • DCC_FindRoleById
  • DCC_FindRoleByName
  • DCC_FindUserById
  • DCC_FindUserByName
  • DCC_GetChannelGuild
  • DCC_GetChannelId
  • DCC_GetChannelName
  • DCC_GetChannelParentCategory
  • DCC_GetChannelPosition
  • DCC_GetChannelTopic
  • DCC_GetChannelType
  • DCC_GetGuildChannel
  • DCC_GetGuildChannelCount
  • DCC_GetGuildId
  • DCC_GetGuildMember
  • DCC_GetGuildMemberCount
  • DCC_GetGuildMemberNickname
  • DCC_GetGuildMemberRole
  • DCC_GetGuildMemberRoleCount
  • DCC_GetGuildMemberStatus
  • DCC_GetGuildName
  • DCC_GetGuildOwnerId
  • DCC_GetGuildRole
  • DCC_GetGuildRoleCount
  • DCC_GetRoleColor
  • DCC_GetRoleId
  • DCC_GetRoleName
  • DCC_GetRolePermissions
  • DCC_GetRolePosition
  • DCC_GetUserDiscriminator
  • DCC_GetUserId
  • DCC_GetUserName
  • DCC_HasGuildMemberRole
  • DCC_IsRoleHoist
  • DCC_IsRoleMentionable
  • DCC_IsUserBot
  • DCC_IsUserVerified
  • DCC_SendChannelMessage
  • DCC_SendChannelMessage
  • DCC_SetChannelName

Girişteki Şarkı Bitmiyor, Nasıl Durdurulur?

GTA: San Andreas Multiplayer (GTA: Samp) sunucusunun girişine şarkı eklemiş kişilerden son zamanlarda "Girişteki şarkı bitmiyor, server girişindeki şarkı nasıl durdurulur?" gibi sorular geliyor.

Sunucunuzun girişinde şarkı başlatmak, oyuncuların oyuna başlarken sıkılmasının önüne geçebilir ve ona yeni bir şarkı veya müzik keşfetme şansı verebilir ancak oyuna başladıktan sonra şarkının silinmesini istiyorsanız PlayAudioStreamForPlayer fonksiyonunun haricinde başka bir fonksiyon ve callback daha kullanmanız gerekiyor.

Girişteki Şarkı Bitmiyor Sorununun Çözümü

Girişteki Şarkı Bitmiyor, Nasıl Kapatılır?

  • Oyun modunuzu açın.
  • CTRL + F tuşlarına basın ve arama kısmına "OnPlayerSpawn" yazın.
  • OnPlayerSpawn callbackinin içine "StopAudioStreamForPlayer(playerid);" (tırnak işaretleri olmadan) yazın.

Samp Girişe Nasıl Şarkı Eklenir?

  • Oyun modunuzu açın.
  • CTRL + F tuşlarına basıp arama kısmına "OnPlayerConnect" yazın.
  • OnPlayerConnect callbackinin içine "PlayAudioStreamForPlayer(playerid, "sarkilink.mp3");" (tırnak işaretleri olmadan) yazın. "sarkilink.mp3" kısmına herhangi bir şarkının bağlantısını ekleyebilirsiniz.

Girişte Şarkı Çalmıyor Sorunu Neden Olur?

  • Sonu ".mp3" ile bitmeyen bir şarkı / müzik bağlantısını eklemiş olabilirsiniz.
  • Tırnak işaretlerinin içindeki bağlantı çeşitli nedenlerden dolayı artık çalışmıyor olabilir.
  • Birinci madde ile benzer şekilde YouTube video bağlantısını eklemiş olabilirsiniz. Bu fonksiyon, YouTube video bağlantılarını desteklemiyor. Sonu ".mp3" ile biten bir bağlantı (ya da şarkı ya da müziğin otomatik olarak başladığı bir sesin olduğu sayfa bağlantısı) eklemeniz gerekiyor. Herhangi bir şarkı ya da müziği çalmak için özel bir sunucu kullanarak ".mp3" dosyalar yükleyebilir ya da "kiwi6" benzeri web sitelerini kullanabilirsiniz.

Samp Koordinata Özel Şarkı Açma Nasıl Yapılır?

GTA: San Andreas Multiplayer için açtığınız sunucuda sadece belirli bir yerde olan kişilerin duyabileceği şarkı açmak için aşağıdaki adımları izlemeniz yeterlidir.

1. Adım: OnGameModeInit'e Gidin

CTRL + F tuşlarını kullanarak OnGameModeInit callbackini bulun ve içine aşağıdaki şu kodu yerleştirin:

SetTimer("sarkibul", 1000, true);

2. Adım: Modun Sonuna Gidin

Modun sonuna şu kodları yerleştirin:

forward sarkibul();

public sarkibul()

{

new Float:x,Float:y,Float:z;

for(new i=0; i<GetPlayerPoolSize(); ++i)

{

if(!IsPlayerConnected(i)) continue;

GetPlayerPos(i, x, y, z);

if(GetPVarInt(i, "alanda") == 0 && x == koordinatx && y == koordinaty && z == koordinatz)

{

SetPVarInt(i, "alanda", 1);

PlayAudioStreamForPlayer(i, "sarkilink.mp3");

}

else

{

SetPVarInt(i, "alanda", 0);

}

}

return 1;

}

3. Adım: Modun Başına Gidin

Modun başına şu kodları yerleştirin ve X, Y, Z koordinatlarını (244.2 ile eşleştirilen kısımları) kendinize göre düzenleyin.

#define koordinatx 244.2

#define koordinaty 244.2

#define koordinatz 244.2

Samp Unable to Execute Hatası Nasıl Çözülür?

GTA Samp Unable to Execute hatası alıyorsanız aşağıdaki çözüm yolları size yardımcı olabilir. Bu yollara geçmeden önce hatanın kaynağına inmek gerekiyor. Bu, sizi sorun hakkında daha fazla bilgili yapacaktır.

Grand Theft Auto San Andreas Multiplayer oyununda "Samp Yürütelemiyor" hatasının önce nedenlerini sonra nasıl çözüleceğini aşağıdaki maddeleri takip ederek öğrenebilirsiniz.

Samp Unable to Execute Çözümü

Samp Unable to Execute Hatası Neden Olur?

  • Bilgisayarınızın işletim sistemi yenidir. Oyunculuğa yeni oyunlarla giriş yapmışsanız muhtemelen bunun tam tersi olması gerektiğini düşünüyorsunuzdur ama hayır, Grand Theft Auto San Andreas ve GTA SA:MP 2004'te çıktı ve modern işletim sistemleri ile uyumluluk sağlayamıyor. Bu sorunu yaşıyorsanız işletim sisteminizin Windows 8, 8.1 ve 10 olması muhtemeldir. Windows 7, 2009 yılında çıktığından önceki cümlede sıralanan işletim sistemlerine göre daha eskidir ve size sorun yaşatma olasılığı daha düşüktür.
  • Virüsten koruma yazılımı (veya anti virüs yazılımı) istemcinin çalışmasını engelliyordur.
  • Oyunun dosyalarına ikinci bir el tarafından müdahale edilmiştir.

Samp Unable to Execute Hatası Nasıl Düzeltilir?

Yukarıdaki maddelerde hatanın neden ortaya çıktığına ilişkin birtakım ipuçları yer alıyor. Aşağıdaki maddelerde ise bunların nasıl düzeltileceği gösteriliyor.

  • Samp.exe yönetici olarak çalıştırın.
  • GTA SA klasörüne girin ve SAMP.exe'nin üzerine sağ tıklayın. Önünüze gelen seçeneklerin en sonunda yer alan "Özellikler" seçeneğine tıklayın. Mevcut sekmelerden "Uyumluluk" sekmesini bulun ve üzerine tıklayın. "Uyumluluk modu" başlığının hemen altındaki "Bu programın çalıştırılacağı uyumluluk modu" yazısının başındaki kutucuğu işaretleyin ve eski bir işletim sistemini seçin.
  • Virüsten koruma yazılımını devre dışı bırakın.
  • GTA: San Andreas için geliştirilen oyun modlarından birini indirip kurduysanız en son indirdiğiniz modu silin.
  • Belgelerinize gidin ve GTA San Andreas User Files klasörünü bulun. Bu klasörde yer alan "gta.set" dosyasını silin.
  • Yukarıdaki çözüm yollarından hiçbiri size yardımcı olmazsa ilk olarak Samp istemcisini silin ve yeniden kurun. Bu, sizi çözüm yoluna ulaştırmazsa GTA: San Andreas'ı silip yeniden kurun.
  • Oyunu korsan olarak indirmenin de yürütme hatasına neden olabileceğini unutmamalısınız. Oyunu illegal yollarla paylaşan kişi, oyunun dosyalarına zarar vermiş olabilir ve daha da kötüsü, oyuncuların bilgisayarına sızmak için oyunun dosyalarına virüs yerleştirmiş olabilir.

Dini Kayıt Sistemi Nasıl Yapılır?

GTA: San Andreas Multiplayer (SA:Mp) için Dini kayıt sistemi, sunucunuza giriş yapan oyuncuların bir hesap oluşturmasına ve verilerinin sunucunuzun dosyalarında depolanmasını sağlar. Oyuncuların bilgilerini kaydetmek için kullanılan Dini, MySQL veya Y_INI gibi sistemlere kıyasla daha yavaş çalışır. Örneğin kullanıcının skorunu çekmeniz gerekecek olursa Dini bunu MySQL'e göre daha uzun sürede gerçekleştirir ama bu elbette ki onu kullanılmayacak bir eklenti yapmıyor.

Dini son derece hafif bir eklentidir. Hafif olması, küçük sistemlerin çalışması için onu çok kullanışlı hâle getirir. Yakın zamanın en popüler oyun modlarından biri olan hırsız polisten örnek verelim. Günün en iyi polisi veya günün en çok soygun yapan hırsızı gibi ödül temelli bir sistem kodlamak için kayıt sistemine ihtiyacımız vardır. Kayıt sistemi olarak elbette MySQL kullanabiliriz ama günün sonunda ödül teslim edildikten sonra dosyaları silmek gibi bir imkânımız varken neden ağır bir eklenti olan MySQL'e başvuralım?

MySQL yerine Dini kullanırsak ne olur? Bu sistemde Dini kullanmanın ilk faydası, kayıt dosyalarının oyun modunun dosyalarında yer almasıdır. Bu, size boyut bakımından avantaj sağlar. İkinci faydası, dosyaları günün sonunda otomatik olarak silmemize olanak sağlamasıdır. Dosyalarla işimiz bitip ilgili oyuncuya ödülünü verdikten sonra tüm dosyaları silebilir ve sayacı başa sarabiliriz.

Dini bu açıdan bakılacak olursa küçük sistemler için son derece kullanışlı olabiliyor. Bu yapacaklarımızın tamamını MySQL'le de yapabiliriz ama bize sağladığı avantajlara sırt çevirmek büyük bir haksızlık olur.

Adım Adım Dini Kayıt Sistemi Yapımı

Bu yazının içeriği şu şekildedir:

Dini Kayıt Sistemi Yapma

1. Tanımlamalar

İlk olarak oyun modunuzun başında tanımlamamız gereken değerleri tanıtmamız gerekiyor. Kodların hemen yanındaki yorum kısmında kodların ne anlama geldiğini, neden veya ne amaçla kullanıldığını öğrenebilirsiniz.

#include <dini> // Pawno > Includes yolundaki dini eklentisini çağırıyoruz.

İhtiyacımız olan eklentileri çağırdıktan sonra oyuncuların bilgilerini tanımlayalım. Yukarıdaki kodları eklediğiniz oyun modunun başına şunları da eklemeniz gerekiyor:

enum oyuncudegiskenleri

{

    aLevel,

    para,

    skor,

}

new o_Bilgi[MAX_PLAYERS][oyuncudegiskenleri];

2. Giriş ve Çıkış

Oyuncu bilgilerini kaydettiğimizde sıra OnPlayerConnect ve OnPlayerDisconnect'e geldi. Bu bölümde yapacaklarımız, kayıt sistemimizin hem gövdesini oluşturacak hem de az önce attığımız temelleri sağlamlaştıracak. İlk olarak OnPlayerConnect'ten başlayalım.

new name[24];

GetPlayerName(playerid, name, 24);

if(dini_Exists("/kayit/%s.ini", name)) // Oyuncunun isminde bir dosyanın olup olmadığını kontrol ediyoruz.

{

ShowPlayerDialog(playerid, 111, DIALOG_STYLE_PASSWORD, "{00FF00}Giriş", "{FFFFFF}Hesabınızın olduğunu tespit ettik. Şifrenizi girin ki sizi oyuna ışınlayabilelim.", "Gir", "Çık");

}

else // Oyuncunun isminde bir dosyanın olmaması durumunda önüne kayıt diyaloğunu çıkaracağız.

{

ShowPlayerDialog(playerid, 112, DIALOG_STYLE_PASSWORD, "{FF0000}Kayıt", "{FFFFFF}Hesabınızın olmadığını tespit ettik. Şifrenizi girip hesabınızı oluşturun ki sizi oyuna ışınlayabilelim.", "Ol", "Vazgeç");

}

İkinci adımımız OnPlayerDisconnect'e gitmek olacak. OnPlayerDisconnect'te yapacaklarımız, oyuncunun bilgilerinin kayıt edilmesini sağlayacak.

new name[24];

GetPlayerName(playerid, name, 24);

if(dini_Exists("/kayit/%s.ini", name)) // Oyuncunun isminde bir dosyanın olup olmadığını kontrol ediyoruz.

{

dini_IntSet(str, "skor", GetPlayerScore(playerid)); // Oyuncunun skorunu yazdırdık.

dini_IntSet(str, "alevel", oBilgi[playerid][aLevel]); // Oyuncunun yönetici seviyesini

dini_IntSet(str, "para", GetPlayerMoney(playerid)); // Oyuncunun elindeki parasını yazdırdık.

}

3. Diyalog Oluşturma

Dini kayıt sistemi oluşturma dersinin sonuna gelmiş sayılırız. Bu adımda bitiriyoruz.

new name[24];

new dosyaa[50];

GetPlayerName(playerid, name, 24);

format(dosyaa, sizeof(dosyaa), "kayit/%s.ini", name);

if(dialogid == 112)

{

if(response)

{

dini_Create(dosyaa);

dini_Set(dosyaa, "alevel", 0); // Değeri varsayılan olarak sıfır yapıyoruz.

dini_Set(dosyaa, "skor", 0); // Başlangıç skoru 0 oldu.

dini_Set(dosyaa, "para", 10); // Başlangıç parası 10 dolar oldu.

dini_Set(dosyaa, "sifre", inputtext);

ShowPlayerDialog(playerid, 111, DIALOG_STYLE_PASSWORD, "{00FF00}Giriş", "{FFFFFF}Hesabınızı oluşturdunuz, şifrenizi girin de sizi oyunun ortasına atalım. (:", "Gir", "Çık");

}

else // İkinci seçeneğe tıkladığında önüne yine diyalog çıkaracağız.

{

ShowPlayerDialog(playerid, 112, DIALOG_STYLE_PASSWORD, "{FF0000}Kayıt", "{FFFFFF}Hesabınızın olmadığını tespit ettik. Şifrenizi girip hesabınızı oluşturun ki sizi oyuna ışınlayabilelim.", "Ol", "Vazgeç");

}

}

if(dialogid == 111)

{

if(response)

{

new sifrekontrol[128+6];

format(sifrekontrol, sizeof(sifrekontrol), "%s", dini_Get(dosyaa, "sifre");

if(!strcmp(inputtext, sifrekontrol, true))

{

new paraa, skorr;

paraa = dini_Get(dosyaa, "para"); // Parasını veriyoruz.

skorr = dini_Get(dosyaa, "skor"); // Skorunu veriyoruz.

GivePlayerMoney(playerid, paraa), SetPlayerScore(playerid, skorr); // Parasını ve skorunu veriyoruz.

oBilgi[playerid][aLevel] = dini_Get(dosyaa, "alevel"); // Oyuncunun alevel değişkenini son çıkışındaki değerle eşitliyoruz.

}

else

{

// Kick(playerid); // Kullanıcının yanlış şifre girdiğinde oyundan atılmasını isterseniz başındaki '//' işaretini kaldırın.

ShowPlayerDialog(playerid, 111, DIALOG_STYLE_PASSWORD, "{00FF00}Giriş", "{FFFFFF}Hesabınızın olduğunu tespit ettik. Şifrenizi girin ki sizi oyuna ışınlayabilelim.", "Gir", "Çık");

}

}

}

Bütün bu adımları doğru bir şekilde takip ettiyseniz kayıt sisteminiz oluşturulmuştur. Yeni bir değişken kaydetmek için "level" değişkeninin nasıl eklenip kayıt edildiğini ve kayıt edilen değişkenin oyuncuya nasıl aktarıldığını takip edebilirsiniz.

Küçük Adımlarla Admine Özel Araba Oluşturmak

Küçük Adımlarla Admine Özel Araba Oluşturmak

GTA: San Andreas Multiplayer’da bir sunucunuz var ve admine özel araba oluşturmak istiyorsanız ama bunu nasıl yapacağınıza ilişkin küçücük bir fikriniz bile yok mu? Pekâlâ, küçük adımlarla sadece yöneticilerin binebildiği araçları nasıl oluşturabileceğinizi öğrenmenize yardımcı olmak için hazırladığımız adımları takip etmek sizin için mükemmel bir fikir ve kaçırılmaması gereken bir fırsat olabilir.

Yazının başlığı size rehberin sunucunuza yöneticilerin binebileceği araçlar oluşturmanıza yardımcı olmakla sınırlı kalacağını düşündürebilir fakat rehberin sonunda sadece yöneticilere özel araba oluşturmanın nasıl yapıldığını değil aynı zamanda herhangi bir oyuncuya özel aracı nasıl oluşturabileceğinizi öğreneceksiniz. Kısaca açıklamak gerekirse bu rehber size işin mantığını gösterecektir.

Admine Özel Araba Oluşturmak İçin Neler Yapılmalıdır?

Sunucunuzdaki yöneticilere veya oyunculara özel araba oluşturmak için ilk önce aşağıdaki tanımlamaları yapmanız gerekiyor. Buradaki tanımlamaların arabaya binecek olan kişileri ayarlamakla herhangi bir noktada herhangi bir biçimde bağlantısı bulunmuyor. Bu kısımda yapılması gereken sadece araçları tanıtmaktır.

Admine Özel Araba Oluşturmak: Araç Tanımlamaları

1. Araç Tanımlamaları

İlk olarak maksimum kaç tane araç olacağını belirlememiz gerekiyor. Bunu yapmak için “define” kullanmalısınız. Aşağıdaki kodu alın ve oyun modunuzda yer alan “include” tanımlarının altına ekleyin.

#define YONETICI_ARABA 3

Sunucuda yöneticilere özel kaç tane araba oluşturacağımızı belirledik. Bu tanımlamadan sonra araç oluşturma fonksiyonlarını kullanarak oluşturduğumuz araçların yöneticilerine ait olduğunuzu gösterirken kullanacağımız değişkeni oluşturalım.

new YoneticiArabasi[YONETICI_ARABA];

Yukarıda yer alan kodda köşeli parantezlerin içerisine eklediğimiz sizin de görebileceğiniz üzere sunucudaki maksimum oyuncu sayısıdır. Bu, sunucuda kaç tane özel aracımızın olacağını ve bizim bu tanımlamayı kaç farklı araç üzerinde kullanabileceğimizi gösteriyor. Araçların üzerinde “Yönetici” yazmasını sağlamak için son bir tanım daha yapmamız gerekiyor.

new Text3D:admintext[MAX_VEHICLES];

Yukarıda gerekli tanımlamaları yapmış bulunuyoruz. Özel araçlara ilişkin gerekli tüm tanımlamaları yaptıktan sonra ikinci adıma geçebiliriz.

Admine Özel Araba Oluşturmak: Araç Oluşturma

2. Araç Oluşturma

Tanımlamalardan sonraki adımımız, yöneticilere veya sunucuda herhangi bir oyuncu ismine özel bir araç oluşturmak ve oluşturduğumuz bu araçların üzerine “Yönetici” gibi istenen yazılar eklemektir. San Andreas Multiplayer için geliştirdiğiniz oyun modunda özel bir araç oluşturmak için aşağıdaki kodları OnGameModeInit’e eklemeniz yeterli olacaktır.

YoneticiArabasi[0] = AddStaticVehicleEx(…);

YoneticiArabasi[2] = AddStaticVehicleEx(…);

YoneticiArabasi[1] = AddStaticVehicleEx(…);

AddStaticVehicleEx fonksiyonu, oyuna bir araç eklemek için kullanılan fonksiyondur. Bu fonksiyonun içerisinde yer alan üç nokta yerini sırası ile araç ID, X koordinatı, Y koordinatı, Z koordinatı, yön koordinatı, birinci renk ve ikinci renk biçiminde düzenlemeniz gerekiyor. Araçların koordinatlarını nasıl alacağınızı bilmiyorsanız veya birer birer ayarlamakla uğraşmak istemiyorsanız oyun içerisinde bindiğiniz bir aracın nerede doğmasını istiyorsanız oraya götürebilir ve “/save” komutunu kullanarak GTA San Andreas Multiplayer’ın oyuncu dosyaları klasörüne kaydedilecek “savedpositions.txt” belgesine aracın koordinatları kaydedebilir ve kaydettiğiniz koordinatlara aynı metin belgesinden ulaşabilirsiniz.

Aracın üzerinde “Yönetici” ibaresinin yer alması için aşağıdaki kodları OnGameModeExit’e ekleyin. Bu kodlar aslında oluşturmanın aksine yazıları silecektir ancak sunucu kapatıldığında silindiği için görünümden yana herhangi bir sorun oluşmayacaktır.

Delete3DTextLabel(admintext[YoneticiArabasi[0]]);

Delete3DTextLabel(admintext[YoneticiArabasi[1]]);

Delete3DTextLabel(admintext[YoneticiArabasi[2]]);

Yazıları oluşturmak ve yazıları aracın üzerine eklemek için aşağıda yer alan kodları OnGameModeInit’e yapıştırın.

admintext[YoneticiArabasi[0]] = Create3DTextLabel(“« Yönetici »”, 0x00FF00FF, 0.0, 0.0, 0.0, 50.0, 0, 1);

admintext[YoneticiArabasi[1]] = Create3DTextLabel(“« Yönetici »”, 0x00FF00FF, 0.0, 0.0, 0.0, 50.0, 0, 1);

admintext[YoneticiArabasi[2]] = Create3DTextLabel(“« Yönetici »”, 0x00FF00FF, 0.0, 0.0, 0.0, 50.0, 0, 1);

Attach3DTextLabelToVehicle(admintext[YoneticiArabasi[0]], YoneticiArabasi[0], 0.0, 0.0, 0.0);

Attach3DTextLabelToVehicle(admintext[YoneticiArabasi[1]], YoneticiArabasi[1], 0.0, 0.0, 0.0);

Attach3DTextLabelToVehicle(admintext[YoneticiArabasi[2]], YoneticiArabasi[2], 0.0, 0.0, 0.0);

3. Oyuncuların Araca Binmesini Engellemek

Tanımlamalar yapıldı, araçlar ve araçların üzerindeki yazılar oluşturuldu. Son adım, oyuncuların araca binmesini engellemektir. Bunu yapmak için OnPlayerStateChange’i kullanmamız gerekiyor. OnPlayerStateChange’e gidin ve aşağıdaki kodları yapıştırın.

if(newstate == PLAYER_STATE_DRIVER && IsPlayerAdmin(playerid))

{

for(new i=0; i<sizeof(YoneticiArabasi); ++i)

{

if(GetPlayerVehıcleID(playerid) == YoneticiArabasi[i])

{

new Float:xord, Float:yord, Float:zord;

GetPlayerPos(playerid, xord, yord, zord);

SetPlayerPos(playerid, xord, yord, zord+2);

SendClientMessage(playerid, 0xFF0000FF, “Bu araca yalnızca {00FF00}YÖNETİCİLER {FF0000}binebiliyor.”);

}

}

}

Yukarıda yer verdiğimiz “!IsPlayerAdmin(playerid) kodu, araca yalnızca yöneticilerin binmesini sağlıyor. “/rcon login” komutunu kullanarak yönetici kimliğini elde etmemiş kişilerin araca binmesini engelliyor. Bunu sunucunuzdaki yetkililerin binebileceği hâle getirmek için “!IsPlayerAdmin(playerid)” kısmını yönetici değişkeninize göre değiştirebilirsiniz. Örneğin yönetici değişkeninizin “pAdmin” olduğunu varsayalım. Kodu şu şekilde düzenlememiz gerekiyor:

if(newstate == PLAYER_STATE_DRIVER && pAdmin[playerid] != 0)

Yukarıdaki şartımız, pAdmin değeri sıfır olan yani yönetici olmayan kişilerin araca binmesini engelliyor. Amacınız admine özel araba oluşturmak değil de bunu herhangi bir oyuncunun ismine özel hâle getirmek ise ilgili bölümü şu şekilde düzenleyebilirsiniz:

new name[24];

GetPlayerName(playerid, name, 24);

if(newstate == PLAYER_STATE_DRIVER && !strcmp(name, "SAMP Destek", true))

Nicke özel araç oluşturmanın son adımına geldiniz. Yukarıda yer alan “SAMP Destek” kısmı, araca binebilecek oyuncunun ismidir. Bu kısmı araca binmesini istediğiniz kişinin ismi ile değiştirebilirsiniz.

Süreli VIP Sistemi Yapma

Süreli VIP Sistemi Yapma

Süreli VIP sistemi, oyuncuların açısından bir haksızlıksa sunucu sahiplerinin açısından da minik bir vampirin kan tutkusudur. Oyun modlarına bu tür sistemin eklenmesinin ne kadar doğru olduğu ile ilgili yorum yapmak istemiyorum çünkü sunucu sahiplerine de oyunculara da eşit olarak hak veriyorum.
Size küçük bir örnek vermek istiyorum. Blogumu veya SA:MP Destek ismi altında oluşturduğum ilk internet sitemi ilk kez görmüyorsanız internet sitesine hiçbir zaman ücret vermediğimi biliyorsunuzdur. Blogger'da oluşturduğum bu internet sitesinin ne barındırma hizmetine ne de alan adına ücret veriyorum.

İnternet sitemi oluşturmak için ücretsiz servisleri değil de ücretli servisleri tercih etsem benim giderlerim olacaktı. Web hosting ve domain fiyatları o kadar yüksek değil ama küçük de olsa para çıkacaktı ve internet sitesinde reklam yayımlamadığım, tanıtım yazıları yayımlamadığım ve para kazanmak için diğer yöntemleri kullanmadığım için gelirim olmayacaktı.

Uzun sözün kısası, cebinizden çıkacak paranın yerini dolduramazsanız gelir seviyeniz yeterince iyi değildir. Bazı zamanlar olur, gelir seviyesini iyileştirmek için bu tür yöntemlere başvurmak mecburiyetinde olmak kaçınılmaz olabilir.

Süreli VIP Sistemi Nasıl Yapılır?


GTA: San Andreas Multiplayer'da oluşturduğunuz oyun sunucusuna süreli VIP sistemi eklemek istiyorsanız ilk olarak siz değerli okurlarımıza özel olarak serdiğimiz kırmızı halının üzerinden geçmeli ve sistemin nasıl yapıldığını kavramanıza yardımcı olacak küçük adımlarımızı takip etmelisiniz.

1. Malzemeleri İndirin

Bu sistemi oluşturmak için ihtiyacımız olan zcmd, sscanf ve kayıt sisteminden başkası değildir. Kayıt sistemini hazırlamak için MySQL R41-4 sürümüne ihtiyacımız var, söz konusu MySQL sürümünü indirdikten sonra dosyaları belirtilen bölümlere bırakın.

2. Veri Tabanında "vips" Tablosu Oluşturun

Oyun sunucunuzun veri tabanını açın ve "vips" isimli bir tablo oluşturun. "vips" tablosunun içerisine ise "ID", "visim", "vlevel" ve "vsure" sütunlarını ekleyin.

3. Oyun Modu Açın

Oyun modunuzu açtıktan sonra oyun modunun en başına aşağıda verdiğim kodu yapıştırın.

new pVip[MAX_PLAYERS];

Yukarıdaki değişkeni kullanmasak da olur ama bu değişken olmadığında sürekli olarak veri çekmek zorunda olacağımızdan minik bir değişken oluşturmaktan zarar gelmeyecektir. Oyun modunun sonuna aşağıda verdiğim kodu yapıştırın.

CMD:vipver(playerid,params[])
{
new name[24], name2[24], id, level, gun, query[256], str[256];
if(sscanf(params, "uii", id, level, gun)) return SendClientMessage(playerid, -1, "/vipver (ID) (Gün)");
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "Yetkili değilsin.");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "O oyunda değil.");
if(level < 1 || level > 3) return SendClientMessage(playerid, -1, "Minimum 1, maksimum 3 level.");
pVip[id] = level;
GetPlayerName(id, name, 24);
GetPlayerName(playerid, name, 24);
format(str, sizeof(str), "%s(%d) isimli yetkili, %s(%d) isimli oyuncuya %d level VIP verdi.", name2, playerid, name, id, level);
SendClientMessageToAll(-1, str);
mysql_format(MySQL, query, sizeof(query), "DELETE FROM `vips` WHERE `visim` = '%s'", name);
mysql_query(MySQL, query); // İlk olarak oyuncunun mevcut verilerini (varsa) siliyoruz.
mysql_format(MySQL, query, sizeof(query), "INSERT INTO `vips` (`visim`, `vlevel`, `vsure`) VALUES ('%s', '%d', '%d'')", name,level,gettime() + (gun*86400)); // Oyuncu verilerini ekliyoruz.
mysql_query(MySQL, query);
return 1;
}

Yukarıda vipler tablosuna "visim", "vlevel" ve "vsure" olmak üzere 3 tane sütunlu veri kaydedildi. Üçüncü adıma geçmeden önce "mysql_format(MySQL" kısmındaki "MySQL" tanımını oyun modunun başında yaptığınız MySQL tanımına göre düzenlemeyi unutmayın.

Süreli VIP sistemi oluşturmanın altın kurallarından /vipver komutunu yukarıda hazırladık ama herhangi bir zamanda istediğimiz oyuncunun yetkisini almamız için bize bir komut daha gerekiyor. Yukarıdaki komutun hemen altına aşağıda verdiğim kodları yerleştirin.

CMD:vipal(playerid,params[])
{
new name[24], name2[24], id, query[256], str[256];
if(sscanf(params, "u", id)) return SendClientMessage(playerid, -1, "/vipal (ID)");
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "Yetkili değilsin.");
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "O oyunda değil.");
if(pVip[id] == 0) return SendClientMessage(playerid, -1, "Oyuncu zaten VIP değil.");
pVip[id] = 0;
GetPlayerName(id, name, 24);
GetPlayerName(playerid, name, 24);
format(str, sizeof(str), "%s(%d) isimli yetkili, %s(%d) isimli oyuncunun VIP yetkisini aldı.", name2, playerid, name, id);
SendClientMessageToAll(-1, str);
mysql_format(MySQL, query, sizeof(query), "DELETE FROM `vips` WHERE `visim` = '%s'", name);
mysql_query(MySQL, query);
return 1;
}

4. OnPlayerSpawn'da Kontrol Mekanizması Oluşturun

new query[128], name[24];
GetPlayerName(playerid, name, 24);
mysql_format(MySQL, query, sizeof(query), "SELECT * FROM `vips` WHERE `visim` = '%s'", name);
mysql_query(MySQL, query);
if(cache_num_rows() > 0) // Yukarıdaki sorgunun boş olup olmadığını kontrol eder.
{
new level, gun;
cache_get_value_name_int(0, "vlevel", level);
cache_get_value_name_int(0, "vsure", gun);
if(gettime() > gun)
{
pVip[playerid] = 0; // Oyuncunun yetkileri alındı.
mysql_format(MySQL, query, sizeof(query), "DELETE FROM `vips` WHERE `visim` = '%s'", name);
mysql_query(MySQL, query);
SendClientMessage(playerid,-1,"VIP paketinin süresi dolduğu için yetkilerine otomatik olarak el konuldu.");
}
}

5. Komut Oluşturun

Süreli VIP sistemi oluşturdunuz ama insanların satın alması için bir nedene ihtiyacı var. VIP oyunculara özel olarak aşağıda verdiğim örnekteki gibi nice komut oluşturabilirsiniz.

CMD:vcan(playerid, params[])
{
if(pVip[playerid] == 0) return SendClientMessage(playerid, -1, "VIP değilsin.");
SetPlayerHealth(playerid, 100);
return 1;
}

Tek Kullanımlık Komut Yapımı

Tek kullanımlık komut nasıl yapılır? Bu makaledeki talimatlar, sunucunuza giren oyuncuların herhangi bir komutu oyundan çıkana kadar yalnızca bir kez kullanmasını, ikinci kez denediğinde hata mesajı ile karşılaşmasını sağlar.

Bu makalede şunlar yer alıyor:
  • Oyuncunun bir komutu sadece bir kere kullanmasını sağlamak
  • Bir kullanımlık komutların kullanılabileceği yerler
  • Tek seferlik komut kullanımının faydaları
İlk olarak oyuncunun herhangi bir komutu sadece bir kez kullanmasını sağlamak için neler yapılması gerektiğini inceleyeceğiz.

Tek Kullanımlık Komut Nasıl Yapılır?

Bir komutu birden fazla kez kullanılmasını engellemek için ilk olarak aşağıdaki değişkeni modun başına ekleyin. Bu değişkenin değeri bütün değerler için varsayılan olarak sıfırdır fakat oyuncu girip komutu kullandıkça o oyuncunun kimliğine göre değişkenin değeri de değişecektir.

new m4a1alalim[MAX_PLAYERS];

Değişkeni tanımladıktan sonra ikinci kez kullanılmasını engellemek istediğimiz komuta geçiyoruz. Örneğin "/m4a1" komutunu ele alalım. Bu komut sunucunuza giren oyuncular tarafından yalnızca bir sefer kullanılabilsin, ikinci bir kez kullanılmaya denendiğinde hata versin. Bunu sağlamak için komutun işlevlerinin hemen sonuna oyuncu kimliğini seçmemiz ve seçtiğimiz değeri "1" olarak değiştirmemiz gerekiyor.

CMD:m4a1(playerid, params[])
{
if(m4a1alalim[playerid] == 1) return SendClientMessage(playerid, -1, "Komutu zaten kullanmışsınız."); // Eğer zaten almışsa bir daha alamaz.
GivePlayerWeapon(playerid, 31, 15000);
m4a1alalim[playerid] = 1;
return 1;
}


Tavsiye Yazı: OnPlayerCommandText nasıl kullanılır?

Yukarıdaki komutta m4a1alalim değişkenin değeri 1 olarak değiştirildi. Komutun başında da bir şart bağlandı ve şart karşılandığında hata mesajı verilmesi için dönüş değerinde küçük bir değişiklik yapıldı. Burada oyuncu değişkeni (PVar / Player Variable / Oyuncu Değişkeni) yerine genel değişken kullanıldığından oyuncu çıkar ve onun yerine başka bir oyuncu girerse o oyuncu da komutu kullanmış sayılacaktır.

Peki, bunun olmaması için ne yapmamız gerekiyor? Oyuncu girişinde çağrılan OnPlayerConnect'e gitmek ve değişken değerini sıfırlamak gerekiyor. Aşağıdaki komutu OnPlayerConnect'e eklediğinizde oyuna giren herkesin değeri otomatik olarak sıfırlanacaktır.

m4a1alalim[playerid] = 0;

Burada küçük bir sorunumuz var. Değişken değeri kaydedilmediğinden oyuncu sunucunuza çıkıp yeniden girdiğinde komutu tekrar kullanabiliyor. Bu sorunla karşılaşmamak için değişkeni oyun modunuzun kayıt sistemine göre kaydetmeniz gerekiyor. MySQL, Dini, Y_INI gibi kayıt sistemlerinden hangisini kullandığınıza bağlı olarak kayıt aşamaları farklılık gösterebilir. Pawn'a dair hiçbir şekilde bilgi sahibi değilseniz "skor" veya "para" gibi değerlerin nasıl kaydedildiğini takip ederek değişkeni nasıl kaydedebileceğinizi öğrenebilirsiniz.

Tek Kullanımlık Komut Nerelerde Kullanılır?

Tek seferlikle sınırlanan komutların nerede kullanılacağı tamamen oyun modunun geliştiricisine bağlıdır ancak oyun modundaki bir komut, örneğin kullanan oyuncuya para veren bir komut olabilir, sunucunuzu zor bir duruma sokabilecek kadar tehlikeli ise o komutu yukarıdaki adımları takip ederek düzenlemeniz iyi bir fikir olabilir çünkü oyuncular sürekli para alarak sunucunuzun ekonomisinin altını üstüne getirebilir ve bu da size uzun veya kısa fark etmeksizin genel bir vadede oyuncu kaybettirir.

Bir kez kullanılabilen komutları kullanmak size birçok yönden yardımcı olabilir. Örneğin yılbaşı gibi özel günlerde oyunculara hediye dağıtmak için tek seferlikle sınırlı komutları kullanabilirsiniz.

Pawn Öğreniyorum - Ders 2 (If ve Else)

Pawn Öğreniyorum - Ders 2 (If ve Else)

Merhabalar, yine yeni bir seri ile karşınızdayım. Biliyorum, uzun zamandır bir sessizlik vardı. Eh, kişisel mevzular işte. Bu sessizliği en azından biraz da olsa kırmak istiyorum. Bu dersimizde de if ve else ilişkisini inceleyeceğiz. If ve Else ayrılmaz bir ikilidir. Birbirlerine aşıktır. Derin bir aşk ama bu, bu bir tutku.

İlk olarak amaçlarından bahsedelim. Aslında ikisi de bir şeyden emin oluyorlar, ortak yönleri bu olsa gerek. If demek eğer demek. İngilizce kavramlar işte. 😘 (Abi, naptın sen ya? O kadar da cahil değiliz!)

Else ise Eğer kavramının zıttı oluyor. Yani bir şart bağlıyoruz. Bu sitenin adı SA:MP Destek diyelim. if(siteadi != "SA:MP Destek) kodu ile bu sitenin adı SA:MP Destek değilse dedik. (Kod uydurmadır, mantığı kavrayın sadece.) Onun sonrasında gelen kodlar artık site adı SA:MP Destek değilse olacaklar olacaktır. Else geldiğinde ise eğer SA:MP Destek sitesi değilse olanağından başka olanaklar işin içine gelir. Şöyle bir kod ile anlatalım.

if(siteadi != "SA:MP Destek")
{
print("Site adı sa:mp destek değil, niye değil? Öyle site mi olurmuş!");
}
else
{
print("Site adı sa:mp destek! İşte ben böyle siteye site derim ya.");
}


Tavsiye Yazı: Pawn Öğreniyorum - Ders 1

Mantık temel olarak bu. Bir değişken atıyoruz. (Nasıl yapılacağını bilmiyorsanız tavsiye yazımıza bakabilirsiniz.)

new degisken;

Bu değişkene bir değer veriyoruz.

new degisken=1;

OnGameModeInit ile mod açıldığında bu değişkenin 1 olup olmadığını kontrol ettiriyoruz.

public OnGameModeInit()
{
if(degisken == 1)
{
print("degisken 1");
}
else
{
print("degisken 1 değil.");
}
return 1;
}

Nasıl Include Oluşturulur

Nasıl Include Oluşturulur

Herkese merhaba, bu yazıda SA:Mp oyununda kodlamada yardımcı olan include nasıl oluşturulur ondan bahsedeceğim. Öncelikle yapacağınız işlevin ağırlığına göre zorluğu değişmektedir. Bu yazıda biz mantığını kavrayacağız.

İlk olarak sıfırdan bir not defteri ya da benzeri bir şeyi açıyoruz. Açtıktan sonra içine scripte enjekte edeceğimiz işlevi yazacağız. Örnek olarak renkleri yapacağız.

#define SAMPRenk 0xCCCCCCFF
#define KirmiziRenk 0xFF0000FF
#define SiyahRenk 0x000000FF


Bunları yaptıktan sonra farklı kaydet diyerek "include ismi".inc şeklinde Pawno > Includes yoluna kaydediyoruz. (Tırnakları almayın, sadece include ismini yazın. Örneğin renkler.inc şeklinde olabilir.

Hemen sonra oluşturduğumuz bu includeyı hangi scriptte kullanacaksak o scripti pawno.exe programı ile açıyoruz. Scriptin en başına #include <koyduğunuz isim> kodunu ekliyoruz. (Burada sadece ismi yazın .inc kısmını yazmayın)

Daha sonra bu yaptığımız includenın içerisindeki şeyleri scriptte bir yerde kullanabiliriz. Örneğin SendClientMessage ile bir yazı yazdıralım.

SendClientMessage(playerid, SAMPRenk, "Mesaj");

Görüldüğü üzere scripte bu kodları eklemeden scriptin içerisine include gömerek renkleri kullanmış olduk.

Team Deathmatch Modu Kodlamak

Team Deathmatch Modu Kodlamak


Bu yazıda, team deathmatchın temel kodlama mantığını kavrayacağız. Yapılması gereken temel şeyleri ve ekstra şeyleri bu yazıda öğrenmiş olacaksınız.

İlk önce modun başına takım tanımlarını yapalım.

new takim[MAX_PLAYERS];

#define TAKIM_SWAT 1
#define TAKIM_ARMY 2


Yukarıda TAKIM_SWAT değerine 1, TAKIM_ARMY değerine ise 2 değerlerini atadık.

Şimdi ise OnPlayerConnect'e bir karşılama ekranı ekleyelim.

public OnPlayerConnect(playerid)
{
SendClientMessage(playerid, -1, "{FF0000}Team Deathmatch {00FF00}sunucusuna {FFFFFF}hoş geldin!");
return 1;
}


Şimdi ise takımları ayarlayalım. Bunun için, ilk önce OnGameModeInit publicine ışınlanıyoruz.

public OnGameModeInit()
{
AddPlayerClass(285,0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0); // Swat takımını ayarladık.
AddPlayerClass(287,0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0); // Army takımını ayarladık.
return 1;
}


Daha sonra hangi karakteri seçtiğinde, hangi şeyin olacağına karar vereceğiz. OnPlayerRequestClass publicine, marş marş!

public OnPlayerRequestClass(playerid, classid)
{
switch(classid) // classid değerini seçtik.
{
case 0:
{

takim[playerid] = TAKIM_SWAT;
GameTextForPlayer(playerid, "~b~S.W.A.T~n~~w~Mars Mars!", 3000, 3);
// Swat seçtiğinde olacakları ayarlıyoruz.
}
case 1:
{
takim[playerid] = TAKIM_ARMY;
GameTextForPlayer(playerid, "~g~A.R.M.Y~n~~w~Mars Mars!", 3000, 3);
// Army seçtiğinde olacakları ayarlıyoruz.
}
} // Switch parantezni kapattık.
return 1;
}


Şimdi ise oyuncu spawn olduğunda olacakları ayarlıyoruz. OnPlayerSpawn publicine!

public OnPlayerSpawn(playerid)
{
if(takim[playerid] == TAKIM_SWAT)
{
GivePlayerWeapon(playerid, 24, 500);
GivePlayerWeapon(playerid, 26, 500);
GivePlayerWeapon(playerid, 31, 500);
SetPlayerPos(playerid, Işınlanacağı x, y ve z posları);
SendClientMessage(playerid, -1, "Başarıyla S.W.A.T olarak doğduğunuz!");
// Takım swat ise olacaklar
}else if(takim[playerid] == TAKIM_ARMY)
{
GivePlayerWeapon(playerid, 24, 500);
GivePlayerWeapon(playerid, 27, 500);
GivePlayerWeapon(playerid, 31, 500);
SetPlayerPos(playerid, Işınlanacağı x, y ve z posları);
SendClientMessage(playerid, -1, "Başarıyla A.R.M.Y olarak doğduğunuz!");
// Takım army ise olacaklar
}
return 1;
}


Şimdi ise takıma özel araç yapma zamanı. Modun başına gidip bir değişken tanıtıyoruz.

new swatarac;
new armyarac;

Aracı eklemek için yine, başta gittiğimiz yer olan, OnGameModeInit callbackine gidiyoruz.

swatarac = CreateVehicle(araç ıd, araç pos, 1. renk, 2. renk, respawn süresi, siren olup olmayacağı -0.3.7 özelliği-);
armyarac = CreateVehicle(araç ıd, araç pos, 1. renk, 2. renk, respawn süresi, siren olup olmayacağı -0.3.7 özelliği-);


Şimdi ise OnPlayerEnterVehicle callbackine gidiyoruz.

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
new Float:Pos[3];
GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
if(vehicleid == armyarac && takim[playerid] != TAKIM_ARMY) return SetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
if(vehicleid == swatarac
 && takim[playerid] != TAKIM_SWAT)  return SetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
return 1;
}

İşte Team Deathmatch'ın temeli böyle kodlanmaktadır. Şimdi ise kodlama sırası sende! O güzel modu görmek için sabırsızlanıyoruz. :)

Sunucu İnternet Sekmesinde Görünmüyor

Sunucu İnternet Sekmesinde Görünmüyor

0.3.7 ve üstü bir sürüm GTA: San Andreas Multiplayer (Samp) sunucu sahibiyseniz muhtemelen sunucunuzun (oyuncular tarafından sw veya server olarak da belirtilir) neden hosted tab ve internet sekmelerinin hiçbirinde görünmediğini merak etmişsinizdir. Kendi sunucunuz olmasa bile diğer sunucuların bu sekmelerde neden yer almadığının cevabını araştırmışsınızdır. Ne de olsa bunlarla ilgili bir sorununuz olmasaydı burada olmazdınız, değil mi?

Oyuncuların en büyük yanılgısı, bunun sunucunun türü ile bir bağlantısının olduğunu zannetmesidir. Sunucunun türü roleplay (RP), freeroam ve hırsız polis (cops and robbers veya cnr) türlerinden herhangi biri olabilir. Bu sekmelerde görülen sunucuların genellikle freeroam ya da hırsız polis türünde sunuculardan oluşması, size bunu düşündürebilir ama gerçek öyle değildir. Sunucunun internet sekmesinde yer almamasının sebebi, Kalcor'un (sa-mp modunun geliştiricisi) hosted ile internet sekmelerini birleştirmesidir.

Peki, Samp sunucuları artık internet sekmesinde neden görünmüyor? Doğrulanmamış, sadece varsayıma dayalı olsa da bunun en önemli nedenlerinden biri muhtemelen evden kurma sunucularla flood yapılmasıdır. Bunu görmek için milyarlarca yıl öncesine değil, birkaç sene öncesine gitmek yeterlidir. 2012 ve 2013 yılları, San Andreas Multiplayer için tan anlamıyla bir kâbustu. İnternet sekmesinde kaybolmamak elde değildi. Evden açılan (home) sunucularla bu sekme özellikle şirketler tarafından suistimal edilirdi (bkz. kilitli sunucu açıp reklam yapmak). Bir aralar kendini "yardımsever" olarak tanıtan birisi de evden kurma sunucuları portları değiştirerek (7777, 7776 şeklinde) dağıtırdı. Kısacası oyunun buralara kadar gelmesi kolay olmadı. Bugünleri görmesi mucize bile sayılabilir.

Bugün itibarıyla sunucusunun hem internet hem de hosted sekmesinde bulunulmasını isteyen kişilerin hosted tab satın alması gerekiyor. Hosted tab fiyatı değişiklik gösterebiliyor. Türkiye'de özel olarak hizmet veren birkaç şirket bulunuyor. Bu şirketlerin içerisinde ucuz hosted tab sağlayan birçok şirket yer alıyor ancak şirketlerin ne kadar güvenilir olduğu ile ilgili bir araştırmamız olmadığından sizi doğru veya yanlış yönlendirmek istemiyoruz ve bu konuda seçimi size bırakıyoruz.

Girişe Şarkı Eklemek

Girişe Şarkı Eklemek

Sunucunuzun girişte olacaklarını ayarlamak için geçtiğimiz günlerde OnPlayerConnect callbackini devreye soktuğumuzu anlatmıştık. Şarkı çaldırmak için yine OnPlayerConnect callbackini kullanacağız.

Tavsiye Yazı: OnPlayerConnect Kullanımı ve Örnekleri

Şarkı açmak için PlayAudioStreamForPlayer fonksiyonunu kullanırız. Bu fonksiyonun kullanımı aşağıdaki kod gibidir.

PlayAudioStreamForPlayer(playerid, "Şarkı Link");

Playerid oyuncunun idsi oluyor. Tırnak içerisindeki şarkı link ise çalacak şarkının linki oluyor. Burada dikkat etmeniz gereken nokta şarkının sonunun .mp3 ile bitmesi ve şarkının otomatik başlaması.

Otomatik başlayıp, sonu .mp3 ile biten siteleri bilmiyorsanız size tavsiye edebileceğimiz bir site mevcut. Kiwi6 sitesi ile sonu .mp3 ile biten ve otomatik başlayan şarkıları bulabilirsiniz.

SA-MP Language Nedir?

Language bildiğiniz üzere İngilizce bir kelimedir. Dilimizdeki karşılığı ise dildir. San Andreas Multiplayer oyununda sunucunun hangi dillerle hizmet verdiğini belirtmenizi sağlar. Sunucunun dilini / dillerini belirtmek için kullanılabilecek iki yöntem vardır. Bunları aşağıdan öğrenebilirsiniz.

SA-MP Language Nasıl Değiştirilir?

1. Server.cfg ile Language Değiştirme

Server.cfg dosyasını açın ve language satırı yoksa yeni bir satır açıp language yazın ve bu kelimenin yanına sunucunun dilini ya da dillerini yazın. Örneğin sunucuda İngilizce ve Türkçe dilleri kullanılıyorsa "Türkçe/Turkish/English" yazmanız önerilir.

2. Pawno ile Language Değiştirme

Pawn editörünü açtıktan sonra OnGameModeInit kısmına SendRconCommand("language sunucu dili"); ekleyerek sunucunuzun dilini belirleyebilirsiniz. Burada değiştirilmesi gereken tek yer language kelimesinin yanında yer alan sunucu dilidir. Bunu tıpkı birinci yöntemde olduğu gibi sunucu dilleri ile değiştirmelisiniz.

Pawn Öğreniyorum - Ders 1

Pawn'a Giriş (Temel Anlatımlar)

Pawn Nedir?

Pawn tam anlamıyla bir programlama dili değildir. Yani pawn öğrenince pek programlama dili öğrenmiş olmuyorsunuz. Script geliştirmek amacıyla kullanılır. San Andreas Multiplayer oyunu dışında başka platformlarda kodlama yapabilirsiniz.

Pawn, Small-C dilinden etkilenmesi üzerine yapılmış ve kodlar da C dilini anımsatır. Zaten bunu C dilini biliyorsanız fark edersiniz. Ya da pawn dilini öğrenip C diline geçiş yaptığınızda çok yabancılık çekmezsiniz. Ancak C dili daha geniş kapsamlı olduğu için Pawn dilinden öğrenecek daha çok şeyiniz olur. Pawn'ın syntax yapısı bazı şeyler haricinde C ile aynıdır.

Pawn, San Andreas Multiplayer, Half-Life, AMX Mod X gibi platformlarda kullanılmaktadır.

Pawn ile kodladığınız scriptlerin kaynak kodları ".pwn" uzantılı dosyalarda saklanır. Bu pwn uzantılı dosyalar not defteri, notepad++ ve daha çeşitli kod editörleri ile açılabilmektedir. Ancak Pawn compiler tabanlı bir kodlama dilidir.

Pawn Compiler, kaynak kodlarını P-code veya bytecode dillerine çevirir. Bu diller ise ".amx" uzantılı dosyalarda saklanır. Bu dosyaları not defteri ile açamazsınız. Ancak bir program ile ".amx" dosyalarını ".pwn" formatına çevirme ihtimaliniz de vardır. Fakat her ne kadar çevirse de bozuk olacaktır ve kodları compile edemeyeceksinizdir. Zaten moda şu linkteki küçük bir kodu eklediğinizde bu tamamen engellenmiş olacaktır.

Değişkenler

Yemeğin tuzsuzu, kodlamanın değişkensizi olmaz derler. Bu da öyle bir şey işte. Pawn'da da aynı şekilde, değişkenler ön planda olmalıdır.

Pawn'da bir değişken tanımlamak için "new" (yeni) kelimesini kullanırız. Dört çeşit değişken yapısı vardır. Bunlar şunlardır;


  • Integer
  • String
  • Boolean
  • Float

Bunlar, hangi yapıda bulunmasını istediğiniz türlerdir. Örneğin değişkene sayısal bir değer vereceksek integer değerini kullanırız.

Integer:

Integer sayısal değerleri taşır. Belirlediğiniz değişkene sayısal bir değişken atarken bu türü kullanırız.

Örnek olarak:

new sayi=3;

Yukarıdaki örnekte sayı değişkenine 3 sayısını atadık.

String:

String metinsel karakter değerleri taşır. Belirlediğiniz değişkene metinsel karakterleri atarken bu türü kullanmaktayız.

Örnek olarak:

new yazi[17] = "Selam sana insan";

Şimdi yukarıda tırnak içerisine mesajımızı, parantez içerisine ise karakter sayısını girdik. Fakat 1 değer fazla koyduk, peki ya neden? String değişkenleri tanımlarken +1 değer fazladan vermek zorundayız. Karakter sayısından fazla yazmanız performans açısından modunuzu etkileyecek ve zaman zaman lag gibi sorunlar yaratabilmektedir.

Peki el ile girmek zorunda mıyım? Hayır, bu işi Pawn'a da bırakabiliriz.

new yazi[] = "Selam sana insan";

Yukarıda otomatik olarak 17 karakter tanımlandı. İşte bu kadar, basitmiş değil mi? :)

Boolean:

Boolean türü, true veya false değerlerini alırlar.

Örnek olarak:

new aktiflikdurumu = true;

Böylece değeri true oldu. Fazla anlatılacak bir tarafı yok. Tek tarifi, true ya da false alması.

Float:

Bu türde de ondalık sayı değerlerini kullanırız.

Örnek olarak:

new Float:Ondaliksayi = 49.1;

Bu float değerleri genellikle koordinatlarda sıklıkla kullanılır.

3 Adımda Bedava SA:MP Host Almak

3 Adımda Bedava SA:MP Host Almak

Güzel bir projeniz var fakat hayata geçirmek maddi sıkıntılar mı çekiyorsunuz? Ya da test amacıyla bir hosta mı ihtiyacınız var? Hiç sorun değil. Bu yazıda size 3 adımda nasıl San Andreas Multiplayer'da bedava host alabileceğinizi anlatacağım.

Adım 1: Siteye giriyoruz.

Siteye giriş yapmak için buraya tıklayınız. Siteye girdikten sonra karşımıza "Welcome to Ultra-Host!" şeklinde bir yazı çıkıyor. Yani, Ultra-Host'a hoş geldiniz anlamında. Hemen altında mevcut stok sayısını gösteren "Request Server" butonunun hemen yanında stok sayısına bakıyoruz. Eğer 0 yazıyorsa ve arka plan rengi kırmızıysa boş stok yok demektir. Yani, geçici süreliğine host alamazsınız. Fakat arka plan rengi yeşil ve 0'ın üzerindeyse o kadar sayıda host boş demektir. Biz bu butona tıklayarak host alacağız. Fakat bundan önce üyelik açmanız gerekiyor. Kayıt olmak içinse şu sayfaya gidebilirsiniz.

Adım 2: Request Server butonuna tıklıyoruz.

Butona tıkladıktan sonra karşımıza çıkan sayfada size şu sayfada işaretlenmesi gereken kuralları söylüyor. Bu bir nevi botları da uzak tutmak amacıyla yapılmış denilebilir. Mesela şıklarda "Sunucuyu aktif tutmayacağım" gibi seçenekler de var. Bunlara düşmeyerek, "sunucuyu aktif tutacağım" seçeneğini işaretliyoruz. Biraz can sıkıcı olabilir. Sizden istenilen kuralları işaretleyin sadece. Daha sonra altta mavi buton halinde bulunan "Request Server" butonuna tıklıyoruz.

Adım 3: Menüde "Server Panel" butonuna basıyoruz.

Açılan sayfada mevcut hostunuz görünmektedir. "Manage" butonuna tıklayarak paneli açıp, sunucuyu kontrol edebilirsiniz.

Dikkat Edilmesi Gerekenler


  1. Sunucuyu aktif tuttuğunuz sürece sunucunuz aktif kalacaktır. Kapatma gibi bir durum yok yani. Aktif tutmanız için her gün panele girip "Manage" butonuna basmalısınız.
  2. Sunucunun adında mutlaka Ultra-H.com reklamı bulunmalıdır.
  3. Mutlaka ultra-h filterscripti çalışmalıdır.
  4. Panelden "Server Usage" seçeneğine girerek CPU veya RAM'in %100'ü geçmediğinden emin olmak. Yani, modunuzun makineyi zorlamadığını bilmek diyebiliriz.
  5. Birden fazla host istememeniz. (Her üyelik için maksimum 1 tane host alma şartı bulunmakta.)
  6. Roleplay ve benzeri modlar çalıştırmamalısınız.
  7. Sunucu portuna veya herhangi bir şeyine dokunmamalısınız.
Yukarıda belirtilen kurallardan birisini çiğnerseniz sunucunuz kapatılabilir. Ucuz etin yahnisi yenmez derler. Eğer bedava host arıyorsanız size tavsiye ettiğim site son zamanların en popüleri olmasının yanında en kalitesi diyebilirim.

Aldığınız hostun yanında koruma da sağlanmaktadır. Eğer aktif stok yoksa gün içerisinde belirli sürelerde siteye uğrayın. Elbet bir host boşa düşecektir, ümidinizi yitirmeyin.

OnPlayerCommandText Kullanımı ve Örnekleri

OnPlayerCommandText Kullanımı ve Örnekleri

OnPlayerCommandText genellikle komut yapımlarında kullanılır. En basitinden /can veya /zirh komutları bu callback ile yapılır. Bir komut yapmak için strcmp fonksiyonunu ve if döngüsünü kullanacağız.

OnPlayerCommandText Kullanımı:

OnPlayerCommandText callbackine hiçbir şey eklenmeden önceki hali aşağıdaki gibidir.

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}


Bunun içerisini oyuncu komut kullandığınızda olacaklar ile doldururuz. Örnek olarak bir /can komutu yapalım. Bunun için if döngüsü ve strcmp fonksiyonunu kullanacağız.

public OnPlayerCommandText(playerid, cmdtext[])
{

if(strcmp("/can", cmdtext, true))
{
SetPlayerHealth(playerid, 100);
SendClientMessage(playerid, -1, "Bedava can aldınız.");
return 1;
}
return 0;
}

Yukarıda oyuncu /can yazdığında oyuncuya bedava can verip yanında da bedava can aldığına dair bilgilendirme mesajı gönderdik.

OnPlayerCommandText Örnekleri:

Aşağıdaki örnekte oyuncu /cz yazdığında hem can hem de zırh alır.

public OnPlayerCommandText(playerid, cmdtext[])
{

if(strcmp("/cz", cmdtext, true))
{
SetPlayerHealth(playerid, 100);
SetPlayerArmour(playerid, 100);
SendClientMessage(playerid, -1, "Bedava can ve zırhaldınız.");
return 1;
}
return 0;
}

Aşağıdaki örnekte oyuncu /quit2 yazdığında oyundan atılır.

public OnPlayerCommandText(playerid, cmdtext[])
{

if(strcmp("/quit2", cmdtext, true))
{
Kick(playerid);
return 1;
}
return 0;
}

Aşağıdaki örnekte oyuncu /skorum yazdığında karşısına skoru çıkar.

public OnPlayerCommandText(playerid, cmdtext[])
{

if(strcmp("/skorum", cmdtext, true))
{
new skors[80];
format(skors, sizeof(skors), "Skorunuz: %d", GetPlayerScore(playerid));
SendClientMessage(playerid, -1, skors);
return 1;
}
return 0;
}

Interior Giriş Çıkışlarını Kapatmak

Interior Giriş Çıkışlarını Kapatmak

Gta San Andreas Multiplayer oyununda, tekli oyuncu modunda olduğu gibi bazı dükkan gibi örneklerin kapılarının önünde sarı bir halde interior giriş çıkışları bulunmaktadır. Bu bazı konseptler için sıkıntı yaratabilmektedir. Fakat bunu takmanıza hiç gerek yok, çünkü bunları kaldırmak tamamen sizin elinizde.

Ekleyeceğimiz küçük bir kod ile giriş çıkışları kapatmış olacağız. Peki, bu kodu nereye koyacağız? Bu giriş çıkışları kapatmak için OnGameModeInit'e aşağıdaki kodu koyacağız. Böylece her mod açıldığında kod aktif olmuş olacak ve giriş çıkışlar kapanmış olacak.

DisableInteriorEnterExits();

Peki hocam, ben bunu filterscript olarak çalıştıramaz mıyım? İlla OnGameModeInit mi olmak zorunda ki? Hayır, çalıştırmak tamamen senin elinde. Filterscriptlerde biliyorsun ki mod olmadığı için OnGameModeInit yerine OnFilterScriptInit kullanılmakta. Yani filterscript açıldıktan sonra olacakları konu alıyor. Yapman gereken OnGameModeInit yerine OnFilterScriptInit callbackine koymak olacak. Fakat böyle küçük bir kod için bir filterscript çalıştırmak da pek bir mantıksız görünüyor. Seçim senin. İyi günler ahbap!

OnPlayerEnterRaceCheckpoint Kullanımı ve Örnekleri

OnPlayerEnterRaceCheckpoint Kullanımı ve Örnekleri

OnPlayerEnterRaceCheckpoint oyuncu yarış checkpointe girdiğinde olmasını istediklerimizi ayarladığımız bir callbacktir. Oyuncunun oluşturduğumuz yarış checkpointine girdiğinde olmasını  istediğimiz şeyleri bu callbackten ayarlarız. Örnek olarak oyuncu yarış checkpointine girdiğinde oyuncuya 10.000$ ve 20 skor verebiliriz.

OnPlayerEnterRaceCheckpoint Kullanımı:

OnPlayerEnterRaceCheckpoint hiçbir şey eklenmeden aşağıdaki gibidir:

public OnPlayerEnterRaceCheckpoint(playerid)
{
return 1;
}


Bunun içerisini oyuncunun yarış checkpointine girdiğinde olmasını istediklerimiz ile doldururuz. Ondan önce bir yarış checkpointi oluşturmamız gerekiyor.

Bunun için OnPlayerSpawn callbackine gidiyoruz ve aşağıdaki kod ile (SetPlayerRaceCheckpoint fonksiyonu ile) bir callback oluşturuyoruz.

SetPlayerRaceCheckpoint(playerid, Checkpoint Tipi, X, Y, Z, Yön X, Yön Y, Yön Z, Boyut);

Burada değiştirmemiz gereken kısım kırmızı ile işaretlediğim kısımlardır. Bunlar şunlardır:

Checkpoint Tipi: 5 adet checkpoint tipi vardır. Bunlar;


  • 0: Normal
  • 1: Bitiş checkpointi
  • 2: Hiçbir şey (Üzerinde bir şey olmayıp, sadece checkpoint noktası.)
  • 3: Hava yarışları için checkpoint.
  • 4: Hava yarışları için bitiş checkpointi.

X,Y,Z: Checkpointin konumunu buradan ayarlıyoruz.

Yön X, Yön Y, Yön Z: Checkpointin yönünü buradan ayarlıyoruz. İsterseniz 0.0, 0.0, 0.0 değerlerini vererek düz bir checkpoint elde edebilirsiniz.

Boyut: Bu kısımda checkpointin boyutunu ayarladığımız kısım.

Checkpointi oluşturduktan sonra OnPlayerEnterRaceCheckpoint callbackine gidelim ve bu oluşturduğumuz checkpointe girdiğinde olacakları ayarlayalım.

public OnPlayerEnterRaceCheckpoint(playerid)
{
GivePlayerMoney(playerid, 10000);

SetPlayerScore(playerid, GetPlayerScore(playerid)+20);
return 1;
}


Yukarıdaki örnekte, oyuncu checkpointe girdiğinde 10.000$ ve 20 skor verdik.

OnPlayerEnterRaceCheckpoint Örnekleri:

public OnPlayerEnterRaceCheckpoint(playerid)
{
if(GetPlayerHealth(playerid) == 50) return Kick(playerid);

return 1;
}


Yukarıdaki örnekte, oyuncu yarış checkpointine girdiğinde canı 50 ise kickliyoruz.

public OnPlayerEnterRaceCheckpoint(playerid)
{
SendClientMessage(playerid, -1, "Vaov, tamamlamaya çok yakın gibisin... (0/15)");
return 1;
}


Yukarıdaki örnekte, oyuncuya bir mesaj yazdık.

OnPlayerLeaveCheckpoint Kullanımı ve Örnekleri

OnPlayerLeaveCheckpoint Kullanımı ve Örnekleri

OnPlayerLeaveCheckpoint, OnPlayerEnterCheckpoint'in aksine çalışmaktadır. (Eğer OnPlayerEnterCheckpoint'in çalışma mantığını ve kullanımı bilmiyorsanız şuradan yazımıza ulaşabilirsiniz.

OnPlayerEnterCheckpoint'i hatırlamak gerekirse: OnPlayerEnterCheckpoint oyuncu oluşturmuş olduğumuz checkpointin içerisine girdiğimizde olacakları ele alıyordu.

OnPlayerLeaveCheckpoint ise oyuncu oluşturmuş olduğumuz checkpointten ayrıldığında olacakları ele alıyor.

OnPlayerLeaveCheckpoint Kullanımı:

Bu callback'e hiçbir şey eklenmeden önceki hali aşağıdaki gibidir:

public OnPlayerLeaveCheckpoint(playerid)
{
return 1;
}


Bunun içerisine oyuncu checkpointten ayrıldığında olacakları yazarız.

public OnPlayerLeaveCheckpoint(playerid)
{
print("Yine bir oyuncu checkpointten ayrıldı.");
return 1;
}


OnPlayerLeaveCheckpoint Örnekleri:

public OnPlayerLeaveCheckpoint(playerid)
{
if(GetPlayerMoney(playerid) > 0)
{
SendClientMessage(playerid, 0x00FF00FF, "Paran olduğu için sana 1 skor hediye ediyorum.");
SetPlayerScore(playerid, GetPlayerScore(playerid)+1);
}
return 1;
}


Yukarıdaki örnekte oyuncunun parası 0'dan büyükse, yani parası varsa oyuncuya 1 skor verdik.

public OnPlayerLeaveCheckpoint(playerid)
{
SpawnPlayer(playerid);
return 1;
}


Yukarıdaki örnekte oyuncu checkpointten ayrıldığında oyuncuyu spawn ettik.

public OnPlayerLeaveCheckpoint(playerid)
{
Kick(playerid);
return 1;
}


Yukarıdaki örnekte oyuncu checkpointten ayrıldığında oyuncuyu sunucudan tekmeledik. Örnekler saçma olabilir. Önemli olan mantığını kavramanız, gerisini takmayın.

OnPlayerEnterCheckpoint Kullanımı ve Örnekleri

OnPlayerEnterCheckpoint Kullanımı ve Örnekleri

OnPlayerEnterCheckpoint oyuncu checkpointe girdiğinde olacakları ayarlamamıza yarayan bir callback oluyor. Oyuncunun yarattığımız checkpointe girdiğinde olmasını istediklerimizi buradan ayarlıyoruz. Örneğin oyuncu yarattığımız checkpointe girdiğinde 1000$ ve 10 skor verebiliriz.

OnPlayerEnterCheckpoint Kullanımı:

OnPlayerEnterCheckpoint hiçbir şey eklenmeden aşağıdaki gibidir:

public OnPlayerEnterCheckpoint(playerid)
{
return 1;
}


Bunun içerisini oyuncu checkpointe girince olmasını istediklerimiz ile doldurabiliriz. Fakat ilk önce bir checkpoint oluşturalım. Örneğin oyuncu spawn olduğunda bir checkpoint oluşturalım.

Bunun için OnPlayerSpawn callbackine gidiyoruz ve aşağıdaki kod ile (SetPlayerCheckpoint fonksiyonu ile) bir callback oluşturuyoruz.

SetPlayerCheckpoint(playerid, X, Y, Z, Genişlik);

Checkpointimizi oluşturduk. Oyuncunun bu checkpointe girince olmasını istediğimizi de OnPlayerEnterCheckpoint callbacki ile yapıyoruz.

public OnPlayerEnterCheckpoint(playerid)
{
GivePlayerMoney(playerid, 1000);
SetPlayerScore(playerid, GetPlayerScore(playerid)+10);
SendClientMessage(playerid, -1, "Helal ahbap, 1000$ ve 10 skoru kaptın!");
return 1;
}


Görüldüğü üzere yukarıda checkpointe girdiğinde 1000$ ve 10 skor verip bir mesaj yazdırdık.

OnPlayerEnterCheckpoint Örnekleri:

public OnPlayerEnterCheckpoint(playerid)
{
if(GetPlayerMoney(playerid) == 1000)
{
GivePlayerMoney(playerid, -1000);
}
return 1;
}


Yukarıdaki örnekte checkpointe girildiğinde oyuncunun parası 1000$ ise bütün parasını alıyoruz.

public OnPlayerEnterCheckpoint(playerid)
{
GivePlayerWeapon(playerid, 24, 500);
return 1;
}


Yukarıdaki örnekte oyuncuya 500 mermili Desert Eagle(24) silahını verdik.