Ir para conteúdo

Todas Atividades

Atualizada automaticamente

  1. Recentemente
  2. 🚀 PATCH DE ATUALIZAÇÃO — WAR OF DESTINY ✅ Ampliação e melhorias na área jogável ✅ Sistema de múltiplas instâncias ✅ Novo Modo Economia de recursos ✅ Otimização geral de até 80% ⚔️ Mais desempenho, estabilidade e liberdade para jogar diretamente pelo navegador!
  3. Hoje
  4. Hello Guys Download link: [Hidden Content] __________________ Selling combo high quality with guarantee➖ Selling: EMAIL: PASS USER: PASS MAILLIST AOL, YAHOO, HOTMAIL, OUTLOOK, FRANCE, UK, GERMANY, USA, ESPAIN, ITALY, CANADA, AUSTRALIA… To buy msg me TELEGRAM: @KOCsupport
  5. 🌑 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 |
  6. NEW BOTS!: @qoihfuoa_bot @hydralog_bot @octoberslog_bot @perimeterlog_bot
  7. De uma ou outra o Global compra ou deixa passar e fecha também.
  8. Traduzindo para a linguagem comum: A grana está curta, não temos como manter a equipe, vamos fechar o jogo em breve. Se o que tem é suficiente, manteremos o jogo ativo até quando der. Basicamente a Joy viu que não tem futuro e está direcionando a equipe para outros projetos. Se me lembro bem, o KR não recebe um update decente tem muito tempo. Ano passado eu tentei comprar os direitos da With2FC, deviam ter vendido =). Eu não vou ofertar novamente, fizeram pouco caso, agora podem afundar. --- Sobre o Global, o impacto pode até ser positivo. Abre brecha para o Global comprar os direitos e virar o oficial ( não só publicadora ). O valor vai cair muito, mas muuuuuuito, esse tipo de coisa é considerado como encerramento das atividades. Se o Global estiver dando lucro ( faturar não é lucrar ), eles podem assumir a empresa. --- Pensando bem, comprar os direitos seria uma boa, desativo todos os servidores e inicio o WYD 4, ou seja lá qual número está atualmente rsrs
  9. Gabriel

    Devocional | 24/08/2026

    Caminhar como novo 1 Pedro 2.9-12 ...agora são povo de Deus. v.10 Ouviram-se os aplausos quando os alunos receberam certificados de excelência pelo desempenho escolar. A celebração continuou, e o prêmio seguinte celebrou os alunos que mais melhoraram durante o semestre. Eles se esforçaram para melhorar suas notas, corrigir maus comportamentos ou comprometeram-se a faltar menos. Os pais aplaudiram, reconhecendo que eles trilhavam um melhor caminho; não vendo o passado, mas o futuro deles. Essa cena comovente demonstra como nosso Pai nos vê; não nosso passado, mas como Seus filhos em Cristo. João escreveu: "Mas, a todos que creram nele e o aceitaram, ele deu o direito de se tornarem filhos de Deus" (João 1.12). Que perspectiva amorosa! Desse modo, Paulo lembrou aos novos cristãos, antes "mortos por causa de sua desobediência e de seus muitos pecados" (Efésios 2.1), que de fato "somos obra-prima de Deus, criados em Cristo Jesus a fim de realizar as boas obras que ele de antemão planejou para nós" (v.10). Pois somos "povo escolhido, reino de sacerdotes, nação santa, propriedade exclusiva de Deus. Assim, [mostremos] às pessoas como à admirável aquele que [nos] chamou das trevas para sua maravilhosa luz" e fez-nos "povo de Deus" (1 Pedro 2.9-10). Aos olhos do Pai, nosso passado não tem direito sobre nós. Que nos vejamos como Deus nos vê, e andemos em novidade de vida. — Patrícia Raybon No Senhor, qual o novo caminho que você deve trilhar? Pai querido, por favor, inspira-me neste novo dia com a visão que Tu tens de mim.
  10. 🔥 LIFE DESTINY 6.56 — UMA NOVA TEMPORADA? ⚔️ O Life Destiny encerrou recentemente, mas estamos estudando a possibilidade de trazer o servidor de volta para uma nova temporada. Queremos saber se existe interesse da comunidade. 👀 👉 Você apoiaria uma nova temporada do Life Destiny 6.56? Entre no grupo e participe: 📲 WYD Nostálgico 🔗 [Hidden Content] 💬 Quanto mais jogadores interessados, maiores as chances de uma nova temporada sair do papel! ⚔️ Life Destiny 6.56 pode estar de volta.
  11. Atualização do projeto 23/08/2026 Hoje a proteção foi ampliada de P1 para P1 + P2. O P1 continua verificando alterações na IAT de GetAdaptersInfo e connect. Foi adicionado o P2, que também detecta alterações inline no código dessas funções, comparando a implementação carregada em memória com a imagem original do módulo. Também removemos a validação “uma vez por execução”: agora P1 e P2 são verificados novamente a cada tentativa de login. A documentação, exemplos de integração e CI do repositório foram atualizados e validados.
  12. rafsh

    Fim do WYD KR?

    Pelo que entendi da tradução dessa página o desenvolvimento do WYD KR será encerrado: [Hidden Content] Será isso mesmo? O que acham que isso impacta no WYD Global?
  13. Ontem
  14. Hello Guys Download link: [Hidden Content] __________________ Selling combo high quality with guarantee➖ Selling: EMAIL: PASS USER: PASS MAILLIST AOL, YAHOO, HOTMAIL, OUTLOOK, FRANCE, UK, GERMANY, USA, ESPAIN, ITALY, CANADA, AUSTRALIA… To buy msg me TELEGRAM: @KOCsupport
  15. Hello Guys Download link: [Hidden Content] __________________ Selling combo high quality with guarantee➖ Selling: EMAIL: PASS USER: PASS MAILLIST AOL, YAHOO, HOTMAIL, OUTLOOK, FRANCE, UK, GERMANY, USA, ESPAIN, ITALY, CANADA, AUSTRALIA… To buy msg me TELEGRAM: @KOCsupport
  16. ARENAAI TODOS MODELOS DE IA PAGAS EM UM SÓ LUGAR - DE GRAÇA! O Arena.ai é uma plataforma gratuita que reúne diversos modelos avançados de Inteligência Artificial em um único ambiente. Há algumas limitações, mas permite experimentar e comparar modelos que normalmente são oferecidos por serviços pagos. Principais funcionalidades: 1. Side-by-Side — Compare vários modelos Uma das principais funcionalidades do Arena.ai é a possibilidade de utilizar e comparar diferentes modelos de IA lado a lado. É possível testar modelos como GPT, Claude, Gemini, Llama, Mistral e diversos outros dentro da mesma interface, utilizando o mesmo comando para avaliar qual modelo apresenta o melhor resultado. 2. Diferentes tipos de ferramentas A plataforma oferece diferentes categorias de utilização, permitindo escolher o tipo de tarefa que deseja realizar: Texto e conversação: criação, revisão, resumo e análise de textos; Coding: programação, análise e geração de código; Geração de imagens: criação de imagens utilizando modelos de IA; Pesquisa: utilização de modelos e recursos voltados à pesquisa e obtenção de informações. 3. Agent Mode O Agent Mode é uma das funcionalidades mais avançadas da plataforma. Em vez de simplesmente responder a uma pergunta, o agente pode receber uma tarefa mais complexa, elaborar um plano e executar diferentes etapas para chegar ao resultado. Por exemplo, você pode solicitar a criação de um projeto, uma pesquisa ou uma tarefa de programação, e o agente pode dividir o trabalho em várias etapas e executá-las de forma mais autônoma. 4. Chatbots e pesquisa O Arena.ai permite testar diferentes modelos para tarefas de escrita, análise e pesquisa. Uma das vantagens é poder utilizar diferentes IAs para a mesma tarefa e comparar diretamente os resultados. Por exemplo, é possível solicitar a criação de um e-book sobre alimentação low carb e observar como cada modelo estrutura o conteúdo, permitindo identificar qual apresenta o resultado mais adequado. 5. Geração de imagens A plataforma também disponibiliza recursos para criação de imagens utilizando Inteligência Artificial. Embora possam ocorrer algumas limitações ou instabilidades dependendo do modelo utilizado, é possível experimentar diferentes modelos de geração visual dentro da própria plataforma. O grande diferencial é a facilidade de comparar resultados de diferentes modelos de IA na mesma interface Acesso: [Hidden Content]
  17. Vlw mano ;) Olha, eu to fazendo na marra, e não estou tendo tanta dificuldade até o momento, como me familiarizei agora, usar outra coisa mesmo que pra facilitar me tiraria do foco talvez, mas vou dar um olhada já que é o segundo que fala desse .pane.
  18. Gabriel

    Devocional | 23/08/2026

    Um coração arrependido Jeremias 4.1-4 "Ó Israel", diz o SENHOR, "se quisesse, poderia voltar para mim". v.1 Um amigo violou os votos de seu casamento, e foi doloroso vê-lo destruir sua família. Ao buscar reconciliar-se com sua esposa, ele pediu meu conselho. Eu lhe disse que ele precisava oferecer mais do que palavras, ser pró-ativo em amá-la e remover todos os comportamentos pecaminosos. O profeta Jeremias ofereceu conselhos semelhantes aos que haviam quebrado a aliança com Deus e seguido falsos deuses. Não bastava voltar a Ele (Jeremias 4.1), embora fosse o primeiro passo correto. Eles precisavam alinhar suas ações às suas palavras. Isso significava livrar-se de seus "ídolos detestáveis" (v.1). Jeremias lhes disse que se assumissem compromissos em "verdade, justiça e retidão", Deus abençoaria as nações (v.2). No entanto, as pessoas faziam promessas vazias, sem sinceridade. Deus não quer meras palavras; Ele quer nosso compromisso. Como Jesus disse: "Pois a boca fala do que o coração está cheio" (Mateus 12.34). Por isso Jeremias segue encorajando os que o ouvem a arar o "terreno" do coração e a não semear entre espinhos (Jeremias 4.3). Infelizmente, como tantos outros, meu amigo não quis ouvir os bons conselhos bíblicos e, consequentemente, destruiu seu casamento. Quando pecamos, devemos confessar e abandonar o pecado. Deus não quer promessas vazias; Deus deseja que vivamos alinhados com Ele. — Matt Lucas Em que área da vida suas palavras não correspondem às suas ações? O que deve mudar? Pai, por favor, perdoa-me quando minhas ações não corresponderem ao que professo crer.
  19. Última semana
  20. Hello Guys Download link: [Hidden Content] __________________ Selling combo high quality with guarantee➖ Selling: EMAIL: PASS USER: PASS MAILLIST AOL, YAHOO, HOTMAIL, OUTLOOK, FRANCE, UK, GERMANY, USA, ESPAIN, ITALY, CANADA, AUSTRALIA… To buy msg me TELEGRAM: @KOCsupport
  21. cara é o maior ganho real que vc vai ter em relação a interface, no sistema nativo vc pode criar outras janelas tbm sem problemas, a questão do .pane é facilidade de uso e facilidade de implementação...
  22. Gabriel

    Effy Stonem

    Obrigado pelas dicas, querido Jm'. Vou começar a reunir recursos novamente e voltar a me aprofundar no Design. Por fim, eu fiz 3 versões do trabalho acima
  23. Excelente projeto hein... novas montarias animadas e mapas novos. Incrível.
  24. Rapaz ta muito maneiro isso ai, eu sou extremamente novo nessa questão, eu jogava WYD a uns 10 anos atrás e vi que hoje em dia tem muitos servidores ativos, abrindo e tal, ai eu tenho experiência em outros jogos e tal, e resolvi pegar uma source qualquer 7.59, o cliente oficial do wyd br que acho muito mais clean e trazer um servidorzinho raiz, mas com muitas features legais, até mesmo de outros jogos e tal. Estou fazendo transferencia de sistemas tudo pra banco de dados real mysql, xml para outras coisas, inclusive criei algumas coisas instanciadas e tal que resolve alguns problemas de gargalo no level up do player, ta ficando legal, encontrei uma caralhada de erro também em alguns sistemas nativos e tal, vai ficar legal. Ta sendo uma experiencia muito boa.
  25. Sinceramente, ja que esta mudando a interface, implemente o .pane fica extremamente mais facil de trabalhar/criar paineis... vc tem controle total sem toda a frescura do sistema nativo antigo... simplifica muito mais o codigo... Se a ideia é evoluir a interface, na minha opnião o sistema .pane do global é o que vc vai ter de melhor, a arte vc pode modificar a seu criterio... veja alguns prints, aposentei todo o sistema nativo da interface e implementei o .pane, com isso facilitou muito a criação de um filtro de drop para fadas douradas e prateadas, onde com a fada equipada basta clicar com o botão direito nela e abre o .pane do filtro... o sistema de linkar itens no chat, o sistema de coleção que inclusive esta desabilitado no global, ampliei ele para incluir os trajes de montaria... o menu de configuração ingame... tudo via .pane... estou corrigindo algumas questoes de linguagem pq o cliente suporta ingles e portugues, porem tem algumas strings em ptbr que precisam ser corrigidas, ou nem existem no global, mas no geral fica muito mais facil de trabalhar.
  1. Mais Resultados
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.