Türkiye'nin en yeni Ultima Online, Counter-Strike, LoL, Dota 2, E-spor oyunları ve daha birçok oyunla ilgili Türkçe oyun haber, bilgi, topluluk platformu. Türkiye'nin en yeni Ultima Online, Counter-Strike, LoL, Dota 2, E-spor oyunları ve daha birçok oyunla ilgili Türkçe oyun haber, bilgi, topluluk platformu.
  • ANASAYFA
  • FORUM
  • DOKÜMAN
  • DOWNLOAD
  • DISCORD
  • İLETİŞİM
   Üye ol    Giriş
    Doküman > Ultima Online > Runuo > RunUO 'ya Giriş 2

RunUO 'ya Giriş 2

  • Lucretius
  • March 21, 2005
  • 0 Yorumlar
  • 5.2K Görüntüleme
Şimdi bu başlığımızda RunUO Scripting e giriş yapacağız. Önce birkaç kod inceleyeceğiz. İlk kodumuzu ilerki konularda yazacağız (kesinlikle HelloWorld olmayacak..). Fakat ilk yapmanız gereken komut önekinizi (command prefix) "." olarak değiştirmek. [Değiştirmeyi %server& ın yeri% ScriptsCommands içindeki Handler.cs dosyasından yapabilirsiniz.] Çünkü çoğumuz gibi ben de nokta kullanmaya alışığım ve bazı arkadaşlar "[" ile ilgili sorun yaşıyorlar. Daha da önemlisi ben yazıyı buna göre yazacağım :). Ayrıca yazıyı orta seviyede bilgisi olan arkadaşlar için hazırladım, bazı konular anlaşılması kolay olsun diye yarı-yanlış bilgiler içerebilirler. Anlayan arkadaşlar anlamazdan gelsinler...

Bu aşamada hemen C# ile ilgili genel bilgilere girmemiz gerekli. Sphere ve diğer birkaç emülatörden farklı olarak RunUO bir yazılım dili kullanır. Bu yazılım dili C# tır. Burada dikkat edilmesi gereken nokta C ya da C++ değil, C# tır. C/C++ ve C# arasında tabiri caizse dağ kadar fark vardır. Yani bu kısmen bir isim aldatmacasıdır. C ve C++ evrensel olmayan (yani birkaç farklı versiyonu bulunan) dillerdir ve Microsoft 2001 yılında (ya da 2002, tam bilemiyorum) hem bu dilleri kısmen evrenselleştirmek hem de daha sağlam bir yazılım dili çıkarmak amacıyla .Net teknolojileri ile birlikte C# ı piyasaya sürmüştür. Yeri gelmişken C# ın "sağlam"lığına da değinelim. Microsoft un tanımıyla C# mid-level bir yazılım dilidir. Bu şu demek, yazılım dilleri en light olanından en katmerlisine doğru 5 e ayrılır. (böyle bir ayrım yapmak anlamsızdır ama Microsoft yapar..) C# bu noktada 3 numaralı basamaktadır. (aynı tabloda VB.NET 2 numaralı basamakta, assembly ise en tepede, 5 numaradadır. Diğerlerini hatırlamıyorum. Galiba C ailesi de 4. sıradaydı, ama emin değilim..) C# kısmen bellek yönetimine kadar izin verir. C# CaseSensitive yani büyük-küçük harf duyarlıdır. Ve bu konuda çok ısrarcıdır. Üstüne varmayın..
______________________

Yazılım dili denirse OOP ye (Object Oriented Programming e) de değinmek gerekir. C# pek tabii ki "Object Oriented" -nesne yönelimli-dir. ("Pek tabii ki"; diyorum çünkü -bence- artık nesne yönelimli olmayan dillere yer olmayacaktır. Hatta belki de, geleceğin veritabanları direkt nesne saklayacaklar.. (ikinci fikir benim değil)) Bu kavramı (OOP yi) burada anlatmam mümkün değil. Sadece OOP üzerine yazılmış kitaplar bile mevcuttur. Genel olarak bahsetmek gerekirse OOP ye giren dillerde bir nesne yaratabilir, bu nesneye onlarca property verebilir, subclasslar oluşturabilirsiniz. Pek tabii bu açıklama yeterli olmayacaktır, bir kitaptan araştırmanız sizin için çok daha sağlıklı olacaktır. Şimdilik OOP hakkında bilginiz olması gerekmese de bu işin bir ucu OOP den geçmek zorundadır.

