Пример #1
0
DWORD serverThread(void* ptr) {
#else
void* serverThread(void *ptr) {
#endif
	char buffer[2048];
	int length;
	int result;

	do {
		int ms = qbTickCount();
		
		LOCK(lock);
		length=recvPacket(buffer);
		if(length>0) {
			result=processServerPacket((unsigned char *)buffer,length);
			cs->timestamp=_GetTickCount();
		} else {
			result=0;
		}
		UNLOCK(lock);

		int elapsed = qbTickCount() - ms;
		throttle( elapsed, QB_MIN_FRAMETIME );
		
	} while(result==0 && ! kill_server_thread);
	if(online) {
		qbLog("*** Server Disconnected ***");
	}
	online=false;
	return 0;
}
Пример #2
0
void Client::processServerPacket(const QString &cmd){
	processServerPacket(cmd.toUtf8());
}
Пример #3
0
Client::Client(QObject *parent, const QString &filename)
	:QObject(parent), is_discard_action_refusable(true),
	status(NotActive), alive_count(1), swap_pile(0)
{

	ClientInstance = this;
	is_game_over = false;

	callbacks[BP::CheckVersion] = &Client::checkVersion;

	/*oldcallbacks["roomBegin"] = &Client::roomBegin;
	oldcallbacks["room"] = &Client::room;
	oldcallbacks["roomEnd"] = &Client::roomEnd;
	oldcallbacks["roomCreated"] = &Client::roomCreated;
	oldcallbacks["roomError"] = &Client::roomError;
	oldcallbacks["hallEntered"] = &Client::hallEntered;*/

	callbacks[BP::Setup] = &Client::setup;
	callbacks[BP::NetworkDelayTest] = &Client::networkDelayTest;
	callbacks[BP::AddPlayer] = &Client::addPlayer;
	callbacks[BP::RemovePlayer] = &Client::removePlayer;
	callbacks[BP::StartInXSeconds] = &Client::startInXSeconds;
	callbacks[BP::ArrangeSeats] = &Client::arrangeSeats;
	callbacks[BP::Warn] = &Client::warn;

	callbacks[BP::StartGame] = &Client::startGame;
	callbacks[BP::GameOver] = &Client::gameOver;

	callbacks[BP::HpChange] = &Client::hpChange;
	callbacks[BP::KillPlayer] = &Client::killPlayer;
	callbacks[BP::RevivePlayer] = &Client::revivePlayer;
	callbacks[BP::AskForCardShow] = &Client::showCard;
	callbacks[BP::SetMark] = &Client::setMark;
	callbacks[BP::DoFilter] = &Client::doFilter;//deprecated?
	callbacks[BP::Log] = &Client::log;
	callbacks[BP::Speak] = &Client::speak;
	callbacks[BP::AcquireSkill] = &Client::acquireSkill;
	callbacks[BP::AttachSkill] = &Client::attachSkill;
	callbacks[BP::DetachSkill] = &Client::detachSkill;
	callbacks[BP::MoveFocus] = &Client::moveFocus;
	callbacks[BP::SetEmotion] = &Client::setEmotion;
	callbacks[BP::SkillInvoke] = &Client::skillInvoked;
	callbacks[BP::ShowAllCards] = &Client::askForGongxin;
	callbacks[BP::AskForGongxin] = &Client::askForGongxin;
	callbacks[BP::AddHistory] = &Client::addHistory;
	callbacks[BP::Animate] = &Client::animate;
	callbacks[BP::JudgeResult] = &Client::judgeResult;
	callbacks[BP::SetScreenName] = &Client::setScreenName;
	callbacks[BP::SetFixedDistance] = &Client::setFixedDistance;
	callbacks[BP::Transfigure] = &Client::transfigure;
	//callbacks[BP::Jilei] = &Client::jilei;
	callbacks[BP::CardLock] = &Client::cardLock;
	callbacks[BP::Pile] = &Client::pile;

	callbacks[BP::UpdateStateItem] = &Client::updateStateItem;

	callbacks[BP::PlaySkillEffect] = &Client::playSkillEffect;
	callbacks[BP::PlayCardEffect] = &Client::playCardEffect;
	callbacks[BP::PlayAudio] = &Client::playAudio;

	callbacks[BP::GetCard] = &Client::getCards;
	callbacks[BP::LoseCard] = &Client::loseCards;
	callbacks[BP::ClearPile] = &Client::resetPiles;
	callbacks[BP::SetPileNumber] = &Client::setPileNumber;
	callbacks[BP::SetStatistics] = &Client::setStatistics;
	callbacks[BP::SetCardFlag] = &Client::setCardFlag;
	callbacks[BP::SetPlayerProperty] = &Client::setPlayerProperty;

	// interactive methods
	interactions[BP::AskForGeneral] = &Client::askForGeneral;
	interactions[BP::AskForPlayerChosen] = &Client::askForPlayerChosen;
	interactions[BP::AskForAssign] = &Client::askForAssign;
	interactions[BP::AskForDirection] = &Client::askForDirection;
	interactions[BP::AskForExchange] = &Client::askForExchange;
	interactions[BP::AskForSingleWine] = &Client::askForSingleWine;
	interactions[BP::AskForGuanxing] = &Client::askForGuanxing;
	interactions[BP::AskForGongxin] = &Client::askForGongxin;
	interactions[BP::AskForYiji] = &Client::askForYiji;
	interactions[BP::Activate] = &Client::activate;
	interactions[BP::AskForDiscard] = &Client::askForDiscard;
	interactions[BP::AskForSuit] = &Client::askForSuit;
	interactions[BP::AskForKingdom] = &Client::askForKingdom;
	interactions[BP::AskForCard] = &Client::askForCard;
	interactions[BP::AskForUseCard] = &Client::askForUseCard;
	interactions[BP::SkillInvoke] = &Client::askForSkillInvoke;
	interactions[BP::AskForChoice] = &Client::askForChoice;
	interactions[BP::AskForNullification] = &Client::askForNullification;
	interactions[BP::AskForCardShow] = &Client::askForCardShow;
	interactions[BP::AskForAG] = &Client::askForAG;
	interactions[BP::AskForPindian] = &Client::askForPindian;
	interactions[BP::AskForCardChosen] = &Client::askForCardChosen;
	interactions[BP::AskForOrder] = &Client::askForOrder;
	interactions[BP::AskForRole3v3] = &Client::askForRole3v3;
	interactions[BP::AskForSurrender] = &Client::askForSurrender;

	callbacks[BP::FillAG] = &Client::fillAG;
	callbacks[BP::TakeAG] = &Client::takeAG;
	callbacks[BP::ClearAG] = &Client::clearAG;

	// 3v3 mode & 1v1 mode
	callbacks[BP::FillGenerals] = &Client::fillGenerals;
	callbacks[BP::AskForGeneral3v3] = &Client::askForGeneral3v3;
	callbacks[BP::AskForGeneral1v1] = &Client::askForGeneral3v3;
	callbacks[BP::TakeGeneral] = &Client::takeGeneral;
	callbacks[BP::StartArrange] = &Client::startArrange;
	callbacks[BP::RecoverGeneral] = &Client::recoverGeneral;
	callbacks[BP::RevealGeneral] = &Client::revealGeneral;

	m_isUseCard = false;

	Self = new ClientPlayer(this);
	Self->setScreenName(Config.UserName);
	Self->setProperty("avatar", Config.UserAvatar);
	connect(Self, SIGNAL(phase_changed()), this, SLOT(clearTurnTag()));
	connect(Self, SIGNAL(role_changed(QString)), this, SLOT(notifyRoleChange(QString)));

	players << Self;

	if(!filename.isEmpty()){
		socket = NULL;
		recorder = NULL;

		replayer = new Replayer(this, filename);
		connect(replayer, SIGNAL(command_parsed(QString)), this, SLOT(processServerPacket(QString)));
	}else{
		socket = new ClientSocket;
		socket->setParent(this);
		socket->listen();

		recorder = new Recorder(this);

		connect(socket, SIGNAL(message_got(QByteArray)), recorder, SLOT(record(QByteArray)));
		connect(socket, SIGNAL(message_got(QByteArray)), this, SLOT(processServerPacket(QByteArray)));
		connect(socket, SIGNAL(error_message(QString)), this, SIGNAL(error_message(QString)));
		socket->connectToHost();

		replayer = NULL;
	}

	lines_doc = new QTextDocument(this);

	prompt_doc = new QTextDocument(this);
	prompt_doc->setTextWidth(350);
	prompt_doc->setDefaultFont(QFont("SimHei"));
}