TrayhopeR
www.trayhoper.net
- May
- 2,830
- 62
Arkadaşlar ebenezerin sourcelarını açarak kodları baştan aşağı inceledim.Çevirebildiğim kadarı ile sizlere ebenezerin oyun içinde nasıl bir sistem uguladığını anlatmaya çalışacağım ^^
Aşağıdaki kod yeni karakter açarken stat toplamlarının 300 den büyük olmasıyla işleyecek kodları içeriyor :
Bu şekilde datadaki new_char_value.tbl den düzenlenerek yeni bir karakter açılmıyor ^^
-------------------------------------------
Aşağıdaki kod birine trade attığınızda işleyecek kodları içeriyor :
REQ = Istek
AGREE = Kabul Ettiğinizde
ADD = Item Koyduğunuzda
DECIDE = Onaylamadığınızda
CANCEL = X e basıp kapattığınızda
-------------------------------------------
Aşağıdaki kod kullanıcının kullandığı komutun işlemesi için gm olup olmadığını kontrol ediyor :
return;
altındada eğer 0 ise işleyecek komutlar yer alıyor.Yani oyunun zamanını ve havasını değiştirme kodları
------------------------------------------
Aşağıdaki kod ya skill veya stat sıfırlarken istediği para veya para event olduğunda artacak miktarı gösteriyor :
ilk satır karakterin lwl ini 2 ile çarpıp pow komutu ile üssünü alıyor.3.4 nedir bilmiyorum ..
aşağıdaki satırsa salak birşey yapıyor 100 e bölüp 100 ile çarpıyor bunun mantığını anlamadım :S
3. satırda karakter lwl i 30 dan düşükse parasını 0.4 ile çarpıyor
30 - 60 arasında ise parasının 2 katını veriyor
60 - 90 arasında ise parasının 3 katını veriyor

