Mentor
19/06/2020, 10:23 AM
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 :D
Em GameServer/Data/GameServerInfo - Event.dat
BUSCAR "InvasionManagerSwitch = 1" e abaixo coloque isso:
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:
#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:
#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:
int m_InvasionManagerSwitch;
Abaixo dela adicione isso:
int m_FlyingDragonsSwitch; //Dragones Server Switch
int m_FlyingDragonsKillBossSwitch; //Dragones Kill Boss Server Switch
Em ServerInfo.cpp busque por:
this->m_InvasionManagerSwitch = GetPrivateProfileInt(section,"InvasionManagerSwitch",0,path);
Abaixo dela adicione isso:
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:
void DGCharacterInfoRecv(SDHP_CHARACTER_INFO_RECV* lpMsg)
No final da função vai ter essa parte:
}
LogAddConnect(LOG_BLUE,"[Obj][%d] LogInCharacter (%s)",lpObj->Index,lpObj->Name);
}
Acrescente essa if antes da linhas que citei acima:
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:
void CInvasionManager::SetMonster(INVASION_INFO* lpInfo,INVASION_RESPWAN_INFO* lpRespawnInfo,INVASION_MONSTER_INFO* lpMonsterInfo)
Nessa função acrescente isso:
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:
void CInvasionManager::MonsterDieProc(LPOBJ lpObj,LPOBJ lpTarget)
E acrescente:
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.Get Message(lpInfo->BossMessage),lpTarget->Name);
continue;
}
}
}
}
Agora vamos em ObjectManager.cpp e buscar pela função:
bool CObjectManager::CharacterGameClose(int aIndex)
No final da função acrescente:
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:
void GCEventStateSendToAll(int map,BYTE state,BYTE event); //Dragoes Funcion
Em Protocol.cpp adicione:
//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:
void gObjEventRunProc()
No final dela acrescente:
#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:
BOOL gObjMoveGate(int aIndex,int gate)
E acrescente no final dela:
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
Vamos ao que interessa :D
Em GameServer/Data/GameServerInfo - Event.dat
BUSCAR "InvasionManagerSwitch = 1" e abaixo coloque isso:
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:
#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:
#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:
int m_InvasionManagerSwitch;
Abaixo dela adicione isso:
int m_FlyingDragonsSwitch; //Dragones Server Switch
int m_FlyingDragonsKillBossSwitch; //Dragones Kill Boss Server Switch
Em ServerInfo.cpp busque por:
this->m_InvasionManagerSwitch = GetPrivateProfileInt(section,"InvasionManagerSwitch",0,path);
Abaixo dela adicione isso:
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:
void DGCharacterInfoRecv(SDHP_CHARACTER_INFO_RECV* lpMsg)
No final da função vai ter essa parte:
}
LogAddConnect(LOG_BLUE,"[Obj][%d] LogInCharacter (%s)",lpObj->Index,lpObj->Name);
}
Acrescente essa if antes da linhas que citei acima:
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:
void CInvasionManager::SetMonster(INVASION_INFO* lpInfo,INVASION_RESPWAN_INFO* lpRespawnInfo,INVASION_MONSTER_INFO* lpMonsterInfo)
Nessa função acrescente isso:
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:
void CInvasionManager::MonsterDieProc(LPOBJ lpObj,LPOBJ lpTarget)
E acrescente:
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.Get Message(lpInfo->BossMessage),lpTarget->Name);
continue;
}
}
}
}
Agora vamos em ObjectManager.cpp e buscar pela função:
bool CObjectManager::CharacterGameClose(int aIndex)
No final da função acrescente:
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:
void GCEventStateSendToAll(int map,BYTE state,BYTE event); //Dragoes Funcion
Em Protocol.cpp adicione:
//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:
void gObjEventRunProc()
No final dela acrescente:
#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:
BOOL gObjMoveGate(int aIndex,int gate)
E acrescente no final dela:
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