NoblesGames
Olá Convidado,

Bem-vindo(a) ao fórum, convide seus Amigos para participarem do Fórum Nobles Games !
Leia as Regras antes de Postar qualquer coisa.

http://noblesgames.forumeiros.com/h4-sistema-de-prefixos



Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

#1 Como Colocar level imediato em Sab Jan 26, 2013 2:18 pm

KaiqueTexx

avatar
Novato
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:

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 
Em seguida, inserir registros com características de Toon.
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); 
Você vai criar blocos semelhantes para os modos de crescer 1, 2 e 3.
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 
o impacto sobre o SP original é mínima (uma única instrução SELECT) tornando a manutenção mais fácil se você tem que restaurar / substituir a SP com uma nova era / um outro e re-inserir a modificação.

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
este contém erro potencial.
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

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum