void Player::ResponseLogin(bool success, int pid, float x, float y, float z, const char* name) { if(success) { mPlayerId = pid; mPosX = x; mPosY = y; mPosZ = z; mVecX = rand() + pid*1 % 100 - 50; mVecY = rand() + pid*2 % 100 - 50; mVecZ = rand() + pid*3 % 100 - 50; mPlayerName = name; std::stringstream reslog; reslog << "LOG: Player Login : PID[" << mPlayerId << "], X[" << mPosX << "], Y[" << mPosY << "], Z[" << mPosZ << "], NAME[" << mPlayerName << "]" << std::endl; std::string logString = reslog.str(); EVENT_LOG(logString.c_str(), 0); std::cout << logString; DoSyncAfter(HEART_BEAT, GetSharedFromThis<Player>(), &Player::OnTick); } else { //이름 넣어서 새로가입 RequestSignIn(mPlayerName); } }
void Player::OnTick() { if (!IsAlive()) return; /// 랜덤으로 이벤트를 발생시켜보기 (예: 다른 모든 플레이어에게 버프 주기) if (rand() % 100 == 0) ///< 1% 확률 { int buffId = mPlayerId * 100; int duration = (rand() % 3 + 2) * 1000; //GCE 예. (lock-order 귀찮고, 전역적으로 순서 보장 필요할 때) auto playerEvent = std::make_shared<AllPlayerBuffEvent>(buffId, duration); GCEDispatch(playerEvent, &AllPlayerBuffEvent::DoBuffToAllPlayers, mPlayerId); } //TODO: AllPlayerBuffDecay::CheckBuffTimeout를 GrandCentralExecuter를 통해 실행 if (mHeartBeat > 0) DoSyncAfter(mHeartBeat, GetSharedFromThis<Player>(), &Player::OnTick); }
void Player::OnTick() { if (!IsAlive() || !mSession->IsConnected()) return; if( LTickCount - mLastTick > TIME_ALLOW_WITHOUT_ACT ){ mSession->DisconnectRequest( DR_TIMEOUT ); return; } /// 랜덤으로 이벤트를 발생시켜보기 (예: 다른 모든 플레이어에게 버프 주기) if (rand() % 100 == 0) ///< 1% 확률 { int buffId = mPlayerId * 100; int duration = (rand() % 3 + 2) * 1000; //GCE 예. (lock-order 귀찮고, 전역적으로 순서 보장 필요할 때) auto playerEvent = std::make_shared<AllPlayerBuffEvent>(buffId, duration); GCEDispatch(playerEvent, &AllPlayerBuffEvent::DoBuffToAllPlayers, mPlayerId); } //TODO: AllPlayerBuffDecay::CheckBuffTimeout를 GrandCentralExecuter를 통해 실행 auto timeoutEvent = std::make_shared<AllPlayerBuffDecay>(); GCEDispatch( timeoutEvent, &AllPlayerBuffDecay::CheckBuffTimeout ); if (mHeartBeat > 0) DoSyncAfter(mHeartBeat, GetSharedFromThis<Player>(), &Player::OnTick); }
void Player::ResponseLoad(int pid, float x, float y, float z, bool valid, wchar_t* name, wchar_t* comment) { mPlayerId = pid; mPosX = x; mPosY = y; mPosZ = z; mIsValid = valid; wcscpy_s(mPlayerName, name); wcscpy_s(mComment, comment); //TODO: 아래는 나중에 로그로... wprintf_s(L"PID[%d], X[%f] Y[%f] Z[%f] NAME[%s] COMMENT[%s]\n", mPlayerId, mPosX, mPosY, mPosZ, mPlayerName, mComment); MyPacket::LoginResult loginResult; loginResult.set_playerid(mPlayerId); loginResult.set_playername("TEST_LogonSuccess"); MyPacket::Position* pos = loginResult.mutable_playerpos(); pos->set_x(mPosX); pos->set_y(mPosY); pos->set_z(mPosZ); mSession->SendRequest(MyPacket::PKT_SC_LOGIN, loginResult); DoSyncAfter(HEART_BEAT, &Player::OnTick); }
void Player::OnTick() { if(!IsValid()) return; Move(); RandomChat(); DoSyncAfter(HEART_BEAT, GetSharedFromThis<Player>(), &Player::OnTick); }
void Player::Start(int heartbeat) { mIsAlive = true; mHeartBeat = heartbeat; /// ID 발급 및 플레이어 맵에 등록 mPlayerId = GPlayerManager->RegisterPlayer(GetSharedFromThis<Player>()); /// 생명 불어넣기 ㄱㄱ DoSyncAfter(0, GetSharedFromThis<Player>(), &Player::OnTick); }
void Player::OnTick() { if (!IsValid()) return; // lock order 테스트 // FastSpinlock lock1(LO_BUSINESS_CLASS); // lock1.EnterLock(); // printf("tick: use count %d\n", GetThisPtr().use_count()); // lock1.LeaveLock(); DoSyncAfter(HEART_BEAT, &Player::OnTick); }