Toplama Pet Bugunu Önleme

Konuyu başlatan #1
Katılım
25 Tem 2015
Mesajlar
1,613
Beğeniler
5
Konum
KOCAELİ
Arkadaşlar merhaba,
Bazı serverlerde toplama petlerini 5 liste vs yaparlar. Bu tamamen büyük bir hatadır. Çünkü 5 liste yapılan petler potansiyel bug sebebidir. 
Bug derken neyi kastediyorum? 
Arkadaşlar birçoğunuz rast gelmişinizdir. GM derki PETLER BUGA GİRMİŞ BUGLU PET OYUNA GİRİNCE OYUN CHECK OLUYOR..
İşte bunun sebebi 5 liste olan toplama petlerinden sadece 1 tanesinin buga girmesi ile birlikte gameserver'e hata göndererek Gameserver'i kapamasıdır.

Peki bu bug'dan nasıl korunacaksınız? 
Tek çözümü var oda ASLA petleri 5 liste yapmayacaksınız ve hatta petlerin sayfası ile ilgili hiçbir değişim yapmayacaksınız.
Bunu bilen arkadaşlar zaten prosedürlerini düzenleyecektir ama bilmeyenler için ben 2 prosedür vericem. Bunları ayrı ayrı 2 adet New Query açarak içine yapıştırın ve F5 ile okutun.
Bu query'ler orjinaldir. Yani editle pet listeleri bozulmamıştır.
Dipnot: Prosedür-1'de kervan petleri ile yapılan bir bugu önleyici korumada mevcuttur. Bir taşla iki kuş ;)


Prosedür-1
Kod:
USE [SRO_VT_SHARD]
GO
/****** Object:  StoredProcedure [dbo].[_AddNewCOS]    Script Date: 15.07.2016 13:31:41 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[_AddNewCOS]
	@OwnerCharID	int,
	@RefObjID	int,
	@Level		int,
	@HP		int,
	@MP		int,
	@HGP		int,
	@KeeperNPC	int,
	@State		int,
	@InventorySize  int,
	@itemID		int,
	@PickItemConfig tinyint,
	@RentEndTime 	smalldatetime
as

begin tran

	declare @COS_ID	int
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--		pet_skill_item (ÃÖ¼±È£)		
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	declare @MaxInventorySize tinyint
	select @MaxInventorySize = InventorySize
	from _RefObjCommon, _RefObjChar
	where _RefObjCommon.ID = @RefObjID and _RefObjCommon.Link = _RefObjChar.ID
	
	if( @@rowcount = 0 or @MaxInventorySize < @InventorySize )
	begin
		rollback tran
		return -5
	end

	insert into _CharCOS values (@OwnerCharID, @RefObjID, @HP, @MP, @KeeperNPC, @State, NULL, @Level, 0, @HGP, @PickItemConfig, @RentEndTime)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	set @COS_ID = @@identity
	if (@COS_ID = 0 OR @@error <> 0)
	begin
		rollback tran
		return -1
	end

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--		pet_skill_item (ÃÖ¼±È£)		
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	if (@MaxInventorySize > 0)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	begin
		declare @Slot  int
		set @Slot = 0
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--		pet_skill_item (ÃÖ¼±È£)		
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		while (@Slot < @MaxInventorySize)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		begin
			insert into _InvCOS values(@COS_ID, @Slot, 0)
			if (@@error <> 0)
			begin
				-- Àκ¥Å丮 »ý¼º ½ÇÆÐ!
				rollback tran
				return -2
			end	
		
			set @Slot = @Slot + 1
		end
	end
	
/*	--´õ ÀÌ»ó ÀÌ Ä÷³¿¡´Â µ¥ÀÌÅ͸¦ ³ÖÁö ¾Ê´Â´Ù!
	UPDATE _Char SET EngagedCOS = @COS_ID WHERE CharID = @OwnerCharID
	IF (@@ERROR <> 0 OR @@ROWCOUNT = 0)
	BEGIN
		ROLLBACK TRANSACTION
		RETURN -3
	END
*/
	if( @itemID <> 0 )
	begin
		update _Items set Data = @COS_ID where ID64 = @itemID
		if( @@error <> 0 or @@rowcount = 0 )
		begin
			rollback transaction
			return -4
		end
		
	end

commit tran

declare @bla varchar(max);

select @bla = codename128 from _refobjcommon where ID = @ReFObjID

if @bla like '%COS_T%'

begin

WAITFOR DELAY '0:00:00.5' --süre

END

