diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index de785f4..40d6131 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -119,6 +119,20 @@ void Entity::BroadcastDeleteState(Room* room) }); } +void Entity::RemoveFromAroundPlayers(Room* room) +{ + std::set tmp_grids; + room->grid_service->GetAllCells(room, grid_id_, tmp_grids); + room->grid_service->TouchAllLayerHumanList + ( + room->GetRoomIdx(), + tmp_grids, + [this] (Human* hum, bool& stop) + { + hum->RemovePartObjects(this); + }); +} + void Entity::AddEntityCollider(ColliderComponent* collider) { colliders_.push_back(collider); diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index d34cb8a..1df714a 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -38,6 +38,7 @@ class Entity bool TestCollisionEx(Room* room, const a8::Vec2& aabb_pos, AabbCollider& aabb_box); void BroadcastFullState(Room* room); void BroadcastDeleteState(Room* room); + void RemoveFromAroundPlayers(Room* room); void AddEntityCollider(ColliderComponent* collider); a8::Vec2 GetPos() { return pos_; }; void SetPos(a8::Vec2 pos) { pos_ = pos; } diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index f6a05eb..ad8037b 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -230,7 +230,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) } for (size_t idx : hum->chged_cars_) { if (idx < room->frame_event.chged_cars_.size()) { - Human* target = room->frame_event.chged_hps_[idx]; + Human* target = room->frame_event.chged_cars_[idx]; if (hum->CanSee(target)) { auto p = msg->add_chged_property_list(); p->set_obj_id(target->GetEntityUniId()); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f772ac9..713fe5b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4372,14 +4372,18 @@ void Human::DoGetOnWithLoot(Loot* entity) if (GetCar()) { GetCar()->GetDown(this); } - car_ = room->CreateCar( - this, - entity->GetEntityUniId(), - item_meta, - GetPos() - ); - car_->GetOn(this); + Car* car = room->CreateCar( + this, + entity->GetEntityUniId(), + item_meta, + GetPos() + ); + car->GetOn(this); + room->TakeOnCarObject(entity->GetEntityUniId()); room->NotifyUiUpdate(); + #ifdef DEBUG + a8::XPrintf("DoGetOnWithLoot uniid:%d car_uniid:%d\n", {car->GetEntityUniId(), car->car_uniid}); + #endif } void Human::DoGetOnWithCar(Car* car) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 97b2c32..b13062b 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -59,6 +59,11 @@ void Player::InternalUpdate(int delta_time) if (HasBuffEffect(kBET_Fly)) { SetPos(room->plane.curr_pos); room->grid_service->MoveHuman(this); + #ifdef DEBUG + if (GetCar() && GetCar()->IsDriver(this)) { + GetCar()->SyncPos(); + } + #endif } if (HasSpecMove()) { _UpdateSpecMove(); @@ -107,6 +112,9 @@ void Player::InternalUpdate(int delta_time) if (get_down) { UpdateGetDown(); } + if (get_on) { + UpdateGetOn(); + } if (shot_start || shot_hold) { UpdateShot(); } @@ -374,6 +382,12 @@ void Player::UpdateGetDown() get_down = false; } +void Player::UpdateGetOn() +{ + DoGetOn(get_on); + get_on = 0; +} + void Player::UpdateUseSkill() { if (HasBuffEffect(kBET_Vertigo)) { @@ -1089,6 +1103,9 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) if (msg.has_get_down()) { get_down = msg.get_down(); } + if (msg.has_get_on()) { + get_on = msg.get_on(); + } if (msg.has_jump()) { jump = true; } diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 00b7ec0..820a4f6 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -60,6 +60,7 @@ class Player : public Human bool use_skill = false; bool get_down = false; + int get_on = 0; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids; @@ -79,6 +80,7 @@ class Player : public Human void UpdateEmote(); void UpdateJump(); void UpdateGetDown(); + void UpdateGetOn(); void UpdateUseSkill(); void Shot(); void ProcInteraction(); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index add242d..8296d06 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -128,14 +128,14 @@ void Room::Update(int delta_time) elapsed_time_ += delta_time; while (elapsed_time_ >= 50) { - #ifdef DEBUG + #ifdef DEBUG1 long long begin_tick = a8::XGetTickCount(); long long end_tick = a8::XGetTickCount(); #endif if (GetFrameNo() % 2 == 0) { UpdateGas(); } - #ifdef DEBUG + #ifdef DEBUG1 end_tick = a8::XGetTickCount(); if (a8::XGetTickCount() - begin_tick > 1000) { abort(); @@ -145,7 +145,7 @@ void Room::Update(int delta_time) for (auto& pair : moveable_hash_) { pair.second->Update(50); } - #ifdef DEBUG + #ifdef DEBUG1 end_tick = a8::XGetTickCount(); if (a8::XGetTickCount() - begin_tick > 1000) { abort(); @@ -155,7 +155,7 @@ void Room::Update(int delta_time) if (GetFrameNo() % 2 == 0) { SyncFrameData(); } - #ifdef DEBUG + #ifdef DEBUG1 end_tick = a8::XGetTickCount(); if (a8::XGetTickCount() - begin_tick > 1000) { abort(); @@ -553,7 +553,8 @@ Car* Room::CreateCar(Human* driver, MetaData::Equip* item_meta, const a8::Vec2& pos) { - Car* car = EntityFactory::Instance()->MakeCar(car_uniid); + Car* car = EntityFactory::Instance()->MakeCar(AllocUniid()); + car->car_uniid = car_uniid; car->meta = item_meta; car->room = this; car->SetPos(pos); @@ -564,8 +565,8 @@ Car* Room::CreateCar(Human* driver, car->Initialize(); AddToEntityHash(car); grid_service->AddCar(car); - car->BroadcastFullState(this); car->RefreshView(); + car->BroadcastFullState(this); return car; } @@ -612,6 +613,7 @@ void Room::RemoveObjectLater(RoomEntity* entity) break; case ET_Car: { + entity->RemoveFromAroundPlayers(entity->room); entity->BroadcastDeleteState(entity->room); entity->room->grid_service->DelCar((Car*)entity); entity->room->RemoveFromMoveableHash((Car*)entity);