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();
}
}
if (hum->playing_skill) {
hum->UpdateSkill();
}
++node_.exec_frame_num;
hum->shot_hold = false;
switch (node_.main_state) {

View File

@ -484,6 +484,12 @@ bool Creature::CanUseSkill(int skill_id)
if (!skill) {
return false;
}
if (dead) {
return false;
}
if (playing_skill) {
return false;
}
return skill->GetCurrTimes() > 0;
}
@ -513,7 +519,10 @@ void Creature::DoSkill(int skill_id,
std::set<Creature*> target_list;
SelectSkillTargets(CurrentSkill(), GetPos(), target_list);
TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
UpdateSkill();
if (!CurrentSkill()->meta->phases.empty() &&
CurrentSkill()->meta->phases[0].time_offset <= 0) {
UpdateSkill();
}
} else {
Entity* entity = room->GetEntityByUniId(skill_target_id_);
if (entity && entity->IsEntityType(ET_Player)) {
@ -564,7 +573,7 @@ void Creature::ResetSkill()
void Creature::UpdateSkill()
{
if (CurrentSkill()) {
if (CurrentSkill() && !dead) {
if (curr_skill_phase < CurrentSkill()->meta->phases.size()) {
MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase];
if (phase->time_offset >= CurrentSkill()->GetPassedTime()) {
@ -574,6 +583,8 @@ void Creature::UpdateSkill()
} else {
playing_skill = false;
}
} else {
playing_skill = false;
}
}
@ -848,9 +859,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
break;
case kBET_SummonObstacle:
{
a8::Vec2 target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_;
target_pos = buff_vec2_param1;
SummonObstacle(buff->meta->param1, target_pos);
if (!dead) {
a8::Vec2 target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_;
target_pos = buff_vec2_param1;
SummonObstacle(buff->meta->param1, target_pos);
}
}
break;
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;
*GetCurrWeapon() = Weapon();
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();
}
}
@ -1172,7 +1192,14 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance)
int weapon_idx = GetCurrWeapon()->weapon_idx;
*GetCurrWeapon() = Weapon();
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();
}
}
@ -1192,6 +1219,7 @@ void Creature::Shot(a8::Vec2& target_dir, bool& shot_ok, float fly_distance)
last_shot_frameno_ = room->GetFrameNo();
if (!need_sync_active_player && IsPlayer()) {
room->frame_event.AddBulletNumChg((Human*)this);
room->frame_event.AddWeaponAmmoChg((Human*)this);
}
shot_ok = true;
}
@ -1455,7 +1483,7 @@ Weapon* Creature::ChooseNextWeapon(int curr_weapon_slot_id, int begin_slot_id, i
break;
}
}
return next_weapon ? next_weapon : AutoChgWeapon();
return next_weapon;
}
void Creature::SetCurrWeapon(Weapon* weapon)
@ -1473,3 +1501,10 @@ void Creature::SetCurrWeapon(Weapon* weapon)
#endif
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;
bool poisoning = false;
long long poisoning_time = 0;
bool playing_skill = false;
Weapon car_weapon;
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* GetCurrWeapon() { return curr_weapon_; };
void SetCurrWeapon(Weapon* weapon);
void ResetAllSkillCd();
void UpdateSkill();
private:
@ -147,7 +150,6 @@ private:
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);
void UpdateSkill();
void ProcSkillPhase(MetaData::SkillPhase* phase);
void ProcBuffEffect(Creature* caster, Buff* buff);
void TriggerOneObjectBuff(Skill* skill, Creature* target, BuffTriggerType_e trigger_type);
@ -176,7 +178,6 @@ private:
a8::Vec2 skill_dir_;
float skill_param1 = 0;
bool playing_skill = false;
size_t curr_skill_phase = 0;
Skill* curr_skill_ = nullptr;
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_charid(meta->i->id());
stats_pb->set_team_id(team_id);
stats_pb->set_nickname(name);
if (!dead) {
stats_pb->set_time_alive(room->GetFrameNo() * 1000.0f / SERVER_FRAME_RATE);
@ -1789,12 +1790,14 @@ void Human::_UpdateSpecMove()
void Human::_UpdateMove(int speed)
{
do {
int distance = std::min(5, speed);
_InternalUpdateMove(distance);
speed -= distance;
} while (speed > 0);
CheckSpecObject();
if (!HasBuffEffect(kBET_Vertigo)) {
do {
int distance = std::min(5, speed);
_InternalUpdateMove(distance);
speed -= distance;
} while (speed > 0);
CheckSpecObject();
}
}
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) {
map_instance = RandMapInstance(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);
#endif
}
if (!map_instance) {

View File

@ -80,6 +80,17 @@ namespace MetaData
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) {
abort();
}

View File

@ -28,6 +28,7 @@ namespace MetaData
int refresh_robot_min_time = 0;
int refresh_robot_max_time = 0;
std::vector<int> buff_list;
a8::Vec2 first_safearea_center;
void Init();
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) {
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->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) {
UpdateUseItemId();
}
<<<<<<< HEAD
UpdateViewObjects();
}
=======
if (playing_skill) {
UpdateSkill();
}
}
>>>>>>> dev
}
void Player::UpdateMove()
@ -625,7 +632,7 @@ void Player::LootInteraction(Loot* entity)
case IS_15XSCOPE:
{
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;

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) {
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->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) {
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)) {
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 = 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();
ForwardGasRing(1);
if (!MetaMgr::Instance()->GetSafeArea(gas_data_.new_area_meta->i->id() + 2)) {
#if 1
//最后一圈
@ -1308,8 +1292,7 @@ void Room::UpdateGasJump()
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_start_frameno = GetFrameNo();
gas_data_.pos_old = a8::Vec2(map_meta_->i->map_width() / 2.0f,
map_meta_->i->map_height() / 2.0f);
gas_data_.pos_old = map_meta_->first_safearea_center;
gas_data_.pos_old_bk = 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_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();
xtimer.DeleteTimer(auto_jump_timer_);
auto_jump_timer_ = nullptr;
@ -1723,6 +1709,7 @@ void Room::ShuaPlane()
for (auto& pair : human_hash_) {
pair.second->MustBeAddBuff(pair.second, FLY_BUFFID);
pair.second->ResetAllSkillCd();
pair.second->SetPos(plane.curr_pos);
pair.second->attack_dir = plane.dir;
pair.second->SetMoveDir(plane.dir);
@ -3681,3 +3668,33 @@ void Room::InitAndroidAI()
}
#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();
size_t GetRoomMaxPlayerNum();
void InitAndroidAI();
void ForwardGasRing(int n);
#ifdef DEBUG
void InitDebugInfo();

View File

@ -7,6 +7,7 @@
void Skill::Initialzie()
{
curr_times_ = GetMaxTimes();
switch (meta->i->skill_type()) {
case kActiveSkill:
{
@ -132,3 +133,14 @@ void Skill::NotifySkillState()
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();
void DecTimes();
void FillMFSkill(cs::MFSkill* skill_pb);
void ResetSkillCd();
void ClearPassiveSkillBuff();
void AddPassiveSkillBuff();

View File

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

View File

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

View File

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

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