Artık ısınma turlarına başlayabilir, usul usul kodumuza sokulabiliriz.
[Yazımda dil olarak tarzanca seçmek zorunda kaldım çünkü namespace, class gibi kelimeleri türkçeye çevirerek yazmak altyapısı olan arkadaşları zorlayacak ve yeni başlayan arkadaşların ingilizce metin okuyabilitesini düşürecektir. Bu kadar gevezelik yeter hadi koda girelim.]

İlk örneğimizi RunUO Guide başlığından aldığımız "drink" komutu ile ilgili scriptten başlayacağız ve bu scripti örnek olsun diye satır satır inceleyeceğiz.. Komutun kullanımı ".drink heal", ".drink cure" vs.. şeklinde olacak.

Ön açıklama:
Mobile: mobil. RunUO daki kullanımıyla NPCler yaratıklar oyuncular dahil hareketli herşey..
-------------------------------------------------------------------------------- 
using System; 
using System.Collections; 
using System.IO; 
using Server; 
using Server.Items; 
using Server.Mobiles; 
//burası kısayolları yaptığımız bölüm. (aslında böyle değil, fakat şimdilik böyle bilmeniz yeterli.) Kod içinde herhangi bir yerde Server namespace inin içinde World classına ulaşmak ve AddItem metodunu (function ın kardeşi) çağırmak isterseniz Server.World.AddItem yerine World.AddItem yazmanız yetecektir. Hatta "using Server.World"ü de eklerseniz direkt AddItem diyerek istediğiniz metoda ulaşabilirsiniz. 

namespace Server.Scripts.Commands 
{ 
public class Drink //Drink diye bir class oluşturuyoruz. 
{ 
public static void Initialize() //Initialize özel bir methoddur. Class yaratıldığında ne olacağını belirler. 
{ 
Server.Commands.Register( "Drink", AccessLevel.Player, new CommandEventHandler( Drink_OnCommand ) ); //Bu daha önceden bizim için hazırlanmış bir metod. Üç parametre alıyor. Birincisi komutun adı (Drink), ikincisi kimin kullanabileceği (AccessLevel.Player), üçünücüsü komutun EventHandler ı. Yani komut tetiklenince ne olacağını belirleyen bellek işaretleyicisi (oha. saçma oldu.) (Drink_OnCommand). Drink komutu kullanıldığında Drink_OnCommand diye bir EventHandler arayacak. 
} 

[Usage( "Drink" )] //Dokümanlarda çıkacak açıklama. 
public static void Drink_OnCommand( CommandEventArgs e ) //Burada EventHandler ımızı tanımlıyoruz. CommandEventArgs e bölümü bize e adında bir parametre sağlıyor. Bu e ile komut ile ilgili bazı şeylere ulaşabileceğiz. 
{ 
Mobile from = e.Mobile; //from adında bir mobil tanımladık ve onu e nin mobiline yani komutu yollayan mobile eşitledik. 
if (from==null) return; //eğer from un karşılığı yoksa, yani bir şekilde from oluşmazsa, komut yanlış bir şeye uygulanırsa vs.. koddan çıkılacak. 
Container bp = from.Backpack; //bp adında bir container tanımladık ve bunu from un backpack ine eşitledik. 
if (bp==null) return; //eğer bp diye bir container yoksa koddan çıkılacak. 
Type type = null; //type isminde bir tip tanımladık ve "hiç"liğe eşitledik. 

if (e.Arguments.Length != 0) //eğer komutla gelen argümanların (parametrelerin) uzunluğu sıfıra eşit değilse, yani komutla birlikte bir parametre yazıldıysa 
{ 
switch (e.Arguments[0]) //switch bloğu. if bloğunun kardeşi. Komutla gelen argümanların birincisini (e.Arguments[0] bir dizeyi ifade ediyor. 0 ise ilk üyeyi verir.) sorgulayacağız. 
{ 
default : //default boş bırakılmış. 
case "heal" : type = typeof(BaseHealPotion);break; //eğer gelen argüman heal ise daha önceden yarattığımız type ı heal potion a eşitliyoruz. break ise switch bloğundan çıkıyor. 
case "cure" : type = typeof(BaseCurePotion);break; 
case "refresh" : type = typeof(BaseRefreshPotion);break; 
case "night" : type = typeof(NightSightPotion);break; 
} 
} 
else //if bloğunun geçersiz olduğu durumda.. 
{ 
from.SendMessage("Usage: Drink [heal/cure/refresh/night]"); //from a "Usage: ..." şeklinde bir mesaj dönecek. 
return; //ve bloktan çıkılacak. 
} 

BasePotion potion = (BasePotion)bp.FindItemByType(type); //potion adından bir BasePotion tanımladık ve bp container ındaki (hatırlarsanız from’un backpack iydi bu) type isimli tipe eşitledik. 
if (potion==null) //eğer potion adındaki BasePotion’ımız "hiç" ise. Bu demektir ki çantada potion yok.. 
{ 
from.SendMessage("You dont have any potions"); //from a yandaki mesaj dönecek. 
return; //ve her zamanki gibi bloktan çıkılacak. 
} 

potion.Drink( from); //potion isimli BasePotion un drink metodu kullanılacak. İçecek kişi ise from 
} 
} 
} 
--------------------------------------------------------------------------------

