Pesquisar na Comunidade
Mostrando resultados para as tags ''WyD''.
Encontrado 56 registros
-
⚔️ 𝗦𝗼𝗯𝗿𝗲 𝗱𝗼 𝗦𝗲𝗿𝘃𝗶𝗱𝗼𝗿 🔸 Versão: Clássica 🔸 Experiência: Médio / Médio 🔸 Drop: Médio / Médio 🔸 Progressão dinâmica 🔸 Quests Mortais: Do Lv. 40 até o 351 🔸 Diversas mecânicas 🔥 𝗦𝗜𝗦𝗧𝗘𝗠𝗔𝗦 𝗘𝗫𝗖𝗟𝗨𝗦𝗜𝗩𝗢𝗦 O servidor foi construído para oferecer uma experiência diferenciada: 🔹 Codex 🔹 Mineração 🔹 Pescaria 🔹 Dungeon Guilda 🔹 Gemas Mágicas 🔹 Montarias Lendárias 🔹 Consumíveis Exclusivos 🔹 Arena para até 104 jogadores 🔹 Mercado Global 🔹 Painel Guilda 🔹 Loja de Guilda 🔹 Info do Jogador 🔹 World Bosses 🔹 LAN Reformulada 🔹 Guerra de Torres Reformulada 🔹 Guerra de Noatun Reformulada 🔹 Castelo de Loki 🔹 Sistema de Roleta 🔹 Passe de Batalha completo 🔹 VIP para qualidade de vida do jogador 🔹 Sistema de tradução em tempo real 🔹 Drop 100% refeito do zero 🏰 𝗖𝗢𝗠𝗨𝗡𝗜𝗗𝗔𝗗𝗘, 𝗚𝗨𝗜𝗟𝗗𝗔𝗦 𝗘 𝗟𝗢𝗡𝗚𝗔 𝗩𝗜𝗗𝗔 Poderíamos repetir o mesmo discurso de sempre... "Não somos um servidor de 3 meses" "Sem Pay2Win" "PvP balanceado" Mas você já cansou de ler isso. E a gente também. A diferença é simples: Aqui você não vai ouvir promessa, vai acontecer. Sem sistema quebrado Sem vantagem comprada Sem conteúdo que morre em semanas Aqui cada conquista é suada Cada guerra tem peso Cada jogador faz diferença Se você quer mais do mesmo, esse não é o seu servidor. Agora, se você quer um desafio de verdade... Bem vindo ao Mystic Destiny! Projetos & Oportunidades 🔸 Programa de Criadores de Conteúdo 🔸 Auxílio para Guildas 🔸 Vagas para Divulgadores Quer crescer junto com o servidor ? Aqui você tem espaço. 📷 𝗜𝗠𝗔𝗚𝗘𝗡𝗦 𝗗𝗢 𝗦𝗘𝗥𝗩𝗜𝗗𝗢𝗥 🔗 𝗘𝗡𝗧𝗥𝗘 𝗡𝗢𝗦 𝗖𝗔𝗡𝗔𝗜𝗦 𝗢𝗙𝗜𝗖𝗜𝗔𝗜𝗦 Site: [Hidden Content] Discord: [Hidden Content]
- 24 respostas
-
- 91
-
-
-
-
wyd SOMBRAS PARA WYD SEU CLIENT - SHADOW - TMPROJECT
joaofrangofivemm postou um tópico no fórum em WYD - Desenvolvimento
🌑 SISTEMA DE SOMBRAS PARA TMPROJECT – WYD Código desenvolvido e compartilhado por mim para melhorar o visual do WYD, adicionando sombras ao projeto e deixando o ambiente mais bonito e moderno. Também criei um arquivo .md com as instruções necessárias para implementar corretamente o sistema no TMProject. ✅ Código completo ✅ Guia de implementação em .md ✅ Compatível com TMProject ✅ Melhoria visual para o cliente WYD 💻 compartilhado por João Frango ShadowProjectorMesh.cpp #include "pch.h" #include "ShadowProjectorMesh.h" #include "TMHuman.h" #include "TMGlobal.h" #include "RenderDevice.h" // ============================================================ // MANUAL SHADOW TUNING (AJUSTE MANUAL DA SOMBRA PROJETADA) // // 1) ROTACAO DA SOMBRA (direcao): // g_ShadowLightDir.x / y / z // // 2) ALTURA/ENCOSTE NO CHAO: // g_ShadowPlaneBias // // 3) INTENSIDADE: // g_ShadowAlphaMax // // Dica: ajuste primeiro a direcao (x/z), depois bias, depois alpha. // ============================================================ static D3DXVECTOR3 g_ShadowLightDir = D3DXVECTOR3(1.20f, -0.70f, 0.60f); static float g_ShadowPlaneBias = 0.005f; static float g_ShadowDirOffset = 2.80f; static DWORD g_ShadowAlphaMax = 120; static bool g_ShadowLockAtFeet = false; // false = projeta para o lado D3DXVECTOR3 ShadowProjectorMesh::s_vLightDir = D3DXVECTOR3(1.20f, -0.70f, 0.60f); DWORD ShadowProjectorMesh::s_sAlphaBlend, ShadowProjectorMesh::s_sSrcBlend, ShadowProjectorMesh::s_sDestBlend; DWORD ShadowProjectorMesh::s_sAlphaRef, ShadowProjectorMesh::s_sAlphaFunc, ShadowProjectorMesh::s_sAlphaTest; DWORD ShadowProjectorMesh::s_sZWrite, ShadowProjectorMesh::s_sZEnable, ShadowProjectorMesh::s_sZFunc, ShadowProjectorMesh::s_sDepthBias, ShadowProjectorMesh::s_sSlopeBias, ShadowProjectorMesh::s_sLighting; DWORD ShadowProjectorMesh::s_sFogEnable, ShadowProjectorMesh::s_sFogVertex, ShadowProjectorMesh::s_sCull; DWORD ShadowProjectorMesh::s_sTexFactor, ShadowProjectorMesh::s_sColorVertex; DWORD ShadowProjectorMesh::s_sTs0ColorOp, ShadowProjectorMesh::s_sTs0ColorArg1, ShadowProjectorMesh::s_sTs0ColorArg2; DWORD ShadowProjectorMesh::s_sTs0AlphaOp, ShadowProjectorMesh::s_sTs0AlphaArg1, ShadowProjectorMesh::s_sTs0AlphaArg2; DWORD ShadowProjectorMesh::s_sTs1ColorOp, ShadowProjectorMesh::s_sTs1ColorArg1, ShadowProjectorMesh::s_sTs1ColorArg2; DWORD ShadowProjectorMesh::s_sTs1AlphaOp, ShadowProjectorMesh::s_sTs1AlphaArg1, ShadowProjectorMesh::s_sTs1AlphaArg2; DWORD ShadowProjectorMesh::s_sStencilEnable, ShadowProjectorMesh::s_sStencilFunc, ShadowProjectorMesh::s_sStencilRef, ShadowProjectorMesh::s_sStencilMask; DWORD ShadowProjectorMesh::s_sStencilWriteMask, ShadowProjectorMesh::s_sStencilPass, ShadowProjectorMesh::s_sStencilFail, ShadowProjectorMesh::s_sStencilZFail; void ShadowProjectorMesh::SetupShadowMatrix(TMHuman* pHuman, float groundY) { if (!pHuman) return; if (groundY < -9000.0f) groundY = 0.0f; if (g_ShadowLockAtFeet) { D3DXMatrixIdentity(&pHuman->m_matShadow); pHuman->m_matShadow._22 = 0.0f; pHuman->m_matShadow._42 = groundY + g_ShadowPlaneBias; return; } D3DXVECTOR3 L = g_ShadowLightDir; D3DXVec3Normalize(&L, &L); // D3DXMatrixShadow com luz direcional rasante — projeta o mesh real no plano do chao // Quanto mais rasante o Y da luz, mais longa/deitada fica a sombra D3DXPLANE plane(0.0f, 1.0f, 0.0f, -(groundY + g_ShadowPlaneBias)); D3DXVECTOR4 lightDir(-L.x, -L.y, -L.z, 0.0f); // w=0 = luz direcional D3DXMatrixShadow(&pHuman->m_matShadow, &lightDir, &plane); } bool ShadowProjectorMesh::BeginShadow(IDirect3DDevice9* dev, float alpha) { if (!dev || !g_pDevice) return false; auto FloatToDWORD = [](float v) -> DWORD { DWORD out = 0; memcpy(&out, &v, sizeof(DWORD)); return out; }; // Salva via dev direto — estado real do device, sem cache dev->GetRenderState(D3DRS_ALPHABLENDENABLE, &s_sAlphaBlend); dev->GetRenderState(D3DRS_SRCBLEND, &s_sSrcBlend); dev->GetRenderState(D3DRS_DESTBLEND, &s_sDestBlend); dev->GetRenderState(D3DRS_ALPHAREF, &s_sAlphaRef); dev->GetRenderState(D3DRS_ALPHAFUNC, &s_sAlphaFunc); dev->GetRenderState(D3DRS_ALPHATESTENABLE, &s_sAlphaTest); dev->GetRenderState(D3DRS_ZWRITEENABLE, &s_sZWrite); dev->GetRenderState(D3DRS_ZENABLE, &s_sZEnable); dev->GetRenderState(D3DRS_ZFUNC, &s_sZFunc); dev->GetRenderState(D3DRS_DEPTHBIAS, &s_sDepthBias); dev->GetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, &s_sSlopeBias); dev->GetRenderState(D3DRS_LIGHTING, &s_sLighting); dev->GetRenderState(D3DRS_FOGENABLE, &s_sFogEnable); dev->GetRenderState(D3DRS_FOGVERTEXMODE, &s_sFogVertex); dev->GetRenderState(D3DRS_CULLMODE, &s_sCull); dev->GetRenderState(D3DRS_TEXTUREFACTOR, &s_sTexFactor); dev->GetRenderState(D3DRS_COLORVERTEX, &s_sColorVertex); dev->GetTextureStageState(0, D3DTSS_COLOROP, &s_sTs0ColorOp); dev->GetTextureStageState(0, D3DTSS_COLORARG1, &s_sTs0ColorArg1); dev->GetTextureStageState(0, D3DTSS_COLORARG2, &s_sTs0ColorArg2); dev->GetTextureStageState(0, D3DTSS_ALPHAOP, &s_sTs0AlphaOp); dev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &s_sTs0AlphaArg1); dev->GetTextureStageState(0, D3DTSS_ALPHAARG2, &s_sTs0AlphaArg2); dev->GetTextureStageState(1, D3DTSS_COLOROP, &s_sTs1ColorOp); dev->GetTextureStageState(1, D3DTSS_COLORARG1, &s_sTs1ColorArg1); dev->GetTextureStageState(1, D3DTSS_COLORARG2, &s_sTs1ColorArg2); dev->GetTextureStageState(1, D3DTSS_ALPHAOP, &s_sTs1AlphaOp); dev->GetTextureStageState(1, D3DTSS_ALPHAARG1, &s_sTs1AlphaArg1); dev->GetTextureStageState(1, D3DTSS_ALPHAARG2, &s_sTs1AlphaArg2); dev->GetRenderState(D3DRS_STENCILENABLE, &s_sStencilEnable); dev->GetRenderState(D3DRS_STENCILFUNC, &s_sStencilFunc); dev->GetRenderState(D3DRS_STENCILREF, &s_sStencilRef); dev->GetRenderState(D3DRS_STENCILMASK, &s_sStencilMask); dev->GetRenderState(D3DRS_STENCILWRITEMASK,&s_sStencilWriteMask); dev->GetRenderState(D3DRS_STENCILPASS, &s_sStencilPass); dev->GetRenderState(D3DRS_STENCILFAIL, &s_sStencilFail); dev->GetRenderState(D3DRS_STENCILZFAIL, &s_sStencilZFail); DWORD a = (DWORD)(alpha * 255.0f); if (a > g_ShadowAlphaMax) a = g_ShadowAlphaMax; DWORD shadowColor = D3DCOLOR_ARGB(a, 0, 0, 0); // Configura via g_pDevice para manter cache sincronizado g_pDevice->SetTexture(0, nullptr); g_pDevice->SetTexture(1, nullptr); g_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, shadowColor); g_pDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE); g_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); g_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR); g_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); g_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); g_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS); g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); g_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); g_pDevice->SetRenderState(D3DRS_DEPTHBIAS, FloatToDWORD(-0.00005f)); g_pDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, FloatToDWORD(-0.5f)); g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_pDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE); g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pDevice->SetRenderState(D3DRS_ALPHAREF, 0); g_pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); g_pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); // so pinta onde stencil=0 (sem personagem) g_pDevice->SetRenderState(D3DRS_STENCILREF, 0x00); g_pDevice->SetRenderState(D3DRS_STENCILMASK, 0xFF); g_pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFF); g_pDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCR); g_pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); g_pDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); return true; } void ShadowProjectorMesh::EndShadow(IDirect3DDevice9* dev) { if (!dev || !g_pDevice) return; // Restaura via g_pDevice para manter cache sincronizado // Textura null para limpar estado da sombra g_pDevice->SetTexture(0, nullptr); g_pDevice->SetTexture(1, nullptr); // Restaura render states via g_pDevice (atualiza cache + device) g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, s_sAlphaBlend); g_pDevice->SetRenderState(D3DRS_SRCBLEND, s_sSrcBlend); g_pDevice->SetRenderState(D3DRS_DESTBLEND, s_sDestBlend); g_pDevice->SetRenderState(D3DRS_ALPHAREF, s_sAlphaRef); g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, s_sAlphaFunc); g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, s_sAlphaTest); g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, s_sZWrite); g_pDevice->SetRenderState(D3DRS_ZENABLE, s_sZEnable); g_pDevice->SetRenderState(D3DRS_ZFUNC, s_sZFunc); g_pDevice->SetRenderState(D3DRS_DEPTHBIAS, s_sDepthBias); g_pDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, s_sSlopeBias); g_pDevice->SetRenderState(D3DRS_LIGHTING, s_sLighting); g_pDevice->SetRenderState(D3DRS_FOGENABLE, s_sFogEnable); g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, s_sFogVertex); g_pDevice->SetRenderState(D3DRS_CULLMODE, s_sCull); g_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, s_sTexFactor); g_pDevice->SetRenderState(D3DRS_COLORVERTEX, s_sColorVertex); g_pDevice->SetRenderState(D3DRS_STENCILENABLE, s_sStencilEnable); g_pDevice->SetRenderState(D3DRS_STENCILFUNC, s_sStencilFunc); g_pDevice->SetRenderState(D3DRS_STENCILREF, s_sStencilRef); g_pDevice->SetRenderState(D3DRS_STENCILMASK, s_sStencilMask); g_pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, s_sStencilWriteMask); g_pDevice->SetRenderState(D3DRS_STENCILPASS, s_sStencilPass); g_pDevice->SetRenderState(D3DRS_STENCILFAIL, s_sStencilFail); g_pDevice->SetRenderState(D3DRS_STENCILZFAIL, s_sStencilZFail); g_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, s_sTs0ColorOp); g_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, s_sTs0ColorArg1); g_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, s_sTs0ColorArg2); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, s_sTs0AlphaOp); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, s_sTs0AlphaArg1); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, s_sTs0AlphaArg2); g_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, s_sTs1ColorOp); g_pDevice->SetTextureStageState(1, D3DTSS_COLORARG1, s_sTs1ColorArg1); g_pDevice->SetTextureStageState(1, D3DTSS_COLORARG2, s_sTs1ColorArg2); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, s_sTs1AlphaOp); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAARG1, s_sTs1AlphaArg1); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAARG2, s_sTs1AlphaArg2); // Força cache de textura a refletir nullptr — próximo render vai rebindar // Invalida cache para forçar rebind no próximo SetTexture g_pDevice->m_pTexture[0] = nullptr; g_pDevice->m_pTexture[1] = nullptr; } ShadowProjectorMesh.h #pragma once #include <d3d9.h> #include <d3dx9.h> class TMHuman; class ShadowProjectorMesh { public: static D3DXVECTOR3 s_vLightDir; static void SetupShadowMatrix(TMHuman* pHuman, float groundY); static bool BeginShadow(IDirect3DDevice9* dev, float alpha = 0.38f); static void EndShadow(IDirect3DDevice9* dev); private: // render states static DWORD s_sAlphaBlend, s_sSrcBlend, s_sDestBlend; static DWORD s_sAlphaRef, s_sAlphaFunc, s_sAlphaTest; static DWORD s_sZWrite, s_sZEnable, s_sZFunc, s_sDepthBias, s_sSlopeBias, s_sLighting; static DWORD s_sFogEnable, s_sFogVertex, s_sCull; static DWORD s_sTexFactor, s_sColorVertex; // stage 0 static DWORD s_sTs0ColorOp, s_sTs0ColorArg1, s_sTs0ColorArg2; static DWORD s_sTs0AlphaOp, s_sTs0AlphaArg1, s_sTs0AlphaArg2; // stage 1 static DWORD s_sTs1ColorOp, s_sTs1ColorArg1, s_sTs1ColorArg2; static DWORD s_sTs1AlphaOp, s_sTs1AlphaArg1, s_sTs1AlphaArg2; static DWORD s_sStencilEnable, s_sStencilFunc, s_sStencilRef, s_sStencilMask; static DWORD s_sStencilWriteMask, s_sStencilPass, s_sStencilFail, s_sStencilZFail; }; Implementação .md # ShadowProjectorMesh — Documentação Completa de Implementação ## Visão Geral O `ShadowProjectorMesh` é um sistema de sombras projetadas (planar shadow) usando DirectX 9. Ele projeta a geometria dos personagens e objetos no plano do chão como silhuetas escuras, utilizando **stencil buffer** para evitar sobreposição de sombras. --- ## Arquivos do Sistema | Arquivo | Descrição | |---|---| | `ShadowProjectorMesh.h` | Header com declaração da classe | | `ShadowProjectorMesh.cpp` | Implementação dos 3 métodos principais | | `TMHuman.cpp` | Integração com personagens (queue + render) | | `TMObject.cpp` | Integração com objetos estáticos (queue + render) | | `ObjectManager.cpp` | Pipeline de renderização (flush das filas) | | `TMProject.vcxproj` | Registro no projeto Visual Studio | | `TMProject.vcxproj.filters` | Filtro: `Source Files\Effects` / `Header Files\Effects` | --- ## 1. ShadowProjectorMesh.h ```cpp #pragma once #include <d3d9.h> #include <d3dx9.h> class TMHuman; class ShadowProjectorMesh { public: static D3DXVECTOR3 s_vLightDir; static void SetupShadowMatrix(TMHuman* pHuman, float groundY); static bool BeginShadow(IDirect3DDevice9* dev, float alpha = 0.38f); static void EndShadow(IDirect3DDevice9* dev); private: // render states static DWORD s_sAlphaBlend, s_sSrcBlend, s_sDestBlend; static DWORD s_sAlphaRef, s_sAlphaFunc, s_sAlphaTest; static DWORD s_sZWrite, s_sZEnable, s_sZFunc, s_sDepthBias, s_sSlopeBias, s_sLighting; static DWORD s_sFogEnable, s_sFogVertex, s_sCull; static DWORD s_sTexFactor, s_sColorVertex; // stage 0 static DWORD s_sTs0ColorOp, s_sTs0ColorArg1, s_sTs0ColorArg2; static DWORD s_sTs0AlphaOp, s_sTs0AlphaArg1, s_sTs0AlphaArg2; // stage 1 static DWORD s_sTs1ColorOp, s_sTs1ColorArg1, s_sTs1ColorArg2; static DWORD s_sTs1AlphaOp, s_sTs1AlphaArg1, s_sTs1AlphaArg2; static DWORD s_sStencilEnable, s_sStencilFunc, s_sStencilRef, s_sStencilMask; static DWORD s_sStencilWriteMask, s_sStencilPass, s_sStencilFail, s_sStencilZFail; }; ``` --- ## 2. ShadowProjectorMesh.cpp ```cpp #include "pch.h" #include "ShadowProjectorMesh.h" #include "TMHuman.h" #include "TMGlobal.h" #include "RenderDevice.h" // ============================================================ // MANUAL SHADOW TUNING (AJUSTE MANUAL DA SOMBRA PROJETADA) // // 1) ROTACAO DA SOMBRA (direcao): // g_ShadowLightDir.x / y / z // // 2) ALTURA/ENCOSTE NO CHAO: // g_ShadowPlaneBias // // 3) INTENSIDADE: // g_ShadowAlphaMax // // Dica: ajuste primeiro a direcao (x/z), depois bias, depois alpha. // ============================================================ static D3DXVECTOR3 g_ShadowLightDir = D3DXVECTOR3(1.20f, -0.70f, 0.60f); static float g_ShadowPlaneBias = 0.005f; static float g_ShadowDirOffset = 2.80f; static DWORD g_ShadowAlphaMax = 120; static bool g_ShadowLockAtFeet = false; // false = projeta para o lado D3DXVECTOR3 ShadowProjectorMesh::s_vLightDir = D3DXVECTOR3(1.20f, -0.70f, 0.60f); DWORD ShadowProjectorMesh::s_sAlphaBlend, ShadowProjectorMesh::s_sSrcBlend, ShadowProjectorMesh::s_sDestBlend; DWORD ShadowProjectorMesh::s_sAlphaRef, ShadowProjectorMesh::s_sAlphaFunc, ShadowProjectorMesh::s_sAlphaTest; DWORD ShadowProjectorMesh::s_sZWrite, ShadowProjectorMesh::s_sZEnable, ShadowProjectorMesh::s_sZFunc, ShadowProjectorMesh::s_sDepthBias, ShadowProjectorMesh::s_sSlopeBias, ShadowProjectorMesh::s_sLighting; DWORD ShadowProjectorMesh::s_sFogEnable, ShadowProjectorMesh::s_sFogVertex, ShadowProjectorMesh::s_sCull; DWORD ShadowProjectorMesh::s_sTexFactor, ShadowProjectorMesh::s_sColorVertex; DWORD ShadowProjectorMesh::s_sTs0ColorOp, ShadowProjectorMesh::s_sTs0ColorArg1, ShadowProjectorMesh::s_sTs0ColorArg2; DWORD ShadowProjectorMesh::s_sTs0AlphaOp, ShadowProjectorMesh::s_sTs0AlphaArg1, ShadowProjectorMesh::s_sTs0AlphaArg2; DWORD ShadowProjectorMesh::s_sTs1ColorOp, ShadowProjectorMesh::s_sTs1ColorArg1, ShadowProjectorMesh::s_sTs1ColorArg2; DWORD ShadowProjectorMesh::s_sTs1AlphaOp, ShadowProjectorMesh::s_sTs1AlphaArg1, ShadowProjectorMesh::s_sTs1AlphaArg2; DWORD ShadowProjectorMesh::s_sStencilEnable, ShadowProjectorMesh::s_sStencilFunc, ShadowProjectorMesh::s_sStencilRef, ShadowProjectorMesh::s_sStencilMask; DWORD ShadowProjectorMesh::s_sStencilWriteMask, ShadowProjectorMesh::s_sStencilPass, ShadowProjectorMesh::s_sStencilFail, ShadowProjectorMesh::s_sStencilZFail; void ShadowProjectorMesh::SetupShadowMatrix(TMHuman* pHuman, float groundY) { if (!pHuman) return; if (groundY < -9000.0f) groundY = 0.0f; if (g_ShadowLockAtFeet) { D3DXMatrixIdentity(&pHuman->m_matShadow); pHuman->m_matShadow._22 = 0.0f; pHuman->m_matShadow._42 = groundY + g_ShadowPlaneBias; return; } D3DXVECTOR3 L = g_ShadowLightDir; D3DXVec3Normalize(&L, &L); // D3DXMatrixShadow com luz direcional rasante D3DXPLANE plane(0.0f, 1.0f, 0.0f, -(groundY + g_ShadowPlaneBias)); D3DXVECTOR4 lightDir(-L.x, -L.y, -L.z, 0.0f); // w=0 = luz direcional D3DXMatrixShadow(&pHuman->m_matShadow, &lightDir, &plane); } bool ShadowProjectorMesh::BeginShadow(IDirect3DDevice9* dev, float alpha) { if (!dev || !g_pDevice) return false; auto FloatToDWORD = [](float v) -> DWORD { DWORD out = 0; memcpy(&out, &v, sizeof(DWORD)); return out; }; // Salva render states originais dev->GetRenderState(D3DRS_ALPHABLENDENABLE, &s_sAlphaBlend); dev->GetRenderState(D3DRS_SRCBLEND, &s_sSrcBlend); dev->GetRenderState(D3DRS_DESTBLEND, &s_sDestBlend); dev->GetRenderState(D3DRS_ALPHAREF, &s_sAlphaRef); dev->GetRenderState(D3DRS_ALPHAFUNC, &s_sAlphaFunc); dev->GetRenderState(D3DRS_ALPHATESTENABLE, &s_sAlphaTest); dev->GetRenderState(D3DRS_ZWRITEENABLE, &s_sZWrite); dev->GetRenderState(D3DRS_ZENABLE, &s_sZEnable); dev->GetRenderState(D3DRS_ZFUNC, &s_sZFunc); dev->GetRenderState(D3DRS_DEPTHBIAS, &s_sDepthBias); dev->GetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, &s_sSlopeBias); dev->GetRenderState(D3DRS_LIGHTING, &s_sLighting); dev->GetRenderState(D3DRS_FOGENABLE, &s_sFogEnable); dev->GetRenderState(D3DRS_FOGVERTEXMODE, &s_sFogVertex); dev->GetRenderState(D3DRS_CULLMODE, &s_sCull); dev->GetRenderState(D3DRS_TEXTUREFACTOR, &s_sTexFactor); dev->GetRenderState(D3DRS_COLORVERTEX, &s_sColorVertex); dev->GetTextureStageState(0, D3DTSS_COLOROP, &s_sTs0ColorOp); dev->GetTextureStageState(0, D3DTSS_COLORARG1, &s_sTs0ColorArg1); dev->GetTextureStageState(0, D3DTSS_COLORARG2, &s_sTs0ColorArg2); dev->GetTextureStageState(0, D3DTSS_ALPHAOP, &s_sTs0AlphaOp); dev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &s_sTs0AlphaArg1); dev->GetTextureStageState(0, D3DTSS_ALPHAARG2, &s_sTs0AlphaArg2); dev->GetTextureStageState(1, D3DTSS_COLOROP, &s_sTs1ColorOp); dev->GetTextureStageState(1, D3DTSS_COLORARG1, &s_sTs1ColorArg1); dev->GetTextureStageState(1, D3DTSS_COLORARG2, &s_sTs1ColorArg2); dev->GetTextureStageState(1, D3DTSS_ALPHAOP, &s_sTs1AlphaOp); dev->GetTextureStageState(1, D3DTSS_ALPHAARG1, &s_sTs1AlphaArg1); dev->GetTextureStageState(1, D3DTSS_ALPHAARG2, &s_sTs1AlphaArg2); dev->GetRenderState(D3DRS_STENCILENABLE, &s_sStencilEnable); dev->GetRenderState(D3DRS_STENCILFUNC, &s_sStencilFunc); dev->GetRenderState(D3DRS_STENCILREF, &s_sStencilRef); dev->GetRenderState(D3DRS_STENCILMASK, &s_sStencilMask); dev->GetRenderState(D3DRS_STENCILWRITEMASK,&s_sStencilWriteMask); dev->GetRenderState(D3DRS_STENCILPASS, &s_sStencilPass); dev->GetRenderState(D3DRS_STENCILFAIL, &s_sStencilFail); dev->GetRenderState(D3DRS_STENCILZFAIL, &s_sStencilZFail); DWORD a = (DWORD)(alpha * 255.0f); if (a > g_ShadowAlphaMax) a = g_ShadowAlphaMax; DWORD shadowColor = D3DCOLOR_ARGB(a, 0, 0, 0); // Configura via g_pDevice para manter cache sincronizado g_pDevice->SetTexture(0, nullptr); g_pDevice->SetTexture(1, nullptr); g_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, shadowColor); g_pDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE); g_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2); g_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR); g_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); g_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); g_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS); g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); g_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); g_pDevice->SetRenderState(D3DRS_DEPTHBIAS, FloatToDWORD(-0.00005f)); g_pDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, FloatToDWORD(-0.5f)); g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_pDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE); g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pDevice->SetRenderState(D3DRS_ALPHAREF, 0); g_pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); g_pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); g_pDevice->SetRenderState(D3DRS_STENCILREF, 0x00); g_pDevice->SetRenderState(D3DRS_STENCILMASK, 0xFF); g_pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFF); g_pDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCR); g_pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); g_pDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); return true; } void ShadowProjectorMesh::EndShadow(IDirect3DDevice9* dev) { if (!dev || !g_pDevice) return; g_pDevice->SetTexture(0, nullptr); g_pDevice->SetTexture(1, nullptr); // Restaura todos os render states salvos g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, s_sAlphaBlend); g_pDevice->SetRenderState(D3DRS_SRCBLEND, s_sSrcBlend); g_pDevice->SetRenderState(D3DRS_DESTBLEND, s_sDestBlend); g_pDevice->SetRenderState(D3DRS_ALPHAREF, s_sAlphaRef); g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, s_sAlphaFunc); g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, s_sAlphaTest); g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, s_sZWrite); g_pDevice->SetRenderState(D3DRS_ZENABLE, s_sZEnable); g_pDevice->SetRenderState(D3DRS_ZFUNC, s_sZFunc); g_pDevice->SetRenderState(D3DRS_DEPTHBIAS, s_sDepthBias); g_pDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, s_sSlopeBias); g_pDevice->SetRenderState(D3DRS_LIGHTING, s_sLighting); g_pDevice->SetRenderState(D3DRS_FOGENABLE, s_sFogEnable); g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, s_sFogVertex); g_pDevice->SetRenderState(D3DRS_CULLMODE, s_sCull); g_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, s_sTexFactor); g_pDevice->SetRenderState(D3DRS_COLORVERTEX, s_sColorVertex); g_pDevice->SetRenderState(D3DRS_STENCILENABLE, s_sStencilEnable); g_pDevice->SetRenderState(D3DRS_STENCILFUNC, s_sStencilFunc); g_pDevice->SetRenderState(D3DRS_STENCILREF, s_sStencilRef); g_pDevice->SetRenderState(D3DRS_STENCILMASK, s_sStencilMask); g_pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, s_sStencilWriteMask); g_pDevice->SetRenderState(D3DRS_STENCILPASS, s_sStencilPass); g_pDevice->SetRenderState(D3DRS_STENCILFAIL, s_sStencilFail); g_pDevice->SetRenderState(D3DRS_STENCILZFAIL, s_sStencilZFail); g_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, s_sTs0ColorOp); g_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, s_sTs0ColorArg1); g_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, s_sTs0ColorArg2); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, s_sTs0AlphaOp); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, s_sTs0AlphaArg1); g_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, s_sTs0AlphaArg2); g_pDevice->SetTextureStageState(1, D3DTSS_COLOROP, s_sTs1ColorOp); g_pDevice->SetTextureStageState(1, D3DTSS_COLORARG1, s_sTs1ColorArg1); g_pDevice->SetTextureStageState(1, D3DTSS_COLORARG2, s_sTs1ColorArg2); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, s_sTs1AlphaOp); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAARG1, s_sTs1AlphaArg1); g_pDevice->SetTextureStageState(1, D3DTSS_ALPHAARG2, s_sTs1AlphaArg2); // Invalida cache para forcar rebind g_pDevice->m_pTexture[0] = nullptr; g_pDevice->m_pTexture[1] = nullptr; } ``` --- ## 3. Membros adicionados ao TMHuman.h Na classe `TMHuman`, os seguintes membros sao necessarios: ```cpp // TMHuman.h (dentro da classe TMHuman) int m_bShadowPass; // Flag: 1 durante render de sombra, 0 normal D3DXMATRIX m_matShadow; // Matriz de projecao da sombra no chao void QueueProjectedShadow(); void RenderProjectedShadowPass(); static void ClearProjectedShadowQueue(); static void FlushProjectedShadowQueue(); ``` Inicializado no construtor: ```cpp // TMHuman::TMHuman(TMScene* pParentScene) m_bShadowPass = 0; ``` --- ## 4. Codigo em TMHuman.cpp ### 4.1 Fila de sombras ```cpp // TMHuman.cpp — topo do arquivo #include "ShadowProjectorMesh.h" #include <vector> static std::vector<TMHuman*>& ProjectedShadowQueue() { static std::vector<TMHuman*> queue; return queue; } ``` ### 4.2 Queue / Clear / Flush ```cpp void TMHuman::QueueProjectedShadow() { auto& queue = ProjectedShadowQueue(); queue.push_back(this); } void TMHuman::ClearProjectedShadowQueue() { ProjectedShadowQueue().clear(); } void TMHuman::FlushProjectedShadowQueue() { auto& queue = ProjectedShadowQueue(); if (queue.empty()) return; // Um unico Begin/End por frame para humanos if (!ShadowProjectorMesh::BeginShadow(g_pDevice->m_pd3dDevice, 0.47f)) { queue.clear(); return; } for (TMHuman* pHuman : queue) { if (!pHuman || pHuman->m_cDeleted || pHuman->m_dwDelayDel || !pHuman->m_bVisible) continue; pHuman->RenderProjectedShadowPass(); } ShadowProjectorMesh::EndShadow(g_pDevice->m_pd3dDevice); queue.clear(); } ``` ### 4.3 RenderProjectedShadowPass (TMHuman) ```cpp void TMHuman::RenderProjectedShadowPass() { if (!g_pCurrentScene) return; bool isPlayerHuman = (g_pCurrentScene && g_pCurrentScene->m_pMyHuman == this); bool hideProjectedShadow = isPlayerHuman ? (g_bHidePlayerShadow != 0) : (g_bHideObjectShadow != 0); if (hideProjectedShadow || m_cHide || m_cShadow == 1) { return; } float groundY = g_pCurrentScene->GroundGetHeight( TMVector2(m_pSkinMesh->m_vPosition.x, m_pSkinMesh->m_vPosition.z)); // Sem montaria if (m_cMount <= 0) { if (!m_pSkinMesh || !m_pSkinMesh->m_pRoot) return; ShadowProjectorMesh::SetupShadowMatrix(this, groundY); m_bShadowPass = 1; m_pSkinMesh->m_pRoot->Render(); if (m_cMantua > 0 && m_pMantua) { TMHuman* prevOwner = m_pMantua->m_pOwner; m_pMantua->m_pOwner = this; m_pMantua->m_BaseMatrix = m_pSkinMesh->m_OutMatrix; m_pMantua->Render(0.0f, 1.0f, 0.0f); m_pMantua->m_pOwner = prevOwner; } m_bShadowPass = 0; return; } // Com montaria if (!m_pMount || !m_pMount->m_pRoot || !m_pSkinMesh || !m_pSkinMesh->m_pRoot) return; ShadowProjectorMesh::SetupShadowMatrix(this, groundY); m_bShadowPass = 1; m_pMount->m_pRoot->Render(); m_pSkinMesh->m_pRoot->Render(); if (m_cMantua > 0 && m_pMantua) { TMHuman* prevOwner = m_pMantua->m_pOwner; m_pMantua->m_pOwner = this; m_pMantua->m_BaseMatrix = m_pSkinMesh->m_OutMatrix; m_pMantua->Render(0.0f, 1.0f, 0.0f); m_pMantua->m_pOwner = prevOwner; } m_bShadowPass = 0; } ``` ### 4.4 Enfileiramento no Render() do TMHuman Dentro de `TMHuman::Render()`, apos preparar o mesh e antes de renderizar efeitos: ```cpp // Condicao para enfileirar a sombra projetada (dentro de TMHuman::Render) bool isPlayerHuman = (g_pCurrentScene && g_pCurrentScene->m_pMyHuman == this); bool hideProjectedShadow = isPlayerHuman ? (g_bHidePlayerShadow != 0) : (g_bHideObjectShadow != 0); bool canRenderProjectedShadow = (!hideProjectedShadow && !m_cHide && m_cShadow == 0); // Desativa sombra circular antiga if (m_pShade) m_pShade->m_bShow = 0; // Sem montaria: if (canRenderProjectedShadow && m_pSkinMesh->m_pRoot) QueueProjectedShadow(); // Com montaria: if (canRenderProjectedShadow && m_pMount->m_pRoot) QueueProjectedShadow(); ``` --- ## 5. Codigo em TMObject.cpp ### 5.1 Fila de sombras ```cpp // TMObject.cpp — topo do arquivo #include "ShadowProjectorMesh.h" #include <vector> static std::vector<TMObject*>& ProjectedObjectShadowQueue() { static std::vector<TMObject*> queue; return queue; } ``` ### 5.2 Declaracoes em TMObject.h ```cpp // TMObject.h (dentro da classe TMObject) void QueueProjectedShadow(); void RenderProjectedShadowPass(); static void ClearProjectedShadowQueue(); static void FlushProjectedShadowQueue(); ``` ### 5.3 Queue / Clear / Flush (TMObject) ```cpp void TMObject::QueueProjectedShadow() { ProjectedObjectShadowQueue().push_back(this); } void TMObject::ClearProjectedShadowQueue() { ProjectedObjectShadowQueue().clear(); } void TMObject::FlushProjectedShadowQueue() { auto& queue = ProjectedObjectShadowQueue(); // Modo otimizado: limpa fila sem processar sombras if (g_bModoOtimizado || g_bHideObjectShadow) { queue.clear(); return; } if (queue.empty()) return; // Um unico BeginShadow para todos os objetos if (!ShadowProjectorMesh::BeginShadow(g_pDevice->m_pd3dDevice, 0.47f)) { queue.clear(); return; } for (TMObject* pObj : queue) { if (!pObj || pObj->m_cDeleted || !pObj->m_bVisible) continue; pObj->RenderProjectedShadowPass(); } ShadowProjectorMesh::EndShadow(g_pDevice->m_pd3dDevice); queue.clear(); } ``` ### 5.4 RenderProjectedShadowPass (TMObject) ```cpp void TMObject::RenderProjectedShadowPass() { if (!g_pCurrentScene || g_pCurrentScene->m_eSceneType != ESCENE_TYPE::ESCENE_FIELD || g_bHideObjectShadow) return; TMMesh* pMesh = g_pMeshManager->GetCommonMesh(m_dwObjType, 0, 3_min); if (!pMesh) return; float groundY = g_pCurrentScene->GroundGetHeight(m_vecPosition); if (groundY <= -9000.0f) groundY = m_fHeight; D3DXVECTOR3 L = ShadowProjectorMesh::s_vLightDir; D3DXVec3Normalize(&L, &L); if (L.y > -0.01f) L.y = -0.01f; D3DXMATRIX mat{}, matPosition{}, matScale{}; D3DXMatrixScaling(&matScale, pMesh->m_fScaleH, pMesh->m_fScaleV, pMesh->m_fScaleH); D3DXMatrixTranslation(&matPosition, m_vecPosition.x, m_fHeight, m_vecPosition.y); D3DXMatrixRotationYawPitchRoll(&mat, m_fAngle, -D3DXToRadian(90), 0.0f); D3DXMatrixMultiply(&mat, &g_pDevice->m_matWorld, &mat); D3DXMatrixMultiply(&mat, &mat, &matScale); D3DXMatrixMultiply(&mat, &mat, &matPosition); D3DXMATRIX matProjected; D3DXPLANE plane(0.0f, 1.0f, 0.0f, -(groundY + 0.005f)); D3DXVECTOR4 lightDir(-L.x, -L.y, -L.z, 0.0f); // w=0 = luz direcional D3DXMATRIX matShadow{}; D3DXMatrixShadow(&matShadow, &lightDir, &plane); D3DXMatrixMultiply(&matProjected, &mat, &matShadow); // Begin/End e feito pelo FlushProjectedShadowQueue — apenas faz o draw aqui g_pDevice->m_pd3dDevice->SetTransform(D3DTS_WORLDMATRIX(0), &matProjected); pMesh->RenderDrawShadow(); } ``` --- ## 6. Pipeline de Renderizacao — ObjectManager.cpp ```cpp // ObjectManager::RenderObject() void ObjectManager::RenderObject() { if (g_pCurrentScene != nullptr) { // 1. Limpa filas e stencil buffer TMHuman::ClearProjectedShadowQueue(); TMObject::ClearProjectedShadowQueue(); if (g_pDevice && g_pDevice->m_pd3dDevice) g_pDevice->m_pd3dDevice->Clear(0, nullptr, D3DCLEAR_STENCIL, 0, 1.0f, 0); // 2. Renderiza cena principal (cada Render() enfileira sombras via QueueProjectedShadow) // ... (tree traversal renderizando todos os nodos exceto containers de efeito/extra) // 3. Flush das sombras projetadas (renderiza todas de uma vez) TMHuman::FlushProjectedShadowQueue(); TMObject::FlushProjectedShadowQueue(); if (g_pDevice) g_pDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); // 4. Renderiza Danos e Efeitos por ultimo (sobre as sombras) // ... (containers de efeito e extras) } } ``` --- ## 7. Registro no Projeto Visual Studio ### TMProject.vcxproj ```xml <ClInclude Include="ShadowProjectorMesh.h" /> <ClCompile Include="ShadowProjectorMesh.cpp" /> ``` ### TMProject.vcxproj.filters ```xml <ClInclude Include="ShadowProjectorMesh.h"> <Filter>Header Files\Effects</Filter> </ClInclude> <ClCompile Include="ShadowProjectorMesh.cpp"> <Filter>Source Files\Effects</Filter> </ClCompile> ``` --- ## 8. Dependencias / Includes | Arquivo | Includes necessarios | |---|---| | `ShadowProjectorMesh.h` | `<d3d9.h>`, `<d3dx9.h>` | | `ShadowProjectorMesh.cpp` | `"pch.h"`, `"ShadowProjectorMesh.h"`, `"TMHuman.h"`, `"TMGlobal.h"`, `"RenderDevice.h"` | | `TMHuman.cpp` | `"ShadowProjectorMesh.h"`, `<vector>` | | `TMObject.cpp` | `"ShadowProjectorMesh.h"`, `"OptimizationConfig.h"`, `<vector>` | --- ## 9. Variaveis Globais Utilizadas | Variavel | Tipo | Descricao | |---|---|---| | `g_pDevice` | `RenderDevice*` | Device wrapper com cache de estados | | `g_pCurrentScene` | `TMScene*` | Cena ativa (acessa `GroundGetHeight`, `m_pMyHuman`) | | `g_bModoOtimizado` | `bool` | Modo otimizado — pula sombras de objetos | | `g_bHideObjectShadow` | `DWORD/bool` | Esconde sombras de mobs/objetos | | `g_bHidePlayerShadow` | `DWORD/bool` | Esconde sombra do jogador | | `g_pMeshManager` | `MeshManager*` | Gerenciador de meshes estáticos | --- ## 10. Fluxo de Execucao Resumido ``` ObjectManager::RenderObject() | +-- TMHuman::ClearProjectedShadowQueue() +-- TMObject::ClearProjectedShadowQueue() +-- Clear(STENCIL) | +-- [Render cena] --> cada TMHuman::Render() chama QueueProjectedShadow() | --> cada TMObject::Render() chama QueueProjectedShadow() | +-- TMHuman::FlushProjectedShadowQueue() | +-- BeginShadow(alpha=0.47) // configura estados + stencil | +-- loop: RenderProjectedShadowPass() | | +-- SetupShadowMatrix() // calcula m_matShadow | | +-- m_bShadowPass = 1 | | +-- m_pSkinMesh->Render() // mesh usa m_matShadow quando m_bShadowPass=1 | | +-- m_bShadowPass = 0 | +-- EndShadow() // restaura todos os estados | +-- TMObject::FlushProjectedShadowQueue() | +-- BeginShadow(alpha=0.47) | +-- loop: RenderProjectedShadowPass() | | +-- D3DXMatrixShadow() // calcula matriz inline | | +-- SetTransform + RenderDrawShadow() | +-- EndShadow() | +-- SetRenderState(STENCILENABLE, FALSE) +-- [Render efeitos/danos] ``` --- ## 11. Parametros de Ajuste (Tuning) Definidos como `static` no topo de `ShadowProjectorMesh.cpp`: | Variavel | Valor Padrao | Descricao | |---|---|---| | `g_ShadowLightDir` | `(1.20, -0.70, 0.60)` | Direcao da luz (rotacao da sombra) | | `g_ShadowPlaneBias` | `0.005f` | Bias do plano (evita z-fighting) | | `g_ShadowDirOffset` | `2.80f` | Offset direcional (nao utilizado ativamente) | | `g_ShadowAlphaMax` | `120` | Alpha maximo da sombra (0-255) | | `g_ShadowLockAtFeet` | `false` | `true` = sombra direto embaixo; `false` = projecao lateral |- 3 respostas
-
- 48
-
-
-
[Proteção] Bloqueio de alteração de MAC e proxy injetado no WYD
Dothraki- postou um tópico no fórum em WYD - Desenvolvimento
Recentemente comecei a ter problema no meu servidor com um aplicativo que alterava o MAC utilizado pelo cliente e também redirecionava a conexão através de proxy. Isso estava permitindo que alguns jogadores abusassem de determinadas mecânicas e acabassem prejudicando o servidor. Estudando um pouco, percebi que dava para criar uma proteção relativamente simples. Sem entrar em engenharia reversa, estudando algumas funções nativas do Windows, consegui identificar a alteração e bloquear o login antes da conexão com o servidor. Esse tipo de conhecimento pode ajudar outros projetos e também incentivar melhorias nas proteções do WYD, resolvi disponibilizar o código e o passo a passo do funcionamento. No repositório deixei a implementação, explicação da proteção, exemplos de integração, testes e o comportamento do bloqueio. GitHub: [Hidden Content] A proteção atual é focada nessas alterações de IAT, mas também deixei algumas ideias para evolução, como detecção mais genérica de módulos injetados, revalidação depois do login e integração com o TMSrv. Extra: No seu bloqueador de VPN/PROXY bloqueie também IP's marcados como datacenter/hosting. Quem quiser testar em outras sources, sugerir melhorias ou contribuir com código, as contribuições são bem-vindas.- 2 respostas
-
- 43
-
-
Novidade no WYD Mais uma montaria e Mapas novos
hamiltoncw postou um tópico no fórum em WYD - Bate Papo
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ -
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️
-
- 5
-
-
- novos mapas
- edição
-
(e 2 mais)
Tags:
-
Systema de Montarias Sistema de Montarias para WYD
hamiltoncw postou um tópico no fórum em WYD - Bate Papo
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ -
Montarias Mais uma Apresentação das Novas Montarias
hamiltoncw postou um tópico no fórum em WYD - Bate Papo
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ -
Sistema de Baús Melhoria no Sistema de Baús de Drop
hamiltoncw postou um tópico no fórum em WYD - Bate Papo
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️- 2 respostas
-
- 3
-
-
-
- drop
- novos sistemas
-
(e 1 mais)
Tags:
-
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️
-
Desenvolvimento do Novo Chat do WYD com Linkagem de item + emoji por Yokoshen
YokoShen postou um tópico no fórum em WYD - MarketPlace
Proposta de Melhoria no Sistema de Chat do WYD Venho por meio deste apresentar uma iniciativa de aprimoramento no sistema de chat do jogo WYD (With Your Destiny), com o objetivo de modernizar a comunicação entre os jogadores e proporcionar uma experiência mais dinâmica, organizada e funcional. A principal inovação consiste na criação de um novo sistema de chat que permite a vinculação direta de itens às mensagens enviadas. Com essa funcionalidade, o jogador pode “linkar” um item no chat, possibilitando que outros usuários visualizem suas informações de forma rápida e prática. Essa melhoria facilita significativamente negociações, trocas, avaliações de equipamentos e discussões estratégicas sobre builds e atributos, tornando a interação mais eficiente e intuitiva. Além disso, o novo sistema implementa suporte a emojis, ampliando as possibilidades de expressão dentro do ambiente do jogo. Essa funcionalidade contribui para uma comunicação mais clara, descontraída e alinhada aos padrões modernos de interação digital, aproximando a experiência do jogador às plataformas contemporâneas de mensagem. O projeto ainda se encontra em fase de desenvolvimento, com ajustes e otimizações em andamento para garantir estabilidade, desempenho e integração adequada com os demais sistemas do jogo. A proposta é entregar uma solução robusta, organizada e escalável, que possa futuramente receber novas funcionalidades. Essa melhoria representa um avanço significativo na usabilidade e na qualidade da comunicação dentro do WYD, reforçando o compromisso com a evolução contínua do sistema e com a melhor experiência possível para a comunidade de jogadores. Discord- 8 respostas
-
- 43
-
-
Novas Montarias Novas Montarias no WYD ( Dragon Skateboard )
hamiltoncw postou um tópico no fórum em WYD - Bate Papo
MEUS CANAIS DE VÍDEOS HC CURSOS E TUTORIAIS 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️ VEICARECA GAMES 🎬 ▶️ PLAYLIST DO MEU CANAL NO YOUTUBE 🎬 ▶️- 3 respostas
-
- 5
-
-
- novidade
- Só Sucesso
-
(e 1 mais)
Tags:
-
🔥 [VENDA] Servidor WYD 7.59 – COMPLETO 🔥
danielcordoba postou um tópico no fórum em WYD - MarketPlace
🎯 SOBRE O SERVIDOR Pacote completo da versão 7.59, ideal para quem busca um projeto estável, moderno e totalmente funcional. Sistemas atualizados, desempenho otimizado e inúmeras funções prontas para uso. 📌 SISTEMAS PRINCIPAIS 🔄 Sistema RECONNECT 📝 Sistema de Missão 👹 Sistema de Boss 👤 Info Player 🎟️ Passe de Batalha 💧 Macro para Pergaminhos de Água 🐴 Painel de Skins de Montarias 🐣 Sistema de Novato (Painel de Introdução) ⚒️ Composição fora da MixList 🎣 Sistema de Pescaria 🗡️ Evento de Hit 🌍 Evento Teleporte (igual global) 🛒 Loja Donate 🟦 Lojas de Moedas Especiais ⚔️ Duelos com Apostas 🛡️ Anti-Bot LAN 🐾 Pets Novos + Suporte para Adicionar Mais 👗 TODOS os trajes do Global ⚔️ SISTEMAS DE GUERRA 🔥 GUERRA DE TORRE 1 🔥 GUERRA DE TORRE 2 🔥GUERRA DE GUILD 🔥GUILD ZONE WAR 🔥RvR - REINOS VS REINOS 🔥BATALHA REAL / ARENA REAL 🔥COLISEU 🛠️ SISTEMAS DE ADMINISTRAÇÃO 🛡️ SEGURANÇA E PROTEÇÃO 🛡️ Anti-Cheat Avançado 🔐 Proteção de Arquivos do Cliente ❌ Auto-Fechamento ao Detectar Hack 🔨 Banimentos 📞 INTERESSADOS CHAMAR NO DISCORD → noiteadentro Servidor foi comprado a algum tempo porem nunca foi aberto por mim, tem servidores online com essa mesma base. Tem muito mais sistemas a base que não esta escrito aqui! Sistema totalmente fora do mysql!- 11 respostas
-
- 83
-
-
-
-
- wyd
- Venda de servidor de wyd
- (e 2 mais)
-
🛡️ Nordic War Legends - Desperte o Guerreiro em Você! 🛡️ Embarque em uma jornada épica no nosso servidor Nordic War Legends, inspirado no clássico WYD versão 7.56 ! Experimente batalhas intensas de torre de segunda a sexta-feira, e domine a feroz guerra de cidade e Noatun às 20h e 21h todo domingo. ✨ Recursos Exclusivos: 🎁 Utilize o comando /presente para receber itens especiais e impulsionar sua jornada desde o início! 🌟 Explore um mundo com drop de itens médio, experiência médio/hard e desafios de composições hard, proporcionando uma experiência envolvente e desafiadora. 🏹 Descubra um ambiente autêntico e imersivo, sem trajes extravagantes ou firulas – mergulhe em uma atmosfera totalmente nórdica e medieval! 🤺 Classes Balanceadas: Escolha entre classes estrategicamente equilibradas para uma experiência de jogo justa e emocionante. 🕰️ Disponibilidade 24/7: Nosso servidor está online 24 horas por dia, 7 dias por semana, para que você possa se aventurar a qualquer momento. 🔥 Double XP nos Finais de Semana: Acelere sua evolução com double XP ativo todos os finais de semana. Prepare-se para alcançar novos patamares de poder! 🌐 Junte-se à Comunidade: Faça parte de uma comunidade vibrante de jogadores apaixonados. Compartilhe estratégias, forme alianças e desafie-se em Nordic War Legends! 🌐 Visite nosso site: www.nordicwarlegends.com.br 🔗 Discord: [Hidden Content] 📱 WhatsApp: [Hidden Content] 📆 Atenção: O download estará disponível apenas no dia de lançamento, em 18/12/2023. Prepare-se para a grande jornada que o Nordic War Legends reserva para você! 🚀 Não perca mais tempo! Seja parte desta jornada extraordinária. Faça o download dia 18 e prepare-se para viver a saga nórdica definitiva. Nordic War Legends - onde a coragem encontra a lenda! ⚔️ Scan(WYD.exe)
-
Ta esperando oque para abrir seu próprio servidor ? a sua oportunidade chegou! Contato WhatsApp: [Hidden Content] Contato via discord: yokoshen_lord Mais informações do sv acesse: [Hidden Content]
- 2 respostas
-
- 22
-
-
-
Draw Your Destiny Versão: 7.56 Nível de Experiência (EXP): Médio / Hard Taxa de Drop: Médio Conexão: 24/7 Taxas de Compositores: 40% Horários das Guerras: Guerra de Noatun: Domingo às 21h Guerra de Torres: Segunda a sexta, às 21h Guerra de Cidades: Domingo às 20h Comandos acrescentados além dos nativos da versão: /senha XXXX - Para definir a senha do grupo /entrar nick senha - Para entrar no grupo /armia - Voltando para cidade de armia e cobrando 2kk por uso do comando. /shop - Levando o char para lojas de donates /saldo - para saber o saldo de donates /novato - Entregando itens imóveis para ajudar no inicio do servidor Nosso servidor estará online 24 horas por dia, 7 dias por semana, para que você possa se aventurar a qualquer momento. 🔥 Dupla XP nos Finais de Semana: Aproveite o dobro de experiência nos finais de semana para acelerar sua jornada e enfrentar os desafios com ainda mais confiança! Sistemas BARRAS MITRIL 100% TODAS AS FADAS FUNCIONANDO PERFEITAMENTE TRAJES DA VERSÃOS ESTARÁ DISPONIVEL MESTRE GRIFO FUNCIONANDO 100% IGUAL O ORIGINAL PISTAS DE RUNAS 100% LAN N/M/A - PARA FARMA GOLD ENTREGANDO MOEDAS PARA COMPRA A CADA 5 MIN COM LOJINHA ABERTA PORÇÃO REVIGORANTE TRANSFORMANDO SUA MONTARIA IMORTAL E MUITO MAIS Prepare-se para uma aventura épica na versão 7.56 de WYD e torne-se um verdadeiro herói neste mundo medieval!
- 10 respostas
-
- 1
-
-
- WYD
- servidorbr
- (e 5 mais)
-
~ W Y D C O S M O S ~ • SERVIDOR ONLINE • LANÇOOOU - Discord: Clique Aqui Visite agora mesmo nosso site: www.wydcosmos.com.br Primeiras impressões do primeiro dia de testes(13/04/2025): "Então, o que posso dizer no geral? Parece bom e moderno, pode ser confuso no começo por causa de diferentes locais dos novos NPCs, mas as pessoas vão se acostumar. A jogabilidade é fluida, sem lag. Vejo todas as suas ideias no jogo mesmo sem elas presentes. Vai ser ótimo, só não exagere nos NPCs, pois pessoas preguiçosas (leia-se 90% dos jogadores de WYD) ficarão decepcionadas. Dá uma sensação boa quando você entra no servidor, Dá para sentir que o coração foi colocado para fazê-lo, e não é um servidor voltado para ganhar dinheiro. Não posso dizer mais nada no momento, não joguei por muito tempo e não posso dizer nada sobre experiência, itens ou balanceamento de classes. No geral, um bom trabalho para esta fase do que é (visual e posicionamento). Dou uma nota honesta de 9/10. " Junto com você, pretendemos expandir esse Multiverso para novas sagas e histórias e versões. WYD COSMOS © Todos os Direitos Reservados. "Palco onde heróis vivem epopeias."
-
Site do Servidor; [Hidden Content] Instagram Oficial; [Hidden Content] JA ESTA LIBERADO O BETA SEASON DO WYD WAR VENHA JA COM SEUS AMIGOS E SUA GUILD Facebook Oficial; [Hidden Content] TikTok Oficial; [Hidden Content] Discord; [Hidden Content] Email de contato; [email protected] Grupo Whatsapp; [Hidden Content] Youtube do game [Hidden Content]
- 1 resposta
-
- 22
-
-
Encerrado WYD HISTORY 03/01/26 18:00
YokoShen postou um tópico no fórum em Servidores em Versão Beta-Teste / Projetos
📍LANÇAMENTO DIA 03/01/26 - 18:00H 🗡VOLTANDO AOS VELHOS TEMPOS🗡 🟢BONIFICAÇÕES PARA QUEM TROUXER GUILDA 📍SERVIDOR MEDIO/MEDIO 📍Links Site/Grupo/Discord: -> HISTORY LINKS <- BEST QUALITY SERVER 8.89✅|| GUERRAS ⚔️|| REINOS⚜️ 🔥 TRAGA SUA GUILDA PARA O MELHOR SV# 🎪 Sistema de Loja fantasma 📜 Sistema de Player Info 📜 Sistema de Traja de Montaria 📜 Sistema de Raridade na Montaria 🏹 Sistema de Coliseu 🏹 Sistema de Arena Real Times 🏹 Sistema de RvR refeito 🔍 Sistema de Droplist in game 🎲 Sistema de Conjunto de Item 🎲 Sistema de Skins 🎲 Sistema de Balanceio 🎲 Sistema de AutoMessagem 👑 Otimização do Jogo 👑 Sistema de PvP Balanceado 👑 Diversos outros sistemas de Qualidade ⚜️ Suporte ao jogador excelente ⚜️ Jogabilidade Incrível e única ⚜️ Drop de GOLD Convite Lan entre outras formas ⚜️ Macro Agua & 60 Salas Exclusivas de Agua ⚜️ AntHack & AntDDoS ⚜️ Estabilidade e Otimização do Jogo ⚜️ Eventos dinâmicos ⚜️ Equipe reconhecida por ótimo trabalho de desenvolvimento do jogo na comunidade By: Yokoshen ✅Administrador de Boa procedência ✅Analise de virus(scan) - wyd.exe: hhttps://www.virustotal.com/gui/file/77e58423fde16073a410b22a9b921bb5a85e5b6b3e92de661cee4f33faa1834f?nocache=1- 2 respostas
-
- 19
-
-
Encerrado AOK Lançamento 29/05 - 18:30 - Sistema de Chat Novo
YokoShen postou um tópico no fórum em Servidores Offline
📍LANÇAMENTO DIA 29/05/26 - 18:30H 📍BETA DIA 24/04/26 - 18:30H 🗡VOLTANDO AOS VELHOS TEMPOS🗡 🟢BONIFICAÇÕES PARA QUEM TROUXER GUILDA 📍Links Site/Grupo/Discord: [Hidden Content] [Hidden Content] [Hidden Content] BEST QUALITY SERVER 10.9✅|| GUERRAS ⚔️|| REINOS⚜️ 🔥 TRAGA SUA GUILDA PARA O MELHOR SV# 📜 Sistema de Anuncio de equips e emoji no chat 🎪 Sistema de Loja fantasma 📜 Sistema de Player Info 📜 Sistema de Traja de Montaria 📜 Sistema de Raridade na Montaria 🏹 Sistema de Coliseu 🏹 Sistema de Arena Real Times 🏹 Sistema de RvR refeito 🔍 Sistema de Droplist in game 🎲 Sistema de Conjunto de Item 🎲 Sistema de Skins 🎲 Sistema de Balanceio 🎲 Sistema de AutoMessagem 👑 Otimização do Jogo 👑 Sistema de PvP Balanceado 👑 Diversos outros sistemas de Qualidade ⚜️ Suporte ao jogador excelente ⚜️ Jogabilidade Incrível e única ⚜️ Drop de GOLD Convite Lan entre outras formas ⚜️ Macro Agua & 60 Salas Exclusivas de Agua ⚜️ AntHack & AntDDoS ⚜️ Estabilidade e Otimização do Jogo ⚜️ Eventos dinâmicos ⚜️ Equipe reconhecida por ótimo trabalho de desenvolvimento do jogo na comunidade By: Yokoshen ✅Administrador de Boa procedência ✅Analise de virus(scan) - wyd.exe: [Hidden Content] Apresentação- 1 resposta
-
- 43
-
-
resolvido WYD - Heroes of Asgard - Beta teste até dia 30/06 - Lançamento dia 03/07
-Ink- postou um tópico no fórum em Servidores em Versão Beta-Teste / Projetos
⚔️ HEROES OF ASGARD EASY - O PRÓXIMO CAPÍTULO COMEÇA EM BREVE! ⚔️ 💰 O servidor Heroes já entregou mais de *R$ 16.800,00* em premiações para as guildas vencedoras ao longo de suas temporadas. 🏆 Sua guilda estará entre as próximas campeãs? 📅 *Lançamento Oficial* 03/07 às 20h00 Reúna seus amigos, fortaleça sua guilda e prepare-se para disputar guerras, arenas e eventos que premiam os melhores jogadores do servidor. 🔥 BETA PREMIADO EM ANDAMENTO 🔥 O Beta permanecerá online até *30/06*, valendo recompensas exclusivas para os jogadores mais dedicados. 🏅 Os 10 primeiros colocados do Ranking de Evolução receberão: 🎁 1 Pacote Especial Exclusivo no lançamento oficial. ⚔️ TORNEIO PvP DOS CAMPEÕES ⚔️ Ao final do Beta, os 4 primeiros colocados do Ranking de Evolução disputarão um torneio PvP especial. Premiação: 🥇 1º Lugar — 1.000 Cash 🥈 2º Lugar — 500 Cash 🥉 3º Lugar — 250 Cash As recompensas serão entregues no lançamento oficial do servidor. ━━━━━━━━━━━━━━━━━━ 📢 ESTAMOS CONTRATANDO Procuramos: * Divulgadores * Criadores de Conteúdo * Streamers * Parceiros para a comunidade Entre em contato com nossa equipe para mais informações. ━━━━━━━━━━━━━━━━━━ 🌐 Site Oficial: www.heroesofasgard.com 📱 Grupo Oficial WhatsApp: [Hidden Content] 🌐Scan do .exe: [Hidden Content] 1/71 - Falso Positivo ━━━━━━━━━━━━━━━━━━ ⚔️ Heroes of Asgard Easy 📅 Lançamento: 03/07 às 20h00 Sua história será escrita no campo de batalha. Sua guilda conquistará a glória?- 1 resposta
-
- 9
-
-
- beta
- BETA TESTE
-
(e 1 mais)
Tags:
-
release [Release/Source] WYD FULL PVP 7662
Arkanun1000 postou um tópico no fórum em WYD - Desenvolvimento
WYD FULL PVP 7662 E ai pessoal, eu tava meio a toa aqui e lembrei dessa release/source e resolvi dar uma editadinha pra ficar full PVP. Ela ja estava bem editava com os NPCs com os itens e tudo mais, mas faltava uns outros itens. O Cliente usado é o WReborn Updates: Destravar cele 40 = 100% de sucesso Destravar cele 90 = 100% de sucesso Poeira de fada = 100% de sucesso Comandos: /armia = Teleporte pra cidade de Armia /erion = Teleporte pra cidade de Erion /azran = Teleporte pra cidade de Azran /gelo = Teleporte pra cidade do Gelo /kefra = Teleporte pra cidade de Kefra /red = Teleporte pro Rei Red (Vermelho) /blue = Teleporte pro Rei Blue (Azul) /arch = Teleporte pra destravar levels 355/370 do Arch /destravar40 = Destrava o level 40 do celestial /combate = Teleporte pra enfrentar Mobs poderosos Na area de combate coloquei o Kefra e outros mobs la editados pra testar a força do seu personagem criado (não está 100%, mas da pra brincar ) DOWNLOAD [Hidden Content] DBSrv.exe [Hidden Content] TMSrv.exe [Hidden Content] Wyd.exe [Hidden Content] Creditos: WRebron por conta do cliente, a source/release eu acho que tbm sao eles que editaram a parte principal. Quem souber que foi o primeiro dono dessa release/source é so falar que edito aqui. vlw!- 75 respostas
-
- 330
-
-
-
-
-
WYD - A Teoria sobre tempo para anct/refinação+10
-Ink- postou um tópico no fórum em WYD - Bate Papo
Neste vídeo criado pelo Venti, jogador do WYD Lost, ele trás na prática sobre as teorias do tempo de anct / refinação+10 Resumo do vídeo realizado pelo Gemini: O vídeo investiga o famoso mito do "tempo do anciente" em jogos MMORPG, uma crença popular de que existiriam horários específicos ou "macetes" que aumentariam as chances de sucesso no refinamento de itens (0:00 - 0:46). Pontos principais abordados: • A origem dos mitos: O autor explica que essas teorias nascem da necessidade humana de encontrar explicações para o azar ou a aleatoriedade. Quando um jogador falha repetidamente, ele busca um culpado externo, e teorias compartilhadas pela comunidade se tornam "conhecimento ancestral" (0:51 - 2:06). • Testes práticos: O criador tenta reproduzir teorias de tempo de servidor, mas não encontra evidências consistentes, ressaltando o comportamento errático dos resultados (2:11 - 4:10). • Explicação oficial: Em entrevista, o GM Allan esclarece que, embora sistemas de randomização antigos pudessem ter base no tempo do computador, isso nunca garantiu sucesso, e os sistemas modernos são puramente aleatórios, não baseados em tempo (4:14 - 5:27). • A ciência por trás da crença: O vídeo aborda conceitos psicológicos como o viés de confirmação (onde lembramos apenas do que deu certo) e a dificuldade do cérebro em aceitar a aleatoriedade real, que muitas vezes parece organizada, mas não é (5:36 - 8:22). • Lei dos Grandes Números: Através de um experimento com 200 adamantitas, o autor demonstra que, a longo prazo, os resultados tendem a se equilibrar conforme a probabilidade matemática real, provando que não há "atalhos" mágicos (8:27 - 11:04). Conclusão: O autor conclui que, embora o "tempo do anciente" não passe de um mito, essas lendas são fundamentais para a cultura dos MMORPGs. Elas transformam um simples processo matemático de clicar em um botão em algo com significado, histórias e pertencimento comunitário (11:07 - 12:51). -
Oficial 𝗪.𝗬.𝗗 𝗟𝗢𝗦𝗧 - Servidor Oficial | Hard com muitas mecânicas e diversão! Venha jogar!
Lost Server postou um tópico no fórum em WYD - Servidores Privados
𝗔𝗕𝗘𝗥𝗧𝗨𝗥𝗔 𝗢𝗙𝗜𝗖𝗜𝗔𝗟 HOJE(𝟭𝟮/𝟭𝟮) A jornada que você esperava finalmente começa. ⚔️ 𝗦𝗼𝗯𝗿𝗲 𝗱𝗼 𝗦𝗲𝗿𝘃𝗶𝗱𝗼𝗿 🔸 Versão: 7.97 (Exclusiva) 🔸 Experiência: Médio / Hard 🔸 Drop: Médio / Hard 🔸 Progressão pensada para desafio real 🔸 Quests Mortais: Do Lv. 40 até o 300 🔸 Sem monótoniedade 🔸 Diversas mecânicas 🔥 𝗦𝗜𝗦𝗧𝗘𝗠𝗔𝗦 𝗘𝗫𝗖𝗟𝗨𝗦𝗜𝗩𝗢𝗦 O servidor foi reconstruído do zero para entregar uma experiência única: 🔹 Zona Sangrenta (PvP de alto risco) 🔹 O Lado Esquecido 🔹 Vale Assombrado 🔹 Calabouços e Dungeons únicas 🔹 Sistema de Roleta 🔹 Passe de Batalha completo 🔹 VIP sem Pay2Win 🔹 EXP totalmente balanceada 🔹 Drop 100% refeito do zero 🔹 Melhorias visuais e mundo renovado 🔹 Desempenho otimizado para qualquer PC 🔹 Invasões a cada 1 hora 🔹 Mais de 10 bosses todos os dias 🔹 Guerra Nova 🔹 Guerra de Torre reformada 🔹 Mecânicas PvP renovadas 🔹 Economia estudada e estabilizada 🔹 Diversos caminhos de Farm 🔹 Diversas opções de Up E dezenas de outras mecânicas e sistemas inéditos! ♦️Aqui o objetivo é simples: 𝘁𝗲 𝗱𝗮𝗿 𝘂𝗺 𝘀𝗲𝗿𝘃𝗶𝗱𝗼𝗿 𝘃𝗶𝘃𝗼, 𝗳𝗹𝘂𝗶𝗱𝗼 𝗲 𝗰𝗼𝗺𝗽𝗲𝘁𝗶𝘁𝗶𝘃𝗼. 🏰 𝗖𝗢𝗠𝗨𝗡𝗜𝗗𝗔𝗗𝗘, 𝗚𝗨𝗜𝗟𝗗𝗔𝗦 𝗘 𝗟𝗢𝗡𝗚𝗔 𝗩𝗜𝗗𝗔 No Lost você não está entrando em “mais um servidor que vai fechar em 3 meses”. Somos uma equipe séria, experiente e totalmente dedicada ao projeto. 𝗧𝗿𝗮𝗯𝗮𝗹𝗵𝗮𝗺𝗼𝘀 𝗰𝗼𝗺: 🔸 Roadmap de +1 ano já definido 🔸 Atualizações contínuas 🔸 Transparência 🔸 Equipe dedicada 🔸 Suporte profissional ❤️🩹 Você fará parte de uma comunidade forte, unida e saudável, formada desde o beta e crescendo todos os dias. 📅 𝗔𝗕𝗘𝗥𝗧𝗨𝗥𝗔 𝗢𝗙𝗜𝗖𝗜𝗔𝗟 (12/12) ✅ Prepare sua guilda. ✅ Organize seu time. ✅ Venha e divirta-se com seus amigos. 🎉 O Lost abre as portas oficialmente dia 12 de dezembro — e você está convidado a escrever a história deste novo mundo 📷 𝗜𝗠𝗔𝗚𝗘𝗡𝗦 𝗗𝗢 𝗦𝗘𝗥𝗩𝗜𝗗𝗢𝗥 🔗 𝗘𝗡𝗧𝗥𝗘 𝗡𝗢𝗦 𝗖𝗔𝗡𝗔𝗜𝗦 𝗢𝗙𝗜𝗖𝗜𝗔𝗜𝗦 🌐 Site 💬 WhatsApp 🎮 Discord 📸 Instagram 📘 Facebook 🤖 Scan- 11 respostas
-
- 123
-
-
-
Criei este traje especial em comemoração à Copa e estou disponibilizando-o gratuitamente para toda a comunidade. O modelo é compatível com qualquer versão e inclui as duas camisas da Seleção Brasileira. Fiquem à vontade para utilizar, compartilhar e aproveitar o conteúdo. Se gostou do meu trabalho e tem interesse em outros projetos, serviços ou personalizações, deixarei meu contato ao final desta publicação. Segue abaixo uma preview do traje [Hidden Content]
- 6 respostas
-
- 29
-
-
-
-
IRREGULAR WYD Nostalgia - Mid-Hard Server - Classic GamePlay (OPENING 5/1/2026)
BeaTrixX postou um tópico no fórum em Servidores Offline
Server Mid-Hard Play-Win Server Classic Gameplay Hunt Based PT-BR and ENG CLIENT Opening 5/1/26 LINK REMOVIDO.
