diff --git a/server/gameserver/loot.h b/server/gameserver/loot.h index f0701e8..00f2ae3 100644 --- a/server/gameserver/loot.h +++ b/server/gameserver/loot.h @@ -16,6 +16,7 @@ class Loot : public Entity MetaData::Equip* meta = nullptr; int item_id = 0; int count = 0; + bool pickuped = false; Loot(); virtual ~Loot() override; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 762347e..d4befea 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -11,6 +11,7 @@ #include "bullet.h" #include "obstacle.h" #include "building.h" +#include "loot.h" const int F_del_objids = 2; const int F_full_objects = 3; @@ -59,7 +60,7 @@ void Player::Update(int delta_time) if (moving) { UpdateMove(); } - if (updated_times % 2 == 0) { + if (room->frame_no % 2 == 0) { if (shot_start || shot_hold) { UpdateShot(); } @@ -169,7 +170,7 @@ void Player::ProcInteraction() break; case ET_Loot: { - + LootInteraction((Loot*)entity); } break; default: @@ -202,9 +203,19 @@ void Player::ObstacleInteraction(Obstacle* entity) pair.second->last_collision_door = nullptr; } } + } else { } } +void Player::LootInteraction(Loot* entity) +{ + if (entity->pickuped) { + return; + } + entity->pickuped = true; + room->AddDeletedObject(entity->entity_uniid); +} + void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) { bool has_move_dir = msg.has_move_dir(); diff --git a/server/gameserver/player.h b/server/gameserver/player.h index aa82429..a270574 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -14,6 +14,7 @@ namespace cs } class Room; +class Loot; class Obstacle; class Player : public Human { @@ -53,6 +54,7 @@ class Player : public Human void Shot(); void ProcInteraction(); void ObstacleInteraction(Obstacle* entity); + void LootInteraction(Loot* entity); void _CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg); void _CMDropItem(f8::MsgHdr& hdr, const cs::CMDropItem& msg); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index b7fcf17..ff9f734 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -19,18 +19,19 @@ const int ANDROID_NUM = 0; void Room::Update(int delta_time) { elapsed_time_ += delta_time; - ++frame_no; while (elapsed_time_ >= 50) { - ResetFrameData(); - int i = 0; + if (frame_no % 2 == 0) { + ResetFrameData(); + } for (auto& pair : moveable_hash_) { pair.second->Update(50); pair.second->updated_times++; - ++i; - assert(i < 1000); } - ClearDeletedObjects(); - ProcAddedObjects(); + if (frame_no % 2 == 0) { + ClearDeletedObjects(); + ProcAddedObjects(); + } + ++frame_no; elapsed_time_ -= 50; } } @@ -372,6 +373,10 @@ void Room::ClearDeletedObjects() uniid_hash_.erase(entity->entity_uniid); moveable_hash_.erase(entity->entity_uniid); } + for (auto& pair : human_hash_) { + pair.second->new_objects.erase(entity); + pair.second->part_objects.erase(entity); + } delete entity; } } diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 0823c17..d0d1acb 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -140,7 +140,7 @@ message MFPlayerFull optional int32 anim_seq = 11; // optional int32 action_type = 12; //0: none 1:reload 2:useitem 3:relive optional int32 skin = 13; //皮肤id - //backpack + optional int32 backpack = 14; //背包 optional int32 helmet = 16; //头盔 optional int32 chest = 17; //防弹衣 optional int32 weapon = 18; //武器