#1 Como Colocar level imediato Sáb Jan 26, 2013 2:18 pm
KaiqueTexx
Novato
Venho aqui para mostrar como colocar instant level achei isso no elitepvpers bom vamos ao que interessa.
contexto
a criação de novos toons envolve algumas mesas - incluindo PS_GameDefs.dbo.StatusDefs para obter o HP inicial, SP, MP - alguns valores rígidos codificados (o inicial Str, Dex, ..., Sab) e alguns parâmetros definidos pelo usuário (incluindo face , cabelo, tamanho).
todos estes parâmetros são transmitidos para o procedimento PS_GameData.dbo.usp_Create_Char_R que realmente cria o toon, isto é, inserir um registro PS_GameData.dbo.Chars.
A fim de proporcionar "nivelamento imediata" ou para alterar as características dos toons no momento de sua criação, temos que mudar na mosca alguns dos valores usados por esse SP.
solução
Uma codificação possíveis foi apresentado por Snuggle, tem várias restrições, incluindo os riscos de erro e dificuldade de manutenção.
Outra codificação é usar uma nova tabela para armazenar os campos que deseja alterar na mosca.
Sabendo que usp_Create_Char_R é definido como:
ta parece que a informação que deseja alterar é a função de trabalho, família e crescer e consiste em nível, statPoint, skillPoint, str, dex, rec, int, luc, wis, HP, MP, SP, exp, dinheiro, mapa, dir, PosX, posy, posZ.
(outros parâmetros (campos da tabela Chars) são constantes ou não utilizado ou desconhecido).
1 - definição de CharDefs
criamos a tabela PS_GameDefs.dbo.CharDefs da seguinte forma:
As linhas a seguir usar os dados idade original para criar uma "toon moagem" (Toon criado no lvl 1) quando o parâmetro de crescer é 0 (isto é, o modo "Easy", de acordo rótulos IDADE padrão de botão).
modo 1 pode ser usado para criar lvl 15 toons, modo 2 para o modo 3 e 30ers por 60/70 +
ou você pode usar essa tabela para redefinir dados aplicados em toon na criação (como dar mais estatísticas para NM vs UM, ou remover os diffs entre luzes e classes obscuridades ou qualquer relevantes para o seu servidor.
A grande vantagem do armazenamento desses dados em uma tabela (em vez de rígidos valores codificados em um lote de declarações IF) é que você será capaz de facilmente atualizá-los (com uma visão macroscópica / geral), se necessário.
A segunda vantagem é que as mudanças feitas no existente Criar chars SP são muito limitadas e de fácil leitura.
É claro que a criação de tabela é feito uma vez, para qualquer alteração último sobre os valores que você irá usar o "grid editável" do SQL Server Management Studio.
2 - modificação de usp_Create_Char_R
O procedimento é alterado para actualizar dinamicamente alguns dos parâmetros recebidos com os valores armazenados na nossa tabela:
Código:
Postado Originalmente por viper4513
Eu só tenho a dizer, você fez uma coisa muito simples, muito complicado lá Castor [...]
complicado?!?
a criação da tabela é parte da solução, mas não tem impacto sobre o SP que tem de ser alterada para atingir o objectivo.
alll a modif feito na SP original é * uma declaração de seleção * (a "selecionar alguns novos valores do CharDefs" tabela). é obviamente mais limpa do que um brunch longo dos testes.
adicionar uma tabela nunca é ruim como o design, por má - ou má codificação - é ruim.
ele também não abrandar o servidor, e uma única instrução select é provável mais rápido do que vários se.
Outro ponto é a conclusão do código, a seleção, juntamente com o teste opcional, mas segura que eu usei, garantia de que todos os casos são tratados com uma única instrução.
OOH é muito fácil de fazer um monte de codificação / bug de projeto quando a solução de usar um monte de códigos.
por exemplo, pode-se ver um código como:
análise correta de todos os casos deve aplicar:
ou
contexto
a criação de novos toons envolve algumas mesas - incluindo PS_GameDefs.dbo.StatusDefs para obter o HP inicial, SP, MP - alguns valores rígidos codificados (o inicial Str, Dex, ..., Sab) e alguns parâmetros definidos pelo usuário (incluindo face , cabelo, tamanho).
todos estes parâmetros são transmitidos para o procedimento PS_GameData.dbo.usp_Create_Char_R que realmente cria o toon, isto é, inserir um registro PS_GameData.dbo.Chars.
A fim de proporcionar "nivelamento imediata" ou para alterar as características dos toons no momento de sua criação, temos que mudar na mosca alguns dos valores usados por esse SP.
solução
Uma codificação possíveis foi apresentado por Snuggle, tem várias restrições, incluindo os riscos de erro e dificuldade de manutenção.
Outra codificação é usar uma nova tabela para armazenar os campos que deseja alterar na mosca.
Sabendo que usp_Create_Char_R é definido como:
- Código:
Proc dbo.usp_Create_Char_R(
@serverID tinyint, @userID varchar(12), @userUID int, @charName varchar(50),
@slot Tinyint, @family Tinyint, @grow Tinyint,
@hair Tinyint, @face Tinyint, @size Tinyint, @job Tinyint, @sex Tinyint,
@level Smallint, @statpoint Smallint, @skillpoint Smallint,
@str Smallint, @dex Smallint, @rec Smallint,
@int Smallint, @luc Smallint, @wis Smallint,
@HP Smallint, @MP Smallint, @SP Smallint,
@map Smallint, @dir Smallint, @exp Int, @money Int,
@posX Real, @posY Real, @posZ Real,
@Hg Smallint, @Vg Smallint, @Cg Tinyint, @Og Tinyint, @Ig Tinyint)
ta parece que a informação que deseja alterar é a função de trabalho, família e crescer e consiste em nível, statPoint, skillPoint, str, dex, rec, int, luc, wis, HP, MP, SP, exp, dinheiro, mapa, dir, PosX, posy, posZ.
(outros parâmetros (campos da tabela Chars) são constantes ou não utilizado ou desconhecido).
1 - definição de CharDefs
criamos a tabela PS_GameDefs.dbo.CharDefs da seguinte forma:
- Código:
USE PS_GameDefs
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
if exists (select * from sysobjects where id=object_id(N'dbo.CharDefs')) drop table CharDefs;
go
CREATE TABLE dbo.CharDefs (
grow Tinyint not null, -- 0 (lvling), 1 (15), 2 (30), 3 (70)
family Tinyint not null,-- 0: human, 1: elf, 2: vail, 3: deatheater
job Tinyint not null, -- 0: fighter(fam: 0) or warrior(fam: 3)
-- 1: defender(fam: 0) or guardian(fam: 3)
-- 2: ranger(fam: 1) or assassin(fam: 2)
-- 3: archer(fam: 1) or hunter(fam: 3)
-- 4: mage(fam: 1) or pagan(fam: 2)
-- 5: priest(fam: 0) or oracle(fam: 2)
level Smallint not null,
statpoint Smallint not null,
skillpoint Smallint not null,
str Smallint not null,
dex Smallint not null,
rec Smallint not null,
[int] Smallint not null,
luc Smallint not null,
wis Smallint not null,
HP Smallint not null,
MP Smallint not null,
SP Smallint not null,
exp Int not null,
money Int not null,
map Smallint not null,
dir Smallint not null,
posX Real not null,
posY Real not null,
posZ Real not null,
) ON [PRIMARY]
GO
As linhas a seguir usar os dados idade original para criar uma "toon moagem" (Toon criado no lvl 1) quando o parâmetro de crescer é 0 (isto é, o modo "Easy", de acordo rótulos IDADE padrão de botão).
- Código:
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,0,0, 1,0,5, 14,12, 9, 8,15, 7, 352,110,257, 0,0, 1,0, 578.0, 78.6, 1762.1);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,0,1, 1,0,5, 10, 9,12,10,14,10, 435,147,152, 0,0, 1,0, 578.0, 78.6, 1762.1);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,1,2, 1,0,5, 10,19, 9, 7,12, 8, 300,140,320, 0,0, 1,0,1679.0, 38.9, 1776.9);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,1,3, 1,0,5, 11,14,10, 7,13,10, 312,165,272, 0,0, 1,0,1679.0, 38.9, 1776.9);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,1,4, 1,0,5, 7,13, 9,15, 9,12, 270,325,155, 0,0, 1,0,1679.0, 38.9, 1776.9);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,0,5, 1,0,5, 8, 9,10,12,12,14, 290,295,160, 0,0, 1,0, 578.0, 78.6, 1762.1);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,3,0, 1,0,5, 16,12,11, 8,11, 7, 372,110,247, 0,0, 2,0,1838.9, 129.3, 443.4);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,3,1, 1,0,5, 12, 9,14,10,10,10, 455,147,142, 0,0, 2,0,1838.9, 129.3, 443.4);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,2,2, 1,0,5, 10,15, 9, 9,12,10, 300,145,305, 0,0, 2,0, 165.2, 118.5, 397.9);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,3,3, 1,0,5, 13,10,12, 7,13,10, 332,155,252, 0,0, 2,0,1838.9, 129.3, 443.4);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,2,4, 1,0,5, 7, 9, 9,17, 9,14, 270,330,140, 0,0, 2,0, 165.2, 118.5, 397.9);
INSERT INTO [PS_GameDefs].[dbo].[CharDefs] values (0,2,5, 1,0,5, 8, 9,10,14, 8,16, 290,310,155, 0,0, 2,0, 165.2, 118.5, 397.9);
modo 1 pode ser usado para criar lvl 15 toons, modo 2 para o modo 3 e 30ers por 60/70 +
ou você pode usar essa tabela para redefinir dados aplicados em toon na criação (como dar mais estatísticas para NM vs UM, ou remover os diffs entre luzes e classes obscuridades ou qualquer relevantes para o seu servidor.
A grande vantagem do armazenamento desses dados em uma tabela (em vez de rígidos valores codificados em um lote de declarações IF) é que você será capaz de facilmente atualizá-los (com uma visão macroscópica / geral), se necessário.
A segunda vantagem é que as mudanças feitas no existente Criar chars SP são muito limitadas e de fácil leitura.
É claro que a criação de tabela é feito uma vez, para qualquer alteração último sobre os valores que você irá usar o "grid editável" do SQL Server Management Studio.
2 - modificação de usp_Create_Char_R
O procedimento é alterado para actualizar dinamicamente alguns dos parâmetros recebidos com os valores armazenados na nossa tabela:
- Código:
USE [PS_GameData]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER Proc [dbo].[usp_Create_Char_R]
@serverID tinyint, @userID varchar(12), @userUID int, @charName varchar(50),
@slot Tinyint, @family Tinyint, @grow Tinyint,
@hair Tinyint, @face Tinyint, @size Tinyint, @job Tinyint, @sex Tinyint,
@level Smallint, @statpoint Smallint, @skillpoint Smallint,
@str Smallint, @dex Smallint, @rec Smallint, @int Smallint,
@luc Smallint, @wis Smallint, @HP Smallint, @MP Smallint, @SP Smallint,
@map Smallint, @dir Smallint, @exp Int, @money Int,
@posX Real, @posY Real, @posZ Real,
@Hg Smallint, @Vg Smallint, @Cg Tinyint, @Og Tinyint, @Ig Tinyint
AS
SET NOCOUNT ON
declare @result int
SET @charName = LTRIM(RTRIM(@charName))
SET @SkillPoint = 5
set @result = 0
if exists (select CharID from Chars where CharName=@charName and
(Del=0 or (Del=1 and Level>10 and DeleteDate>DATEADD(dd, -7, GETDATE()))))
begin
set @result = -2
end
else
begin
-- Changes starts Here
if exists (select level from PS_GameDefs.dbo.CharDefs where
grow=@grow and family=@family and job=@job)
begin
-- replace some received values with data read from our table
select @level=[level], @statPoint=[statPoint], @skillPoint=[skillPoint],
@str=[str], @dex=[dex], @rec=[rec], @int=[int], @luc=[luc], @wis=[wis],
@HP=[HP], @MP=[MP], @SP=[SP], @exp=[exp], @money=[money],
@map=[map], @dir=[dir], @posX=[posX], @posY=[posY], @posz=[posZ]
from PS_GameDefs.dbo.CharDefs
where grow=@grow and family=@family and job=@job
-- set mode to ultimate (valid for "immediate leveling" use only)
set @grow = 3
end
-- Changes Ends Here
begin transaction
-- create toon with updated information
insert into Chars(ServerID, UserID, UserUID, CharName, Slot, Family, Grow,
Hair, Face, [Size], Job, Sex, [Level], StatPoint, SkillPoint,
[Str], Dex, Rec, [Int], Luc, Wis, HP, MP, SP, Map, Dir, [Exp], [Money],
PosX, PosY, Posz, Hg, Vg, Cg, Og, Ig, RenameCnt, RemainTime)
values (
@serverID, @userID, @userUID, @charName, @slot, @family, @grow,
@hair, @face, @size, @job, @sex, @level, @statPoint, @skillPoint,
@str, @dex, @rec, @int, @luc, @wis, @HP, @MP, @SP, @map, @dir,
@exp, @money, @posX, @posY, @posz, @Hg, @Vg, @Cg, @Og, @Ig, 0, 0)
if (@@ERROR <> 0)
begin
rollback transaction
set @result = -1
end
else
begin
commit transaction
set @result = IDENT_CURRENT('Chars')
end
end
SET NOCOUNT OFF
return @result
Segundo Viper 4513:
Código:
Postado Originalmente por viper4513
Eu só tenho a dizer, você fez uma coisa muito simples, muito complicado lá Castor (talvez apenas porque eu sou um nub SQL e mais do que você escreveu só foi para a direita sobre a minha cabeça, mesmo que eu gostaria de entender tudo totalmente )
E uma pequena nota para Castor, ou qualquer um que sabe .. É considerado como "pobre" a entrada de uma tabela como a forma como Castor sugeriu .. se isso é o que era .. Posso estar completamente errado, eu não estou muito certo, e se eu sou, então apenas me ignorar
Mas eu estava pensando adicionando outra tabela para o banco de dados para "classificar" as coisas com que abrandar o sistema e possivelmente causar mais mal do que bem?
Mas como eu disse, eu não sou nenhum expert, eu uso um método semelhante ao do lançamento, e ele funciona muito bem para mim .. apenas curioso para o meu conhecimento. Eu gosto de aprender, mesmo que eu não entendo completamente.
Código:
Postado Originalmente por viper4513
Eu só tenho a dizer, você fez uma coisa muito simples, muito complicado lá Castor [...]
complicado?!?
a criação da tabela é parte da solução, mas não tem impacto sobre o SP que tem de ser alterada para atingir o objectivo.
alll a modif feito na SP original é * uma declaração de seleção * (a "selecionar alguns novos valores do CharDefs" tabela). é obviamente mais limpa do que um brunch longo dos testes.
adicionar uma tabela nunca é ruim como o design, por má - ou má codificação - é ruim.
ele também não abrandar o servidor, e uma única instrução select é provável mais rápido do que vários se.
Outro ponto é a conclusão do código, a seleção, juntamente com o teste opcional, mas segura que eu usei, garantia de que todos os casos são tratados com uma única instrução.
OOH é muito fácil de fazer um monte de codificação / bug de projeto quando a solução de usar um monte de códigos.
por exemplo, pode-se ver um código como:
- Código:
Se a família @ IN (0,1)
BEGIN
- Conjunto coords luz e mapa
FIM
ELSE IF @ família em (2,3)
BEGIN
- Set coords fúria e mapa
FIM
análise correta de todos os casos deve aplicar:
- Código:
Se a família @ IN (0,1)
BEGIN
- Conjunto coords luz e mapa
FIM
ELSE IF @ família em (2,3)
BEGIN
- Set coords fúria e mapa
FIM
ELSE
BEGIN
RETORNO -3
FIM
ou
- Código:
Se a família @ IN (0,1)
BEGIN
- Conjunto coords luz e mapa
FIM
ELSE
BEGIN
- Set coords fúria e mapa
FIM