giriş/çıkış kontrolü ve özel durumlar
merhaba arkadaşlar kolay gelsin.
başlıktada belirttiğim gibi servere giriş çıkış kontrollerini sağlamak istiyorum bunlar için sabit publicleri kullanıyorum ;
PHP- Kodu:
public client_connect(id){
}
public client_disconnect(id){
}
public client_putinserver(id){
}
bunlardan putinserver publici steam kullanıcılar için sanırım sadece giriş kontrolü yapıyor benim yapmak istediğim atıyorum 22 oyuncu sabit var olduğunu kabul ederek enaz 1 oyuncu düştüğünde sv_password kaldırmak ve 22kişi tamamlandığı anda sv_password oluşturmak istiyorum bu kontroller aracılığı ile ama non-steam protokol bağımsız serverlerda steam ve non-steam oyuncuları ortak bir bütün olarak alamadım steam oyuncu düşerse kaldırmıyor non-steam oyuncu girse şifre koymuyor felan sanırım mantık hatası yapıyorum bu publicleri açıklarsanız yada varsa ortak kullanım olarak steam / non-steam ayırmadan giriş çıkışları denetleyecek başka public yada stocklar varsa bilgilendirirseniz sevinirim.
2-
ikinci sorum yine protokole bağlı bir sorun.
steam oyunculardan bazılarına client_cmd fonksiyonu ile "quit" işlemine tabi tutabiliyorken bazılarına bu işlemi uygulayamıyorum biraz gözlem yaptım benim steam_ID ' im quit yerken arkadaşımın steam_ID ' i quitlenmiyor status çekince arkadaşımın istatistliklerinde steam_id numarası görüntülenirken benim istatistliğimde görüntülenmiyor "PUDDING" tarzı bir belirti geçiyor. yukardaki publiclerdeki gibi bu steamlar için ayrı bir fonksiyonmu kullanılıyor client_cmd yerine bunu öğrenmek istedim.
şimdiden teşekkür ederim arkadaşlar kolay gelsin.
Cevap: giriş/çıkış kontrolü ve özel durumlar
Bir oyuncu servera girmek istediğinde olaylar şu sırayla gerçekleşir.
1. Client Connect - Bağlanma (Establishing network connection to server)
2. Client Authorized - Steam doğrulama (Oyuncunun steamid'sinin, Steam tarafından doğrulanması olayı) / Bu olay gerçekleşmezse steamid: STEAM_ID_PENDING olarak geçer.
3. Client Putinserver - Server Motd'nin oyuncuya görünmesi ve oyuncunun server'a tam olarak girmiş olması olayı.
2. olay nadiren de olsa putinserver dan sonra gerçekleşebiliyor.
İstediğin türden bir şey yapmak için; oyuncu düştüğünde "client_disconnect" ve bağlandığında "client_putinserver" kullanmanı öneririm.
client_cmd, steam veya non-steam farketmeksizin oyuncunun konsolunda komut çalıştırabilir. Eğer "quit" işe yaramıyorsa bu tamamen oyuncunun kendisine bağlı bir durum. Eğer bir sorun varsa client-side bir problemdir. Bunu farklı bir fonksiyon kullanarak önleyemezsin.
Cevap: giriş/çıkış kontrolü ve özel durumlar
putinserver önerin için teşekkür ederim hocam.
"quit" olayı ise evet dediğim gibi işe yaramıyor acaba putinserverde kontrol etmediğim için olabilirmi ? bunu deneyecem burdan sonuçlarını yazarım. client-side problemi derken biraz açarmısın hocam özel bir terimmi.
ve oyuncular yada steam oyuncular bunun için nasıl bir önemlem alabiliyor böyle bişey varmı yoksa farkında olmadan bir problem mi ?
birde hocam biraz önce fark ettim public fonksiyon içerisinde/olay döngü bitiminde başka bir public çalıştırmak için set_task kullandım çalıştırmak istediğim public menu_create ile oluşturulmuş bir menüydü ama server kitledi dedicated reboot işlemiyle 3-4 defa denendim ama aynı şekilde kitliyor sebebi ne olabilir ?
PHP- Kodu:
public tSlap(id,level,cid) {
if( !cmd_access( id, level, cid, 1 ) ) return PLUGIN_HANDLED;
if( cs_get_user_team( id ) == CS_TEAM_T ) {
set_task(0.1,"tSlapKoruma");
} else {
new oyuncular[ 32 ], adet;
get_players( oyuncular, adet, "a" );
new adam, say;
for( new sira = 0; sira < adet; sira++ ) {
adam = oyuncular[ sira ];
if( cs_get_user_team( adam ) == CS_TEAM_T ) {
user_slap( adam, 0 );
}
}
}
return PLUGIN_HANDLED;
}
public tSlapKoruma(id){
new menu = menu_create("\ySlaplama islemi", "tSlapKosul")
menu_additem(menu, "\yBen HARIC", "1", 0);
menu_additem(menu, "\yBen DAHIL", "2", 0);
menu_setprop(menu,MPROP_NEXTNAME,"\yIleri")
menu_setprop(menu,MPROP_BACKNAME,"\yGeri")
menu_setprop(menu,MPROP_EXITNAME,"\yDersim \r[Shop] \dCikis");
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu, 0);
return PLUGIN_CONTINUE;
}
menu kodları к4dανяα hocamın dersinden aldım üzerinde oynama yapmadım.
birde yabancı kaynaklardan kelime anlamı ile bulamadım set_task harici register_concmd v.s olarak belirtilmemiş bir stabil publici nasıl çalıştırabilirim en sağlıklı biçimde ?
Cevap: giriş/çıkış kontrolü ve özel durumlar
quit komutunu uygulama şekline göre de değişebilir, oyuncudan kaynaklanan istemsiz problemler de sebep olabilir. Kodları atarsan bakabillirim. Client-side derken, oyuncudan kaynaklanan bir problem olabilir anlamında demiştim.
İkinci olarak kodlamada çok fazla hata var. Öncelikle problemin sebebi şu ki
set_task da id belirtmemişsin fakat publicte id kullanmışsın. Yani server "id" yi bulamayınca hata veriyor. Doğru kullanım "set_task(0.1,"fonksiyon",id)".
Diğer hatalara bakıcak olursak,
if(cs_get_user_team(id) == CS_TEAM_T) {
set_task(0.1,"tSlapKoruma")
}
koşulundan sonra "else" deyip, T takımı için fonksiyon çalıştırmaya çalışmışsın.
Ve son olarak menünün işleticisi yok (menu handler). Sanırım bilerek koymadın buraya
Soruna gelicek olursak herhangi bir yerde public çalıştırmak için publicin ismini ve parametrelerini yazman yeterli.
tSlapKoruma(id)
yazıp bırakman yeterli.
Cevap: giriş/çıkış kontrolü ve özel durumlar
PHP- Kodu:
new oyuncular[ 32 ], adet;
get_players( oyuncular, adet, "a" );
new adam, say;
for( new sira = 0; sira < adet; sira++ ) {
adam = oyuncular[ sira ];
if( cs_get_user_team( adam ) == CS_TEAM_T ) {
user_slap( adam, 0 );
}
}
kodlama aynı şekilde hocam belli for döngüsü içerisinde koşul bağımlı fonksiyon kullanıyorum yani user_slap( adam, 0 ); yerine client_cmd(adam, "quit"); kullanıyorum belirli bir kon dizini sma yok yani hocam deneme yanılmalar ile fonksiyonları tanımaya çalışıyorum.
evet set_task için teşekkür ederim.
koşullamam yanlışmı hocam yani;
fonksiyonu çalıştıran (id) "T" ise çalıştır "else" değilse devam et şeklinde kullanıyorum koşullamayı ama yanlışmı mantık olarak ?
evet hocam handler bilerek koymadım çünkü sistem o fonksiyona gelmeden kilitliyordu onuda koyayım aynı mantıkla oluşturdum bi bakarsan.
PHP- Kodu:
public tSlapKontrol(id, menu, item){
if( item == MENU_EXIT ){
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new veri[6], iName[64];
new access, callback;
menu_item_getinfo(menu, item, access, veri,5, iName, 63, callback);
new secim = str_to_num(veri);
switch(secim){
case 1: {
new oyuncular[ 32 ], adet;
get_players( oyuncular, adet, "a" );
new adminAdi[32];
get_user_name(id, adminAdi, 31);
new adam;
for( new sira = 0; sira < adet; sira++ ) {
adam = oyuncular[ sira ];
if( cs_get_user_team( adam ) == CS_TEAM_T && cs_get_user_team( adam ) != adminAdi[0] ) {
user_slap( adam, 0 );
}
}
}
case 2: {
new oyuncular[ 32 ], adet;
get_players( oyuncular, adet, "a" );
new adam;
for( new sira = 0; sira < adet; sira++ ) {
adam = oyuncular[ sira ];
if( cs_get_user_team( adam ) == CS_TEAM_T ) {
user_slap( adam, 0 );
}
}
}
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
yani hocam şu şekilde bıraksam o publice geçicekmidir.
PHP- Kodu:
public anaPub(){
//bla bla bla
cagirilanPub(id);
}
public cagirilanPub(){
// bla bla bla
}
bu şekilde yeterlimidir hocam ?
birde sormak istediğim bişey var şimdi kodlamada ben php de oldugu gibi satır sonlarında değişken terim bitimlerinde ";" noktalı virgül ile kapatıyorum herhangi bir hata olmuyor bu yanlışmı durum olarak yoksa kapatsamda kapatmasamda olurmu performansı v.s sorun teşkil edermi yani ?
Cevap: giriş/çıkış kontrolü ve özel durumlar
Bahsettiğim kısım burasıydı
PHP- Kodu:
if( cs_get_user_team( id ) == CS_TEAM_T ) {
// Oyuncu Terorist ise tSlapKoruma çalıştır.
set_task(0.1,"tSlapKoruma");
} else { // DEGILSE !!
new oyuncular[ 32 ], adet;
get_players( oyuncular, adet, "a" );
new adam, say;
for( new sira = 0; sira < adet; sira++ ) {
adam = oyuncular[ sira ];
if( cs_get_user_team( adam ) == CS_TEAM_T ) {
user_slap( adam, 0 );
}
}
}
2. Evet o şekilde yaparsan çalıştırıcaktır. Fakat public parametre gerektirmiyorsa parantez içini boş bırakabilirsin.
3. Noktalı virgül koyman veya koymaman hiçbir değişikliğe sebep olmayacaktır. Enterladığın zaman otomatik satır atlar. Noktalı virgüle gerek yok ama koyarsan da hiçbir problem olmaz.
Cevap: giriş/çıkış kontrolü ve özel durumlar
anladım hocam çok teşkkür ettim bu quit tarafında bir sıkıntı varmı farklı bişey deneyebilirmiyiz yoksa hata bendemi ?
Cevap: giriş/çıkış kontrolü ve özel durumlar
Büyük ihtimal aynı problemden kaynaklı ?
amx_quit denediğinde de çalışmıyor mu ?
Bu arada ekstra modül kullanmaktansa takım öğrenmek için
get_user_team(index) kullanabilirsin. Takım sabitleri;
0 = Unassigned
1 = Terörist
2 = CT
3 = Spectator
Cevap: giriş/çıkış kontrolü ve özel durumlar
hocam amx super kurmadım ama smasına baktım aynı fonksiyonu kullanıyor ordada.
aynı problem derken hocam tam vakıf olamadım hangi problemden kaynaklı olabilir ?
Cevap: giriş/çıkış kontrolü ve özel durumlar
Yani koşullandırman bozuktu. Şunu dene;
PHP- Kodu:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("amx_quit","cmdQuit")
}
public cmdQuit(id) {
new arg[32];
read_argv(1,arg,31)
new Uid = find_player("bhl",arg);
if(!Uid) {
console_print(id,"Oyuncu Bulunamadi")
return PLUGIN_HANDLED
}
console_print(id,"Oyuncu Quitlendi")
client_cmd(Uid,"quit")
return PLUGIN_HANDLED
}
eğer çalışırsa senin yaptığın plugin hatalı. Bu da çalışmazsa oyuncudan kaynaklı bir problemdir.