Script Anti-Dupe !

    Distribuiti

    TheKing
    Administrator
    Administrator

    Numărul mesajelor : 887
    Data nasterii : 01/05/1942
    Vârsta : 74
    Localizare : Raiul Pământean ...
    Joburi/Distractii : EuropeMedia Comunity
    Stare de spirit : Superb ...
    Data de inscriere : 05/12/2009
    Taur Cal

    Anunt Script Anti-Dupe !

    Mesaj  TheKing la data de Joi Feb 18, 2010 2:22 pm

    Acest script sterge toate itemele dupate !
    Il bagati in Query Analyzer , ii dati execute , si gata !
    De acum incolo toate iteme care vor fi dupate , se vor sterge !
    Cod:
    USE MUONLINE
    if exists(select * from dbo.sysobjects where type='p' and name='WZ_GetItemSerial')
    drop procedure WZ_GetItemSerial
    GO

    CREATE procedure WZ_GetItemSerial
    AS
    BEGIN
       DECLARE @ItemSerial int
       SET NOCOUNT ON
       BEGIN TRANSACTION
       UPDATE GameServerInfo set @ItemSerial = ItemCount = (case when ItemCount < 0x7effffff then ItemCount+1
       ELSE 1
       END)
       
       IF(@@error <> 0)
       BEGIN
          rollback transaction
          select-1
       END
       ELSE
       BEGIN
          commit transaction
          select @ItemSerial
       END
    END
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trg_CheckSameID]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[trg_CheckSameID]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AllItemsLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[AllItemsLog]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CopyLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[CopyLog]
    GO

    CREATE TABLE [dbo].[AllItemsLog] (
       [items_id] [int] IDENTITY (1, 1) NOT NULL ,
       [items_type] [binary] (1) NOT NULL ,
       [items_serial] [binary] (4) NOT NULL ,
       [items_acid] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL
    ) ON [PRIMARY]
    GO

    CREATE TABLE [dbo].[CopyLog] (
       [copy_id] [int] IDENTITY (1, 1) NOT NULL ,
       [copy_acid] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
       [copy_name] [varchar] (15) COLLATE Chinese_PRC_CI_AS NOT NULL ,
       [copy_type] [binary] (1) ,
       [copy_serial] [binary] (4) ,
       [copy_item] [binary] (16) ,
       [copy_date] [datetime] NOT NULL
    ) ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[AllItemsLog] ADD
    CONSTRAINT [DF_CT_ITEM_item] DEFAULT (0) FOR [items_type],
    CONSTRAINT [DF_CT_ITEM_itemid] DEFAULT (0) FOR [items_serial],
    CONSTRAINT [DF_CT_ITEM_itemrole] DEFAULT ('\') FOR [items_acid]
    GO
     
    CREATE INDEX [IX_CT_ITEM] ON [dbo].[AllItemsLog]([items_type], [items_serial]) ON [PRIMARY]
    GO
     
    ALTER TABLE [dbo].[CopyLog] ADD
    CONSTRAINT [DF_CopyLog_copy_date] DEFAULT (getdate()) FOR [copy_date]
    GO
     
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trg_CheckSameID]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[trg_CheckSameID]
    GO

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    CREATE TRIGGER [dbo].[trg_CheckSameID] ON [dbo].[character]
       FOR UPDATE
       AS
       BEGIN
          IF UPDATE(inventory)
          BEGIN
             SET NOCOUNT ON
             DECLARE
             @wh_data binary(1920),
             @wh_type binary(1),
             @wh_serial binary(4),
             @wh_item binary(16),
             @cr_acid varchar(10),
             @cr_char varchar(15),
             @cr_data binary(760),
             @cr_type binary(1),
             @cr_serial binary(4),
             @cr_item binary(16),
             @al_acid varchar(10),
             @j int,
             @k int,
             @warehouse_length int,
             @find bit

             -- Selecting information about inserted object
             SELECT @cr_acid=i.accountid, @cr_data=i.inventory ,@cr_char=i.name FROM inserted i
             SELECT @wh_data=items FROM warehouse WHERE accountid=@cr_acid 

             -- Length of the warehouse in binary
             SET @warehouse_length=1920
             
             SET @j=0
             SET @find=0
             WHILE @j<76 AND @cr_data IS NOT NULL
             BEGIN
                SET @cr_type=SUBSTRING(@cr_data,@j*16+1,1)
                SET @cr_serial=SUBSTRING(@cr_data,@j*16+4,4)
                SET @cr_item=SUBSTRING(@cr_data,@j*16+1,16)
                IF @cr_type<>0xFF AND @cr_serial<>0x00000000
                BEGIN
                   SELECT @al_acid=items_acid FROM allitemslog WHERE items_type=@cr_type AND items_serial=@cr_serial
                   IF @al_acid IS NULL
                      INSERT INTO allitemslog (items_type,items_serial,items_acid) VALUES (@cr_type,@cr_serial,@cr_acid)
                   ELSE
                   BEGIN
                      UPDATE allitemslog SET items_acid=@cr_acid WHERE items_type=@cr_type AND items_serial=@cr_serial
                      
                      SET @k=0
                      WHILE @k<120 AND @wh_data IS NOT NULL
                      BEGIN
                         SET @wh_type=SUBSTRING(@wh_data,@k*16+1,1)
                         SET @wh_serial=SUBSTRING(@wh_data,@k*16+4,4)
                         SET @wh_item=SUBSTRING(@wh_data,@k*16+1,16)
                         IF @wh_type=@cr_type AND @wh_serial=@cr_serial
                         BEGIN
                            SET @find=1
                            -- Insert dupe record in to the log (item with serial)
                            INSERT INTO copylog (copy_type,copy_serial,copy_item,copy_acid,copy_name,copy_date) VALUES (@cr_type,@cr_serial,@cr_item,@al_acid,@cr_char,getdate())
                            SET @wh_data=SUBSTRING(@wh_data,1,@k*16)+0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF+SUBSTRING(@wh_data,((@k+1)*16+1),@warehouse_length-(((@k+1)*16)))
                         END
                         SET @k=@k+1
                      END
                   END
                END
                SET @j=@j+1
             END
             
             IF @find=1
             BEGIN
                -- Update warehouse, delete dupe
                UPDATE warehouse SET items=@wh_data where accountid=@cr_acid

                -- This is where u can add more punishment like ban or lock characters
                -- Block character that has dupes on him [if you feel like it]
                -- UPDATE Character SET CtlCode=1 WHERE name=@cr_char
             END
             SET NOCOUNT OFF
          END
       END

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    Credits : DaRKav

      Acum este: Joi Dec 08, 2016 2:04 am