From 871e44508fe87e816350c9824aec8cc02b4c9b2a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 2 Apr 2021 16:31:45 +0800 Subject: [PATCH 01/21] 1 --- server/gameserver/constant.h | 9 ++++++--- server/gameserver/creature.cc | 9 +++++++++ server/gameserver/human.cc | 8 -------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 62a77b32..605c4046 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -89,8 +89,6 @@ enum InventorySlot_e IS_SMOKE = 6, IS_HEALTHKIT = 7, //医疗包 IS_PAIN_KILLER = 8, //止痛药 - IS_POSION_GAS_BOMB = 9, - IS_MOLOTOR_COCKTAIL = 10, IS_1XSCOPE = 12, IS_2XSCOPE = 13, @@ -98,6 +96,11 @@ enum InventorySlot_e IS_8XSCOPE = 15, IS_15XSCOPE = 16, + IS_POSION_GAS_BOMB = 17, //毒气弹 + IS_MOLOTOR_COCKTAIL = 18, //燃烧瓶 + IS_TRAP = 19, //陷井 + IS_MINE = 20, //地雷 + IS_END }; @@ -368,7 +371,7 @@ const int SERVER_FRAME_RATE = 20; const int SYNC_FRAME_RATE = 10; const float FRAME_RATE_MS = 1000.0f / SERVER_FRAME_RATE; -const int MAX_WEAPON_NUM = 5; +const int MAX_WEAPON_NUM = 9; const int MAX_SKIN_LV = 9; const int GUN_SLOT1 = 1; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d6023172..a905d178 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -76,6 +76,15 @@ void InternalShot(Creature* c, Creature::Creature():MoveableEntity() { + weapons.reserve(MAX_WEAPON_NUM); + for (size_t i = 0; i < MAX_WEAPON_NUM; ++i) { + auto& weapon = a8::FastAppend(weapons); + weapon.weapon_idx = i; + weapon.weapon_id = 0; + weapon.weapon_lv = 0; + weapon.ammo = 0; + } + weak_ptr_chunk_.Set(this); inventory_[IS_1XSCOPE] = 1; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 19a79545..e08c7456 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -43,14 +43,6 @@ Human::Human():Creature() default_weapon.ammo = 1; default_weapon.meta = MetaMgr::Instance()->GetEquip(default_weapon.weapon_id); default_weapon.Recalc(); - weapons.reserve(MAX_WEAPON_NUM); - for (size_t i = 0; i < MAX_WEAPON_NUM; ++i) { - auto& weapon = a8::FastAppend(weapons); - weapon.weapon_idx = i; - weapon.weapon_id = 0; - weapon.weapon_lv = 0; - weapon.ammo = 0; - } for (int i = 0; i < kSkinNum; ++i) { Skin& skin = a8::FastAppend(skins); skin.skin_id = 0; From e1ba7d045cb2c304c472835a89cf6621cad0f0f3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 2 Apr 2021 19:21:22 +0800 Subject: [PATCH 02/21] 1 --- server/gameserver/bullet.cc | 15 ++-- server/gameserver/bullet.h | 6 +- server/gameserver/frag_mitask.cc | 98 +++++++++++++++++++++++-- server/gameserver/frag_mitask.h | 1 - server/tools/protobuild/metatable.proto | 2 +- 5 files changed, 102 insertions(+), 20 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 7cde96a7..2fb35b33 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -173,7 +173,7 @@ void Bullet::ProcBomb() block = true; } } - float delay_time = 0; + int delay_time = 0; if (!block) { delay_time = gun_meta->i->missiles_time(); } @@ -343,13 +343,9 @@ void Bullet::Check(float distance) } } -void Bullet::ProcFragBomb(float delay_time) +void Bullet::ProcFragBomb(int delay_time) { if (sender.Get()) { - RoomObstacle* dummy_obstacle = nullptr; - if (delay_time > 0.0001) { - dummy_obstacle = room->CreateObstacle(0, 0, 0); - } FragMiTask* task = new FragMiTask(); task->room = room; task->sender.Attach(sender.Get()); @@ -357,9 +353,8 @@ void Bullet::ProcFragBomb(float delay_time) task->gun_meta = gun_meta; task->meta = meta; task->atk = GetAtk(); - task->dummy_obstacle_uniid = dummy_obstacle ? dummy_obstacle->GetEntityUniId() : 0; room->xtimer.AddDeadLineTimerAndAttach - (std::max(1, (int)(SERVER_FRAME_RATE * delay_time)), + (std::max(1, (int)(delay_time / FRAME_RATE_MS)), a8::XParams() .SetSender(task), [] (const a8::XParams& param) @@ -377,12 +372,12 @@ void Bullet::ProcFragBomb(float delay_time) } } -void Bullet::ProcPosionGasBomb(float delay_time) +void Bullet::ProcPosionGasBomb(int delay_time) { } -void Bullet::ProcMolotorCocktailBomb(float delay_time) +void Bullet::ProcMolotorCocktailBomb(int delay_time) { } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 9582448e..a2f59a8d 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -43,9 +43,9 @@ protected: void OnHit(std::set& objects); void ProcBomb(); void ProcSmokeBomb(); - void ProcFragBomb(float delay_time); - void ProcPosionGasBomb(float delay_time); - void ProcMolotorCocktailBomb(float delay_time); + void ProcFragBomb(int delay_time); + void ProcPosionGasBomb(int delay_time); + void ProcMolotorCocktailBomb(int delay_time); bool IsBomb(); inline void MapServiceUpdate(); float GetAtk(); diff --git a/server/gameserver/frag_mitask.cc b/server/gameserver/frag_mitask.cc index 3c8a7fc0..38bba3de 100644 --- a/server/gameserver/frag_mitask.cc +++ b/server/gameserver/frag_mitask.cc @@ -5,13 +5,101 @@ #include "player.h" #include "metadata.h" #include "metamgr.h" +#include "gridservice.h" +#include "creature.h" +#include "obstacle.h" void FragMiTask::Done() { - if (sender.Get()) { - room->frame_event.AddExplosionEx(sender, - meta->i->id(), - bomb_pos, - gun_meta->i->explosion_effect()); + if (!sender.Get()) { + return; } + room->frame_event.AddExplosionEx(sender, + meta->i->id(), + bomb_pos, + gun_meta->i->explosion_effect()); + std::set grid_list; + sender.Get()->room->grid_service->GetAllCellsByXy + ( + sender.Get()->room, + bomb_pos.x, + bomb_pos.y, + grid_list + ); + std::set objects; + sender.Get()->room->grid_service->TouchCreatures + ( + sender.Get()->room->GetRoomIdx(), + grid_list, + [this, &objects] (Creature* c, bool& stop) + { + if (sender.Get()->IsProperTarget(c)) { + if (bomb_pos.Distance(c->GetPos()) < meta->i->explosion_range()) { + objects.insert(c); + } + } + } + ); + std::set entitys; + sender.Get()->room->grid_service->TouchAllLayerEntityList + ( + sender.Get()->room->GetRoomIdx(), + grid_list, + [this, &entitys] (Entity* entity, bool& stop) + { + } + ); + + for (auto& target : objects) { + if (target->HasBuffEffect(kBET_Invincible) || + target->HasBuffEffect(kBET_AdPlaying)) { + continue; + } + if (sender.Get()->room->GetRoomMode() == kZombieMode && + sender.Get()->GetRace() == target->GetRace()) { + continue; + } + if (!target->dead) { + float dmg = GetAtk() * (1 + sender.Get()->GetAttrRate(kHAT_Atk)) + + sender.Get()->GetAttrAbs(kHAT_Atk); + float def = target->ability.def * (1 + target->GetAttrRate(kHAT_Def)) + + target->GetAttrAbs(kHAT_Def); + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + finaly_dmg = std::max(finaly_dmg, 0.0f); + target->DecHP(finaly_dmg, + sender.Get()->GetEntityUniId(), + sender.Get()->GetName(), + gun_meta->i->id()); + } + } + + for (auto& target : entitys) { + if (target->GetEntityType() != ET_Obstacle) { + continue; + } + Obstacle* obstacle = (Obstacle*)target; + if (!obstacle->IsDead(room) && + obstacle->Attackable() && + !obstacle->IsTerminatorAirDropBox(room)) { + float dmg = GetAtk() * (1 + sender.Get()->GetAttrRate(kHAT_Atk)) + + sender.Get()->GetAttrAbs(kHAT_Atk); + float def = 0; + float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); + obstacle->SetHealth(room, std::max(0.0f, obstacle->GetHealth(room) - finaly_dmg)); + if (obstacle->GetHealth(room) <= 0.01f) { + obstacle->Die(room); + } + if (obstacle->IsDead(room)) { + if (obstacle->meta->i->damage_dia() > 0.01f && + obstacle->meta->i->damage() > 0.01f) { + #if 0 + obstacle->Explosion(this); + #endif + } + sender.Get()->DropItems(obstacle); + } + obstacle->BroadcastFullState(room); + } + } + } diff --git a/server/gameserver/frag_mitask.h b/server/gameserver/frag_mitask.h index 66b6d8ea..b402645d 100644 --- a/server/gameserver/frag_mitask.h +++ b/server/gameserver/frag_mitask.h @@ -19,7 +19,6 @@ class FragMiTask : public MicroTask MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; float atk = 0; - int dummy_obstacle_uniid = 0; void Done(); float GetAtk() { return atk; } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index b65722e5..591a1281 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -106,7 +106,7 @@ message Equip optional string param2 = 44; optional int32 reloadtype = 46; optional float Recoil_force = 47; - optional float missiles_time = 48; + optional int32 missiles_time = 48; optional int32 heroid = 49; optional string inventory_slot = 31; //库存槽位 From 5d2039cb2811f6292446454541f55e17b4899c37 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 2 Apr 2021 19:35:23 +0800 Subject: [PATCH 03/21] 1 --- server/gameserver/bullet.cc | 54 +++++++++++++++++--- server/gameserver/molotor_cocktail_mitask.cc | 31 ----------- server/gameserver/molotor_cocktail_mitask.h | 5 +- server/gameserver/posiongas_mitask.cc | 32 +----------- server/gameserver/posiongas_mitask.h | 5 +- 5 files changed, 53 insertions(+), 74 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 2fb35b33..6ec1f08b 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -204,16 +204,12 @@ void Bullet::ProcBomb() case IS_POSION_GAS_BOMB: { //毒气弹 - a8::Vec2 bomb_pos = GetPos(); - room->frame_event.AddSmoke(this, meta->i->id(), bomb_pos); ProcPosionGasBomb(delay_time); } break; case IS_MOLOTOR_COCKTAIL: { //燃烧瓶 - a8::Vec2 bomb_pos = GetPos(); - room->frame_event.AddSmoke(this, meta->i->id(), bomb_pos); ProcMolotorCocktailBomb(delay_time); } break; @@ -374,10 +370,56 @@ void Bullet::ProcFragBomb(int delay_time) void Bullet::ProcPosionGasBomb(int delay_time) { - + if (sender.Get()) { + PosionGasMiTask* task = new PosionGasMiTask(); + task->room = room; + task->sender.Attach(sender.Get()); + task->bomb_pos = GetPos(); + task->gun_meta = gun_meta; + task->meta = meta; + room->xtimer.AddDeadLineTimerAndAttach + (std::max(1, (int)(delay_time / FRAME_RATE_MS)), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + task->Done(); + }, + &task->timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + delete task; + } + ); + } } void Bullet::ProcMolotorCocktailBomb(int delay_time) { - + if (sender.Get()) { + MolotorCocktailMiTask* task = new MolotorCocktailMiTask(); + task->room = room; + task->sender.Attach(sender.Get()); + task->bomb_pos = GetPos(); + task->gun_meta = gun_meta; + task->meta = meta; + room->xtimer.AddDeadLineTimerAndAttach + (std::max(1, (int)(delay_time / FRAME_RATE_MS)), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + task->Done(); + }, + &task->timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + delete task; + } + ); + } } diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index b6842707..b79cde40 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -5,37 +5,6 @@ #include "player.h" #include "metadata.h" -void MolotorCocktailMiTask::Check() -{ - { - std::list deleted_hums; - for (auto& hum : player_set) { - if (bomb_pos.Distance(hum->GetPos()) > gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - deleted_hums.push_back(hum); - } - } - for (auto& hum : deleted_hums) { - player_set.erase(hum); - } - } - room->TouchPlayerList - (a8::XParams(), - [this] (Player* hum, a8::XParams&) -> bool - { - if (bomb_pos.Distance(hum->GetPos()) < gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - if (!hum->HasBuffEffect(kBET_HunLuan)) { - hum->AddBuff(nullptr, buff_meta, 1, nullptr); - player_set.insert(hum); - } - } - return true; - }); -} - void MolotorCocktailMiTask::Done() { - for (auto& hum : player_set) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - } } diff --git a/server/gameserver/molotor_cocktail_mitask.h b/server/gameserver/molotor_cocktail_mitask.h index a4ecdc14..526cbdc3 100644 --- a/server/gameserver/molotor_cocktail_mitask.h +++ b/server/gameserver/molotor_cocktail_mitask.h @@ -15,10 +15,9 @@ class MolotorCocktailMiTask : public MicroTask public: Room* room = nullptr; a8::Vec2 bomb_pos; - std::set player_set; - MetaData::Buff* buff_meta = nullptr; + CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; + MetaData::Equip* meta = nullptr; - void Check(); void Done(); }; diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index 7e690420..eeb4f9bf 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -5,37 +5,7 @@ #include "player.h" #include "metadata.h" -void PosionGasMiTask::Check() -{ - { - std::list deleted_hums; - for (auto& hum : player_set) { - if (bomb_pos.Distance(hum->GetPos()) > gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - deleted_hums.push_back(hum); - } - } - for (auto& hum : deleted_hums) { - player_set.erase(hum); - } - } - room->TouchPlayerList - (a8::XParams(), - [this] (Player* hum, a8::XParams&) -> bool - { - if (bomb_pos.Distance(hum->GetPos()) < gun_meta->i->bullet_rad() + hum->meta->i->radius()) { - if (!hum->HasBuffEffect(kBET_HunLuan)) { - hum->AddBuff(nullptr, buff_meta, 1, nullptr); - player_set.insert(hum); - } - } - return true; - }); -} - void PosionGasMiTask::Done() { - for (auto& hum : player_set) { - hum->RemoveBuffByEffectId(kBET_HunLuan); - } + } diff --git a/server/gameserver/posiongas_mitask.h b/server/gameserver/posiongas_mitask.h index e771abe7..705bc682 100644 --- a/server/gameserver/posiongas_mitask.h +++ b/server/gameserver/posiongas_mitask.h @@ -15,10 +15,9 @@ class PosionGasMiTask : public MicroTask public: Room* room = nullptr; a8::Vec2 bomb_pos; - std::set player_set; - MetaData::Buff* buff_meta = nullptr; + CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; + MetaData::Equip* meta = nullptr; - void Check(); void Done(); }; From 324aaadb0acbba1c4d4455b4164d5436abbcf148 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 2 Apr 2021 20:07:39 +0800 Subject: [PATCH 04/21] 1 --- server/gameserver/bullet.cc | 39 ++++++++++++++++---- server/gameserver/molotor_cocktail_mitask.cc | 4 ++ server/gameserver/molotor_cocktail_mitask.h | 1 + server/gameserver/posiongas_mitask.cc | 5 +++ server/gameserver/posiongas_mitask.h | 1 + 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 6ec1f08b..3c8476cf 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -377,22 +377,34 @@ void Bullet::ProcPosionGasBomb(int delay_time) task->bomb_pos = GetPos(); task->gun_meta = gun_meta; task->meta = meta; - room->xtimer.AddDeadLineTimerAndAttach - (std::max(1, (int)(delay_time / FRAME_RATE_MS)), + + room->xtimer.AddRepeatTimerAndAttach + (SERVER_FRAME_RATE / 2, a8::XParams() .SetSender(task), [] (const a8::XParams& param) { PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); - task->Done(); + task->Check(); }, - &task->timer_attacher.timer_list_, + &task->timer_attacher.timer_list_); + + room->xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + }, + &room->timer_attacher.timer_list_, [] (const a8::XParams& param) { PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + task->Done(); delete task; } ); + } } @@ -405,19 +417,30 @@ void Bullet::ProcMolotorCocktailBomb(int delay_time) task->bomb_pos = GetPos(); task->gun_meta = gun_meta; task->meta = meta; - room->xtimer.AddDeadLineTimerAndAttach - (std::max(1, (int)(delay_time / FRAME_RATE_MS)), + + room->xtimer.AddRepeatTimerAndAttach + (SERVER_FRAME_RATE / 2, a8::XParams() .SetSender(task), [] (const a8::XParams& param) { MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); - task->Done(); + task->Check(); }, - &task->timer_attacher.timer_list_, + &task->timer_attacher.timer_list_); + + room->xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10), + a8::XParams() + .SetSender(task), + [] (const a8::XParams& param) + { + }, + &room->timer_attacher.timer_list_, [] (const a8::XParams& param) { MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + task->Done(); delete task; } ); diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index b79cde40..d5da7822 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -5,6 +5,10 @@ #include "player.h" #include "metadata.h" +void MolotorCocktailMiTask::Check() +{ +} + void MolotorCocktailMiTask::Done() { } diff --git a/server/gameserver/molotor_cocktail_mitask.h b/server/gameserver/molotor_cocktail_mitask.h index 526cbdc3..ea1a1e8d 100644 --- a/server/gameserver/molotor_cocktail_mitask.h +++ b/server/gameserver/molotor_cocktail_mitask.h @@ -19,5 +19,6 @@ class MolotorCocktailMiTask : public MicroTask MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; + void Check(); void Done(); }; diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index eeb4f9bf..2e90a9d9 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -5,6 +5,11 @@ #include "player.h" #include "metadata.h" +void PosionGasMiTask::Check() +{ + +} + void PosionGasMiTask::Done() { diff --git a/server/gameserver/posiongas_mitask.h b/server/gameserver/posiongas_mitask.h index 705bc682..a6acab31 100644 --- a/server/gameserver/posiongas_mitask.h +++ b/server/gameserver/posiongas_mitask.h @@ -19,5 +19,6 @@ class PosionGasMiTask : public MicroTask MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; + void Check(); void Done(); }; From dbc74c3a04cbcc91092c5862283f999429f9d029 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 3 Apr 2021 22:31:20 +0800 Subject: [PATCH 05/21] 1 --- server/gameserver/bullet.cc | 2 ++ server/gameserver/molotor_cocktail_mitask.cc | 16 ++++++++++ server/gameserver/molotor_cocktail_mitask.h | 4 +++ server/gameserver/posiongas_mitask.cc | 32 +++++++++++++++++++- server/gameserver/posiongas_mitask.h | 4 +++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 3c8476cf..e0a11838 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -377,6 +377,7 @@ void Bullet::ProcPosionGasBomb(int delay_time) task->bomb_pos = GetPos(); task->gun_meta = gun_meta; task->meta = meta; + task->Initialzie(); room->xtimer.AddRepeatTimerAndAttach (SERVER_FRAME_RATE / 2, @@ -417,6 +418,7 @@ void Bullet::ProcMolotorCocktailBomb(int delay_time) task->bomb_pos = GetPos(); task->gun_meta = gun_meta; task->meta = meta; + task->Initialzie(); room->xtimer.AddRepeatTimerAndAttach (SERVER_FRAME_RATE / 2, diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index d5da7822..a0ec8640 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -5,10 +5,26 @@ #include "player.h" #include "metadata.h" +void MolotorCocktailMiTask::Initialzie() +{ + sender.Get()->room->grid_service->GetAllCellsByXy + ( + sender.Get()->room, + bomb_pos.x, + bomb_pos.y, + grid_list + ); +} + void MolotorCocktailMiTask::Check() { } void MolotorCocktailMiTask::Done() { + for (auto& pair : targets) { + if (pair.second.Get()) { + + } + } } diff --git a/server/gameserver/molotor_cocktail_mitask.h b/server/gameserver/molotor_cocktail_mitask.h index ea1a1e8d..4082edca 100644 --- a/server/gameserver/molotor_cocktail_mitask.h +++ b/server/gameserver/molotor_cocktail_mitask.h @@ -1,6 +1,7 @@ #pragma once #include "microtask.h" +#include "gridcell.h" namespace MetaData { @@ -18,7 +19,10 @@ class MolotorCocktailMiTask : public MicroTask CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; + std::map targets; + std::set grid_list; + void Initialzie(); void Check(); void Done(); }; diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index 2e90a9d9..cf9c6521 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -5,12 +5,42 @@ #include "player.h" #include "metadata.h" +void PosionGasMiTask::Initialzie() +{ + sender.Get()->room->grid_service->GetAllCellsByXy + ( + sender.Get()->room, + bomb_pos.x, + bomb_pos.y, + grid_list + ); +} + void PosionGasMiTask::Check() { - + if (sender.Get()) { + std::set objects; + sender.Get()->room->grid_service->TouchCreatures + ( + sender.Get()->room->GetRoomIdx(), + grid_list, + [this, &objects] (Creature* c, bool& stop) + { + if (sender.Get()->IsProperTarget(c)) { + if (bomb_pos.Distance(c->GetPos()) < meta->i->explosion_range()) { + objects.insert(c); + } + } + } + ); + } } void PosionGasMiTask::Done() { + for (auto& pair : targets) { + if (pair.second.Get()) { + } + } } diff --git a/server/gameserver/posiongas_mitask.h b/server/gameserver/posiongas_mitask.h index a6acab31..4933adf7 100644 --- a/server/gameserver/posiongas_mitask.h +++ b/server/gameserver/posiongas_mitask.h @@ -1,6 +1,7 @@ #pragma once #include "microtask.h" +#include "gridcell.h" namespace MetaData { @@ -18,7 +19,10 @@ class PosionGasMiTask : public MicroTask CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; + std::map targets; + std::set grid_list; + void Initialzie(); void Check(); void Done(); }; From e2d4f8a28e71e9dfac30c0e51cc4dc3b34a0ed8a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 3 Apr 2021 22:55:35 +0800 Subject: [PATCH 06/21] 1 --- server/gameserver/constant.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 605c4046..367a470b 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -148,7 +148,16 @@ enum BuffEffectType_e kBET_HunLuan = 23, //混乱,在烟雾弹中不自动瞄准 kBET_Fly = 24, //飞行中 kBET_Jump = 25, //跳伞中 + kBET_LastDecHp = 26, //持续掉血 + kBET_LastAddHp = 27, //持续加血 + kBET_OnceAddHp = 28, //加血 + kBET_SummonHero = 29, //召唤英雄 + //kBET_SummonHero = 30, //向前跳跃 kBET_Shield = 31, //护盾 + kBET_Hide = 32, //隐身 + kBET_CrazyMode = 33, //暴走模式 + kBET_ShockWave = 34, //冲击波 + kBET_Sprint = 35, //冲刺 kBET_ThroughWall = 50, //穿墙 kBET_Driver = 51, //驾驶中 From fb5b05513d55ddb63c0880c47fbf1f2908610cff Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 4 Apr 2021 12:30:03 +0800 Subject: [PATCH 07/21] 1 --- server/gameserver/creature.cc | 38 +++++++++++++++++++++++++++++++++++ server/gameserver/creature.h | 2 ++ server/gameserver/human.cc | 37 ---------------------------------- server/gameserver/human.h | 1 - 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a905d178..02cb191f 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -8,6 +8,7 @@ #include "skill.h" #include "human.h" #include "collider.h" +#include "roomobstacle.h" void InternalShot(Creature* c, MetaData::Equip* weapon_meta, @@ -1203,3 +1204,40 @@ void Creature::CheckSpecObject() } #endif } + +RoomObstacle* Creature::SummonObstacle(int id, const a8::Vec2& pos) +{ + RoomObstacle* obstacle = room->CreateObstacle(id, pos.x, pos.y); + if (obstacle) { + obstacle->master.Attach(this); + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(obstacle), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->ActiveTimerFunc(); + }, + &obstacle->xtimer_attacher.timer_list_ + ); + + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(obstacle), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->UpdateTimerFunc(); + }, + &obstacle->xtimer_attacher.timer_list_ + ); + + } else { + abort(); + } + return obstacle; +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 3a1a4b29..e62ccb25 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -15,6 +15,7 @@ namespace MetaData struct xtimer_list; class Skill; class Obstacle; +class RoomObstacle; class Creature : public MoveableEntity { public: @@ -113,6 +114,7 @@ class Creature : public MoveableEntity virtual void _UpdateMove(int speed) {}; void CheckSpecObject(); + RoomObstacle* SummonObstacle(int id, const a8::Vec2& pos); private: diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index e08c7456..c9414a42 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1878,43 +1878,6 @@ void Human::WinExp(Human* sender, int exp) } } -RoomObstacle* Human::SummonObstacle(int id, const a8::Vec2& pos) -{ - RoomObstacle* obstacle = room->CreateObstacle(id, pos.x, pos.y); - if (obstacle) { - obstacle->master.Attach(this); - room->xtimer.AddRepeatTimerAndAttach - ( - SERVER_FRAME_RATE, - a8::XParams() - .SetSender(obstacle), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->ActiveTimerFunc(); - }, - &obstacle->xtimer_attacher.timer_list_ - ); - - room->xtimer.AddRepeatTimerAndAttach - ( - SERVER_FRAME_RATE, - a8::XParams() - .SetSender(obstacle), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->UpdateTimerFunc(); - }, - &obstacle->xtimer_attacher.timer_list_ - ); - - } else { - abort(); - } - return obstacle; -} - void Human::_InternalUpdateMove(float speed) { float nx = move_dir.x * speed; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 960f925f..4eca4bf5 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -238,7 +238,6 @@ class Human : public Creature int GetSeat() { return seat_; } void SetSeat(int seat) { seat_ = seat; } void DeadDrop(); - RoomObstacle* SummonObstacle(int id, const a8::Vec2& pos); virtual std::string GetName() override { return name;}; protected: From 434125103b6be2477d0f1b8a3070c7e87c2f82c5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 4 Apr 2021 21:02:55 +0800 Subject: [PATCH 08/21] 1 --- server/gameserver/roomobstacle.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index 8df096e9..03246ec6 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -157,7 +157,10 @@ void RoomObstacle::UpdateTimerFunc() Explosion(); Die(room); BroadcastFullState(room); + room->xtimer.DeleteTimer(room->xtimer.GetRunningTimer()); } + } else { + room->xtimer.DeleteTimer(room->xtimer.GetRunningTimer()); } } From 6ed08bbb92b9749959682578999cd92f9d33ffd8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 4 Apr 2021 22:31:59 +0800 Subject: [PATCH 09/21] 1 --- server/gameserver/creature.h | 1 + server/gameserver/player.cc | 1 + server/gameserver/player.h | 1 + 3 files changed, 3 insertions(+) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index e62ccb25..bc99407a 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -156,6 +156,7 @@ private: Skill* curr_skill_ = nullptr; int skill_target_id_ = 0; a8::Vec2 skill_target_pos_; + float skill_distance_ = 0.0f; std::map skill_hash_; std::map passive_skill_hash_; std::array inventory_ = {}; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 22e2f6c8..edaea7b1 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1130,6 +1130,7 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) } else { skill_dir = a8::Vec2(); } + skill_distance = msg.skill_distance(); } else { use_skill = false; } diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 28b3cc87..3209c6cb 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -61,6 +61,7 @@ class Player : public Human int use_skill_id = 0; int skill_target_id = 0; a8::Vec2 skill_dir; + float skill_distance = 0.0f; bool get_down = false; int get_on = 0; From 66862a31ce8f0f9647cde3b98690b4cbbbe5b4df Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 4 Apr 2021 23:22:37 +0800 Subject: [PATCH 10/21] 1 --- server/gameserver/creature.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 02cb191f..7ffdbf52 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -671,6 +671,12 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) if (caster == this) { abort(); } + #if 1 + skill_dir_.Normalize(); + target_pos = GetPos() + skill_dir_ * skill_distance_; + move_dir = target_pos - GetPos(); + move_dir.Normalize(); + #else float target_distance = caster->GetPos().Distance(GetPos()); if (target_distance <= 0.000001f) { SetPos(caster->GetPos()); @@ -685,6 +691,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3); } } + #endif } break; case kBET_JumpTo: From bb636746eadf5e7fe3702efb04f4b06103bad741 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 11:31:38 +0800 Subject: [PATCH 11/21] 1 --- server/gameserver/constant.h | 1 + server/gameserver/creature.cc | 50 ++++++++++++++++++++---------- server/gameserver/creature.h | 7 ++++- server/gameserver/player.cc | 6 ++-- server/gameserver/zombiemode.ai.cc | 12 ++++++- 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 367a470b..6bb0966a 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -158,6 +158,7 @@ enum BuffEffectType_e kBET_CrazyMode = 33, //暴走模式 kBET_ShockWave = 34, //冲击波 kBET_Sprint = 35, //冲刺 + kBET_SummonObstacle = 36, //召唤物件 kBET_ThroughWall = 50, //穿墙 kBET_Driver = 51, //驾驶中 diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 7ffdbf52..2dfa36b5 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -19,6 +19,17 @@ void InternalShot(Creature* c, float fly_distance, bool is_tank_skin) { + if (weapon_meta->i->_inventory_slot() == IS_TRAP || + weapon_meta->i->_inventory_slot() == IS_MINE) { + MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(bullet_meta->i->buffid()); + if (buff_meta) { + c->AddBuff(c, + buff_meta, + 1 + ); + } + return; + } for (auto& tuple : weapon_meta->bullet_born_offset) { a8::Vec2 bullet_born_offset = a8::Vec2(std::get<0>(tuple), std::get<1>(tuple)); bullet_born_offset.Rotate(c->attack_dir.CalcAngle(a8::Vec2::UP)); @@ -444,7 +455,11 @@ bool Creature::CanUseSkill(int skill_id) return skill->GetLeftTime() <= 0; } -void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, const a8::Vec2& target_pos) +void Creature::DoSkill(int skill_id, + int target_id, + const a8::Vec2& skill_dir, + float skill_distance, + const a8::Vec2& target_pos) { DoSkillPreProc(skill_id, target_id, target_pos); Skill* skill = GetSkill(skill_id); @@ -453,6 +468,7 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, c skill_target_id_ = target_id; skill_target_pos_ = target_pos; skill_dir_ = skill_dir; + skill_distance_ = skill_distance; curr_skill_ = skill; playing_skill = true; CurrentSkill()->last_use_frameno = room->GetFrameNo(); @@ -671,27 +687,27 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) if (caster == this) { abort(); } - #if 1 - skill_dir_.Normalize(); - target_pos = GetPos() + skill_dir_ * skill_distance_; - move_dir = target_pos - GetPos(); - move_dir.Normalize(); - #else - float target_distance = caster->GetPos().Distance(GetPos()); - if (target_distance <= 0.000001f) { - SetPos(caster->GetPos()); - target_pos = caster->GetPos(); - } else { - if (target_distance <= buff->meta->param3) { + if (caster->GetEntitySubType() == EST_Android) { + float target_distance = caster->GetPos().Distance(GetPos()); + if (target_distance <= 0.000001f) { SetPos(caster->GetPos()); target_pos = caster->GetPos(); } else { - move_dir = caster->GetPos() - GetPos(); - move_dir.Normalize(); - target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3); + if (target_distance <= buff->meta->param3) { + SetPos(caster->GetPos()); + target_pos = caster->GetPos(); + } else { + move_dir = caster->GetPos() - GetPos(); + move_dir.Normalize(); + target_pos = GetPos() + move_dir * (target_distance - buff->meta->param3); + } } + } else { + caster->skill_dir_.Normalize(); + target_pos = caster->GetPos() + caster->skill_dir_ * caster->skill_distance_; + move_dir = target_pos - GetPos(); + move_dir.Normalize(); } - #endif } break; case kBET_JumpTo: diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index bc99407a..41943898 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -75,7 +75,12 @@ class Creature : public MoveableEntity const a8::Vec2& target_pos, std::set& target_list); virtual bool CanUseSkill(int skill_id); - void DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, const a8::Vec2& target_pos); + void DoSkill(int skill_id, + int target_id, + const a8::Vec2& skill_dir, + float skill_distance, + const a8::Vec2& target_pos + ); void ResetSkill(); Skill* CurrentSkill(); MetaData::SkillPhase* GetCurrSkillPhase(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index edaea7b1..1208956f 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -393,7 +393,7 @@ void Player::UpdateUseSkill() if (HasBuffEffect(kBET_Vertigo)) { return; } - DoSkill(use_skill_id, skill_target_id, skill_dir, a8::Vec2()); + DoSkill(use_skill_id, skill_target_id, skill_dir, skill_distance, a8::Vec2()); use_skill = false; } @@ -439,7 +439,7 @@ void Player::Shot() int slot_id = curr_weapon->meta->i->_inventory_slot(); //扔完手雷,如无手雷,则优先换武器1>武器2 switch (slot_id) { - case 5: + case IS_FRAG: { //手雷 if (curr_weapon->ammo <= 0) { @@ -462,7 +462,7 @@ void Player::Shot() SyncAroundPlayers(__FILE__, __LINE__, __func__); } break; - case 6: + case IS_SMOKE: { //烟雾弹 if (curr_weapon->ammo <= 0) { diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 35ab1d48..169b3b35 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -467,7 +467,17 @@ void ZombieModeAI::DoShot() void ZombieModeAI::DoSkill(int skill_id) { Human* myself = (Human*)owner; - myself->DoSkill(skill_id, node_->target.Get()->GetEntityUniId(), a8::Vec2(), node_->target.Get()->GetPos()); + a8::Vec2 skill_dir; + float skill_distance = node_->target.Get()->GetPos().Distance(myself->GetPos()); + if (fabs(skill_distance) > 0.00001f) { + skill_dir = node_->target.Get()->GetPos() - myself->GetPos(); + skill_dir.Normalize(); + } + myself->DoSkill(skill_id, + node_->target.Get()->GetEntityUniId(), + a8::Vec2(), + skill_distance, + node_->target.Get()->GetPos()); } int ZombieModeAI::GetAttackTimes() From 3493a60a5e295dfdbd09f43b973219b7bc4bd4ee Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 13:51:54 +0800 Subject: [PATCH 12/21] 1 --- server/gameserver/constant.h | 6 +++--- server/gameserver/creature.cc | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 6bb0966a..6e1fad51 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -148,9 +148,9 @@ enum BuffEffectType_e kBET_HunLuan = 23, //混乱,在烟雾弹中不自动瞄准 kBET_Fly = 24, //飞行中 kBET_Jump = 25, //跳伞中 - kBET_LastDecHp = 26, //持续掉血 - kBET_LastAddHp = 27, //持续加血 - kBET_OnceAddHp = 28, //加血 + kBET_IntervalAddBuff = 26, //持续掉血 + //kBET_LastAddHp = 27, //持续加血 + //kBET_OnceAddHp = 28, //加血 kBET_SummonHero = 29, //召唤英雄 //kBET_SummonHero = 30, //向前跳跃 kBET_Shield = 31, //护盾 diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 2dfa36b5..39d79ed6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -803,11 +803,46 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) } } break; + case kBET_IntervalAddBuff: + { + + } + break; + case kBET_SummonHero: + { + + } + break; case kBET_Shield: { } break; + case kBET_Hide: + { + + } + break; + case kBET_CrazyMode: + { + + } + break; + case kBET_ShockWave: + { + + } + break; + case kBET_Sprint: + { + + } + break; + case kBET_SummonObstacle: + { + SummonObstacle(buff->meta->param1, GetPos()); + } + break; default: { } From 1dec9d2c26bc655e7dd44fc2bc940d2142ef4a31 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 14:35:36 +0800 Subject: [PATCH 13/21] 1 --- server/gameserver/bullet.cc | 59 +++++++------------- server/gameserver/molotor_cocktail_mitask.cc | 57 +++++++++++++++++-- server/gameserver/molotor_cocktail_mitask.h | 2 +- server/gameserver/posiongas_mitask.cc | 41 ++++++++++++-- server/gameserver/posiongas_mitask.h | 2 +- 5 files changed, 110 insertions(+), 51 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index e0a11838..4f9a3e6b 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -379,33 +379,23 @@ void Bullet::ProcPosionGasBomb(int delay_time) task->meta = meta; task->Initialzie(); - room->xtimer.AddRepeatTimerAndAttach - (SERVER_FRAME_RATE / 2, - a8::XParams() - .SetSender(task), - [] (const a8::XParams& param) - { - PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); - task->Check(); - }, - &task->timer_attacher.timer_list_); - room->xtimer.AddDeadLineTimerAndAttach - (SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10), + (delay_time / FRAME_RATE_MS, a8::XParams() .SetSender(task), [] (const a8::XParams& param) - { - }, - &room->timer_attacher.timer_list_, - [] (const a8::XParams& param) { PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); - task->Done(); - delete task; - } - ); + task->room->frame_event.AddExplosionEx + (task->sender, + task->meta->i->id(), + task->bomb_pos, + task->gun_meta->i->explosion_effect()); + task->Active(); + }, + &room->timer_attacher.timer_list_ + ); } } @@ -420,31 +410,22 @@ void Bullet::ProcMolotorCocktailBomb(int delay_time) task->meta = meta; task->Initialzie(); - room->xtimer.AddRepeatTimerAndAttach - (SERVER_FRAME_RATE / 2, - a8::XParams() - .SetSender(task), - [] (const a8::XParams& param) - { - MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); - task->Check(); - }, - &task->timer_attacher.timer_list_); - room->xtimer.AddDeadLineTimerAndAttach - (SERVER_FRAME_RATE * MetaMgr::Instance()->GetSysParamAsInt("smoke_duration", 10), + (delay_time / FRAME_RATE_MS, a8::XParams() .SetSender(task), [] (const a8::XParams& param) - { - }, - &room->timer_attacher.timer_list_, - [] (const a8::XParams& param) { MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); - task->Done(); - delete task; - } + task->room->frame_event.AddExplosionEx + (task->sender, + task->meta->i->id(), + task->bomb_pos, + task->gun_meta->i->explosion_effect()); + task->Active(); + + }, + &room->timer_attacher.timer_list_ ); } } diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index a0ec8640..60d472b0 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -16,15 +16,62 @@ void MolotorCocktailMiTask::Initialzie() ); } +void MolotorCocktailMiTask::Active() +{ + room->xtimer.AddRepeatTimerAndAttach + (SERVER_FRAME_RATE / 2, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + task->Check(); + }, + &timer_attacher.timer_list_); + + room->xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * meta->i->time(), + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + MolotorCocktailMiTask* task = (MolotorCocktailMiTask*)param.sender.GetUserData(); + task->Done(); + delete task; + } + ); + +} + void MolotorCocktailMiTask::Check() { + if (sender.Get()) { + std::set objects; + sender.Get()->room->grid_service->TouchCreatures + ( + sender.Get()->room->GetRoomIdx(), + grid_list, + [this, &objects] (Creature* c, bool& stop) + { + if (sender.Get()->IsProperTarget(c)) { + if (bomb_pos.Distance(c->GetPos()) < meta->i->explosion_range()) { + objects.insert(c); + } + } + } + ); + for (Creature* target : objects) { + if (!target->GetBuffById(meta->i->buffid())) { + target->MustBeAddBuff(sender.Get(), meta->i->buffid()); + } + } + } } void MolotorCocktailMiTask::Done() { - for (auto& pair : targets) { - if (pair.second.Get()) { - - } - } } diff --git a/server/gameserver/molotor_cocktail_mitask.h b/server/gameserver/molotor_cocktail_mitask.h index 4082edca..fa5f134a 100644 --- a/server/gameserver/molotor_cocktail_mitask.h +++ b/server/gameserver/molotor_cocktail_mitask.h @@ -19,10 +19,10 @@ class MolotorCocktailMiTask : public MicroTask CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; - std::map targets; std::set grid_list; void Initialzie(); + void Active(); void Check(); void Done(); }; diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index cf9c6521..f580c25c 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -16,6 +16,37 @@ void PosionGasMiTask::Initialzie() ); } +void PosionGasMiTask::Active() +{ + room->xtimer.AddRepeatTimerAndAttach + (SERVER_FRAME_RATE / 2, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + task->Check(); + }, + &timer_attacher.timer_list_); + + room->xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * meta->i->time(), + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + }, + &timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + PosionGasMiTask* task = (PosionGasMiTask*)param.sender.GetUserData(); + task->Done(); + delete task; + } + ); + +} + void PosionGasMiTask::Check() { if (sender.Get()) { @@ -33,14 +64,14 @@ void PosionGasMiTask::Check() } } ); + for (Creature* target : objects) { + if (!target->GetBuffById(meta->i->buffid())) { + target->MustBeAddBuff(sender.Get(), meta->i->buffid()); + } + } } } void PosionGasMiTask::Done() { - for (auto& pair : targets) { - if (pair.second.Get()) { - - } - } } diff --git a/server/gameserver/posiongas_mitask.h b/server/gameserver/posiongas_mitask.h index 4933adf7..79dc6c21 100644 --- a/server/gameserver/posiongas_mitask.h +++ b/server/gameserver/posiongas_mitask.h @@ -19,10 +19,10 @@ class PosionGasMiTask : public MicroTask CreatureWeakPtr sender; MetaData::Equip* gun_meta = nullptr; MetaData::Equip* meta = nullptr; - std::map targets; std::set grid_list; void Initialzie(); + void Active(); void Check(); void Done(); }; From 16068a237e5f95edde71bef238bd39ae734f0bdd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 14:56:51 +0800 Subject: [PATCH 14/21] 1 --- server/gameserver/creature.cc | 70 ++++++++++++++++++++++------------- server/gameserver/metadata.h | 1 + 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 39d79ed6..9337ace9 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -260,7 +260,8 @@ void Creature::RecalcBuffAttr() buff_attr_rate_ = {}; for (auto& buff : buff_list_) { if (buff.meta->i->buff_effect() == kBET_ChgAttr || - buff.meta->i->buff_effect() == kBET_Car) { + buff.meta->i->buff_effect() == kBET_Car || + buff.meta->i->buff_effect() == kBET_CrazyMode) { int attr_type = (int)buff.meta->param1; int calc_type = (int)buff.meta->param2; if (IsValidHumanAttr(attr_type)) { @@ -635,6 +636,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) switch (buff->meta->i->buff_effect()) { case kBET_ChgAttr: case kBET_Car: + case kBET_CrazyMode: { RecalcBuffAttr(); if (buff->meta->i->buff_effect() == kBET_Car) { @@ -781,31 +783,52 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) { if (caster->GetEntityType() == ET_Player) { room->xtimer.AddDeadLineTimerAndAttach - ( - SERVER_FRAME_RATE * buff->meta->param1, - a8::XParams() - .SetSender(this) - .SetParam1(caster) - .SetParam2(buff->meta->param2) - .SetParam3(((Human*)caster)->CurrentSkill()->meta), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - Human* caster = (Human*)param.param1.GetUserData(); - int buff_id = param.param2; - MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); - if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { - hum->AddBuff(caster, buff_meta, 1, skill); - } - }, - &buff->xtimer_attacher.timer_list_); + ( + SERVER_FRAME_RATE * buff->meta->param1, + a8::XParams() + .SetSender(this) + .SetParam1(caster) + .SetParam2(buff->meta->param2) + .SetParam3(((Creature*)caster)->CurrentSkill()->meta), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + Human* caster = (Human*)param.param1.GetUserData(); + int buff_id = param.param2; + MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { + hum->AddBuff(caster, buff_meta, 1, skill); + } + }, + &buff->xtimer_attacher.timer_list_); } } break; case kBET_IntervalAddBuff: { - + room->xtimer.AddRepeatTimerAndAttach + ( + FRAME_RATE_MS / buff->meta->param1, + a8::XParams() + .SetSender(this) + .SetParam1(caster) + .SetParam2(buff->meta) + .SetParam3(((Creature*)caster)->CurrentSkill()->meta), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + Human* caster = (Human*)param.param1.GetUserData(); + MetaData::Buff* mother_buff_meta = (MetaData::Buff*)param.param2.GetUserData(); + MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); + for (int buff_id : mother_buff_meta->param2_int_list) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { + hum->AddBuff(caster, buff_meta, 1, skill); + } + } + }, + &buff->xtimer_attacher.timer_list_); } break; case kBET_SummonHero: @@ -821,11 +844,6 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) case kBET_Hide: { - } - break; - case kBET_CrazyMode: - { - } break; case kBET_ShockWave: diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 97ce5a2d..7a080064 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -169,6 +169,7 @@ namespace MetaData float param2 = 0.0f; float param3 = 0.0f; float param4 = 0.0f; + std::vector param2_int_list; std::set immune_buffeffect; }; From 28e45316bc90994ecd833d6a454bc55c1f63e0a5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 14:59:00 +0800 Subject: [PATCH 15/21] 1 --- server/gameserver/creature.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 9337ace9..d0a92995 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -844,11 +844,6 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) case kBET_Hide: { - } - break; - case kBET_ShockWave: - { - } break; case kBET_Sprint: From 3242244c2c0d52157dc054267318dcda077d660a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 15:21:32 +0800 Subject: [PATCH 16/21] 1 --- server/gameserver/constant.h | 2 +- server/gameserver/creature.cc | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 6e1fad51..73ae5f79 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -157,7 +157,7 @@ enum BuffEffectType_e kBET_Hide = 32, //隐身 kBET_CrazyMode = 33, //暴走模式 kBET_ShockWave = 34, //冲击波 - kBET_Sprint = 35, //冲刺 + //kBET_Sprint = 35, //冲刺 kBET_SummonObstacle = 36, //召唤物件 kBET_ThroughWall = 50, //穿墙 diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d0a92995..40e398b2 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -665,11 +665,13 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) if (skill) { MetaData::SkillPhase* phase = GetCurrSkillPhase(); if (phase && phase->time_offset >= skill->GetPassedTime()) { + a8::Vec2 old_move_dir = move_dir; if (HasBuffEffect(kBET_Car)) { _UpdateMove(phase->param1.GetDouble() * 1.5); } else { _UpdateMove(phase->param1); } + move_dir = old_move_dir; } } } @@ -844,11 +846,6 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) case kBET_Hide: { - } - break; - case kBET_Sprint: - { - } break; case kBET_SummonObstacle: From 7cd76949bfd1136e213646b219519e18dfbfe090 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 19:15:29 +0800 Subject: [PATCH 17/21] 1 --- server/gameserver/constant.h | 9 ++++++- server/gameserver/creature.cc | 12 +++++++-- server/gameserver/metadata.cc | 33 +++++++++++++++++++++++++ server/gameserver/metadata.h | 1 + server/tools/protobuild/metatable.proto | 1 + 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 73ae5f79..665406ba 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -157,8 +157,9 @@ enum BuffEffectType_e kBET_Hide = 32, //隐身 kBET_CrazyMode = 33, //暴走模式 kBET_ShockWave = 34, //冲击波 - //kBET_Sprint = 35, //冲刺 + kBET_Sprint = 35, //冲刺 kBET_SummonObstacle = 36, //召唤物件 + kBET_FlashMove = 37, //瞬间移动 kBET_ThroughWall = 50, //穿墙 kBET_Driver = 51, //驾驶中 @@ -368,6 +369,12 @@ enum GameChannel_e kTouTiaoChannelId = 6006 }; +enum PostBuffAction_e +{ + kRemoveBuffByIdAction = 1, + kRemoveBuffByEffectAction = 2 +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 40e398b2..e80c9acc 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -665,13 +665,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) if (skill) { MetaData::SkillPhase* phase = GetCurrSkillPhase(); if (phase && phase->time_offset >= skill->GetPassedTime()) { - a8::Vec2 old_move_dir = move_dir; if (HasBuffEffect(kBET_Car)) { _UpdateMove(phase->param1.GetDouble() * 1.5); } else { _UpdateMove(phase->param1); } - move_dir = old_move_dir; } } } @@ -853,6 +851,16 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) SummonObstacle(buff->meta->param1, GetPos()); } break; + case kBET_Sprint: + { + + } + break; + case kBET_FlashMove: + { + + } + break; default: { } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index ba34ad56..a11898ff 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -521,6 +521,39 @@ namespace MetaData immune_buffeffect.insert(a8::XValue(str)); } } + { + std::vector strings; + a8::Split(i->buff_param2(), strings, ':'); + for (auto& str : strings) { + param2_int_list.push_back(a8::XValue(str).GetInt()); + } + } + { + std::vector strings; + a8::Split(i->post_remove_action(), strings, '|'); + for (auto& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + if (strings2.size() > 2) { + std::vector strings3; + a8::Split(strings2[1], strings3, ';'); + if (strings2[0] == "remove_buff_by_id" || + strings2[0] == "remove_buff_by_effect") { + auto& action = a8::FastAppend(post_remove_action); + if (strings2[0] == "remove_buff_by_id") { + std::get<0>(action) = kRemoveBuffByIdAction; + } else if (strings2[0] == "remove_buff_by_effect") { + std::get<0>(action) = kRemoveBuffByEffectAction; + } + for (auto& str3 : strings3) { + if (!str3.empty()) { + std::get<1>(action).push_back(a8::XValue(str3)); + } + } + } + } + } + } } bool Buff::EffectCanStack() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 7a080064..3b3ec258 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -170,6 +170,7 @@ namespace MetaData float param3 = 0.0f; float param4 = 0.0f; std::vector param2_int_list; + std::vector>> post_remove_action; std::set immune_buffeffect; }; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 591a1281..3b7c6ffb 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -205,6 +205,7 @@ message Buff required float duration_time = 10; optional float buff_valueup = 11; required string immune_buffeffect_list = 12; + optional string post_remove_action = 13; } message Drop From 0b84b9cd378ac37719de20c33d25aa216db48a53 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 6 Apr 2021 20:15:14 +0800 Subject: [PATCH 18/21] 1 --- server/gameserver/creature.cc | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index e80c9acc..7eac7706 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -224,17 +224,41 @@ void Creature::MustBeAddBuff(Creature* caster, int buff_id) void Creature::RemoveBuffById(int buff_id) { + std::vector removed_buffs; for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { const Buff& buff = *itr; if (buff.meta->i->buff_id() == buff_id) { if (buff_effect_[buff.meta->i->buff_effect()] == &(*itr)) { buff_effect_[buff.meta->i->buff_effect()] = nullptr; } + removed_buffs.push_back(buff.meta); OnBuffRemove(buff); buff_list_.erase(itr); break; } } + for (MetaData::Buff* buff_meta : removed_buffs) { + for (const auto& tuple : buff_meta->post_remove_action) { + switch (std::get<0>(tuple)) { + case kRemoveBuffByIdAction: + { + for (int buff_id :std::get<1>(tuple)) { + RemoveBuffById(buff_id); + } + } + break; + case kRemoveBuffByEffectAction: + { + for (int buff_effect :std::get<1>(tuple)) { + RemoveBuffByEffectId(buff_effect); + } + } + break; + default: + break; + } + } + } RecalcBuffAttr(); #ifdef DEBUG SendDebugMsg(a8::Format("移除buff_id:%d", @@ -283,8 +307,9 @@ void Creature::OnBuffRemove(const Buff& buff) void Creature::RemoveBuffByEffectId(int buff_effect_id) { Buff* buff = GetBuffByEffectId(buff_effect_id); - if (buff) { + while (buff) { RemoveBuffById(buff->meta->i->buff_id()); + buff = GetBuffByEffectId(buff_effect_id); } } From 933b77ceaaf709329eca7ed53025235f7aa21f57 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Apr 2021 10:17:44 +0800 Subject: [PATCH 19/21] 1 --- server/gameserver/creature.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 7eac7706..d380785c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -883,7 +883,9 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) break; case kBET_FlashMove: { - + a8::Vec2 old_pos = GetPos(); + a8::Vec2 new_pos = GetPos() + skill_dir_ * skill_distance_; + SetPos(new_pos); } break; default: From 5eada9e9deacc177f241bfb99d4ae47bcbed4feb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Apr 2021 11:28:18 +0800 Subject: [PATCH 20/21] 1 --- server/gameserver/car.cc | 6 +++ server/gameserver/car.h | 1 + server/gameserver/creature.cc | 50 +++++++++++++++++++++++++ server/gameserver/creature.h | 1 + server/gameserver/entity.h | 1 + server/gameserver/hero.cc | 6 +++ server/gameserver/hero.h | 1 + server/gameserver/human.cc | 10 ++--- server/gameserver/human.h | 2 +- server/tools/protobuild/metatable.proto | 1 + 10 files changed, 73 insertions(+), 6 deletions(-) diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 569e86d2..9b2b398b 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -178,3 +178,9 @@ void Car::SyncPos() room->grid_service->MoveCreature(this); } } + +float Car::GetRadius() +{ + abort(); + return 0; +} diff --git a/server/gameserver/car.h b/server/gameserver/car.h index 1feacd82..870d6461 100644 --- a/server/gameserver/car.h +++ b/server/gameserver/car.h @@ -28,6 +28,7 @@ class Car : public Creature void GetDown(Human* passenger); void GetOn(Human* passenger); void SyncPos(); + virtual float GetRadius() override; private: int AllocSeat(); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d380785c..fc744a0d 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1344,3 +1344,53 @@ RoomObstacle* Creature::SummonObstacle(int id, const a8::Vec2& pos) } return obstacle; } + +bool Creature::CollisonDetection() +{ + #if 0 + if (room->OverBorder(GetPos(), GetRadius())){ + return true; + } + if (HasBuffEffect(kBET_ThroughWall) || + HasBuffEffect(kBET_Fly)) { + return false; + } + + std::set colliders; + room->map_service->GetColliders(room, GetX(), GetY(), colliders); + + AabbCollider aabb_box; + GetAabbBox(aabb_box); + for (ColliderComponent* collider : colliders) { + switch (collider->owner->GetEntityType()) { + case ET_Obstacle: + { + Obstacle* obstacle = (Obstacle*)collider->owner; + if (!obstacle->IsDead(room) && + ( + (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || + (collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) + )) { + return true; + } + } + break; + case ET_Building: + { + if ( + ( + (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || + (collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) + ) + ) { + return true; + } + } + break; + default: + break; + } + } + #endif + return false; +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 41943898..737ba023 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -120,6 +120,7 @@ class Creature : public MoveableEntity void CheckSpecObject(); RoomObstacle* SummonObstacle(int id, const a8::Vec2& pos); + bool CollisonDetection(); private: diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index fbe4b2a4..fe203794 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -22,6 +22,7 @@ class Entity virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) {}; virtual float GetSpeed() { return 1.0f;}; virtual void GetAabbBox(AabbCollider& aabb_box); + virtual float GetRadius() { return 0;}; virtual void GetCircleBox(CircleCollider& circle_box); virtual bool IsDead(Room* room) { return false;}; virtual long long GetDeadFrameNo(Room* room) { return 0;}; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 073eefd6..e246307d 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -187,3 +187,9 @@ void Hero::RecalcSelfCollider() self_collider_->pos = a8::Vec2(); self_collider_->rad = meta->i->radius(); } + + +float Hero::GetRadius() +{ + return meta->i->radius(); +} diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index 5cf661ab..b6c4a48f 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -30,6 +30,7 @@ public: virtual void GetAabbBox(AabbCollider& aabb_box) override; virtual float GetSpeed() override; + virtual float GetRadius() override; protected: virtual void _UpdateMove(int speed) override; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c9414a42..6adffcc8 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -629,11 +629,6 @@ void Human::FindPathInMapService() SetPos(old_pos); } -float Human::GetRadius() -{ - return meta->i->radius(); -} - float Human::GetHP() { return ability.hp; @@ -3368,3 +3363,8 @@ void Human::DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Ve OnAttack(); } } + +float Human::GetRadius() +{ + return meta->i->radius(); +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 4eca4bf5..7b0e8ba8 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -153,7 +153,6 @@ class Human : public Creature virtual void RecalcSelfCollider() override; bool IsCollisionInMapService(); void FindPathInMapService(); - float GetRadius(); float GetHP(); float GetMaxHP(); void BeKill(int killer_id, const std::string& killer_name, int weapon_id); @@ -239,6 +238,7 @@ class Human : public Creature void SetSeat(int seat) { seat_ = seat; } void DeadDrop(); virtual std::string GetName() override { return name;}; + virtual float GetRadius() override; protected: void _InternalUpdateMove(float speed); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 3b7c6ffb..6e30e281 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -146,6 +146,7 @@ message Player optional int32 revive_time = 22; optional string name = 23; optional int32 normal_skill = 24; + optional float hit_radius = 25; } message Robot From b36e97bd1b4a3c8f1502bf987605158a6cfc48a3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Apr 2021 11:41:28 +0800 Subject: [PATCH 21/21] 1 --- server/gameserver/bullet.cc | 4 +++- server/gameserver/entity.h | 2 ++ server/gameserver/human.cc | 25 +++++++++++++++++++++++++ server/gameserver/human.h | 4 +++- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 4f9a3e6b..5f0312ce 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -307,7 +307,9 @@ void Bullet::Check(float distance) ( [this, &objects] (Human* hum, bool& stop) { - if (hum != sender.Get() && !hum->dead && TestCollision(room, hum)) { + AabbCollider aabb_box; + hum->GetHitAabbBox(aabb_box); + if (hum != sender.Get() && !hum->dead && TestCollision(room, &aabb_box)) { objects.insert(hum); } }); diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index fe203794..9884dd7d 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -22,7 +22,9 @@ class Entity virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) {}; virtual float GetSpeed() { return 1.0f;}; virtual void GetAabbBox(AabbCollider& aabb_box); + virtual void GetHitAabbBox(AabbCollider& aabb_box) { GetAabbBox(aabb_box);}; virtual float GetRadius() { return 0;}; + virtual float GetHitRadius() { return GetRadius();}; virtual void GetCircleBox(CircleCollider& circle_box); virtual bool IsDead(Room* room) { return false;}; virtual long long GetDeadFrameNo(Room* room) { return 0;}; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 6adffcc8..795f96af 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3368,3 +3368,28 @@ float Human::GetRadius() { return meta->i->radius(); } + +float Human::GetHitRadius() +{ + return meta->i->hit_radius(); +} + +void Human::GetHitAabbBox(AabbCollider& aabb_box) +{ + if (!meta) { + abort(); + } + aabb_box.active = true; + aabb_box.owner = this; + if (GetCar() && GetCar()->IsDriver(this)) { + aabb_box._min.x = -GetCar()->meta->i->rad(); + aabb_box._min.y = -GetCar()->meta->i->rad(); + aabb_box._max.x = GetCar()->meta->i->rad(); + aabb_box._max.y = GetCar()->meta->i->rad(); + } else { + aabb_box._min.x = -GetHitRadius(); + aabb_box._min.y = -GetHitRadius(); + aabb_box._max.x = GetHitRadius(); + aabb_box._max.y = GetHitRadius(); + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 7b0e8ba8..2d712ab4 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -143,7 +143,10 @@ class Human : public Creature void FillMFObjectLess(Room* room, Human* hum, cs::MFPlayerFull* full_data); virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; virtual void FillMFPlayerStats(cs::MFPlayerStats* stats); + virtual float GetRadius() override; + virtual float GetHitRadius() override; virtual void GetAabbBox(AabbCollider& aabb_box) override; + virtual void GetHitAabbBox(AabbCollider& aabb_box) override; virtual bool IsDead(Room* room) override; virtual long long GetDeadFrameNo(Room* room) override; void FillItemList(::google::protobuf::RepeatedPtrField<::cs::MFPair>* pb_item_list); @@ -238,7 +241,6 @@ class Human : public Creature void SetSeat(int seat) { seat_ = seat; } void DeadDrop(); virtual std::string GetName() override { return name;}; - virtual float GetRadius() override; protected: void _InternalUpdateMove(float speed);