2 Seguidores
Titulo do usuário
-
TItulo de usuário
O Mal Maior
Últimos Visitantes
kernellpanic's Achievements
-
[Source + Release] Servidor WYD 7.69 para GNU/Linux e Windows.
kernellpanic respondeu ao tópico de kernellpanic em WYD - Desenvolvimento
Sim. Esse muito forte ainda tá light comparado com o "Original". Fiz mais melhorias e depois eu atualizo aqui. You`re right. [Hidden Content]- 13 respostas
-
- 11
-
-
Comandos de GM com descrição e exemplos
kernellpanic respondeu ao tópico de kernellpanic em WYD - Desenvolvimento
hhahahaha Eu liberei um port do Thyra pra Linux que também é compatível com Windows. Tem bastante coisa funcionando. -
[Source + Release] Servidor WYD 7.69 para GNU/Linux e Windows.
kernellpanic respondeu ao tópico de kernellpanic em WYD - Desenvolvimento
Open VSCODE, TRAE IDE or CURSOR and open the project folder containing the source code. -
[Source + Release] Servidor WYD 7.69 para GNU/Linux e Windows.
kernellpanic respondeu ao tópico de kernellpanic em WYD - Desenvolvimento
Tenho a base que ele liberou. Tem mais bugs que código. Deve ser um recurso. Se eu conseguir consertar eu libero. -
[Source + Release] Servidor WYD 7.69 para GNU/Linux e Windows.
kernellpanic respondeu ao tópico de kernellpanic em WYD - Desenvolvimento
I'm not sure what you mean regarding the .sh script and the database. You can find the database in Release/sqlserver.sql. Both the script and the .sql file are text files. Could you elaborate on your concern? The script is fully functional. EDIT: Pra corrigir o ItemList.csv, conversa o ItemList.bin do cliente para csv e use no servidor. Código do conversor: #!/usr/bin/env python3 from __future__ import annotations import argparse import struct from pathlib import Path MAX_ITEMLIST = 6500 ITEMLIST_ENTRY_SIZE = 140 ITEMLIST_XOR = 0x5A MAX_STATICEFFECT = 12 def parse_effect_names(path: Path) -> dict[int, str]: effects: dict[int, str] = {} for raw_line in path.read_text("latin1", errors="replace").splitlines(): line = raw_line.strip() if not line.startswith("#define "): continue parts = line.split() if len(parts) < 3: continue name = parts[1] try: value = int(parts[2]) except ValueError: continue effects.setdefault(value, name) return effects def decode_item_entry(blob: bytes, item_id: int) -> dict[str, object]: offset = item_id * ITEMLIST_ENTRY_SIZE raw = bytes(b ^ ITEMLIST_XOR for b in blob[offset : offset + ITEMLIST_ENTRY_SIZE]) fmt = "<64s" + "h" * 8 + "h" * (MAX_STATICEFFECT * 2) + "i" + "h" * 4 values = struct.unpack(fmt, raw) name = values[0].split(b"\0", 1)[0].decode("latin1", errors="replace") effects = [] base = 9 for idx in range(MAX_STATICEFFECT): effect_type = values[base + idx * 2] effect_value = values[base + idx * 2 + 1] effects.append((effect_type, effect_value)) return { "name": name, "mesh": values[1], "texture": values[2], "visual_effect": values[3], "req_lvl": values[4], "req_str": values[5], "req_int": values[6], "req_dex": values[7], "req_con": values[8], "effects": effects, "price": values[33], "unique": values[34], "pos": values[35], "extra": values[36], "grade": values[37], } def encode_csv_line(item_id: int, item: dict[str, object], effect_names: dict[int, str]) -> str: fields = [ str(item_id), str(item["name"]), f"{item['mesh']}.{item['texture']}", f"{item['req_lvl']}.{item['req_str']}.{item['req_int']}.{item['req_dex']}.{item['req_con']}", str(item["unique"]), str(item["price"]), str(item["pos"]), str(item["extra"]), str(item["grade"]), ] for effect_type, effect_value in item["effects"]: if effect_type == 0: continue fields.append(effect_names.get(effect_type, f"EF_UNKNOWN_{effect_type}")) fields.append(str(effect_value)) return ",".join(fields) def main() -> int: parser = argparse.ArgumentParser(description="Exporta ItemList.bin para ItemList.csv.") parser.add_argument("input_bin", type=Path, help="Caminho do ItemList.bin") parser.add_argument("output_csv", type=Path, help="Caminho de saida do CSV") parser.add_argument( "--effect-header", type=Path, default=Path("LinuxServer/Chengdu/tmsrv/win_src/Code/ItemEffect.h"), help="Caminho do ItemEffect.h", ) parser.add_argument( "--include-empty", action="store_true", help="Inclui entradas vazias no CSV", ) args = parser.parse_args() effect_names = parse_effect_names(args.effect_header) blob = args.input_bin.read_bytes() lines: list[str] = [] for item_id in range(MAX_ITEMLIST): item = decode_item_entry(blob, item_id) if not args.include_empty and not item["name"]: continue lines.append(encode_csv_line(item_id, item, effect_names)) args.output_csv.parent.mkdir(parents=True, exist_ok=True) args.output_csv.write_text("\n".join(lines) + "\n", encoding="latin1", errors="replace") print(f"Entradas exportadas: {len(lines)}") print(f"Saida: {args.output_csv}") return 0 if __name__ == "__main__": raise SystemExit(main()) -
[Source + Release] Servidor WYD 7.69 para GNU/Linux e Windows.
kernellpanic respondeu ao tópico de kernellpanic em WYD - Desenvolvimento
Eu tinha baixado uma release dele, tinha visto interface bem parecida nos vídeos. Mas tinha tanta falha que até o WYD.exe dava erro de memória. Ainda to pra consertar aquela base e liberar aqui. Mas é muito boa mesmo. Se foi realmente ele quem fez aquilo, meus parabéns. Agora eu decidi dar uma olhada no MYTH e ver o que dá pra fazer. -
[Source + Release] Servidor WYD 7.69 para GNU/Linux e Windows.
kernellpanic postou um tópico no fórum em WYD - Desenvolvimento
Não tem binários Windows exceto o wyd.exe Sugiro escanear com antivírus atualizado. Links para download: [Hidden Content] Link do Source do Cliente: [Hidden Content] Instalação WYD Linux mais simples e direta através do script bash install_wyd_linux.sh O script monta o ambiente sem forçar compilação, instala dependências e deixa o servidor pronto para configurar. Ele cria o mysql.txt para o servidor se conectar ao banco, com usuário, senha e nome do schema, e também atualiza o server.txt do cliente para apontar para o IP do servidor. No cliente, o server.txt define o endereço do servidor que o jogo vai usar. Na parte do servidor, o mysql.txt garante que DBSrv e TMSrv consigam acessar o MySQL com as credenciais certas. Decidi user um .txt no cliente para facilitar os testes. Bugs: Com certeza tem bastante, mas menos do que na versão original. As skills 9 e 10 estão implementadas (sinceramente nao testei todas ainda). Minha ideia é criar um gerenciamento via web, visto que a versão console (esta) não tem as mesmas informaçoes que a versão Windows. Toda a parte gráfica foi removida e roda direto pelo terminal. Tem um binário tmlinux (cliente). Pode ignorar. É só uma tentativa ousada de o cliente. O Cliver é 6000. Ao compilar no Windows ele cria o diretório que indica ser versão 7.69 Foi criado um arquivo ShimWin32 para tratar da compatibilidade e traduçao das chamadas WIn32 pra POSIX. A vantagem é que não preciso reescrever a lógica toda. O código continua igual, eu só traduzo a camada de API. Compile uma vez com o shim e pronto, roda em Linux mantendo tudo que funciona no Windows. Em resumo: setup feito sem precisar compilar agora; banco MySQL configurado automaticamente; mysql.txt criado para o WYD acessar o DB; server.txt do cliente ajustado para o IP certo. Assim, a configuração fica prática e você não precisa editar tudo na mão. Tem bugs comuns como inconsistência entre o ItemList.bin do cliente e o .csv do servidor. Estou corrigindo, mas não pretendo corrigir tudo porque tem muito item criado que acho desnecessário. O Cinto não equipa nessa source. Fiz a correçao na minha e libero quando tiver mais correçoes acumuladas. Tem script pra alterar o drop e xp por região. Acho que tá legal pra uma brincadeira mas não pra produção. Porém fiquem à vontade pra explorar e quem sabe compartilhar também. Tá bem suave, rodou de boa no meu celular Vivo X200 Pro no Gamehub e no Pocophone F1 rodando Fedora Mobility. Créditos: (Nomes encontrados no código) Se tiver mais alguém, basta avisar. Victor Klafke Charles TheHouse TRAE.AI GLM 5.1 Plus SexyCode BabyLove Outros- 13 respostas
-
- 74
-
-
-
-
Comandos de GM com descrição e exemplos
kernellpanic postou um tópico no fórum em WYD - Desenvolvimento
# 📋 COMANDOS GM DOCUMENTADOS - WYD SERVER (LINUX) *Baseado na source vazada [Thyra] | Portado para Linux* --- ## 📂 FONTES & UTILIZAÇÃO **Arquivos base:** - `LinuxServer/Chengdu/tmsrv/win_src/Code/TMSrv/_MSG_Imple.cpp` - `LinuxServer/Chengdu/tmsrv/win_src/Code/TMSrv/_MSG_MessageWhisper.cpp` **Como usar:** 1. Envie whisper para o NPC `gm` 2. Mensagem: `+comando argumentos` 3. Exemplo: whisper para `gm` com texto `+saveall` > ⚠️ **ATENÇÃO SOBRE `+set`:** Existem dois blocos `+set` no código. O whisper `gm` chama `ProcessImple(..., 2000, ...)`. Comandos como `+set billmode`, `+set evstart` funcionam no GM. Comandos como `+set sanc`, `+set coin`, `+set item` estão no bloco legado (`level != 2000`) e **NÃO** funcionam no GM padrão. --- ## 🛠️ MANUTENÇÃO E ADMINISTRAÇÃO ``` +timer <ms> - Define timer mínimo do servidor (min 5000) +saveall - Força SaveAll() global +decay - Ajuste de decay (implementação comentada) +reboot - Seta ServerDown = 1 +delayreboot <val> - Programa reboot baseado em ServerIndex +log - Reinicia logs de sistema/chat/item +reloadnpc - Recarrega gerador de NPC +reloaddroplist - Atualiza drop list +makedroplist - Rele generator e regenera drop list +reloadevento - Recarrega configs de evento +reloadpesa - Recarrega configs de pesa/perda +reloadbalanceamento - Recarrega balanceamento e base de classes +reloadperga - Recarrega pesa/perda +reloadcash - Atualiza loja donate +updatebalanceio - Executa BalanceioPvP() +reloadexptable - Recarrega tabelas de exp N/M +reloadserver - Rele configs do servidor +reloadguild - Recarrega dados de guild +readguildname - Rele nomes de guild +billconnect - Lê biserver.txt e conecta no billing server ``` --- ## ⚙️ CONFIGURAÇÕES VIA `+set` (ATIVAS NO GM) ``` +set billmode <val> - Ajusta BILLING (2 ou 3 exige billing server) +set billfree <val> - Ajusta FREEEXP +set charselbill <val> - Ajusta CHARSELBILL +set potioncount <val> - Ajusta POTIONCOUNT +set potiondelay <val> - Ajusta PotionDelay +set partybonus <val> - Ajusta PARTYBONUS +set guildboard <val> - Ajusta GUILDBOARD // Controle de Evento +set evstart <index> +set evend <index> +set evitem <item> +set evrate <rate> +set evindex <val> +set evdelete <0|1> +set evon <0|1> +set evnotice <0|1> +set double <0|1> - Liga/desliga DOUBLEMODE +set deadpoint <0|1> - Liga/desliga perda de morte +set dungeonevent <0|1> - Liga/desliga evento de dungeon +set champ <zone> <guild>- Define guild campeã da zona +set chall <zone> <guild>- Define guild desafiante da zona // Drop por faixa de posição +set drop <pos> <rate> - 16=todos slots, 1-7=blocos de 8, 8-15=especiais ``` --- ## 👤 CONTROLE DE PERSONAGEM / CONTA / MODERAÇÃO ``` +derrubar <nick> - Derruba cliente do jogador (modo 0) +desligar <nick> - Derruba cliente (modo 1) +banfirewall <nick> - Derruba cliente com firewall (modo 2) +name <novo_nome> - Altera nome do personagem atual +divinetime - Reseta/força tempo divino +isdivine - Limpeza de affect divina duplicada +readgpoints - Rele guild points +cp <valor> - Ajusta PK/CP e remulticasta mob +frag <valor> - Ajusta total de kills/frags +celestial <0..3> - Promove Foema mortal para celestial +mute <nick> - Alterna mute do jogador +muteall - Muta todos os conectados +desmuteall - Desmuta todos os conectados +kick <nick> - Desloga e fecha conexão +bann <conta> <dias> - Cria banimento (<30=temp, >=30=perm) ``` --- ## 👹 ITENS, NPC, MOBS E SPAWN ``` +generate <gen_index> - Gera mob pelo índice do generator +create <arquivo_mob> - Cria mob pelo arquivo na pasta npc +gift <alvo> <item> <e1> <v1> <e2> <v2> - Dá item para player ou mob +save <arquivo> - Salva mob atual em ./npc/<arquivo> +read <arquivo> - Lê ./npc/<arquivo> para mob atual +kill <nome_do_mob> - Mata mobs com nome correspondente +createkefra / +killkefra - Gera/Remove Kefra e associados +setjoias / +nojoias - Injeta/remove joias do slot atual // Configuração de Treasure +trtarget <tesouro 1-8> <slot 1-5> <item> <eff1> <val1> <eff2> <val2> +trsource <tesouro 1-8> <item> +trrate <tesouro 1-8> <slot 1-5> <rate> ``` --- ## 🗺️ MAPA, CLIMA, TELEPORT E AVISOS ``` +weather <valor> - Força clima atual +attmap - Mostra atributo do mapa na coordenada atual +trn - Teleporta para longe e volta para mesma posição +notice <texto> - Envia notice global pelo DBSrv +bcnot <texto> - Notice restrito à área do Battle Castle +chiefnotice <texto> - Envia aviso de chefe +teleport <x> <y> - Teleporta (valores <100 convertem para grid*128+64) +emotion <tipo> <valor> - Envia emotion ao personagem +gridoff / +gridon - Desliga/liga ocupação do grid na posição atual ``` --- ## 📊 AJUSTE DE EXP / DUNGEON / QUIZ ``` +waterexp <sala> <xp> - Regrava exp dos mobs da Water (0=N, 1=M, outro=A) +svexp <nivel_base> <xp> - Regrava exp global dos NPCs +nigexp <sala> <xp> - Regrava exp do Nightmare (0=N, 1=M, outro=A) +quiz - Envia pergunta do quiz ao GM +bigquiz - Envia big message do cubo quiz +cubo - Mostra pergunta/estado atual do cubo +rebuild - Reconstrói generator ``` --- ## ⚔️ GUILD, GUERRA E EVENTOS ``` +guildday <0..6> - Ajusta dia da guerra +guildhour <0..23> - Ajusta horário da guerra +newbiehour <0..23> - Ajusta horário newbie +weekmode <0..5> - Força modo semanal +gfame <guild> <fama> - Atualiza fama da guild (memória/SQL/DBSrv) +iniciarguerra - Inicia guerra de torres +finalizarguerra - Finaliza guerra de torres +chiefsummon - Invoca chefe/evento relacionado +event - Mostra resumo da config do evento atual +partydif <valor> - Ajusta PARTY_DIF +rvrhour <hora> - Ajusta horário de RvR +rvrbonus <valor> - Ajusta bônus de RvR +gtorrehour <hora> - Ajusta horário da guerra de torres +hardcore <0|1> - Liga/desliga modo hardcore +dropitem <0|1> - Liga/desliga drop de item +maxnightmare <valor> - Ajusta limite do Nightmare +statsapphire <valor> - Ajusta config de safira +battleroyal <item> - Ajusta recompensa do battle royal +maxbpoints - Dá 100000 battlepass points ao GM ``` --- ## 🔧 AJUSTES DIRETOS NO PERSONAGEM ATUAL (GM) ``` +learn - Libera todas as skills (LearnedSkill = -1) +class <valor> - Altera MOB.Class +buff <tipo> - Seta Affect[0] com tempo 162000 +citizen <valor>- Ajusta cidadania +nobuff - Limpa todos os affects +soul <valor> - Ajusta extra.Soul +snoop - Alterna flag MSV_SNOOP no personagem ``` --- ## 🚫 COMANDOS COM IMPLEMENTAÇÃO DUVIDOSA OU PERIGOSA ``` +npko - Intenção: gravar IP do GM em Admin.txt - Problema: IPPos fica -1 (mapeamento de contas comentado) - Resultado: escreve em pAdminIP[-1] → COMANDO QUEBRADO/PERIGOSO +gerar <valor> <nome> - Intenção: gerar arquivo em ../../Common/PinCode/<nome>.txt - Problema: sscanf usa buffer vazio no parser - Resultado: COMANDO QUEBRADO no código atual ``` --- ## 🔑 COMANDOS FORA DO `+` (WHISPER ADMIN DIRETO) *Funcionam enviando o comando direto no whisper para admin, sem o "+"* ``` reloadrop - Recarrega drop TXT limpinventario - Limpa inventário do próprio personagem infoplay - Mostra informações do jogador informado not <texto> - Envia notice por whisper admin onlineip - Conta IPs distintos online onlineiplist - Lista IPs e quantidade de chars por IP ``` --- ## 📜 COMANDOS NO BLOCO `level != 2000` (LEGADO) *Estes comandos EXISTEM no código, mas o GM padrão (level 2000) NÃO passa por este bloco. Só funcionam se houver outro caminho chamando ProcessImple com nível diferente de 2000.* ``` // Atributos e Stats +set sanc <0..15> +set level <valor> +set hp/mp/maxhp +set ac/dam/exp +set str/int/dex/con +set coin <valor> // Guild e Sistema +set impost <slot> <val> +set donate <valor> +set honra <valor> +set diariastate +set merchant <valor> +set skillbonus <valor> +set special0..3 <valor> +set scorebonus <valor> +set fama <valor> // Limpezas +set secclearskill +set clearskill +set clearquest +set limparinv // Eventos e Utilitários +set empatarvr +set buildhtml +set bigcubodoor <1|2|3> +set bigcubo <1|2> +set bcoff / +set bcon // Portões e Itens de Campo +set gate <item> <x> <y> <rotate> +set destroygate <itemId> +set cgate/ogate/ngate <itemId> +set mgate <x> <y> +set closearmia / +set openarmia // Flags e Aprendizado +set attackrun <valor> +set critical <valor> +set learned/seclearned <skillPos> +set classmaster <valor> // Diversos +set readcomp +set reloadcaptcha +set capared/blue/branca +set reloadfile +set item <item> <eff1> <val1> <eff2> <val2> <eff3> <val3> +set noatum ``` > ⚠️ **Nota sobre `+set item`:** O código trata `ival1` como slot de equip também. Comportamento misto: cria item no carry E tenta equipar no slot `ival1-1`. Usar com cautela. --- ## 🗑️ COMANDOS COMENTADOS / DESATIVADOS ``` +pesca - Presente apenas em bloco comentado +ban - Presente apenas em bloco comentado ``` --- *Documentação reversa baseada em análise estática do código. Teste em ambiente de desenvolvimento antes de usar em produção.* -
Exatamente. O Cliente tem crash frequente. O Gemini corrigiu tudo isso. Quando eu tiver tempo e organizar tudo eu posto as correçoes. O ChatGPT delira mais que usuário de drogas. O Kimi K2 e Yuanbao fizeram coisas maravilhosas. Como uso o cliente e servidor em Linux (Também em Linux Aarch64), eles conseguiram portar algumas ferramentas pra essa plataforma e arquitetura, além de melhorar. O WYD.exe agora primeiro lê o IP de um serverlist.txt, se não existir, ele lê o que tá hardcoded. Ficou bacana. A ideia era fazer o servidor rodar sem interface gráfica, somente via console. São modificaçoes profundas mas interessantes. Você sabe algum "Vazamento" que possua as skills 9-12 funcionando pra portar pra esse?
-
Prefiro não citar o nome porque não acho que agregaria algum valor. Mas a forma como os problemas existem é bem curiosa. Levanta questionamentos tipo: Ele é muito leigo ou apenas mal intencionado? Ou os dois? Porque não se trata de um arquivo com erros, mas são praticamente todos, sabe? Algo que daria mais trabalho pra bagunçar do que pra arrumar. Mas, destruir é fácil. O Difícil é construir.
-
Pergunta sincera: O cliente possui diversos bugs graves. Um deles é erro na textura após alguns minutos. Ex: // No .h: IDirect3DTexture9* m_ppUITexture[512]; // No .cpp: Acessa até índice 999 (MAX_UI_TEXTURE = 1000) IDirect3DTexture9* TextureManager::GetUITexture(int nIndex, DWORD showTime) { if (nIndex < 0 || nIndex > MAX_UI_TEXTURE) // MAX_UI_TEXTURE = 1000 return nullptr; if (m_ppUITexture[nIndex] != nullptr) // SE nIndex > 511: BUFFER OVERFLOW! Resultado: Índices 512-999 acessam memória fora do array m_ppUITexture[512] Pode sobrescrever outros dados (outros arrays, variáveis, código), Texturas brancas porque retorna L1xo da memória (Isso ocorre após uns minutos), Crash aleatório quando corrompe memória crítica (ocorre em menos de 2 minutos após as texturas brancas). A pergunta é: Como praticamente todos os códigos "desse programador" cujo nome aparece ao abrir o TMSrv possuem falhas graves, isso é proposital ou é inexperiência crônica e desleixo por parte dele? fread(m_stUITextureList, sizeof(m_stUITextureList), 1, fpBin); // m_stUITextureList tem 1000 elementos // Mas no .h: stTextureListInfo m_stUITextureList[MAX_UI_TEXTURE]; // 1000 ✓ // No .cpp: stTextureListInfo m_stUITextureList[512]; // SÓ 512! Se o arquivo .bin tem 1000 entradas: Lê 1000 registros × sizeof(stTextureListInfo) Mas array só tem espaço para 512 Buffer overflow corrompe memória adjacente Informações de textura ficam corrompidas Texturas carregam com formato/alfa errado ( brancas) O Código de Debug no .cpp Confirma for (int i = 0; i < 1000; ++i) // Itera até 1000! { // Modifica m_stUITextureList // Para i > 511: CORROMPE MEMÓRIA! if (i == 396) // Índice 396 ainda é válido (dentro de 512) { sprintf(m_stUITextureList.szFileName, "UI\\select06.wyt"); m_stUITextureList.cAlpha = 65; } } Ele sabia do problema e tentou corrigir alguns índices? Edit: Após a correçao, o cliente tá rodando sem falhas. Vou testar por mais um tempo.
-
kernellpanic alterou sua foto pessoal
-
kernellpanic obteve troféu Troféu de Moderador
-
BASE W2PP CLONE WYD ROGUE (RELEASE + CLIENTE + 2 SOURCE)
kernellpanic respondeu ao tópico de Mauzyn em WYD - Desenvolvimento
Tem um ~bug~ que te impede conectar. if(Init == 0) { if(nRecvPosition - nProcPosition < 4) return 0; int InitCode = *((unsigned int *)(pRecvBuffer + nProcPosition)); if(InitCode != INITCODE) // <-- Procura INITCODE { *ErrorCode = 2; *ErrorType = InitCode; return 0; } Linhas 386-398: CPSock.h Cliente envia: INIT_CODE = 0x1F100011 (521270033) Servidor espera: INITCODE = 0x1F11F311 (520626961) Por isso conexão falha no handshake Mas não para por aí. Tem muitos outros ~bugs~. -
BASE W2PP CLONE WYD ROGUE (RELEASE + CLIENTE + 2 SOURCE)
kernellpanic respondeu ao tópico de Mauzyn em WYD - Desenvolvimento
Obs: NUnca se esqueçam de olhar o SendFunc.cpp lá pela linha 465... rs Sempre tem uma surpresa. Fiz script em python pra trocar o serverlist que está hardcoded no binário. Qualquer IA pode fazer isso pra você, basta enviar o exe para ela.
