Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Estava tentando compilar o client psoul e aparentemente o que me limita são esses 2 arquivos que impedem o jogo de abrir

 

crypt.cpp

 
Spoiler

 

   Ocultar conteúdo

/*
 * Copyright (c) 2010-2014 OTClient <https://github.com/edubart/otclient>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "crypt.h"
#include <framework/stdext/math.h>
#include <framework/core/logger.h>
#include <framework/core/resourcemanager.h>
#include <framework/platform/platform.h>
#include <framework/core/application.h>

#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>

#include <boost/functional/hash.hpp>

#include <openssl/rsa.h>
#include <openssl/sha.h>
#include <openssl/md5.h>
#include <openssl/bn.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>

#define SUCCESS 0
#define FAILURE -1

#define AES_KEYLEN 256
#define AES_ROUNDS 6

static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static inline bool is_base64(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); }

Crypt g_crypt;

Crypt::Crypt()
{
    m_rsa = RSA_new();
}

Crypt::~Crypt()
{
    RSA_free(m_rsa);
}

std::string Crypt::base64Encode(const std::string& decoded_string)
{
    std::string ret;
    int i = 0;
    int j = 0;
    uint8 char_array_3[3];
    uint8 char_array_4[4];
    int pos = 0;
    int len = decoded_string.size();

    while(len--) {
        char_array_3[i++] = decoded_string[pos++];
        if(i == 3) {
            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
            char_array_4[3] = char_array_3[2] & 0x3f;

            for(i = 0; (i <4) ; i++)
                ret += base64_chars[char_array_4[i]];
            i = 0;
        }
    }

    if(i) {
        for(j = i; j < 3; j++)
            char_array_3[j] = '\0';

        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;

        for(j = 0; (j < i + 1); j++)
            ret += base64_chars[char_array_4[j]];

        while((i++ < 3))
            ret += '=';
    }

    return ret;
}

std::string Crypt::base64Decode(const std::string& encoded_string)
{
    int len = encoded_string.size();
    int i = 0;
    int j = 0;
    int in_ = 0;
    uint8 char_array_4[4], char_array_3[3];
    std::string ret;

    while(len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
        char_array_4[i++] = encoded_string[in_]; in_++;
        if(i ==4) {
            for(i = 0; i <4; i++)
                char_array_4[i] = base64_chars.find(char_array_4[i]);

            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

            for(i = 0; (i < 3); i++)
                ret += char_array_3[i];
            i = 0;
        }
    }

    if(i) {
        for(j = i; j <4; j++)
            char_array_4[j] = 0;

        for(j = 0; j <4; j++)
            char_array_4[j] = base64_chars.find(char_array_4[j]);

        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
        char_array_3[2] = ((char_array_4[2] & 0x3) <<6) + char_array_4[3];

        for(j = 0; (j < i - 1); j++)
            ret += char_array_3[j];
    }

    return ret;
}

std::string Crypt::xorCrypt(const std::string& buffer,const std::string& key)
{
    std::string out;
    out.resize(buffer.size());
    register size_t i, j=0;
    for(i=0;i<buffer.size();++i) {
        out[i] = buffer[i] ^ key[j++];
        if(j >= key.size())
            j = 0;
    }
    return out;
}

std::string Crypt::genUUID()
{
    boost::uuids::random_generator gen;
    boost::uuids::uuid u = gen();
    return boost::uuids::to_string(u);
}

bool Crypt::setMachineUUID(std::string uuidstr)
{
    if(uuidstr.empty())
        return false;
    uuidstr = _decrypt(uuidstr, false);
    if(uuidstr.length() != 16)
        return false;
    std::copy(uuidstr.begin(), uuidstr.end(), m_machineUUID.begin());
    return true;
}

std::string Crypt::getMachineUUID()
{
    if(m_machineUUID.is_nil()) {
        boost::uuids::random_generator gen;
        m_machineUUID = gen();
    }
    return _encrypt(std::string(m_machineUUID.begin(),m_machineUUID.end()), false);
}

std::string Crypt::getCryptKey(bool useMachineUUID)
{
    boost::hash<boost::uuids::uuid> uuid_hasher;
    boost::uuids::uuid uuid;
    if(useMachineUUID) {
        uuid = m_machineUUID;
    } else {
        boost::uuids::nil_generator nilgen;
        uuid = nilgen();
    }
    boost::uuids::name_generator namegen(uuid);
    boost::uuids::uuid u = namegen(g_app.getCompactName() + g_platform.getCPUName() + g_platform.getOSName() + g_resources.getUserDir());
    std::size_t hash = uuid_hasher(u);
    std::string key;
    key.assign((const char *)&hash, sizeof(hash));
    return key;
}

std::string Crypt::_encrypt(const std::string& decrypted_string, bool useMachineUUID)
{
    std::string tmp = "0000" + decrypted_string;
    uint32 sum = stdext::adler32((const uint8*)decrypted_string.c_str(), decrypted_string.size());
    stdext::writeLE32((uint8*)&tmp[0], sum);
    std::string encrypted = base64Encode(xorCrypt(tmp, getCryptKey(useMachineUUID)));
    return encrypted;
}

std::string Crypt::_decrypt(const std::string& encrypted_string, bool useMachineUUID)
{
    std::string decoded = base64Decode(encrypted_string);
    std::string tmp = xorCrypt(base64Decode(encrypted_string), getCryptKey(useMachineUUID));
    if(tmp.length() >= 4) {
        uint32 readsum = stdext::readLE32((const uint8*)tmp.c_str());
        std::string decrypted_string = tmp.substr(4);
        uint32 sum = stdext::adler32((const uint8*)decrypted_string.c_str(), decrypted_string.size());
        if(readsum == sum)
            return decrypted_string;
    }
    return std::string();
}

std::string Crypt::md5Encode(const std::string& decoded_string, bool upperCase)
{
    MD5_CTX c;
    MD5_Init(&c);
    MD5_Update(&c, decoded_string.c_str(), decoded_string.length());

    uint8_t md[MD5_DIGEST_LENGTH];
    MD5_Final(md, &c);

    char output[(MD5_DIGEST_LENGTH << 1) + 1];
    for(int32_t i = 0; i < (int32_t)sizeof(md); ++i)
        sprintf(output + (i << 1), "%.2X", md[i]);

    std::string result = output;
    if(upperCase)
        return result;

    std::transform(result.begin(), result.end(), result.begin(), tolower);
    return result;
}

std::string Crypt::sha1Encode(const std::string& decoded_string, bool upperCase)
{
    SHA_CTX c;
    SHA1_Init(&c);
    SHA1_Update(&c, decoded_string.c_str(), decoded_string.length());

    uint8_t md[SHA_DIGEST_LENGTH];
    SHA1_Final(md, &c);

    char output[(SHA_DIGEST_LENGTH << 1) + 1];
    for(int32_t i = 0; i < (int32_t)sizeof(md); ++i)
        sprintf(output + (i << 1), "%.2X", md[i]);

    std::string result = output;
    if(upperCase)
        return result;

    std::transform(result.begin(), result.end(), result.begin(), tolower);
    return result;
}

std::string Crypt::sha256Encode(const std::string& decoded_string, bool upperCase)
{
    SHA256_CTX c;
    SHA256_Init(&c);
    SHA256_Update(&c, decoded_string.c_str(), decoded_string.length());

    uint8_t md[SHA256_DIGEST_LENGTH];
    SHA256_Final(md, &c);

    char output[(SHA256_DIGEST_LENGTH << 1) + 1];
    for(int32_t i = 0; i < (int32_t)sizeof(md); ++i)
        sprintf(output + (i << 1), "%.2X", md[i]);

    std::string result = output;
    if(upperCase)
        return result;

    std::transform(result.begin(), result.end(), result.begin(), tolower);
    return result;
}

std::string Crypt::sha512Encode(const std::string& decoded_string, bool upperCase)
{
    SHA512_CTX c;
    SHA512_Init(&c);
    SHA512_Update(&c, decoded_string.c_str(), decoded_string.length());

    uint8_t md[SHA512_DIGEST_LENGTH];
    SHA512_Final(md, &c);

    char output[(SHA512_DIGEST_LENGTH << 1) + 1];
    for(int32_t i = 0; i < (int32_t)sizeof(md); ++i)
        sprintf(output + (i << 1), "%.2X", md[i]);

    std::string result = output;
    if(upperCase)
        return result;

    std::transform(result.begin(), result.end(), result.begin(), tolower);
    return result;
}


void Crypt::rsaGenerateKey(int bits, int e)
{
    RSA *rsa = RSA_generate_key(bits, e, nullptr, nullptr);
    g_logger.info(stdext::format("%d bits (%d bytes) RSA key generated", bits, bits / 8));
    g_logger.info(std::string("p = ") + BN_bn2dec(m_rsa->p));
    g_logger.info(std::string("q = ") + BN_bn2dec(m_rsa->q));
    g_logger.info(std::string("d = ") + BN_bn2dec(m_rsa->d));
    g_logger.info(std::string("n = ") + BN_bn2dec(m_rsa->n));
    g_logger.info(std::string("e = ") + BN_bn2dec(m_rsa->e));
    RSA_free(rsa);
}

void Crypt::rsaSetPublicKey(const std::string& n, const std::string& e)
{
    BN_dec2bn(&m_rsa->n, n.c_str());
    BN_dec2bn(&m_rsa->e, e.c_str());

    // clear rsa cache
    if(m_rsa->_method_mod_n) { BN_MONT_CTX_free(m_rsa->_method_mod_n); m_rsa->_method_mod_n = NULL; }
}

void Crypt::rsaSetPrivateKey(const std::string& p, const std::string& q, const std::string& d)
{
    BN_dec2bn(&m_rsa->p, p.c_str());
    BN_dec2bn(&m_rsa->q, q.c_str());
    BN_dec2bn(&m_rsa->d, d.c_str());

    // clear rsa cache
    if(m_rsa->_method_mod_p) { BN_MONT_CTX_free(m_rsa->_method_mod_p); m_rsa->_method_mod_p = NULL; }
    if(m_rsa->_method_mod_q) { BN_MONT_CTX_free(m_rsa->_method_mod_q); m_rsa->_method_mod_q = NULL; }
}

bool Crypt::rsaCheckKey()
{
    // only used by server, that sets both public and private
    if(RSA_check_key(m_rsa)) {
        BN_CTX *ctx = BN_CTX_new();
        BN_CTX_start(ctx);

        BIGNUM *r1 = BN_CTX_get(ctx), *r2 = BN_CTX_get(ctx);
        BN_mod(m_rsa->dmp1, m_rsa->d, r1, ctx);
        BN_mod(m_rsa->dmq1, m_rsa->d, r2, ctx);

        BN_mod_inverse(m_rsa->iqmp, m_rsa->q,m_rsa->p, ctx);
        return true;
    }
    else {
        ERR_load_crypto_strings();
        g_logger.error(stdext::format("RSA check failed - %s", ERR_error_string(ERR_get_error(), NULL)));
        return false;
    }
}

bool Crypt::rsaEncrypt(unsigned char *msg, int size)
{
    if(size != RSA_size(m_rsa))
        return false;
    return RSA_public_encrypt(size, msg, msg, m_rsa, RSA_NO_PADDING) != -1;
}

bool Crypt::rsaDecrypt(unsigned char *msg, int size)
{
    if(size != RSA_size(m_rsa))
        return false;
    return RSA_private_decrypt(size, msg, msg, m_rsa, RSA_NO_PADDING) != -1;
}

int Crypt::rsaGetSize()
{
    return RSA_size(m_rsa);
}

int Crypt::__aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **encMsg) {
    EVP_CIPHER_CTX *aesEncryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
    EVP_CIPHER_CTX_init(aesEncryptCtx);
    EVP_CIPHER_CTX_set_padding(aesEncryptCtx, 0);

    unsigned char *aesKey = (unsigned char*)malloc(AES_KEYLEN/8);
    unsigned char *aesIV = (unsignedchar*)malloc(AES_KEYLEN/8);

    unsigned char *aesPass = (unsigned char*)malloc(AES_KEYLEN/8);
    unsigned char *aesSalt = (unsigned char*)malloc(8);

    if(RAND_bytes(aesPass, AES_KEYLEN/8) == 0) {
        return FAILURE;
    }

    if(RAND_bytes(aesSalt, ? == 0) {
        return FAILURE;
    }

    if(EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), aesSalt, aesPass, AES_KEYLEN/8, AES_ROUNDS, aesKey, aesIV) == 0) {
        return FAILURE;
    }

    strncpy((char*)aesKey, (const char*)"KH31ixnVGpT9KiLmYQz8x7UlFZGNr8kP3BZZNogj1G5YXuk7S8l2djfmmhRDym43",AES_KEYLEN/8);
    strncpy((char*)aesIV, (const char*)"7z11367h1oY7L782Zj52KCWVWJXJ4KML", AES_KEYLEN/16);

    size_t blockLen = 0;
    size_t encMsgLen = 0;

    *encMsg = (unsigned char*)malloc(msgLen + AES_BLOCK_SIZE);
    if(encMsg == NULL) return FAILURE;

    if(!EVP_EncryptInit_ex(aesEncryptCtx, EVP_aes_256_cbc(), NULL, aesKey, aesIV)) {
        return FAILURE;
    }

    if(!EVP_EncryptUpdate(aesEncryptCtx, *encMsg, (int*)&blockLen, (unsigned char*)msg, msgLen)) {
        return FAILURE;
    }
    encMsgLen += blockLen;

    if(!EVP_EncryptFinal_ex(aesEncryptCtx, *encMsg + encMsgLen, (int*)&blockLen)) {
        return FAILURE;
    }

    EVP_CIPHER_CTX_cleanup(aesEncryptCtx);
    free(aesEncryptCtx);

    free(aesKey);
    free(aesIV);

    return encMsgLen + blockLen;
}

int Crypt::__aesDecrypt(unsigned char *encMsg, size_t encMsgLen, char **decMsg) {
    EVP_CIPHER_CTX *aesDecryptCtx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
    EVP_CIPHER_CTX_init(aesDecryptCtx);
    EVP_CIPHER_CTX_set_padding(aesDecryptCtx, 0);

    unsigned char *aesKey;
    unsigned char *aesIV;

    aesKey = (unsigned char*)malloc(AES_KEYLEN/8);
    aesIV = (unsigned char*)malloc(AES_KEYLEN/8);

    unsigned char *aesPass = (unsignedchar*)malloc(AES_KEYLEN/8);
    unsigned char *aesSalt = (unsigned char*)malloc(8);

    if(RAND_bytes(aesPass, AES_KEYLEN/8) == 0) {
        return FAILURE;
    }

    if(RAND_bytes(aesSalt, ? == 0) {
        return FAILURE;
    }

    if(EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), aesSalt, aesPass, AES_KEYLEN/8, AES_ROUNDS, aesKey, aesIV) == 0) {
        return FAILURE;
    }

    strncpy((char*)aesKey, (const char*)"KH31ixnVGpT9KiLmYQz8x7UlFZGNr8kP3BZZNogj1G5YXuk7S8l2djfmmhRDym43", AES_KEYLEN/8);
    strncpy((char*)aesIV, (const char*)"7z11367h1oY7L782Zj52KCWVWJXJ4KML", AES_KEYLEN/16);

    size_t decLen = 0;
    size_t blockLen = 0;

    *decMsg = (char*)malloc(encMsgLen);
    if(*decMsg == NULL) return FAILURE;

    if(!EVP_DecryptInit_ex(aesDecryptCtx, EVP_aes_256_cbc(), NULL, aesKey, aesIV)) {
        return FAILURE;
    }

    if(!EVP_DecryptUpdate(aesDecryptCtx, (unsigned char*)*decMsg, (int*)&blockLen, encMsg, (int)encMsgLen)) {
        return FAILURE;
    }
    decLen += blockLen;

    if(!EVP_DecryptFinal_ex(aesDecryptCtx, (unsigned char*)*decMsg + decLen, (int*)&blockLen)) {
        return FAILURE;
    }
    decLen += blockLen;

    (*decMsg)[decLen] = '\0';

    EVP_CIPHER_CTX_cleanup(aesDecryptCtx);

    return decLen;
}

 


 

 

crypt.h

 
Spoiler

 

  Ocultar conteúdo

/*
 * Copyright (c) 2010-2014 OTClient <https://github.com/edubart/otclient>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#ifndef CRYPT_H
#define CRYPT_H

#include "../stdext/types.h"
#include <string>

#include <boost/uuid/uuid.hpp>

#include <openssl/evp.h>

typedef struct rsa_st RSA;

class Crypt
{
public:
    Crypt();
    ~Crypt();

    std::string base64Encode(const std::string& decoded_string);
    std::string base64Decode(const std::string& encoded_string);
    std::string xorCrypt(const std::string& buffer, const std::string& key);
    std::string encrypt(const std::string& decrypted_string) { return _encrypt(decrypted_string, true); }
    std::string aesEncrypt(const std::string&decrypted_string)
    {
        unsigned char *encMsg = NULL;
        int size = __aesEncrypt((const unsigned char*)decrypted_string.c_str(), decrypted_string.size(), &encMsg);

        return std::string(reinterpret_cast<const char*>(encMsg), size);
    }
    std::string decrypt(const std::string& encrypted_string) { return _decrypt(encrypted_string, true); }
    std::string aesDecrypt(const std::string& encrypted_string)
    {
        char *decMsg = NULL;
        int size = __aesDecrypt((unsigned char*)encrypted_string.c_str(), encrypted_string.size(), &decMsg);

        return std::string(reinterpret_cast<const char*>(decMsg), size);
    }
    std::string genUUID();
    bool setMachineUUID(std::string uuidstr);
    std::string getMachineUUID();
    std::string md5Encode(const std::string& decoded_string, bool upperCase);
    std::string sha1Encode(const std::string& decoded_string, bool upperCase);
    std::string sha256Encode(const std::string& decoded_string, bool upperCase);
    std::string sha512Encode(const std::string& decoded_string, bool upperCase);

    void rsaGenerateKey(int bits, int e);
    void rsaSetPublicKey(const std::string& n, const std::string& e);
    void rsaSetPrivateKey(const std::string &p, const std::string &q, const std::string &d);
    bool rsaCheckKey();
    bool rsaEncrypt(unsigned char *msg, int size);
    bool rsaDecrypt(unsigned char *msg, int size);
    int rsaGetSize();

private:
    std::string _encrypt(const std::string& decrypted_string, bool useMachineUUID);
    std::string _decrypt(const std::string& encrypted_string, bool useMachineUUID);
    std::string getCryptKey(bool useMachineUUID);
    boost::uuids::uuid m_machineUUID;
    RSA *m_rsa;

    int __aesEncrypt(const unsigned char *msg, size_t msgLen, unsigned char **encMsg);
    int __aesDecrypt(unsigned char *encMsg, size_t encMsgLen, char **decMsg);
};

extern Crypt g_crypt;

#endif

 


 

 

eles estão dentro da pasta framework

 

aparentemente ele tem duas chaves criptografadas porem não tenho a minima ideia de como resolver

 

Editado por dsoares15 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • 4 weeks later...

O problema dessa src é que está faltando arquivos e codes em alguns arquivos.
eu já arrumei esse problema a um tempo atrás, talvez possa te ajudar!
meu discord > Happy Always#1489

Link para o post
Compartilhar em outros sites
Em 17/02/2021 em 10:48, Happy Always disse:

O problema dessa src é que está faltando arquivos e codes em alguns arquivos.
eu já arrumei esse problema a um tempo atrás, talvez possa te ajudar!
meu discord > Happy Always#1489

ja compilei mano comprei a source do client da nordic

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por matiasz123
      [OTCLIENT SHOWOFF] Questlog Actualizado
      Updated quest log, showing quest details:
      Npc name Npc level Npc outfit Mission status Description Amount of reward experience Number of reward points Enemies you must kill Items to collect  
       

       
      When you click on the follow button, an alternative map opens that shows you the next objective of the mission and at what coordinates:


       
      If you want the system write a comment with your discord
    • Por Mutio
      PokeDash by Pota TFS 1.2
      OTCv8
      Dialogue module by Gengo (Reworked)
       
      Hello everyone, would anyone be able to help me improve this dialogue system?
      When I have a lot of text, it expands, and there's a write effect. I made this primarily for myself, but you can also benefit from it.
      The problem is that if there's a lot of text, the window doesn't layout as I intended, specifically regarding the buttons. They get cut off, and I'd like the window to adjust its size based on the amount of text and buttons. For example, if there are 3 buttons, the window should not cut them off but should expand, adding a few pixels at the bottom to display the buttons correctly.
      Additionally, I've implemented a feature in the code to display items in the center if they are required for quests or anything an NPC might ask from the player. I'd like to make sure this feature also adapts correctly to the window size.
      Perhaps there is an expert in the OTC module who could guide me or correct and remove unnecessary code that I've written and is not needed. I must admit that I'm not a very skilled developer in OTC, but I managed to accomplish something. If someone can help me, I can share this dialogue system. (Modified version of Gengo)



      LUA:
       
      local npcWindowDialog local buttonHolder local lblTitle local outfitBox local panelMsg local scrollPanel local lblMessage local LabelText local itemBox local buttondialog local fadeOutEvent = nil local initialHeight = 200 function init() connect(g_game, { onGameEnd = offline }) connect(LocalPlayer, { onPositionChange = onCreaturePositionChange }) ProtocolGame.registerExtendedOpcode(80, function(protocol, opcode, buffer) print("Received extended opcode data: " .. buffer) local data = json.decode(buffer) if (data.action == "close") then offline() elseif (data.action == "create") then NpcDialog(data.data) end end) npcWindowDialog = g_ui.displayUI('npcdialog') buttonHolder = npcWindowDialog:getChildById('buttonHolder') lblTitle = npcWindowDialog:getChildById('lblTitle') scrollPanel = npcWindowDialog:getChildById('scrollPanel') panelMsg = npcWindowDialog:getChildById('panelMsg') outfitBox = npcWindowDialog:getChildById('outfitBox') itemBox = npcWindowDialog:getChildById('itemBox') buttondialog = npcWindowDialog:getChildById('buttondialog') lblMessage = g_ui.createWidget('LabelText', panelMsg) end function terminate() disconnect(g_game, { onGameEnd = offline }) disconnect(Creature, { onPositionChange = onCreaturePositionChange }) ProtocolGame.unregisterExtendedOpcode(80) removeEvent(npcWindowDialog.fadeEvent) npcWindowDialog:destroy() end function clearItemBox() itemBox:destroyChildren() end function offline() clearItemBox() buttondialog:destroyChildren() npcWindowDialog:hide() npcWindowDialog:setHeight(initialHeight) if fadeOutEvent then removeEvent(fadeOutEvent) end end function onCreaturePositionChange(creature, newPos, oldPos) if creature:isLocalPlayer() then clearItemBox() npcWindowDialog:setHeight(initialHeight) npcWindowDialog:hide() end end function openDialog() npcWindowDialog:raise() npcWindowDialog:show() npcWindowDialog:setOpacity(0) npcWindowDialog:setHeight(initialHeight) g_effects.fadeIn(npcWindowDialog, 150) if fadeOutEvent then removeEvent(fadeOutEvent) end fadeOutEvent = scheduleEvent(function() g_effects.fadeOut(npcWindowDialog, 150) end, 30000) end function writeTextEffect(lblMessage, text, delay, callback) lblMessage:clearText() local textSize = #text local initialHeight = npcWindowDialog:getHeight() for i = 1, textSize do scheduleEvent(function() lblMessage:setText(lblMessage:getText() .. text:sub(i, i)) local newHeight = initialHeight + lblMessage:getTextSize().height npcWindowDialog:setHeight(newHeight) end, delay * i) end end function NpcDialog(value) clearItemBox() local Npc = g_map.getCreatureById(value.npcId) lblTitle:setText(Npc:getName()) outfitBox:setOutfit(Npc:getOutfit()) lblMessage:clearText() writeTextEffect(lblMessage, tr(value.message), 15) scrollPanel:setVisible(lblMessage:getTextSize().height > panelMsg.limitText) local textLength = string.len(value.message) local windowHeight = textLength * 10 if value.items ~= nil then local itemHeight = 10 windowHeight = windowHeight + (#value.items * itemHeight) end local maxHeight = 800 if windowHeight > maxHeight then windowHeight = maxHeight end npcWindowDialog:setHeight(windowHeight) if value.items ~= nil then for _, itemId in ipairs(value.items) do local item = g_ui.createWidget('Item', itemBox) item:setItemId(itemId) end end buttondialog:destroyChildren() if value.options ~= '' then local option = value.options:split('&') for i = 1, #option do local button = g_ui.createWidget('OptionButton', buttondialog) button:setText(tr(option[i])) button:setWidth(500) button:setHeight(150) button:setVisible(false) button.onClick = function() g_game.talkChannel(MessageModes.NpcTo, 0, option[i]) npcWindowDialog:setHeight(initialHeight) button:setVisible(false) end end buttondialog:setHeight(#option > 25 and 88 or 25) scheduleEvent(function() for i, child in ipairs(buttondialog:getChildren()) do child:setVisible(true) g_effects.fadeIn(child, 500) end end, (#value.message * 8) + 500) end openDialog() end

      OTUI:

       
      LabelText < Label padding-bottom: 5 font: sans-bold-16px color: #e8c05e text-wrap: true text-auto-resize: true OptionButton < UIButton image-source: /images/ui/buttondialog image-repeated: true text-offset: 0 1 change-cursor-image: true cursor: pointer $pressed: image-color: #dfdfdf44 $disabled: image-color: #dfdfdf55 change-cursor-image: false UIWindow id: npcWindowDialog size: 690 381 visible: false focusable: false image-source: window image-repeated: false anchors.centerIn: parent @onEscape: modules.game_npcdialog.offline() Label id: lblTitle font: sans-bold-16px anchors.top: parent.top anchors.left: parent.left !text: tr('Title') margin: 18 0 5 25 color: #e8c05e text-auto-resize: true UICreature id: outfitBox size: 58 58 anchors.top: prev.bottom anchors.left: parent.left margin: 20 0 5 34 VerticalScrollBar id: scrollPanel height: 65 anchors.top: panelMsg.top anchors.left: panelMsg.right anchors.bottom: panelMsg.bottom pixels-scroll: true step: 14 margin-left: 5 visible: false ScrollablePanel id: panelMsg size: 0 60 anchors.top: lblTitle.bottom anchors.left: outfitBox.right anchors.right: parent.right margin: 8 30 10 25 vertical-scrollbar: scrollPanel layout: verticalBox &limitText: 80 UIItem id: itemBox size: 50 50 anchors.horizontalCenter: parent.horizontalCenter anchors.top: panelMsg.bottom layout: type: horizontalBox cell-size: 50 50 cell-spacing: 12 num-columns: 10 fit-children: true UIScrollArea id: buttondialog anchors.top: itemBox.bottom anchors.left: parent.left anchors.right: parent.right margin: 15 10 25 10 layout: type: grid cell-size: 500 42 flow: true fit-children: true
       

       


    • Por AddroJhonny
      Andei buscando de tudo que é forma para que o minimap fique com a imagem já liberada, assim como é no PxG. Porém, não encontrei em nenhum lugar alguma instrução. Comecei a mexer no arquivo minimap.lua e consegui avançar em algo.
       
      Meu script ficou assim:
      function updateCameraPosition() local player = g_game.getLocalPlayer() if not player then return end local pos = player:getPosition() if not pos then return end if not minimapWidget:recursiveGetChildById('posLabel') then local minimap = g_ui.createWidget('Minimap', minimapWidget) minimapWidget:setImageSource('/mapa/pisos/piso1') minimapWidget:setId('posLabel') minimapWidget:setOpacity(0.3) minimapWidget:centerInPosition(map, {x = 1015, y=1012, z=7}) end if not minimapWidget:isDragging() then if not fullmapView then minimapWidget:setCameraPosition(player:getPosition()) end minimapWidget:setCrossPosition(player:getPosition()) end minimapPos = minimapWindow:recursiveGetChildById('posLabel') minimapPos:setText('X:'..pos.x..' Y:'..pos.y..' Z:'..pos.z) if minimapWidget:getCameraPosition().z ~= 7 then local minimap = minimapWidget:recursiveGetChildById('posLabel') minimap:setVisible(false) minimapWidget:setColor('black') end end  
      Agora a imagem realmente está aparecendo no minimap com transparência... e quase perfeito. Mas ainda falta conseguir fazer ela acompanhar a posição do player no lugar de ficar aberto por inteiro.
       
      Segue como ficou:
       

       
      Alguém consegue ajudar a melhor maneira de fazer isso? Ou se fiz errado também...
       
      Ty.
    • Por PokemonXdemon
      .Qual servidor ou website você utiliza como base? 
      Servidor Pxu  versão 0.3.6
      Qual o motivo deste tópico? 
      Estou com cliente crashando dentro das quests
       
       
       

    • Por becertified
      Oi pessoal, gostaria de saber como posso mudar meu otc para um otcv8 com uma base poketibia tfs 0.3.6
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo