Merhaba, Hoşgeldin!

VSRO.org, Silkroad Online, Knight Online, Metin2 ve diğer çevrimiçi oyunlar için öncü bir yardım ve geliştirme platformudur. Misyonumuz, bilgi ve deneyim sahibi bireyleri, bilgiye ihtiyaç duyanlarla bir araya getirerek, zengin bir etkileşim ortamı yaratmak ve farklı bakış açılarını birleştirmektir. Topluluğumuzda güçlü bir işbirliği ve öğrenme kültürü oluşturarak, herkesin değerli katkılarda bulunmasını sağlıyoruz.

vSRO Çözüldü vSRO Starter Pack Oluşturma (Belirlenen İtemleri Verdirme)

Sieger

vSRO Developer, PK2 Editor
.
.
Katılım
6 Şub 2019
Mesajlar
2,443
Çözümler
6
Tepkime puanı
6,403
Puanları
303
Web sitesi
vsroeditor.com
Türk Lirası
0.00₺
Merhabalar,
Sistem bildiğimiz gift box mantığı ile çalışıyor, bir tablodan verileri çekip oyuncuya exec ile aktarıyor fakat şöyle bir sorunum var.
Farklı bir prosedür ile tek exec kullanarak tabloda ki tüm itemleri oyuncuya verdirebiliyorum.
Devil vermek istediğim an sorun burada başlıyor.
Bildiğiniz gibi male,female olmak üzere 2 devil var benim yapmak istediğim belirlenen ObjCharID Male ise Male Devil, Female ise Female devil vermesi.
Bunu tabloya eklemiyorum, ikinci bir exec ile verdirmeye çalışıyorum fakat hiç bi şekilde olmuyor.

Eğer tabloya eklersek nasıl yapabiliriz?
Ya da tabloya eklemez ikinci exec ile yaparsak nasıl yapabiliriz?

Bunun detaylı anlatımı ya da tam prosedürü hiç bir forum da yok.

Çözüm:

Tablodan item verdirmek yerine aşağıda yazmış olduğum şekilde sorun çözülmüştür.