İkinci kodumuz daha nacizane bir kod. Aynı başlıktaki "regs" komutu:
Bunu satır satır değil de ince noktalarını açıklayarak geçeceğim.

-------------------------------------------------------------------------------- 
using System; 
using System.Collections; 
using Server; 
using Server.Items; 
using Server.Targeting; 
using Server.Mobiles; 


namespace Server.Scripts.Commands 
{ 
public class Regs //regs diye bir class oluşturulmuş yine. 
{ 
public static void Initialize() //class yaratılınca... 
{ 
Server.Commands.Register("regs",AccessLevel.Player, new CommandEventHandler( Regs_OnCommand)); //regs komutunu yukarıdaki gibi kaydediyoruz. 
} 
/*Burası değişken tanımlama bölümünün başlangıcı 
private static Type[] regs = { typeof(BlackPearl), typeof(Bloodmoss), 
typeof(Garlic), typeof(Ginseng), 
typeof(MandrakeRoot), typeof(Nightshade), 
typeof(SulfurousAsh), typeof(SpidersSilk)}; //şimdi bu bölüm bayağı karışık. İsteyen arkadaşlar direkt es geçebilir. regs adında Type türünde bir dizi (array) tanımladık. Ve parantez içindekileri üyeleri olarak kaydettik. 8 üyeli (0-7) bir dizimiz oldu. 

private static string[] regs_name = {"BP","BM","GA","GI","MR","NS","SA","SS"}; //reg adlarının kısaltılmışlarından oluşan, regs_name adında string bir dizimiz oldu. 
/*Değişkenlerimizi tanımladık. Şimdi EventHandler a geçiyoruz. 
public static void Regs_OnCommand( CommandEventArgs e) //Regs_OnCommand adındaki EventHandler ımız ve yine CommandEventArgs türündeki, e adındaki parametremiz, argümanımız.. 
{ 
Mobile mob = e.Mobile; //mob adında bir mobil tanımladık ve komutla birlikte gelen argümanın mobiline yani komutu çalıştıran mobile eşitledik. 
Container bp = mob.Backpack; //yine bp adında bir container yarattık ve mob un backpack ine eşitledik. 
if (bp == null) {return;} //bp diye birşey yoksa, yani bp==hiç ise.. 

string res=""; //res adında, boş bir metne eşit metinsel bir değişken tanımladık 
string nf=""; //nf adında, boş bir metne eşit metinsel bir değişken tanımladık 
int count=0; //count adında 0 a eşit sayısal bir değişken tanımladık. 

for (int i=0;i<regs.Length;i++) //bir for-each döngüsüne giriyoruz. 0 a eşit, i adında sayısal bir değişkenimiz var, i regs in uzunluğundan küçük oldukça döngü devam edecek, döngü her başa döndüğünde i bir artacak. 
{ 
try //try-catch bloğu hata kaldırma ihtimali yüksek bir kod çalıştırılmadan kullanılır. Amacı hata verdiği zaman crash yerine bizim istediğimizi yaptırmaktır. Try ın altındakileri dener, hata verirse Catch in altındakilere girişir. 
{ 
count = bp.GetAmount(regs[ i],true); //count u bp deki "regs" in sayısına eşitledik. Hatırlarsanız regs bir diziydi ve içinde 8 üyesi vardı. 
if (count > 10 ) 10 dan büyükse ve değilse diye ayırdık, ona göre renk değiştireceğiz.. 
{ 
if ((res.Length !=0) && (i<regs.Length)) res += ", "; //res in uzunluğu sıfırdan büyükse ve i regs dizisindeki üye sayısından küçükse res e ", " ekliyoruz. 
res += regs_name[i ]+":"+count.ToString(); //res e regs_name i, ":" ve count un değerini yani sayısını ekliyoruz. 
} 
else //10 dan büyük değilse aynı işlemleri nf için yapıyoruz. 
{ 
if ((nf.Length !=0) && (i<regs.Length)) nf +=", "; 
nf += regs_name[i ]+":"+count.ToString(); 
} 
} 
catch //hata yakalarsa 
{ 
break; //koddan çıkacak. 
} 
} 
if (res.Length == 0 && nf.Length==0) //res de nf de 0 uzunluktaysa 
{ 
mob.SendAsciiMessage(40,"No regs was found !"); //reginiz yok gibisinden bir mesaj dönecek. Mesaj rengi 40 
} 
else 
{ 
if (res.Length != 0 ) mob.SendAsciiMessage(76, res); //eğer res 0 dan uzunsa (bu durumda nf sıfırdır) mob a 76 renginde bir mesaj göndereceğiz. Mesaj res i içerecek. 
if (nf.Length != 0) mob.SendAsciiMessage( 40, nf); //eğer nf nin uzunluğu 0 değilse (bu durumda da res ==0 dır) 40 renginde mesaj göndereceğiz ve mesaj nf i içerecek. 
} 
} 
} 
} 
--------------------------------------------------------------------------------

Üye Ol veya Giriş Yap

Bu içeriğe yorum atmak istiyorsanız hemen üye olun veya giriş yapın.

Yorumlar (0)

Henüz yorum yapılmamış
Sadece kayıtlı kullanıcılar yeni yorum yapabilir.
Beğeni Takipçi Üye Takipçi
Benzer Sayfalar
  • Sphere 56b ye Giriş

    October 08, 2005

  • C/C++ dillerine giriş

    June 04, 2006

  • Sphere 55i ye Giriş

    April 27, 2005

  • Sphere 55r ye Giriş

    June 08, 2005

  • Ultima Online\'a Giriş 2

    February 04, 2007



  • Son Forumlar
  • Sayfalar
  • Erlik UO
    Erlik UO II ServUO - RunUO

    Sunucular 1 weeks önce

  • beth
    Tc Simülasyonu Uo Server

    Sunucular 1 weeks önce

  • dealer666
    UO AOS PvP Free Shard

    Sunucular 2 weeks önce

  • genesis07
    Şuan oynanacak uzun soluklu server

    Sunucular 2 weeks önce

  • beth
    Ultimate World

    Sunucular 1 months önce

  • Fizban
    Regnum UO

    Sunucular 1 months önce

  • pawnless
    Ultima ya geri dönün

    Ultima Online 1 months önce

  • pawnless
    pvp sunucu kurmak istiyorum ama

    Ultima Online 1 months önce

  • Bütün bir yıl çok çalıştılar, çok fazla mücadele ettiler ve artık sona geldiler.

    ESL One Cologne 2017

    June 30, 2017

  • Activision yetkililerinin yaptığı açıklamaya göre Cod:MW Remastered, Infinite Warfare’den ayrı bir oyun olarak satılmaya başlanacak.

    Call of Duty Modern Warfare Remastered açıklandı!

    June 24, 2017

  • Artık gelenekselleşen Steam mevsim indirimlerinin en sevileninin zamanı geldi kapımıza dayandı.

    Steam Yaz İndirimi 2017 Rehberi

    June 22, 2017

  • Ultima Online için unoffical DLC

    Ultima LandFall

    June 18, 2017

  • Simple Radar - Kullanışlı ve Basit Radar

    June 03, 2017

  • CS:GO FPS Arttırma ile ilgili detaylı bilgilendirici faydalı döküman

    CS:GO FPS Arttırma ile İlgili Herşey

    May 28, 2017

  • Easy Vibrance enhancer v1.3.0.1

    May 09, 2017

  • Vibrance GUI

    March 31, 2017

Menü

ANASAYFA
FORUM
DOKÜMAN
DOWNLOAD
İLETİŞİM
Ideamedia
© 2004 - 2023 Ultima-Strike. Her hakkı saklıdır.