return @CoS_ID
Prosedür-2
Kod:
USE [SRO_VT_SHARD]
GO
/****** Object:  StoredProcedure [dbo].[_AddTimedJobForPet]    Script Date: 15.07.2016 13:31:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--	pet_skill_item (ÃÖ¼±È£)		
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

ALTER PROCEDURE [dbo].[_AddTimedJobForPet]
	@CharID			int,
	@Category		tinyint,
	@JobID			int,
	@TimeToKeep		int,
	@Data1			int,
	@Data2			int,
	@Data3			int,
	@Data4			int,
	@Data5			int,
	@Data6			int,
	@Data7			int,
	@Data8			int,
	@Serial64		bigint
as
	if (not exists (select ID from _CharCOS with (nolock) where ID = @CharID))
		return -1

	if (@TimeToKeep <= 0)
		return -2

	declare @NewJobID int
	set @NewJobID = 0

	insert into _TimedJobForPet values(@CharID, @Category, @JobID, @TimeToKeep, @Data1, @Data2, @Data3, @Data4, @Data5, @Data6, @Data7, @Data8, @Serial64, 0)
	set @NewJobID = @@identity

	if (@@error <> 0 or @@rowcount = 0)
		return -3

	return @NewJobID

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
Katılım
6 Ara 2018
Mesajlar
89
Beğeniler
11
Yani pet çantasını 5/7 açtım 5 envanter açtım Emek server'de sıkıntı yaratırmı bu kullandıgım procedür


SQL:
USE [SRO_VT_SHARD]
GO
/****** Object:  StoredProcedure [dbo].[_AddNewCOS]    Script Date: 01/05/2019 12:11:51 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[_AddNewCOS]
    @OwnerCharID    int,
    @RefObjID    int,
    @Level        int,
    @HP        int,
    @MP        int,
    @HGP        int,
    @KeeperNPC    int,
    @State        int,
    @InventorySize  int,
    @itemID        int,
    @PickItemConfig tinyint,
    @RentEndTime     smalldatetime
as

begin tran

    declare @COS_ID    int
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--        pet_skill_item (ÃÖ¼±È£)       
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    declare @MaxInventorySize tinyint
    select @MaxInventorySize = InventorySize
    from _RefObjCommon, _RefObjChar
    where _RefObjCommon.ID = @RefObjID and _RefObjCommon.Link = _RefObjChar.ID
    
    if( @@rowcount = 0 or @MaxInventorySize < @InventorySize )
    begin
        rollback tran
        return -5
    end

    insert into _CharCOS values (@OwnerCharID, @RefObjID, @HP, @MP, @KeeperNPC, @State, NULL, @Level, 0, @HGP, @PickItemConfig, @RentEndTime)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    set @COS_ID = @@identity
    if (@COS_ID = 0 OR @@error <> 0)
    begin
        rollback tran
        return -1
    end

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--        pet_skill_item (ÃÖ¼±È£)       
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    if (@MaxInventorySize > 0)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    begin
        declare @Slot  int
        set @Slot = 0
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--        pet_skill_item (ÃÖ¼±È£)       
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        while (@Slot < @MaxInventorySize)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        begin
            insert into _InvCOS values(@COS_ID, @Slot, 0)
            if (@@error <> 0)
            begin
                -- Àκ¥şä¸® »ı¼º ½ÇÆĞ!
                rollback tran
                return -2
            end   
        
            set @Slot = @Slot + 1
        end
    end
    
/*    --´õ ÀÌ»ó ÀÌ Ä÷³¿¡´Â µ¥ÀÌşÍ¸¦ ³ÖÁö ¾Ê´Â´Ù!
    UPDATE _Char SET EngagedCOS = @COS_ID WHERE CharID = @OwnerCharID
    IF (@@ERROR <> 0 OR @@ROWCOUNT = 0)
    BEGIN
        ROLLBACK TRANSACTION
        RETURN -3
    END
*/
    if( @itemID <> 0 )
    begin
        update _Items set Data = @COS_ID where ID64 = @itemID
        if( @@error <> 0 or @@rowcount = 0 )
        begin
            rollback transaction
            return -4
        end
        
        --BEGIN ADDITIONAL 112 SLOT IN GRAB PETS FOR 7684 DAYS
        declare @Serial64 bigint
        select @Serial64 = Serial64 from _Items where Data = @COS_ID
        exec _AddTimedJobForPet @COS_ID,5,22926,1992999999,1111708465,1,112,0,0,0,0,0,@Serial64
        --BEGIN ADDITIONAL 112 SLOT IN GRAB PETS FOR 7684 DAYS
        
    end

    commit tran

return @COS_ID
 
Katılım
24 Ara 2018
Mesajlar
25
Beğeniler
10
Yani pet çantasını 5/7 açtım 5 envanter açtım Emek server'de sıkıntı yaratırmı bu kullandıgım procedür


SQL:
USE [SRO_VT_SHARD]
GO
/****** Object:  StoredProcedure [dbo].[_AddNewCOS]    Script Date: 01/05/2019 12:11:51 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[_AddNewCOS]
    @OwnerCharID    int,
    @RefObjID    int,
    @Level        int,
    @HP        int,
    @MP        int,
    @HGP        int,
    @KeeperNPC    int,
    @State        int,
    @InventorySize  int,
    @itemID        int,
    @PickItemConfig tinyint,
    @RentEndTime     smalldatetime
as

begin tran

    declare @COS_ID    int
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--        pet_skill_item (ÃÖ¼±È£)      
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    declare @MaxInventorySize tinyint
    select @MaxInventorySize = InventorySize
    from _RefObjCommon, _RefObjChar
    where _RefObjCommon.ID = @RefObjID and _RefObjCommon.Link = _RefObjChar.ID
   
    if( @@rowcount = 0 or @MaxInventorySize < @InventorySize )
    begin
        rollback tran
        return -5
    end

    insert into _CharCOS values (@OwnerCharID, @RefObjID, @HP, @MP, @KeeperNPC, @State, NULL, @Level, 0, @HGP, @PickItemConfig, @RentEndTime)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    set @COS_ID = @@identity
    if (@COS_ID = 0 OR @@error <> 0)
    begin
        rollback tran
        return -1
    end

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--        pet_skill_item (ÃÖ¼±È£)      
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    if (@MaxInventorySize > 0)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    begin
        declare @Slot  int
        set @Slot = 0
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--        pet_skill_item (ÃÖ¼±È£)      
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        while (@Slot < @MaxInventorySize)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        begin
            insert into _InvCOS values(@COS_ID, @Slot, 0)
            if (@@error <> 0)
            begin
                -- Àκ¥şä¸® »ı¼º ½ÇÆĞ!
                rollback tran
                return -2
            end  
       
            set @Slot = @Slot + 1
        end
    end
   
/*    --´õ ÀÌ»ó ÀÌ Ä÷³¿¡´Â µ¥ÀÌşÍ¸¦ ³ÖÁö ¾Ê´Â´Ù!
    UPDATE _Char SET EngagedCOS = @COS_ID WHERE CharID = @OwnerCharID
    IF (@@ERROR <> 0 OR @@ROWCOUNT = 0)
    BEGIN
        ROLLBACK TRANSACTION
        RETURN -3
    END
*/
    if( @itemID <> 0 )
    begin
        update _Items set Data = @COS_ID where ID64 = @itemID
        if( @@error <> 0 or @@rowcount = 0 )
        begin
            rollback transaction
            return -4
        end
       
        --BEGIN ADDITIONAL 112 SLOT IN GRAB PETS FOR 7684 DAYS
        declare @Serial64 bigint
        select @Serial64 = Serial64 from _Items where Data = @COS_ID
        exec _AddTimedJobForPet @COS_ID,5,22926,1992999999,1111708465,1,112,0,0,0,0,0,@Serial64
        --BEGIN ADDITIONAL 112 SLOT IN GRAB PETS FOR 7684 DAYS
       
    end

    commit tran

return @COS_ID
Konuyu detaylı okumanı ve okuduğunu anlamanı rica ediyorum.
Bu bir bug'tur. Hemde çok kötü bir bug. Grab (toplama) pet'lerinin sayfası 1 sayfa olmalı.
5 sayfa açarsanız oyunda bug oluşur, gs çöker, oyuncuların dc yer, crash olur, bir dünya hata ile karşılaşırsın.

Yukarı da yazılı olan prosedürleri okut ve sorunsuz olarak çalışmaya devam et.

Not: Birinci prosedür de kervan petlerine delay ekleme mevcut. Bunu kullanmak istemezsen, Armağan'ın paylaştığı birinci prosedür yerine, aşağıda benim verdiğimi okut.

