From 29ec5651a6576e03a402581802e2ade8a28ecdb4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 17:02:51 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/room.cc | 76 ------------------------------------ server/gameserver/room.h | 2 - server/gameserver/roommgr.cc | 5 --- 3 files changed, 83 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 23c429b..9c2bef3 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -167,82 +167,6 @@ void Room::ShuaAndroid() } } -void Room::ShuaObstacle(Human* hum) -{ - MetaData::MapThing* a_thing = MetaMgr::Instance()->GetMapThing(61101); - MetaData::MapThing* b_thing = MetaMgr::Instance()->GetMapThing(61401); - if (!a_thing || !b_thing) { - return; - } - #if 1 - { - Obstacle* entity = new Obstacle(); - entity->room = this; - entity->meta = a_thing; - entity->entity_uniid = AllocUniid(); - #if 0 - entity->dir = Vector2D::UP; - #endif - #if 0 - entity->pos = Vector2D(100.0f, 164.0f); - #else - entity->pos = hum->pos - Vector2D::LEFT * hum->meta->i->radius() - 100; - #endif - entity->Initialize(); - uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } - #endif - #if 1 - { - Obstacle* entity = new Obstacle(); - entity->room = this; - entity->meta = b_thing; - entity->entity_uniid = AllocUniid(); - #if 0 - entity->dir = Vector2D::UP; - #endif - #if 0 - entity->pos = Vector2D(100.0f, 100.0f); - #else - entity->pos = hum->pos + Vector2D::RIGHT * hum->meta->i->radius() + 100; - #endif - entity->Initialize(); - uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } - #endif -} - -void Room::ShuaBuilding(Human* hum) -{ - MetaData::Building* a_building = MetaMgr::Instance()->GetBuilding(1); - if (!a_building) { - return; - } - #if 1 - { - Building* entity = new Building(); - entity->room = this; - entity->meta = a_building; - entity->entity_uniid = AllocUniid(); - entity->pos = hum->pos - Vector2D::UP * hum->meta->i->radius() + 500; - entity->Initialize(); - uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } - #endif -} - bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos) { Vector2D dir = hum->pos; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index a57afec..5e20643 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -49,8 +49,6 @@ public: void AddBullet(Bullet* bullet); unsigned short AllocUniid(); void ShuaAndroid(); - void ShuaObstacle(Human* hum); - void ShuaBuilding(Human* hum); bool RandomPos(Human* hum, float distance, Vector2D& out_pos); Human* FindEnemy(Human* hum); void CollisionDetection(Entity* sender, int detection_flags, std::vector& objects); diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index d872c74..03d50b1 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -52,12 +52,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) hum->socket_handle = hdr.socket_handle; hum->Initialize(); room->AddPlayer(hum); - #if 1 room->CreateThings(); - #else - room->ShuaObstacle(hum); - room->ShuaBuilding(hum); - #endif { cs::SMJoinedNotify notifymsg; From 11b3b7650495da93c2bc147bc0c3deb928ca7b6e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 17:28:06 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 24 ------------------------ server/gameserver/human.h | 1 - server/gameserver/player.cc | 6 +++--- server/gameserver/room.cc | 24 ++++++++++++++++++++++++ server/gameserver/room.h | 1 + 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 10be36d..7df8666 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -276,30 +276,6 @@ void Human::UpdatePoisoning() } } -void Human::DropItem(int item_id) -{ - MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); - if (equip_meta) { - Loot* entity = new Loot(); - entity->room = room; - entity->meta = equip_meta; - entity->entity_uniid = room->AllocUniid(); - { - Vector2D dir = Vector2D::UP; - dir.Rotate(a8::RandAngle()); - entity->pos = pos + dir * (25 + rand() % 50); - } - entity->item_id = equip_meta->i->id(); - entity->count = 1; - entity->Initialize(); - room->uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } -} - void Human::SyncAroundPlayers() { for (auto& pair : room->human_hash_) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 3bbb177..1785758 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -103,7 +103,6 @@ class Human : public Entity void FindPath(); float GetRadius(); void UpdatePoisoning(); - void DropItem(int item_id); void SyncAroundPlayers(); void AutoLoadingBullet(bool manual = false); void StartAction(ActionType_e action_type, diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index df87734..0468d44 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -512,7 +512,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - DropItem(old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id()); } backpack = item_meta->i->id(); } @@ -527,7 +527,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - DropItem(old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id()); } chest = item_meta->i->id(); } else if (item_meta->i->equip_subtype() == 2) { @@ -537,7 +537,7 @@ void Player::LootInteraction(Loot* entity) if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { return; } - DropItem(old_item_meta->i->id()); + room->DropItem(pos, old_item_meta->i->id()); } helmet = item_meta->i->id(); } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 9c2bef3..1f4d988 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -395,6 +395,30 @@ void Room::FillSMMapInfo(cs::SMMapInfo& map_info) } } +void Room::DropItem(Vector2D pos, int item_id) +{ + MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); + if (equip_meta) { + Loot* entity = new Loot(); + entity->room = this; + entity->meta = equip_meta; + entity->entity_uniid = AllocUniid(); + { + Vector2D dir = Vector2D::UP; + dir.Rotate(a8::RandAngle()); + entity->pos = pos + dir * (25 + rand() % 50); + } + entity->item_id = equip_meta->i->id(); + entity->count = 1; + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } +} + void Room::ClearDeletedObjects() { for (auto& obj_uniid : frame_data.deleted_objects) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 5e20643..7f1b060 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -61,6 +61,7 @@ public: void ProcDrop(Vector2D center, int drop_id); void CreateThings(); void FillSMMapInfo(cs::SMMapInfo& map_info); + void DropItem(Vector2D pos, int item_id); private: void ClearDeletedObjects(); From 5577b62d8c0f890bee2a55253251fa892043ff53 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 17:55:58 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=AE=8C=E6=88=90building=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/building.cc | 75 +++++------------------------------ server/gameserver/room.cc | 74 ++++++++++++++++++++++++++++++++++ server/gameserver/room.h | 5 +++ 3 files changed, 89 insertions(+), 65 deletions(-) diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index b6b1826..3f8ea63 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -1,12 +1,9 @@ #include "precompile.h" #include "building.h" -#include "metamgr.h" -#include "movement.h" -#include "room.h" #include "collider.h" -#include "obstacle.h" -#include "human.h" +#include "metamgr.h" +#include "room.h" #include "loot.h" Building::Building():Entity() @@ -34,70 +31,18 @@ void Building::RecalcSelfCollider() obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0); colliders.push_back(collider); } - for (auto& obj : meta->doors) { - MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(61701); - if (thing) { - Obstacle* entity = new Obstacle(); - entity->room = room; - entity->meta = thing; - entity->entity_uniid = room->AllocUniid(); - entity->is_door = true; - entity->door_id = obj.door_id; - entity->door_state = DoorStateClose; - entity->building = this; - entity->door_house_uniid = entity_uniid; - entity->door_state0 = obj.state0; - entity->door_state1 = obj.state1; - #if 1 - entity->pos = Vector2D(pos.x + entity->door_state0->x() - meta->i->tilewidth() / 2.0, - pos.y + entity->door_state0->y() - meta->i->tileheight() / 2.0); - #endif - entity->Initialize(); - room->uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } + for (size_t i = 0; i < meta->doors.size(); ++i) { + room->CreateDoor(this, i); } for (auto& obj : meta->i->lootobj()) { - MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(obj.id()); - if (thing) { - Obstacle* entity = new Obstacle(); - entity->room = room; - entity->meta = thing; - #if 1 - entity->building = this; - #endif - entity->entity_uniid = room->AllocUniid(); - entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0, - pos.y + obj.y() - meta->i->tileheight() / 2.0); - entity->Initialize(); - room->uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } + room->CreateHouseObstacle(this, obj.id(), obj.x(), obj.y()); } for (auto& obj : meta->i->dropobj()) { - MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(obj.id()); - if (equip_meta) { - Loot* entity = new Loot(); - entity->room = room; - entity->meta = equip_meta; - entity->entity_uniid = room->AllocUniid(); - entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0, - pos.y + obj.y() - meta->i->tileheight() / 2.0); - entity->item_id = obj.id(); - entity->count = 1; - entity->Initialize(); - room->uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } + room->CreateLoot(obj.id(), + pos.x + obj.x() - meta->i->tilewidth() / 2.0, + pos.y + obj.y() - meta->i->tileheight() / 2.0, + 1 + ); } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 1f4d988..c1c12da 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -419,6 +419,80 @@ void Room::DropItem(Vector2D pos, int item_id) } } +void Room::CreateDoor(Building* building, int door_idx) +{ + if (door_idx >= 0 && door_idx < building->meta->doors.size()) { + MetaData::Building::Door* door_meta = &building->meta->doors[door_idx]; + MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(61701); + if (thing) { + Obstacle* entity = new Obstacle(); + entity->room = this; + entity->meta = thing; + entity->entity_uniid = AllocUniid(); + entity->is_door = true; + entity->door_id = door_meta->door_id; + entity->door_state = DoorStateClose; + entity->building = building; + entity->door_house_uniid = building->entity_uniid; + entity->door_state0 = door_meta->state0; + entity->door_state1 = door_meta->state1; + entity->pos = Vector2D(building->pos.x + entity->door_state0->x() - building->meta->i->tilewidth() / 2.0, + building->pos.y + entity->door_state0->y() - building->meta->i->tileheight() / 2.0); + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } + } +} + +void Room::CreateHouseObstacle(Building* building, int id, float x, float y) +{ + MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id); + if (thing) { + Obstacle* entity = new Obstacle(); + entity->room = this; + entity->meta = thing; + entity->building = building; + entity->entity_uniid = AllocUniid(); + entity->pos = Vector2D(building->pos.x + x - building->meta->i->tilewidth() / 2.0, + building->pos.y + y - building->meta->i->tileheight() / 2.0); + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } +} + +void Room::CreateLoot(int equip_id, float x, float y, int count) +{ + MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(equip_id); + if (equip_meta) { + Loot* entity = new Loot(); + entity->room = this; + entity->meta = equip_meta; + entity->entity_uniid = AllocUniid(); + #if 1 + entity->pos = Vector2D(x, y); + #else + entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0, + pos.y + obj.y() - meta->i->tileheight() / 2.0); + #endif + entity->item_id = equip_id; + entity->count = count; + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->new_objects.insert(entity); + pair.second->part_objects.insert(entity); + } + } +} + void Room::ClearDeletedObjects() { for (auto& obj_uniid : frame_data.deleted_objects) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 7f1b060..40a13e2 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -13,6 +13,7 @@ namespace MetaData { struct Map; struct SafeArea; + struct Building; } struct RoomFrameData @@ -29,6 +30,7 @@ class Entity; class Bullet; class Human; class Player; +class Building; class Room { public: @@ -62,6 +64,9 @@ public: void CreateThings(); void FillSMMapInfo(cs::SMMapInfo& map_info); void DropItem(Vector2D pos, int item_id); + void CreateDoor(Building* building, int door_idx); + void CreateHouseObstacle(Building* building, int id, float x, float y); + void CreateLoot(int equip_id, float x, float y, int count); private: void ClearDeletedObjects(); From db4126ced08c9698a1e9c3443f8c1e30fab59124 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 18:37:44 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=AE=8C=E6=88=90building=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/building.cc | 6 ++++-- server/gameserver/player.cc | 5 +++++ server/gameserver/room.cc | 9 ++------- server/gameserver/room.h | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index 3f8ea63..5385478 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -39,8 +39,10 @@ void Building::RecalcSelfCollider() } for (auto& obj : meta->i->dropobj()) { room->CreateLoot(obj.id(), - pos.x + obj.x() - meta->i->tilewidth() / 2.0, - pos.y + obj.y() - meta->i->tileheight() / 2.0, + Vector2D( + pos.x + obj.x() - meta->i->tilewidth() / 2.0, + pos.y + obj.y() - meta->i->tileheight() / 2.0 + ), 1 ); } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 0468d44..8e3e3e7 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -682,6 +682,11 @@ void Player::UpdateDropWeapon() } } if (drop_ok) { + { + Vector2D dir = Vector2D::UP; + dir.Rotate(a8::RandAngle()); + room->CreateLoot(weapon_id, pos + dir * (25 + rand() % 50), 1); + } #if 1 { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(weapon_id); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index c1c12da..6a92e6b 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -468,7 +468,7 @@ void Room::CreateHouseObstacle(Building* building, int id, float x, float y) } } -void Room::CreateLoot(int equip_id, float x, float y, int count) +void Room::CreateLoot(int equip_id, Vector2D pos, int count) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(equip_id); if (equip_meta) { @@ -476,12 +476,7 @@ void Room::CreateLoot(int equip_id, float x, float y, int count) entity->room = this; entity->meta = equip_meta; entity->entity_uniid = AllocUniid(); - #if 1 - entity->pos = Vector2D(x, y); - #else - entity->pos = Vector2D(pos.x + obj.x() - meta->i->tilewidth() / 2.0, - pos.y + obj.y() - meta->i->tileheight() / 2.0); - #endif + entity->pos = pos; entity->item_id = equip_id; entity->count = count; entity->Initialize(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 40a13e2..6388724 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -66,7 +66,7 @@ public: void DropItem(Vector2D pos, int item_id); void CreateDoor(Building* building, int door_idx); void CreateHouseObstacle(Building* building, int id, float x, float y); - void CreateLoot(int equip_id, float x, float y, int count); + void CreateLoot(int equip_id, Vector2D pos, int count); private: void ClearDeletedObjects(); From 24cacccbb5797d37d5a8e700fdafc8c07314fb57 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 18:44:19 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E5=AE=8C=E6=88=90building=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/player.cc | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 8e3e3e7..5ac235b 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -685,32 +685,8 @@ void Player::UpdateDropWeapon() { Vector2D dir = Vector2D::UP; dir.Rotate(a8::RandAngle()); - room->CreateLoot(weapon_id, pos + dir * (25 + rand() % 50), 1); + room->CreateLoot(weapon_id, pos + dir * (25 + rand() % 50), std::max(1, weapon_ammo)); } -#if 1 - { - MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(weapon_id); - if (equip_meta) { - Loot* entity = new Loot(); - entity->room = room; - entity->meta = equip_meta; - entity->entity_uniid = room->AllocUniid(); - { - Vector2D dir = Vector2D::UP; - dir.Rotate(a8::RandAngle()); - entity->pos = pos + dir * (25 + rand() % 50); - } - entity->item_id = weapon_id; - entity->count = std::max(1, weapon_ammo); - entity->Initialize(); - room->uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } - } -#endif need_sync_active_player = true; for (auto& pair : room->human_hash_) { pair.second->new_objects.insert(this); From d1e2cc438f19967bb21bafc57bd75c5b08e38088 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 19:02:49 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=AE=8C=E6=88=90room=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 10 +++++---- server/gameserver/player.cc | 42 ++++++++++++++----------------------- server/gameserver/room.cc | 31 +++++++++++++++++++++++---- server/gameserver/room.h | 13 ++++++++---- 4 files changed, 58 insertions(+), 38 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 7df8666..11d85f4 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -278,9 +278,11 @@ void Human::UpdatePoisoning() void Human::SyncAroundPlayers() { - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(this); - } + room->TouchHumanList(a8::XParams(), + [this] (Human* hum, a8::XParams& param) + { + hum->new_objects.insert(this); + }); } void Human::AutoLoadingBullet(bool manual) @@ -359,7 +361,7 @@ void Human::BeKill(int killer_id, const std::string& killer_name) health = 0.0f; dead_frameno = room->frame_no; send_gameover = true; - --room->alive_count_; + room->OnHumanDie(this); SyncAroundPlayers(); } } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 5ac235b..da3c340 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -138,9 +138,7 @@ void Player::UpdateSelectWeapon() curr_weapon = weapon; ResetAction(); need_sync_active_player = true; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(this); - } + SyncAroundPlayers(); AutoLoadingBullet(); } } @@ -404,15 +402,17 @@ void Player::ObstacleInteraction(Obstacle* entity) entity->building->pos.y + entity->door_state0->y() - entity->building->meta->i->tileheight() / 2.0); } entity->RecalcSelfCollider(); - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - if (entity->TestCollision(pair.second)) { - pair.second->last_collision_door = entity; - } else if (pair.second->last_collision_door == entity) { - pair.second->last_collision_door = nullptr; - } - } + room->TouchHumanList(a8::XParams(), + [entity] (Human* hum, a8::XParams& param) + { + hum->new_objects.insert(entity); + hum->part_objects.insert(entity); + if (entity->TestCollision(hum)) { + hum->last_collision_door = entity; + } else if (hum->last_collision_door == entity) { + hum->last_collision_door = nullptr; + } + }); } else { } } @@ -445,9 +445,7 @@ void Player::LootInteraction(Loot* entity) need_sync_active_player = true; } need_sync_active_player = true; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(this); - } + SyncAroundPlayers(); } else { Weapon* weapon = nullptr; if (weapons[GUN_SLOT1].weapon_id == 0) { @@ -475,9 +473,7 @@ void Player::LootInteraction(Loot* entity) weapon->meta = item_meta; AutoLoadingBullet(); need_sync_active_player = true; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(this); - } + SyncAroundPlayers(); } } break; @@ -688,9 +684,7 @@ void Player::UpdateDropWeapon() room->CreateLoot(weapon_id, pos + dir * (25 + rand() % 50), std::max(1, weapon_ammo)); } need_sync_active_player = true; - for (auto& pair : room->human_hash_) { - pair.second->new_objects.insert(this); - } + SyncAroundPlayers(); } } } @@ -810,11 +804,7 @@ void Player::MakeUpdateMsg() } } if (updated_times == 0) { - for (auto& pair : room->uniid_hash_) { - if (pair.second->entity_type == ET_Building) { - new_objects.insert(pair.second); - } - } + room->FetchBuilding(this); } for (auto& itr : new_objects) { itr->FillMFObjectFull(update_msg->add_full_objects()); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 6a92e6b..e2a1e5e 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -488,6 +488,20 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count) } } +void Room::FetchBuilding(Human* hum) +{ + for (auto& pair : uniid_hash_) { + if (pair.second->entity_type == ET_Building) { + hum->new_objects.insert(pair.second); + } + } +} + +void Room::OnHumanDie(Human* hum) +{ + --alive_count_; +} + void Room::ClearDeletedObjects() { for (auto& obj_uniid : frame_data.deleted_objects) { @@ -519,6 +533,19 @@ void Room::TouchPlayerList(a8::XParams param, } } +void Room::TouchHumanList(a8::XParams param, + std::function func) +{ + if (!func) { + return; + } + for (auto& pair : human_hash_) { + if (pair.second) { + func(pair.second, param); + } + } +} + void Room::ProcAddedObjects() { if (!be_added_hash_.empty()) { @@ -647,11 +674,7 @@ void Room::UpdateGas() continue; } bool b1 = CircleContainCircle(gas_data.pos_old, - #if 1 gas_data.gas_progress, - #else - gas_data.rad_old, - #endif pair.second->pos, pair.second->GetRadius() ); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 6388724..b232a7e 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -59,6 +59,8 @@ public: void ResetFrameData(); void TouchPlayerList(a8::XParams param, std::function func); + void TouchHumanList(a8::XParams param, + std::function func); void BeAddedObject(Entity* entity); void ProcDrop(Vector2D center, int drop_id); void CreateThings(); @@ -67,6 +69,8 @@ public: void CreateDoor(Building* building, int door_idx); void CreateHouseObstacle(Building* building, int id, float x, float y); void CreateLoot(int equip_id, Vector2D pos, int count); + void FetchBuilding(Human* hum); + void OnHumanDie(Human* hum); private: void ClearDeletedObjects(); @@ -75,15 +79,16 @@ private: bool GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float small_circle_rad, Vector2D& out_pos); -public: - unsigned short current_uniid = 0; - RoomState_e state_ = RS_Inactive; +private: int elapsed_time_ = 0; int alive_count_ = 0; + unsigned short current_uniid = 0; + RoomState_e state_ = RS_Inactive; + std::map accountid_hash_; - std::map uniid_hash_; std::map moveable_hash_; + std::map uniid_hash_; std::map human_hash_; std::map be_added_hash_; }; From b814b2af96266f7fa63db38ba1cceb3dc089bf44 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 19:46:31 +0800 Subject: [PATCH 7/8] add framedata.* vector2d.* --- server/gameserver/constant.h | 7 ++ server/gameserver/framedata.cc | 0 server/gameserver/framedata.h | 17 ++++ server/gameserver/human.h | 25 +----- server/gameserver/precompile.h | 2 + server/gameserver/room.h | 19 +---- server/gameserver/types.cc | 134 -------------------------------- server/gameserver/types.h | 53 +++++-------- server/gameserver/vector2d.cc | 137 +++++++++++++++++++++++++++++++++ server/gameserver/vector2d.h | 36 +++++++++ 10 files changed, 220 insertions(+), 210 deletions(-) create mode 100644 server/gameserver/framedata.cc create mode 100644 server/gameserver/framedata.h create mode 100644 server/gameserver/vector2d.cc create mode 100644 server/gameserver/vector2d.h diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index e1a5fed..56f5212 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -83,6 +83,13 @@ enum InventorySlot_e IS_15XSCOPE = 16, }; +enum RoomState_e +{ + RS_Inactive = 0, + RS_Waiting = 1, + RS_Moveing = 2 +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/framedata.cc b/server/gameserver/framedata.cc new file mode 100644 index 0000000..e69de29 diff --git a/server/gameserver/framedata.h b/server/gameserver/framedata.h new file mode 100644 index 0000000..9328ee6 --- /dev/null +++ b/server/gameserver/framedata.h @@ -0,0 +1,17 @@ +#pragma once + +#include "cs_proto.pb.h" + +struct RoomFrameData +{ + std::set deleted_objects; + std::map> explosions_hash; + std::map> smokes_hash; + ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes; + ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; + ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; +}; + +struct HumanFrameData +{ +}; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 1785758..2e2b6ab 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -1,7 +1,7 @@ #pragma once #include "entity.h" -#include "cs_proto.pb.h" +#include "framedata.h" namespace MetaData { @@ -9,29 +9,6 @@ namespace MetaData struct Equip; } -struct HumanFrameData -{ -}; - -struct PlayerStats -{ - int kills = 0; - int damage_amount = 0; - int heal_amount = 0; - - int history_time_alive = 0; - int history_kills = 0; - int history_damage_amount = 0; - int history_heal_amount = 0; - - int gold = 0; - int score = 0; - - int killer_id = 0; - std::string killer_name; - -}; - class CircleCollider; class Obstacle; class Human : public Entity diff --git a/server/gameserver/precompile.h b/server/gameserver/precompile.h index 20e7d9a..e9f30c3 100644 --- a/server/gameserver/precompile.h +++ b/server/gameserver/precompile.h @@ -4,6 +4,7 @@ #include #include "constant.h" +#include "vector2d.h" #include "types.h" #include "error_code.h" #include "global.h" @@ -20,3 +21,4 @@ namespace google #include "framework/cpp/types.h" #include "framework/cpp/protoutils.h" + diff --git a/server/gameserver/room.h b/server/gameserver/room.h index b232a7e..6c75b7b 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -1,13 +1,6 @@ #pragma once -#include "cs_proto.pb.h" - -enum RoomState_e -{ - RS_Inactive = 0, - RS_Waiting = 1, - RS_Moveing = 2 -}; +#include "framedata.h" namespace MetaData { @@ -16,16 +9,6 @@ namespace MetaData struct Building; } -struct RoomFrameData -{ - std::set deleted_objects; - std::map> explosions_hash; - std::map> smokes_hash; - ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes; - ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; - ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; -}; - class Entity; class Bullet; class Human; diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc index cc91bf2..1473792 100644 --- a/server/gameserver/types.cc +++ b/server/gameserver/types.cc @@ -1,141 +1,7 @@ #include "precompile.h" -#if 1 -#include -#include -#include -#else -#include -#include -#endif - #include "cs_proto.pb.h" -const Vector2D Vector2D::UP = Vector2D(0.0f, 1.0f); -const Vector2D Vector2D::RIGHT = Vector2D(1.0f, 0.0f); -const Vector2D Vector2D::DOWN = Vector2D(0.0f, -1.0f); -const Vector2D Vector2D::LEFT = Vector2D(-1.0f, 0.0f); - -void Vector2D::ToPB(cs::MFVector2D* pb_obj) -{ - pb_obj->set_x(x); - pb_obj->set_y(y); -} - -void Vector2D::FromPB(const cs::MFVector2D* pb_obj) -{ - x = pb_obj->x(); - y = pb_obj->y(); -} - -void Vector2D::Normalize() -{ - #if 1 - glm::vec2 v = glm::normalize(glm::vec2(x, y)); - x = v[0]; - y = v[1]; - #else - Eigen::Vector2f v(x, y); - v.normalize(); - x = v[0]; - y = v[1]; - #endif -} - -bool Vector2D::operator == (const Vector2D& b) const -{ - return std::abs(x - b.x) < 0.01f && std::abs(y - b.y) < 0.01f; -} - -Vector2D Vector2D::operator + (const Vector2D& b) const -{ - #if 1 - glm::vec2 v = glm::vec2(x, y) + glm::vec2(b.x, b.y); - return Vector2D(v[0], v[1]); - #else - Eigen::Vector2f v = Eigen::Vector2f(x, y) + Eigen::Vector2f(b.x, b.y); - return Vector2D(v[0], v[1]); - #endif -} - -Vector2D Vector2D::operator - (const Vector2D& b) const -{ - #if 1 - glm::vec2 v = glm::vec2(x, y) - glm::vec2(b.x, b.y); - return Vector2D(v[0], v[1]); - #else - Eigen::Vector2f v = Eigen::Vector2f(x, y) - Eigen::Vector2f(b.x, b.y); - return Vector2D(v[0], v[1]); - #endif -} - -Vector2D Vector2D::operator * (float scale) const -{ - #if 1 - glm::vec2 v = glm::vec2(x, y) * scale; - return Vector2D(v[0], v[1]); - #else - Eigen::Vector2f v = Eigen::Vector2f(x, y) * scale; - return Vector2D(v[0], v[1]); - #endif -} - -Vector2D Vector2D::operator / (float scale) const -{ - #if 1 - glm::vec2 v = glm::vec2(x, y) / scale; - return Vector2D(v[0], v[1]); - #else - Eigen::Vector2f v = Eigen::Vector2f(x, y) * (1.0 / scale); - return Vector2D(v[0], v[1]); - #endif -} - -#if 1 -#include -#include -#endif - -void Vector2D::Rotate(float angle) -{ - Eigen::Vector3f v(x, y, 0); - v = Eigen::AngleAxisf(angle * 3.1415926f, Eigen::Vector3f::UnitZ()) * v; - x = v[0]; - y = v[1]; -} - -float Vector2D::CalcAngle(const Vector2D& b) -{ - float a1 = acos(Dot(b) / Norm() / b.Norm()); - float a2 = atan2(y, x); - float a3 = atan2(y, x) / 0.017 - 90.0f; - #if 0 - return a2; - #else - bool at_right_side = Vector2D::RIGHT.Dot(*this) > 0.0001f; - if (at_right_side) { - a1 = -a1; - } - return a1 / 3.1415926f; - // return a3 / 360.0f; - #endif -} - -Vector2D Vector2D::Perp() -{ - return Vector2D(y, -x); -} - -float Vector2D::Dot(const Vector2D& v) const -{ - return x*v.x + y*v.y; -} - -float Vector2D::Norm() const -{ - return fabs(sqrt(x*x + y*y)); -} - void Weapon::ToPB(cs::MFWeapon* pb_obj) { pb_obj->set_weapon_id(weapon_id); diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 03a20d8..065e59b 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -9,40 +9,6 @@ struct PerfMonitor long long read_count = 0; }; -namespace cs -{ - class MFVector2D; - class MFWeapon; -} - -struct Vector2D -{ - float x = 0.0f; - float y = 0.0f; - - Vector2D(float _x = 0.0f, float _y = 0.0f):x(_x), y(_y) {}; - - void ToPB(cs::MFVector2D* pb_obj); - void FromPB(const cs::MFVector2D* pb_obj); - void Normalize(); - void Rotate(float angle); - float CalcAngle(const Vector2D& b); - - bool operator == (const Vector2D& b) const; - Vector2D operator + (const Vector2D& b) const; - Vector2D operator - (const Vector2D& b) const; - Vector2D operator * (float scale) const; - Vector2D operator / (float scale) const; - Vector2D Perp(); - float Dot(const Vector2D& v) const; - float Norm() const; - - static const Vector2D UP; - static const Vector2D DOWN; - static const Vector2D LEFT; - static const Vector2D RIGHT; -}; - namespace MetaData { struct SafeArea; @@ -75,3 +41,22 @@ struct Weapon void ToPB(cs::MFWeapon* pb_obj); }; + +struct PlayerStats +{ + int kills = 0; + int damage_amount = 0; + int heal_amount = 0; + + int history_time_alive = 0; + int history_kills = 0; + int history_damage_amount = 0; + int history_heal_amount = 0; + + int gold = 0; + int score = 0; + + int killer_id = 0; + std::string killer_name; + +}; diff --git a/server/gameserver/vector2d.cc b/server/gameserver/vector2d.cc new file mode 100644 index 0000000..390a5a4 --- /dev/null +++ b/server/gameserver/vector2d.cc @@ -0,0 +1,137 @@ +#include "precompile.h" + +#if 1 +#include +#include +#include +#else +#include +#include +#endif + +#include "cs_proto.pb.h" + +const Vector2D Vector2D::UP = Vector2D(0.0f, 1.0f); +const Vector2D Vector2D::RIGHT = Vector2D(1.0f, 0.0f); +const Vector2D Vector2D::DOWN = Vector2D(0.0f, -1.0f); +const Vector2D Vector2D::LEFT = Vector2D(-1.0f, 0.0f); + +void Vector2D::ToPB(cs::MFVector2D* pb_obj) +{ + pb_obj->set_x(x); + pb_obj->set_y(y); +} + +void Vector2D::FromPB(const cs::MFVector2D* pb_obj) +{ + x = pb_obj->x(); + y = pb_obj->y(); +} + +void Vector2D::Normalize() +{ + #if 1 + glm::vec2 v = glm::normalize(glm::vec2(x, y)); + x = v[0]; + y = v[1]; + #else + Eigen::Vector2f v(x, y); + v.normalize(); + x = v[0]; + y = v[1]; + #endif +} + +bool Vector2D::operator == (const Vector2D& b) const +{ + return std::abs(x - b.x) < 0.01f && std::abs(y - b.y) < 0.01f; +} + +Vector2D Vector2D::operator + (const Vector2D& b) const +{ + #if 1 + glm::vec2 v = glm::vec2(x, y) + glm::vec2(b.x, b.y); + return Vector2D(v[0], v[1]); + #else + Eigen::Vector2f v = Eigen::Vector2f(x, y) + Eigen::Vector2f(b.x, b.y); + return Vector2D(v[0], v[1]); + #endif +} + +Vector2D Vector2D::operator - (const Vector2D& b) const +{ + #if 1 + glm::vec2 v = glm::vec2(x, y) - glm::vec2(b.x, b.y); + return Vector2D(v[0], v[1]); + #else + Eigen::Vector2f v = Eigen::Vector2f(x, y) - Eigen::Vector2f(b.x, b.y); + return Vector2D(v[0], v[1]); + #endif +} + +Vector2D Vector2D::operator * (float scale) const +{ + #if 1 + glm::vec2 v = glm::vec2(x, y) * scale; + return Vector2D(v[0], v[1]); + #else + Eigen::Vector2f v = Eigen::Vector2f(x, y) * scale; + return Vector2D(v[0], v[1]); + #endif +} + +Vector2D Vector2D::operator / (float scale) const +{ + #if 1 + glm::vec2 v = glm::vec2(x, y) / scale; + return Vector2D(v[0], v[1]); + #else + Eigen::Vector2f v = Eigen::Vector2f(x, y) * (1.0 / scale); + return Vector2D(v[0], v[1]); + #endif +} + +#if 1 +#include +#include +#endif + +void Vector2D::Rotate(float angle) +{ + Eigen::Vector3f v(x, y, 0); + v = Eigen::AngleAxisf(angle * 3.1415926f, Eigen::Vector3f::UnitZ()) * v; + x = v[0]; + y = v[1]; +} + +float Vector2D::CalcAngle(const Vector2D& b) +{ + float a1 = acos(Dot(b) / Norm() / b.Norm()); + float a2 = atan2(y, x); + float a3 = atan2(y, x) / 0.017 - 90.0f; + #if 0 + return a2; + #else + bool at_right_side = Vector2D::RIGHT.Dot(*this) > 0.0001f; + if (at_right_side) { + a1 = -a1; + } + return a1 / 3.1415926f; + // return a3 / 360.0f; + #endif +} + +Vector2D Vector2D::Perp() +{ + return Vector2D(y, -x); +} + +float Vector2D::Dot(const Vector2D& v) const +{ + return x*v.x + y*v.y; +} + +float Vector2D::Norm() const +{ + return fabs(sqrt(x*x + y*y)); +} diff --git a/server/gameserver/vector2d.h b/server/gameserver/vector2d.h new file mode 100644 index 0000000..682d907 --- /dev/null +++ b/server/gameserver/vector2d.h @@ -0,0 +1,36 @@ +#pragma once + +namespace cs +{ + class MFVector2D; + class MFWeapon; +} + +struct Vector2D +{ + float x = 0.0f; + float y = 0.0f; + + Vector2D(float _x = 0.0f, float _y = 0.0f):x(_x), y(_y) {}; + + void ToPB(cs::MFVector2D* pb_obj); + void FromPB(const cs::MFVector2D* pb_obj); + void Normalize(); + void Rotate(float angle); + float CalcAngle(const Vector2D& b); + + bool operator == (const Vector2D& b) const; + Vector2D operator + (const Vector2D& b) const; + Vector2D operator - (const Vector2D& b) const; + Vector2D operator * (float scale) const; + Vector2D operator / (float scale) const; + Vector2D Perp(); + float Dot(const Vector2D& v) const; + float Norm() const; + + static const Vector2D UP; + static const Vector2D DOWN; + static const Vector2D LEFT; + static const Vector2D RIGHT; +}; + From 8384d56771756d0b2e699b0f70ca9c70b5129171 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 10 Apr 2019 20:25:05 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E5=AE=8C=E6=88=90room=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 16 +--------------- server/gameserver/player.cc | 16 +--------------- server/gameserver/playermgr.cc | 13 +++---------- server/gameserver/playermgr.h | 3 +-- server/gameserver/room.cc | 25 ++++++++++++++++++++----- server/gameserver/room.h | 7 ++++--- server/gameserver/roommgr.cc | 7 +------ 7 files changed, 31 insertions(+), 56 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 11d85f4..b2e0367 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -113,7 +113,6 @@ void Human::Shot(Vector2D& target_dir) if (!curr_weapon->meta) { return; } - { cs::MFShot* shot = room->frame_data.shots.Add(); shot->set_player_id(entity_uniid); @@ -130,20 +129,7 @@ void Human::Shot(Vector2D& target_dir) bullet->set_bulletskin(10001); bullet->set_gun_id(curr_weapon->meta->i->id()); } - { - Bullet* bullet = new Bullet(); - bullet->player = this; - bullet->room = room; - bullet->gun_meta = curr_weapon->meta; - bullet->meta = MetaMgr::Instance()->GetEquip(curr_weapon->meta->i->use_bullet()); - bullet->pos = pos; - bullet->dir = target_dir; - bullet->born_pos = pos; - bullet->born_dir = target_dir; - bullet->entity_uniid = bullet->room->AllocUniid(); - bullet->Initialize(); - room->AddBullet(bullet); - } + room->CreateBullet(this, curr_weapon->meta, pos, target_dir, 0); } void Human::RecalcSelfCollider() diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index da3c340..ea1bd99 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -300,21 +300,7 @@ void Player::Shot() bullet->set_gun_id(curr_weapon->meta->i->id()); bullet->set_fly_distance(fly_distance); } - { - Bullet* bullet = new Bullet(); - bullet->player = this; - bullet->room = room; - bullet->gun_meta = curr_weapon->meta; - bullet->meta = MetaMgr::Instance()->GetEquip(curr_weapon->meta->i->use_bullet()); - bullet->pos = bullet_born_pos; - bullet->dir = attack_dir; - bullet->born_pos = bullet_born_pos; - bullet->born_dir = attack_dir; - bullet->fly_distance = fly_distance; - bullet->entity_uniid = bullet->room->AllocUniid(); - bullet->Initialize(); - room->AddBullet(bullet); - } + room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance); } --curr_weapon->ammo; int slot_id = curr_weapon->meta->i->_inventory_slot(); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 57a2e85..51ca00a 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -6,17 +6,10 @@ void PlayerMgr::Init() { - } void PlayerMgr::UnInit() { - -} - -void PlayerMgr::Update() -{ - } Player* PlayerMgr::GetPlayerBySocket(int socket) @@ -25,10 +18,10 @@ Player* PlayerMgr::GetPlayerBySocket(int socket) return itr != socket_hash_.end() ? itr->second : nullptr; } -Player* PlayerMgr::CreatePlayerByCMJoin(int socket, unsigned short obj_uniid, const cs::CMJoin& msg) +Player* PlayerMgr::CreatePlayerByCMJoin(int socket, const cs::CMJoin& msg) { Player* hum = new Player(); - hum->entity_uniid = obj_uniid; + hum->socket_handle = socket; hum->account_id = msg.account_id(); hum->name = msg.name(); hum->health = 100; @@ -39,10 +32,10 @@ Player* PlayerMgr::CreatePlayerByCMJoin(int socket, unsigned short obj_uniid, co hum->use_touch = msg.use_touch(); hum->avatar_url = msg.avatar_url(); hum->energy_shield = msg.energy_shield(); - socket_hash_[socket] = hum; // hum->baseskin = msg.baseskin(); // hum->basemelee = msg.basemelee(); // hum->elo_score = msg.elo_score(); // hum->gmode = msg.gmode(); + socket_hash_[socket] = hum; return hum; } diff --git a/server/gameserver/playermgr.h b/server/gameserver/playermgr.h index c84e674..d763b22 100644 --- a/server/gameserver/playermgr.h +++ b/server/gameserver/playermgr.h @@ -18,10 +18,9 @@ class PlayerMgr : public a8::Singleton public: void Init(); void UnInit(); - void Update(); Player* GetPlayerBySocket(int socket); - Player* CreatePlayerByCMJoin(int socket, unsigned short obj_uniid, const cs::CMJoin& msg); + Player* CreatePlayerByCMJoin(int socket, const cs::CMJoin& msg); private: std::map socket_hash_; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index e2a1e5e..c3d0051 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -104,7 +104,9 @@ void Room::AddPlayer(Player* hum) hum->attack_dir.Normalize(); hum->attack_dir.Rotate(a8::RandAngle()); } + hum->entity_uniid = AllocUniid(); hum->room = this; + hum->Initialize(); uniid_hash_[hum->entity_uniid] = hum; moveable_hash_[hum->entity_uniid] = hum; accountid_hash_[hum->account_id] = hum; @@ -213,11 +215,6 @@ Human* Room::FindEnemy(Human* hum) return !enemys.empty() ? enemys[0] : nullptr; } -void Room::AddBullet(Bullet* bullet) -{ - be_added_hash_[bullet->entity_uniid] = bullet; -} - void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector& objects) { assert(uniid_hash_.size() < 1000); @@ -488,6 +485,24 @@ void Room::CreateLoot(int equip_id, Vector2D pos, int count) } } +void Room::CreateBullet(Human* hum, MetaData::Equip* gun_meta, + Vector2D pos, Vector2D dir, float fly_distance) +{ + Bullet* bullet = new Bullet(); + bullet->player = hum; + bullet->room = this; + bullet->gun_meta = gun_meta; + bullet->meta = MetaMgr::Instance()->GetEquip(gun_meta->i->use_bullet()); + bullet->pos = pos; + bullet->dir = dir; + bullet->born_pos = pos; + bullet->born_dir = dir; + bullet->fly_distance = fly_distance; + bullet->entity_uniid = AllocUniid(); + bullet->Initialize(); + be_added_hash_[bullet->entity_uniid] = bullet; +} + void Room::FetchBuilding(Human* hum) { for (auto& pair : uniid_hash_) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 6c75b7b..cc05eb3 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -31,15 +31,12 @@ public: Player* GetPlayerByUniId(unsigned short uniid); Entity* GetEntityByUniId(unsigned short uniid); void AddPlayer(Player* hum); - void AddBullet(Bullet* bullet); - unsigned short AllocUniid(); void ShuaAndroid(); bool RandomPos(Human* hum, float distance, Vector2D& out_pos); Human* FindEnemy(Human* hum); void CollisionDetection(Entity* sender, int detection_flags, std::vector& objects); void AddDeletedObject(unsigned short obj_uniid); void FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg); - void ResetFrameData(); void TouchPlayerList(a8::XParams param, std::function func); void TouchHumanList(a8::XParams param, @@ -52,10 +49,14 @@ public: void CreateDoor(Building* building, int door_idx); void CreateHouseObstacle(Building* building, int id, float x, float y); void CreateLoot(int equip_id, Vector2D pos, int count); + void CreateBullet(Human* hum, MetaData::Equip* gun_meta, + Vector2D pos, Vector2D dir, float fly_distance); void FetchBuilding(Human* hum); void OnHumanDie(Human* hum); private: + unsigned short AllocUniid(); + void ResetFrameData(); void ClearDeletedObjects(); void ProcAddedObjects(); void UpdateGas(); diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 03d50b1..ca4bc32 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -12,12 +12,10 @@ void RoomMgr::Init() { - } void RoomMgr::UnInit() { - } void RoomMgr::Update(int delta_time) @@ -46,11 +44,8 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) room->ShuaAndroid(); room_hash_[room->room_uuid] = room; } - unsigned short new_uniid = room->AllocUniid(); - Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, new_uniid, msg); + Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, msg); hum->meta = hum_meta; - hum->socket_handle = hdr.socket_handle; - hum->Initialize(); room->AddPlayer(hum); room->CreateThings();