Организация проверки в процедуре Autoreset в MU online

Автор oneDmitry, 2009 Нояб. 17, 12:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlineпроверка ресетовautoreset

oneDmitry

неполучается организовать проверку на колличество ресетов в процедуре, мучался мучался и вот что получилось и  оно отказывается работать:
Спойлер
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,
@stp int


select @stp=
case
when resets<10 then 500
when resets>10 AND resets<21 then 495
when resets>20 AND resets<31 then 490

end
From Character
типо это дело должно проверять на колличество ресетов, но процедура с этим кодом отказывается работать


--Авторесет пройдет за 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 @stp --DW SM
when ((class = 16) OR (class = 17))    then @stp --DK BK
when ((class = 32) OR (class = 33))    then @stp --Elf MElf
when (class = 48 )            then @stp --MG
when (class = 64)            then @stp --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
[свернуть]

Rev[]luti0

Цитата: oneDmitry от 2009 Нояб. 17, 11:15  неполучается организовать проверку на колличество ресетов в процедуре, мучался мучался и вот что получилось и  оно отказывается работать:
Спойлер
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,
@stp int


select @stp=
case
when resets<10 then 500
when resets>10 AND resets<21 then 495
when resets>20 AND resets<31 then 490

end
From Character
типо это дело должно проверять на колличество ресетов, но процедура с этим кодом отказывается работать


--Авторесет пройдет за 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 @stp --DW SM
when ((class = 16) OR (class = 17))    then @stp --DK BK
when ((class = 32) OR (class = 33))    then @stp --Elf MElf
when (class = 48 )          then @stp --MG
when (class = 64)          then @stp --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
[свернуть]
Эта процедуря взята с МуФорума.инфо
Естественно она не будет у тебя работать, переменные не нужно редактировать.
Допиши в конце где идёт раздача пойтов по классу чтобы проверяла коичество ресетов...
Помог бы но увы некогда.

oneDmitry

дело в том что надо будет сделать проверку не только по ресету но и по классу персонажа, мне тут посоветовали сразу присвоить переменной значение колонки Resets, но что т пока неполучается (

Rev[]luti0

Цитата: oneDmitry от 2009 Нояб. 18, 06:28  дело в том что надо будет сделать проверку не только по ресету но и по классу персонажа, мне тут посоветовали сразу присвоить переменной значение колонки Resets, но что т пока неполучается (
Ну напиши мне в Скайп или в Аську (Указанны в Инфе) если попадёщь вовремя и будет время помогу...

oneDmitry

проверку на ресет сделал, а вот проверку на Class думаю что сделать протсо нереально...

Pavel

а зачем тебе проверка на класс? О_О
при раздаче поинтов она и так присутствует.

Похожие темы (5)