完成毒圈逻辑
This commit is contained in:
parent
936a2fdd41
commit
97e5cc5c3d
@ -68,4 +68,6 @@ const int DEF_HELMET_ID = 12404;
|
|||||||
const int DEF_CHEST_ID = 12401;
|
const int DEF_CHEST_ID = 12401;
|
||||||
const int DEF_WEAPON_ID = 12103;
|
const int DEF_WEAPON_ID = 12103;
|
||||||
|
|
||||||
const int GAS_INACTIVE_TIME = 30;
|
const int GAS_INACTIVE_TIME = 10;
|
||||||
|
const int SERVER_FRAME_RATE = 20;
|
||||||
|
const int SYNC_FRAME_RATE = 10;
|
||||||
|
@ -298,10 +298,10 @@ void Player::FillMFGasData(cs::MFGasData* gas_data)
|
|||||||
long long duration = GAS_INACTIVE_TIME * 20 - (room->frame_no - room->gas_data.gas_start_frameno);
|
long long duration = GAS_INACTIVE_TIME * 20 - (room->frame_no - room->gas_data.gas_start_frameno);
|
||||||
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
||||||
} else {
|
} else {
|
||||||
if (room->gas_data.area_meta->i->wait_time() <= 0) {
|
if (room->gas_data.old_area_meta->i->wait_time() <= 0) {
|
||||||
gas_data->set_duration(0);
|
gas_data->set_duration(0);
|
||||||
} else {
|
} else {
|
||||||
long long duration = room->gas_data.area_meta->i->wait_time() * 20 -
|
long long duration = room->gas_data.old_area_meta->i->wait_time() * 20 -
|
||||||
(room->frame_no - room->gas_data.gas_start_frameno);
|
(room->frame_no - room->gas_data.gas_start_frameno);
|
||||||
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ void Room::Update(int delta_time)
|
|||||||
while (elapsed_time_ >= 50) {
|
while (elapsed_time_ >= 50) {
|
||||||
if (frame_no % 2 == 0) {
|
if (frame_no % 2 == 0) {
|
||||||
ResetFrameData();
|
ResetFrameData();
|
||||||
|
UpdateGas();
|
||||||
}
|
}
|
||||||
for (auto& pair : moveable_hash_) {
|
for (auto& pair : moveable_hash_) {
|
||||||
pair.second->Update(50);
|
pair.second->Update(50);
|
||||||
@ -420,3 +421,88 @@ void Room::BeAddedObject(Entity* entity)
|
|||||||
{
|
{
|
||||||
be_added_hash_[entity->entity_uniid] = entity;
|
be_added_hash_[entity->entity_uniid] = entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Room::UpdateGas()
|
||||||
|
{
|
||||||
|
switch (gas_data.gas_mode) {
|
||||||
|
case GasInactive:
|
||||||
|
{
|
||||||
|
if (frame_no - gas_data.gas_start_frameno >= 30 * SERVER_FRAME_RATE) {
|
||||||
|
gas_data.gas_mode = GasWaiting;
|
||||||
|
gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001);
|
||||||
|
gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002);
|
||||||
|
gas_data.gas_progress = 0.0f;
|
||||||
|
gas_data.gas_start_frameno = frame_no;
|
||||||
|
gas_data.pos_old = Vector2D(map_meta->i->width() / 2.0f,
|
||||||
|
map_meta->i->height() / 2.0f);
|
||||||
|
{
|
||||||
|
bool gen_ok = GenSmallCircle(gas_data.pos_old,
|
||||||
|
gas_data.old_area_meta->i->rad(),
|
||||||
|
gas_data.new_area_meta->i->rad(),
|
||||||
|
gas_data.pos_new);
|
||||||
|
assert(gen_ok);
|
||||||
|
}
|
||||||
|
gas_data.rad_old = gas_data.old_area_meta->i->rad();
|
||||||
|
gas_data.rad_new = gas_data.new_area_meta->i->rad();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GasWaiting:
|
||||||
|
{
|
||||||
|
if (frame_no - gas_data.gas_start_frameno >=
|
||||||
|
gas_data.old_area_meta->i->wait_time() * SERVER_FRAME_RATE) {
|
||||||
|
gas_data.gas_mode = GasMoving;
|
||||||
|
gas_data.gas_progress = 0.0f;
|
||||||
|
gas_data.gas_start_frameno = frame_no;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GasMoving:
|
||||||
|
{
|
||||||
|
if (frame_no - gas_data.gas_start_frameno > 0 && !gas_data.is_last_gas) {
|
||||||
|
float total_distance = gas_data.rad_old - gas_data.rad_new +
|
||||||
|
(gas_data.pos_old - gas_data.pos_new).Norm();
|
||||||
|
float distance = gas_data.old_area_meta->i->shrink_speed() *
|
||||||
|
((frame_no - gas_data.gas_start_frameno) * (1.0 / SERVER_FRAME_RATE));
|
||||||
|
gas_data.gas_progress = std::min(distance, total_distance);
|
||||||
|
if (std::abs(total_distance-distance) >= 0.001f) {
|
||||||
|
int pre_area_id = gas_data.new_area_meta->i->id();
|
||||||
|
Vector2D pre_pos = gas_data.pos_new;
|
||||||
|
if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) {
|
||||||
|
gas_data.is_last_gas = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gas_data.gas_mode = GasWaiting;
|
||||||
|
gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id);
|
||||||
|
gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id + 1);
|
||||||
|
gas_data.gas_progress = 0.0f;
|
||||||
|
gas_data.gas_start_frameno = frame_no;
|
||||||
|
gas_data.pos_old = pre_pos;
|
||||||
|
{
|
||||||
|
bool gen_ok = GenSmallCircle(gas_data.pos_old,
|
||||||
|
gas_data.old_area_meta->i->rad(),
|
||||||
|
gas_data.new_area_meta->i->rad(),
|
||||||
|
gas_data.pos_new);
|
||||||
|
assert(gen_ok);
|
||||||
|
}
|
||||||
|
gas_data.rad_old = gas_data.old_area_meta->i->rad();
|
||||||
|
gas_data.rad_new = gas_data.new_area_meta->i->rad();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Room::GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float small_circle_rad,
|
||||||
|
Vector2D& out_pos)
|
||||||
|
{
|
||||||
|
if (big_circle_rad <= small_circle_rad) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
Vector2D dir = Vector2D::UP;
|
||||||
|
dir.Rotate(a8::RandAngle());
|
||||||
|
float rad = rand() % (int)(big_circle_rad - small_circle_rad);
|
||||||
|
out_pos = big_circle_pos + dir * rad;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -64,6 +64,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
void ClearDeletedObjects();
|
void ClearDeletedObjects();
|
||||||
void ProcAddedObjects();
|
void ProcAddedObjects();
|
||||||
|
void UpdateGas();
|
||||||
|
bool GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float small_circle_rad,
|
||||||
|
Vector2D& out_pos);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
unsigned short current_uniid = 0;
|
unsigned short current_uniid = 0;
|
||||||
|
@ -55,5 +55,7 @@ struct GasData
|
|||||||
float rad_new = 0.0f;
|
float rad_new = 0.0f;
|
||||||
float gas_progress = 0.0f;
|
float gas_progress = 0.0f;
|
||||||
long long gas_start_frameno = 0;
|
long long gas_start_frameno = 0;
|
||||||
MetaData::SafeArea* area_meta = nullptr;
|
MetaData::SafeArea* old_area_meta = nullptr;
|
||||||
|
MetaData::SafeArea* new_area_meta = nullptr;
|
||||||
|
bool is_last_gas = false;
|
||||||
};
|
};
|
||||||
|
@ -32,7 +32,7 @@ message SafeArea
|
|||||||
optional int32 level = 2; //安全区登记
|
optional int32 level = 2; //安全区登记
|
||||||
optional int32 rad = 3; //半径
|
optional int32 rad = 3; //半径
|
||||||
optional int32 wait_time = 4; //等待时间
|
optional int32 wait_time = 4; //等待时间
|
||||||
optional int32 shrink_time = 5; //收缩伤害
|
optional int32 shrink_speed = 5; //收缩速度
|
||||||
optional int32 hurt = 6; //伤害/秒
|
optional int32 hurt = 6; //伤害/秒
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user