11 Aralık 2010

Sony PSP SDK

Sony PSP'ye C dilinde "homebrew"(ev yapımı) program/oyun yazabilmenizi sağlayan toolchain ve saz arkadaşlarını yedekledim.

SDK yazdım aslında tam olarak öyle değil, ps2dev.org sitesi uzun zamandır kapalı. Başka bir ayna adresinde hala gerekli dosyalar duruyordu ben de hepsini çekip belki o site de kapanır diye megaupload'a yükledim. Ev yapımı oyunlar yapmanız için gereken bütün kütüphaneler vs. dahil... Bilgisi olan arkadaşlar .svn klasörüne bakabilir.

PSP programlama ile ilgileniyorsanız:
http://www.psp-programming.com/tutorials/

Subversion ile çektiğim dosyalar: (Valla trunk'ın içinde ne varsa çektim :D

SDL/
SDL_gfx/
SDL_image/
SDL_mixer/
SDL_ttf/
TinyGL/
aalib/
binutils-psp/
bzip2/
cal3D/
cpplibs/
cppunit/
freetype/
google-perftools/
gxemul-psp/
jpeg/
libTremor/
libbulletml/
libctrl/
libdoc/
libmad/
libmikmod/
libogg/
libpng/
libpspvram/
libpthreadlite/
libvorbis/
lua/
microwindows/
mikmodlib/
nidattack/
ode/
openssl/
prxtool/
pspdis/
pspgl/
pspirkeyb/
psplibraries/
psplink/
psplinkusb/
psppacker/
pspsdk/
psptoolchain/
python/
sqlite/
tests/
zlib/
zziplib/

İndirmek için:
http://www.megaupload.com/?d=65X8G1KT

01 Aralık 2010

Basit C++ XOX oyunu.


#include <iostream>
using namespace std;
//field arrayimiz, XOX oyunundaki her 9 haneyi temsil ediyor. Her haneye bir numara verdik, oyuncu hareketlerini bu numaralara gore yapacak.
int field[9]={1,2,3,4,5,6,7,8,9};
//asagidaki arrayin amaci sadece sirasi gelen veya kazanan oyuncunun adini soylerken bize kolaylik saglamak.
char choice[2]={'O','X'};
//main'deki donguden cikmamizi saglayarak oyunumuzu bitiren boolean
bool gameOver=false;

void input(int step){
int move;
while(1){
//hamle sirasi tek ise X, cift ise O hamle yapar.
cout<<"Player "<<choice[step%2]<<", make your move:";
cin>>move;
//oyuncu onceden hamle yapilmis veya alakasiz bir yere giderse hata yazdirip dongunun basina aliyoruz ve butun girdi islemini tekrar yaptiriyoruz.
if(field[move-1]==0||field[move-1]==-1||move<1||move>9)
cout<<"You can't select that field!\n";
//oyuncu yanlis bir numara girmedi, donguden cikaralim.
else
break;
}
//integer olan field arrayinda X hamle yaptiysa hanenin degeri -1, O hamle yaptiysa da 0(sifir) oluyor.
field[move-1]=-1*(step%2);
}

//oyun kagidimizin goruntusunu cizdiriyoruz. 3 satir ve 3 sutun icin iki adet for dongusu kullandim.
void draw(){
int place=0;
for(int row=1; row<=3; row++){
for(int col=1; col<=3; col++){
//arraydaki bir hanenin degeri -1 ise X, 0 ise O, baska bir sey ise oldugu gibi yazdiriyoruz; zaten hane numaralarini en basta yazmistik.
if(field[place]==-1)
cout<<"X";
else if(field[place]==0)
cout<<"O";
else
cout<<field[place];
place++;
}
cout<<endl;
}
}

//bu fonksiyonla field arrayimizdaki 3 hanenin ayni olup olmadigini kontrol ediyoruz
bool check(int a, int b, int c){
if(field[a]==field[b]&&field[b]==field[c])
return true;
else
return false;
}

void checkTable(){
//once yatay satirlari kontrol ediyoruz
for(int i=0; i<=6; i+=3){
if(check(i,i+1,i+2)){
gameOver=true;
draw();
cout<<choice[field[i]*-1]<<" wins!\n";
break;
}
}
//sonra dikey sutunları kontrol ettiriyoruz
for(int i=0; i<=2; i++){
if(check(i,i+3,i+6)){
gameOver=true;
draw();
cout<<choice[field[i]*-1]<<" wins!\n";
break;
}
}
//en son da caprazlama kontrol ediyoruz
if(check(0,4,8)||check(2,4,6)){
gameOver=true;
draw();
cout<<choice[field[4]*-1]<<" wins!\n";
}
}

int main(){
//tablomuzda 9 hane oldugundan en fazla 9 adim atilabilir, dongude her adimdan once kazanan var mi diye kontrol ettiriyoruz. Eger kazanan varsa oyun bitiyor. Yoksa dongugen cikana kadar devam ediyor ve donguden kazanan olmadan cikarsak oyun berabere bitiyor.
for(int step=1; step<=9; step++){
checkTable();
if(gameOver)
return 0;
draw();
input(step);
}
draw();
cout<<"DRAW!\n";
return 0;
}

http://codetidy.com/319

18 Ekim 2010

PSP test sallayıcısı

PSP'ye C dilinde yazdığım ilk program... Aşağıda videosu, kaynak kodu ve isteyene derlenmiş hali var(PSP'nizin homebrew çalıştırabilir olması gerekmekte ve klasörü /PSP/GAME150 klasörüne koymanız gerekmektedir). Evet farkındayım özenti işi 8bit müzik ascii art isim falan keygen yazmadım ama eğleniyorum xD (C pek bilmiyorum, callback kısımlarını anlamadım ama Allaha emanet gidiyoruz işte)

Kaynak kodu + eboot.pbp(binary) indirmek için:
http://www.megaupload.com/?d=ZN7Y8858
Video:
http://www.facebook.com/video/video.php?v=448383189177


#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <stdlib.h>
#include <time.h>

PSP_MODULE_INFO("Test Sallayicisi", 0, 1, 0);

