PDA

View Full Version : |Source| Red Dragon + Golden Dragon Invasion Map Flying - MuEmu



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

rafhael
20/06/2020, 12:23 PM
Eu uso esse sistema, porém ao terminar o tempo de invasão que no meu caso é 1 hora, os dragões continuam sobrevoando, se mudar de mapa e voltar eles somem, mas se você se manter no mesmo mapa você assiste os dragões infinitamente!

caiojuan92
20/06/2020, 12:46 PM
Acredito que é necessário colocar uma interrupção em algum momento kk

rafhael
06/07/2020, 04:53 PM
[QUOTE=caiojuan92;48039]Acredito que é necessário colocar uma interrupção em algum momento kk

CORRIGIDO!


#include "stdafx.h"
#include "Protocol.h"
#include "FlyingDragons.h"
#include "Util.h"

cDragonMaps gDragonMaps;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

cDragonMaps::cDragonMaps() // OK
{

}

cDragonMaps::~cDragonMaps() // OK
{

}

void cDragonMaps::Init() // OK
{
for (int n = 0; n < MAX_MAP; n++)
{
this->mapasDragones[n].Ok = 0;
this->mapasDragones[n].EndTime = 0;
this->mapasDragones[n].index = -1;
}
}

void cDragonMaps::DeleteFlyingDragons()
{
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;
//FIX REMOVER EFEITO AO TERMINAR TEMPO DE INVASÃO
GCEventStateSendToAll(n, 0, 1);
GCEventStateSendToAll(n, 0, 3);
}
}
}
}

void cDragonMaps::AddFlyingDragons(int mapa, int invasionTime, int index)
{
if (mapa == MAP_ATLANS) return; //FIX REMOVER EFEITO DE ATLANS ONDE APARECIAM CENTENAS DE DRAGÕES

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);
}

void cDragonMaps::FlyingDragonsBossDieProc(int mapa)
{
for (int n = 0; n<MAX_MAP; n++) {
if (mapasDragones[n].index == mapasDragones[mapa].index) {
mapasDragones[n].Ok = 0;
mapasDragones[n].index = -1;
//FIX REMOVER EFEITO AO TERMINAR TEMPO DE INVASÃO
GCEventStateSendToAll(n, 0, 1);
GCEventStateSendToAll(n, 0, 3);
}
}
}

void cDragonMaps::FlyingDragonsCheck(int mapa, int index)
{
if (mapasDragones[mapa].Ok == 1)
GCEventStateSend(index, 1, mapasDragones[mapa].index);
}

admkollaa
26/07/2020, 10:45 AM
[Only registered and activated users can see links]
Isso aqui eu achei "GCEventStateSendToAll" mas esse aqui não "void __cdecl" <---- sera que tenho que adicionar isso kkkk. desculpa , ignorância em downgrade.

Wilian Ramalho
28/07/2020, 09:15 AM
Já existe o vídeo a respeito ?

robsonsoares
31/07/2020, 09:21 PM
[QUOTE=caiojuan92;48039]Acredito que é necessário colocar uma interrupção em algum momento kk

CORRIGIDO!


#include "stdafx.h"
#include "Protocol.h"
#include "FlyingDragons.h"
#include "Util.h"

cDragonMaps gDragonMaps;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

cDragonMaps::cDragonMaps() // OK
{

}

cDragonMaps::~cDragonMaps() // OK
{

}

void cDragonMaps::Init() // OK
{
for (int n = 0; n < MAX_MAP; n++)
{
this->mapasDragones[n].Ok = 0;
this->mapasDragones[n].EndTime = 0;
this->mapasDragones[n].index = -1;
}
}

void cDragonMaps::DeleteFlyingDragons()
{
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;
//FIX REMOVER EFEITO AO TERMINAR TEMPO DE INVASÃO
GCEventStateSendToAll(n, 0, 1);
GCEventStateSendToAll(n, 0, 3);
}
}
}
}

void cDragonMaps::AddFlyingDragons(int mapa, int invasionTime, int index)
{
if (mapa == MAP_ATLANS) return; //FIX REMOVER EFEITO DE ATLANS ONDE APARECIAM CENTENAS DE DRAGÕES

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);
}

void cDragonMaps::FlyingDragonsBossDieProc(int mapa)
{
for (int n = 0; n<MAX_MAP; n++) {
if (mapasDragones[n].index == mapasDragones[mapa].index) {
mapasDragones[n].Ok = 0;
mapasDragones[n].index = -1;
//FIX REMOVER EFEITO AO TERMINAR TEMPO DE INVASÃO
GCEventStateSendToAll(n, 0, 1);
GCEventStateSendToAll(n, 0, 3);
}
}
}

void cDragonMaps::FlyingDragonsCheck(int mapa, int index)
{
if (mapasDragones[mapa].Ok == 1)
GCEventStateSend(index, 1, mapasDragones[mapa].index);
}


sou novo onde add essa função??

Wilian Ramalho
31/07/2020, 09:38 PM
FlyingDragons.cpp

Mentor
31/07/2020, 10:02 PM
Só lembrando que se não tiver esse cpp você vai ter de criar tanto o FlyingDragons.cpp quanto o FlyingDragons.h

Maykon
01/08/2020, 12:26 AM
Qual a diferença do evento original da webzen ?

Denis Alves
01/08/2020, 12:34 AM
Qual a diferença do evento original da webzen ?

Esse código faz só os Dragões (Red e Golden) voarem durante o horário da invasão. Na Season 6 não acontece isso.

Maykon
01/08/2020, 01:19 AM
Nas versões baixas também não ocorrem os efeitos, mas é por causa de uma variável basta corrigir!