vSRO Paylaşım vSRO - İçeriğine Rate Ayarlayarak Gift Box Yapma

Admin1

silkroadpvp.com.tr
Yönetici
Katılım
26 Ocak 2022
Mesajlar
511
Tepkime puanı
0
Puanları
0
Konum
KRAL
[HIDE]
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.

SQL:
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;
SQL:
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).
[/HIDE]
 
GroupID herhangi bir rakamdan ibaret mi yani her box için farklı bir group ıd mı yazmak gerekiyor.
1020ADVBOXITEM_ETC_ARCHEMY_UPPER_REINFORCE_RECIPE_AR_RARE_B_11100,001
1120ADVBOXITEM_ETC_ARCHEMY_UPPER_REINFORCE_RECIPE_AC_RARE_B_11100,001
1220ADVBOXITEM_ETC_ARCHEMY_UPPER_REINFORCE_RECIPE_WE_RARE_B_11100,001
1320ADVBOXITEM_ETC_ARCHEMY_UPPER_REINFORCE_RECIPE_SH_RARE_B_11100,001
1420ADVBOXITEM_ETC_ARCHEMY_UPPER_REINFORCE_RECIPE_WE_RARE_A_11101,000
1520ADVBOXITEM_ETC_ARCHEMY_UPPER_REINFORCE_RECIPE_SH_RARE_A_11100,010
Bu konuda yardımcı olabilecek misiniz? çünkü box itemine tıkladığımda hiç birşey vermiyor
 

Konu görüntüleyen kullanıcılar

Benzer konular

Geri
Üst