#define printf pspDebugScreenPrintf

char asciiTag[180]=" ______ \n / ____/\n / /___ _____ _ __\n \\____ \\ / __| | | |_ \\\n _____/ / | |__| | | | | |\n/______/ \\___|_| |_| |_|\n /_/\n------------------------------\n";
int x=0;

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);

sceKernelSleepThreadCB();

return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
int thid = 0;

thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}

return thid;
}

void sorunoYaz(int soruno)
{
if(soruno<10)
{
printf("\n %i) ", soruno);
}
else if(soruno>=10)
{
printf("\n%i) ", soruno);
}
}
void soruSalla()
{
unsigned int iseed = (unsigned int)time(NULL);
srand (iseed);
int soruSayisi = 1;
int i = 0;
SceCtrlData pad;
printf("%sO:Arttir, []:Azalt, X:Onayla\nSoru sayisi: %i", asciiTag, soruSayisi);
while(1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CIRCLE && soruSayisi<25) {
pspDebugScreenClear();
soruSayisi++;
printf("%s", asciiTag);
printf("O:Arttir, []:Azalt, X:Onayla\nSoru sayisi: %i", soruSayisi);
for(i=0; i<10; i++) {
sceDisplayWaitVblankStart();
}
}
else if(pad.Buttons & PSP_CTRL_SQUARE && soruSayisi>1) {
pspDebugScreenClear();
soruSayisi--;
printf("%s", asciiTag);
printf("O:Arttir, []:Azalt, X:Onayla\nSoru sayisi: %i", soruSayisi);
for(i=0; i<10; i++) {
sceDisplayWaitVblankStart();
}
}
else if(pad.Buttons & PSP_CTRL_CROSS) {
break;
}
}
pspDebugScreenClear();
printf("%sYeni bir test sallamak icin /\\ tusuna basiniz.", asciiTag);

int soruno;
for (soruno=1; soruno<=soruSayisi; soruno++)
{
sorunoYaz(soruno);
switch(rand()%5) {
case 0:
printf("A |#----|");
break;
case 1:
printf("B |-#---|");
break;
case 2:
printf("C |--#--|");
break;
case 3:
printf("D |---#-|");
break;
case 4:
printf("E |----#|");
break;
}

}
x=0;
while(1)
{
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_TRIANGLE)
{
pspDebugScreenClear();
break;
}
}
}

int main() {
pspDebugScreenInit();
SetupCallbacks();
SceCtrlData pad;
printf("%sSan'in test sallayicisina hosgeldiniz!\nBu benim PSP icin C dilinde yazdigim ilk program.\n\nBaslamak icin /\\ tusuna basiniz!", asciiTag);
while(1)
{
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_TRIANGLE)
{
pspDebugScreenClear();
break;
}
}
while(1)
{
soruSalla();
}
sceKernelSleepThread();
return 0;
}

21 Eylül 2010

Ubuntu WebGL testleri

Ubuntu 10.04'te 3 tarayıcıda WebGL performanslarını karşılaştırdım. Kullandığım tarayıcılar Chromium 7.0.529.0, Google Chrome 7.0.517.8 ve Firefox 4.0b7 (Beta olduğu için adı Minefield diye geçiyor). Bu üçü ppa'dan yükleyebileceğiniz en son sürümler. Diğer sistem bilgilerini de aşağıya yazıyorum:
2.6.32-24-generic-pae kernel
Intel i7 930 @3.30Ghz
6GB ddr3 ram
Nvidia GeForce GTX 470 (fabrika ayarları)
Nvidia kapalı kaynak sürücüleri v195.36.24

Sadece 2 demo ile test yaptım, ne kadar bilimseldir, ne kadar sağlıklı testler olmuştur bilmiyorum ama yine de bir fikir veriyor. İlk olarak akvaryum testi:
http://webglsamples.googlecode.com/hg/aquarium/aquarium.html

Firefox - ~26fps


Google Chrome - ~26fps


Chromium - ~45fps



İkinci ve son olarak çimen testi:
http://webglsamples.googlecode.com/hg/field/field.html

Firefox - ~18fps


Google Chrome - ~25fps


Chromium - ~69fps



Sonuç olarak Chromium'un Linux'ta diğer tarayıcılardan performans olarak üstün olduğunu yine kendi gözlerimle gördüm. (Daha önce Peacekeeper testinde bunu görmüştüm) Ancak son testte bu kadar fark atması beni çok şaşırttı doğrusu... Hatta kardeşi Google Chrome'a bile bu kadar fark attı, işte açık kaynağın zaferi. :)

20 Ağustos 2010

Pardus ile nasıl CS:S sunucusu yapılır?

Dün laptopuma kurduğum sunucuyu gerçek oyuncularla test ettik. Gördüm ki 10mbit indirme, 1mbit gönderme hızı olan internete bağlı 1.6Ghz çift çekirdekli bir sunucu çok rahat 6 kişilik bir oyun kaldırıyor. Ülkemizde 8mbit adsl bağlantısına sahip birilerini bulmak o kadar da zor değil. Eğer böyle bir bağlantınız varsa ve elinizin altında eski bir bilgisayar varsa siz de onu arkadaşlarınızla takılacağınız, istediğiniz haritalarda oynayacağınız özel bir sunucu haline getirebilirsiniz. Hatta 1mbit internetle bile 2 kişi teke tek oynayabilirsiniz.

Bugün, bunun Pardus 2009.2 işletim sistemi ile nasıl yapacağınızı anlatacağım. Yapacağımız şey Pardus'u çok temel bir şekilde bilgisayara kurmak, bu kurulumdan sonra eski bilgisayarınızı yavaşlatan ve bir sunucu için gereksiz olan grafik arayüzü olmayacak. İnternet bağlantısını sağlayacağız, sunucu dosyalarını indireceğiz, modem ayarlarını yaptıktan sonra mani admin plugin kuracağız ve sunucumuz hazır olacak.

Pardus Kurulumu

