Jump to content

Problema com ItemShop ( Sumindo Itens )


Anderson Fabris

Recommended Posts

Boa Noite.
Gostaria de tirar uma duvida com vocês.
Minha itemshop, quando eu compro itens, os mesmos ficam por determinado tempo e acabam sumindo do inventário.

Tentei diferentes correções, como botar valores de tempo no socket0 / 1 e 2.

Também tentei editar o warflag para que puxasse direto , mas mesmo assim acaba por sumir os itens.

 

Minha ´Programação do Shop'

 

Spoiler

<?php

session_start();
if (!empty($_SESSION["shop"])) {

    if (!class_exists("Read")) {
        echo "<h1>Estamos confusos. Por favor volte para a pagina de login...</h1>";
    } else {

        $idItem = filter_var($url[2], FILTER_VALIDATE_INT);
        $Qtd = (filter_var($url[3], FILTER_VALIDATE_INT) == null ? 1 : filter_var($url[3], FILTER_VALIDATE_INT));
        $Qtd = ($Qtd > 5 ? 5 : $Qtd);

        $ReadPlayer = new Read;
        $ReadItem = new Read;

        $ReadPlayer->ExeRead("account.account", "WHERE id = :i LIMIT 1", "i={$_SESSION["shop"]["id"]}");
        $ReadItem->ExeRead("account.ishop_item", "WHERE id = :i LIMIT 1", "i={$idItem}");

        $CoinsAtual = ($ReadItem->getResult()[0]["tip_pret"] == "monede" ? $ReadPlayer->getResult()[0]["coins"] : $ReadPlayer->getResult()[0]["cash"]);

        if ($ReadPlayer->getRowCount() > 0) {
            //VALIDAR ITEM
            if ($ReadItem->getRowCount() > 0) {
                //VERIFICAR MOEDAS!
                
                //VERIFICAR SE O ITEM TEM DESCONTO !
                $ValorItem = ( $ReadItem->getResult()[0]["reducere"] == 0 ? $ReadItem->getResult()[0]["pret"] : ($ReadItem->getResult()[0]["pret"] * (100 - $ReadItem->getResult()[0]["reducere"]) / 100) );

                if ($CoinsAtual >= ($ValorItem * $Qtd )) {
                    //CONTINUAR COMPRANDO!
                    //REALIZAR COMPRA DE VÀRIOS ITENS!
                    $QtpP = $ReadItem->getResult()[0]["comprado"];

                    for ($i = 0; $i < $Qtd; $i++):

                        $getGroesse = Check::compareItems($ReadItem->getResult()[0]["vnum"]);
                        $belPos = Check::checkPos($ReadPlayer->getResult()[0]["id"]);
                        $possiblePos = Check::pozitie($ReadPlayer->getResult()[0]["id"]);

                        if (!empty($possiblePos) && $possiblePos <= 45) {

                            $CoinsAtual -= $ValorItem;

                            //ATUALIZAR COINS!
                            $Dados = ($ReadItem->getResult()[0]["tip_pret"] == "monede" ? array("coins" => $CoinsAtual) : array("cash" => $CoinsAtual));
                            $Update = new Update;
                            $Update->ExeUpdate("account.account", $Dados, "WHERE id = :id", "id={$ReadPlayer->getResult()[0]["id"]}");

                            if ($ReadItem->getResult()[0]["tip_pret"] == "monede") {
                                $_SESSION["shop"]["coins"] = $CoinsAtual;
                            } else {
                                $_SESSION["shop"]["cash"] = $CoinsAtual;
                            }

                            //INSERIR LOG
                            $DadosLog = array("cont" => $ReadPlayer->getResult()[0]["id"], "vnum" => $ReadItem->getResult()[0]["vnum"]);
                            $CreateLog = new Create;
                            $CreateLog->ExeCreate("account.ishop_log", $DadosLog);

                            //INSERIR ITEM
                            $DadosItem = array("owner_id" => $ReadPlayer->getResult()[0]["id"], "window" => "MALL", "pos" => $possiblePos, "count" => $ReadItem->getResult()[0]["cantitate"], "vnum" => $ReadItem->getResult()[0]["vnum"], "socket0" => ($ReadItem->getResult()[0]["time"] != 0 ? ( (time() + ((24 * $ReadItem->getResult()[0]["time"]) * 60 * 60))) : $ReadItem->getResult()[0]["socket0"]), "socket1" => $ReadItem->getResult()[0]["socket1"], "socket2" => $ReadItem->getResult()[0]["socket2"]);
                            $CreateItem = new Create;
                            $CreateItem->ExeCreate("player.item", $DadosItem);

                            //ATUALIZAR A QUANTIDADE DO PRODUTO COMPRADO !
                            $DadosP = array("comprado" => ( $QtpP += 1));
                            $AtualizarComprados = new Update;
                            $AtualizarComprados->ExeUpdate("account.ishop_item", $DadosP, "WHERE id = :i", "i={$ReadItem->getResult()[0]["id"]}");
                        } else {
                            header("Location: " . HOME . "/shop/armazem");
                        }
                    endfor;
                    header("Location: " . HOME . "/shop/compra-ok");
                } else {
                    header("Location: " . HOME . "/shop/moedas");
                }
            } else {
                echo "Erro: Item não encontrado, volte e tente novamente";
            }
        } else {
            echo "Conta não encotrada!";
        }
    }
} else {
    echo "<h1>Acesso restrito !</h1>";
}

 

