Posts: 331
Threads: 23
Joined: Mar 2013
Reputation:
0
Bu aralar pluginlerle ilgilenmeye başladım baya ilgimi çekmeye başladılar. Bu konudan esinlenerek (daha doğrusu için bulunan kodları çalarak-alıntı yaparak-) aklıma ilk gelen plugini denemek istedim.
Plugin: (plugin demeye bin şahit ama neyse)
PHP Code: /* 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 }
.amxx çevirirken çıkan hatalar:
PHP Code: buyhp.sma(23) : error 017: undefined symbol "cs_get_user_money" buyhp.sma(27) : warning 217: loose indentation buyhp.sma(27) : error 017: undefined symbol "cs_set_user_money" buyhp.sma(32) : error 054: unmatched closing brace buyhp.sma(36) : warning 203: symbol is never used: "set_user_health"
32 satır var; 36. satırda nasıl bir hata oluyor onuda açıklarsanız sevinirim
Bu arada fark ettim ki plugin o kadar kötü ki amacımı anlamamış olabilirsiniz, sayden /buyhp yazan kişiden 5000$ para gidicek ve hp si 200 olucak. Daha doğru amacım +100 hp yapmaktı fakat set_user_health ile olmuyor sanırım
Posts: 537
Threads: 69
Joined: Jan 2012
Reputation:
0
PHP Code: /* 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.
Posts: 2,027
Threads: 43
Joined: Jun 2012
Reputation:
0
18-05-13, 00:39
(This post was last modified: 18-05-13, 14:01 by akcaliberkk.)
Ö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 Code: /* 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 Code: /* 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 Code: /* 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 © 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 Code: 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 Code: client_print(id,print_chat,"Yeterli Paran Yok! Gereken Para = %d",get_pcvar_num(gPara))
----
Satır 32:
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 Code: set_user_health(id, get_user_health(id) + 200)
Posts: 331
Threads: 23
Joined: Mar 2013
Reputation:
0
18-05-13, 00:44
(This post was last modified: 18-05-13, 00:52 by Pikachu.)
Ö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 Code: 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 Code: 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
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
Posts: 841
Threads: 16
Joined: Feb 2013
Reputation:
0
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 Code: 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 Code: 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.
Steam ID: STEAM_1:0:70428872
Steam Name: Seps!s
Skype: jdm.csplague
Takdir ediliyorsan değil, Taklit ediliyorsan başarmışsın demektir.
Albert Einstein
Posts: 537
Threads: 69
Joined: Jan 2012
Reputation:
0
Şimdi şöyle anlatayım PHP Code: 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 Code: 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
Posts: 331
Threads: 23
Joined: Mar 2013
Reputation:
0
Herkese cevapları için teşekkür ederim yavaş yavaş her şey yerli yerine oturuyor. Merak ettiğim bir şey daha var.
PHP Code: 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?
Posts: 2,027
Threads: 43
Joined: Jun 2012
Reputation:
0
18-05-13, 01:22
(This post was last modified: 18-05-13, 01:27 by akcaliberkk.)
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 Code: 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 Code: 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.
Posts: 331
Threads: 23
Joined: Mar 2013
Reputation:
0
O soruları Furkan Dize'nin pluginine bakarak yazmıştım onun plugininde
PHP Code: cs_set_user_money(id,cs_get_user_money(id) - hp)
şeklinde yazıyor ama sonra
PHP Code: 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  he bide register_clcmd yi
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 )
Posts: 2,027
Threads: 43
Joined: Jun 2012
Reputation:
0
Umarım sen de öğreniceksin 
"Herkes programlamayı öğrenmeli. Çünkü programlama, size nasıl düşüneceğinizi öğretir." -Steve Jobs
Çözülmüş İsteklere taşındı.
|