This commit is contained in:
aozhiwei 2021-04-16 10:08:18 +08:00
commit d07a30345f
18 changed files with 144 additions and 43 deletions

View File

@ -430,6 +430,9 @@ void AndroidNewAI::UpdateNewAI()
abort(); abort();
} }
} }
if (hum->playing_skill) {
hum->UpdateSkill();
}
++node_.exec_frame_num; ++node_.exec_frame_num;
hum->shot_hold = false; hum->shot_hold = false;
switch (node_.main_state) { switch (node_.main_state) {

View File

@ -484,6 +484,12 @@ bool Creature::CanUseSkill(int skill_id)
if (!skill) { if (!skill) {
return false; return false;
} }
if (dead) {
return false;
}
if (playing_skill) {
return false;
}
return skill->GetCurrTimes() > 0; return skill->GetCurrTimes() > 0;
} }
@ -513,7 +519,10 @@ void Creature::DoSkill(int skill_id,
std::set<Creature*> target_list; std::set<Creature*> target_list;
SelectSkillTargets(CurrentSkill(), GetPos(), target_list); SelectSkillTargets(CurrentSkill(), GetPos(), target_list);
TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
UpdateSkill(); if (!CurrentSkill()->meta->phases.empty() &&
CurrentSkill()->meta->phases[0].time_offset <= 0) {
UpdateSkill();
}
} else { } else {
Entity* entity = room->GetEntityByUniId(skill_target_id_); Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity && entity->IsEntityType(ET_Player)) { if (entity && entity->IsEntityType(ET_Player)) {
@ -564,7 +573,7 @@ void Creature::ResetSkill()
void Creature::UpdateSkill() void Creature::UpdateSkill()
{ {
if (CurrentSkill()) { if (CurrentSkill() && !dead) {
if (curr_skill_phase < CurrentSkill()->meta->phases.size()) { if (curr_skill_phase < CurrentSkill()->meta->phases.size()) {
MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase]; MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase];
if (phase->time_offset >= CurrentSkill()->GetPassedTime()) { if (phase->time_offset >= CurrentSkill()->GetPassedTime()) {
@ -574,6 +583,8 @@ void Creature::UpdateSkill()
} else { } else {
playing_skill = false; playing_skill = false;
} }
} else {
playing_skill = false;
} }
} }
@ -848,9 +859,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
break; break;
case kBET_SummonObstacle: case kBET_SummonObstacle:
{ {
a8::Vec2 target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_; if (!dead) {
target_pos = buff_vec2_param1; a8::Vec2 target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_;
SummonObstacle(buff->meta->param1, target_pos); target_pos = buff_vec2_param1;
SummonObstacle(buff->meta->param1, target_pos);
}
} }
break; break;
case kBET_Sprint: case kBET_Sprint:
@ -1151,7 +1164,14 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance)
int weapon_idx = GetCurrWeapon()->weapon_idx; int weapon_idx = GetCurrWeapon()->weapon_idx;
*GetCurrWeapon() = Weapon(); *GetCurrWeapon() = Weapon();
GetCurrWeapon()->weapon_idx = weapon_idx; GetCurrWeapon()->weapon_idx = weapon_idx;
SetCurrWeapon(ChooseNextWeapon(slot_id, SPEC1_IS_BEGIN, SPEC1_IS_END)); Weapon* next_weapon = ChooseNextWeapon(slot_id, SPEC1_IS_BEGIN, SPEC1_IS_END);
if (!next_weapon) {
next_weapon = ChooseNextWeapon(SPEC2_IS_BEGIN, SPEC2_IS_BEGIN, SPEC2_IS_END);
}
if (!next_weapon) {
next_weapon = AutoChgWeapon();
}
SetCurrWeapon(next_weapon);
AutoLoadingBullet(); AutoLoadingBullet();
} }
} }
@ -1172,7 +1192,14 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance)
int weapon_idx = GetCurrWeapon()->weapon_idx; int weapon_idx = GetCurrWeapon()->weapon_idx;
*GetCurrWeapon() = Weapon(); *GetCurrWeapon() = Weapon();
GetCurrWeapon()->weapon_idx = weapon_idx; GetCurrWeapon()->weapon_idx = weapon_idx;
SetCurrWeapon(ChooseNextWeapon(slot_id, SPEC2_IS_BEGIN, SPEC2_IS_END)); Weapon* next_weapon = ChooseNextWeapon(slot_id, SPEC2_IS_BEGIN, SPEC2_IS_END);
if (!next_weapon) {
next_weapon = ChooseNextWeapon(SPEC1_IS_BEGIN, SPEC1_IS_BEGIN, SPEC1_IS_END);
}
if (!next_weapon) {
next_weapon = AutoChgWeapon();
}
SetCurrWeapon(next_weapon);
AutoLoadingBullet(); AutoLoadingBullet();
} }
} }
@ -1192,6 +1219,7 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance)
last_shot_frameno_ = room->GetFrameNo(); last_shot_frameno_ = room->GetFrameNo();
if (!need_sync_active_player && IsPlayer()) { if (!need_sync_active_player && IsPlayer()) {
room->frame_event.AddBulletNumChg((Human*)this); room->frame_event.AddBulletNumChg((Human*)this);
room->frame_event.AddWeaponAmmoChg((Human*)this);
} }
shot_ok = true; shot_ok = true;
} }
@ -1455,7 +1483,7 @@ Weapon* Creature::ChooseNextWeapon(int curr_weapon_slot_id, int begin_slot_id, i
break; break;
} }
} }
return next_weapon ? next_weapon : AutoChgWeapon(); return next_weapon;
} }
void Creature::SetCurrWeapon(Weapon* weapon) void Creature::SetCurrWeapon(Weapon* weapon)
@ -1473,3 +1501,10 @@ void Creature::SetCurrWeapon(Weapon* weapon)
#endif #endif
curr_weapon_ = weapon; curr_weapon_ = weapon;
} }
void Creature::ResetAllSkillCd()
{
for (auto& pair : skill_hash_) {
pair.second->ResetSkillCd();
}
}