Alguém saberia me explicar o porque?

 

Design Table do ishop_item

Spoiler


id	int	11	0	0	-1	0	0	0		0					-1	0
nume	varchar	100	0	0	0	0	0	0	'0'	0		latin1	latin1_swedish_ci		0	0
descriere	text	0	0	0	0	0	0	0		0		latin1	latin1_swedish_ci		0	0
categorie	int	11	0	0	0	-1	0	0		0					0	0
vnum	int	11	0	0	0	-1	0	0	0	0					0	0
img	varchar	50	0	0	0	0	0	0	'0'	0		latin1	latin1_swedish_ci		0	0
tip_pret	enum	0	0	0	0	0	0	0		0		latin1	latin1_swedish_ci	'monede','jetoane'	0	0
pret	int	10	0	0	0	-1	0	0	0	0					0	0
cantitate	int	11	0	0	0	0	0	0	0	0					0	0
reducere	int	11	0	0	0	0	0	0	0	0					0	0
anzeigen	varchar	1	0	0	0	0	0	0	'0'	0		latin1	latin1_swedish_ci		0	0
attrtype0	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue0	smallint	6	0	-1	0	0	0	0	0	0					0	0
attrtype1	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue1	smallint	6	0	-1	0	0	0	0	0	0					0	0
attrtype2	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue2	smallint	6	0	-1	0	0	0	0	0	0					0	0
attrtype3	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue3	smallint	6	0	-1	0	0	0	0	0	0					0	0
attrtype4	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue4	smallint	6	0	-1	0	0	0	0	0	0					0	0
attrtype5	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue5	smallint	6	0	-1	0	0	0	0	0	0					0	0
attrtype6	tinyint	4	0	-1	0	0	0	0	0	0					0	0
attrvalue6	smallint	6	0	-1	0	0	0	0	0	0					0	0
socket0	int	10	0	0	0	-1	0	0	0	0					0	0
socket1	int	10	0	0	0	-1	0	0	0	0					0	0
socket2	int	10	0	0	0	-1	0	0	0	0					0	0
socket3	int	10	0	0	0	-1	0	0	0	0					0	0
socket4	int	10	0	0	0	-1	0	0	0	0					0	0
socket5	int	10	0	0	0	-1	0	0	0	0					0	0
comprado	int	11	0	0	0	0	0	0	0	0					0	0
time	int	11	0	-1	0	0	0	0	0	0					0	0
wearflag	int	11	0	0	0	0	0	0	0	0					0	0

 

Obrigado.

 

Link to comment

https://github.com/Vegas007/Metin2-Extended-Item-Award

 

Na tabela item_award dá o item corretamente. (ao comprarem, podes não aparecer instantaneamente na conta e demorar até 5 minutos).

Evita problemas de scripts de verificar espaços livres no itemmall (que apenas dá trabalho e não é muito bom).

Não tens limite de items a colocar nessa tabela. Caso o utilizador compre por exemplo 500 itens e só tenha espaço para 20, os outros 480 não ficam perdidos, sendo colocados no inventário do itemmall à medida que houver espaço (o game gere isso tudo, não tens de fazer nada, é função já existente desde os primeiros leaks do metin2).

Maioria (quiçá até mesmo a totalidade) dos websites de metin2 colocam diretamente no inventário do itemmall ao invés de usar o itemaward, presumo que por desconhecimento da função.

Link to comment
  • 7 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...