Blog'dan Yazılar

Sizler için profesyonel yazarlarımız ile hazırladığımız makalelerimizi okuyun ve kendinizi geliştirin.

Kalıcı Bağlantılı Veritabanı Bağlantıları (Persitent Connections)
Kalıcı Bağlantılı Veritabanı Bağlantıları (Persitent Connections)
Kalıcı bağlantılar betiğinizin çalışması bittiğinde kapanmayan bağlantılardır. Bir kalıcı bağlantı istendiğinde PHP evvelce açılmış eşdeğer bir kalıcı bağlantı var mı diye bakar ve varsa onu kullanır. Yoksa yeni bir bağlantı oluşturur. Bir 'eşdeğer' bağlantı, aynı konağa (uygulanabildiği takdirde) aynı kullanıcı adı ve parola kullanılarak açılmış bağlantıdır. HTTP sunucuları hakkında tam bilgi sahibi olmayan kişiler ne yaptıklarını bilmeden yükü yanlış kalıcı bağlantılara dağıtabilir ve bu yanlış bağlantılarla çalışabilirler. Özellikle, size aynı bağlantı üzerinde 'kullanıcı oturumları' açma olanağını, verimli hareket işlemleri kurulmasını ve başka birçok şeyi bir bütün halinde sağlamazlar. Aslında, son derece net olarak, kalıcı bağlantılar, kalıcı olmayan bağlantılarla mümkün olmayan işlevselliği size sağlayamazlar. Neden? Bu HTTP sunucusunun işi nasıl yaptığı ile ilgilidir. PHP'nin HTML sayfalarını üretmek için HTTP sunucusunu üç şekilde kullanabilir. İlk yöntem, PHP'yi bir CGI "sarmalayıcı" olarak kullanmaktır. Bu yolla, HTTP sunucusundan her PHP sayfası isteğinde PHP yorumlayıcısının yeni bir örneği oluşturulup yok edilir. Yorumlayıcı her istekten sonra yok edildiğinden kazanılan özkaynaklar da (bir SQL veritabanı bağlantısı gibi) kaybedilir. Bu durumda, kalıcı bağlantılar kullanarak da hiç bir şey kazanamazsınız; çünkü özkaynaklar kalıcı olmayacaktır. İkinci ve en çok kullanılan yöntem, PHP'yi çok süreçli bir sunucuda bir modül olarak çalıştırmaktır. Bu olanak şimdilik sadece Apache HTTP sunucusu ile mümkündür. Çok süreçli bir sunucu, işleri sayfaları sunmak olan bir çok (alt) süreci denetimi altında tutan bir ana sürece sahiptir. Bir istemciden bir istek geldiğinde, başka istemcilere hizmet sunmayan alt süreçlerden birini bu isteğe tahsis eder. Eğer aynı istemci ikinci bir istek yaparsa bu isteğe başka bir alt süreç yanıt verebilir. Kalıcı bir bağlantı açıldığında SQL hizmeti isteği yapılan her sayfa isteği SQL sunucuya tahsis edilen aynı bağlantıdan sunulur. Son yöntem, PHP'yi çok evreli bir sunucuda bir eklenti olarak kullanmaktır. PHP4 şimdilik, PHP'nin bir eklenti olarak kullanımına izin veren Netscape FastTrack (iPlanet), Microsoft's Internet Information Server (IIS) ve O'Reilly's WebSite Pro gibi çok evreli HTTP sunucularında ISAPI, WSAPI ve (Windows üzerinde) NSAPI için destek vermektedir. Davranış esas olarak ikinci yöntemde açıklanan çok süreçli yöntemle aynıdır. Kalıcı bağlantılar ek bir işlevselliğe sahip değilseler bunlar neden tercih ediliyorlar? Yanıtı oldukça basittir: Verimlilik. SQL sunucunuza bağlantı açmak çok masraflıysa kalıcı bağlantılar kurmak daha iyidir. Bu bedel gerçekte birçok sebebe bağlı olabileceği gibi olmayabilir de. Bu, veritabanının, HTTP sunucunun bulunduğu makinede olup olmamasından SQL sunucusunun makineye ne kadar yük bindirdiğine kadar geniş bir yelpazede değerlendirilebilir. Son değerlendirmede, eğer bu bedel yüksekse kalıcı bağlantıların büyük ölçüde yardımı olacaktır. SQL sunucuya yapılan her bağlantı isteğinde alt süreç sadece o sayfayı işleyeceği yerde, kalıcı bağlantı durumunda her alt sürecin ömrü boyunca bir bağlantı krmasına olanak tanınır. Yani, bir kalıcı bağlantı açmış her alt sürecin kendine ait bir kalıcı bağlantısı vardır. Örneğin, SQl sunucunuza kalıcı bağlantı açan betiğiniz 20 ayrı alt süreç çalıştırıyorsa alt süreç başına bir tane olmak 20 ayrı bağlantı var demektir. Ancak şuna dikkat edin, bağlantı sayısı sınırlı bir veritabanını bu sınırın üstünde kalıcı bağlantılarla kullanıyorsanız bunun bazı götürüleri olabilir. Eğer veritabanınız aynı anda 16 bağlantılık bir sınıra sahipse ve çok meşgul bir sunucu oturumunda 17 alt evre bağlantı açmaya çalışıyorsa biri bunu başaramayacaktır. Eğer betiğinizde (sonsuz döngü gibi durumlarda) bağlantıların kapatılmasına izin vermeyen hatalar varsa, veritabanı sadece 16 bağlantı ile hızla batağa saplanacaktır. Terkedilmiş ve boştaki bağlantıların devreye sokulması hakkında bilgi edinmek için veritabanınızın belgelerine bakınız. Uyarı Kalıcı bağlantıları kullanırken hesaba katmanız gereken bir çok yetersizlik vardır. Bunlardan biri, bir kalıcı bağlantı üzerinden tablo kilitlemesi yapıyorsanız ve betiğiniz herhangi bir şekilde kilidi serbest bırakamazsa aynı bağlantıyı kullanan sonraki betikler sonsuza kadar engellenebilir ve bunun sonucu olarak HTTP sunucunuzu veya veritabanı sunucunuzu yeniden başlatmak zorunda kalabilirsiniz. Bir diğer durumda, hareketleri (transaction) kullanırken, bir hareket bloğu tamamlanmadan betiğiniz çalışmasını bitirirse aynı bağlantıyı kullanan sonraki betiklerin işleri başlarından aşacaktır. Her durumda, tablolarınızın kilitlerini açmak ve hareketleri başa sarmak için register_shutdown_function() işlevini kullanarak bir temizlik işlevi tanımlayabilirsiniz. Daha da iyisi, tablo kilitleri veya hareket blokları kullanan betiklerde kalıcı bağlantıları kullanmayarak bu sorunlardan tamamiyle kurtulabilirsiniz. Özetle, kalıcı bağlantılar normal bağlantılarla bire bir eşleşecek şekilde tasarlanmışlardır. Yani, betiğinizin davranışını değiştirmeden kalıcı bağlantılar yerine her zaman kalıcı olmayan bağlantılar kullanabilirsiniz. Bu, muhtemelen betiğinizin verimliliğini etkileyecektir ama davranışında bir değişikliğe yol açmayacaktır! mysql_connect() ve mysql_pconnect() Analizi mysql_pconnect() is deprecated as of PHP 5.5.0, and will be removed in the future because it has several disadvantage. Major disadvantage is that mysql_close() didn't support connection created by mysql_pconnect(), connection remains open for future use. When we establish connection with mysql_pconnect() then it will search previous existing connection with same hostname, username and password.If old active connection found then it will not recreate new connection. In case of PHP most of the sites hosted with DB and PHP on same machine, so connection time is almost negligible, in that way persistant connection is useless. For Web-Request there is no need to make persistant connection, because HTTP is sateless protocol. Connection will automatically close when we refresh page, because it assumes every request as new request. Persistant connection need too much resource, that's why persistant connection is Highly Discouraged. Normally Temp Tables dropped when connection close, but persistant connection do not close so Temp tables are no more temporary.
Sql Komutları
Sql Komutları
Sql komutlarından DISTINCT, IN, NOT IN, IN(SELECT...), ANY, ALL, EXISTS, NOT EXISTS, UNION, EXCEPT, BETWEEN kullanımı DISTINCT Veritabanımızda oluşturduğumuz tablonun içinde birbirinin aynı veriler bulunabilir.Bu verilerden aynı olanların listeleme esnasında bir kez yazılması için Distinct sözcüğü kullanılır Örnek: 12 ATB sınıfında adı Burak olan öğrencilerden sıralamada ilk gelen gösterilir.  SELECT DISTINCT adFROM 12atb;   komutunu kullanınca aşağıdaki ekran gelir. IN “IN” İngilizce'de de olduğu gibi içinde anlamına gelmektedir.Veri tabanımızda sahip olduğumuz verilerden sadece istediklerimize IN sözcüğüyle ulaşabiliriz.ÖRNEK: 12 ATB sınıfında numarası 13,20,24 olan öğrenciler kimdir? SELECT *FROM 12atbWHERE no IN (13, 20, 24); NOT IN  NOT IN, IN deyiminin tam tersidir. Veri tabanımızda sahip olduğumuz verilerden istemediklerimizi NOT IN sözcüğüyle belirtiriz. ÖRNEK: 12 ATB sınıfında numarası 13,20,24 olmayan öğrenciler kimdir?  SELECT *FROM 12atbWHERE no NOT IN (13, 20, 24); BETWEEN İngilizde'de de olduğu gibi arasında anlamına gelir Veri tabanımızda belirttiğimiz aralıklarla ilişki kurulmasını sağlar.ÖRNEK: 12ATB sınıfında numarası 10 ile 25 arasında olan öğrencilerin soyadları?  SELECT *FROM 12atbWHERE no BETWEEN 10AND 25;  IN(SELECT...) IN SELECT komutunda içteki Select komutunun bulduğu sonuca IN komutunu uygulamamız için kullanılır.ÖRNEK: Kadıköyde’te oturan öğrencinin çalıştığı projelerin adlarını ve yerlerini listeleme.   SELECT proj_ad,yerFROM projeWHERE proj_no IN(SELECT proje_noFROM ogrenci,çalışmaWHERE sosy_g_no = per_s_g_noAND adres LIKE '%kadiköy%');   ANY İngilizce'de de herhangi biri anlamına gelen any komutu sql komutumuzda da herhangi biri anlamını taşır.ÖRNEK: Makine bölümünde çalışan ogrencinin her hangi birinden daha düşük not alan ve elektronik bölümündeki bulunan ogrencileri listele.Bu örnekte; makine bölümü kodu = 2 ve elektronik bölümü kodu = 1 alınmıştır.  SELECT * FROM ogrenciWHERE NOT < ANY(SELECT NOT FROM ogrenciWHERE böl_no = 2) AND böl_no =1;   ALL İngilizce'de de hepsi anlamına gelen ALL komutu sql komutumuzda da hepsi anlamını taşır.ÖRNEK: Elektronik bölümünde çalışan ve makine bölümündeki ogrencilerin hepsinden daha fazla not alan ogrencileri listele.Bu örnekte Makine bölümü kodu = 2 ve Elektronik bölümü kodu = 1 alınmıştır.  SELECT * FROM ogrenciWHERE NOT >ALL (SELECT NOTFROM ogrenciWHERE bolum_no = 1)AND bolum_no = 2; EXISTS Mevcut anlamına gelir. AND,OR,NOT operatörleri ile kullanılabilir.ÖRNEK: Mandalina satan pazarcılarla ilişkili tüm bilgileri listele.  SELECT *FROM pazarciWHERE EXISTS(SELECT *FROM mey_satWHERE sat_no = pazarci_nAND meyve =mandalina);   NOT EXISTS Mevcut değil anlamına gelir. AND,OR,NOT operatörleri ile kullanılabilir.  ÖRNEK: Mandalina satmayan pazarcılarla ilişkili tüm bilgileri listele.  SELECT *FROM pazarciWHERE NOT EXISTS(SELECT *FROM mey_satWHERE sat_no = pazarci_nAND meyve =mandalina); UNION İki ayrı SELECT komutunun sonucunda elde edilen tabloların birleşimi işlemini gerçekleştirir.ÖRNEK: Adı Sadullah ve Soyadı Abdurrahman olan kişi yada kişileri işletmenin yürüttüğü projelerde çalışan bir kişi (sıradan bir personel yada bölüm yöneticisi)olarak bulunduran projelerin isimlerini ve projelerin yürütüldüğü yerleri listele.  (SELECT proj_ad,yerFROM proj,bölüm,personelWHERE bl_no=bölüm_no ANDy_sos gno = sosy_g_noAND ad ='Sadullah' AND soyad ='Abdurrahman')UNION (SELECT proj_ad,yerFROM proje,çalışma,personelWHERE proj_no = proje_no ANDPer_s_g_no = sosy_g_no AND ad ='Sadullah'AND soyad ='Abdurrahman')   KOŞULLAR:UNION  ile birden fazla SELECT ’in sonucu olan tabloların küme birleşimi işlemine tabi tutulması için 2 koşul gereklidir.    1) SELECT komutları sonucunda elde edilecek tablolar aynı sayıda kolon içermelidirler.    2)Sonuç tabloları karşılıklı olarak kolonların aynı veri tipi ve aynı genişlikte olmalıdır. EXCEPT Birden fazla tabloda birinde olup diğerinde olmayan şeklindeki bağıntıları kurmamız için kullandığımız komuttur..ÖRNEK: Metal bölümündeki ogrenci adlarından,tesviye bölümünde bulunmayanları listele. SELECT * FROM(SELECT ad FROM ogrenciWHERE bol_no=1EXCEPTSELECT ad FROM ogrenciWHERE bol_no =2);
Sql Fonksıyonlar
Sql Fonksıyonlar
Sql fonksıyonlar, count, sum, avg, max, mın, lower, upper, length, round, mod, left, right, concat, if COUNT( ):Bir tabloda seçili olan alan içerisindeki değerleri saymak için COUNT deyimini kullanırız. Anket uygulamalarımızda, bir makale için yorum,hit sayısını belirtmede kullanabiliriz.  SELECT COUNT(evet)  AS bilgi FROM anket;  Uygulamamızda anket tablomuzda yer alan evet seçeneğini kullananların sayısını buluruz. Burada AS ifadesinide gördük. biraz açalım sorgumuzu. veritabanımızda yer alan anket tablosundan cevabı evet olanların değerini topladık ve AS komutu ile oluşturduğumuz bilgi değişkenine aktardık.   SUM( ) : Belirtilen kolondaki kayıtların değerlerinin Sayısal toplamını bulur.Örnek: SELECT SUM(basari) FROM notlar; Öğrencilerin başarı notlarının toplamını ekrana verecektir.   AVG :Belirlenen bir alan içerisindeki verilerin aritmetik ortalamasını alır.  SELECT AVG(kolon_adı) FROM tablo;  Örnek :Aylık ödenen ücret ortalamasını bulmak istersek ;  SELECT AVG(aylik_ucret) FROM ucretler;   MAX:Tabloda seçtiğimiz alanda en yüksek sayısal değeri almak için MAX komutunu kullanırız.  SELECT MAX(yas) FROM uyeler GROUP BY ad; sorgumuzda uyeler tablosunda yaşı en büyük olan üyelerimizi bulabiliriz.   GROUP BY Deyimini kullandık bu ise bulduğumuz değerleri adlarına göre grupladık.   MIN:MIN komutuda MAX komutunun tam tersi olarak seçtiğimiz alandaki en düşük sayısal değeri bulmamıza yarar.  SELECT MIN(yas) FROM uyeler GROUP BY kullanici_adi; sorgumuzda uyeler yablosunda yaşı en küçük olan üyelerimizi bulabiliriz. GROUP BY deyimi ile de değerlerimizi kullanıcı adına göre gruplarız.   LOWER( ):Belirli alan içindeki verileri küçük harfe çevirir.  SELECT LOWER('text');   UPPER( ): Text olarak belirtilen alanı büyük harfe çevirir. SELECT UPPER('text');   LENGTH: Yazıda boşluklar dahil, kaç karakter olduğunu verir.  lenght('ahmet mehmet veli') "Toplam Karakter"Toplam Karakter ... 17   ROUND:Belirlenen alandaki sayının virgülden sonraki kısmının yuvarlatılmasını sağlar.  ROUND(45.923,2) -->45.92   MOD: İki sayısal değerin bölümünden kalanı verir.  mod(13,5) 3
Veri Tabanlarında Anahtar Kavramı Birincil Ve Yabancı Anahtar (İkincil Anahtar) Kavramı
Veri Tabanlarında Anahtar Kavramı Birincil Ve Yabancı Anahtar (İkincil Anahtar) Kavramı
Veri tabanlarında anahtar kavramı birincil ve ikincil ve yabancı anahtar. Anahtarlar Bir anahtar bir tabloda özel bir sütundur. Bazı tuşları arama ve indeksleme için kullanılır, diğer ilgili tablolar veya benzersiz bir kayıt bağlantısı tanımlamak için kullanılır. Bir veritabanı tablosu bir birincil anahtar veya dizin olmadan kullanılamaz. Aşağıda veritabanlarında kullanılan anahtar türleri hakkında bilgiler bulabilirsininiz. Bu anahtarlar birincil anahtar, yabancı anahtar ve dizin olarak anlandırılırlar. Birincil Anahtar (Primary Key) Birincil anahtar amacı benzersiz bir tabloda her bir kayıtı ayrı ayrı belirlemektir. Genel olarak, birincil anahtar tek bir sütun üzerinde tanımlıdır ve iki sütun üzerinde tanımlı olması mümkün değildir. Üç temel kural birincil anahtarları tanımlayan özelliktir: *Her kayıtın birincil anahtarında bir değer olması gerekir. O boş olamaz.*Birincil anahtar değerleri benzersiz olmalıdır.*Birincil anahtar değerleri yenilenen olmamalıdır. Eğer yenileme olursa bir kayıt silindiğinde bu hata ve karışıklık yaratabilir, bu yüzden birincil anahtar başka bir kayıt yeniden atanınca yinelenen olmamalıdır. Yabancı (İkincil) Anahtar (Forein Key) Bir yabancı anahtar bir alanı (veya hedef olarak başvurulan bir tablodan) başka bir tabloda belirli bir anahtar yerine birincil anahtarı gösteren kolonlardır. Bu ilgili tabloları mantıklı bilgilerle ilişkilendiren bir yoludur. Örneğin, ürün tablosunda  başvuran birincil anahtar alanı üreticiler tablosunda bir yabancı anahtar içerir. Bu şekilde, her ürün - dış kilit noktaları ilişkili bir üreticisi var olur. Unutmayın ki yabancı anahtar genellikle benzersiz değidir ancak başvurulan alanı başvurulan tabloda (birincil anahtar) gösterir. Örneğin, CD çalar ve televizyon ACME şirketi tarafından üretilmektedir, bu nedenle her iki kayıtta aynı yabancı anahtar değeri ayarlanır. Yani üretici tablosundaki ACME değerine. Yukardaki şekilde tablolardaki primary ve forein keyler belirtilmişlerdir. PK ve FK olarak. Benzersiz anahtar (Uniquie Key) Benzersiz anahtar iki aynı değerleri sahip olmayan sütun olarak tanımlanır. Benzersiz anahtar sütunları boş değerler içeremez. Bir tablo içinde birden çok benzersiz anahtar veya benzersiz anahtarlar sütunu olabilir. Örneğin, üretici adı alanına önceki örnekten benzersiz bir anahtar tanımlamak isteyebilirsiniz. Bu şekilde, bu başvuru kullanıcıları ACME şirket için iki ayrı kayıt yaratmaz.
Veri Tabanlarında Anahtar Kavramı Birincil Ve İkincil Anahtar
Veri Tabanlarında Anahtar Kavramı Birincil Ve İkincil Anahtar
Veri tabanlarında anahtar kavramı birincil ve ikincil anahtar Anahtar (Key) Anahtar bir veya birden fazla alanın bir satır için niteleyici olarak girilmesi için tanımlanan özel bir çeşit zorlayıcıdır. Tekrarlamayacak bir anahtar alan tanımlandığında, bu anahtar alana birincil anahtar alan denir. Primary Key, Unique Key ve Foreign Key olmak üzere 3 çeşit anahtar vardır. Primary Key (Birincil Anahtar) : Bir tablodaki, her bir satırın yerine vekil olabilecek bir anahtar veridir. Tabloda bu alana ait bilginin tekrarlanmaması gerekir. Standart olarak bir tabloda verilerin, fiziksel hafıza üstünde de hangi alana göre dizileceğini de primary key belirler. Bu, bazen bir tek alan olabileceği gibi, bazen birden fazla alan da birleşerek bir birincil anahtar oluşturabilir. Örneğin programda personelin sicil numarası alanına göre aramalar yapılacaksa Primary key personelsicil numarası olmalıdır. Personelin ad ve soyadına göre aramalar yapılacaksa ad ve soyad alanları birleştirilerek iki alandan tek anahtar alan tanımlaması yapılır. Unique Key(Tekil Anahtar): Unique Key olarak tanımlanan alan için bir değer sadece bir kere girilebilir. Bir başka satıra daha aynı verinin girilmesine izin verilmez. Primary Key ’den farklı olarak Unique Key, NULL (boşluk) değerini alabilir. Örneğin programda her personele ait bir sicil numarası olacağı için bu alan Unique key olarak tanımlanabilir. Ama isim alanı birden fazla aynı isme sahip personel olabileceği için bir Unique key olarak tanımlanamaz. Ali isimli birden fazla personel olabileceği gibi. Foreign Key (Yabancı Anahtar) : İkincil anahtarın bir diğer adı yabancı anahtardır.  Bir tabloya girilebilecek değerleri başka bir tablonun belli bir alanında yer alabilecek veri grubu ile sınırlandırmaya ve en önemlisi de ilişkilendirmeye yarar. Yani hem veri tekrarının önüne geçmek, hem de daha sonradan yapılan güncellemelerde ilgili verilerin her yerde güncellenmesini sağlamaktır.  Örneğin, olmayan bir kitabın ödünç tablosuna eklenememesi ve ödünç tablosuna eklenen bir kitabın numarası aracılığıyla detay bilgilerine erişilmesi gibi. Burada Kitap.KitapNo birincil anahtar alan; Odunc.kitapNo ise yabancı anahtardır.
Veri Tabanında İlişki Türleri
Veri Tabanında İlişki Türleri
Veri Tabanı İlişki Türleri İlişkiler Nasıl Çalışır? İlişkiler  genellikle, her iki tablonun aynı adlı alanları olan, anahtar alanlardaki verilerin eşleştirilmesiyle çalışır.(Ortak alan isimleri farklıda olabilir.)  Çoğu durumda, bu eşleştirme alanları, bir tablodan her kayıt için benzersiz bir tanımlayıcı sunan Birincil Anahtar (PK) ve diğer tablodaki Yabancı Anahtar (FK) dır.  İlişki Türleri Bir-Çok İlişkisi Çok-Çok İlişkisi Bir-Bir İlişkisi 1)Bir-Çok İlişkisi (İlişkisel Veritabanı Tasarımı) İlişkisel Veri Tabanlarında en çok kullanılan ilişki türü, Bir–Çok İlişkisi’dir. Bir–Çok İlişkisinde, “A” Tablosundaki bir kayıt, “B” tablosunda pek ÇOK eşleşen kayda sahiptir. Ancak “B” Tablosundaki kayıt, “A” Tablosunda yalnızca BİR eşleşen kayda sahiptir. Örneğin; Bir Yazar, birden ÇOK kitap yazabilir. ancak her kitabın yalnızca BİR Yazarı vardır. Birden çoğa ilişkide bir tablodaki anahtar ilişkili olduğu tabloda birden çok kez olabilir. Şekille gösterelim:  Yukarıdaki şekilde bir karikatürcünün birden fazla karikatüre sahip olabileceğini çıkartabiliriz. Çünkü Karikatür tablosunda ilişkili olduğu tablonun anahtarı bulunuyor (Foreign Key). Bu ilişki türü en çok karşılaşılan ilişki türüdür. 2) Çok – Çok İlişkisi (İlişkisel Veritabanı Tasarımı) Çok–Çok İlişkisinde, “A” Tablosundaki bir kayıt, “B” tablosunda bulunan pek ÇOK kayıtla eşleşebilir. Ve “B” Tablosundaki bir kayıt, “A” Tablosunda bulunan pek ÇOK kayıtla eşleşebilir. Bu tür bir ilişki, birincil anahtarın birden fazla alanı içerdiği, birleşme tablosu olarak adlandırılan, A ve B Tablolarından gelen yabancı anahtarların yer aldığı üçüncü bir tablonun tanımlanması koşuluyla mümkündür. Çoktan çoğa ilişikiler karmaşıklığı nedeniyle veritabanında bir çok soruna neden oldur. Soruna neden temek olarak şudur Bir tablodaki anahtar ilişkili olduğu tabloda birden çok kez olabilirken karşıtı da doğrudur.Bu yüzden istenilen ilişkiselliği sağlamak için ilişkiyi birden çoğa indirgemek gerekir. Yani araya fazladan bir tablo koyarak karmaşıklıktan kurtulmuş oluruz. Örneğin; Bir futbolcu birden fazla takımda oynayabilirken aynı takım birden fazla oyuncu oynatabilir olduğunu varsayalım. Öncelikle Futbolcular ve Takımlar adında aşağıdaki şekildeki gibi iki tane tablo oluşturalım: Anahtarı ilişkisel olduğu tabloya Foreign Key ( Komşu Anahtar) ekleyerek çoktan çoğa ilişkiyi sağlamak düşünürseniz mümkün değil.Bu yüzden araya aşağıdaki gibi bir tablo ekleyelim:     Böylece hedefi tam 12'den vuracak şekilde ilişkisel veritabanı tasarımını yapmış olduk. Çoktan çoğa ilişkiyi birden çoğa indirgediğimiz için iki tane birden çoğa ilişki elde ettik yine bu sebepten iki tane FK (Foreign Key) ortaya çıktı. Dolayısıyla SQL sorgusu iki adet olacak. Birincisi bir futbolcunun oynadığı takımlar, ikicisi ise bir takımda oynayan futbolcular olacak. 3)Bir-Bir İlişkisi (İlişkisel Veritabanı Tasarımı) Bir-Bir İlişkisi'nde, Tablo A'da Tablo B'deki her kayıtla eşleşen yalnızca BİR kayıt ve Tablo B'de Tablo A'daki her kayıtla eşleşen sadece BİR kayıt olabilir. Bu şekilde ilişkili olan çoğu bilgi tek bir tabloda olacağından, bu tür ilişki yaygın değildir. Güvenlik nedenleriyle tablonun bir bölümünü yalıtmak veya ana tablonun yalnızca bir alt kümesiyle ilgili bilgileri saklamak üzere, birçok alan içeren bir tabloyu bölmek için Bir-Bir İlişkisi kullanabilirsiniz. Örneğin; Fon toplamak amacıyla oynanan bir futbol oyununa katılan Çalışanların bilgilerini izlemek için bir Tablo oluşturmak isteyebilirsiniz. Çalışanlar Tablosunda, Futbolcular Tablosundaki her futbolcuyla eşleşen bir kayıt vardır. Çalışanlar Tablosunda her Futbolcuyla eşleşen BİR kayıt vardır.  Bu değer kümesi, ÇalışanNo alanının ve Çalışanlar Tablosu-nun bir alt kümesidir. Kural basitir ; tablodaki anahtar ilişkili tabloda sadece bir tane olabilir. Yukarıdaki şekilde öğrenciler ve Liseler adında iki tablo var. Öğrencinin mezun olduğu lise bir tane olacağını düşünürsek şekildeki ilişki türü buna uygundur. Öğrenciler tablosundaki Mezun_Lise_Id alanı ile ilişkili tabloyla alakalı Lise_Id alanı eşleştirilerek ilişki sağlanmış olunuyor.
Sql Komutlarından View Oluşturma Ve Faydaları, Myadminde Gösterimi
Sql Komutlarından View Oluşturma Ve Faydaları, Myadminde Gösterimi
View Oluşturmanın YararlarıVeri güvenliği;Veri tabanı içinde bulunan tablolardaki bazı sütunlarda bulunan bilgilerin, herkes tarafından görülmesi istenmeyebilir.Örneğin, personelin maaşlarının herkes tarafından listelenebilir olması mahsurlu olabilir. Bu durumda, Personel adlı temel (base) tablodan, persview adlı bir view oluşturulabilir.          CREATE VIEW persview          AS SELECT sicil,sos_g_no,ad,soyad,dog_tar,adres,cinsiyet,bol_no,yon_s_g_n          FROM Personel;   persview adlı view, herkesin kullanımına açık, Personel adlı temel (base) tablo ise, yetkili kişiler dışındakilere, erişilemez  hale getirilirse, maaşların herkes tarafından erişilebilir bilgi olması önlenmiş olur.      Bir view’den bilgi listelenmesi temel tablodan bilgi listelenmesinden farklı değildir.       SELECT *      FROM persview;   persview’den maaşlar hariç, tüm personel bilgileri listelenecektir. Bir temel tablodan bir view oluşturulurken, temel tablodaki aynı sütun (alan) isimlerini kullanmak zorunda değildir. Örneğin, Parça adlı ve par_no, par_ad, pr_no, fiyat ve ağırlık adlı sütun (alan) isimlerini içeren tablo kullanılarak oluşturulan parview içinde, par_no yerine parc_no, fiyat yerine fiy ve ağırlık yerine ağır isimleri kullanılmıştır:      CREATE VIEW      Parview(parc_no,fiy,ağır)      AS SELECT par_no,fiyat,ağırlık      FROM Parça;   Sorgulamanın daha basit hale gelmesiKarmaşık sorgulamalarda, bazı SELECT komutlarının sonuçları diğer SELECT komutlarınca kullanıldığında, sorgulamanın düzenlenmesinde yanlışlıklar yapma olasılığı artar.Karmaşık sorgulamalar, VIEW özelliği kullanılarak daha basit hale getirilebilir. Burada temel fikir şudur: Madem ki bir view, bir sorgulama sonucu elde edilen bilgiyi (tabloyu) isimlendirerek elde edilen bir virtüel tablodur; o halde karmaşık SELECT komutu içinde, sonucu kullanılacak başka bir SELECT komutu kullanmak yerine, bu sonucu bir view olarak isimlendirerek, view adını kullanmak. Bazı durumlarda ise, işletmenin veri tabanı uygulamasında çok sık olarak sorulan karmaşık soruları bir view yapısı içinde saklayarak, daha sonra aynı tip sorgulamalar için bu view yapısını kullanarak daha basit ifadeler kullanmakta olasıdır.Örnek: Satış bölümünde çalışan personelin herhangi birinden daha düşük maaş alan ve mühendislik bölümünde çalışan kişileri listelemek.            SELECT *            FROM Personel            WHERE maas<ANY(SELECT maas                             FROM Personel                              WHERE bol_no=2) AND            bol_no=1;         (Satış bölümü kodu 2 ve mühendislik bölümü kodu ise 1 kabul ediliyor.)Şimdi bu örneğin tablosu bir view olarak saklanırsa:      CREATE VIEW S1view      AS SELECT *      FROM Personel      WHERE maas<ANY(SELECT maas                        FROM Personel                         WHERE bol_no=2) AND      bol_no=1;   bundan sonra aynı tip sorgulama için sadece     SELECT *    FROM S1view;   yazmak yeterli olacaktır.Sadece view kullanılarak gerçekleşebilen sorgulamalarBir tablodan elde edilecek  bilgiler için, iki kademeli işlem gerektiren sorgulamalarda, ilk adımda bir view oluşturup ikinci adımda esas sorgulamayı bu view yardımı ile gerçekleştirmek, çoğu kez kaçınılmaz bir durumdur.Aşağıdaki örnek SQL ifadeleri bu konuda bir fikir verecektir:Örnek: Her bölümde, o bölümdeki ortalama maaştan daha yüksek maaş alanları listeleyiniz.Bu örnek için önce her bölümdeki ortalama maaşların bulunması gereklidir.      CREATE VIEW BOL_OR_VIEW(bol_no,ort,maas)      AS SELECT bol_no,AVG(maas)      FROM Personel      GROUP BY bol_no;  Daha sonra, yaratılan BOL_OR_VIEW yardımı ile (bu view, bölüm no’ları ve bölüm ortalama maaşlarını saklamaktadır) sorulan sorunun cevabı elde edilebilir:    SELECT *      FROM Personel      WHERE bol_no=BOL_OR_VIEW.bol_no      . AND.maas>ort_maas;    (Bu sorunun cevabını, şu ana kadar anlatılan diğer bilgilerle bulmaya çalışınız.)Veri bütünlüğünün sağlanmasıView oluşturma esnasında CHECK sözcüğünün kullanılması ile, o view’i oluştururken sağlanması gereken koşulların, daha sonra view içine veri ekleme ya da değişiklik işlemlerinde de ihmal edilmesi engellenmiş olur.      Örneğin aşağıdaki gibi bir VIEW oluşturulsun:       CREATE VIEW UST_PER_VIEW      AS SELECT FROM Personel      WHERE maas>25000000,      WITH CHECK OPTION;   Burada,maaşı 25000000’un üstünde olan personelden oluşan bir UST_PEVIEW adlı view oluşturulmuştur. Daha sonra bu view içine;      INSERT INTO UST_PER_VIEW      VALUES(27521,&#8217;27865427&#8217;,&#8217;Ayşe&#8217;     &#8216;Okan&#8217;,{01/05/62},&#8217;Cumh. Cad. 46-Taksim&#8217;,     .F.,13000000,1,&#8217;27651112&#8217;);  komutu ile maaşı 13000000 olan bir personel eklenmek istendiği zaman şu hata mesajı alınacaktır.     Error: not enough non-null values  Eğer CHECK opsiyonu kullanılmasaydı hata mesajı alınmadan bu veri view içine yüklenecekti. Bir tablo ya da view üzerinde veri ekleme, güncelleme ve silme işlemleri bir sonraki bölümde incelenecektir.
Metin2 PVP Turnuvası questi
Metin2 PVP Turnuvası questi
state start beginwhen 30122.chat."GM:PvP Turnuvasına Işınlan " with pc.is_gm() beginsay("Haritaya gitmek istiyor musun?")say("")local a = select(locale.yes,locale.no)if a == 2 then return endpc.warp(95700,28500)--pc.warp(844800,00)endwhen login with pc.get_map_index() == 28 and (pvp_attenders == nil or pvp_attenders[pvp_manager.get_my_attender_id()] == nil or (pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2)) begin--when login with pc.get_map_index() == 112 and (pvp_attenders == nil or pvp_attenders[pvp_manager.get_my_attender_id()] == nil or (pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2)) beginif pvp_attenders == nil thenpvp_manager.guard_check_position()timer("pvp_guard_1", 10)returnendif pvp_attenders[pvp_manager.get_my_attender_id()] == nil thenpvp_manager.guard_check_position()timer("pvp_guard_1", 10)returnendif pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 1 and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != 2 thenpvp_manager.guard_check_position()timer("pvp_guard_1", 10)endendwhen pvp_guard_1.timer beginif pc.get_map_index() != 28 then return end--if pc.get_map_index() != 112 then return endpvp_manager.guard_check_position()timer("pvp_guard_2", 10)endwhen pvp_guard_2.timer beginif pc.get_map_index() != 28 then return end--if pc.get_map_index() != 112 then return endpvp_manager.guard_check_position()timer("pvp_guard_1", 10)endfunction guard_check_position()if pc.get_local_x() >= 84 and pc.get_local_y() >= 84 and pc.get_local_x() <= 116 and pc.get_local_y() <= 116 then --arena 1pvp_manager.guard_reset()endif pc.get_local_x() >= 84 and pc.get_local_y() >= 136 and pc.get_local_x() <= 116 and pc.get_local_y() <= 168 then --arena 2pvp_manager.guard_reset()endif pc.get_local_x() >= 136 and pc.get_local_y() >= 84 and pc.get_local_x() <= 168 and pc.get_local_y() <= 116 then --arena 3pvp_manager.guard_reset()endif pc.get_local_x() >= 136 and pc.get_local_y() >= 136 and pc.get_local_x() <= 168 and pc.get_local_y() <= 168 then --arena 4pvp_manager.guard_reset()endendfunction guard_reset()notice_in_map(""..pc.get_name().." Arenadan uzaklaştırıldı!")pc.warp(344000,502500)endwhen 30122.chat."PvP Turnuvasına Katıl " with game.get_event_flag("pvp") == 1 beginsay_title("PvP Turnuvasına Katıl:")say("Ne yapmak istiyorsun?")local s = select("PvP Arenasına Işınlan ", "Kapat " )if s == 2 then return endif party.is_party() thensay_title("PvP Turnuvasına Katıl:")say("Bir grup üyesiyken içeriye giriş yapamazsın.")elsepc.warp(95700,28500)endendwhen 20078.chat."Şehre Dön " with pc.get_map_index() == 28 begin--when 20078.chat."Şehre Dön " with pc.get_map_index() == 112 beginsay_title("Savaş Ustası: ")say("")say("Arenadan ayrılıp şehre dönmek istiyormusun?")say("")local s = select("Evet ", "Hayır ")if s == 2 then return endwarp_to_village()endwhen 20078.chat."GM: Turnuva Bölgesini Temizle " with pc.get_map_index() == 28 and pc.is_gm() begin--when 20078.chat."GM: Turnuva Bölgesini Temizle " with pc.get_map_index() == 112 and pc.is_gm() beginsay_title("PvP Turnuvası : ")say("")say("Bölgeyi temizlemek istiyor musun?")say("")local temizle = select(locale.yes, locale.no)if temizle == 2 then return endwarp_all_to_village(28,10)endwhen 20078.chat."GM: PvP Turnuvası İptal Et " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") != 0 begin--when 20078.chat."GM: PvP Turnuvası İptal Et " with pc.get_map_index() == 112 and pc.is_gm() and game.get_event_flag("pvp") != 0 beginsay_title("GM: PvP Turnuvası İptal Et: ")say("PvP Turnuvası iptal etmek istiyormusun?")say("")local s = select("Evet ", "Hayır ")if s == 2 then return endgame.set_event_flag("pvp", 0)pvp_attenders = nilnotice_all("Turnuva sona ermiştir!")say_title("PvP Turnuvası iptal edildi!")say("PvP Turnuvası iptal edildi!")say("")if pvp_manager_callback != nil thenpvp_manager_callback()endendwhen 20078.chat."GM: Sınıf Seçimi " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil begin--when 20078.chat."GM: Sınıf Seçimi " with pc.get_map_index() == 112 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil beginsay("")say("Turnuva sınıfını seç.")say("")local sinif = select("Savaşçı ", "Ninja ", "Sura ", "Şaman ", "Lycan ", "Karışık ", "Vazgeç ")if sinif == 1 thengame.set_event_flag("pvp_sinif",1)say("Savaşçı sınıfı seçildi.")elseif sinif == 2 thengame.set_event_flag("pvp_sinif",2)say("Ninja sınıfı seçildi.")elseif sinif == 3 thengame.set_event_flag("pvp_sinif",3)say("Sura sınıfı seçildi.")elseif sinif == 4 thengame.set_event_flag("pvp_sinif",4)say("Şaman sınıfı seçildi.")elseif sinif == 5 thengame.set_event_flag("pvp_sinif",5)say("Lycan sınıfı seçildi.")elseif sinif == 6 thengame.set_event_flag("pvp_sinif",6)say("Karışık seçildi.")endend when 20078.chat."GM: PvP Turnuvasını Başlat " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil begin--when 20078.chat."GM: PvP Turnuvasını Başlat " with pc.get_map_index() == 112 and pc.is_gm() and game.get_event_flag("pvp") == 0 and ae_pvp_tournament == nil beginsay_title("PvP Turnuvasını başlat:")if game.get_event_flag("pvp_sinif") == 0 thensay("Önce sınıf seçimi yap. ")returnendsay("Lütfen minimum level sınırını gir (Min: 15):")local str_min_level = input()say_title("PvP Turnuvasını başlat:")local min_level = tonumber(str_min_level)if min_level == nil thensay("Numara girilmedi.")say("")returnendif tonumber(str_min_level) < 15 thenmin_level = 15endsay("Minimum level : "..tostring(min_level)..".")say("lütfen maksimum level sınırını gir:")local str_max_level = input()say_title("PvP Turnuvasını başlat:")local max_level = tonumber(str_max_level)if max_level == nil thensay("Numara girilmedi.")say("")returnendif tonumber(str_max_level) < min_level thensay("Maks level min levelden yüksek olmalı.")say("")returnendgame.set_event_flag("pvp_minlevel", min_level)game.set_event_flag("pvp_maxlevel", max_level)say("Minimum Level: "..tostring(min_level).." olarak ayarlandı.")say("Maksimum Level: "..tostring(max_level).." olarak ayarlandı.")say("")local s = select("Başlat ", "İptal et ")if s == 2 thenreturnendsay_title("PvP Turnuvasını başlat:")say("")say("PvP Turnuvası başladı.")say("")say_reward("Level Limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel"))pvp_manager.open_registrations()endfunction open_registrations()game.set_event_flag("pvp", 1)attender_count = 0game.set_event_flag("pvp_tournament", get_global_time())pvp_attenders = nilpvp_attenders = { }arena = {-- arena 1{{ 113, 100 },{ 88, 100 },0,"SLEEPING",0,},-- arena 2{{ 113, 152 },{ 88, 152 },0,"SLEEPING",0,},-- arena 3{{ 140, 152 },{ 164, 152 },0,"SLEEPING",0,},-- arena 4{{ 164, 100 },{ 140, 100 },0,"SLEEPING",0,},} balan = {-- kazanan 1{{ 67, 98 },},-- kazanan 2{{ 184, 100 },},-- kaybeden 1{{ 68, 151 },},-- kaybeden 2{{ 185, 152 },},}notice_all("PvP Turnuvası başlamıştır.")notice_all("Girişler için "..mob_name(30122).."'e gidin.")local sinif = game.get_event_flag("pvp_sinif")local siniff = ""if sinif == 1 thensiniff = "Savaşçı "notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")elseif sinif == 2 thensiniff = "Ninja "notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")elseif sinif == 3 thensiniff = "Sura "notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")elseif sinif == 4 thensiniff = "Şaman "notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")elseif sinif == 5 thensiniff = "Lycan "notice_all(siniff.."Arası Turnuva Başladı. Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")elseif sinif == 6 thensiniff = "Karışık "notice_all("Level limiti: "..game.get_event_flag("pvp_minlevel").." - "..game.get_event_flag("pvp_maxlevel").."")endendwhen 20078.chat."Turnuvaya Katıl " with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 1 begin--when 20078.chat."Turnuvaya Katıl " with pc.get_map_index() == 112 and game.get_event_flag("pvp") == 1 beginsay_title(mob_name(20078)..":")local sinif = game.get_event_flag("pvp_sinif")if sinif == 1 thenif pc.get_job() != 0 thenif pc.get_job() != 4 thensay("Sadece savaşçılar girebilir.")returnendendelseif sinif == 2 thenif pc.get_job() != 1 thenif pc.get_job() != 5 thensay("Sadece ninjalar girebilir.")returnendendelseif sinif == 3 thenif pc.get_job() != 2 thenif pc.get_job() != 6 thensay("Sadece suralar girebilir.")returnendendelseif sinif == 4 thenif pc.get_job() != 3 thenif pc.get_job() != 7 thensay("Sadece şamanlar girebilir.")returnendendelseif sinif == 5 thenif pc.get_job() != 4 thensay("Sadece lycanlar girebilir.")returnendendif game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") thensay("Turnuvaya zaten kayıt yaptırdın.")say("")returnendif pc.get_level() < 15 thensay("Levelin çok düşük.")say("")returnendif pc.get_level() < game.get_event_flag("pvp_minlevel") or pc.get_level() > game.get_event_flag("pvp_maxlevel") thensay("Levelin "..game.get_event_flag("pvp_minlevel").." ile "..game.get_event_flag("pvp_maxlevel").." arasında olması gerekli.")say("")returnendsay("Vs turnuvasına hoşgeldin. Turnuvada senin gibi ")say("oyuncularla savaşacaksın.")say("")say("Karşına çıkan her oyuncuyu öldür.")say("")say("Bu turnuvaya katılmak istiyormusun?")say("")say_reward("Kayıt Ücreti : 15.000 Yang ")say("")local s = select("Evet, katılmak istiyorum ", "Hayır, ben bir korkağım ")say_title(mob_name(20078)..":")if s == 1 thenif pc.get_gold() < 15000 thensay_title("PvP Turnuvası ")say("")say(15000-pc.get_gold().." yang eksiğin var.")say("Paranı tamamlayınca turnuvaya girebilirsin.")returnendsay("Turnuva başladığı zaman seni çağıracağım.")say("")say("İyi şanslar evlat!")say("")pvp_attenders[attender_count+1] = {name = pc.getname(), level = pc.get_level(), partner = nil, winner = true, fight_mode = 0, arena = 0}pc.setqf("attender_id", attender_count+1)pc.setqf("pvp_tournament", game.get_event_flag("pvp_tournament"))attender_count = attender_count + 1pc.change_gold(-15000)if achievement_manager != nil thenachievement_manager.on_participatepvpevent()endelseif s == 2 thensay("Çok zayıf gözüküyorsun evlat ")say("diğer oyunculara karşı hiç şansın olamaz.")say("")endendwhen 20078.chat." PvP Turnuvası için yapılmış kayıtlar " with pc.get_map_index() == 28 and pc.is_gm() and game.get_event_flag("pvp") == 1 begin--when 20078.chat." PvP Turnuvası için yapılmış kayıtlar " with pc.get_map_index() == 112 and pc.is_gm() and game.get_event_flag("pvp") == 1 beginsay_title(" PvP Turnuvası ")say("Şuana kadar "..tostring(attender_count).." oyuncu kayıt oldu.")if ae_pvp_tournament != nil thensay("")returnendsay(" Kayıtları kapamak istiyormusun? ")say("")local s = select("Kayıtları kapat ", "Kayıt olmaya devam etsinler ")if s == 1 thensay_title("Kayıtları Kapat:")say("Kayıtlar kapandı.")say("")pvp_manager.close_registrations()endendfunction close_registrations()if attender_count == 0 thennotice_all("Girişler kapandı , kayıt yaptıramazsın.")game.set_event_flag("pvp", 0)pvp_attenders = nilif pvp_manager_callback != nil thenpvp_manager_callback()endreturnendgame.set_event_flag("pvp", 2)pvp_manager.make_duel_list()duel_list_index = 0playerless_mode = falsenotice_all("PvP Turnuvası başlıyor!")pvp_manager.refresh_arenas()endwhen 20078.chat."Şimdi kiminle düello yapacağım?" with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 2 and game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") begin--when 20078.chat."Şimdi kiminle düello yapacağım?" with pc.get_map_index() == 112 and game.get_event_flag("pvp") == 2 and game.get_event_flag("pvp_tournament") == pc.getqf("pvp_tournament") beginsay_title(mob_name(20078)..":")if pvp_manager.get_duel_partner() == nil thensay("Şuanda sana uygun aday yok.")say("")say("Eğer sana uygun aday bulamazsak bir sonraki ")say("rounda geçeceksin.")returnendsay("Düello yapacağın kişi:")say("")say_reward(""..pvp_manager.get_duel_partner().."")end function make_duel_list()duel_list = { }local i = 0for ai = 1, attender_count, 1 doif pvp_attenders[ai] != nil and pvp_attenders[ai].partner == nil and pvp_attenders[ai].winner == true thenlocal partner_id = pvp_manager.findpartner(tostring(pvp_attenders[ai].name), pvp_attenders[ai].level)if partner_id != nil thenpvp_attenders[ai].partner = tostring(pvp_attenders[partner_id].name)pvp_attenders[partner_id].partner = tostring(pvp_attenders[ai].name)duel_list[i] = {fighter_id1 = ai, fighter_id2 = partner_id}i = i + 1endendendfor ai = 1, attender_count, 1 doif pvp_attenders[ai] != nil and pvp_attenders[ai].partner == nil and pvp_attenders[ai].winner == true thenlocal partner_id = pvp_manager.findpartner_for_partnerless(tostring(pvp_attenders[ai].name), pvp_attenders[ai].level)if partner_id != nil thenpvp_attenders[ai].partner = tostring(pvp_attenders[partner_id].name)pvp_attenders[partner_id].partner = tostring(pvp_attenders[ai].name)duel_list[i] = {fighter_id1 = ai, fighter_id2 = partner_id}i = i + 1endendendendfunction findpartner(name, level)local closest_level = nillocal partner_id = nilfor ai = 1, attender_count, 1 doif pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true and tonumber(pvp_attenders[ai].level) <= level + 30 and tonumber(pvp_attenders[ai].level) >= level - 30 and tostring(pvp_attenders[ai].name) != name and pvp_attenders[ai].partner == nil and pvp_manager.is_player_in_map(tostring(pvp_attenders[ai].name)) == true thenif closest_level == nil thenclosest_level = pvp_attenders[ai].levelpartner_id = aielseif tonumber(pvp_attenders[ai].level) == tonumber(level) thenclosest_level = pvp_attenders[ai].levelpartner_id = aielseif tonumber(level) < tonumber(closest_level) and tonumber(pvp_attenders[ai].level) < tonumber(closest_level) thenclosest_level = pvp_attenders[ai].levelpartner_id = aielseif tonumber(level) > tonumber(closest_level) and tonumber(pvp_attenders[ai].level) > tonumber(closest_level) thenclosest_level = pvp_attenders[ai].levelpartner_id = aiendendendreturn partner_idendfunction findpartner_for_partnerless(name, level)local closest_level = nillocal partner_id = nilfor ai = 1, attender_count, 1 doif pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true and tostring(pvp_attenders[ai].name) != name and pvp_attenders[ai].partner == nil and pvp_manager.is_player_in_map(tostring(pvp_attenders[ai].name)) == true thenif closest_level == nil thenclosest_level = pvp_attenders[ai].levelpartner_id = aielseif pvp_attenders[ai].level == level thenclosest_level = pvp_attenders[ai].levelpartner_id = aielseif tonumber(level) < tonumber(closest_level) and pvp_attenders[ai].level < closest_level thenclosest_level = pvp_attenders[ai].levelpartner_id = aielseif tonumber(level) > tonumber(closest_level) and pvp_attenders[ai].level > closest_level thenclosest_level = pvp_attenders[ai].levelpartner_id = aiendendendreturn partner_idendfunction is_player_in_map(name)if pc.getname() == name thenreturn trueendlocal myname = pc.getname()local target = find_pc_by_name(name)local t = pc.select(target)if pc.getname() == myname thenpc.select(t)return falseendpc.select(t)return trueendwhen 20078.chat."GM: Arenayı Temizle" with pc.is_gm() and game.get_event_flag("pvp") == 2 beginfor aArena = 1, 4, 1 doarena[aArena][3] = 0arena[aArena][4] = "SLEEPING"endpvp_manager.refresh_arenas()endwhen 20078.chat."GM: PvP Turnuva Ödülü " with pc.is_gm() beginsay_title("Ödül:")say("Şuanki Ödül "..game.get_event_flag("pvp_price_count").."x "..item_name(game.get_event_flag("pvp_price_vnum")).." (vnum: "..game.get_event_flag("pvp_price_vnum")..")")say("")local s = select("Ödülü Değiştir " , "Kapat ")if s == 2 thenreturnendsay_title("Ödül:")say("Yeni ödülün kodunu gir:")say("")local vnum = input()say_title("Ödül:")say("Yeni ödülün adetini gir:")say("")local count = input()game.set_event_flag("pvp_price_count", count)game.set_event_flag("pvp_price_vnum", vnum)say_title("Ödül değiştirildi:")say("Ödül değiştirildi.")say("Yeni ödül : "..count.."x "..item_name(vnum).." (vnum: "..vnum..")")end function refresh_arenas()for aArena = 1, 4, 1 doif duel_list[duel_list_index] == nil thenif playerless_mode == true thenpvp_manager.init_next_round()elsepvp_manager.fight_playerless()endreturnendif arena[aArena][3] == 0 thenarena[aArena][3] = 1pvp_manager.fight_init(duel_list[duel_list_index].fighter_id1, duel_list[duel_list_index].fighter_id2, aArena)endendend function fight_init(pid1, pid2, arena_id)duel_list_index = duel_list_index + 1if pvp_manager.is_player_in_map(tostring(pvp_attenders[pid1].name)) == false thennotice_in_map(""..tostring(pvp_attenders[pid1].name).." adlı oyuncu oyunda olmadığından diskalifiye edildi.", pc.get_map_index())pvp_attenders[pid1].winner = falsepvp_attenders[pid2].partner = nilarena[arena_id][3] = 0pvp_manager.refresh_arenas()returnendif pvp_manager.is_player_in_map(tostring(pvp_attenders[pid2].name)) == false thennotice_in_map(""..tostring(pvp_attenders[pid2].name).." adlı oyuncu oyunda olmadığından diskalifiye edildi.", pc.get_map_index())pvp_attenders[pid2].winner = falsepvp_attenders[pid1].partner = nilarena[arena_id][3] = 0pvp_manager.refresh_arenas()returnendnotice_in_map(tostring(pvp_attenders[pid1].name).." ve "..tostring(pvp_attenders[pid2].name).." 'nın düellosu birazdan başlayacak!", pc.get_map_index())pvp_attenders[pid1].fight_mode = 1pvp_attenders[pid2].fight_mode = 1pvp_attenders[pid1].arena = arena_idpvp_attenders[pid2].arena = arena_idpvp_kural_uygula(pvp_attenders[pid1].name)pvp_kural_uygula(pvp_attenders[pid2].name)pvp_manager.local_pc_warp(tostring(pvp_attenders[pid1].name), arena[arena_id][1][1], arena[arena_id][1][2])pvp_manager.local_pc_warp(tostring(pvp_attenders[pid2].name), arena[arena_id][2][1], arena[arena_id][2][2]) endwhen login with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 1 begin--when login with pc.get_map_index() == 112 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 1 beginaffect.add(apply.MOV_SPEED, -10000, 2)affect.add_collect(apply.HP_REGEN, 5000, 30)affect.add_collect(apply.SP_REGEN, 5000, 30)pvp_manager.set_fight_mode(2)if arena[pvp_manager.get_arena()][3] == 2 thenarena[pvp_manager.get_arena()][5] = 30loop_timer("fight_start_countdown", 1)elsetimer("partner_timeout", 30)endarena[pvp_manager.get_arena()][3] = 2endwhen partner_timeout.timer beginif pvp_manager.is_player_in_map(pvp_manager.get_duel_partner()) == true or game.get_event_flag("pvp") != 2 or pvp_manager.get_fight_mode() != 2 thenreturnendpvp_manager.set_fight_mode(3)if arena[pvp_manager.get_arena()][3] == 3 thenreturnendarena[pvp_manager.get_arena()][3] = 3notice_in_map(pc.getname().." , "..pvp_manager.get_duel_partner().." karşısındaki düelloyu kaybetti!", pc.get_map_index())pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3pvp_attenders[pvp_manager.get_my_attender_id()].winner = truepvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = falsesaybakim = math.random(1,10)if saybakim >= 5 thenpc.warp_local(pc.get_map_index(), balan[3][1][1], balan[3][1][2], 0)elsepc.warp_local(pc.get_map_index(), balan[4][1][1], balan[4][1][2], 0)endend when fight_start_countdown.timer beginif arena[pvp_manager.get_arena()][5] == -1 thenreturnendlocal partner_vid = find_pc_by_name(pvp_manager.get_duel_partner())local my_vid = pc.get_vid()if arena[pvp_manager.get_arena()][5] == 0 thenarena[pvp_manager.get_arena()][5] = -1pc.select(partner_vid)command("pvp "..my_vid)pc.select(my_vid)command("pvp "..partner_vid)notice_in_map(""..pvp_manager.get_duel_partner().." ile "..pc.getname().." arasındaki düello başladı!", pc.get_map_index())timer("fight_start_countdown_shutdown", 1)elsepc.select(partner_vid)if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 thenif tostring(arena[pvp_manager.get_arena()][5]) == "30" thenlocal f = "pvp"pc.setf(f,"item_block",0)if pc.get_job() == 2 or pc.get_job() == 6 thenpc.setf(f,"block_cozme",1)endsyschat("İtemlerini değiştirmek için 15 saniyen var.")syschat("15 saniye sonunda item değiştiremeyeceksin.")elseif tostring(arena[pvp_manager.get_arena()][5]) == "15" thenlocal f = "pvp"pc.setf(f,"item_block",1)if pc.get_job() == 2 or pc.get_job() == 6 thenpc.setf(f,"block_cozme",0)endsyschat("İtem değiştirme süresi sona erdi.")endsyschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.")endaffect.add(apply.MOV_SPEED, -10000, 2)pc.select(my_vid)if math.mod(arena[pvp_manager.get_arena()][5], 5) == 0 thenif tostring(arena[pvp_manager.get_arena()][5]) == "30" thenlocal f = "pvp"pc.setf(f,"item_block",0)syschat("İtemlerini değiştirmek için 15 saniyen var.")syschat("15 saniye sonunda item değiştiremeyeceksin.")elseif tostring(arena[pvp_manager.get_arena()][5]) == "15" thenlocal f = "pvp"pc.setf(f,"item_block",1)syschat("İtem değiştirme süresi sona erdi.")endsyschat("Düello "..tostring(arena[pvp_manager.get_arena()][5]).." saniye içinde başlayacak.") endaffect.add(apply.MOV_SPEED, -10000, 2)arena[pvp_manager.get_arena()][5] = arena[pvp_manager.get_arena()][5] - 1endendwhen fight_start_countdown_shutdown.timer begincleartimer("fight_start_countdown")endwhen logout with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 28 and pvp_manager.get_fight_mode() == 2 begin--when logout with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 112 and pvp_manager.get_fight_mode() == 2 beginpvp_manager.set_fight_mode(3)arena[pvp_manager.get_arena()][3] = 3notice_in_map(""..pvp_manager.get_duel_partner().." , "..pc.getname().." karşısındaki düelloyu kazandı!", pc.get_map_index())pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3pvp_attenders[pvp_manager.get_my_attender_id()].winner = falsepvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = truesaybakim = math.random(1,10)if saybakim >= 5 thenpvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), balan[1][1][1], balan[1][1][2])elsepvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), balan[2][1][1], balan[2][1][2])endendwhen kill with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 28 and npc.is_pc() and pvp_manager.get_fight_mode() == 2 begin--when kill with game.get_event_flag("pvp") == 2 and pc.get_map_index() == 112 and npc.is_pc() and pvp_manager.get_fight_mode() == 2 beginpvp_manager.set_fight_mode(3)if arena[pvp_manager.get_arena()][3] == 3 thenreturnendarena[pvp_manager.get_arena()][3] = 3notice_in_map(""..pc.getname().." , "..pvp_manager.get_duel_partner().." karşısındaki düelloyu kazandı!", pc.get_map_index())pvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].fight_mode = 3pvp_attenders[pvp_manager.get_my_attender_id()].winner = truepvp_attenders[pvp_manager.get_attender_id_by_name(pvp_manager.get_duel_partner())].winner = falsetimer("fight_end", 5)endwhen fight_end.timer beginkazanansay2 = math.random(1,100)if kazanansay2 >= 50 thenpvp_manager.local_pc_warp(pc.getname(), balan[1][1][1], balan[1][1][2])elsepvp_manager.local_pc_warp(pc.getname(), balan[2][1][1], balan[2][1][2])endsaybakim2 = math.random(1,10)if saybakim2 >= 5 thenpvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), balan[3][1][1], balan[3][1][2])elsepvp_manager.local_pc_warp(pvp_manager.get_duel_partner(), balan[4][1][1], balan[4][1][2])endendwhen letter with pc.get_map_index() == 28 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 3 begin--when letter with pc.get_map_index() == 112 and game.get_event_flag("pvp") == 2 and pvp_manager.get_fight_mode() == 3 beginpvp_manager.set_fight_mode(0)if pvp_attenders[pvp_manager.get_my_attender_id()].winner == true thenarena[pvp_manager.get_arena()][3] = 0pvp_manager.refresh_arenas()endendfunction fight_playerless()for aArena = 1, 4, 1 doif arena[aArena][3] != 0 thenreturnendendplayerless_mode = true pvp_manager.make_duel_list()pvp_manager.refresh_arenas()endfunction init_next_round()for aArena = 1, 4, 1 doif arena[aArena][3] != 0 thenreturnendendplayerless_mode = falselocal winner_count = 0--[[local]] winner_id = 0for ai = 1, attender_count, 1 dopvp_attenders[ai].partner = nilpvp_attenders[ai].fight_mode = 0if pvp_attenders[ai] != nil and pvp_attenders[ai].winner == true thenwinner_count = winner_count + 1winner_id = aiendendif winner_count == 1 thennotice_all(""..pvp_attenders[winner_id].name.." turnuvayı kazanıp ödülünde sahibi oldu!")local target = find_pc_by_name(pvp_attenders[winner_id].name)local t = pc.select(target)if achievement_manager != nil thenachievement_manager.on_winpvpevent()endpc.give_item2(game.get_event_flag("pvp_price_vnum"), game.get_event_flag("pvp_price_count"))pc.select(t)notice_all("PvP Turnuvası bitti.")warp_all_to_village(28,28)game.set_event_flag("pvp", 0)--pvp_attenders = nilif pvp_manager_callback != nil thenpvp_manager_callback()endreturnendpvp_manager.make_duel_list()duel_list_index = 0if winner_count == 2 thennotice_all("Final roundu başlıyor.")elseif winner_count <= 4 thennotice_all("Yarı final roundu başlıyor.")elseif winner_count <= 8 thennotice_all("Çeyrek final roundu başlıyor.")elsenotice_all("Round başlıyor.")endpvp_manager.refresh_arenas()endwhen login with pc.get_map_index() != 28 begin--when login with pc.get_map_index() != 112 beginlocal f = "pvp"pc.setf(f,"item_block",0)if pc.get_job() == 2 or pc.get_job() == 6 thenpc.setf(f,"block_cozme",0)endendwhen login with pc.get_map_index() == 28 begin--when login with pc.get_map_index() == 112 beginif pc.get_job() == 2 or pc.get_job() == 6 thenlocal f = "pvp"pc.setf(f,"block_cozme",0)endif party.is_party() thenlocal krallik = pc.get_empire()if krallik == 1 thenpc.warp(469300, 964200)elseif krallik == 2 thenpc.warp(55700, 157900)elseif krallik == 3 thenpc.warp(969600, 278400)endendendfunction local_pc_warp(name, x, y)local target = find_pc_by_name(name)local t = pc.select(target)if x == 67 and y == 98 thenlocal f = "pvp"pc.setf(f,"item_block",0)elseif x == 68 and y == 151 thenlocal f = "pvp"pc.setf(f,"item_block",0)elseif x == 184 and y == 100 thenlocal f = "pvp"pc.setf(f,"item_block",0)elseif x == 185 and y == 152 thenlocal f = "pvp"pc.setf(f,"item_block",0)endpc.warp_local(pc.get_map_index(), x*100, y*100, 0)pc.select(t)if x == 67 and y == 98 thenlocal f = "pvp"pc.setf(f,"item_block",0)elseif x == 68 and y == 151 thenlocal f = "pvp"pc.setf(f,"item_block",0)elseif x == 184 and y == 100 thenlocal f = "pvp"pc.setf(f,"item_block",0)elseif x == 185 and y == 152 thenlocal f = "pvp"pc.setf(f,"item_block",0)endendfunction setqf_by_name(name, flag, value)local target = find_pc_by_name(name)local t = pc.select(target)pc.setqf(flag, value)pc.select(t)endfunction getqf_by_name(name, flag)local target = find_pc_by_name(name)local t = pc.select(target)local rflag = pc.getqf(flag)pc.select(t)return rflagendfunction get_attender_id_by_name(name)for ai = 1, attender_count, 1 doif tostring(pvp_attenders[ai].name) == name thenreturn aiendendreturn 0endfunction get_my_attender_id()return pvp_manager.get_attender_id_by_name(pc.get_name())endfunction get_duel_partner()if pvp_attenders[pvp_manager.get_my_attender_id()] != nil and pvp_attenders[pvp_manager.get_my_attender_id()].partner != nil thenreturn pvp_attenders[pvp_manager.get_my_attender_id()].partnerelsereturn nilendendfunction get_fight_mode()if pvp_attenders != nil and pvp_manager.get_my_attender_id() != 0 and pvp_attenders[pvp_manager.get_my_attender_id()] != nil and pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode != nil thenreturn pvp_attenders[pvp_manager.get_my_attender_id()].fight_modeelsereturn 0endendfunction set_fight_mode(fmode)pvp_attenders[pvp_manager.get_my_attender_id()].fight_mode = fmodeendfunction get_arena()return pvp_attenders[pvp_manager.get_my_attender_id()].arenaendfunction set_arena(id)pvp_attenders[pvp_manager.get_my_attender_id()].arena = idendfunction ask_fight(asker, target)return confirm(find_pc_by_name(target), "Trittst du den Kampf gegen "..asker.. " an?", 15)endend  
Metin2 ramazan event questi
Metin2 ramazan event questi
state start beginfunction is_running()return (game.get_event_flag("event_ramazan") > 0) --npc spawnendfunction reward_period()return (game.get_event_flag("ramadan_reward") > 0) --reward menu appearendfunction setting()return {["bread"] = 30315,["candy"] = 50183,["plate"] = 30316,["iftar"] = 30317,["fruit"] = 30318,["box"] = 50182,["horse1"] = 71131,["horse2"] = 71132,["horse3"] = 71133,["horse4"] = 71134}endwhen 33002.chat.gameforge.event_ramadan._010_npcChat with pc.getf("event_ramazan", "first_notice")==0 beginlocal setting = event_ramadan.setting()say_title(gameforge.event_ramadan._020_sayTitle)say("")say(gameforge.event_ramadan._030_say)wait() say_pc_name()say(gameforge.event_ramadan._040_say)wait() say_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._050_say)wait()say_pc_name()say(gameforge.event_ramadan._060_say)pc.setqf("first_notice", 1)endwhen 33002.chat.gameforge.event_ramadan._070_npcChat with pc.getf("event_ramadan", "first_notice")==1 beginlocal setting = event_ramadan.setting()if pc.count_item(setting.bread) == 0 thensay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._80_say)local s=select(gameforge.event_ramadan._90_select_1 ,gameforge.event_ramadan._90_select_2)if 2==s thensay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._100_say)returnendsay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._110_say)wait()say_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._120_say)local s=select(gameforge.event_ramadan._130_select_1,gameforge.event_ramadan._130_select_2)if 2==s thensay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._100_say)returnendsay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._140_say)elseif pc.count_item(setting.bread) > 0 and pc.count_item(setting.bread) < 10 thensay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._150_say)elseif pc.count_item(setting.bread) >= 10 thensay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._160_say)wait()say_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._170_say)pc.give_item2(setting.candy,1)pc.remove_item(setting.bread,10)endif not event_ramadan.is_running() thennpc.purge()endend --whenwhen 33002.chat.gameforge.event_ramadan._180_npcChat with pc.getqf("first_notice")== 1 beginlocal setting = event_ramadan.setting()say_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._180_say)say(gameforge.event_ramadan._190_say)say(gameforge.event_ramadan._200_say)say_item_vnum(setting.plate)wait()say_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._210_say)end when 33003.chat.gameforge.event_ramadan._220_npcChat or 33004.chat.gameforge.event_ramadan._220_npcChat or 33005.chat.gameforge.event_ramadan._220_npcChat or 33006.chat.gameforge.event_ramadan._220_npcChat or 33007.chat.gameforge.event_ramadan._220_npcChat beginlocal setting = event_ramadan.setting()if pc.count_item(setting.iftar) == 0 thensay_title(gameforge.event_ramadan._230_sayTitle)say("")say(gameforge.event_ramadan._240_say)elseif pc.count_item(setting.iftar) > 0 thensay_title(gameforge.event_ramadan._230_sayTitle)say("")say(gameforge.event_ramadan._250_say)local s = select(gameforge.event_ramadan._260_select_1,gameforge.event_ramadan._260_select_2)if 2==s thensay_title(gameforge.event_ramadan._230_sayTitle)say("")say(gameforge.event_ramadan._270_say)returnendsay_title(gameforge.event_ramadan._230_sayTitle)say("")say(gameforge.event_ramadan._280_say)pc.give_item2(setting.box,1)pc.remove_item(setting.iftar,1)end if not event_ramadan.is_running() thennpc.purge()endendwhen 33002.chat.gameforge.event_ramadan._290_npcChat with pc.getf("event_ramadan","fig_exchange")==0 beginlocal setting = event_ramadan.setting()if get_time() > pc.getqf("duration") thensay_title(gameforge.event_ramadan._020_sayTitle)say("")say(gameforge.event_ramadan._300_say)pc.give_item2(setting.fruit)pc.setqf("duration",get_time()+60*60*24) --24helsesay_title(gameforge.event_ramadan._020_sayTitle)say(gameforge.event_ramadan._310_say)endend when 33002.chat.gameforge.event_ramadan._320_npcChat with event_ramadan.reward_period() and pc.getf("event_ramadan","fig_exchange")==0 beginlocal setting = event_ramadan.setting()say_title(gameforge.event_ramadan._020_sayTitle)say("")say(gameforge.event_ramadan._330_say)wait()if pc.count_item(setting.fruit)>= 5 then --more than 5say_title(gameforge.event_ramadan._020_sayTitle)say("")say(string.format(gameforge.event_ramadan._340_say, pc.count_item(setting.fruit)))say(gameforge.event_ramadan._350_say)local s=select(gameforge.event_ramadan._360_select_1, gameforge.event_ramadan._360_select_2)if 2==s thensay_title(gameforge.event_ramadan._020_sayTitle)say("")say(gameforge.event_ramadan._370_say)returnendsay_title(gameforge.event_ramadan._020_sayTitle)say("")say(gameforge.event_ramadan._380_say)say_reward(gameforge.event_ramadan._390_sayReward)say("")if pc.count_item(setting.fruit)>= 5 and pc.count_item(setting.fruit)<= 10 thenpc.give_item2(setting.horse1,1)elseif pc.count_item(setting.fruit)>= 11 and pc.count_item(setting.fruit)<= 19 thenpc.give_item2(setting.horse2,1)elseif pc.count_item(setting.fruit)>= 20 and pc.count_item(setting.fruit)<= 27 thenpc.give_item2(setting.horse3,1)elseif pc.count_item(setting.fruit)>= 28 thenpc.give_item2(setting.horse4,1)endpc.remove_item(setting.fruit,pc.count_item(setting.fruit))pc.setqf("fig_exchange",1)else --less than 5say_title(gameforge.event_ramadan._020_sayTitle)say("")say(gameforge.event_ramadan._400_say)endendwhen 30316.use beginlocal setting = event_ramadan.setting()if pc.count_item(setting.bread) >= 10 thenpc.remove_item(setting.bread, 10)pc.remove_item(setting.plate, 1)pc.give_item2(setting.iftar, 1)endend end --state