-----------------------------------------
Aşağıdaki kod master olduktan sonra title ın string olarak nasıl değişeceğini belirliyor :
CLECRIC master olunca DRUID oluyormuş demekki gerçekten bilmiyordum 
----------------------------------------
Aşağıdaki kod str nizin yetmediği bir silahı giyememeniz için yazılmş.Yani yeterli statınız ve lwliniz yoksa giyemiyorsunuz
ReqIntel yani itemin gerekli int seviyesi ">" bizim userdatadaki Intel sekmesindeki değerimizden yüksekse return FALSE oluyor ve işlem kesiliyor 
----------------------------------------
Aşağıdaki kodda inn hostess e max 2.100.000.000 ve 0 ın üstünde bir para koyulabileceğini açıklıyor :
aslında burda fazla konulursa hata vereceği açıklanıyor ama dediğimide bu kodlardan cıkartabiliriz ..
----------------------------------------
Aşağıdaki kod sayılabilir nesnelerin (pot,sc vb.) ağırlıklarının karakterimizin ağırlığından daha fazla olduğunda hata vereceğini açıklıyor ..
Tablodaki ağırlık alınıyor ve count yani miktarı kadar çarpılıyor.Buna itemin gerçek ağırlığıda eklenip karakter ağırlığı ile karşılaştırılıyor 
----------------------------------------
Aşağıdaki kodda yukarıdakinin sayılamayanları için yapılmış olanı
Tablodan ağırlık alınıyor.Sayılamadığı için zaten 1 tane olacak ve miktarı kadar çarpılmadan gerçek ağırlığı ile toplanıyor ..
----------------------------------------
Aşağıdaki kodda party ile ilgili bir işlem yapıldığında party sayısı 8 den aşağı olana kadar işlem yapılıyor ..
Ne işlem yapıldığı belli değil bende anlayamadım ..
----------------------------------------
Aşağıdaki kodda skill açtırmak için lwl kontrolü yapılıp skill açılıyor
10 lwl değilse yapılacak işlemde bu kodda verilmiş ..
----------------------------------------
Aşağıdaki kodda karakter 80 den büyük bir lwl e ulaştığında hata verilmesini istiyor.Bu kod AllPointChange altında yazıyor.
Acaba onlarda 80 lwl birinin stat sıfırladığında hata oluşturduğunu biliyormuydu ?
İlginç birşey belki bu sayı 90 olarak değiştirilebilirse stat buguda kalkabilir ..
----------------------------------------
Aşağıdaki kodda ise yeni karakter oluşturulurken verilen stat lar gösteriliyor ..
Ben sadece barbar ve orc warrior un bölümünü gösterdim.Diğer tüm classların var ...
----------------------------------------
Aşağıdaki kodda karakterin userdatadaki points i veriliyor ama points in ne işe yaradığını bilmiyorum .. Yani bu kod ne için uygulanıyor
meçhul birşey
Karakterin lwlinden 1 azaltılıyor,3 ile çarpılıp 10 ile toplanıyor.Seeking party için olabilirmi diye düşündüm ama sonra mantıksız geldi 
----------------------------------------
Aşağıdaki kodda cz de adam kestiğinizde karşıdakinin parasının yarısının size gelmesi için belirtilen konum şartı var.Yani sadece battle zonelarda
keserseniz karşınızdakinin parasının yarısı size gelir ..
Buda zone değeri 3 den az olduğu alanları içeriyor sanırım ..
----------------------------------------
Aşağıdaki kodda ebenezer kullanıcının kesildiğinimi yoksa adam kestiğinimi anlıyor.Client 1 gönderirse kesti,2 gönderirse kesildi olarak algılıyor.
1 Gönderdiğinde para ve np alıyorsunuz,2 gönderdiğinde para ve np kaybediyorsunuz
0 gönderirse ne bilmiyorum 
----------------------------------------
Aşağıdaki kod ise cz de adam kestiğinizde para size geliyor ya , party ile kestiğinzde para ya yapılan matematiksel işlemleri içeriyor ..
PartyIndex partydeki kişi sayısı olarak pParty değişkenine alınıyor.pPart de değer varsa (!pParty) karakterin userdatadaki gold
değeri 4 ile çarpılıyor,10 ile bölünüyor.Yukarıda anlatmıştım 1 kazanmak,2 kaybetmeti.Eğer değer 1 ise 4 ile çarpılıp 10 a bölünüyor
kaybedilincede direkt 2 ye bölünüyor.Yani paranızın yarısı karşıya gitmiş oluyor
----------------------------------------
Aşağıdaki kodda savaş esnasında kesilen orc ve human sayısına göre savaşın kimin kazandığını anlayan kod
Yani kazanan takım kontrol ediliyor ..
----------------------------------------
Aşağıdaki kodda biri sizi arkadaş olarak eklediğinde neler yapılacağı yazıyor.
----------------------------------------
Aşağıdaki kod ise seeking party açtığınızda neler olduğunu anlatıyor ..
Karakter NeedParty değişkeni 2 olduğunda partysiz , 1 olduğunda party li bir muhamele görür 
----------------------------------------
Aşağıdaki kod ise inn hostess de eski versionlarda bulunan Trade Board sistemi için.Biz onu şimdi Item Rental
olarak kullanıyoruz.Elbet biraz gelişmişini
Item koyarken register,silerken ise delete subu kullanılıyor ..
-----------------------------------
Aşağıdaki kodda ise yukarıda bahsettiğim trade board dan item alırken aldığınız itemin fiyatı sizin paranızdan
büyük olduğunda neler yapılacağını anlatıyor
Userdatadaki gold sekmesindeki değer BUY_POST_PRICE değişkeninden küçükse - ki bu değişkenin değeri
oyundan geliyor - hata verdiriyor ..
-----------------------------------
Evet arkadaşlar inşallah beğenmişsinizir.Ebenezer dediğiniz velet bundan ibaret.En azından benim anladığım kadarı ile
Alıntı olmadığını anlamışsınızdır umarım
Aşağıdaki kod yeni karakter açarken stat toplamlarının 300 den büyük olmasıyla işleyecek kodları içeriyor :
Kod:
sum = str + sta + dex + intel + cha;
if( sum > 300 ) {
result = 0x02;
goto fail_return;
-------------------------------------------
Aşağıdaki kod birine trade attığınızda işleyecek kodları içeriyor :
Kod:
void CUser::ExchangeProcess(char *pBuf)
{
int index = 0;
BYTE subcommand = GetByte( pBuf, index );
switch( subcommand ) {
case EXCHANGE_REQ:
ExchangeReq( pBuf+index );
break;
case EXCHANGE_AGREE:
ExchangeAgree( pBuf+index );
break;
case EXCHANGE_ADD:
ExchangeAdd( pBuf+index );
break;
case EXCHANGE_DECIDE:
ExchangeDecide();
break;
case EXCHANGE_CANCEL:
ExchangeCancel();
break;
}
}
AGREE = Kabul Ettiğinizde
ADD = Item Koyduğunuzda
DECIDE = Onaylamadığınızda
CANCEL = X e basıp kapattığınızda
-------------------------------------------
Aşağıdaki kod kullanıcının kullandığı komutun işlemesi için gm olup olmadığını kontrol ediyor :
Kod:
if( m_pUserData->m_bAuthority != 0 ) // is this user administrator?
return;
altındada eğer 0 ise işleyecek komutlar yer alıyor.Yani oyunun zamanını ve havasını değiştirme kodları
------------------------------------------
Aşağıdaki kod ya skill veya stat sıfırlarken istediği para veya para event olduğunda artacak miktarı gösteriyor :
Kod:
money = pow(( m_pUserData->m_bLevel * 2 ), 3.4);
money = ( money / 100 )*100;
if( m_pUserData->m_bLevel < 30) money = money * 0.4;
else if( m_pUserData->m_bLevel >= 30 && m_pUserData->m_bLevel < 60 ) money = money * 1;
else if( m_pUserData->m_bLevel >= 60 && m_pUserData->m_bLevel <= 90 ) money = money * 1.5;
aşağıdaki satırsa salak birşey yapıyor 100 e bölüp 100 ile çarpıyor bunun mantığını anlamadım :S
3. satırda karakter lwl i 30 dan düşükse parasını 0.4 ile çarpıyor
30 - 60 arasında ise parasının 2 katını veriyor
60 - 90 arasında ise parasının 3 katını veriyor
-----------------------------------------
Aşağıdaki kod master olduktan sonra title ın string olarak nasıl değişeceğini belirliyor :
Kod:
classcode = GetByte( pBuf, index );
switch( m_pUserData->m_sClass ) {
case KARUWARRRIOR:
if( classcode == BERSERKER || classcode == GUARDIAN )
bSuccess = TRUE;
break;
case KARUROGUE:
if( classcode == HUNTER || classcode == PENETRATOR )
bSuccess = TRUE;
break;
case KARUWIZARD:
if( classcode == SORSERER || classcode == NECROMANCER )
bSuccess = TRUE;
break;
case KARUPRIEST:
if( classcode == SHAMAN || classcode == DARKPRIEST )
bSuccess = TRUE;
break;
case ELMORWARRRIOR:
if( classcode == BLADE || classcode == PROTECTOR )
bSuccess = TRUE;
break;
case ELMOROGUE:
if( classcode == RANGER || classcode == ASSASSIN )
bSuccess = TRUE;
break;
case ELMOWIZARD:
if( classcode == MAGE || classcode == ENCHANTER )
bSuccess = TRUE;
break;
case ELMOPRIEST:
if( classcode == CLERIC || classcode == DRUID )
bSuccess = TRUE;
break;
}
----------------------------------------
Aşağıdaki kod str nizin yetmediği bir silahı giyememeniz için yazılmş.Yani yeterli statınız ve lwliniz yoksa giyemiyorsunuz
Kod:
BOOL CUser::ItemEquipAvailable(_ITEM_TABLE *pTable)
{
if( !pTable )
return FALSE;
// if( pTable->m_bReqLevel > m_pUserData->m_bLevel )
// return FALSE;
if( pTable->m_bReqRank > m_pUserData->m_bRank )
return FALSE;
if( pTable->m_bReqTitle > m_pUserData->m_bTitle )
return FALSE;
if( pTable->m_bReqStr > m_pUserData->m_bStr )
return FALSE;
if( pTable->m_bReqSta > m_pUserData->m_bSta )
return FALSE;
if( pTable->m_bReqDex > m_pUserData->m_bDex )
return FALSE;
if( pTable->m_bReqIntel > m_pUserData->m_bIntel )
return FALSE;
if( pTable->m_bReqCha > m_pUserData->m_bCha )
return FALSE;
return TRUE;
}
----------------------------------------
Aşağıdaki kodda inn hostess e max 2.100.000.000 ve 0 ın üstünde bir para koyulabileceğini açıklıyor :
Kod:
if( itemid == ITEM_GOLD ) {
if( m_pUserData->m_iGold+count > 2100000000 ) goto fail_return;
if( m_pUserData->m_iBank-count < 0 ) goto fail_return;
----------------------------------------
Aşağıdaki kod sayılabilir nesnelerin (pot,sc vb.) ağırlıklarının karakterimizin ağırlığından daha fazla olduğunda hata vereceğini açıklıyor ..
Kod:
if (pTable->m_bCountable) { // Check weight of countable item.
if (((pTable->m_sWeight * count) + m_sItemWeight) > m_sMaxWeight) {
goto fail_return;
----------------------------------------
Aşağıdaki kodda yukarıdakinin sayılamayanları için yapılmış olanı
Kod:
else { // Check weight of non-countable item.
if ((pTable->m_sWeight + m_sItemWeight) > m_sMaxWeight) {
goto fail_return;
}
}
----------------------------------------
Aşağıdaki kodda party ile ilgili bir işlem yapıldığında party sayısı 8 den aşağı olana kadar işlem yapılıyor ..
Kod:
while(count<8) {
select_user = pParty->uid[pParty->bItemRouting];
if( select_user >= 0 && select_user < MAX_USER ) {
----------------------------------------
Aşağıdaki kodda skill açtırmak için lwl kontrolü yapılıp skill açılıyor
Kod:
void CUser::ClassChangeReq()
{
char send_buff[128]; memset( send_buff, NULL, 128 );
int send_index = 0;
SetByte( send_buff, WIZ_CLASS_CHANGE, send_index );
SetByte( send_buff, CLASS_CHANGE_RESULT, send_index );
if( m_pUserData->m_bLevel < 10 )
SetByte( send_buff, 0x02, send_index );
else if ( (m_pUserData->m_sClass % 100) > 4 )
SetByte( send_buff, 0x03, send_index );
else
SetByte( send_buff, 0x01, send_index );
Send( send_buff, send_index );
}
----------------------------------------
Aşağıdaki kodda karakter 80 den büyük bir lwl e ulaştığında hata verilmesini istiyor.Bu kod AllPointChange altında yazıyor.
Acaba onlarda 80 lwl birinin stat sıfırladığında hata oluşturduğunu biliyormuydu ?
Kod:
if( m_pUserData->m_bLevel > 80 ) goto fail_return;
----------------------------------------
Aşağıdaki kodda ise yeni karakter oluşturulurken verilen stat lar gösteriliyor ..
Kod:
case KARUS_BIG:
if( m_pUserData->m_bStr == 65 && m_pUserData->m_bSta == 65 && m_pUserData->m_bDex == 60 && m_pUserData->m_bIntel == 50 && m_pUserData->m_bCha == 50 ) {
type = 0x02;
goto fail_return;
}
m_pUserData->m_bStr = 65;
m_pUserData->m_bSta = 65;
m_pUserData->m_bDex = 60;
m_pUserData->m_bIntel = 50;
m_pUserData->m_bCha = 50;
break;
case BABARIAN:
if( m_pUserData->m_bStr == 65 && m_pUserData->m_bSta == 65 && m_pUserData->m_bDex == 60 && m_pUserData->m_bIntel == 50 && m_pUserData->m_bCha == 50 ) {
type = 0x02;
goto fail_return;
}
m_pUserData->m_bStr = 65;
m_pUserData->m_bSta = 65;
m_pUserData->m_bDex = 60;
m_pUserData->m_bIntel = 50;
m_pUserData->m_bCha = 50;
break;
----------------------------------------
Aşağıdaki kodda karakterin userdatadaki points i veriliyor ama points in ne işe yaradığını bilmiyorum .. Yani bu kod ne için uygulanıyor
meçhul birşey
Kod:
m_pUserData->m_bPoints = (m_pUserData->m_bLevel-1) * 3 + 10;
----------------------------------------
Aşağıdaki kodda cz de adam kestiğinizde karşıdakinin parasının yarısının size gelmesi için belirtilen konum şartı var.Yani sadece battle zonelarda
keserseniz karşınızdakinin parasının yarısı size gelir ..
Kod:
if (m_pUserData->m_bZone < 3) return;
----------------------------------------
Aşağıdaki kodda ebenezer kullanıcının kesildiğinimi yoksa adam kestiğinimi anlıyor.Client 1 gönderirse kesti,2 gönderirse kesildi olarak algılıyor.
1 Gönderdiğinde para ve np alıyorsunuz,2 gönderdiğinde para ve np kaybediyorsunuz
Kod:
BYTE s_type = 0; BYTE t_type = 0;
----------------------------------------
Aşağıdaki kod ise cz de adam kestiğinizde para size geliyor ya , party ile kestiğinzde para ya yapılan matematiksel işlemleri içeriyor ..
Kod:
_PARTY_GROUP* pParty = NULL;
pParty = m_pMain->m_PartyArray.GetData( m_sPartyIndex );
if( !pParty ) return;
s_type = 1 ; t_type = 2 ;
s_temp_gold = (pTUser->m_pUserData->m_iGold * 4) / 10;
t_temp_gold = pTUser->m_pUserData->m_iGold / 2;
pTUser->m_pUserData->m_iGold -= t_temp_gold;
değeri 4 ile çarpılıyor,10 ile bölünüyor.Yukarıda anlatmıştım 1 kazanmak,2 kaybetmeti.Eğer değer 1 ise 4 ile çarpılıp 10 a bölünüyor
kaybedilincede direkt 2 ye bölünüyor.Yani paranızın yarısı karşıya gitmiş oluyor
----------------------------------------
Aşağıdaki kodda savaş esnasında kesilen orc ve human sayısına göre savaşın kimin kazandığını anlayan kod
Kod:
if (m_pUserData->m_bNation == KARUS) {
m_pMain->m_bKarusFlag++;
}
else if (m_pUserData->m_bNation == ELMORAD) {
m_pMain->m_bElmoradFlag++;
}
Bu kodun hemen altında :
m_pMain->BattleZoneVictoryCheck();
----------------------------------------
Aşağıdaki kodda biri sizi arkadaş olarak eklediğinde neler yapılacağı yazıyor.
Kod:
switch( subcommand ) {
case FRIEND_REQUEST:
FriendRequest(pBuf+index);
break;
case FRIEND_ACCEPT:
FriendAccept(pBuf+index);
break;
Aşağıdaki kod ise seeking party açtığınızda neler olduğunu anlatıyor ..
Kod:
void CUser::PartyBBSRegister(char *pBuf)
{
CUser* pUser = NULL;
int index = 0, send_index = 0;
BYTE result = 0; short bbs_len = 0;
char send_buff[256]; memset(send_buff, NULL, 256);
int i = 0, counter = 0;
if (m_sPartyIndex != -1) goto fail_return; '' Party ye girildiğinde değişen sPartyIndex değeri
if (m_bNeedParty == 2) goto fail_return; '' Party ye gereksinim olduğunda değişen needparty değeri
sPartyIndex -1 olduğunda partydeki kişi sayısı 1 artıyor.Yani sPartyIndex PartyBBSRegister sub u altında
8 - partydeki kişi sayısı değerini alıyor :)
----------------------------------------
Aşağıdaki kod ise inn hostess de eski versionlarda bulunan Trade Board sistemi için.Biz onu şimdi Item Rental
olarak kullanıyoruz.Elbet biraz gelişmişini
Kod:
case MARKET_BBS_REGISTER :
MarketBBSRegister(pBuf+index);
break;
case MARKET_BBS_DELETE :
MarketBBSDelete(pBuf+index);
break;
-----------------------------------
Aşağıdaki kodda ise yukarıda bahsettiğim trade board dan item alırken aldığınız itemin fiyatı sizin paranızdan
büyük olduğunda neler yapılacağını anlatıyor
Kod:
if (buysell_index == MARKET_BBS_BUY) {
if (m_pUserData->m_iGold < BUY_POST_PRICE) {
sub_result = 2;
goto fail_return;
}
}
oyundan geliyor - hata verdiriyor ..
-----------------------------------
Evet arkadaşlar inşallah beğenmişsinizir.Ebenezer dediğiniz velet bundan ibaret.En azından benim anladığım kadarı ile
2.000.000 TL ⚔️ Ödüllü MYKOv2 GENESIS | 24 Nisan 2026 ⚔️ Resmi Açılış Başlıyor!