Ekleme: ozgurlukicin.com forumlarında bir kullanıcı tam da bizim ihtiyacımız olan şeyi yapmış ve bir adet temel sistem iso'su yapmış. Eğer elinizde bir Pardus CD'si yoksa veya daha sonradan Pardus'u normal bir şekilde kurmayı düşünmüyorsanız aşağıdaki forum başlığındaki linkten CD'yi indirebilirsiniz. Bizim ihtiyacımız olan dosyalar var sadece içinde. Ve boyutu sadece 180mb:
http://www.ozgurlukicin.com/forum/gonullu-calismalar/17530/

Öncelikle http://www.pardus.org.tr/indir/ adresinden Pardus'u indiriyoruz. Boş bir CD'ye yazıyoruz, ve bilgisayara takıp CD'den çalıştırıyoruz. Önümüze bir menü açılır açılmaz aşağıda Açılış Seçenekleri yazan kısmın yanına yali4=baseonly yazıp entera basıyoruz. (Bununla ilgili başka bir yerden bulduğum bir resim)

Kurulumu bilmeyenler için de anlatacağım. GPL'i kabul edin, diski doğrulamaya gerek yok, klavyeyi seçerken eğer klavye ingilizce klavyeyse ingilizce seçmeniz daha iyi olabilir. Türkçe karakterlere pek ihtiyacınız olmayacak ama bazı özel karakterlere ihtiyacınız olacak, sorun çıkmaması için. Kullanıcı adı ve parolanızı girin, yönetici parolanızı aklınızda tutun.

Disk bölümlendirmeye geldiğinizde Hayır diski kendim bölümlendireceğim'i seçin. Bilgisayarda boş bir bölüm olmalı, eğer yoksa varolan Windows bölümlerinizle vedalaşmak isteyebilirsiniz :) Boş alan'ı seçip Pardus sistem dosyaları için(/) bir bölüm oluşturun, 5GB yeterli olacaktır, ancak en iyisi en az 10GB lık bir bölüm oluşturmak. Ardından yine boş alana tıklayıp bir takas alanı oluşturun. Bu bölüm bilgisayarım RAM'inin yetmemesi durumunda RAM gibi kullanılacaktır. 2-4GB bir şeyler verebilirsiniz, veya ne kadar olursa. İleri diyin, eğer ne yaptığınızı bilmiyorsanız Önyükleyici seçimi kısmında bir şeye dokunmadan ileri diyerek kurulumu başlatın.

Pardus'u Ayarlamak

Kurulum bittikten sonra Pardus'ta bazı ayarlar yapmamız gerekecek. Bilgisayarı açın, komuta satırından oluşan bir pencere ile karşılaşacaksınız. Sistem ayarları yapacağımız için kullanıcı adınızı kullanarak girmeyin. Kullanıcı adına root, şifreye de yönetici şifrenizi girin.

Şimdi interneti ayarlayacağız, network create yazın. Sorusu geldiğinde IP numarasını kendiniz girmeyi seçin, (Enter IP adress manually). Benim girdiğim IP'ler:
Adress: 192.168.1.200
Mast: 255.255.255.0
Gateway: 192.168.1.1 (modem)
DNS olarak Google DNS seçtim(8.8.8.8) :D
Eğer IP'lerin otomatik olarak alınmasını(DHCP) seçerseniz pek de sorun olmayabilir, zira çoğu dağıtım IP'yi alırken bilgisayarın parmak izi olan MAC adresine göre alıyor, yani her seferinde aynı oluyor. Ama işinizi sağlama almanız ve benim yaptığım gibi girmeniz faydanıza.
Sonunda bir profil ismi girin, internet1 gibi. Aşağıdaki komutla interneti çalıştırın:
network up internet1
ve bağlantıyı kontrol edin...
ping -c 3 www.google.com

Source Dedicated Server kurulumu

Kısaca SRCDS, bu program sayesinde CS:S, HL2:DM, TF2 gibi oyunlara sunucu kurabilirsiniz. Ben CS:S sunucusu kuracağım. wget isimli bir pakete ihtiyacımız olacak, onu kurun.
pisi install wget
Yönetici olark oturum açmıştık, daha güvenli olması için normal kullanıcı olarak oturum açın:
su kullanıcıadı
srcds için bir klasör oluşturup o dizine gidin,
mkdir /home/kullanıcıadı/srcds
cd /home/kullanıcıadı/srcds
Şimdi srcds yükleyicisini indirelim, adı hldsupdatetool(half-life dedicated server update tool). Bununla eski CS 1.6 sunucusu da kurabilirsiniz.
wget http://www.steampowered.com/download/hldsupdatetool.bin
indirdiğimiz dosyayı çalıştırılabilir hale getirip çalıştıralım:
chmod +x hldsupdatetool.bin
./hldsupdatetool.bin
Uzun sözleşmeyi okuduktan sonra kabul edin(şaka şaka, direk kabul edin işte :P). Bulunduğumuz dizinde steam diye bir dosya oluşacak, onu çalıştırın ve Steam güncellensin.
./steam

Şimdi, geldik asıl kısma. Eğer benim gibi CS:S sunucusu kuracaksanız, yaklaşık 3GB dosya indireceksiniz demektir. İnternetiniz hızlı olsa da dosyalar yavaş inebiliyor ve bu işlem uzun sürebiliyor. TF2 sunucusu kurmak istiyorsanız bende "Counter-Strike Source" yazan kısma "tf", CS1.6 sunucusu kurmak istiyorsanız da "cstrike" yazınız. -retry parametresini koymayı unutmayınız, bu parametre hayat kurtarıyor. Eğer bağlantı koparsa 30sn de bir tekrar deniyor. 2 Kere onu girmeden indirmeyi denedim bütün zamanım boşa gitti, bağlantı bir koptu mu kaldığınız yerden devam edemiyorsunuz. Neyse, aşağıdaki komutu girin ve gidin uyuyun, ders çalışın, TV izleyin, sokağa çıkın, kız/erkek arkadaşınız varsa onunla buluşun(Zaten kız/erkek arkadaşınız varsa bu tür işlerle uğraşmayın hiç, bütün zamanınızı onunla geçirmenizi tavsiye ederim).
./steam -command update -game "Counter-Strike Source" -retry -dir .