View File

@ -45,6 +45,7 @@ class Creature : public MoveableEntity
std::function<bool ()> on_move_collision; std::function<bool ()> on_move_collision;
bool poisoning = false; bool poisoning = false;
long long poisoning_time = 0; long long poisoning_time = 0;
bool playing_skill = false;
Weapon car_weapon; Weapon car_weapon;
a8::Vec2 buff_vec2_param1; a8::Vec2 buff_vec2_param1;
@ -139,6 +140,8 @@ class Creature : public MoveableEntity
Weapon* ChooseNextWeapon(int curr_weapon_slot_id, int begin_slot_id, int end_slot_id); Weapon* ChooseNextWeapon(int curr_weapon_slot_id, int begin_slot_id, int end_slot_id);
Weapon* GetCurrWeapon() { return curr_weapon_; }; Weapon* GetCurrWeapon() { return curr_weapon_; };
void SetCurrWeapon(Weapon* weapon); void SetCurrWeapon(Weapon* weapon);
void ResetAllSkillCd();
void UpdateSkill();
private: private:
@ -147,7 +150,6 @@ private:
virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos); virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos);
virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos); virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos);
void UpdateSkill();
void ProcSkillPhase(MetaData::SkillPhase* phase); void ProcSkillPhase(MetaData::SkillPhase* phase);
void ProcBuffEffect(Creature* caster, Buff* buff); void ProcBuffEffect(Creature* caster, Buff* buff);
void TriggerOneObjectBuff(Skill* skill, Creature* target, BuffTriggerType_e trigger_type); void TriggerOneObjectBuff(Skill* skill, Creature* target, BuffTriggerType_e trigger_type);
@ -176,7 +178,6 @@ private:
a8::Vec2 skill_dir_; a8::Vec2 skill_dir_;
float skill_param1 = 0; float skill_param1 = 0;
bool playing_skill = false;
size_t curr_skill_phase = 0; size_t curr_skill_phase = 0;
Skill* curr_skill_ = nullptr; Skill* curr_skill_ = nullptr;
int skill_target_id_ = 0; int skill_target_id_ = 0;

View File

