Problema ox

Înainte de a posta o problemă, caută în acest forum și poate găsești rezolvare.
Închis
Avatar utilizator
Pietonu'
Nivel 7

Nivel 7
Mesaje: 1351
Membru din: 18 Mar 2015, 13:47
Regat: Chunjo
Aprecieri: 3  
Mulţumiri: 52  
Medalii

Salut am si eu o problema la evenimentul OX consta in felu urmator dau drumu la ox/inchid portile/pun intrebare,cand sa dau premiu primesc instant kick X_X ,am schimbat questu,la fel face, am bagat si din alta sursa OXevent.cpp am compilat degeaba la fel face tin sa mentionez ca am bagat peste 8 questuri (le-am si sters pe cele existente din object)
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;
}

asta e OxEvent.cpp

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
asta e questu ;) daca aveti vre-o rezolvare va rog frumos ^:)^
Imagine
Afișează semnătura
Avatar utilizator
Joey
Fost Moderator

Fost Moderator
Mesaje: 1340
Membru din: 09 Noi 2013, 14:58
Regat: Jinno
Aprecieri: 30  
Mulţumiri: 49  
Medalii

Verifica cu alt client, e posibil sa fie din client.

[ Mesaj scris via Windows Smartphone ] Imagine
Imagine
Afișează semnătura
Avatar utilizator
Pietonu'
Nivel 7

Nivel 7
Mesaje: 1351
Membru din: 18 Mar 2015, 13:47
Regat: Chunjo
Aprecieri: 3  
Mulţumiri: 52  
Medalii

pai am 2 client-uri dar la fel face pe amn2 :-? altu nu am,tin sa mentionez ca am compilat 2 "launchere" si pnm nu stiu daca are legatura clientu cu PREMIU OX =))
Imagine
Afișează semnătura
Avatar utilizator
Pietonu'
Nivel 7

Nivel 7
Mesaje: 1351
Membru din: 18 Mar 2015, 13:47
Regat: Chunjo
Aprecieri: 3  
Mulţumiri: 52  
Medalii

Mutat la probleme rezolvate,e mult de explicat deci cum m-am descurcat eu se pot descurca si altii ;)
Imagine
Afișează semnătura
Închis

Înapoi la “Probleme rezolvate”

  • Informaţie
  • Cine este conectat

    Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 22 vizitatori