Bütün dosyalar indikten sonra aslında çalışan bir sunucunuz var demektir!!! Sunucuyu çalıştırmak için aşağıdaki komutu girin:
Ama önce orangebox klasörüne gidin...
cd orangebox
ve işte beklenen an!
./srcds_run -console -game cstrike +map de_dust +maxplayers 16 -autoupdate

Bundan sonra yapmanız gereken modeminizi ayarlamak, bir sürü modem çeşiti olduğundan ve bunun nasıl yapılacağı hakkında bilgi bulmanız çok kolay olduğundan burada anlatmayacağım. Yapmanız gereken 27015 portunu açıp bilgisayarınızın yerel ağdaki IP'sine yönlendirmeniz(Mesela en başta kurarken ben 192.168.1.200 yazmıştım). Tabii isterseniz başka bir port açıp, oyunu çalıştırırken "-port ..." parametresini de ekleyebilirsiniz. Eğer bu sunucu işine niyetliyseniz aylık 2-3tl vererek statik IP almanızı savsiye ederim, aksi taktirde modem her kapandığında değişen IP'nizi sabit tutan bir servise(no-ip) üye olmanız gerekecek ve bu işler hakkında pek bir bilgim yok açıkçası... Modem ile olan işlerinizi hallettiniz kabul ediyorum ;)

Not: Aynı yerel ağ üzerindeki bir bilgisayarda sunucu gözükmüyorsa merak etmeyin, yerel ağ IP'sini kullanarak bağlansanız da dışarı bağlanan IP'niz ile evden bağlanamayabilirsiniz. Bir arkadaşınızdan kontrol etmesini rica etmeniz gerekecek.

Sunucu ayarları

Bundan sonra yapmak isteyeceğiniz şey sunucunuzu ayarlamak olacak... server.cfg dosyasını ayarlamak lazım. Eğer İngilizce bilmiyorsanız CS:S için her parametreyi Türkçe tek tek anlatan bir dosya yok. Uygun bir zamanım olduğunda bu dosya ayarlarını yapmanızı sağlayan Linux'ta çalışan Türkçe bir program yapmayı denerim ama ;) Eğer bu yazıyı okuyorsanız sıkınız dişinizi.
Server.cfg'yi linux komut satırında ayarlamanızı sağlayan bir Python scripti yazdım. cstrike klasörünüze gidin
cd cstrike
şimdi sever-cfg-olusturucusu dosyasini indirelim ve tardan cikaralim, ve calistiralim.
wget http://lys01.0fees.net/server-cfg-olusturucusu.py.tar.gz
tar -xvzf server-cfg-olusturucusu.py.tar.gz
python server-cfg-olusturucusu.py
Oradaki adımları takip edin, iyice okuyun. Her bilgiyi girmek zorunda değilsiniz, eğer girmemek istiyorsanız "gec" yazmanız yeterli olacaktir. İşiniz bittikten sonra orangebox klasörüne geri dönünüz.
cd ..

Admin mod kurulumu

Sunucumuza Mani Admin plugin kuracağız. Adı üstünde bu bir plugin, yani eklenti ve Meta Mod üzerinde çalışıyor. Yapacağımız işler daha çok komutlarla olacak, hadi başlayalım:
mod klasörümüze gidelim: (bu oyundan oyuna değişir, ve eğer sunucuyu yine çalıştırmak isterseniz bir üst klasöre dönmeniz gerekecek, cd .. yazarak bir yukarı dönebilirsiniz. Nerede olduğunuzu görmek için de pwd yazın.)
cd /home/kullanıcıadı/srcds/orangebox/cstrike
http://www.sourcemm.net/ adresinden bulduğumuz Linux linki ile metamod'u indiriyoruz.
wget http://www.sourcemm.net/downloads/mmsource-1.8.3-linux.tar.gz/2
Hazır onu indirmişken, http://www.mani-admin-plugin.com/ adresinden bulduğumuz link ile de Mani Admin plugini indirelim :)
wget http://maniadminplugin.googlecode.com/files/mani_admin_plugin_v1_2v_orange.zip
Şimdi Meta Mod'u tar'dan çıkaralım...
tar -xvzf mmsource-1.8.3-linux.tar.gz
addons klasörü içine metamod.vdf diye bir dosya oluşturup gerekli ayarları girelim
mkdir addons
nano addons/metamod.vdf
ve aşağıdakileri yazalım:
"Plugin"
{
"file" "../cstrike/addons/metamod/bin/server"
}

Ctrl+O'ya basarak kaydettikten sonra Ctrl+X ile nano metin düzenleyicisinden çıkalım.
Sıra Mani'ye geldi, Mani'yi zip'ten çıkaralım. Meta Mod'un aksine Mani zip dosyası, komutu da farklı.
unzip mani_admin_plugin_v1_2v_orange.zip
Meta Mod'un Mani'yi açılışta çalıştırmasını sağlamamız lazım.
nano addons/metamod/mani_admin_plugin.vdf
aşağıdakileri yazdıktan sonra kaydedip kapatalım.
"Metamod Plugin"
{
"alias" "Mani Admin Plugin"
"file" "addons/mani_admin_plugin/bin/mani_admin_plugin_mm"
}


Admin eklemek

Admin eklemek için clients.txt diye bir dosya oluşturmamız lazım. * işaretlerinin arasına yazdıklarımı sizin değiştirmeniz gerekiyor.
SteamID: SteamID'nizi http://steamidfinder.com/ adresine Steam profilinizin linkini yazarak veya oyunda tek kişilik oyun açıp konsola "status" yazın, adınızın sağında STEAM:_0:0:123456 ya benzeyen şey sizin SteamID'niz.
nano /cfg/mani_admin_plugin/clients.txt
"clients.txt"
{
"version" "1"

"players"
{
"*OyundakiAdınız*"
{
"name" "*adınız*"
"steam" "*SteamID'niz*"
"flags"
{
"Admin" "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e"
"Admin" "f g i k l m o p q q2 q3 r s t v w x y z admin client"
"Admin" "grav pban spray"
"Immunity" "a b c d e f g h i j k l m n o p q r s t u v x y afk ping autojoin grav Immunity"
}
}
}
}