@ -249,6 +249,7 @@ void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb)
stats_pb->set_player_avatar_url(avatar_url); stats_pb->set_player_avatar_url(avatar_url);
stats_pb->set_charid(meta->i->id()); stats_pb->set_charid(meta->i->id());
stats_pb->set_team_id(team_id); stats_pb->set_team_id(team_id);
stats_pb->set_nickname(name);
if (!dead) { if (!dead) {
stats_pb->set_time_alive(room->GetFrameNo() * 1000.0f / SERVER_FRAME_RATE); stats_pb->set_time_alive(room->GetFrameNo() * 1000.0f / SERVER_FRAME_RATE);
@ -1789,12 +1790,14 @@ void Human::_UpdateSpecMove()
void Human::_UpdateMove(int speed) void Human::_UpdateMove(int speed)
{ {
do { if (!HasBuffEffect(kBET_Vertigo)) {
int distance = std::min(5, speed); do {
_InternalUpdateMove(distance); int distance = std::min(5, speed);
speed -= distance; _InternalUpdateMove(distance);
} while (speed > 0); speed -= distance;
CheckSpecObject(); } while (speed > 0);
CheckSpecObject();
}
} }
void Human::ChangeToRace(RaceType_e race, int level) void Human::ChangeToRace(RaceType_e race, int level)

View File

@ -51,7 +51,10 @@ void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info)
if (!map_instance) { if (!map_instance) {
map_instance = RandMapInstance(init_info.room_mode); map_instance = RandMapInstance(init_info.room_mode);
} else if (map_instance->GetMapMeta()->i->map_mode() != init_info.room_mode) { } else if (map_instance->GetMapMeta()->i->map_mode() != init_info.room_mode) {
#ifdef DEBUG
#else
map_instance = RandMapInstance(init_info.room_mode); map_instance = RandMapInstance(init_info.room_mode);
#endif
} }
if (!map_instance) { if (!map_instance) {

View File

@ -80,6 +80,17 @@ namespace MetaData
abort(); abort();
} }
} }
first_safearea_center = a8::Vec2(i->map_width() / 2.0f,
i->map_height() / 2.0f);
if (!i->first_safearea_center().empty()) {
std::vector<std::string> strings;
a8::Split(i->first_safearea_center(), strings, ':');
if (strings.size() != 2) {
abort();
}
first_safearea_center = a8::Vec2(a8::XValue(strings[0]).GetDouble(),
a8::XValue(strings[1]).GetDouble());
}
if (i->player() < 10) { if (i->player() < 10) {
abort(); abort();
} }

View File

@ -28,6 +28,7 @@ namespace MetaData
int refresh_robot_min_time = 0; int refresh_robot_min_time = 0;
int refresh_robot_max_time = 0; int refresh_robot_max_time = 0;
std::vector<int> buff_list; std::vector<int> buff_list;
a8::Vec2 first_safearea_center;
void Init(); void Init();
std::string RandTemplate(); std::string RandTemplate();

View File

@ -64,14 +64,14 @@ void MolotorCocktailMiTask::Check()
} }
} }
); );
a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1;
sender.Get()->buff_vec2_param1 = sender.Get()->GetPos();
for (Creature* target : objects) { for (Creature* target : objects) {
if (!target->GetBuffById(meta->i->buffid())) { if (!target->GetBuffById(meta->i->buffid())) {
a8::Vec2 old_buff_vec2_param1 = target->buff_vec2_param1;
target->buff_vec2_param1 = target->GetPos();
target->MustBeAddBuff(sender.Get(), meta->i->buffid()); target->MustBeAddBuff(sender.Get(), meta->i->buffid());
target->buff_vec2_param1 = old_buff_vec2_param1;
} }
} }
sender.Get()->buff_vec2_param1 = old_buff_vec2_param1;
} }
} }

View File

@ -129,8 +129,15 @@ void Player::InternalUpdate(int delta_time)
if (has_use_item_id) { if (has_use_item_id) {
UpdateUseItemId(); UpdateUseItemId();
} }
<<<<<<< HEAD
UpdateViewObjects(); UpdateViewObjects();
} }
=======
if (playing_skill) {
UpdateSkill();
}
}
>>>>>>> dev
} }
void Player::UpdateMove() void Player::UpdateMove()
@ -625,7 +632,7 @@ void Player::LootInteraction(Loot* entity)
case IS_15XSCOPE: case IS_15XSCOPE:
{ {
if (item_meta->i->_inventory_slot() - IS_1XSCOPE > curr_scope_idx) { if (item_meta->i->_inventory_slot() - IS_1XSCOPE > curr_scope_idx) {
curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE; curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE;
} }
} }
break; break;