USE [SRO_VT_SHARD]
GO
/****** Object: StoredProcedure [dbo].[_AddNewCOS] Script Date: 15.07.2016 13:31:41 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[_AddNewCOS]
@OwnerCharID int,
@RefObjID int,
@Level int,
@HP int,
@MP int,
@HGP int,
@KeeperNPC int,
@State int,
@InventorySize int,
@itemID int,
@PickItemConfig tinyint,
@RentEndTime smalldatetime
as

begin tran

declare @COS_ID int
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- pet_skill_item (ÃÖ¼±È£)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

declare @MaxInventorySize tinyint
select @MaxInventorySize = InventorySize
from _RefObjCommon, _RefObjChar
where _RefObjCommon.ID = @RefObjID and _RefObjCommon.Link = _RefObjChar.ID

if( @@rowcount = 0 or @MaxInventorySize < @InventorySize )
begin
rollback tran
return -5
end

insert into _CharCOS values (@OwnerCharID, @RefObjID, @HP, @MP, @KeeperNPC, @State, NULL, @Level, 0, @HGP, @PickItemConfig, @RentEndTime)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
set @COS_ID = @@identity
if (@COS_ID = 0 OR @@error <> 0)
begin
rollback tran
return -1
end

--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- pet_skill_item (ÃÖ¼±È£)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
if (@MaxInventorySize > 0)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
begin
declare @Slot int
set @Slot = 0
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- pet_skill_item (ÃÖ¼±È£)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
while (@Slot < @MaxInventorySize)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
begin
insert into _InvCOS values(@COS_ID, @Slot, 0)
if (@@error <> 0)
begin
-- Àκ¥Å丮 »ý¼º ½ÇÆÐ!
rollback tran
return -2
end

set @Slot = @Slot + 1
end
end

/* --´õ ÀÌ»ó ÀÌ Ä÷³¿¡´Â µ¥ÀÌÅ͸¦ ³ÖÁö ¾Ê´Â´Ù!
UPDATE _Char SET EngagedCOS = @COS_ID WHERE CharID = @OwnerCharID
IF (@@ERROR <> 0 OR @@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION
RETURN -3
END
*/
if( @itemID <> 0 )
begin
update _Items set Data = @COS_ID where ID64 = @itemID
if( @@error <> 0 or @@rowcount = 0 )
begin
rollback transaction
return -4
end

end

commit tran
return @CoS_ID
 
Katılım
23 Ara 2018
Mesajlar
15
Beğeniler
2
Konum
Hatay
Bu bir bug'tur. Hemde çok kötü bir bug. Grab (toplama) pet'lerinin sayfası 1 sayfa olmalı.
5 sayfa açarsanız oyunda bug oluşur, gs çöker, oyuncuların dc yer, crash olur, bir dünya hata ile karşılaşırsın.
Bu bug tam olarak nasıl oluşuyor ? Daha önce yaşamadığımdan ve merak ettiğimden soruyorum. Şimdiye kadar baktığım oyunlar da 5 sayfa grab pet görmedim ancak 2 sayfa açanlar var ve herhangi bir sorun olmuyor 1 sayfadan fazla açınca nasıl problem yaratıyor veritabanı kısmında bununla ilgili bir sınırlama mı var veya client/gs vb. bunlar mı probleme neden oluyor ??
 
Katılım
23 Nis 2016
Mesajlar
1,024
Beğeniler
109
Bu bug tam olarak nasıl oluşuyor ? Daha önce yaşamadığımdan ve merak ettiğimden soruyorum. Şimdiye kadar baktığım oyunlar da 5 sayfa grab pet görmedim ancak 2 sayfa açanlar var ve herhangi bir sorun olmuyor 1 sayfadan fazla açınca nasıl problem yaratıyor veritabanı kısmında bununla ilgili bir sınırlama mı var veya client/gs vb. bunlar mı probleme neden oluyor ??
ışınlanınca o açılan sayfalar kapanıyor sanırım oynadığım bir sroda görmüştüm itemi 4. sayfaya koymuştum ışınlandım baktım item yok :D petin çantasını genişletme scrol kullandım ve tekrar ışınlandım bu sefer item geldi geri :D
 
Katılım
23 Ara 2018
Mesajlar
15
Beğeniler
2
Konum
Hatay
ışınlanınca o açılan sayfalar kapanıyor sanırım oynadığım bir sroda görmüştüm itemi 4. sayfaya koymuştum ışınlandım baktım item yok :D petin çantasını genişletme scrol kullandım ve tekrar ışınlandım bu sefer item geldi geri :D
İlginç bir hataymış :D scroll kullanınca geri geliyor ise bu durumda bu hataya sebeb olan kısım gs sanırım
 
Katılım
23 Nis 2016
Mesajlar
1,024
Beğeniler
109
İlginç bir hataymış :D scroll kullanınca geri geliyor ise bu durumda bu hataya sebeb olan kısım gs sanırım
scrol çanta genişletme scrolu hemde 7 senelik bir svde denedim allahtan açık vardı gm konsolundan kendime scrol attım genişlettim çantayı düzeldi çantam yoksa gitmişti itemim :D o kadar stone bastım kodla indirip :D
düşün yani adamlarda bile aktif :D
 
Üst