İşte bu kadar! Artık çalışan bir sunucunuz var, hem de Pardus!!! ;) Unutmayın SRCDS Linux'ta Windows'ta olduğundan çok daha hızlı çalışır, grafik arayüzü olmaması da performans açısından çok büyük bir artı. Özellikle bu yazıda anlatmak istediğim bir süperbilgisayara değil, el altındaki eski bir bilgisayara veya öylesine duran bir laptopa nasıl sunucu kurulacağı olduğu için bunlar önemli. İyi eğlenceler!

Not: Yazıyı yazdıktan sonra Özgür Bozkurt isminde birisinin hazırladığı çok güzel bir sunucu kurulumu videosu buldum, yalnız bu Windows için. Belki yardımcı olabilir, eğer admin modla veya portlarla falan sorun yaşıyorsanız izlemenizi tavsiye ederim.
http://blog.ozgurbozkurt.com/counter-strike-source-server-kurulumu-videolu-anlatimi.html

17 Ağustos 2010

Linux'ta Source Dedicated Server

Canım sıkıldı ve Laptopuma Counter-Strike: Source dedicated server kurayım dedim...
1.6Ghz çift çekirdekli Pentium işlemci ve 2GB ram, üzerine de 4GB Swap bölümlü Arch linux kurulu. Minimal Arch tabii, X kurmadım.

Dosyaları indirirken iki kere bir yerlerde takıldı ve devam etmedi, ikisinde de yeniden başlattım. Sonunda update ederken -retry parametresini girdim. Sunucu kurulumunu anlatan çoğu kaynakta bu parametreden bahsedilmiyor, ancak bence çok ama çok gerekli bir şey. Bağlantınız koparsa 30 saniyede bir yeniden deniyor. Kaldığımız yerden devam edemeyince, ve 3GB küsür dosya indirirken inanın bu komut hayat kurtarıyor.

Uzun bir süre sonra dosyalar indi, sunucuyu çalıştırdım. Tek başıma girdim, çifter çifter bot ekliyorum oyuna ama bir kasılma yok :D En son 9 bot + ben varken, de_dust2 haritasında bir el bombası atarken takılır gibi oldu. Dedim tamam daha fazla bota gerek yok. Sevindim tabii, 1.6Ghz işlemcili bir bilgisayarda o kadar kişi ile oynanabilmesi şaşırtıcı, hem de bunlar yapay zekalı BOT, yani gerçek insandan daha fazla meşgul ediyorlar işlemciyi.

Başka clientler ile oynamayı dememedim tabii, 1mbit upload hızı kaç kişiye yeter bilemeyeceğim. ADSL zamanında 256k ile pek de sorun olmadan oynayabiliyorduk, bu da demektir ki 4 kişi oyuna girse oynanabilir. Tabii denemeden konuşmamak lazım ;D

14 Ağustos 2010

Aşk, komünistlerin uydurmasıymış!

Genç kız: Anne aşk nasıl bir şey?

Annesi: Aşk mı? Şey... aşk şöyle bir şeydir kızım, hani mesela çok zengin ve yakışıklı bir adama rastlarsın, seni Venedik'e götürür, mehtapta gondolla gezersiniz, sonra San Marco meydanında güzel bir restoranda harika bir yemek yersiniz, nazik falan, ve arkasından en luks bir otelde sana şahane bir gece yaşatır. Sonra da, ne bileyim işte, sana güzel bir araba alır, bir daire alır, ya da deniz kıyısında sana bir villa satın alır, elmas gerdanlıklar, altın yüzükler hediye eder, mutluluktan uçarsın adeta, işte aşk böyle bir şeydir kızım.

Genç kız: Ama anne, peki o heyecanlar, güzel duygular, kalbin küt küt çarpması, ilk buluşma, ilk öpücük, birlikte bir şeyleri başarma, paylaşım... Bunlar yok mu?

Annesi: Ha onlar mı? Kızım onlar bedava hatun götürsünler diye komünistlerin uydurmaları, yok öyle bir şey!

31 Temmuz 2010

Counter-Strike: Source harita yapımı anlatımı

Umarım harita yapmak isteyen arkadaşlara yardımcı olabilirim ;)

Harita yapmak için Steam'dan tools'ta Source SDK'yı indirmemiz gerekiyor. İndirdikten sonra açıyoruz zaten artık ayarları falan kendisi otomatik yapıyor, o kısımları atlıyorum. Alttan oyun olarak Counter-Strike: Source'u seçiyoruz ve harita yaptığımız program olan "Hammer Editor"u çalıştırıyoruz.

Hammer'i açtık... File>New dedik. 4 tane penceremiz var. Bunlardan biri haritamızı 3 boyutlu görmek için, diğer üçü ise çizimleri yapacağımız ve haritamızın 3 tarafından çizimlerini gösteren pencereler.

CSS haritaları temel olarak iki tür parçalardan oluşur, "brush"lar ve "entity"ler. Brush'lar, kutu şeklinde yarattığımız ve sonradan şekillendirebildiğimiz yüzeylerdir. Yerler, duvarlar, ışınlanmamızı sağlayan görünmez duvarlar, silah satın aldığımız ve bomba kurduğumuz yerleri belirleyen görünmez duvarlar vs bunların hepsi brushtır. Entity'ler ise nokta şeklinde haritaya konur. Oyuncuların başlama noktaları, çeşitli 3 boyutlu eşyalar(Sokak lambası, kapı kolu, devrilen bidonlar, süsler vs), ışığın geldiği nokta gibi şeyler entitylerdir.

Hadi başlayalım!
Anlatacağım harita, fy_iceworld'a benzeyen basit bir harita olacak.

Önce bir zemin çizelim