View File

@ -64,14 +64,14 @@ void PosionGasMiTask::Check()
} }
} }
); );
a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1;
sender.Get()->buff_vec2_param1 = sender.Get()->GetPos();
for (Creature* target : objects) { for (Creature* target : objects) {
if (!target->GetBuffById(meta->i->buffid())) { if (!target->GetBuffById(meta->i->buffid())) {
a8::Vec2 old_buff_vec2_param1 = target->buff_vec2_param1;
target->buff_vec2_param1 = target->GetPos();
target->MustBeAddBuff(sender.Get(), meta->i->buffid()); target->MustBeAddBuff(sender.Get(), meta->i->buffid());
target->buff_vec2_param1 = old_buff_vec2_param1;
} }
} }
sender.Get()->buff_vec2_param1 = old_buff_vec2_param1;
} }
} }

View File

@ -1243,27 +1243,11 @@ void Room::UpdateGasMoving()
} }
if (std::abs(gas_data_.gas_progress - gas_data_.rad_new) <= 0.001f) { if (std::abs(gas_data_.gas_progress - gas_data_.rad_new) <= 0.001f) {
int pre_area_id = gas_data_.new_area_meta->i->id(); int pre_area_id = gas_data_.new_area_meta->i->id();
a8::Vec2 pre_pos = gas_data_.pos_new;
if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) { if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) {
gas_data_.is_last_gas = true; gas_data_.is_last_gas = true;
return; return;
} }
gas_data_.gas_mode = GasWaiting; ForwardGasRing(1);
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 = gas_data_.old_area_meta->i->rad();
gas_data_.gas_start_frameno = GetFrameNo();
gas_data_.pos_old = pre_pos;
gas_data_.pos_old_bk = gas_data_.pos_old;
{
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();
if (!MetaMgr::Instance()->GetSafeArea(gas_data_.new_area_meta->i->id() + 2)) { if (!MetaMgr::Instance()->GetSafeArea(gas_data_.new_area_meta->i->id() + 2)) {
#if 1 #if 1
//最后一圈 //最后一圈
@ -1308,8 +1292,7 @@ void Room::UpdateGasJump()
gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1); gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1);
gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); gas_data_.gas_progress = gas_data_.old_area_meta->i->rad();
gas_data_.gas_start_frameno = GetFrameNo(); gas_data_.gas_start_frameno = GetFrameNo();
gas_data_.pos_old = a8::Vec2(map_meta_->i->map_width() / 2.0f, gas_data_.pos_old = map_meta_->first_safearea_center;
map_meta_->i->map_height() / 2.0f);
gas_data_.pos_old_bk = gas_data_.pos_old; gas_data_.pos_old_bk = gas_data_.pos_old;
{ {
bool gen_ok = GenSmallCircle(gas_data_.pos_old, bool gen_ok = GenSmallCircle(gas_data_.pos_old,
@ -1320,6 +1303,9 @@ void Room::UpdateGasJump()
} }
gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); gas_data_.rad_old = gas_data_.old_area_meta->i->rad();
gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); gas_data_.rad_new = gas_data_.new_area_meta->i->rad();
if (map_meta_->i->init_gas_ring() > 0) {
ForwardGasRing(map_meta_->i->init_gas_ring());
}
battle_start_frameno_ = GetFrameNo(); battle_start_frameno_ = GetFrameNo();
xtimer.DeleteTimer(auto_jump_timer_); xtimer.DeleteTimer(auto_jump_timer_);
auto_jump_timer_ = nullptr; auto_jump_timer_ = nullptr;
@ -1723,6 +1709,7 @@ void Room::ShuaPlane()
for (auto& pair : human_hash_) { for (auto& pair : human_hash_) {
pair.second->MustBeAddBuff(pair.second, FLY_BUFFID); pair.second->MustBeAddBuff(pair.second, FLY_BUFFID);
pair.second->ResetAllSkillCd();
pair.second->SetPos(plane.curr_pos); pair.second->SetPos(plane.curr_pos);
pair.second->attack_dir = plane.dir; pair.second->attack_dir = plane.dir;
pair.second->SetMoveDir(plane.dir); pair.second->SetMoveDir(plane.dir);
@ -3681,3 +3668,33 @@ void Room::InitAndroidAI()
} }
#endif #endif
} }
void Room::ForwardGasRing(int n)
{
while (n > 0) {
int pre_area_id = gas_data_.new_area_meta->i->id();
if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) {
gas_data_.is_last_gas = true;
return;
}
a8::Vec2 pre_pos = gas_data_.pos_new;
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 = gas_data_.old_area_meta->i->rad();
gas_data_.gas_start_frameno = GetFrameNo();
gas_data_.pos_old = pre_pos;
gas_data_.pos_old_bk = gas_data_.pos_old;
{
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);
if (!gen_ok) {
abort();
}
}
gas_data_.rad_old = gas_data_.old_area_meta->i->rad();
gas_data_.rad_new = gas_data_.new_area_meta->i->rad();
--n;
}
}

