Cevap: İlk Plugin ve Hatalar
PHP- Kodu:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <cstrike>
#include <fun>
#include <amxmisc>
#define PLUGIN "BuyHP"
#define VERSION "1.0"
#define AUTHOR "Pikachu"
new gPara;
public plugin_init() {
register_plugin("BuyHP","1.0","Pikachu")
gPara = register_cvar("buyhp_ucret", "5000")
register_clcmd("say /buyhp","Buy_HP")
}
public Buy_HP(id) {
if(!is_user_alive(id)) return PLUGIN_HANDLED;
new hp = get_pcvar_num(gPara)
if(cs_get_user_money(id) < hp){
client_print(id,print_center,"Yeterli Paraniz Yok !")
}
else{
client_print(id,print_center,"+100 HP SATIN ALDINIZ")
set_user_health(id, get_user_health(id) + 100)
cs_set_user_money(id,cs_get_user_money(id) - hp)
}
return PLUGIN_HANDLED
}
Bende pek anlamam , fakat bi uğraştım dene bakalım oldu mu.
Cevap: İlk Plugin ve Hatalar
Öncelikle indentation hatalarını gidermelisin. Bunlar yanlış yerde TAB veya süslü parantez kullanımından kaynaklanır. Bu düzeltilmiş hali, karşılaştırarak nerelerde hata yaptığını görebilirsin.
PHP- Kodu:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "BuyHP"
#define VERSION "1.0"
#define AUTHOR "Pikachu"
new gPara;
public plugin_init() {
register_plugin("BuyHP","1.0","Pikachu")
gPara = register_cvar("buyhp_ucret","5000")
register_clcmd("say /buyhp","Buy_HP")
}
public Buy_HP(id) {
if(cs_get_user_money(id) < get_pcvar_num(gUcret)) {
client_print(id,print_chat,"Yeterli Paran Yok!",get_pcvar_num(gPara))
return PLUGIN_HANDLED
}
cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(gPara))
set_user_health(id,200)
return PLUGIN_HANDLED
}
İkinci olarak "cs_get_user_money" fonksiyonu "cstrike" modülüne ait bir fonksiyondur. Bu yüzden eklentide öncelikle "cstrike" içerir şeklinde belirtmelisin ki compiler o dosyayı da okusun.
#include <cstrike>
PHP- Kodu:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#define PLUGIN "BuyHP"
#define VERSION "1.0"
#define AUTHOR "Pikachu"
new gPara;
public plugin_init() {
register_plugin("BuyHP","1.0","Pikachu")
gPara = register_cvar("buyhp_ucret","5000")
register_clcmd("say /buyhp","Buy_HP")
}
public Buy_HP(id) {
if(cs_get_user_money(id) < get_pcvar_num(gUcret)) {
client_print(id,print_chat,"Yeterli Paran Yok!",get_pcvar_num(gPara))
return PLUGIN_HANDLED
}
cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(gPara))
set_user_health(id,200)
return PLUGIN_HANDLED
}
Şuanki hatalar:
Error: Undefined symbol "gUcret" on line 24
Error: Undefined symbol "set_user_health" on line 31
İlkinde diyor ki: 24. satırdaki gUcret tanınmıyor. Hemen bakalım nasıl tanımıyormuş ?
Pluginin başında oluşturduğun değişken gPara
new gPara
iken sen karıştırıp gUcret yazmışsın :)
İkincisinde diyor ki: set_user_health tanınmıyor.
Çünkü set_user_health fonksiyonu "fun" kütüphanesinin bir fonksiyonudur. Yani yine cstrike'ı belirtirken yaptığın gibi fun'u da belitrmelisin
#include <fun>
PHP- Kodu:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#define PLUGIN "BuyHP"
#define VERSION "1.0"
#define AUTHOR "Pikachu"
new gPara;
public plugin_init() {
register_plugin("BuyHP","1.0","Pikachu")
gPara = register_cvar("buyhp_ucret","5000")
register_clcmd("say /buyhp","Buy_HP")
}
public Buy_HP(id) {
if(cs_get_user_money(id) < get_pcvar_num(gPara)) {
client_print(id,print_chat,"Yeterli Paran Yok!",get_pcvar_num(gPara))
return PLUGIN_HANDLED
}
cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(gPara))
set_user_health(id,200)
return PLUGIN_HANDLED
}
Ve sonuç:
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2006 ITB CompuPhase, AMX Mod X Team
Header size: 368 bytes
Code size: 612 bytes
Data size: 296 bytes
Stack/heap size: 16384 bytes; estimated max. usage=779 cells (3116 bytes)
Total requirements: 17660 bytes
Done.
Bunlar dışında bazı yerlerde mantıksal hata var. Yani compiler'in göremediği ama amaçlanan olayı sağlamayan yerler var.
Satır 26:
PHP- Kodu:
client_print(id,print_chat,"Yeterli Paran Yok!",get_pcvar_num(gPara))
Virgülden sonra ücretin saklandığı cvar ayarından bilgi çıkarmak istemişsin. Bunu kullanmanın bir amacı olabilir, o da kişiye parasının yetmediğinin yanında, ne kadar parası olması gerektiğini belirtmek. Bunun için de gerekli belirtmeyi yapmamışsın.
Doğrusu:
PHP- Kodu:
client_print(id,print_chat,"Yeterli Paran Yok! Gereken Para = %d",get_pcvar_num(gPara))
----
Satır 32:
PHP- Kodu:
set_user_health(id,200)
Sanırım burada kişiye 200 hp verilmesini amaçlıyorsun. Çok emin değilim ama buyhp yani hp satın alma olarak düşünülmüş bir eklentide kişiye para karşılığı hp eklenir. Senin yaptığın, kişinin hp'sini 200'e ayarlamak. Dolayısıyla kişinin hp si örneğin 300 ise, hp satın almak istediğinde hp'si 200 e düşecektir. Bu da iyi bir durum olmaz.
200 HP eklemek için yapılması gereken:
PHP- Kodu:
set_user_health(id, get_user_health(id) + 200)
Cevap: İlk Plugin ve Hatalar
Öncelikle ilgilendiğin için teşekkür ederim verdiğin plugin sorunsuz çalışmaktadır. Şimdi bu işlere yeni başladığım ve öğrenmek için bir kaç tane sorum olucak.
1.Bu kodları ezberden mi yazıyorsunuz? yoksa bakabileceğimiz bir yer var mı?
2.Hangi kodun hangi modüle ait olduğunu ezbere mi biliyorsunuz? (include lardan bahsediyorum modül doğru kelime mi tam emin değilim :) )
3.Alttaki kodda - hp yerine buyhp_ucret gelmesi gerekmiyor muydu, daha mantıklı gibi gelmişti?
PHP- Kodu:
cs_set_user_money(id,cs_get_user_money(id) - hp)
4.Else ne işe yarıyor? şimdiye kadar bi tek if in mantığını çözdüm :)
5.Son olarak alttaki eklediğiniz kod neyi karşılıyor?
PHP- Kodu:
new hp = get_pcvar_num(gPara)
34 satırlık pluginden amma soru çıktı diye düşünebilirsiniz bende yazarken 5 tane olacağını düşünmemiştim :D
EDIT: akcaliberkk detaylı anlatım için çok teşekkür ederim. Basit hatalar yapa yapa düzelicek umarım :) Bu arada bende +200 yapmak istiyordum fakat nasıl yapacağım hakkında bi fikrim yoktu boş durmasın diye set_user_health koydum nasıl olsa olmayacak konuda sorarım diye :D
Cevap: İlk Plugin ve Hatalar
1- include dosyalarını kullana kullana biryerden sonra ezberlemeye başlıyorsun zaten senin ilk olduğun için normal zamanla sende ezbere dayalı eklentileri yapabilirsin.
2- İngilizcem var diyorsan forums.alliedmods.net sitesini tavsiye edebilirim.
3- Doğru yazılışı PHP- Kodu:
cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(gPara))
bu şekildedir hiçbir yanlışlık yok.
4- else = türkçe anlamı başka,ilaveten,ayrıca anlamına gelmektedir.if ile bağladığın fonksiyonları else if şeklinde devam ettirebilirsin. Örnek vererek açıklarsak:
PHP- Kodu:
if(get_user_team(id) == 1){
set_user_health(id,200)
}
else if(get_user_team(id) == 2){
set_user_health(id,200)
}
yani burada get_user_team(id) == 1 --> Terör takımın sağlığını 200 yap ayrıca get_user_team(id) == 2 --> CT takımınında sağlığını 200 yap anlamını taşımaktadır.
Cevap: İlk Plugin ve Hatalar
Şimdi şöyle anlatayım PHP- Kodu:
new hp = get_pcvar_num(gPara)
burda eşittirin sağındaki sola atanır bu mantığı kavra if else if mantığı ise if eğer anlamına geliyor örnek anlaman için söylüyorum PHP- Kodu:
if(para=1500)
{
bunuyap;
}
else if (para=1500 değilse buraya gelir ve burada ki işlemi yapar)
Yine de berk anlatsın şu an detaylı olarak anlatamıyorum ki o kadar detaylı bilgim yok pawn'da ki zaten yazıda yazamıyorum sol baş parmak yalan oldu :)
Bu arada sağol berk
Cevap: İlk Plugin ve Hatalar
Herkese cevapları için teşekkür ederim yavaş yavaş her şey yerli yerine oturuyor. Merak ettiğim bir şey daha var.
PHP- Kodu:
new hp = get_pcvar_num(gPara)
Yukardaki kodu uzun uzun get_pcvar_num(gPara) yazmak yerine kolaylık sağlaması için direk hp ye eşitlediniz. Bunu sadece bir public de kullanacağınız için belirli public içine yazdınız. Ama birden fazla public kullanacak olsaydınız global olarak hiçbir public in içine yazmayacak ve istediğiniz publicte kullanılabilir hale getiricektiniz. Doğru anlamış mıyım?
Cevap: İlk Plugin ve Hatalar
1. Bana sorarsan ben bunları ezbere biliyorum. Eklenti yazdıkça aklınızda kalıyor zaten. İngilizcem de iyi olduğu için bu kodları ezberlemek sorun olmuyor. Ama elbette hangi fonksiyonun ne işe yaradığını bulabileceğiniz siteler var. Bunlardan biri "funcwiki" diye google'da arattığınızda bulabileceğiniz fonksiyon arama motoru. Daha ayrıntılı bilgi için, fonksiyonu google a yazarak aratabilirsiniz. Yine de bulamazsanız buraya yazın elimizden geldiğince cevaplarız :)
2. Yine aynı şekilde ben ezbere biliyorum. Kullandıkça ezberliyorsunuz zaten. Kaldı ki, hangi fonksiyonun hangi modül/kütüphane de olduğunu karıştırabilecek kadar fazla karışık fonksiyon yok. Örneğin cstrike modülündeki fonksiyonların neredeyse tamamı "cs_" ön ekiyle başlar. Zaten eklenti yazdıkça cstrike dan fazla bir fonksiyona ihtiyaç duymadığınızı anlıyorsunuz. Ben cstrike'ı, para ayarlamaktan başka bir amaç için kullandığımı fazla hatırlamıyorum. Yine başka bir modül olan hamsandwich e bakıcak olursak. Yine kullanılan kodlar kendini belli eder. Hepsinin kenarında köşesinde bir "ham" vardır.
ExecuteHam, RegisterHam gibi..
Yine de bir bilgi kaynağı arıyorsanız "funcwiki" de ilgili kodu arattığınızda hangi kütüphane/modül e ait olduğu orada yazar. Modül ile kütüphane arasındaki fark, modüller C++ dilinde yazılır ve pawn ile oyun arasındaki iletişimi ayarlar. Örneğin fakemeta bir modüldür ve HL Engine ile .dll fonksiyonları, engine fonksiyonları arasındaki etkileşimi inceleyip düzenleyebilmeyi, health-speed-model gibi client bilgilerini değiştirip gözlemleyebilmeyi sağlar ve pawnda bunları gerçekleştirebileceğimiz fonksiyonları oluşturur.
Bir kütüphane ise, kalıplaşmış, karmaşık kodlar dizisini sadeleştirmek için kullanılır. Örneğin fakemeta_util kütüphanesi bazı yararlı işlemleri kısa yoldan yapabilmemizi sağlar.
Fakemeta_util kütüphanesinden bir stock;
PHP- Kodu:
stock fm_give_item(index, const item[]) {
if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
return 0;
new ent = fm_create_entity(item);
if (!pev_valid(ent))
return 0;
new Float:origin[3];
pev(index, pev_origin, origin);
set_pev(ent, pev_origin, origin);
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
dllfunc(DLLFunc_Spawn, ent);
new save = pev(ent, pev_solid);
dllfunc(DLLFunc_Touch, ent, index);
if (pev(ent, pev_solid) != save)
return ent;
engfunc(EngFunc_RemoveEntity, ent);
return -1;
}
Görüldüğü gibi uzun uzun işlemleri tek tek yazmak yerine, kısaca bu kütüphaneyi gösterip fm_give_item kullanabiliriz.
3. Zaten orada -hp yazmıyor ki ?
- get_pcvar_num(gPara) yazıyor ?
yani buyhp_ucret ismini verdiğin ayarın sayısal değeri.
4. if = Eğer
else = Aksi halde [değilse]
demektir.
if parantezinin içi sağlamadığında if'in sonunda bir else var ise if sağlamadığı için direk else'i okur.
PHP- Kodu:
public cmdBuyHP(id) {
if(cs_get_user_money(id) < 5000) { // Eğer para 5000 den az İSE
client_print(id,print_chat,"Yeterli Paran yok") // Uyarı mesajı göster
}
else { // Eğer para 5000 den az DEĞILSE (Yani bir önceki if doğru değilse)
set_user_health(id,get_user_health(id) + 200) // 200 HP Ekle
}
return PLUGIN_HANDLED // Komutu bitir.
}
5. Ben öyle bir kod yazmadımkı :S Yine de sana anlamını söyleyeyim.
hp adlı bir değişken yarat ve bu değişkeni "gPara ile belirtilmiş cvar ayarındaki sayısal değere" eşitle.
Edit: Son sorunla ilgili olarak ekleme
Evet tamamen doğru anlamışsın. Global değişkeni her public tanır. Ve bir değeri defalarca hesaplatmaktansa bir defa hesaplatmak her zaman daha iyidir. Fakat cvar ayarlarını global değişkenlerde kullanırsan, yaptığın ayarlar ancak map değiştiğinde aktif olucaktır.
Cevap: İlk Plugin ve Hatalar
O soruları Furkan Dize'nin pluginine bakarak yazmıştım onun plugininde
PHP- Kodu:
cs_set_user_money(id,cs_get_user_money(id) - hp)
şeklinde yazıyor ama sonra
PHP- Kodu:
new hp = get_pcvar_num(gPara)
bu kodun orada devreye girdiğini anladım.
Bakalım bi ucundan tuttum bu gidişle ezberlicem gibi; en azından set_user_health ve get_user_health i ezberledim bile :D he bide register_clcmd yi :D
Funcwiki bi garip geldi bazı kodları falan göremedim, neyse zaten alliedmodders falan var bişey olursa direk google yazar araştırırım bulamazsam da burası var :)
Yardımcı olan tüm arkadaşlara teşekkür ederim, umarım 2-3 haftaya bende sizin yerinizde olup diğer insanlara yardım ederim :)
Sorun çözülmüştür (şimdilik :) )
Cevap: İlk Plugin ve Hatalar
Umarım sen de öğreniceksin :)
"Herkes programlamayı öğrenmeli. Çünkü programlama, size nasıl düşüneceğinizi öğretir." -Steve Jobs
Çözülmüş İsteklere taşındı.