Neler yeni

Vsro Servere Paket Box Sistemi Ekleme

admin

Joymax Family
Forum Yöneticisi
Aileden Biri
Joymax Amiral
Katılım
5 Şub 2021
Mesajlar
90
Tepkime puanı
38
Puanları
118
Ülke
TÜRKİYE
Ad
JoymaxTR
Soyad
Family
Discord
JoymaxTR#7857
Herkese merhaba,

Artık Private server'ların olmazsa olmazı Gift box'lar adını sanını değiştirsekte bu box'un mantığı her zaman aynı. Box kullanıldığı zaman _AddLogItem prosedüründeki kod satırı tetikleniyor ve box içeriğinden çıkacak olan itemlerin olduğu tablodan rastege bir row seçip bunu oyuncuya veriliyor. Peki siz bu box'un içinden çıkacak item'lerin belirli bir rate ile çıkmasını istiyorsanız o zaman ne yapmanız gerekiyor? İşte Aşağıda bulunan kod bu derdimizde son veriyor. Artık 100 gift box kullanıldığında içerisinden 1 tane xxx itemi çıksın diyebiliyoruz.

Öncelikle işe tablomuzu oluşturarak başlayalım.

Kod:
USE [SRO_VT_LOG]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[PICK_Common](
    [ID] INT IDENTITY(1,1) NOT NULL,
    [GroupID] INT NOT NULL,
    [GroupCodeName] VARCHAR(MAX) NOT NULL,
    [ItemCodeName] VARCHAR(MAX) NOT NULL,
    [ItemCount] INT NOT NULL,
    [ItemPlus] INT NOT NULL,
    [Ratio] DECIMAL(4,3) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[PICK_Common] ADD  CONSTRAINT [DF_PICK_Common_ItemCount]  DEFAULT (1) FOR [ItemCount]
GO

ALTER TABLE [dbo].[PICK_Common] ADD  CONSTRAINT [DF_PICK_Common_ItemPlus]  DEFAULT (0) FOR [ItemPlus]
GO

ALTER TABLE [dbo].[PICK_Common] ADD  CONSTRAINT [DF_PICK_Common_Ratio]  DEFAULT (0) FOR [Ratio]
GO

Oluşturduğumuz bu tablomuzda GroupID veGroupCodeName'i her box için giriyoruz. Örneğin; 5 farklı gift box yaptınız içeriklerini tabloya girerken her boxun kendi GroupID si ve GroupCodeName si olmalı.

İlgili prosedürümüz;


Kod:
USE [SRO_VT_LOG]
GO

/****** Object:  StoredProcedure [dbo].[_AddLogItem]    Script Date: 7.02.2019 11:33:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER  PROCEDURE [dbo].[_AddLogItem]
    @CharID            INT,
    @ItemRefID        INT,
    @ItemSerial        BIGINT,
    @dwData            INT,
    @TargetStorage    TINYINT,
    @Operation        TINYINT,
    @Slot_From        TINYINT,
    @Slot_To        TINYINT,
    @EventPos        VARCHAR(64),
    @strDesc        VARCHAR(128),
    @Gold            BIGINT
AS

----==========================================================================================================----
    ------------------------------------------- PICK Selection -----------------------------------------------
    IF(@Operation=41 AND @slot_To=255 AND (@ItemRefID IN (ID_BOX_1,ID_BOX_2,ID_BOX_3,ID_BOX_4,ID_BOX_5,ID_BOX_6,ID_BOX_7)))
    BEGIN
        DECLARE @CharName_PICK VARCHAR(64)=(SELECT CharName16 FROM [SRO_VT_SHARD].[dbo].[_Char] WITH (NOLOCK) WHERE CharID=@CharID);
        DECLARE @GoupID INT
        DECLARE @ItemCodeName_PICK VARCHAR(MAX), @ItemCount_PICK INT, @ItemPlus_PICK INT

        SELECT @GoupID=
            CASE
            WHEN @ItemRefID=ID_BOX_1 THEN 1 --Pick Of Group1
            WHEN @ItemRefID=ID_BOX_2 THEN 2 --Pick of Group2
            WHEN @ItemRefID=ID_BOX_3 THEN 3 --Pick of Group3
            WHEN @ItemRefID=ID_BOX_4 THEN 4 --Pick of Group4
            WHEN @ItemRefID=ID_BOX_5 THEN 5 --Pick of Group5
            WHEN @ItemRefID=ID_BOX_6 THEN 6 --Pick of Group6
            WHEN @ItemRefID=ID_BOX_7 THEN 7 --Pick Of Group7
            ELSE 0
            END

        DECLARE @Random FLOAT = RAND()

        ;WITH OddIntervals AS
        (
        SELECT
        O.*,
        OddStart = CONVERT(DECIMAL(4,3), SUM(O.[Ratio]) OVER (ORDER BY O.[ID]) - O.[Ratio]),
        OddsEnd = CONVERT(DECIMAL(4,3), SUM(O.[Ratio]) OVER (ORDER BY O.[ID]))
        FROM PICK_Common AS O WHERE
        GroupID=@GoupID
        )
        SELECT @ItemCodeName_PICK=O.ItemCodeName , @ItemCount_PICK=O.ItemCount , @ItemPlus_PICK=O.ItemPlus FROM OddIntervals AS O WHERE
        GroupID=@GoupID            AND
        @Random > O.OddStart    AND
        @Random <= O.OddsEnd

        EXEC SRO_VT_SHARD.dbo._ADD_ITEM_EXTERN @CharName_PICK,@ItemCodeName_PICK,@ItemCount_PICK,@ItemPlus_PICK

    END
----==========================================================================================================----

    DECLARE @len_pos INT, @len_desc INT
    SET @len_pos = LEN(@EventPos)
    SET @len_desc = LEN(@strDesc)
    IF (@len_pos > 0 AND @len_desc > 0)
    BEGIN
        RETURN -1
    END
    ELSE IF (@len_pos > 0 AND @len_desc = 0)
    BEGIN
        RETURN -1
    END
    ELSE IF (@len_pos = 0 AND @len_desc > 0)
    BEGIN
        RETURN -1
    END
    ELSE IF (@len_pos = 0 AND @len_desc = 0)
    BEGIN
        RETURN -1
    END
    IF (@Operation = 35)
    BEGIN
        RETURN -1
    END

Prosedürü 7 farklı gift box olma durumu için yazdım. İsterseniz bunu arttırabilir yada azaltabilirsiniz.

Önemli Not: Talomuzdaki Ratio kısmının data type'ı DECIMAL(4,3) yani ondalıklı sayı girdiğimizde virgülün sağında 3 basamak kullanabiliriz, fazlasını yazarsak SQL otomatik yuvarlama yapar. Bu aynı zamanda ratemizi 1000 de 1 durumu ile kısıtlamakta(10 binde bir rate ayarı yapamazsınız bu durumda bunun için data tipini ayarlamanız gerekmektedir).

Analiz: Intel(R) Core(TM) i7-4710MQ işlemcili, Windows10 Pro işletim sisteminde ve SQL Server 2017 Developer sürümü kullanılarak denenen cihazda, _AddLogItem prosedürünün oluşturulan gift box'lardan birisi oyun içerisinde kullanılarak tetiklendiği zaman işlemi tamamlama süresi 2ms olarak kaydedilmiştir(1 saniye=1000ms).
 
Son düzenleme:

Nexima12

Aileden Biri
Katılım
30 Eki 2021
Mesajlar
1
Tepkime puanı
0
Puanları
101
Ad
Kasım
Soyad
Başer
Discord
link kırık hocam
 

admin

Joymax Family
Forum Yöneticisi
Aileden Biri
Joymax Amiral
Katılım
5 Şub 2021
Mesajlar
90
Tepkime puanı
38
Puanları
118
Ülke
TÜRKİYE
Ad
JoymaxTR
Soyad
Family
Discord
JoymaxTR#7857
Konu Güncellenmiştir. :)
 

Tech9

Aileden Biri
Private Server Sahibi
Aileden Biri
Katılım
2 Kas 2021
Mesajlar
6
Tepkime puanı
0
Puanları
101
Ülke
TÜRKİYE
Ad
Edward
Soyad
Elessea
Discord
s.a Yaptım Lakin sadece 1 adet ödül veriyor 5 tane item koydum sadece ilk satırdakini veriyor ratio kısmı 0.2 0.2 0.2 diye toplamda 1 olarak ayarladım ama sadece bir adet item veriyor sebebeni ne acaba her şeyim doğru görüküyor anlayamadım. Yardım ederseniz sevinirim
 

admin

Joymax Family
Forum Yöneticisi
Aileden Biri
Joymax Amiral
Katılım
5 Şub 2021
Mesajlar
90
Tepkime puanı
38
Puanları
118
Ülke
TÜRKİYE
Ad
JoymaxTR
Soyad
Family
Discord
JoymaxTR#7857
s.a Yaptım Lakin sadece 1 adet ödül veriyor 5 tane item koydum sadece ilk satırdakini veriyor ratio kısmı 0.2 0.2 0.2 diye toplamda 1 olarak ayarladım ama sadece bir adet item veriyor sebebeni ne acaba her şeyim doğru görüküyor anlayamadım. Yardım ederseniz sevinirim
Group Codename ayarlı mı ve count ödül 1 tane verir zaten 5 taneden bir adet'i random oranı ile verir.
 

Tech9

Aileden Biri
Private Server Sahibi
Aileden Biri
Katılım
2 Kas 2021
Mesajlar
6
Tepkime puanı
0
Puanları
101
Ülke
TÜRKİYE
Ad
Edward
Soyad
Elessea
Discord
Şimdi Şans Kutucuğuna 5 Adet İtem verdim sadece ilk sıradakini veriyor sorunum bu count bir adet vermesini istiyorum .Farklı ödül vermesi için aynı şekilde ekleyim ıd kısmınımı değiştirmem gerikiyr yani her item için ayrı bir query okutmam gerekiyor
 

Tech9

Aileden Biri
Private Server Sahibi
Aileden Biri
Katılım
2 Kas 2021
Mesajlar
6
Tepkime puanı
0
Puanları
101
Ülke
TÜRKİYE
Ad
Edward
Soyad
Elessea
Discord
Sorun Çözülmüştür.
 
Üst