Sorunu şu şekilde çözdüm, tablodan item vermiyor lakin bir tık daha ileri yürüttüm daha güzel ve temiz oldu.
USE [SRO_VT_SHARD] -- Varsa farklı bir DB adı yazabilir ya da kendinize özel bir DB oluşturup onun adını yazabilirsiniz.
GO
/****** Object: StoredProcedure [dbo].[_StarterPackBronz] Script Date: 20.06.2019 19:43:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[_StarterPackBronz]
@CharID INT
as

BEGIN
DECLARE @CharName_SpecialPack VARCHAR(64)=
(SELECT CharName16 FROM [SRO_VT_SHARD].[dbo].[_Char] WITH (NOLOCK) WHERE CharID=@CharID);
DECLARE @CharType_SpecialPack INT=
(SELECT RefObjID FROM SRO_VT_SHARD.._Char WITH (NOLOCK) WHERE CharID=@CharID);

EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_PREMIUM_VIETNAM_GOLDTIME_PLUS',1,0
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_COS_P_CAT_SCROLL',1,0

IF(@CharType_SpecialPack BETWEEN 1907 AND 1919) -->MALE CHINESE
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_M_NASRUN',1,0
END
ELSE IF(@CharType_SpecialPack BETWEEN 1920 AND 1932) -->FEMALE CHINESE
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_W_NASRUN',1,0
END
ELSE IF(@CharType_SpecialPack BETWEEN 14873 AND 14887) -->MALE EUROPEAN
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_M_NASRUN',1,0
END
ELSE IF(@CharType_SpecialPack BETWEEN 14888 AND 14900) -->FEMALE EUROPEAN
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_W_NASRUN',1,0
END
END
BEGIN
IF @Operation = '41' and (@ItemRefID = 42548) -- Starter Pack Bronz RefItemID
EXEC SRO_VT_SHARD.._StarterPackBronz @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END
2. prosedürü çoğaltmak ve birden çok starter pack eklemek isterseniz 2. prosedür yerine altta ki prosedürü kullanabilirsiniz.
BEGIN
IF @Operation = '41' and (@ItemRefID = 42548) -- Starter Pack Bronz RefItemID
EXEC SRO_VT_SHARD.._StarterPackBronz @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END

BEGIN
IF @Operation = '41' and (@ItemRefID = 42549) -- Starter Pack Silver RefItemID
EXEC SRO_VT_SHARD.._StarterPackSilver @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END

BEGIN
IF @Operation = '41' and (@ItemRefID = 42550) -- Starter Pack Gold RefItemID
EXEC SRO_VT_SHARD.._StarterPackGold @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END

BEGIN
IF @Operation = '41' and (@ItemRefID = 42551) -- Starter Pack King RefItemID
EXEC SRO_VT_SHARD.._StarterPackKing @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END
 
Son düzenleme:
Prosedürü spoiler'de olduğu şekile kadar getirdim.
Scroll'u 1. kullanımda tablodaki itemleri ve devil'i cinsiyete göre veriyor, herhangi bir sorun oluşmuyor.
Scroll'u 2. kullanımda tablodaki itemleri veriyor, devil'i vermiyor.
Scroll'u 3. kez kullanmak için konsoldan drop edip üstüme aldığım zaman çar olduğu gibi kalıyor, hareket etmiyor.
Client'i kapatıp, tekrar girmek isteyince Start'a tıklayınca öyle kalıyor ve GameServer hiç bir şekilde, hiç bir hata vermiyor.

IF (@Operation = 41 AND @ItemRefID = 42548) -- STARTER PACK BRONZE
begin
declare @RefObjID int
Select @RefObjID=RefObjID from SRO_VT_SHARD.dbo._Char where CharID = @CharID
declare @charname1 varchar(64)
Select @charname1=(select CharName16 from [SRO_VT_SHARD].[dbo].[_Char] where CharID = @charID);
declare @GiftTh varchar(129)
declare items cursor for select GiftItems from [SRO_VT_SHARD].[dbo].[_MinikBirKulStarterPackBronze] ORDER BY NEWID()
open items
fetch next from items into @GiftTh
while(@@FETCH_STATUS=0)
begin
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @charname1, @GiftTh, 1, 0
fetch next from items into @GiftTh
end
close items
deallocate items
end
begin
if(@RefObjID between 1907 and 1919)
begin
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @charname1,'ITEM_MALL_AVATAR_M_NASRUN',1,0
end
else if(@RefObjID between 1920 and 1932)
begin
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @charname1,'ITEM_MALL_AVATAR_W_NASRUN',1,0
end
end
 
Oyla 0
Prosedürü spoiler'de olduğu şekile kadar getirdim.
Scroll'u 1. kullanımda tablodaki itemleri ve devil'i cinsiyete göre veriyor, herhangi bir sorun oluşmuyor.
Scroll'u 2. kullanımda tablodaki itemleri veriyor, devil'i vermiyor.
Scroll'u 3. kez kullanmak için konsoldan drop edip üstüme aldığım zaman çar olduğu gibi kalıyor, hareket etmiyor.
Client'i kapatıp, tekrar girmek isteyince Start'a tıklayınca öyle kalıyor ve GameServer hiç bir şekilde, hiç bir hata vermiyor.

IF (@Operation = 41 AND @ItemRefID = 42548) -- STARTER PACK BRONZE
begin
declare @RefObjID int
Select @RefObjID=RefObjID from SRO_VT_SHARD.dbo._Char where CharID = @CharID
declare @charname1 varchar(64)
Select @charname1=(select CharName16 from [SRO_VT_SHARD].[dbo].[_Char] where CharID = @charID);
declare @GiftTh varchar(129)
declare items cursor for select GiftItems from [SRO_VT_SHARD].[dbo].[_MinikBirKulStarterPackBronze] ORDER BY NEWID()
open items
fetch next from items into @GiftTh
while(@@FETCH_STATUS=0)
begin
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @charname1, @GiftTh, 1, 0
fetch next from items into @GiftTh
end
close items
deallocate items
end
begin
if(@RefObjID between 1907 and 1919)
begin
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @charname1,'ITEM_MALL_AVATAR_M_NASRUN',1,0
end
else if(@RefObjID between 1920 and 1932)
begin
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @charname1,'ITEM_MALL_AVATAR_W_NASRUN',1,0
end
end
Yaptığınız işlemde mantık hatası var. While döngüsü içinde işlem gerçekleştiriyorsunuz. Ve döngü kaç kere dönerse o kadar bu itemden veriyor.
Bu tarz döngüler sql için tehlikeli bir durumdur. Sonradan eklediğiniz kod döngü içinde döngüye göre düzenlenmiş bir işlem olmadığı için, sorun teşkil ediyor.
Tekrarlıyorum, özelden tw atarsanız sorunu halledebiliriz, sizde saç baş yolmamış olursunuz : )
 
Oyla 0
Merhabalar Gift box ile ilgili güncel prosodor budur işinizi görürse kodları kendinize göre ayarlayın olacaktır.. sro vt logg add logg item

----------------ArenaBox CodedBYSAMED-------------
IF (@Operation = 41 AND @ItemRefID = 72210)
begin
declare @ItemCodeName varchar(129)
declare @ItemUnit varchar(129)
declare @ItemPlus varchar(129)
declare @CharGift varchar(64)
Set @CharGift = (Select CharName16 from SRO_VT_SHARD.._Char where CharID = @CharID);
set @ItemCodeName = (SELECT TOP 1 ItemCodeName FROM _ArenaBox ORDER BY NEWID())
set @ItemUnit =10000 (SELECT ItemUnit FROM _ArenaBox where ItemCodeName=@ItemCodeName)
set @ItemPlus = (SELECT ItemPlus FROM _ArenaBox where ItemCodeName=@ItemCodeName)
exec SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharGift, @ItemCodeName,@ItemUnit ,@ItemPlus
 
Son düzenleme:
Oyla 0
Gift box için en iyi yöntemi daha önce paylaşmıştım. Buradan ulaşabilirsiniz
Ziyaretçiler için gizlenmiş link,görmek için Giriş yap veya üye ol.

Scroll'u üst üste kullandıgın zaman birinde itemin gelip diger durumlarda gelmemesi olayının sebebi transaction tamamlanmadan senin oyun içerisindeki ışınlanma işlemini gerçekleştiriyor olmandan kaynaklı, daha doğrusu oyun içerisindeki hıza transaction hızı yetişemiyor ki normalde max 15~20ms de bu tarz işlemlerin tamamlanması gerekir. Bunun sebebi de yazdığın prosedürün performans düşmanı olmasından kaynaklanıyor.

Örnek starter pack kodu

SQL:
İçeriği görebilmek için Giriş yap ya da üye ol.
 
Oyla 0
Yaptığınız işlemde mantık hatası var. While döngüsü içinde işlem gerçekleştiriyorsunuz. Ve döngü kaç kere dönerse o kadar bu itemden veriyor.
Bu tarz döngüler sql için tehlikeli bir durumdur. Sonradan eklediğiniz kod döngü içinde döngüye göre düzenlenmiş bir işlem olmadığı için, sorun teşkil ediyor.
Tekrarlıyorum, özelden tw atarsanız sorunu halledebiliriz, sizde saç baş yolmamış olursunuz : )

Team verecek durumda değilim malesef, bu yüzden vermedim.
Prosedür ve yaptığım işlemler yazıyor, GS'nin hata vermediğini de belirttim, oluşan sorunu da belirttim.
Buna ek yapılabilecek bir şey var ise yaparsanız memnun oluruz.

Anlamış değilim paylaştığım prosüdür sorunsuz diyorum halen aynı şeyi döngülüyorsunuz :)
Çalışmıyor diyorum halen aynı şeyi söylüyorsunuz :)

Gift box için en iyi yöntemi daha önce paylaşmıştım. Buradan ulaşabilirsiniz
Ziyaretçiler için gizlenmiş link,görmek için Giriş yap veya üye ol.

Scroll'u üst üste kullandıgın zaman birinde itemin gelip diger durumlarda gelmemesi olayının sebebi transaction tamamlanmadan senin oyun içerisindeki ışınlanma işlemini gerçekleştiriyor olmandan kaynaklı, daha doğrusu oyun içerisindeki hıza transaction hızı yetişemiyor ki normalde max 15~20ms de bu tarz işlemlerin tamamlanması gerekir. Bunun sebebi de yazdığın prosedürün performans düşmanı olmasından kaynaklanıyor.

Örnek starter pack kodu

SQL:
İçeriği görebilmek için Giriş yap ya da üye ol.
Bu sorunsuz olarak çalışıyor, fazla exec koyulması sorun yarattığı için kullanmak istemiyordum amacım direkt olarak tablodan verilen itemleri kullanmasıydı.
Sanırım bunu yapamayacağız, bunun için sorunu bu şekilde çözülmüş olarak varsayıyorum.

Destek, öneri ve yorumlarınız için teşekkür ederim.
 
Oyla 0
Tekrardan merhaba sorunu şu şekilde çözdüm, tablodan item vermiyor lakin bir tık daha ileri yürüttüm daha güzel ve temiz oldu.
USE [SRO_VT_SHARD] -- Varsa farklı bir DB adı yazabilir ya da kendinize özel bir DB oluşturup onun adını yazabilirsiniz.
GO
/****** Object: StoredProcedure [dbo].[_StarterPackBronz] Script Date: 20.06.2019 19:43:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[_StarterPackBronz]
@CharID INT
as

BEGIN
DECLARE @CharName_SpecialPack VARCHAR(64)=
(SELECT CharName16 FROM [SRO_VT_SHARD].[dbo].[_Char] WITH (NOLOCK) WHERE CharID=@CharID);
DECLARE @CharType_SpecialPack INT=
(SELECT RefObjID FROM SRO_VT_SHARD.._Char WITH (NOLOCK) WHERE CharID=@CharID);

EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_PREMIUM_VIETNAM_GOLDTIME_PLUS',1,0
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_COS_P_CAT_SCROLL',1,0

IF(@CharType_SpecialPack BETWEEN 1907 AND 1919) -->MALE CHINESE
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_M_NASRUN',1,0
END
ELSE IF(@CharType_SpecialPack BETWEEN 1920 AND 1932) -->FEMALE CHINESE
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_W_NASRUN',1,0
END
ELSE IF(@CharType_SpecialPack BETWEEN 14873 AND 14887) -->MALE EUROPEAN
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_M_NASRUN',1,0
END
ELSE IF(@CharType_SpecialPack BETWEEN 14888 AND 14900) -->FEMALE EUROPEAN
BEGIN
EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_SpecialPack,'ITEM_MALL_AVATAR_W_NASRUN',1,0
END
END
BEGIN
IF @Operation = '41' and (@ItemRefID = 42548) -- Starter Pack Bronz RefItemID
EXEC SRO_VT_SHARD.._StarterPackBronz @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END
2. prosedürü çoğaltmak ve birden çok starter pack eklemek isterseniz 2. prosedür yerine altta ki prosedürü kullanabilirsiniz.
BEGIN
IF @Operation = '41' and (@ItemRefID = 42548) -- Starter Pack Bronz RefItemID
EXEC SRO_VT_SHARD.._StarterPackBronz @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END

BEGIN
IF @Operation = '41' and (@ItemRefID = 42549) -- Starter Pack Silver RefItemID
EXEC SRO_VT_SHARD.._StarterPackSilver @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END

BEGIN
IF @Operation = '41' and (@ItemRefID = 42550) -- Starter Pack Gold RefItemID
EXEC SRO_VT_SHARD.._StarterPackGold @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END

BEGIN
IF @Operation = '41' and (@ItemRefID = 42551) -- Starter Pack King RefItemID
EXEC SRO_VT_SHARD.._StarterPackKing @CharID --1.Prosedürü hangi tabloya okuttuysanız onun adını yazın.
END
 
Son düzenleme:
Oyla 0
@Senua ya teşekkür et.. Sana yolu göstermiş zaten kimse bu kadar yapamaz Sanırım bunu yapamayacağız, bunun için sorunu bu şekilde çözülmüş olarak varsayıyorum demek hiç hoş değil
 
Oyla 0
@Senua ya teşekkür et.. Sana yolu göstermiş zaten kimse bu kadar yapamaz Sanırım bunu yapamayacağız, bunun için sorunu bu şekilde çözülmüş olarak varsayıyorum demek hiç hoş değil

Dostum, benim yapmak istediğim bu değildi topic'in ilk postunu okursan zaten bunları yapabildiğimi ve istediğim şekilde dizayn etmeye çalıştığımı anlayabilirsin.
Bunun çözümünü ve detaylarını burda paylaştığım için zaten bu Senua ve forumda ki diğer tüm arkadaşlara teşekkür içindir.
Yoksa çözümü bulur, yapar çeker giderim. Akıl vermek yerine, çözümü paylaştığım için teşekkür etmeye ne dersin?:giggle:
 
Oyla 0
Geri
Üst Alt