diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 6688f55..24dfa2c 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -102,7 +102,9 @@ void AndroidAI::DoAttack() Human* enemy = owner->room->FindEnemy((Human*)owner); if (enemy) { Human* sender = (Human*)owner; - sender->Shot(enemy->pos); + Vector2D shot_dir = enemy->pos; + shot_dir.Normalize(); + sender->Shot(shot_dir); } } } @@ -122,7 +124,9 @@ void AndroidAI::DoMoveAndAttack() Human* enemy = owner->room->FindEnemy((Human*)owner); if (enemy) { Human* sender = (Human*)owner; - sender->Shot(enemy->pos); + Vector2D shot_dir = enemy->pos; + shot_dir.Normalize(); + sender->Shot(shot_dir); } } } diff --git a/server/gameserver/android.cc b/server/gameserver/android.cc index df09f2f..45c62f6 100644 --- a/server/gameserver/android.cc +++ b/server/gameserver/android.cc @@ -22,6 +22,13 @@ Android::~Android() void Android::Initialize() { health = meta->i->health(); + helmet = DEF_HELMET_ID; + chest = DEF_CHEST_ID; + weapon = DEF_WEAPON_ID; + helmet_meta = MetaMgr::Instance()->GetEquip(helmet); + chest_meta = MetaMgr::Instance()->GetEquip(chest); + weapon_meta = MetaMgr::Instance()->GetEquip(weapon); + RecalcSelfCollider(); } void Android::Update(int delta_time) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index b007832..0f662f7 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -28,8 +28,13 @@ void Bullet::Update(int delta_time) { movement->Update(delta_time); std::vector objects; - room->CollisionDetection(this, 0, objects); - if (objects.empty()) { + int detection_flags = 0; + { + a8::SetBitFlag(detection_flags, ET_Obstacle); + a8::SetBitFlag(detection_flags, ET_Player); + } + room->CollisionDetection(this, detection_flags, objects); + if (!objects.empty()) { deleted = true; room->AddDeletedObject(objects[0]->entity_uniid); } @@ -39,8 +44,9 @@ void Bullet::RecalcSelfCollider() { if (!self_collider_) { self_collider_ = new CircleCollider(); + self_collider_->owner = this; colliders.push_back(self_collider_); } self_collider_->pos = Vector2D(); - self_collider_->rad = meta->i->bullet_rad(); + self_collider_->rad = gun_meta->i->bullet_rad(); } diff --git a/server/gameserver/collider.cc b/server/gameserver/collider.cc index 0965d2d..c16e327 100644 --- a/server/gameserver/collider.cc +++ b/server/gameserver/collider.cc @@ -12,13 +12,19 @@ bool ColliderComponent::IntersectSegment(Vector2D& p0, Vector2D& p1) case CT_Aabb: { AabbCollider* a_aabb = (AabbCollider*)this; - return IntersectSegmentAabb(p0, p1, a_aabb->_min, a_aabb->_max); + return IntersectSegmentAabb(p0, + p1, + a_aabb->owner->pos + a_aabb->_min, + a_aabb->owner->pos + a_aabb->_max); } break; case CT_Circle: { CircleCollider* a_circle = (CircleCollider*)this; - return IntersectSegmentCircle(p0, p1, a_circle->pos, a_circle->rad); + return IntersectSegmentCircle(p0, + p1, + a_circle->owner->pos + a_circle->pos, + a_circle->rad); } break; } @@ -39,19 +45,19 @@ bool ColliderComponent::Intersect(ColliderComponent* b) case CT_Aabb: { AabbCollider* b_aabb = (AabbCollider*)b; - return IntersectAabbAabb(a_aabb->_min, - a_aabb->_max, - b_aabb->_min, - b_aabb->_max + return IntersectAabbAabb(a_aabb->owner->pos + a_aabb->_min, + a_aabb->owner->pos + a_aabb->_max, + b_aabb->owner->pos + b_aabb->_min, + b_aabb->owner->pos + b_aabb->_max ); } break; case CT_Circle: { CircleCollider* b_circle = (CircleCollider*)b; - return IntersectAabbCircle(a_aabb->_min, - a_aabb->_max, - b_circle->pos, + return IntersectAabbCircle(a_aabb->owner->pos + a_aabb->_min, + a_aabb->owner->pos + a_aabb->_max, + b_circle->owner->pos + b_circle->pos, b_circle->rad); } break; @@ -67,9 +73,9 @@ bool ColliderComponent::Intersect(ColliderComponent* b) case CT_Aabb: { AabbCollider* b_aabb = (AabbCollider*)b; - return IntersectAabbCircle(b_aabb->_min, - b_aabb->_max, - a_circle->pos, + return IntersectAabbCircle(b_aabb->owner->pos + b_aabb->_min, + b_aabb->owner->pos + b_aabb->_max, + a_circle->owner->pos + a_circle->pos, a_circle->rad); } break; @@ -77,9 +83,9 @@ bool ColliderComponent::Intersect(ColliderComponent* b) { CircleCollider* b_circle = (CircleCollider*)b; return IntersectCircleCircle( - a_circle->pos, + a_circle->owner->pos + a_circle->pos, a_circle->rad, - b_circle->pos, + b_circle->owner->pos + b_circle->pos, b_circle->rad); } break; diff --git a/server/gameserver/collider.h b/server/gameserver/collider.h index 592ba9e..cabbe89 100644 --- a/server/gameserver/collider.h +++ b/server/gameserver/collider.h @@ -24,6 +24,8 @@ class AabbCollider : public ColliderComponent public: Vector2D _min; Vector2D _max; + + AabbCollider() { type = CT_Aabb; }; }; class CircleCollider : public ColliderComponent @@ -31,4 +33,6 @@ class CircleCollider : public ColliderComponent public: Vector2D pos; float rad = 0.0f; + + CircleCollider() { type = CT_Circle; }; }; diff --git a/server/gameserver/collision.cc b/server/gameserver/collision.cc index 014bf10..5263f93 100644 --- a/server/gameserver/collision.cc +++ b/server/gameserver/collision.cc @@ -3,7 +3,7 @@ #include #include -bool IntersectSegmentCircle(Vector2D& p0, Vector2D& p1, Vector2D& pos, float rad) +bool IntersectSegmentCircle(Vector2D p0, Vector2D p1, Vector2D pos, float rad) { Vector2D t = p1 - p0; float d = std::max(t.Norm(), 0.0001f); @@ -25,7 +25,7 @@ bool IntersectSegmentCircle(Vector2D& p0, Vector2D& p1, Vector2D& pos, float rad return false; } -bool IntersectSegmentAabb(Vector2D& p0, Vector2D& p1, Vector2D& _min, Vector2D& _max) +bool IntersectSegmentAabb(Vector2D p0, Vector2D p1, Vector2D _min, Vector2D _max) { float t = 0.0f; float d = FLT_MAX; @@ -63,7 +63,7 @@ bool IntersectSegmentAabb(Vector2D& p0, Vector2D& p1, Vector2D& _min, Vector2D& return true; } -bool IntersectAabbCircle(Vector2D& a_min, Vector2D& a_max, Vector2D& b_pos, float& b_rad) +bool IntersectAabbCircle(Vector2D a_min, Vector2D a_max, Vector2D b_pos, float b_rad) { if (b_pos.x >= a_min.x && b_pos.x <= a_max.x && b_pos.y >= a_min.y && b_pos.y <= a_max.y) { @@ -76,7 +76,7 @@ bool IntersectAabbCircle(Vector2D& a_min, Vector2D& a_max, Vector2D& b_pos, floa return n < b_rad*b_rad; } -bool IntersectAabbAabb(Vector2D& a_min, Vector2D& a_max, Vector2D& b_min, Vector2D& b_max) +bool IntersectAabbAabb(Vector2D a_min, Vector2D a_max, Vector2D b_min, Vector2D b_max) { Vector2D a_v = (a_max - a_min) * 0.5f; Vector2D a_center = a_min + a_v; @@ -87,7 +87,7 @@ bool IntersectAabbAabb(Vector2D& a_min, Vector2D& a_max, Vector2D& b_min, Vector return u > 0; } -bool IntersectCircleCircle(Vector2D& a_pos, float& a_rad, Vector2D& b_pos, float& b_rad) +bool IntersectCircleCircle(Vector2D a_pos, float a_rad, Vector2D b_pos, float b_rad) { float t = a_rad + b_rad; Vector2D d = b_pos - a_pos; diff --git a/server/gameserver/collision.h b/server/gameserver/collision.h index c36a9c9..dd543dc 100644 --- a/server/gameserver/collision.h +++ b/server/gameserver/collision.h @@ -1,7 +1,7 @@ #pragma once -bool IntersectSegmentCircle(Vector2D& p0, Vector2D& p1, Vector2D& pos, float rad); -bool IntersectSegmentAabb(Vector2D& p0, Vector2D& p1, Vector2D& _min, Vector2D& _max); -bool IntersectAabbCircle(Vector2D& a_min, Vector2D& a_max, Vector2D& b_pos, float& b_rad); -bool IntersectAabbAabb(Vector2D& a_min, Vector2D& a_max, Vector2D& b_min, Vector2D& b_max); -bool IntersectCircleCircle(Vector2D& a_pos, float& a_rad, Vector2D& b_pos, float& b_rad); +bool IntersectSegmentCircle(Vector2D p0, Vector2D p1, Vector2D pos, float rad); +bool IntersectSegmentAabb(Vector2D p0, Vector2D p1, Vector2D _min, Vector2D _max); +bool IntersectAabbCircle(Vector2D a_min, Vector2D a_max, Vector2D b_pos, float b_rad); +bool IntersectAabbAabb(Vector2D a_min, Vector2D a_max, Vector2D b_min, Vector2D b_max); +bool IntersectCircleCircle(Vector2D a_pos, float a_rad, Vector2D b_pos, float b_rad); diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 4c49a06..070503b 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -30,7 +30,7 @@ Entity::~Entity() bool Entity::TestCollision(Entity* b) { - for (auto& a_collider : b->colliders) { + for (auto& a_collider : colliders) { for (auto& b_collider : b->colliders) { if (a_collider->Intersect(b_collider)) { return false; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c9724f2..8cf3a98 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -22,13 +22,6 @@ Human::~Human() void Human::Initialize() { - helmet = DEF_HELMET_ID; - chest = DEF_CHEST_ID; - weapon = DEF_WEAPON_ID; - helmet_meta = MetaMgr::Instance()->GetEquip(helmet); - chest_meta = MetaMgr::Instance()->GetEquip(chest); - weapon_meta = MetaMgr::Instance()->GetEquip(weapon); - RecalcSelfCollider(); } float Human::GetSpeed() @@ -77,14 +70,14 @@ void Human::Shot(Vector2D& target_dir) } { - cs::MFShot* shot = frame_data.shots.Add(); + cs::MFShot* shot = room->frame_data.shots.Add(); shot->set_player_id(entity_uniid); shot->set_weapon_id(weapon_meta->i->id()); shot->set_offhand(true); shot->set_bullskin(10001); } { - cs::MFBullet* bullet = frame_data.bullets.Add(); + cs::MFBullet* bullet = room->frame_data.bullets.Add(); bullet->set_player_id(entity_uniid); bullet->set_bullet_id(weapon_meta->i->use_bullet()); pos.ToPB(bullet->mutable_pos()); @@ -94,6 +87,7 @@ void Human::Shot(Vector2D& target_dir) { Bullet* bullet = new Bullet(); bullet->player = this; + bullet->room = room; bullet->gun_meta = weapon_meta; bullet->meta = MetaMgr::Instance()->GetEquip(weapon_meta->i->use_bullet()); bullet->pos = pos; @@ -101,6 +95,7 @@ void Human::Shot(Vector2D& target_dir) bullet->born_pos = pos; bullet->born_dir = target_dir; bullet->entity_uniid = bullet->room->AllocUniid(); + bullet->Initialize(); room->AddBullet(bullet); } } @@ -109,6 +104,7 @@ void Human::RecalcSelfCollider() { if (!self_collider_) { self_collider_ = new CircleCollider(); + self_collider_->owner = this; colliders.push_back(self_collider_); } self_collider_->pos = Vector2D(); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 86eac77..dc2ea11 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -11,8 +11,6 @@ namespace MetaData struct HumanFrameData { - ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; - ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; }; class CircleCollider; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index dcee270..e402744 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -39,6 +39,13 @@ Player::~Player() void Player::Initialize() { health = meta->i->health(); + helmet = DEF_HELMET_ID; + chest = DEF_CHEST_ID; + weapon = DEF_WEAPON_ID; + helmet_meta = MetaMgr::Instance()->GetEquip(helmet); + chest_meta = MetaMgr::Instance()->GetEquip(chest); + weapon_meta = MetaMgr::Instance()->GetEquip(weapon); + RecalcSelfCollider(); } void Player::Update(int delta_time) @@ -94,21 +101,25 @@ void Player::MakeUpdateMsg() } for (auto& itr : new_players) { itr->FillMFObjectFull(update_msg->add_full_objects()); + #if 0 if (itr->frame_data.bullets.size() > 0) { update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets); } if (itr->frame_data.shots.size() > 0) { update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots); } + #endif } for (auto& itr : part_players) { itr->FillMFObjectPart(update_msg->add_part_objects()); + #if 0 if (itr->frame_data.bullets.size() > 0) { update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets); } if (itr->frame_data.shots.size() > 0) { update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots); } + #endif } if (updated_times == 0) { update_msg->set_active_player_id(entity_uniid); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 28b4410..00e11a0 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -180,7 +180,7 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vectorentity_type == ET_Bullet) { Bullet* bullet = (Bullet*)sender; Human* hum = (Human*)pair.second; - if (bullet->player->team_id != hum->team_id) { + if (hum->team_id == 0 || bullet->player->team_id != hum->team_id) { if (bullet->TestCollision(hum)) { objects.push_back(hum); } @@ -223,6 +223,8 @@ void Room::ResetFrameData() frame_data.deleted_objects.clear(); frame_data.explosions.Clear(); frame_data.emotes.Clear(); + frame_data.bullets.Clear(); + frame_data.shots.Clear(); } void Room::ClearDeletedObjects() diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 590e8b5..b62ef20 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -19,6 +19,8 @@ struct RoomFrameData std::set deleted_objects; ::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions; ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes; + ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; + ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; }; class Entity;