public virtual void OnDead(GameObject attacker) { // 죽자마자 방을 나가버려서 // Room이 null로 밀렸는데 JobQueue때문에 실행시점이 늦춰져서 터지는 경우가 있다.. S_Die diePacket = new S_Die(); diePacket.ObjectId = Id; diePacket.AttackerId = attacker.Id; // 내가 나를 떄리는 경우도 있다 (낙하) Room.Broadcast(diePacket); // 죽었음을 알린다. // 실행시점이 뒤로 밀리면서 문제들이 생김 GameRoom room = Room; // room.Push(room.LeaveGame, Id);// 실행 시점이 코드 순서대로임을 보장 못함 // 그래서 그냥 쓴다, 이래도 되는 이유는 OnDead 호출 자체가 // JobSerializer에 의해서 되고 있기 떄문에 -> 이미 쓰레드를 잡아서 일을 하는 도중에 일이 추가되는것뿐임. // 너무 무거운 작업이 아니라면 괜찮지 않나 room.LeaveGame(Id); // 방을 나감 // 죽은 후 초기화 처리 Stat.Hp = Stat.MaxHp; PosInfo.State = CreatureState.Idle; PosInfo.MoveDir = MoveDir.Down; PosInfo.PosX = 0; PosInfo.PosY = 0; // 재입장, 방을 나가면 Room이 null처리 되니깐.. 위에서 미리 빼놨다 씀 room.EnterGame(this); }
public virtual void OnDead(GameObject attacker) { if (Room == null) { return; } S_Die diePacket = new S_Die(); diePacket.Objectid = Id; diePacket.Attackerid = attacker.Id; Room.BroadCast(diePacket); GameRoom room = Room; room.LeaveGame(Id); Stat.Hp = Stat.MaxHp; PosInfo.State = CreatureState.Idle; PosInfo.Movedir = MoveDir.Down; PosInfo.PosX = 0; PosInfo.PosY = 0; room.EnterGame(this); }
// 오브젝트 소멸 public virtual void OnDead(GameObject attecker) { if (this.Room == null) { return; } S_Die diePacket = new S_Die(); diePacket.ObjectId = Id; // 내가 죽음 diePacket.AttackerId = attecker.Id; // 저놈이 나죽임 this.Room.Broadcast(CellPos, diePacket); // Id가 죽었대!! // 리스폰 GameRoom room = this.Room; room.LeaveGame(Id); Stat.Hp = Stat.MaxHp; PosInfo.State = CreatureState.Idle; PosInfo.MoveDir = MoveDir.Down; room.EnterGame(this, randomPos: true); }