yanakay | Дата: Вторник, 15.05.2012, 10:37 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Оффлайн
| here are code for autorest+item to make res Code SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO
/* Скрипт */ Create PROCEDURE AUTORESET_By_SHAREDNOOB As Begin Set nocount on Set dateformat dmy --устанавливаем формат даты
Declare --Объявляем переменные @ItemCount int, --количество @GroupID int, --группа вещи @GroupIDHex varbinary(10), @ItemID int, --номер вещи в групе, @ItemIDHex varbinary(10), @ResetLevel int, --левел ресета @Npp int, @NppMax int, @In int, @InMax int, @Inventory varbinary(8000), @PerInv varchar(8000), @PerInvTMP varchar(8000), @CharId varchar(10), @StartPoint int
--Авторесет пройдет за 10 вещей Set @ItemCount=10 --Авторесет пройдет за джолы Set @GroupID=14 Set @ItemID=16 --Левел ресета Set @ResetLevel=350
--Переведенные в HEX значения set @GroupIDHex=dbo.HexStrToVarBin(master.dbo.fn_varbintohexstr(cast(@GroupID*16 as varbinary(1))) ) set @ItemIDHex=dbo.HexStrToVarBin(master.dbo.fn_varbintohexstr(cast(@ItemID as varbinary(1))) ) -- select @GroupIDHex GroupIDHex, @ItemIDHex ItemIDHex
--select '1' '1' -----==================================================================== --1) Находим чаров которые претендуют на ресет -- То есть у которых подходящий левел (в данном случае 350) и которые находятся в оффлайне Declare @TLS table (CharID varchar(10), inventory varbinary(8000), npp int identity(1,1)) Insert into @TLS (CharID, inventory) select name, inventory FROM Character c JOIN MEMB_STAT m ON c.AccountID = m.memb___id COLLATE Latin1_general_CI_AI WHERE (clevel>=@ResetLevel) and (ConnectStat = 0) --если таких нет то выходим из процедуры if (Select count(*) from @TLS)=0 Goto EX
--2) Далее раскрываем все что есть в персонал шопе Declare @PS table (CharID varchar(10), ItemBin Varbinary(1000), ItemId int, Ready int, npp int identity(1,1)) set @NppMax=(select max(npp) from @TLS) set @InMax=32 Set @Npp=0
--select '2' '2'
While @Npp<>@NppMax begin Set @Npp=@Npp+1 Set @In=0 Set @StartPoint=-15 Select @CharId=CharId, @Inventory=substring(Inventory, 1217, 512) --из инвентаря выбрали только персонал шоп для анализа from @TLS where npp=@Npp While @In<>@InMax begin Set @In=@In+1 Set @StartPoint=@StartPoint+16 Insert into @PS (CharID, ItemBin, ItemId, Ready) select @CharID, substring(@Inventory, @StartPoint, 16), @In, 0 end
end
--После распаковки весчей в персонал шопе находим среди них джолы Update p set ready=1 from @PS p where substring(ItemBin,1,1)=@ItemIDHex and substring(ItemBin,10,1)=@GroupIDHex
--Находим тех по кому действительно нужно сделать ресет --то есть тех у кого есть заданоое количестко указанного шмота Declare @TRES table (CharId varchar(10), inventory varbinary(8000), npp int identity (1,1)) insert into @TRES (CharId) select CharId from @PS where ready=1 group by CharId having sum(1)>=@ItemCount
--Если нет таких у кого нужное количество то на выход if (Select count(*) from @TRES)=0 Goto EX
--select '3' '3' --Далее Нужно очистить весчи из персонал шопа у тех кому надо --Причем взять именно то количество вещей сколько надо и не больше ! set @NppMax=(select max(npp) from @TRES) Set @Npp=0 While @Npp<>@NppMax begin Set @Npp=@Npp+1 Set @In=0
Select @CharId=CharId from @TRES where npp=@Npp
While @In<>@ItemCount begin Set @In=@In+1 Set @StartPoint=(select top 1 npp from @PS where CharId=@CharId and ready=1 and ItemBin<>0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF order by ItemId) Update p set ItemBin=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF from @PS p where npp=@StartPoint end
end
select '4' '4'
--Далее Нужно собрать всю строку inventory во едино для каждого из ресетных чаров set @NppMax=(select max(npp) from @TRES) Set @Npp=0 select @Npp Npp, @NppMax NppMax While @Npp<>@NppMax begin Set @Npp=@Npp+1 Set @In=0
Select @CharId=CharId from @TRES where npp=@Npp
Set @PerInv='' --select 'цикл 1' 'цикл 1' While @In<>32 begin Set @In=@In+1 Set @PerInvTMP=master.dbo.fn_varbintohexstr( (select ItemBin from @PS where CharId=@CharId and ItemId=@In)) Set @PerInv=@PerInv+substring(@PerInvTMP,3,32) -- select @PerInvTMP --select 'цикл 2' 'цикл 2' end
Select @Inventory=Inventory from @TLS where CharId=@CharId
Set @PerInvTMP=master.dbo.fn_varbintohexstr(substring(@Inventory, 1, 1216)) Set @PerInvTMP=@PerInvTMP+@PerInv
-- select @PerInvTMP Update t set Inventory=dbo.HexStrToVarBin(@PerInvTMP) from @TRES t where npp=@Npp end
--И наконец то сбрасываем статы UPDATE c SET clevel= 1, --Уровень Experience= 0, --Експ -- Money=Money-100000000, --Ресер стоит 100000000 Зен Strength = Case when ((class = 0) OR (class = 1)) then 18 --DW SM when ((class = 16) OR (class = 17)) then 28 --DK BK when ((class = 32) OR (class = 33)) then 22 --Elf MElf when (class = 48 ) then 26 --MG when (class = 64) then 26 --DL End,
Dexterity = Case when ((class = 0) OR (class = 1)) then 18 --DW SM when ((class = 16) OR (class = 17)) then 20 --DK BK when ((class = 32) OR (class = 33)) then 25 --Elf MElf when (class = 48 ) then 26 --MG when (class = 64) then 26 --DL End,
Vitality = Case when ((class = 0) OR (class = 1)) then 15 --DW SM when ((class = 16) OR (class = 17)) then 25 --DK BK when ((class = 32) OR (class = 33)) then 20 --Elf MElf when (class = 48 ) then 26 --MG when (class = 64) then 26 --DL End,
Energy = Case when ((class = 0) OR (class = 1)) then 30 --DW SM when ((class = 16) OR (class = 17)) then 10 --DK BK when ((class = 32) OR (class = 33)) then 15 --Elf MElf when (class = 48 ) then 26 --MG when (class = 64) then 26 --DL End,
-- MagicList = NULL, --магии и скилы не горят MapNumber= Case when ((class = 0) OR (class = 1)) then 0 --DW SM when ((class = 16) OR (class = 17)) then 0 --DK BK when ((class = 32) OR (class = 33)) then 3 --Elf MElf when (class = 48 ) then 0 --MG when (class = 64) then 0 --DL End,
MapPosX= Case when ((class = 0) OR (class = 1)) then 125 --DW SM when ((class = 16) OR (class = 17)) then 125 --DK BK when ((class = 32) OR (class = 33)) then 176 --Elf MElf when (class = 48 ) then 125 --MG when (class = 64) then 125 --DL End,
MapPosY= Case when ((class = 0) OR (class = 1)) then 123 --DW SM when ((class = 16) OR (class = 17)) then 123 --DK BK when ((class = 32) OR (class = 33)) then 116 --Elf MElf when (class = 48 ) then 123 --MG when (class = 64) then 123 --DL End,
PkLevel= 3,
Resets = Resets+1,
LevelUpPoint = Case when ((class = 0) OR (class = 1)) then 500 --DW SM when ((class = 16) OR (class = 17)) then 500 --DK BK when ((class = 32) OR (class = 33)) then 500 --Elf MElf when (class = 48 ) then 650 --MG when (class = 64) then 700 --DL End * (Resets + 1), inventory=t.inventory FROM Character c Inner join @TRES t on c.name=t.charid COLLATE Latin1_general_CI_AI
--, PS varbinary(1000 --select * from @TLS --select * from @PS --select * from @TRES
EX:
End
GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
@ItemCount - How much items need for reset @GroupID - Group id Items(*).txt @ItemID - number of item from items.txt @ResetLevel-Which level need for reset
Реклама
<a href='http://s2.muo.lv'> <img border='0' width='468' height='60' src='http://s2.muo.lv/static/logo/468x60.php' alt='muo.lv MuOnline 1.02K GameServer'> </a>
Сообщение отредактировал yanakay - Вторник, 15.05.2012, 13:06 |
|
| |