in syserr nu imi da nici o eroare la data si ora respectiva sau ceva legat de premiu la event
Cod: Selectaţi tot
#include "stdafx.h"
#include "constants.h"
#include "config.h"
#include "questmanager.h"
#include "start_position.h"
#include "packet.h"
#include "buffer_manager.h"
#include "log.h"
#include "char.h"
#include "char_manager.h"
#include "OXEvent.h"
#include "desc.h"
bool COXEventManager::Initialize()
{
m_timedEvent = NULL;
m_map_char.clear();
m_map_attender.clear();
m_vec_quiz.clear();
SetStatus(OXEVENT_FINISH);
return true;
}
void COXEventManager::Destroy()
{
CloseEvent();
m_map_char.clear();
m_map_attender.clear();
m_vec_quiz.clear();
SetStatus(OXEVENT_FINISH);
}
OXEventStatus COXEventManager::GetStatus()
{
BYTE ret = quest::CQuestManager::instance().GetEventFlag("oxevent_status");
switch (ret)
{
case 0 :
return OXEVENT_FINISH;
case 1 :
return OXEVENT_OPEN;
case 2 :
return OXEVENT_CLOSE;
case 3 :
return OXEVENT_QUIZ;
default :
return OXEVENT_ERR;
}
return OXEVENT_ERR;
}
void COXEventManager::SetStatus(OXEventStatus status)
{
BYTE val = 0;
switch (status)
{
case OXEVENT_OPEN :
val = 1;
break;
case OXEVENT_CLOSE :
val = 2;
break;
case OXEVENT_QUIZ :
val = 3;
break;
case OXEVENT_FINISH :
case OXEVENT_ERR :
default :
val = 0;
break;
}
quest::CQuestManager::instance().RequestSetEventFlag("oxevent_status", val);
}
bool COXEventManager::Enter(LPCHARACTER pkChar)
{
if (GetStatus() == OXEVENT_FINISH)
{
sys_log(0, "OXEVENT : map finished. but char enter. %s", pkChar->GetName());
return false;
}
PIXEL_POSITION pos = pkChar->GetXYZ();
if (pos.x == 896500 && pos.y == 24600)
{
return EnterAttender(pkChar);
}
else if (pos.x == 896300 && pos.y == 28900)
{
return EnterAudience(pkChar);
}
else
{
sys_log(0, "OXEVENT : wrong pos enter %d %d", pos.x, pos.y);
return false;
}
return false;
}
bool COXEventManager::EnterAttender(LPCHARACTER pkChar)
{
DWORD pid = pkChar->GetPlayerID();
m_map_char.insert(std::make_pair(pid, pid));
m_map_attender.insert(std::make_pair(pid, pid));
return true;
}
bool COXEventManager::EnterAudience(LPCHARACTER pkChar)
{
DWORD pid = pkChar->GetPlayerID();
m_map_char.insert(std::make_pair(pid, pid));
return true;
}
bool COXEventManager::AddQuiz(unsigned char level, const char* pszQuestion, bool answer)
{
if (m_vec_quiz.size() < (size_t) level + 1)
m_vec_quiz.resize(level + 1);
struct tag_Quiz tmpQuiz;
tmpQuiz.level = level;
strlcpy(tmpQuiz.Quiz, pszQuestion, sizeof(tmpQuiz.Quiz));
tmpQuiz.answer = answer;
m_vec_quiz[level].push_back(tmpQuiz);
return true;
}
bool COXEventManager::ShowQuizList(LPCHARACTER pkChar)
{
int c = 0;
for (size_t i = 0; i < m_vec_quiz.size(); ++i)
{
for (size_t j = 0; j < m_vec_quiz[i].size(); ++j, ++c)
{
pkChar->ChatPacket(CHAT_TYPE_INFO, "%d %s %s", m_vec_quiz[i][j].level, m_vec_quiz[i][j].Quiz, m_vec_quiz[i][j].answer ? LC_TEXT("참") : LC_TEXT("거짓"));
}
}
pkChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("총 퀴즈 수: %d"), c);
return true;
}
void COXEventManager::ClearQuiz()
{
for (unsigned int i = 0; i < m_vec_quiz.size(); ++i)
{
m_vec_quiz[i].clear();
}
m_vec_quiz.clear();
}
EVENTINFO(OXEventInfoData)
{
bool answer;
OXEventInfoData()
: answer( false )
{
}
};
EVENTFUNC(oxevent_timer)
{
static BYTE flag = 0;
OXEventInfoData* info = dynamic_cast<OXEventInfoData*>(event->info);
if ( info == NULL )
{
sys_err( "oxevent_timer> <Factor> Null pointer" );
return 0;
}
switch (flag)
{
case 0:
SendNoticeMap(LC_TEXT("10초뒤 판정하겠습니다."), OXEVENT_MAP_INDEX, true);
flag++;
return PASSES_PER_SEC(10);
case 1:
SendNoticeMap(LC_TEXT("정답은"), OXEVENT_MAP_INDEX, true);
if (info->answer == true)
{
COXEventManager::instance().CheckAnswer(true);
SendNoticeMap(LC_TEXT("O 입니다"), OXEVENT_MAP_INDEX, true);
}
else
{
COXEventManager::instance().CheckAnswer(false);
SendNoticeMap(LC_TEXT("X 입니다"), OXEVENT_MAP_INDEX, true);
}
if (LC_IsJapan())
{
SendNoticeMap("?????X?O ?????B", OXEVENT_MAP_INDEX, true);
}
else
{
SendNoticeMap(LC_TEXT("5초 뒤 틀리신 분들을 바깥으로 이동 시키겠습니다."), OXEVENT_MAP_INDEX, true);
}
flag++;
return PASSES_PER_SEC(5);
case 2:
COXEventManager::instance().WarpToAudience();
COXEventManager::instance().SetStatus(OXEVENT_CLOSE);
SendNoticeMap(LC_TEXT("다음 문제 준비해주세요."), OXEVENT_MAP_INDEX, true);
flag = 0;
break;
}
return 0;
}
bool COXEventManager::Quiz(unsigned char level, int timelimit)
{
if (m_vec_quiz.size() == 0) return false;
if (level > m_vec_quiz.size()) level = m_vec_quiz.size() - 1;
if (m_vec_quiz[level].size() <= 0) return false;
if (timelimit < 0) timelimit = 30;
int idx = number(0, m_vec_quiz[level].size()-1);
SendNoticeMap(LC_TEXT("문제 입니다."), OXEVENT_MAP_INDEX, true);
SendNoticeMap(m_vec_quiz[level][idx].Quiz, OXEVENT_MAP_INDEX, true);
SendNoticeMap(LC_TEXT("맞으면 O, 틀리면 X로 이동해주세요"), OXEVENT_MAP_INDEX, true);
if (m_timedEvent != NULL) {
event_cancel(&m_timedEvent);
}
OXEventInfoData* answer = AllocEventInfo<OXEventInfoData>();
answer->answer = m_vec_quiz[level][idx].answer;
timelimit -= 15;
m_timedEvent = event_create(oxevent_timer, answer, PASSES_PER_SEC(timelimit));
SetStatus(OXEVENT_QUIZ);
m_vec_quiz[level].erase(m_vec_quiz[level].begin()+idx);
return true;
}
bool COXEventManager::CheckAnswer(bool answer)
{
if (m_map_attender.size() <= 0) return true;
itertype(m_map_attender) iter = m_map_attender.begin();
itertype(m_map_attender) iter_tmp;
m_map_miss.clear();
int rect[4];
if (answer != true)
{
rect[0] = 892600;
rect[1] = 22900;
rect[2] = 896300;
rect[3] = 26400;
}
else
{
rect[0] = 896600;
rect[1] = 22900;
rect[2] = 900300;
rect[3] = 26400;
}
LPCHARACTER pkChar = NULL;
PIXEL_POSITION pos;
for (; iter != m_map_attender.end();)
{
pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);
if (pkChar != NULL)
{
pos = pkChar->GetXYZ();
if (pos.x < rect[0] || pos.x > rect[2] || pos.y < rect[1] || pos.y > rect[3])
{
pkChar->EffectPacket(SE_FAIL);
iter_tmp = iter;
iter++;
m_map_attender.erase(iter_tmp);
m_map_miss.insert(std::make_pair(pkChar->GetPlayerID(), pkChar->GetPlayerID()));
}
else
{
pkChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("정답입니다!"));
// pkChar->CreateFly(number(FLY_FIREWORK1, FLY_FIREWORK6), pkChar);
char chatbuf[256];
int len = snprintf(chatbuf, sizeof(chatbuf),
"%s %u %u", number(0, 1) == 1 ? "cheer1" : "cheer2", (DWORD)pkChar->GetVID(), 0);
// 리턴값이 sizeof(chatbuf) 이상일 경우 truncate되었다는 뜻..
if (len < 0 || len >= (int) sizeof(chatbuf))
len = sizeof(chatbuf) - 1;
// \0 문자 포함
++len;
TPacketGCChat pack_chat;
pack_chat.header = HEADER_GC_CHAT;
pack_chat.size = sizeof(TPacketGCChat) + len;
pack_chat.type = CHAT_TYPE_COMMAND;
pack_chat.id = 0;
TEMP_BUFFER buf;
buf.write(&pack_chat, sizeof(TPacketGCChat));
buf.write(chatbuf, len);
pkChar->PacketAround(buf.read_peek(), buf.size());
pkChar->EffectPacket(SE_SUCCESS);
++iter;
}
}
else
{
itertype(m_map_char) err = m_map_char.find(iter->first);
if (err != m_map_char.end()) m_map_char.erase(err);
itertype(m_map_miss) err2 = m_map_miss.find(iter->first);
if (err2 != m_map_miss.end()) m_map_miss.erase(err2);
iter_tmp = iter;
++iter;
m_map_attender.erase(iter_tmp);
}
}
return true;
}
void COXEventManager::WarpToAudience()
{
if (m_map_miss.size() <= 0) return;
itertype(m_map_miss) iter = m_map_miss.begin();
LPCHARACTER pkChar = NULL;
for (; iter != m_map_miss.end(); ++iter)
{
pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);
if (pkChar != NULL)
{
switch ( number(0, 3))
{
case 0 : pkChar->Show(OXEVENT_MAP_INDEX, 896300, 28900); break;
case 1 : pkChar->Show(OXEVENT_MAP_INDEX, 890900, 28100); break;
case 2 : pkChar->Show(OXEVENT_MAP_INDEX, 896600, 20500); break;
case 3 : pkChar->Show(OXEVENT_MAP_INDEX, 902500, 28100); break;
default : pkChar->Show(OXEVENT_MAP_INDEX, 896300, 28900); break;
}
}
}
m_map_miss.clear();
}
bool COXEventManager::CloseEvent()
{
if (m_timedEvent != NULL) {
event_cancel(&m_timedEvent);
}
itertype(m_map_char) iter = m_map_char.begin();
LPCHARACTER pkChar = NULL;
for (; iter != m_map_char.end(); ++iter)
{
pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);
if (pkChar != NULL)
pkChar->WarpSet(EMPIRE_START_X(pkChar->GetEmpire()), EMPIRE_START_Y(pkChar->GetEmpire()));
}
m_map_char.clear();
return true;
}
bool COXEventManager::LogWinner()
{
itertype(m_map_attender) iter = m_map_attender.begin();
for (; iter != m_map_attender.end(); ++iter)
{
LPCHARACTER pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);
if (pkChar)
LogManager::instance().CharLog(pkChar, 0, "OXEVENT", "LastManStanding");
}
return true;
}
bool COXEventManager::GiveItemToAttender(DWORD dwItemVnum, BYTE count)
{
itertype(m_map_attender) iter = m_map_attender.begin();
for (; iter != m_map_attender.end(); ++iter)
{
LPCHARACTER pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);
if (pkChar)
{
pkChar->AutoGiveItem(dwItemVnum, count);
LogManager::instance().ItemLog(pkChar->GetPlayerID(), 0, count, dwItemVnum, "OXEVENT_REWARD", "", pkChar->GetDesc()->GetHostName(), dwItemVnum);
}
}
return true;
}
Cod: Selectaţi tot
quest oxevent_manager begin
state start begin
when login with pc.get_map_index() == 113 begin
addimage(20, 12, "ox.tga")
say("")
say("")
say("")
say("")
say_title("Competitia OX")
say("")
say("Aici se aduna cele mai stralucite minti din cele")
say("trei regate pentru concursul de inteligenta.")
say("in timpul acestui test, mai multe intrebari cu")
say("privire la orice subiect va fi afisate.")
say("Deplasati-va la O, daca credeti ca raspunsul,")
say("este adevarat iar daca este fals la X.")
say("Doar cei mai buni vor fi premiati!")
say("")
end
when letter with pc.get_map_index()==113 begin
send_letter("Paraseste OX")
end
when button or info begin
say_title("Concursul OX")
say("Salut,")
say("Eu te pot teleporta in prima harta.")
say("")
say_reward("Vrei sa parasesti concursul OX?")
local s=select("Da", "Nu")
if s==2 then
send_letter("Paraseste OX")
return
end
local empire = pc.get_empire()
if empire== 1 then
pc.warp(433300, 219600)
elseif empire == 2 then
pc.warp(431500, 209200)
elseif empire == 3 then
pc.warp(439800, 211000)
end
end
when 20011.chat."Concursul OX" begin
say_title("Uriel")
say("Hey ,tu de acolo")
say("Da, da tu! Vino pana aici!")
say("Hai sa iti arat ceva interesant")
say("Concursul OX. Eu te pot duce aici")
say("si poti castiga premii interesante!")
wait()
if game.get_event_flag("oxevent_status") == 0 then
say_title("Uriel")
say("Cand concursul va incepe eu te voi lasa")
say("sa intri si sa le dovedesti ce stii tu.")
say("Fii atent ....curand va incepe!")
elseif game.get_event_flag("oxevent_status") == 1 then
say_title("Uriel")
say("Vrei sa participi?")
say("Aaa eram sa uit...poti sta si ca spectator...")
local s = select("Particip", "Spectator", "Renunt")
if s == 1 then
say_title("Uriel")
say("Chiar vrei sa participi?")
say("Okay - Hai sa mergem.")
wait()
pc.warp(896500, 24600)
elseif s == 2 then
say_title("Uriel")
say("Doar Spectator?")
say("Okay - eu iti respect decizia.")
say("")
wait()
pc.warp(896300, 28900)
end
elseif game.get_event_flag("oxevent_status") == 2 then
say_title("Uriel")
say("Concursul OX a inceput deja")
say("si nu mai poti intra!")
say("Dar fii pregatit ca oricand poate")
say("sa inceapa un alt Concurs OX.")
say("Acum te pot lasa doar ca spectator!")
say("Vrei sa intri ca spectator?")
local s = select("Spectator", "Renunt")
if s == 1 then
say_title("Uriel")
say("Hmm, Hmm, vrei sa te uiti?")
say("Bine eu te voi lasa sa te uiti!")
say("")
wait()
pc.warp(896300, 28900)
end
end
end
when 20358.chat."GM: OX-Panel" with pc.is_gm() begin
local stat = oxevent.get_status()
if stat == 0 then
say_title("Concursul OX")
say("incepe OX?")
local s = select("Da", "Nu")
if s==2 then return end
local v = oxevent.open()
if v == 0 then
say_title("Concursul OX")
say("Nu am putut incarca oxquiz.lua .")
return
elseif v == 1 then
say_title("Concursul OX")
say("Concursul OX a inceput cu succes.")
server_timer("automatic1", 10*60, 113)
notice_all("Evenimentul OX a inceput pe Gordin Metin2!")
notice_all("Pentru a intra, duceti-va la Uriel.")
else
say("Error1")
return
end
elseif stat == 1 then
say_title("Concursul OX")
say("Usile inca sunt deschise.")
say("Jucatori intrati: "..oxevent.get_attender().." ")
say("")
local s = select("inchide intrarea", "inapoi")
if s == 1 then
notice_all("Portile OX au fost inchise.")
notice_all("Pregatiti-va !")
oxevent.close()
end
elseif stat == 2 then
say_title("Concursul OX")
say("Obtiuni:")
local s = select("intrebari OX", "Premiu OX", "inchide OX", "Anuleaza OX", "inapoi")
if s == 1 then
local v = oxevent.quiz(1, 80)
if v == 0 then
say_title("Concursul OX")
say("Error2")
return
else
say_title("Concursul OX")
say("intrebare adresata cu succes!")
return
end
elseif s == 2 then
say_title("Concursul OX")
say("Te rugam sa pui codul item-ului.")
local item_vnum = input()
say_title("Concursul OX")
say("Introduceti cantitatea")
local item_count = input()
oxevent.give_item(item_vnum, item_count)
say_title("Concursul OX")
say(" "..oxevent.get_attender().." Castigatorii au primit "..item_count.."x")
say(item_name(item_vnum).." emis.")
notice_all("Premiu: "..item_count.."x "..item_name(item_vnum))
elseif s == 3 then
oxevent.end_event()
notice_all("Evenimentul OX a luat sfarsit pe Gordin Metin2.")
notice_all("Toti jucatorii vor fi teleportati din aceasta harta ")
setskin(0)
elseif s == 4 then
say_title("Concursul OX")
say("Renuntarea la OX poate crea probleme.")
say("Sigur vrei sa faci asta?")
local s = select("Da", "Nu")
if s == 1 then
oxevent.end_event_force()
end
elseif s == 5 then
return
end
elseif stat == 3 then
say_title("Concursul OX")
say("Acum este adresata o intrebare.")
else
say_title("Concursul OX")
say("Error4")
return
end
end
end
end


