Как решить проблему с неработающим Event в MU Online?

Автор Bason4ik, 2013 Май 14, 18:23

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlineсерверные файлы MUпомощькомпиляцияeventmenegerhappy hauer

Bason4ik

Использую файлы второго сезона от Шаттера,те которые опенсурс.
Добавил туда эвент менеджер и хеппи хауэр эвент,все компилится без проблем,гс запускается без проблем. но эвента просто нет.....хотя если переименовать файл эвент менеджера в бред какой нибудь,то гс начинает ругаться что файл не найден....так понимаю что все таки гс грузит то что добавил..но эвент почему то нет(((((так что нужна помосчь((

KamatoZ

Я думаю что для начала нужно показать кусок кода с эвентом и как ты его вписал, а потом уже может тебе и помогут.

Bason4ik

#2
Цитата: KamatoZ от 2013 Май 15, 00:34  Я думаю что для начала нужно показать кусок кода с эвентом и как ты его вписал, а потом уже может тебе и помогут.
да извиняюсь,собственно брал код эвента из NaMeCH сорцов,а эвент менеджер из SCF сорцов....и вставил к себе....скопировал все функции к ним...но толку ноль(((эвент менеджер грузится....т.к. если не будет файла менеджера,ГС будет давать ошибку...поэтому я грешу на сам евент(

happyhour.cpp
#include "StdAfx.h"

GOBJHAPPYHOURCOMMON gObjHappyHourEvent;


void HappyHour__AddExtraExp(int ExtraExp)
{
//SetExp(GetExp()+ExtraExp);
float * EXPERIENCE = (float *)(gAddExperience);
(*EXPERIENCE)+=ExtraExp;
}

void HappyHour__AddExtraDrop(int ExtraDrop)
{
SetDrop(GetDrop()+ExtraDrop);

/*float * DROP = (float *)(gItemDropPer);
(*DROP)+=ExtraDrop;*/
}

void HappyHour__InsideTrigger(void * lpParam)
{
char sBuf[255] = {0};
char sBuf2[255] = {0};

if(gObjHappyHourEvent.Start==1)
{
wsprintf(sBuf, "HappyHour Event has started.",gObjHappyHourEvent.ExtraExp,gObjHappyHourEvent.ExtraDrop); //Started
// wsprintf(sBuf2, "[Server: %s] %s",GS_NAME,sBuf);
// DebugInfo(sBuf2,3);
ServerMsgSendAll(sBuf);

HappyHour__AddExtraExp(gObjHappyHourEvent.ExtraExp);
HappyHour__AddExtraDrop(gObjHappyHourEvent.ExtraDrop);

wsprintf(sBuf, "Experience changed to: %d, Drop changed to: %d",GetExp(),GetDrop());
////DebugInfo(sBuf,3);
ServerMsgSendAll(sBuf,0x00);


Sleep(gObjHappyHourEvent.Minutes);

gObjHappyHourEvent.Start=0;
wsprintf(sBuf, "Happy Hour Event Has Finished"); //Finished
//wsprintf(sBuf2, "[Server:] %s",GS_NAME,sBuf);
////DebugInfo(sBuf2,3);
ServerMsgSendAll(sBuf);
//
HappyHour__AddExtraExp(-gObjHappyHourEvent.ExtraExp);
HappyHour__AddExtraDrop(-gObjHappyHourEvent.ExtraDrop);

_endthread();
return;
}
}

void HappyHour__Start()
{
if((gObjHappyHourEvent.Enabled == 1) && (gObjHappyHourEvent.Start == 0))
{
gObjHappyHourEvent.Start=1;
_beginthread( HappyHour__InsideTrigger, 0, NULL  );
}
}

bool HappyHour__ReadFile(char * FilePath)
{
int Temp = 0;
gObjHappyHourEvent.Start = 0;
gObjHappyHourEvent.Enabled = GetPrivateProfileInt("HappyHour", "HappyHourEnabled",0, HAPPYHOUR_PATH) ;
Temp = GetPrivateProfileInt("HappyHour", "HappyHourMinutes",5, HAPPYHOUR_PATH) ;
gObjHappyHourEvent.Minutes = (Temp * 60)*1000;

gObjHappyHourEvent.ExtraExp = GetPrivateProfileInt("HappyHour", "HappyHourExtraExperience",0, HAPPYHOUR_PATH) ;
gObjHappyHourEvent.ExtraDrop = GetPrivateProfileInt("HappyHour", "HappyHourExtraItemDropPer",0, HAPPYHOUR_PATH) ;

return 1;
}

happyhour.h
bool HappyHour__ReadFile( char * FilePath );
void HappyHour__Start();
void HappyHour__AddExtraDrop(int ExtraDrop);
void HappyHour__AddExtraExp(int ExtraExp);

eventmanager.cpp
#include "StdAfx.h"

extern void Checking();

UINT EventManager(DWORD dwArgv, int state,char *FileName)
{
FILE *fp;
char sLineTxt[255] = {0};
BOOL bRead = FALSE;
int leestatus=-1;
int i=0;

char path[1000];
wsprintf(path, "%s", FileName);
//GetCurrentDirectory(50,path);
//strcat(path,"\data\");
//strcat(path,FileName);

if((fp=fopen(path, "r")) == NULL)
{
MessageBox(NULL, "CustomEventManager Failed", "Error ", 0);

// gObjSkyEvent.Enabled=0;
// gObjHalloweenEvent.Enabled = 0;
// gObjHappyHourEvent.Enabled = 0;
// gObjBlueEvent.Enabled = 0;

return 0;
}

rewind(fp);

while(fgets(sLineTxt, 255, fp) != NULL)
{
if(sLineTxt[0] == '/')continue;

if(bRead == FALSE && (UINT)(sLineTxt[0]-0x30) == dwArgv) bRead = TRUE;

if(bRead==TRUE && strlen(sLineTxt)<3)
{
UINT q = 0;
sscanf(sLineTxt, "%d", &q);
leestatus = q;
}

if(state == leestatus)
{
if(bRead==TRUE && strlen(sLineTxt)>3)
{
if ((sLineTxt[0] == 'e')&&(sLineTxt[1] == 'n')&&(sLineTxt[2] == 'd'))
{
leestatus = -1;
} else {
UINT n[5] = {0};
sscanf(sLineTxt, "%d %d %d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4], &n[5]);


//if (state==0)
//{
EventTimesConfig[i].Type = n[0];
EventTimesConfig[i].Month = n[1];
EventTimesConfig[i].Day = n[2];
EventTimesConfig[i].DayOfWeek = n[3];
EventTimesConfig[i].Hour = n[4];
EventTimesConfig[i].Minute = n[5];
EventTimeCount++;
i++;
//}
}
}

}
}

rewind(fp);
fclose(fp);
return 1;
}

void EventManagerTimer()
{
_beginthread( EventManagers, 0, NULL  );
}

void EventManagers(void * lpParam)
{
while (true)
{
Sleep(60000);
//CHECK MAC
//SYSTEMTIME timemac;
//GetLocalTime(&timemac);
//DWORD dwEventNowTime = MAKELONG(timemac.wMinute, timemac.wHour);
//DWORD dwTimeMac = MAKELONG(30, timemac.wHour);

//if((dwTimeMac == dwEventNowTime) && (timemac.wSecond==0))
// Checking();

for (int i=0;i<EventTimeCount;i++)
{
if(EventTimesConfig[i].Hour == 24) EventTimesConfig[i].Hour = 0;
SYSTEMTIME time;

GetLocalTime(&time);
DWORD dwEventNowTime = MAKELONG(time.wMinute, time.wHour);
DWORD dwEventTime = MAKELONG(EventTimesConfig[i].Minute, EventTimesConfig[i].Hour);
if(dwEventNowTime == dwEventTime)
{
if( ( ((EventTimesConfig[i].Day == -1) && (EventTimesConfig[i].Month == -1)) && ((EventTimesConfig[i].DayOfWeek == -1) || (EventTimesConfig[i].DayOfWeek == time.wDayOfWeek)) ) || ( ((EventTimesConfig[i].Day == time.wDay) && (EventTimesConfig[i].Month == time.wMonth)) || (EventTimesConfig[i].Day == time.wDay) ) )
{
switch (EventTimesConfig[i].Type)
{
case 0:
{
// ScrambleMemory();
HappyHour__Start();
}break;

case 1:
{
// ScrambleMemory();
// SkyEvent__Start();
}break;

case 2:
{
// ScrambleMemory();;
// BossAttack__Start();
}break;

case 3:
{
// ScrambleMemory();
// BlueEvent__Start();
}break;

case 4:
{
// ScrambleMemory();
// HitAndUp__Start();
}break;

case 5:
{
// ScrambleMemory();
// Raklion.EventStart();
}break;

case 6:
{
// ScrambleMemory();
// Moss.EventStart();
}break;

case 7:
{
// ScrambleMemory();
// HalloweenEvent__Start();
}break;

}
}
}
}
}
_endthread();
}

eventmanager.h
#ifndef __EVENTMANAGER_H__
#define __EVENTMANAGER_H__

UINT EventManager(DWORD dwArgv, int state,char *FileName);
void EventManagerTimer();
void EventManagers(void * lpParam);

#endif __EVENTMANAGER_H__

в Init вставил:
EventManager(0,0,CUSTOMEVENTMANAGER);
EventManagerTimer();

пути до файлов настроек:
#define HAPPYHOUR_PATH  "..\data\HappyHour.ini"
#define CUSTOMEVENTMANAGER   "..\data\CustomEventManager.dat"

p.s. сильно не пинать если чтото не правильно или не так((((((

Mr.Kernighan

Цитироватьvoid EventManagers(void * lpParam);
Эту функцию нужно запускать в потоке чтобы эвент работал.

Bason4ik

спасибо что зашел  
только смотри,у меня эвент то начинается....в игре все видят сообщение "HappyHour Event has started.Experience changed to: 9015, Drop changed to: 9010"
через 5 минут эвент кончается и появляется сообщение "Happy Hour Event Has Finished".....но прикол в том,что он не повышает Эксп и Дроп(((((т.е. формально он начался,но у игроков все равно остаются такие рейты которые и были(((

Simp1e

gAddExperience

gItemDropPer

знач не правельные оффсеты)

Bason4ik

не буду утверждать на 100%
но я открыл в ольке,посмотрел в ГСе от Намеха оффсеты,потом нашел точно такие же в ГСе от Шаттера....тем более  что в 1.00.18 одно и тоже)))

перепроверил еще раз оффсеты,все верно:
CPU Disasm
Address   Hex dump          Command                                  Comments
006E18C8    0000            ADD BYTE PTR DS:[EAX],AL                 // gAddExperience

CPU Disasm
Address   Hex dump          Command                                  Comments
006E1890    0A00            OR AL,BYTE PTR DS:[EAX]                   // gItemDropPer

драл я эту фигню((((в чем еще может быть проблема?((((

Mr.Kernighan

#7
Выведи куда-то в лог gObjHappyHourEvent.ExtraExp, gObjHappyHourEvent.ExtraDrop и посмотри если они нормально инициализированы либо явно передай параметр в HappyHour__AddExtraExp.
И возможно действительно, не правильные офсеты. А чистый сервер шатера (исходник) ты компилил, запускал? (если да, там евент работал?)

void HappyHour__AddExtraExp(int ExtraExp)
{
//SetExp(GetExp()+ExtraExp);
float * EXPERIENCE = (float *)(gAddExperience);
(*EXPERIENCE)+=ExtraExp;
}

Попробуй здесь сделать, примерно так.

*(float*)(gAddExperience) += ExtraExp; //Не знаю если такое компилятор позволит, негде сейчас проверить. Если не позволит, тогда так: *(float*)(gAddExperience) = YouCurrentExp + ExtraExp;

Bason4ik

#8
я вкурил кое что....само по себе все пашет....тольк чтото мне подсказывает что тот кто переписывал с СКФ сорцы эвента просто ошибся с повышении экспы и дропа...

ОШИБСЯ!!!!(ВОТ ПРАВИЛЬНО)
ибо я закоментил эту строчку: SetDrop(GetDrop()+ExtraDrop);
и раскоментил вот эти:
   float * DROP = (float *)(SetORGetDrop_Offset);
   (*DROP)+=ExtraDrop;
разумеется в сообщении в игре он вывел нифиговый рейт для дропа,но прикол в том что дроп реально сменился....до эвента падали только зены и всякий хлам,во время эвента стали падать более менее нормальные вещи....по прошествии пяти минут снова стали падать зены и всяки хлам....я все таки склоняюсь что криво просто написано((

Bason4ik

запарился уже с этой байдой((((экспа все никак не хочет повышаться(((((

Simp1e

ищи в ольке текст AddExperience там ниже будет что то на подобе DWORD PTR DS:[628DC4] 628DC4 и есть оффсет Exp дальше сам думай как его увеличить

Похожие темы (5)