Sol tarafta, gri kutulu düğmeye basalım[1-A]. Bununla brush'ları çizeceğiz. Sağ tarafta, desenleri seçtiğimiz bir bölüm var[1-B]. Oradan "Browse"ye basıp bir çimen deseni seçelim. "Filter" yazan yere grass yazıp herhangi birini seçebilirsiniz. Sonra sağ üstteki pencerede 1024x1024 boyutlarında bir kutu oluşturalım. Kutuyu yaratmak için klavyeden entera basabilir, veya fare ile sağ tıklatıp "Create object"i seçebiliriz. İptal etmek için klavyeden esc'ye basabiliriz.

Sol üstteki pencerede beyaz "camera" yazısına[1-C] sağ tıklayıp "3D textured"i seçelim. Kamera penceremizde gezinmek için faremizi kamera penceresine götürdükten sonra, space tuşuna basılı tutup normal oyunda gezindiğimiz gibi WASD tuşlarıyla geziniyoruz. Etrafa bakınmak için fareyle tıklayıp hareket ettirmeniz yeterli. Aynı şekilde diğer üç çizim penceresini kaydırmak için de space'ye basıp fareyle sürükleyebiliyoruz.

Haritamıza duvar ekleyelim

Yine gri kutuya basıp bir duvar deseni seçelim. Ben tuğla deseni seçtim. Bu seferki ilk yaptığımızdan biraz daha farklı olacak. İlk brush'ımızda yüksekliği ihmal ettik çünkü(varsayılan olarak 64 olmuş olması lazım). İlk resimde gördüğünüz şekilde, herhangi bir pencerede duvarı çizin. Yüksekliği 128 girebilirsiniz, kalınlık için de 64 iyidir. Eğer duvarı yine sağ üstteki pencerede çizdiyseniz yüksekliği alttaki pencerelerde girmeniz gerekecek. İsterseniz benim yaptığım gibi duvarı yukarı çekebilirsiniz, bir sorun yaratmaz. Aynı işlemi geri kalan 3 duvar için de yapın.

İlk entity'lerimizi koyalım


Iceworld'dan farklı olarak, ortaya 4 tane duvar yerine 4 tane konteyner koyalım. Konteyner şeklinde bir kutu yapıp ona desen de verebiliriz, ama entity olarak koyarsak çok daha kaliteli olur. ;) Solda gri ampullü düğmeye[2-A] basalım.

Sağdan[2-B] entity'mizin cinsini seçeceğiz. "Objects:" yazan kısmın altına "prop_static" yazalım. prop_static hareket etmeyen, süs amaçlı 3D objeler için. Haritamızda herhangi bir yere tıklayıp entera basarak entitymizi yaratalım, daha sonra hareket ettiririz. Entity'mizin üzerine sağ tuşla tıklayıp "proporties"i seçelim. Listede "world model"[2-C] i seçtikten sonra, sağda "browse"ye basalım.


Filter kısmına "cargo" yazıp düzgün bir konteyner seçelim.[3. resim] OK'a bastıktan sonra apply diyelim ve işte konteynerimiz! Özellikler penceresini kapatıp onu düzgün bir şekilde yerleştirelim. Solda kırmızı oka[3-A] bastıktan sonra konteynerimizi seçelim. Önizleme penceresinde herhangi bir yere, diğer pencerelerde cismin ortasındaki çarpıya basarak seçimi yapabiliriz. Tabii hareket ettirmek için çizim pencerelerini kullanmamız gerekecek. Konteyneri uygun bir yere koyduktan sonra çizim pencerelerinden birinde cisme sağ tıklayıp "copy" dedikten sonra hemen yanına "paste" diyelim, sonra bu işlemi bir daha tekrarlayalım. 3 konteyneri dördüncü resimdeki üçlülerden biri gibi yerleştirdikten sonra, bu sefer üçünü birden seçmek için CTRL ye basılı tutarak üçünü de seçip dördüncü resimdeki gibi hepsini yerleştirelim.


Şimdi eğer dikkat ederseniz, biraz yakınlaşırsak konteynerlerin az da olsa uçtuğunu göreceksiniz. Işık olunca gölgeleri çirkin görünebilir. Ama özellikle yere gömmedim. Çünkü şimdi yere daha gerçekçi bir görünüm kazandıracağız.

Yer şekilleri


Solda grikutunun altındaki mavili yeşilli kutuya tıklayın[5-A]. Sonra önizleme penceresinde çimenlerin üst kısmına tıklayın. Şimdi bu düğmeyi bir brush'ın seçtiğimiz yüzeyindeki desenini değiştirmek için de kullanabiliriz, ama biz yer şekilleri yapmak için kullanacağız. Açılan pencerede yukarıdan "Displacement"e[5-B] basın. Ardından "Create" düğmesine tıklayın[5-C]. Gelen pencerede "Power"i 4 yapıp onaylayın. Bundan sonra "Noise"ye[5-D] basıp "min" değerini 0, "max" değerini 16 yapın. Bu şekilde çimen en fazla 16 birim yükselecek, en az 0 birim yükselecek. "Ok"a basın ve diğer pencereyi kapatın. Şimdi daha gerçekçi bir zeminimiz oldu.

Oyuncuların başlangıç noktaları

Bunun için info_player_terrorist ve info_player_counterterrorist adında iki entity kullanacağız. Bu entity'leri harita yaparken çevredeki cisimlerin ne kadar büyük olduğunu anlamak için de kullanabilirsiniz. Bu entity'leri koyarken dikkat etmeniz gereken ne fazla aşağıda ne de fazla yukarıda olmamaları. Zeminimizi bozduğumuz için bazı yerleri normalden daha yüksek, eğer oyuncumuz başlangıçta yer ile iç içe girerse oyun başladığında kımıldayamaz. Eğer fazla yukarı koyarsanız da oyun başladığında rahatsız edici olabilir.

Şu anda çizim pencerelerimizin kareleri çok büyük, hassas olarak yerleştiremeyiz. Yukarıdan "Map>Grid Settings>Smaller Grid"e basarak daha hassas konumlandırma yapabilirsiniz. İki takımdan birinin oyuncularının sırtı dönük olduğunu fark edeceksiniz. Onları ters döndürmek için sağ tıklayıp "Flip objects>Horizontally" diyebilirsiniz. Daha hassas bir çekilde çevirmek istiyorsanız seçim modundayken plan pencerelerinde entity'e bir kere daha tıklayın, 4 kenarında halkalar olduğunu göreceksiniz. Bu halkalara tıklayarak oyuncularınızın başladıklarında bakacağı yönü belirleyebilirsiniz.


