하아찡

[C++] 서버에서 아이템 드랍 처리 본문

C++/이것저것서버테스트

[C++] 서버에서 아이템 드랍 처리

하아찡 2025. 3. 22. 20:47

언리얼 버전 5.5.3

서버언어 C++로 구성했습니다.


이전에 아이템 등록 및 몬스터 등록을 했습니다.

 

이제 해당 몬스터를 잡았을때 서버에서 드랍처리를 할 예정입니다.

 


일단 실행화면부터 보시죠

 

실행화면

 


몬스터를 잡았을때 관리하는 코드

if (bMonsterDie) {
	//LOG("DeSpawnObject : " << DeSpawnObjectIDs.size() << " SpawnObject : " << SpawnIDs.size());
	int exp = 0;
	int gold = 0;
	Protocol::S_DESPAWN despawnPkt;
	for (auto objectID : DeSpawnObjectIDs) {
		MonsterRef monster = _monsters[objectID];
        Protocol::DespawnList* despawn = despawnPkt.add_despawns();
        despawn->set_id(objectID);
        
        // 몬스터 드랍 처리
        for (auto drop : monster->DropTable) {
            
            ItemData* item = ItemUtils::GetItem(drop.code);
            if (item) {
                // drop.rate 아이템 드랍확률
                float GetRand = ItemUtils::RandomFloat(); // 독립시행
                if (GetRand <= drop.rate) {
                    // 아이템 드랍 패킷저장
                    despawn->add_itemcode(drop.code);
                    LOG("Drop Object : " << objectID << " ItemCode : " << drop.code << " Drop Rate : " << drop.rate << " ItemName : " << item->Name);
                }
            }
        }
        
		gold += monster->objectInfo->gold();	// 골드 모아서 전달
		exp += monster->objectInfo->curexp();	// 경험치 모아서 전달
		_monsters.erase(objectID);				// 서버에서 해당 몬스터를 가지고 있지않음.
	}
	SendBufferRef desendBuffer = ClientPacketHandler::MakeSendBuffer(despawnPkt);
	MyRoom->DoAsync(&Room::Broadcast, desendBuffer, NotObjectID);

	MonsterSpawn(SpawnIDs);				//스폰 대기열 추가

	PlayerLevel::AddExp(player, exp);
	PlayerGold::UpdateGold(player, gold, LOG_GOLD_GET_MONSTER);
}

 

해당 공격에 죽은 몬스터가 있는지 확인한 후 해당 몬스터에 등록된 아이템 테이블을 가서 아이템 코드와 같이 확률적으로 획득하게 만듭니다.

 

그리고 확률로 획득된 아이템이 있을경우 해당 몬스터 디스폰 패킷과 같이 획득된 아이템정보를 전달합니다.

 

디스폰 패킷과 같이 보내주는 이유를 설명하기전에 기존에 디스폰 패킷과 현재 작업을하면서 디스폰 패킷 구조가 변경됐습니다.

 

변경전

message S_DESPAWN
{
	repeated uint64 despawns = 1;
}

 

 

변경후

message DespawnList
{
    uint64 id = 1;
    repeated int32 itemcode = 2;
}

message S_DESPAWN
{
	repeated DespawnList despawns = 1;
}

 

위와 같이 디스폰 패킷이 변경됐는데,

기존 디스폰은 디스폰을할때 해당 objectID값만 전달해줬습니다. 근데 이제는 몬스터가 죽을때마다 드랍된 아이템이 있는지를 알아야하고, 어떤 objectID가 죽었을때 드랍됐는지를 구분하기위해서 ObjectID값과 ItemCode값들을 묶어서 보낼수있게 DespawnList를 만들어서 보내게 됐습니다.

 

 

반응형