Türkiye'nin en eski ve aktif online oyun platformu, Ultima Online, Counter-Strike ve diğer online oyunlar hakkında Türkçe haber, bilgi ve forum sunuyor. Türkiye'nin en eski ve aktif online oyun platformu, Ultima Online, Counter-Strike ve diğer online oyunlar hakkında Türkçe haber, bilgi ve forum sunuyor.
  • ANASAYFA
  • ULTIMA ONLINE
    • Ultima Online Oyuncu Rehberi

      Ultima Online Oyuncu Rehberi

      Oyunu hakkında tanıcı bilgiler ve ipuçları

    • Ultima Online Server List

      Ultima Online Server List

      Önemli özellikleri ve online oyuncu sayıları

    • Ultima Online Script

      Ultima Online Script

      Sphere, RunUO, Razor scriptleri

    • Ultima Online Forum

      Ultima Online Forum

      UO hakkında görüş alışverişi

  • FORUM
  • DOKÜMAN
  • İNDİR
  • DISCORD 20
   Üye ol    Giriş
261
  1. Doküman
  2. Ultima Online
  3. Runuo
  4. RunUO 'ya Giriş 2
Lucretius

RunUO 'ya Giriş 2

  • Lucretius
  • Mum Chamber
  • 2005-03-21 16:03
  • 0 Yorumlar
  • 5721 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. 
} 
} 
} 
} 
--------------------------------------------------------------------------------

Değerlendirmeler

9 (9)

1 Kullanıcı

Üye Ol veya Giriş Yap

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

Discord ile Bağlan
Twitch ile Bağlan
Steam ile Bağlan
Google ile Bağlan
Yorumlar (0)
Henüz yorum yapılmamış
Sadece kayıtlı kullanıcılar yeni yorum yapabilir.


Ultima-Strike Discord
Benzer Sayfalar
  • Sphere 55r ye Giriş

    2005-06-08 12:06

  • C/C++ dillerine giriş

    2006-06-04 21:33

  • Sphere 56b ye Giriş

    2005-10-08 08:05

  • Sphere 55i ye Giriş

    2005-04-27 04:01

  • Ultima Online\'a Giriş

    2006-11-25 21:45



  • Son Forumlar
  • Sayfalar
  • Administraktor
    Üyeliği 15 yıl ve üzerinde olanlar.

    Ultima Online 47 dakika önce

  • Nefrelius
    Alcor UO Reborn

    Sunucular 5 gün önce

  • System_Error
    Client Patlaması

    Ultima Online 1 hafta önce

  • georgm15
    CS2 turnuvaları tartışmalı başladı.

    Counter-Strike 2 1 hafta önce

  • georgm15
    Counter-Strike 1.6 İndir - Tek Link Hızlı-

    Counter-Strike 1 hafta önce

  • Cihangir algın
    Razor Kullanımı

    RunUo Scripting 3 hafta önce

  • Lucretius
    Rampage Pvp

    Sunucular 4 hafta önce

  • Lucretius
    Nephilim Pvp

    Sunucular 4 hafta önce

  • redi4817
    NightUO

    Sunucular 4 hafta önce

  • Cengiz MERDİT
    Sphere 56T Nightly Sürümü

    Ultima Online 1 ay önce

  • aygun
    Esgaroth UO

    Sunucular 1 ay önce

  • deonist
    Alysa Pvp ( Aktif ! )

    Sunucular 1 ay önce

  • mthN
    Nebula Uo gerçekleri

    Ultima Online 2 ay önce

  • buffa
    Kullanılması Gereken Rate Ayarları

    Counter-Strike 2 ay önce

  • Lucretius
    Aktif Satılık Server !

    Sunucular 2 ay önce

  • Skill seçimlerinizi planlamak artık çok daha kolay

    Ultima Online Karakter Yapılandırma Aracı Bölümü Açıldı!

    2024-10-31 22:47

  • Ultima Online topluluğu, ClassicUO'nun sadece web client olarak kullanılabileceğinin açıklanmasının ardından tepkili.

    Resmi UO, Oyuncuları İkiye Böldü: Web Client Yeterli mi?

    2024-10-14 17:45

  • Ultima Online, ClassicUO ile resmi işbirliği yapıyor! Performans iyileştirmeleri, geniş oyun penceresi ve daha fazlası geliyor.

    Ultima Online, ClassicUO ile Resmi İşbirliğine Gidiyor

    2024-09-26 14:21

  • Centred#

    2024-07-08 22:50

  • CentrED+ 7.9

    2024-07-08 22:34

  • Distance(uzaklık) Sorgusu Hakkında

    2024-06-19 22:05

  • UoFiddler

    2024-06-01 02:19

  • UoFiddler ile Map Kopyalama

    2024-05-31 21:17

Menü
  • ANASAYFA
  • FORUM
  • DOKÜMAN
  • İNDİR
  • İLETİŞİM
  • Bağlantılar
  • CS 1.6 indir
  • CS 1.6 Türkçe
  • CS 1.6 Bot
  • CS 1.6 CFG
  • CS 1.6 Rate Ayarları
  • UO Server
  • Ghost Mouse indir
  • FPS Nedir?
  • Ultima Online PVP Server
  • Makroman
  • UO Karakter Yapılandırma
    © 2004 - 2025 Ultima-Strike. Her hakkı saklıdır.