Şimdi altıncı resimdeki gibi bir tarafa teröristleri bir tarafa da anti-teröristleri yerleştirin. Ben pencerelerdeki kareleri iki kere küçülttüm ve toplam 32 tane başlangıç noktası koydum. Eğer başlangıç noktalarının sayısı yeterli değilse, örnek olarak benim yaptığım haritanın olduğu sunucuda 40 kişi oynuyorsa oyun başladığında 8 kişi takım seçemeyecek, spectator olarak kalacaklar. O yüzden ileride harita yaparken her takım için 32 tane başlangıç noktası yapmak daha iyi.

Satın alma bölgesi


Iceworld'daki gibi ortaya bir satın alma noktası yapalım. Brush çizdiğimiz gri kutuya tıklayın. Desen seçtiğimiz bölümde, filter kısmına "tools" yazın. Buradakiler araç olarak kullandığımız desenler, gökyüzü, duman, merdiven vs bunlar ile yapılıyor. Buradan "trigger" yazanı seçin. Yedinci resimdeki gibi ortaya bir kutu çizin. Bu oyunda görünmeyecek, ama ayarları yaptığımızda oyuncumuz içinden geçtiğinde silah satın alabilecek.

Kutu seçiliyken ona sağ tıklayıp "Tie to Entity" demeliyiz. Şimdi kutumuz brush kökenli bir entity oldu. "Class" kısmından "func_buyzone"yi seçiniz. Listeden "Team Number"ı seçip, sağ taraftan teröristler için mi yoksa anti-teröristler için mi satın alma bölgesi olduğunu seçmelisiniz. Biz her iki takımın da satın alabilmesi için, önce teröristleri seçip apply diyeceğiz. Ardından kutuyu kopyalayıp yapıştırdıktan sonra onu anti-teröristler için ayarlayacağız ve diğer kutunun olduğu yere koyacağız. Yani üst üste binecekler. Yardım için yedinci resime bakabilirsiniz.

Silahlar

Şimdi bir de yere silah koyalım. Tahmin edeceğiniz üzere bunun için de entity koyacağız. weapon_ ile başlayan entity'ler silahlar. Çabuk olsun diye silahların hepsini MP5 yapacağım. Siz istediğinizi yapabilirsiniz. Haritamız biraz küçük olduğu için silahlar oyunculara yakın duracağı için başlar başlamaz ellerine gelebilir.

Gökyüzü

Gelelim en önemli kısımlardan birine, gökyüzü. Haritada açık kalan her yeri örtecek şekilde, toolsskybox desenini kullanarak bir tavan yapacağız. Bu tavan aynı zamanda oyuncuların birbirlerinin üzerine çıkarak duvarkara çıkarlarsa haritanın dışına düşerek sonsuz bir düşüşe geçmelerini de engelleyecek. İnanın haritada bu tür açıklıklar bırakmak istemezsiniz.


Bir düzeltme: oyuncular zıpladığında duvarların tepesini görmeleri için sekizinci resimdeki gibi birer kenardan uzattım, haritayı ilk yaparken bu kadar yüksek konteyner koyacağımı düşünmedim ve direk bir kutu halinde gökyüzünü kapatırım diye düşünmüştüm o yüzden kötü oldu. Siz de bunu yaptıktan sonra sekizinci resimdeki gibi haritamızı kapatalım. (Daha iyi görün diye geçici olarak bir tarafa skybox çizmedim.)

Işık


Son olarak haritamıza ışık koyalım, bunu yapmazsak her yer apaydınlık olur ve gerçekçi durmaz. Yukarıya bir yere, gökyüzümüzün dışına çıkmayacak şekilde "light_environment" adındaki entity'i koyalım. Şimdi önizleme penceremizde oluşturduğumuz entity'nin dibine gidip ona iki kere tıklayalım. Listede "Pitch Yaw Roll" zaten seçili, sağda "Point at"a basıp önizleme penceremizde ışığın hedefinin olmasını istediğimiz yeri seçiyoruz.[9. resim] Yani ışığın kaynağı entity'miz, yönü de demin tıkladığımız yer oluyor. "Apply"a basıp kapatıyoruz.

Tebrikler! İlk haritanızı yaptınız. Haritayı kaydettikten sonra "File>Run Map..."a veya direk F9'a basın. Ayarlarla oynamanıza gerek yok, direk OK'e basın ve oyun yaptığınız harita ile açılsın!

Anlatımda yaptığım haritayı örnek olarak aşağıdaki linkten indirebilirsiniz:
http://www.megaupload.com/?d=7N5M036D

Bu anlatımın "Antarktikalı" tarafından yazıdğınını belittiğiniz sürece istediğiniz yerde paylaşabişirsiniz.

26 Temmuz 2010

Python ile test şıklarını sallamak

Python ile bu sene yazdığım test sorusu sallayıcısı. Javascript, PHP ve C'de(hatta Sony PSP'de çalışıyor :D) versiyonları da mevcut. Javascript ve PHP için http://lys01.0fees.net/salla/ adresine de bakabilirsiniz. Programlamaya başlayan arkadaşlar için kullanışlı bir programcık; else if, while döngüleri, değişkenler, girdi-çıktı vs...

import random
import sys
n=input("Kac soru?:")
i=1
k=1
if (300 >= n > 0):
while (i <= n):
a = random.randint(1,5)
while (k < 6):
if k==a:
sys.stdout.write("#")
else:
sys.stdout.write("-")
k = k+1
print
k = 1
i = i+1
else:
print "Soru sayisi yalnizca 1-300 arasinda olabilir."

25 Temmuz 2010

Youtube erişimi için yapmanız gerekenler

