Resultados 1 a 10 de 14

Threaded View

  1. #1
    Fundador PerfectZone Mentor's Avatar


    Data de Ingresso
    Jun 2013
    Posts
    2,831
    Thanks Thanks Given 
    784
    Thanks Thanks Received 
    2,249
    Thanked in
    360 Posts
    Mencionado
    804 Post(s)
    MEU HUMOR
    Twisted
    País
    Brazil

    Red Dragon + Golden Dragon Invasion Map Flying - MuEmu

    Pessoal bom dia, vim postar esse possível fix das invasões dos Goldem dragon e Red Dragon que não mostram eles sobrevoando as cidades que ocorre a invasão, não cheguei a testar, e isso requer um pouco de conhecimento para poder aplicar isso a sua source MuEmu que tem esse bug.

    Vamos ao que interessa

    Em GameServer/Data/GameServerInfo - Event.dat

    BUSCAR "InvasionManagerSwitch = 1" e abaixo coloque isso:

    Código:
    FlyingDragonsSwitch = 1 //Activa/Desactiva los dragones volando
    FlyingDragonsKillBossSwitch = 1 //Activa/Desactiva sacar los dragones al matar al boss
    Agora crie na sua fonte o arquivo FlyingDragons.cpp e adicione essas linhas:

    Código:
    #include "stdafx.h"
    #include "Protocol.h"
    #include "FlyingDragons.h"
    #include "Util.h"
    
    cDragonMaps gDragonMaps;
    
    void cDragonMaps::DeleteFlyingDragons () //Dragones verificar si alguno no se finalizó
    {
        for (int n=0; n<MAX_MAP; n++){
            if (mapasDragones[n].EndTime<=time(0)){
                if (mapasDragones[n].index==1 || mapasDragones[n].index==3){
                    mapasDragones[n].Ok=0;
                    mapasDragones[n].index=-1;
                    GCEventStateSendToAll(n, 0, mapasDragones[n].index);
                }
            }
        }
    }
    
    void cDragonMaps::AddFlyingDragons(int mapa, int invasionTime, int index) //Dragones agregar al mapa y setearlos
    {
        if (mapasDragones[mapa].Ok==1 && mapasDragones[mapa].index==index){
            if (mapasDragones[mapa].EndTime<(time(0)+invasionTime)){
                mapasDragones[mapa].EndTime=(time(0)+invasionTime);
            }
        } else {
            mapasDragones[mapa].Ok=1;
            mapasDragones[mapa].index=index;
            mapasDragones[mapa].EndTime=(time(0)+invasionTime);
        }
        GCEventStateSendToAll(mapa, 1, index); //Dragones meter al iniciar una invasión
    }
    
    void cDragonMaps::FlyingDragonsBossDieProc(int mapa) //Quitar dragones al matar al boss
    {
        for (int n=0; n<MAX_MAP; n++){
            if (mapasDragones[n].index==mapasDragones[mapa].index){
                mapasDragones[n].Ok=0;
                mapasDragones[n].index=-1;
                GCEventStateSendToAll(n, 0, mapasDragones[n].index);
            }
        }
    }
    
    void cDragonMaps::FlyingDragonsCheck(int mapa, int index) //Dragones verificar mapa para insertar
    {
        if (mapasDragones[mapa].Ok==1)
            GCEventStateSend(index,1,mapasDragones[mapa].index);
    }
    Crie também o arquivo FlyingDragons.h e adicione essas linhas:

    Código:
    #pragma once
    
    #include "Map.h"
    
    class cDragonMaps
    {
    public:
        //Dragones métodos
        void DeleteFlyingDragons ();
        void AddFlyingDragons(int mapa, int invasionTime, int index);
        void FlyingDragonsBossDieProc(int mapa);
        void FlyingDragonsCheck(int mapa, int index);
    private:
        //Dragones variables de uso
        struct Maps
        {
            int Ok;
            time_t EndTime;
            int index;
        };
    
        Maps mapasDragones[MAX_MAP];
    };
    
    extern cDragonMaps gDragonMaps;
    Agora vá no seu arquivo ServerInfo.h e busque por essa linha:
    Código:
    int m_InvasionManagerSwitch;
    Abaixo dela adicione isso:
    Código:
    int m_FlyingDragonsSwitch; //Dragones Server Switch
        int m_FlyingDragonsKillBossSwitch; //Dragones Kill Boss Server Switch
    Em ServerInfo.cpp busque por:
    Código:
    this->m_InvasionManagerSwitch = GetPrivateProfileInt(section,"InvasionManagerSwitch",0,path);
    Abaixo dela adicione isso:
    Código:
    this->m_FlyingDragonsSwitch = GetPrivateProfileInt(section,"FlyingDragonsSwitch",0,path); //Dragones Server Switch
    
        this->m_FlyingDragonsKillBossSwitch = GetPrivateProfileInt(section,"FlyingDragonsKillBossSwitch",0,path); //Dragones Kill Boss Server Switch
    Em DSProtocol.cpp adicione esse include #include "FlyingDragons.h" e depois busque nesse mesmo aquivo por essa função:
    Código:
    void DGCharacterInfoRecv(SDHP_CHARACTER_INFO_RECV* lpMsg)
    No final da função vai ter essa parte:
    Código:
    }
    
        LogAddConnect(LOG_BLUE,"[Obj][%d] LogInCharacter (%s)",lpObj->Index,lpObj->Name);
    }
    Acrescente essa if antes da linhas que citei acima:
    Código:
    if (gServerInfo.m_FlyingDragonsSwitch==1){
            //Dragones Meter al loguear con personaje
            gDragonMaps.FlyingDragonsCheck(lpObj->Map, lpObj->Index);
    Em InvasionManager.cpp adicione o include: #include "FlyingDragons.h" e busque nesse mesmo arquivo essa função:
    Código:
    void CInvasionManager::SetMonster(INVASION_INFO* lpInfo,INVASION_RESPWAN_INFO* lpRespawnInfo,INVASION_MONSTER_INFO* lpMonsterInfo)
    Nessa função acrescente isso:
    Código:
    lpObj->MaxRegenTime = ((lpMonsterInfo->RegenType==0)?(lpInfo->InvasionTime*1000):lpMonsterInfo->RegenTime);
    
            if(lpObj->Class == lpInfo->BossIndex && lpInfo->BossMessage != -1)
            {
                LogAdd(LOG_EVENT,"[Invasion Manager] Index(%d) Boss Position (Map: %d X: %d Y: %d)",lpInfo->Index,lpObj->Map,lpObj->X,lpObj->Y);
    
            }
    
            //Dragones setear variables al iniciar una invasión
            if (gServerInfo.m_FlyingDragonsSwitch==1){
                if (lpInfo->Index==1){
                    gDragonMaps.AddFlyingDragons(lpObj->Map, lpInfo->InvasionTime, 1);
                }
                if (lpInfo->Index==2){
                    gDragonMaps.AddFlyingDragons(lpObj->Map, lpInfo->InvasionTime, 3);
                }
            }
    
    
            if(this->AddMonster(lpInfo,index) == 0)
            {
                gObjDel(index);
                continue;
            }
    
        }
    }
    Ainda nesse CPP busque pela função:
    Código:
    void CInvasionManager::MonsterDieProc(LPOBJ lpObj,LPOBJ lpTarget)
    E acrescente:
    Código:
    if(this->GetMonster(lpInfo,lpObj->Index) == 0)
            {
                continue;
            }
    
            if(lpObj->Class == lpInfo->BossIndex)
            {
                if (gServerInfo.m_FlyingDragonsKillBossSwitch==1 && gServerInfo.m_FlyingDragonsSwitch==1){
                    //Quitar dragones al matar al boss
                    if (lpInfo->Index==1){
                        gDragonMaps.FlyingDragonsBossDieProc(lpObj->Map);
                    }
                    else if (lpInfo->Index==2){
                        gDragonMaps.FlyingDragonsBossDieProc(lpObj->Map);
                    }
                }
    
                if (lpInfo->BossMessage != -1){
                    gNotice.GCNoticeSendToAll(0,0,0,0,0,0,gMessage.GetMessage(lpInfo->BossMessage),lpTarget->Name);
                    continue;
                }
            }
        }
    }
    Agora vamos em ObjectManager.cpp e buscar pela função:
    Código:
    bool CObjectManager::CharacterGameClose(int aIndex)
    No final da função acrescente:
    Código:
    gObjClearViewport(lpObj);
    
        //Dragones sacar al salir del personaje
        GCEventStateSend(lpObj->Index, 0, 1);
        GCEventStateSend(lpObj->Index, 0, 3);
    
        LogAddConnect(LOG_USER,"[Obj][%d] LogOutCharacter (%s)",lpObj->Index,lpObj->Name);
    
        memset(lpObj->Name,0,sizeof(lpObj->Name));
    
        lpObj->Connected = OBJECT_LOGGED;
        return 1;
    }
    Em Protocol.h adicione:
    Código:
    void GCEventStateSendToAll(int map,BYTE state,BYTE event); //Dragoes Funcion
    Em Protocol.cpp adicione:
    Código:
    //Dragoes function para checar mapa de invasión e todos os personajes
    void GCEventStateSendToAll(int map ,BYTE InvasionState, BYTE InvasionIndex)
    {
        for ( int n=0; n<MAX_OBJECT ; n++ )
        {
            if ( gObj[n].Type == OBJECT_USER && map == gObj[n].Map )
            {
                GCEventStateSend(n, InvasionState, InvasionIndex);
            }
        }
    }
    Em User.cpp adicione o include: #include "FlyingDragons.h" e depois busque pela função:
    Código:
    void gObjEventRunProc()
    No final dela acrescente:
    Código:
    #if(GAMESERVER_UPDATE>=402)
    
        gMossMerchant.MainProc();
    
        #endif
    
        gRaklion.MainProc();
    
        if (gServerInfo.m_FlyingDragonsSwitch==1){
            //Dragones quitar
            gDragonMaps.DeleteFlyingDragons();
        }
    }
    Ainda nesse cpp busque pela função:
    Código:
    BOOL gObjMoveGate(int aIndex,int gate)
    E acrescente no final dela:
    Código:
    if(lpObj->Type == OBJECT_USER)
        {
            lpObj->LastTeleportTime = 10;
        }
    
        if (gServerInfo.m_FlyingDragonsSwitch==1){
            //Dragones meter al cambiar de mapa
            gDragonMaps.FlyingDragonsCheck(lpObj->Map, lpObj->Index);
        }
    
        return 1;
    
        ERROR_JUMP:
    Bom, como eu disse requer um pouco de conhecimento, espero que isso sirva e em breve estarei criando um vído mostrando como adicionar esse código para facilitar.

    Créditos pelo fix:
    kayito
    Last edited by Mentor; 19/06/2020 at 10:26 AM.
    Perfect Zone Brasil



    Inscreva-se no meu canal clicando [Somente membros podem ver os links. ]

  2. The Following 2 Users Say Thank You to Mentor For This Useful Post:


Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • You may not post Resposta(s)
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •  
Sobre nós
Somos uma comunidade em atividade a 8 anos que aborda assuntos relacionados a games em geral, principalmente games MMORPG. e que busca sempre ajudar os membros através de conteúdos, tutoriais e suporte...
Nossos anunciantes
Hinetworks
VelozHost
InovHost
Rede Sociais