View File

@ -252,6 +252,7 @@ private:
void ShuaLastGas(); void ShuaLastGas();
size_t GetRoomMaxPlayerNum(); size_t GetRoomMaxPlayerNum();
void InitAndroidAI(); void InitAndroidAI();
void ForwardGasRing(int n);
#ifdef DEBUG #ifdef DEBUG
void InitDebugInfo(); void InitDebugInfo();

View File

@ -7,6 +7,7 @@
void Skill::Initialzie() void Skill::Initialzie()
{ {
curr_times_ = GetMaxTimes();
switch (meta->i->skill_type()) { switch (meta->i->skill_type()) {
case kActiveSkill: case kActiveSkill:
{ {
@ -132,3 +133,14 @@ void Skill::NotifySkillState()
owner->room->frame_event.AddSkillCurrTimesChg(owner->AllocWeakPtr(), meta->i->skill_id(), GetCurrTimes()); owner->room->frame_event.AddSkillCurrTimesChg(owner->AllocWeakPtr(), meta->i->skill_id(), GetCurrTimes());
} }
} }
void Skill::ResetSkillCd()
{
if (meta->i->skill_id() != TURN_OVER_SKILL_ID) {
curr_times_ = 0;
if (inc_times_timer_) {
owner->room->xtimer.ModifyTimer(inc_times_timer_, GetCd() / FRAME_RATE_MS);
NotifySkillState();
}
}
}

View File

@ -34,6 +34,7 @@ class Skill
int GetMaxTimes(); int GetMaxTimes();
void DecTimes(); void DecTimes();
void FillMFSkill(cs::MFSkill* skill_pb); void FillMFSkill(cs::MFSkill* skill_pb);
void ResetSkillCd();
void ClearPassiveSkillBuff(); void ClearPassiveSkillBuff();
void AddPassiveSkillBuff(); void AddPassiveSkillBuff();

View File

@ -93,6 +93,9 @@ void ZombieModeAI::UpdateAI()
abort(); abort();
} }
} }
if (hum->playing_skill) {
hum->UpdateSkill();
}
++node_->exec_frame_num; ++node_->exec_frame_num;
hum->shot_hold = false; hum->shot_hold = false;
switch (node_->main_state) { switch (node_->main_state) {

View File

@ -669,6 +669,7 @@ message MFPlayerStats
optional int32 sex = 37 [default = 0]; // optional int32 sex = 37 [default = 0]; //
optional int32 charid = 38; //id optional int32 charid = 38; //id
optional int32 team_id = 39; //tamid optional int32 team_id = 39; //tamid
optional string nickname = 43; //
} }
// //

View File

@ -34,6 +34,8 @@ message Map
optional int32 safearea = 11; optional int32 safearea = 11;
optional string game_start_buff_list = 12; optional string game_start_buff_list = 12;
optional string map_pic = 13; optional string map_pic = 13;
optional string first_safearea_center = 14;
optional int32 init_gas_ring = 15;
} }
message MapThing message MapThing

@ -1 +1 @@
Subproject commit 1bcc24955410e67342d5e44c2e35addff5111fca Subproject commit 8b6410826da2c0c667abdacadae6d7c00f70300d