Biliyorsunuz artık DNS değiştirmek Youtube'a girmeye yetmiyor... Erişim için hosts dosyanızı değiştirmeniz lazım. Bu yazıyı herkese yardımcı olabilecek şekilde yazmaya çalıştım.

Linux:
/etc/hosts dosyasının sonuna eklemeniz lazım. Çoğu işletim sisteminde bunu terminal(konsol) açıp nano ile yapabilirsiniz. Veya root yetkili herhangi bir metin düzenleyici. Ama nano daha kolay. Konsola:
sudo nano /etc/hosts
yazdıktan sonra aşağıdakileri kopyalayıp dosyanın sonuna yapıştırıyoruz,
ctrl+o ile kaydediyoruz. Ctrl+x ile çıkıyoruz...

Mac:
Mac kullanmıyorum, yanlışsa kusura bakmayın. Linux için yaptığımız gibi yapabiliriz. Terminal'i utilities'in altında veya applications'ta bulabiliriz. Açıp root yetkisi kazanmak için "su root" yazıyoruz. (Mac terminalinde sudo yapamayabiliriz çünkü, emin değilim) Ve aşağıdaki komutu giriyoruz:
nano /etc/hosts (çalışmazsa nano yerine pico yazın)
Gerisi Linux'la aynı.

Windows:
Vista veya Windows 7 kullanıyorsanız start menüsünden Notepad'ı bulup "Run as administrator" demeniz gerekmektedir(Admin yetkiniz varsa örn. Windows XP bunu yapmanıza gerek yok direk açabilirsiniz). Sonra notepad'dan C:\WINDOWS\system32\drivers\etc\hosts dosyasını açıp yine aşağıdakileri dosyanın sonuna ekliyoruz ve kaydediyoruz.

72.14.221.100 translate.google.com docs.google.com maps.google.com www.google-analytics.com tools.google.com clients.google.com

74.125.43.103 docs.google.com
74.125.43.103 translate.google.com
74.125.43.103 code.google.com
74.125.43.103 pages.google.com
74.125.43.103 video.google.com
74.125.43.103 translate.google.com.tr
74.125.43.103 docs.google.com
74.125.43.103 sites.google.com
74.125.43.103 books.google.com
74.125.43.103 chrome.google.com
74.125.43.103 sketchup.google.com
74.125.43.103 froogle.google.com
74.125.43.103 labs.google.com
74.125.43.103 mars.google.com
74.125.43.103 moon.google.com
74.125.43.103 notebook.google.com
74.125.43.103 toolbar.google.com
74.125.43.103 browsersync.google.com
74.125.43.103 catalog.google.com
74.125.43.103 codesearch.google.com
74.125.43.103 dir.google.com
74.125.43.103 earth.google.com
74.125.43.103 groups.google.com.tr
74.125.43.103 shopping.google.com
74.125.43.103 sky.google.com
74.125.43.103 support.google.com
74.125.43.103 tools.google.com
74.125.43.103 wap.google.com
74.125.43.103 answers.google.com
74.125.43.103 google-analystics.com
74.125.43.103 clients2.google.com
74.125.43.103 youtube.com
74.125.43.103 www.youtube.com
74.125.43.103 docs.google.com
209.85.229.99 youtube.com
209.85.229.99 www.youtube.com
209.85.227.101 translate.google.com
209.85.227.105 maps.google.com
209.85.227.101 code.google.com
209.85.227.113 pages.google.com
209.85.227.100 video.google.com
209.85.227.138 docs.google.com
209.85.227.101 sites.google.com
209.85.227.100 books.google.com
209.85.227.101 chrome.google.com
209.85.227.113 sketchup.google.com
209.85.227.102 froogle.google.com
209.85.227.102 labs.google.com
209.85.227.102 mars.google.com
209.85.227.139 moon.google.com
209.85.227.113 notebook.google.com
209.85.227.101 toolbar.google.com
209.85.227.102 catalog.google.com
209.85.227.113 codesearch.google.com
209.85.227.113 dir.google.com
209.85.227.138 earth.google.com
209.85.227.139 groups.google.com
209.85.227.100 groups.google.com.tr
209.85.227.139 shopping.google.com
209.85.227.138 sky.google.com
209.85.227.139 support.google.com
209.85.227.139 tools.google.com
209.85.227.102 wap.google.com
209.85.227.100 answers.google.com

Diplomamla adam öldürüyorum!



Can sıkıntısı... Uzun bir aradan sonra, bu yeni bir skin(11 Temmuz 2010). Mezuniyetimde verilen diplomayı CS:S'ye bıçak olarak modladım. :D Daha güzel dursun diye gerçeğinden farklı olarak okul logosunu ters çevirdim.

-Phong
-Normal map
-Yeni sesler
-Dünya modeli(diğer oyuncuların elinde gördüğünüz)


Model: Antarktikalı
Desenler: Antarktikalı
UV haritası: Antarktikalı
Derleme: Antarktikalı
Animasyon: Xero
Seslser: B.A.$witch

İndirmek için:
http://www.megaupload.com/?d=W5VFPQ4J

CS:S için döner bıçağı!!!




11 Eylül 2007 tarihinde yapmışım. İlk tam biten ve tamamen benim yaptığım skin'imdi.

İndirmek için:
http://www.megaupload.com/?d=J2WJYKVW

Dark Messiah dagger for CSS convert






25 Mayıs 2007, Dark Messiah: Might and Magic oyunundaki Shadowsteel Dagger'larını Counter-Strike:Source'a çevirdim. 2 elli animasyon vs... Videoyu izleyerek daha ayrıntılı görebilirsiniz ;)

İndirmek için:
http://www.megaupload.com/?d=L3ES9V2F

CS:S deagle skin: "Desert Evil"






17 Mayıs 2007, ilk yaptığım derleme. Tutacak kısmı karbon fiber, üst parçada ton farklı, dürbün ve lazer.(Lazerin çıktığı yerin aslında dürbünün pil kısmı olduğunu o zaman bilmiyordum, ama yine de güzel duruyor :D) Render için poz veren kişinin Sergün olduğunu da hala hatırlıyorum :P

İndirmek için:
http://www.megaupload.com/?d=J9MVJMZU