데미지 판정

Eunho Bae·2022년 6월 26일

Protocol.proto

enum MsgId {
  ...
  S_CHANGE_HP = 8;
}

message S_ChangeHp {
  int32 objectId = 1;
  int32 hp = 2;
}

message StatInfo {
  int32 level = 1;
  int32 hp = 2;
  int32 maxHp = 3;
  int32 attack = 4;
  float speed = 5;
  int32 totalExp = 6;
}

Server::Arrow

	public override void Update()
		{
        	...
            
			else
			{
				GameObject target = Room.Map.Find(destPos);
				if (target != null)
				{
					target.OnDamaged(this, Data.damage + Owner.Stat.Attack);
				}

Server::GameObject

	public virtual void OnDamaged(GameObject attacker, int damage)
		{
			Stat.Hp = Math.Max(Stat.Hp - damage, 0);

			S_ChangeHp changePacket = new S_ChangeHp();
			changePacket.ObjectId = Id;
			changePacket.Hp = Stat.Hp;
			Room.Broadcast(changePacket);

			if(Stat.Hp <= 0)
            {
				OnDead(attacker);
            }
		}

Client::PacketHandler

public static void S_ChangeHpHandler(PacketSession session, IMessage packet)
	{
		S_ChangeHp changePacket = packet as S_ChangeHp;

		GameObject go = Managers.Object.FindById(changePacket.ObjectId);
		if (go == null)
			return;

		CreatureController cc = go.GetComponent<CreatureController>();
		if (cc != null)
		{
			cc.Stat.Hp = changePacket.Hp;
			// TODO : UI 체력바 깎기
		}
	}

서버 Program에서 무한루프를 돌며 게임 룸의 Update() 함수를 호출해주는데, Arrow의 Update() 함수가 호출되면서 GameObject의 OnDamaged 함수가 호출된다. 화살을 맞은 영역의 게임 오브젝트의 Stat의 hp를 깎은 다음, HP가 바뀌었다는 S_ChangeHp 패킷을 룸에 존재하는 모든 플레이어들에게 뿌려준다.

profile
개인 공부 정리

0개의 댓글