Have fun, this is entirely untested, just wrote it down from scratch more or less in pastebin.
btw update the tables etc for your own usage. This is a basic demonstration on how to do it quickly without much hassle.
Code:
CREATE PROCEDURE _RoyalReducePetPages
@CharID INT = 0,
@MaxSlots INT = 0,
@Charname VARCHAR(32) = ''
AS
IF @Charname = '' AND @CharID = 0
BEGIN
PRINT 'Set a charname OR a charid at least...'
RETURN;
END
IF @CharID = 0
SELECT @CharID = CharID
FROM SRO_VT_SHARD_INIT.dbo._Char
WHERE CharName16 = @Charname;
IF @Charname IS NULL OR @Charname = ''
SELECT @Charname = CharID
FROM SRO_VT_SHARD_INIT.dbo._Char
WHERE CharID = @CharID;
DECLARE @Table TABLE
(
ID INT IDENTITY(1,1),
Charname VARCHAR(32),
Codename VARCHAR(128)
)
INSERT INTO @Table (Charname, Codename)
SELECT @Charname, q.CodeName128
FROM (
SELECT *
FROM SRO_VT_SHARD_INIT.dbo._invcos back
join SRO_VT_SHARD_INIT.dbo._Items IT ON back.ItemID=it.ID64
join SRO_VT_SHARD_INIT.dbo._RefObjCommon R ON IT.RefItemID=r.ID
WHERE ID64!=0
AND back.Slot > @MaxSlots
)
AS q
join SRO_VT_SHARD_INIT.dbo._Items IT1 ON q.COSID = IT1.Data
join SRO_VT_SHARD_INIT.dbo._Inventory I ON IT1.ID64=I.ItemID
WHERE i.CharID = @CharID
DECLARE @MaxIndex INT = 0,
@Flag INT = 0,
@Codename VARCHAR(128) = '';
SELECT @MaxIndex = MAX(ID)
FROM @Table
WHILE @Flag <= @MaxIndex
BEGIN
SELECT @Codename = Codename, @Charname = Charname
FROM @Table
WHERE ID = @Flag
IF @Codename IS NOT NULL AND @Charname IS NOT NULL
EXEC _TransferItem @Codename, @Charname;
SET @Flag += 1;
END
CREATE Procedure [dbo].[_TransferItem]
@Codename varchar(128),
@Charname varchar(32)
AS
Declare @CharID INT = (Select CharID from SRO_VT_SHARD_INIT.dbo._Char Where CharName16=@Charname)
Declare @JID INT = (SELECT UserJID FROM SRO_VT_SHARD_INIT.dbo._User Where CharID=@CharID),
@itemID INT;
IF @Codename in -- Check if item exists.
(Select q.CodeName128 from (
Select * from SRO_VT_SHARD_INIT.dbo._invcos back
join SRO_VT_SHARD_INIT.dbo._Items IT on back.ItemID=it.ID64
join SRO_VT_SHARD_INIT.dbo._RefObjCommon R on IT.RefItemID=r.ID
where ID64!=0
)
as q
join SRO_VT_SHARD_INIT.dbo._Items IT1 ON q.COSID = IT1.Data
join SRO_VT_SHARD_INIT.dbo._Inventory I ON IT1.ID64=I.ItemID
where i.CharID=@CharID)
IF @CharID IN (Select CharID from SRO_VT_ROYAl.dbo._Logins) OR (@JID IS NULL) OR (@Codename IS NULL)
BEGIN
RETURN
END -- Check if Char is Online or JID is null dont do shit.
BEGIN
SET @itemID = (Select TOP 1 q.ItemID from ( -- take first item with that codename
Select * from SRO_VT_SHARD_INIT.dbo._invcos back
join SRO_VT_SHARD_INIT.dbo._Items IT on back.ItemID=it.ID64
join SRO_VT_SHARD_INIT.dbo._RefObjCommon R on IT.RefItemID=r.ID
where ID64!=0
)
as q
join SRO_VT_SHARD_INIT.dbo._Items IT1 ON q.COSID = IT1.Data
join SRO_VT_SHARD_INIT.dbo._Inventory I ON IT1.ID64=I.ItemID
where i.CharID=@CharID AND q.CodeName128 = @Codename)
Declare @FreeSlot INT = (Select TOP 1 Slot FROM SRO_VT_SHARD_INIT.dbo._Chest
Where UserJID= @JID AND ItemID = 0
ORder by Slot ASC)
IF @FreeSlot IS NULL OR @itemID IS NULL
BEGIN
Return
END
BEGIN TRANSACTION
Update SRO_VT_SHARD_INIT.dbo._invcos
Set ItemID=0
Where ItemID=@ItemID
IF (@@ROWCOUNT=0 OR @@ERROR<>0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END
UPdate SRO_VT_SHARD_INIT.dbo._Chest
SET ItemID=@itemID
WHERE Slot=@FreeSlot AND UserJID = @JID
IF (@@ROWCOUNT=0 OR @@ERROR<>0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END
COMMIT TRANSACTION
END






