From e2c853b3695677f8a182b92482b64d436f59a7d3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Apr 2021 16:53:07 +0800 Subject: [PATCH 01/42] add refreshrule.* --- server/gameserver/refreshrule.cc | 14 ++++++++++++++ server/gameserver/refreshrule.h | 11 +++++++++++ server/gameserver/room.cc | 7 +++++++ server/gameserver/room.h | 3 +++ 4 files changed, 35 insertions(+) create mode 100644 server/gameserver/refreshrule.cc create mode 100644 server/gameserver/refreshrule.h diff --git a/server/gameserver/refreshrule.cc b/server/gameserver/refreshrule.cc new file mode 100644 index 0000000..2d2cd0d --- /dev/null +++ b/server/gameserver/refreshrule.cc @@ -0,0 +1,14 @@ +#include "precompile.h" + +#include "refreshrule.h" + +void RefreshRule::Init() +{ + +} + +void RefreshRule::UnInit() +{ + +} + diff --git a/server/gameserver/refreshrule.h b/server/gameserver/refreshrule.h new file mode 100644 index 0000000..1cbd287 --- /dev/null +++ b/server/gameserver/refreshrule.h @@ -0,0 +1,11 @@ +#pragma once + +class Room; +class RefreshRule +{ + public: + Room* room = nullptr; + + void Init(); + void UnInit(); +}; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index ebc887c..a298f06 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -29,6 +29,7 @@ #include "perfmonitor.h" #include "mapinstance.h" #include "mapmgr.h" +#include "refreshrule.h" #include "framework/cpp/utils.h" @@ -85,6 +86,9 @@ void Room::Init() CreateDropObjs(); InitObstacleDatas(); ShuaAndroid(); + refresh_rule_ = new RefreshRule(); + refresh_rule_->room = this; + refresh_rule_->Init(); if (room_type_ == RT_NewBrid && creator_game_times_ <= 0) { CreateLevel0RoomSpecThings(); } @@ -95,9 +99,12 @@ void Room::Init() void Room::UnInit() { + refresh_rule_->UnInit(); #ifdef DEBUG UnInitDebugInfo(); #endif + refresh_rule_->UnInit(); + A8_SAFE_DELETE(refresh_rule_); timer_attacher.ClearTimerList(); xtimer_attacher_.ClearTimerList(); for (auto& pair : accountid_hash_) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index e4144bd..ae667c7 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -36,6 +36,7 @@ class AabbCollider; class Android; class Car; class Hero; +class RefreshRule; class Room { public: @@ -318,4 +319,6 @@ private: std::vector obstacle_datas_; xtimer_list* auto_jump_timer_ = nullptr; + + RefreshRule* refresh_rule_ = nullptr; }; From 71a498c2349a4917e848c447614b27184a2a1ab0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Apr 2021 17:10:53 +0800 Subject: [PATCH 02/42] 1 --- server/gameserver/room.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/gameserver/room.h b/server/gameserver/room.h index ae667c7..5b794d3 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -321,4 +321,6 @@ private: xtimer_list* auto_jump_timer_ = nullptr; RefreshRule* refresh_rule_ = nullptr; + + friend class RefreshRule; }; From 492c9712ef483cf239f47fec76a9bab4273af775 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Apr 2021 19:16:48 +0800 Subject: [PATCH 03/42] 1 --- server/gameserver/refreshrule.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/gameserver/refreshrule.h b/server/gameserver/refreshrule.h index 1cbd287..7cf4524 100644 --- a/server/gameserver/refreshrule.h +++ b/server/gameserver/refreshrule.h @@ -1,5 +1,6 @@ #pragma once +class Human; class Room; class RefreshRule { @@ -8,4 +9,7 @@ class RefreshRule void Init(); void UnInit(); + +private: + std::list hold_humans_; }; From 47b344d222de71e8a1223101f2ff5168ec62ec28 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 10:13:18 +0800 Subject: [PATCH 04/42] 1 --- server/gameserver/{refreshrule.cc => incubator.cc} | 0 server/gameserver/{refreshrule.h => incubator.h} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename server/gameserver/{refreshrule.cc => incubator.cc} (100%) rename server/gameserver/{refreshrule.h => incubator.h} (100%) diff --git a/server/gameserver/refreshrule.cc b/server/gameserver/incubator.cc similarity index 100% rename from server/gameserver/refreshrule.cc rename to server/gameserver/incubator.cc diff --git a/server/gameserver/refreshrule.h b/server/gameserver/incubator.h similarity index 100% rename from server/gameserver/refreshrule.h rename to server/gameserver/incubator.h From 59d48d7b67313ab80ee7f3ef5d266d5543a5c616 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 10:17:16 +0800 Subject: [PATCH 05/42] 1 --- server/gameserver/incubator.cc | 2 +- server/gameserver/room.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 2d2cd0d..78efebe 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -1,6 +1,6 @@ #include "precompile.h" -#include "refreshrule.h" +#include "incubator.h" void RefreshRule::Init() { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index a298f06..580b0a7 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -29,7 +29,7 @@ #include "perfmonitor.h" #include "mapinstance.h" #include "mapmgr.h" -#include "refreshrule.h" +#include "incubator.h" #include "framework/cpp/utils.h" From df5bf5a5d05f3156c576bbbb1790e7440b0aa3da Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 10:23:58 +0800 Subject: [PATCH 06/42] 1 --- server/gameserver/incubator.cc | 4 ++-- server/gameserver/incubator.h | 2 +- server/gameserver/room.cc | 2 +- server/gameserver/room.h | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 78efebe..7944e20 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -2,12 +2,12 @@ #include "incubator.h" -void RefreshRule::Init() +void Incubator::Init() { } -void RefreshRule::UnInit() +void Incubator::UnInit() { } diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index 7cf4524..0cc9b9b 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -2,7 +2,7 @@ class Human; class Room; -class RefreshRule +class Incubator { public: Room* room = nullptr; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 580b0a7..83b6ef1 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -86,7 +86,7 @@ void Room::Init() CreateDropObjs(); InitObstacleDatas(); ShuaAndroid(); - refresh_rule_ = new RefreshRule(); + refresh_rule_ = new Incubator(); refresh_rule_->room = this; refresh_rule_->Init(); if (room_type_ == RT_NewBrid && creator_game_times_ <= 0) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 5b794d3..66ff994 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -36,7 +36,7 @@ class AabbCollider; class Android; class Car; class Hero; -class RefreshRule; +class Incubator; class Room { public: @@ -320,7 +320,7 @@ private: xtimer_list* auto_jump_timer_ = nullptr; - RefreshRule* refresh_rule_ = nullptr; + Incubator* refresh_rule_ = nullptr; - friend class RefreshRule; + friend class Incubator; }; From 793918631d50fa072ee38d56f486abd988e65c32 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 10:32:37 +0800 Subject: [PATCH 07/42] 1 --- server/gameserver/room.cc | 12 ++++++------ server/gameserver/room.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 83b6ef1..0adeb2a 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -86,9 +86,9 @@ void Room::Init() CreateDropObjs(); InitObstacleDatas(); ShuaAndroid(); - refresh_rule_ = new Incubator(); - refresh_rule_->room = this; - refresh_rule_->Init(); + incubator_ = new Incubator(); + incubator_->room = this; + incubator_->Init(); if (room_type_ == RT_NewBrid && creator_game_times_ <= 0) { CreateLevel0RoomSpecThings(); } @@ -99,12 +99,12 @@ void Room::Init() void Room::UnInit() { - refresh_rule_->UnInit(); + incubator_->UnInit(); #ifdef DEBUG UnInitDebugInfo(); #endif - refresh_rule_->UnInit(); - A8_SAFE_DELETE(refresh_rule_); + incubator_->UnInit(); + A8_SAFE_DELETE(incubator_); timer_attacher.ClearTimerList(); xtimer_attacher_.ClearTimerList(); for (auto& pair : accountid_hash_) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 66ff994..0e3977e 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -320,7 +320,7 @@ private: xtimer_list* auto_jump_timer_ = nullptr; - Incubator* refresh_rule_ = nullptr; + Incubator* incubator_ = nullptr; friend class Incubator; }; From f41e74d5c402a68d1cbf10b70f79b2c124dd6fc3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 11:08:15 +0800 Subject: [PATCH 08/42] 1 --- server/gameserver/incubator.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index 0cc9b9b..95359bf 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -9,7 +9,8 @@ class Incubator void Init(); void UnInit(); + void AddHoldHuman(Human* num); private: - std::list hold_humans_; + std::set hold_humans_; }; From 40f7499e8d77ee0f8c8785d4d0dfb1091df8eb26 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 13:17:38 +0800 Subject: [PATCH 09/42] 1 --- server/gameserver/incubator.cc | 4 ++++ server/gameserver/incubator.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 7944e20..c30c6cb 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -12,3 +12,7 @@ void Incubator::UnInit() } +void Incubator::AddHoldHuman(Human* hum) +{ + hold_humans_.insert(hum); +} diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index 95359bf..f262c6f 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -9,7 +9,7 @@ class Incubator void Init(); void UnInit(); - void AddHoldHuman(Human* num); + void AddHoldHuman(Human* hum); private: std::set hold_humans_; From 724e7393bfc787bc7d16e57301f96c1456fc9483 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 15:56:04 +0800 Subject: [PATCH 10/42] 1 --- server/gameserver/room.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 0adeb2a..efb64bf 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1158,6 +1158,19 @@ void Room::UpdateGasInactive() NotifyWxVoip(); InitAirDrop(); InitAndroidAI(); +#if 1 + xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * 1, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.sender.GetUserData(); + room->ProcDisableHuman(); + room->SecondRandPoint(); + }, + &xtimer_attacher_.timer_list_); +#endif RoomMgr::Instance()->ActiveRoom(GetRoomUuid()); int auto_jump_interval = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_interval"); auto_jump_timer_ = xtimer.AddRepeatTimerAndAttach @@ -2673,6 +2686,15 @@ bool Room::HasPlayerInRound(const a8::Vec2& pos, float rad) void Room::ProcDisableHuman() { + #if 1 + for (auto& pair : human_hash_) { + if (pair.second->IsAndroid() && + pair.second->team_uuid.empty() && + !a8::HasBitFlag(pair.second->status, HS_Disable)) { + DisableHuman(pair.second); + } + } + #else if (room_type_ == RT_NewBrid || room_type_ == RT_MidBrid) { for (auto& pair : human_hash_) { if (pair.second->IsAndroid() && @@ -2682,6 +2704,7 @@ void Room::ProcDisableHuman() } } } + #endif } void Room::OnHumanGridChg(Human* target) From ef7b5d541714f99ddf66361b866d3cb452717253 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 16:21:10 +0800 Subject: [PATCH 11/42] 11 --- server/gameserver/room.cc | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index efb64bf..0a46682 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1158,19 +1158,6 @@ void Room::UpdateGasInactive() NotifyWxVoip(); InitAirDrop(); InitAndroidAI(); -#if 1 - xtimer.AddDeadLineTimerAndAttach - (SERVER_FRAME_RATE * 1, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Room* room = (Room*)param.sender.GetUserData(); - room->ProcDisableHuman(); - room->SecondRandPoint(); - }, - &xtimer_attacher_.timer_list_); -#endif RoomMgr::Instance()->ActiveRoom(GetRoomUuid()); int auto_jump_interval = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_interval"); auto_jump_timer_ = xtimer.AddRepeatTimerAndAttach From b007732beadb0193d5107e1144bf113819df2444 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 16:52:52 +0800 Subject: [PATCH 12/42] 1 --- server/gameserver/constant.h | 3 ++- server/gameserver/human.cc | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index b72db83..077ff4a 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -169,6 +169,7 @@ enum BuffEffectType_e kBET_InWater = 57, //在水里 kBET_InIce = 58, //在冰里 kBET_BatchAddBuff = 60, //批量添加buff + kBET_BeRecycle = 61, //待回收 kBET_End }; @@ -467,5 +468,5 @@ const int kRecoilBuffId = 7005; const int kInGrassBuffId = 7006; const int kInWaterBuffId = 7007; const int kInIceBuffId = 7008; - +const int kBeRecycleBuffId = 7009; const float DEFAULT_FLY_DISTANCE = 5.0f; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c0ffbde..d6fe8f5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1054,6 +1054,9 @@ void Human::DoJump() MustBeAddBuff(this, JUMP_BUFFID); jump_frameno_ = room->GetFrameNo(); SyncAroundPlayers(__FILE__, __LINE__, __func__); + if (IsAndroid() && team_uuid.empty()) { + MustBeAddBuff(this, kBeRecycleBuffId); + } } } @@ -2631,7 +2634,9 @@ Skin* Human::GetSkinByIdx(int idx) void Human::AddBuffPostProc(Creature* caster, Buff* buff) { - room->frame_event.AddBuff(this, buff); + if (!buff->meta->i->only_server()) { + room->frame_event.AddBuff(this, buff); + } } int Human::GetItemNum(int item_id) @@ -3389,3 +3394,4 @@ void Human::GetHitAabbBox(AabbCollider& aabb_box) aabb_box._max.y = GetHitRadius(); } } + From 9c122135cf831a15d6fd6f758c0c00f20189c08c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 17:38:39 +0800 Subject: [PATCH 13/42] 1 --- server/gameserver/buff.cc | 19 +++++++++++++++++++ server/gameserver/buff.h | 1 + server/gameserver/creature.cc | 5 +++++ server/gameserver/human.cc | 6 +++--- server/gameserver/incubator.cc | 5 +++++ server/gameserver/incubator.h | 3 +++ server/gameserver/room.h | 1 + 7 files changed, 37 insertions(+), 3 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 2b89e6f..0659eca 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -6,6 +6,7 @@ #include "room.h" #include "collider.h" #include "skill.h" +#include "incubator.h" int Buff::GetLeftTime() { @@ -145,6 +146,24 @@ void Buff::ProcSummonHero(Creature* caster) } } +void Buff::ProcBeRecycle(Creature* caster) +{ + owner->room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE * 2, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Buff* buff = (Buff*)param.sender.GetUserData(); + if (buff->owner->IsHuman()) { + buff->owner->room->GetIncubator()->RecycleAndroid((Human*)buff->owner); + } + }, + &xtimer_attacher.timer_list_ + ); +} + bool Buff::NeedSync(Human* hum) { return !meta->i->only_server() || !(meta->i->only_self() && owner == hum); diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index bcf9c29..bc3c860 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -36,6 +36,7 @@ class Buff void ProcIntervalAddBuff(Creature* caster); void ProcBatchAddBuff(Creature* caster); void ProcSummonHero(Creature* caster); + void ProcBeRecycle(Creature* caster); private: void InternalTimerAddBuff(Creature* caster); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 4072f5b..055822c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -874,6 +874,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) buff->ProcBatchAddBuff(caster); } break; + case kBET_BeRecycle: + { + buff->ProcBeRecycle(caster); + } + break; default: { } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 97d5d87..22b83b8 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1056,9 +1056,6 @@ void Human::DoJump() MustBeAddBuff(this, JUMP_BUFFID); jump_frameno_ = room->GetFrameNo(); SyncAroundPlayers(__FILE__, __LINE__, __func__); - if (IsAndroid() && team_uuid.empty()) { - MustBeAddBuff(this, kBeRecycleBuffId); - } } } @@ -3226,6 +3223,9 @@ void Human::OnLand() } SetPos(old_pos); } + if (IsAndroid() && team_uuid.empty()) { + MustBeAddBuff(this, kBeRecycleBuffId); + } } void Human::NextReload(int prev_weapon_id, int prev_weapon_idx) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index c30c6cb..6e8ad4d 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -12,6 +12,11 @@ void Incubator::UnInit() } +void Incubator::RecycleAndroid(Human* hum) +{ + +} + void Incubator::AddHoldHuman(Human* hum) { hold_humans_.insert(hum); diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index f262c6f..3712c2d 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -9,6 +9,9 @@ class Incubator void Init(); void UnInit(); + void RecycleAndroid(Human* hum); + +private: void AddHoldHuman(Human* hum); private: diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 0e3977e..26e99b0 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -170,6 +170,7 @@ public: int GetOnlinePlayerNum(); RoomObstacle* CreateObstacle(int id, float x, float y); int AllocUniid(); + Incubator* GetIncubator() { return incubator_;}; private: void ShuaAndroid(); From c728ac4ec5416f5c9ec614667e145d4814af3d2f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 19:10:42 +0800 Subject: [PATCH 14/42] 1 --- server/gameserver/incubator.cc | 8 ++++++++ server/gameserver/room.cc | 6 ++++++ server/gameserver/room.h | 1 + 3 files changed, 15 insertions(+) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 6e8ad4d..84ee284 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -14,7 +14,15 @@ void Incubator::UnInit() void Incubator::RecycleAndroid(Human* hum) { + #if 0 + room->TouchPlayerList + ( + a8::XParams(), + [] (Player* hum, a8::XParams& param) + { + }); + #endif } void Incubator::AddHoldHuman(Human* hum) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 456d1f2..125bdfe 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2993,6 +2993,9 @@ void Room::AddToHumanHash(Human* hum) void Room::AddToAliveHumanHash(Human* hum) { alive_human_hash_[hum->GetEntityUniId()] = hum; + if (hum->IsPlayer()) { + alive_player_hash_[hum->GetEntityUniId()] = hum; + } } void Room::AddToMoveableHash(MoveableEntity* entity) @@ -3033,6 +3036,9 @@ void Room::RemoveFromHuamnHash(Human* hum) void Room::RemoveFromAliveHumanHash(Human* hum) { alive_human_hash_.erase(hum->GetEntityUniId()); + if (hum->IsPlayer()) { + alive_player_hash_.erase(hum->GetEntityUniId()); + } } void Room::RemoveFromLaterAddHash(RoomEntity* entity) diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 26e99b0..61acea0 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -311,6 +311,7 @@ private: std::map later_add_hash_; std::map human_hash_; std::map alive_human_hash_; + std::map alive_player_hash_; std::map last_human_hash_; std::map born_point_hash_; From 5c37a616819fde481a56b8329ffee78578dff244 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 19:20:04 +0800 Subject: [PATCH 15/42] add touch alive players --- server/gameserver/room.cc | 10 ++++++++++ server/gameserver/room.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 125bdfe..4695397 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1079,6 +1079,16 @@ void Room::TouchEntityList(a8::XParams param, } } +void Room::TouchAlivePlayers(a8::XParams param, + std::function func) +{ + for (auto& pair : alive_player_hash_) { + if (!func(pair.second, param)) { + break; + } + } +} + void Room::UpdateGas() { switch (gas_data_.gas_mode) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 61acea0..5e65112 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -98,6 +98,8 @@ public: std::function func); void TouchEntityList(a8::XParams param, std::function func); + void TouchAlivePlayers(a8::XParams param, + std::function func); void ScatterDrop(a8::Vec2 center, int drop_id); void DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv); From 00cea231a5c9a1fa9c4e3ebceecaab5746b7d68e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 12 Apr 2021 20:09:48 +0800 Subject: [PATCH 16/42] 1 --- server/gameserver/human.cc | 4 +++- server/gameserver/incubator.cc | 27 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 22b83b8..a3bbb49 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3195,7 +3195,9 @@ void Human::OnBuffRemove(const Buff& buff) default: break; } - room->frame_event.RemoveBuff(this, buff.meta->i->buff_id()); + if (!buff.meta->i->only_server()) { + room->frame_event.RemoveBuff(this, buff.meta->i->buff_id()); + } } void Human::OnLand() diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 84ee284..fc20f38 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -1,6 +1,8 @@ #include "precompile.h" #include "incubator.h" +#include "room.h" +#include "human.h" void Incubator::Init() { @@ -14,15 +16,30 @@ void Incubator::UnInit() void Incubator::RecycleAndroid(Human* hum) { - #if 0 - room->TouchPlayerList + Human* nearest_hum = nullptr; + Human* target = hum; + float distance = 10000000; + room->TouchAlivePlayers ( a8::XParams(), - [] (Player* hum, a8::XParams& param) + [&nearest_hum, target, &distance] (Human* hum, a8::XParams& param) -> bool { - + float tmp_distance = hum->GetPos().ManhattanDistance(target->GetPos()); + if (tmp_distance < distance) { + nearest_hum = hum; + distance = tmp_distance; + } + return true; }); - #endif + if (distance < 450) { + hum->RemoveBuffByEffectId(kBET_BeRecycle); + return; + } + if (distance > 1450) { + hum->RemoveBuffByEffectId(kBET_BeRecycle); + AddHoldHuman(nearest_hum); + return; + } } void Incubator::AddHoldHuman(Human* hum) From af7e06aea89e53357be89de2215863955e389959 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 13:54:28 +0800 Subject: [PATCH 17/42] 1 --- server/gameserver/incubator.cc | 16 ++++++++++------ server/gameserver/incubator.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index fc20f38..09fce62 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -14,6 +14,11 @@ void Incubator::UnInit() } +void Incubator::AllocAndroid(Human* target, int num) +{ + +} + void Incubator::RecycleAndroid(Human* hum) { Human* nearest_hum = nullptr; @@ -31,18 +36,17 @@ void Incubator::RecycleAndroid(Human* hum) } return true; }); + if (hum->dead) { + hum->RemoveBuffByEffectId(kBET_BeRecycle); + return; + } if (distance < 450) { hum->RemoveBuffByEffectId(kBET_BeRecycle); return; } if (distance > 1450) { hum->RemoveBuffByEffectId(kBET_BeRecycle); - AddHoldHuman(nearest_hum); + hold_humans_.insert(hum); return; } } - -void Incubator::AddHoldHuman(Human* hum) -{ - hold_humans_.insert(hum); -} diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index 3712c2d..ee8c875 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -9,10 +9,10 @@ class Incubator void Init(); void UnInit(); + void AllocAndroid(Human* target, int num); void RecycleAndroid(Human* hum); private: - void AddHoldHuman(Human* hum); private: std::set hold_humans_; From 6a4131726f8bdf1368648b70dce238ef319db9c3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 14:10:19 +0800 Subject: [PATCH 18/42] 1 --- server/gameserver/human.h | 1 + server/gameserver/types.h | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 46ad98c..e1499ed 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -52,6 +52,7 @@ class Human : public Creature int today_enter_times = 0; int account_registertime = 0; int channel = 0; + HumanBehavior behavior; MetaData::Player* meta = nullptr; MetaData::Equip* helmet_meta = nullptr; MetaData::Equip* chest_meta = nullptr; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 989b6b3..d5ab79e 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -131,6 +131,14 @@ struct HumanAbility float fire_rate = 0.0f; }; +struct HumanBehavior +{ + long long last_destory_box_frameno = 0; + int total_destory_box_times = 0; + long long curr_start_destory_box_frameno = 0; + int curr_destory_box_times = 0; +}; + struct ObstacleData { int flags = 0; From ecf8ddc264676a3e3133cbdb4a4266fc91540fce Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 14:58:30 +0800 Subject: [PATCH 19/42] 1 --- server/gameserver/human.cc | 34 ++++++++++++++++++++++++++++++++++ server/gameserver/human.h | 1 + server/gameserver/incubator.cc | 2 ++ server/gameserver/metamgr.cc | 4 ++++ server/gameserver/metamgr.h | 5 +++++ server/gameserver/types.h | 3 +-- 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a3bbb49..250cbd3 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -27,6 +27,7 @@ #include "aicomponent.h" #include "jsondatamgr.h" #include "skill.h" +#include "incubator.h" #include "framework/cpp/utils.h" #include "framework/cpp/httpclientpool.h" @@ -937,6 +938,10 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i &xtimer_attacher.timer_list_ ); SyncAroundPlayers(__FILE__, __LINE__, __func__); + if (GetNearbyTeammateNum(MetaMgr::Instance()->refresh_ai_downed_nearby_range) < + MetaMgr::Instance()->refresh_ai_downed_nearby_teammate_num) { + room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); + } } else { BeKill(killer_id, killer_name, weapon_id); } @@ -1042,6 +1047,21 @@ bool Human::HasNoDownedTeammate() return false; } +int Human::GetNearbyTeammateNum(float range) +{ + int num = 0; + if (team_members) { + for (auto& hum : *team_members) { + if (hum != this && !hum->dead && !hum->downed) { + if (hum->GetPos().Distance(GetPos()) <= range) { + ++num; + } + } + } + } + return num; +} + bool Human::CanUseSkill(int skill_id) { return !downed && Creature::CanUseSkill(skill_id); @@ -2709,6 +2729,20 @@ void Human::DropItems(Obstacle* obstacle) } else { ++normal_drop_times_; } + { + if (behavior.curr_start_destory_box_frameno <= 0 || + behavior.curr_destory_box_times >= MetaMgr::Instance()->refresh_ai_destory_box_times || + (room->GetFrameNo() - behavior.curr_start_destory_box_frameno > + MetaMgr::Instance()->refresh_ai_destory_box_time * SERVER_FRAME_RATE)){ + behavior.curr_start_destory_box_frameno = room->GetFrameNo(); + behavior.curr_destory_box_times = 0; + } + behavior.curr_destory_box_times++; + behavior.total_destory_box_times++; + if (behavior.curr_destory_box_times >= MetaMgr::Instance()->refresh_ai_destory_box_times) { + room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); + } + } #ifdef DEBUG #if 0 a8::UdpLog::Instance()->Debug("DropItems normal:%d box:%d drop_id:%d is_treasure_box:%d", diff --git a/server/gameserver/human.h b/server/gameserver/human.h index e1499ed..5bcd2bb 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -171,6 +171,7 @@ class Human : public Creature void RemoveOutObjects(Entity* entity); bool HasLiveTeammate(); bool HasNoDownedTeammate(); + int GetNearbyTeammateNum(float range); void DoJump(); virtual bool CanUseSkill(int skill_id) override; virtual Skill* SelectSkill(); diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 09fce62..1b1db5f 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -16,7 +16,9 @@ void Incubator::UnInit() void Incubator::AllocAndroid(Human* target, int num) { + if (num > 0) { + } } void Incubator::RecycleAndroid(Human* hum) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 4816e07..1d33b15 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -237,6 +237,10 @@ public: METAMGR_READ(teammate_bekill_color, 0x00FF00); METAMGR_READ(self_kill_color, 0xFFFF00); METAMGR_READ(self_bekill_color, 0x00FF00); + METAMGR_READ(refresh_ai_destory_box_time, 30); + METAMGR_READ(refresh_ai_destory_box_times, 5); + METAMGR_READ(refresh_ai_downed_nearby_teammate_num, 1); + METAMGR_READ(refresh_ai_downed_nearby_range, 580); { METAMGR_READ_STR(level0room_spec_things, ""); std::vector tmpstrings; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index ecef472..5854d6d 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -139,6 +139,11 @@ class MetaMgr : public a8::Singleton float ice_show_time = 0.5f; float ice_invisible_time2 = 2.0f; + int refresh_ai_destory_box_time = 30; + int refresh_ai_destory_box_times = 5; + int refresh_ai_downed_nearby_teammate_num = 1; + int refresh_ai_downed_nearby_range = 580; + #if 0 int refresh_robot_min_num = 0; int refresh_robot_max_num = 0; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index d5ab79e..e639071 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -133,10 +133,9 @@ struct HumanAbility struct HumanBehavior { - long long last_destory_box_frameno = 0; - int total_destory_box_times = 0; long long curr_start_destory_box_frameno = 0; int curr_destory_box_times = 0; + int total_destory_box_times = 0; }; struct ObstacleData From 3013b24550e35676281bdc33560f7c7cfc97d869 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 19:01:11 +0800 Subject: [PATCH 20/42] 1 --- server/gameserver/human.h | 1 + 1 file changed, 1 insertion(+) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 5bcd2bb..40ddcf0 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -330,6 +330,7 @@ protected: bool follow_synced_active_player = false; Car* car_ = nullptr; int seat_ = 0; + std::set view_objects_; private: CircleCollider* self_collider_ = nullptr; From 8b76a1cd571fa1f94af866278a4a735d1b6bcc53 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 20:26:32 +0800 Subject: [PATCH 21/42] 1 --- server/gameserver/constant.h | 2 ++ server/gameserver/incubator.cc | 44 +++++++++++++++++++++++++++++++--- server/gameserver/incubator.h | 3 ++- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 14d622d..aa9ddba 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -170,6 +170,7 @@ enum BuffEffectType_e kBET_InIce = 58, //在冰里 kBET_BatchAddBuff = 60, //批量添加buff kBET_BeRecycle = 61, //待回收 + kBET_Trace = 62, //追踪玩家 kBET_End }; @@ -470,4 +471,5 @@ const int kInGrassBuffId = 7006; const int kInWaterBuffId = 7007; const int kInIceBuffId = 7008; const int kBeRecycleBuffId = 7009; +const int kTraceBuffId = 7011; const float DEFAULT_FLY_DISTANCE = 5.0f; diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 1b1db5f..d98fdfd 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -4,6 +4,9 @@ #include "room.h" #include "human.h" +const int ALLOC_BASE_LENGTH = 500; +const int ALLOC_RAND_LENGTH = 100; + void Incubator::Init() { @@ -16,8 +19,23 @@ void Incubator::UnInit() void Incubator::AllocAndroid(Human* target, int num) { - if (num > 0) { - + int try_count = 0; + a8::Vec2 dir = a8::Vec2::UP; + while (num > 0 && try_count < 20 && !hold_humans_.empty()) { + dir.Rotate(a8::RandAngle()); + int rand_len = rand() % ALLOC_RAND_LENGTH; + Human* hum = hold_humans_[0]; + a8::Vec2 old_pos = hum->GetPos(); + hum->SetPos(target->GetPos() + dir + ALLOC_BASE_LENGTH + rand_len); + if (!hum->CollisonDetection() && CanSet(hum, target)) { + hum->SetPos(old_pos); + } else { + room->EnableHuman(hum); + hum->MustBeAddBuff(hum, kTraceBuffId); + hold_humans_.erase(hold_humans_.begin()); + --num; + } + ++try_count; } } @@ -48,7 +66,27 @@ void Incubator::RecycleAndroid(Human* hum) } if (distance > 1450) { hum->RemoveBuffByEffectId(kBET_BeRecycle); - hold_humans_.insert(hum); + hold_humans_.push_back(hum); return; } } + +bool Incubator::CanSet(Human* hum, Human* exclude_hum) +{ + Human* target = hum; + bool can_set = true; + room->TouchAlivePlayers + ( + a8::XParams(), + [target, exclude_hum, &can_set] (Human* hum, a8::XParams& param) -> bool + { + if (hum != exclude_hum) { + if (target->GetPos().ManhattanDistance(hum->GetPos()) < 100) { + can_set = false; + return false; + } + } + return true; + }); + return can_set; +} diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index ee8c875..165cf58 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -13,7 +13,8 @@ class Incubator void RecycleAndroid(Human* hum); private: + bool CanSet(Human* hum, Human* exclude_hum); private: - std::set hold_humans_; + std::vector hold_humans_; }; From 32d2325e208b2b98ed9a28aa716694916b05a5c0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 21:17:29 +0800 Subject: [PATCH 22/42] 1 --- server/gameserver/android.ai.cc | 1 + server/gameserver/human.cc | 54 +++++++++++++++++++++++++++++++++ server/gameserver/human.h | 2 ++ server/gameserver/player.cc | 1 + 4 files changed, 58 insertions(+) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 3c0bd22..5d7bc99 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -73,6 +73,7 @@ void AndroidNewAI::Update(int delta_time) return; } UpdateNewAI(); + hum->UpdateViewObjects(); } float AndroidNewAI::GetAttackRate() diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 250cbd3..68366eb 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3262,6 +3262,24 @@ void Human::OnLand() if (IsAndroid() && team_uuid.empty()) { MustBeAddBuff(this, kBeRecycleBuffId); } + if (IsPlayer()) { + refresh_view_timer_ = room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE * 8, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->UpdateViewObjects(); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->refresh_view_timer_ = nullptr; + }); + } } void Human::NextReload(int prev_weapon_id, int prev_weapon_idx) @@ -3433,3 +3451,39 @@ void Human::GetHitAabbBox(AabbCollider& aabb_box) } } +void Human::UpdateViewObjects() +{ + if (view_objects_.size() >= 2) { + std::vector deleted_humans; + for (Human* hum : view_objects_) { + if (hum->dead || hum->GetPos().ManhattanDistance(GetPos()) > 1000) { + deleted_humans.push_back(hum); + } + } + for (Human* hum : deleted_humans) { + view_objects_.erase(hum); + } + } + if (view_objects_.size() < 2) { + TouchAllLayerHumanList + ( + [this] (Human* hum, bool& stop) + { + if (hum->IsAndroid() && !hum->dead && view_objects_.find(hum) == view_objects_.end()) { + if (hum->GetPos().ManhattanDistance(GetPos()) < 1000) { + view_objects_.insert(hum); + } + if (view_objects_.size() >= 2) { + stop = true; + return; + } + } + }); + } + if (view_objects_.size() < 2) { + room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); + if (refresh_view_timer_) { + room->xtimer.ModifyTimer(refresh_view_timer_, SERVER_FRAME_RATE * (8 + (rand() % 3))); + } + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 40ddcf0..188afcb 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -243,6 +243,7 @@ class Human : public Creature void SetSeat(int seat) { seat_ = seat; } void DeadDrop(); virtual std::string GetName() override { return name;}; + void UpdateViewObjects(); protected: void _InternalUpdateMove(float speed); @@ -331,6 +332,7 @@ protected: Car* car_ = nullptr; int seat_ = 0; std::set view_objects_; + xtimer_list* refresh_view_timer_ = nullptr; private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 68795aa..789384e 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,6 +129,7 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } + UpdateViewObjects(); } } From 5226e772575d6cd02ecc09982caa9bdc90756449 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 21:29:23 +0800 Subject: [PATCH 23/42] 1 --- server/gameserver/human.cc | 6 ++++-- server/gameserver/incubator.cc | 11 +++++------ server/gameserver/metamgr.h | 7 +++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 946593e..a41aa58 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3460,7 +3460,8 @@ void Human::UpdateViewObjects() if (view_objects_.size() >= 2) { std::vector deleted_humans; for (Human* hum : view_objects_) { - if (hum->dead || hum->GetPos().ManhattanDistance(GetPos()) > 1000) { + if (hum->dead || hum->GetPos().ManhattanDistance(GetPos()) > + MetaMgr::Instance()->view_objects_out_distance) { deleted_humans.push_back(hum); } } @@ -3474,7 +3475,8 @@ void Human::UpdateViewObjects() [this] (Human* hum, bool& stop) { if (hum->IsAndroid() && !hum->dead && view_objects_.find(hum) == view_objects_.end()) { - if (hum->GetPos().ManhattanDistance(GetPos()) < 1000) { + if (hum->GetPos().ManhattanDistance(GetPos()) < + MetaMgr::Instance()->view_objects_in_distance) { view_objects_.insert(hum); } if (view_objects_.size() >= 2) { diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index d98fdfd..e9442d8 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -3,9 +3,7 @@ #include "incubator.h" #include "room.h" #include "human.h" - -const int ALLOC_BASE_LENGTH = 500; -const int ALLOC_RAND_LENGTH = 100; +#include "metamgr.h" void Incubator::Init() { @@ -23,10 +21,10 @@ void Incubator::AllocAndroid(Human* target, int num) a8::Vec2 dir = a8::Vec2::UP; while (num > 0 && try_count < 20 && !hold_humans_.empty()) { dir.Rotate(a8::RandAngle()); - int rand_len = rand() % ALLOC_RAND_LENGTH; + int rand_len = rand() % MetaMgr::Instance()->incubator_rand_length; Human* hum = hold_humans_[0]; a8::Vec2 old_pos = hum->GetPos(); - hum->SetPos(target->GetPos() + dir + ALLOC_BASE_LENGTH + rand_len); + hum->SetPos(target->GetPos() + dir + MetaMgr::Instance()->incubator_base_length + rand_len); if (!hum->CollisonDetection() && CanSet(hum, target)) { hum->SetPos(old_pos); } else { @@ -81,7 +79,8 @@ bool Incubator::CanSet(Human* hum, Human* exclude_hum) [target, exclude_hum, &can_set] (Human* hum, a8::XParams& param) -> bool { if (hum != exclude_hum) { - if (target->GetPos().ManhattanDistance(hum->GetPos()) < 100) { + if (target->GetPos().ManhattanDistance(hum->GetPos()) < + MetaMgr::Instance()->incubator_canset_distance) { can_set = false; return false; } diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 5854d6d..b2c16a7 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -144,6 +144,13 @@ class MetaMgr : public a8::Singleton int refresh_ai_downed_nearby_teammate_num = 1; int refresh_ai_downed_nearby_range = 580; + int view_objects_out_distance = 580; + int view_objects_in_distance = 580; + + int incubator_base_length = 580; + int incubator_rand_length = 100; + int incubator_canset_distance = 100; + #if 0 int refresh_robot_min_num = 0; int refresh_robot_max_num = 0; From ef57d6432536075e8742b382855c6b98ba40c6a5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 13:30:45 +0800 Subject: [PATCH 24/42] 1 --- server/gameserver/molotor_cocktail_mitask.cc | 6 +++--- server/gameserver/posiongas_mitask.cc | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/gameserver/molotor_cocktail_mitask.cc b/server/gameserver/molotor_cocktail_mitask.cc index 3d65a2e..e255c88 100644 --- a/server/gameserver/molotor_cocktail_mitask.cc +++ b/server/gameserver/molotor_cocktail_mitask.cc @@ -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; } } diff --git a/server/gameserver/posiongas_mitask.cc b/server/gameserver/posiongas_mitask.cc index 9a4efc3..6a349b1 100644 --- a/server/gameserver/posiongas_mitask.cc +++ b/server/gameserver/posiongas_mitask.cc @@ -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; } } From 0d49fb23378377fee88942640f18801d6e6e6c11 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 13:36:30 +0800 Subject: [PATCH 25/42] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=09=E9=80=89=E6=AD=A6?= =?UTF-8?q?=E5=99=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/creature.cc | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 6d8ba0d..d83a098 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1144,7 +1144,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(); } } @@ -1165,7 +1172,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(); } } @@ -1448,7 +1462,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) From b188d479a1a606b7fe0d61197a23b0967e771841 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 15:22:11 +0800 Subject: [PATCH 26/42] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/android.ai.cc | 3 +++ server/gameserver/creature.cc | 10 +++++++++- server/gameserver/creature.h | 4 ++-- server/gameserver/player.cc | 7 +++++-- server/gameserver/zombiemode.ai.cc | 3 +++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 3c0bd22..d675bce 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -429,6 +429,9 @@ void AndroidNewAI::UpdateNewAI() abort(); } } + if (hum->playing_skill) { + hum->UpdateSkill(); + } ++node_.exec_frame_num; hum->shot_hold = false; switch (node_.main_state) { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d83a098..dd5eb4d 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -482,6 +482,12 @@ bool Creature::CanUseSkill(int skill_id) if (!skill) { return false; } + if (dead) { + return false; + } + if (playing_skill) { + return false; + } return skill->GetCurrTimes() > 0; } @@ -562,7 +568,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()) { @@ -572,6 +578,8 @@ void Creature::UpdateSkill() } else { playing_skill = false; } + } else { + playing_skill = false; } } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index f947c9e..6dcfeac 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -45,6 +45,7 @@ class Creature : public MoveableEntity std::function on_move_collision; bool poisoning = false; long long poisoning_time = 0; + bool playing_skill = false; Weapon car_weapon; a8::Vec2 buff_vec2_param1; @@ -140,6 +141,7 @@ class Creature : public MoveableEntity Weapon* GetCurrWeapon() { return curr_weapon_; }; void SetCurrWeapon(Weapon* weapon); void ResetAllSkillCd(); + void UpdateSkill(); private: @@ -148,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); @@ -177,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; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 68795aa..e2393bb 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,7 +129,10 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } - } + if (playing_skill) { + UpdateSkill(); + } + } } void Player::UpdateMove() @@ -624,7 +627,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; diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 18441df..0cbedbe 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -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) { From 2eb85601a16edba46aea50f0da1adf987166f8b4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 15:24:34 +0800 Subject: [PATCH 27/42] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9C=A9=E6=99=95?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index b0d688d..f9fe1c9 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1770,12 +1770,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) From f15c76e30f615e736916a9060e98da247623ccff Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 15:36:56 +0800 Subject: [PATCH 28/42] 1 --- server/gameserver/creature.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index dd5eb4d..a0b1d0a 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -517,7 +517,10 @@ void Creature::DoSkill(int skill_id, std::set 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)) { From 6a7334b756e27f920706ff2ac3e5df197378a6a9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 15:42:27 +0800 Subject: [PATCH 29/42] 1 --- server/gameserver/creature.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a0b1d0a..b0a154e 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -857,9 +857,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: From e3acf841218b79db3627b36787885c85b03d28f7 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 16:10:07 +0800 Subject: [PATCH 30/42] 1 --- server/gameserver/creature.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index b0a154e..79b3176 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1212,6 +1212,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; } From 27b7ed100f51eb4f69cfb5830283f83846bd4984 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 15 Apr 2021 17:35:35 +0800 Subject: [PATCH 31/42] 1 --- server/gameserver/creature.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 79b3176..34e2983 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -146,9 +146,11 @@ void Creature::AddBuff(Creature* caster, int skill_lv, MetaData::Skill* buff_skill_meta) { + #if 0 if (GetBuffById(buff_meta->i->buff_id())) { return; } + #endif if (IsImmuneBuffEffect(buff_meta->i->buff_effect())) { return; } From b8876aa3979e5f659c48c10bc33c12141f4b20e8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 10:15:00 +0800 Subject: [PATCH 32/42] 1 --- server/gameserver/player.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 1207a51..2701662 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,15 +129,11 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } -<<<<<<< HEAD UpdateViewObjects(); - } -======= if (playing_skill) { UpdateSkill(); } } ->>>>>>> dev } void Player::UpdateMove() From f88feb51cb0ffa18b7fd947653adc9d34255e535 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 10:25:32 +0800 Subject: [PATCH 33/42] 1 --- server/gameserver/android.ai.cc | 1 - server/gameserver/player.cc | 1 - 2 files changed, 2 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 76f48d3..d675bce 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -73,7 +73,6 @@ void AndroidNewAI::Update(int delta_time) return; } UpdateNewAI(); - hum->UpdateViewObjects(); } float AndroidNewAI::GetAttackRate() diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 2701662..e2393bb 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,7 +129,6 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } - UpdateViewObjects(); if (playing_skill) { UpdateSkill(); } From 09862e8c44b47ab44c71eb4857edd4e95487a30b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 10:35:31 +0800 Subject: [PATCH 34/42] add BroadcastDebugMsg --- server/gameserver/room.cc | 15 +++++++++++++++ server/gameserver/room.h | 1 + 2 files changed, 16 insertions(+) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 1b343f7..81076d9 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1094,6 +1094,21 @@ void Room::TouchAlivePlayers(a8::XParams param, } } +void Room::BroadcastDebugMsg(const std::string& debug_msg) +{ + #ifdef DEBUG + TouchHumanList + ( + a8::XParams() + .SetParam1(debug_msg), + [] (Human* hum, a8::XParams& param) -> bool + { + hum->SendDebugMsg(param.param1); + return true; + }); + #endif +} + void Room::UpdateGas() { switch (gas_data_.gas_mode) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index a115992..8703f1d 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -101,6 +101,7 @@ public: std::function func); void TouchAlivePlayers(a8::XParams param, std::function func); + void BroadcastDebugMsg(const std::string& debug_msg); void ScatterDrop(a8::Vec2 center, int drop_id); void DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv); From b6abae192229a3653d7bf7b731660558c289d207 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 15:18:33 +0800 Subject: [PATCH 35/42] 1 --- server/gameserver/bullet.cc | 5 +++ server/gameserver/framemaker.cc | 27 +++++++++++++++ server/gameserver/human.cc | 59 +++++++++++++++++++-------------- server/gameserver/human.h | 1 + server/gameserver/incubator.cc | 53 +++++++++++++++++++++++++++-- server/gameserver/metamgr.cc | 9 +++++ server/gameserver/metamgr.h | 2 ++ server/gameserver/room.cc | 12 +++++++ 8 files changed, 142 insertions(+), 26 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 99050e4..8c520e4 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -75,6 +75,11 @@ void Bullet::OnHit(std::set& objects) #if 0 sender->stats.damage_amount_out += finaly_dmg; #endif +#ifdef DEBUG + if (App::Instance()->HasFlag(1) && hum->IsPlayer()) { + continue; + } +#endif hum->DecHP(finaly_dmg, sender.Get()->GetEntityUniId(), sender.Get()->GetName(), gun_meta->i->id()); #ifdef DEBUG sender.Get()->SendDebugMsg(a8::Format("bullet weapon_id:%d atk:%f", diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 4b35ed1..e006aaf 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -6,6 +6,7 @@ #include "typeconvert.h" #include "metamgr.h" #include "car.h" +#include "app.h" cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) { @@ -31,6 +32,16 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) if (hum->IsPlayer()) { itr->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects()); } + #ifdef DEBUG + if (App::Instance()->HasFlag(2) && itr->GetEntityType() == ET_Player) { + room->BroadcastDebugMsg(a8::Format("投放 %d pos:%d,%d 出现", + { + itr->GetEntityUniId(), + itr->GetPos().x, + itr->GetPos().y, + })); + } + #endif } for (auto& itr : hum->part_objects) { Entity* entity = itr; @@ -52,9 +63,25 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) } for (auto& itr : hum->del_objects) { msg->add_del_objids(itr); + #ifdef DEBUG + if (App::Instance()->HasFlag(2)) { + room->BroadcastDebugMsg(a8::Format("投放 删除对象%d", + { + itr + })); + } + #endif } for (auto& itr : hum->out_objects) { msg->add_out_objids(itr); + #ifdef DEBUG + if (App::Instance()->HasFlag(2)) { + room->BroadcastDebugMsg(a8::Format("投放 移除视野对象%d", + { + itr + })); + } + #endif } for (size_t idx : hum->shots_) { if (idx < room->frame_event.shots_.size()) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 8914711..94a6e05 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -945,7 +945,9 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i SyncAroundPlayers(__FILE__, __LINE__, __func__); if (GetNearbyTeammateNum(MetaMgr::Instance()->refresh_ai_downed_nearby_range) < MetaMgr::Instance()->refresh_ai_downed_nearby_teammate_num) { + #if 0 room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); + #endif } } else { BeKill(killer_id, killer_name, weapon_id); @@ -981,6 +983,11 @@ int Human::GetPartObjectsCount() return part_objects.size(); } +bool Human::InNewObjects(Entity* target) +{ + return new_objects.find(target) != new_objects.end(); +} + bool Human::InPartObjects(Entity* target) { return part_objects.find(target) != part_objects.end(); @@ -2747,7 +2754,9 @@ void Human::DropItems(Obstacle* obstacle) behavior.curr_destory_box_times++; behavior.total_destory_box_times++; if (behavior.curr_destory_box_times >= MetaMgr::Instance()->refresh_ai_destory_box_times) { + #if 0 room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); + #endif } } #ifdef DEBUG @@ -3246,6 +3255,27 @@ void Human::OnLand() //着陆 RemoveBuffByEffectId(kBET_Jump); RemoveBuffByEffectId(kBET_ThroughWall); + if (IsAndroid() && team_uuid.empty()) { + MustBeAddBuff(this, kBeRecycleBuffId); + } + if (IsPlayer()) { + refresh_view_timer_ = room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE * MetaMgr::Instance()->refresh_view_time, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->UpdateViewObjects(); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->refresh_view_timer_ = nullptr; + }); + } if (IsCollisionInMapService()) { a8::Vec2 old_pos = GetPos(); std::vector dirs; @@ -3266,27 +3296,6 @@ void Human::OnLand() } SetPos(old_pos); } - if (IsAndroid() && team_uuid.empty()) { - MustBeAddBuff(this, kBeRecycleBuffId); - } - if (IsPlayer()) { - refresh_view_timer_ = room->xtimer.AddRepeatTimerAndAttach - ( - SERVER_FRAME_RATE * 8, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->UpdateViewObjects(); - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->refresh_view_timer_ = nullptr; - }); - } } void Human::NextReload(int prev_weapon_id, int prev_weapon_idx) @@ -3463,8 +3472,8 @@ void Human::UpdateViewObjects() if (view_objects_.size() >= 2) { std::vector deleted_humans; for (Human* hum : view_objects_) { - if (hum->dead || hum->GetPos().ManhattanDistance(GetPos()) > - MetaMgr::Instance()->view_objects_out_distance) { + if (hum->dead || + hum->GetPos().ManhattanDistance(GetPos()) > MetaMgr::Instance()->view_objects_out_distance) { deleted_humans.push_back(hum); } } @@ -3492,7 +3501,9 @@ void Human::UpdateViewObjects() if (view_objects_.size() < 2) { room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); if (refresh_view_timer_) { - room->xtimer.ModifyTimer(refresh_view_timer_, SERVER_FRAME_RATE * (8 + (rand() % 3))); + room->xtimer.ModifyTimer(refresh_view_timer_, + SERVER_FRAME_RATE * (MetaMgr::Instance()->refresh_view_time + (rand() % 3)) + ); } } } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 188afcb..a503262 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -164,6 +164,7 @@ class Human : public Creature void AddToNewObjects(Entity* entity); void AddToPartObjects(Entity* entity); void RemovePartObjects(Entity* entity); + bool InNewObjects(Entity* target); bool InPartObjects(Entity* target); int GetPartObjectsCount(); void RemoveObjects(Entity* entity); diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index e9442d8..64335ad 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -17,6 +17,10 @@ void Incubator::UnInit() void Incubator::AllocAndroid(Human* target, int num) { + if (room->xtimer.GetRunningTimer() == nullptr) { + abort(); + } + num = 1; int try_count = 0; a8::Vec2 dir = a8::Vec2::UP; while (num > 0 && try_count < 20 && !hold_humans_.empty()) { @@ -24,17 +28,41 @@ void Incubator::AllocAndroid(Human* target, int num) int rand_len = rand() % MetaMgr::Instance()->incubator_rand_length; Human* hum = hold_humans_[0]; a8::Vec2 old_pos = hum->GetPos(); - hum->SetPos(target->GetPos() + dir + MetaMgr::Instance()->incubator_base_length + rand_len); - if (!hum->CollisonDetection() && CanSet(hum, target)) { + hum->SetPos(target->GetPos() + dir * (MetaMgr::Instance()->incubator_base_length + rand_len)); + if (hum->CollisonDetection() || !CanSet(hum, target)) { hum->SetPos(old_pos); } else { room->EnableHuman(hum); +#ifdef DEBUG + if (!target->InNewObjects(hum)) { + abort(); + } + if (hum->dead) { + abort(); + } +#endif hum->MustBeAddBuff(hum, kTraceBuffId); hold_humans_.erase(hold_humans_.begin()); --num; +#ifdef DEBUG + room->BroadcastDebugMsg(a8::Format("投放机器人 %d:%s pos:%d,%d pos1:%d,%d %d num:%d", + {hum->GetEntityUniId(), + hum->name, + hum->GetPos().x, + hum->GetPos().y, + target->GetPos().x, + target->GetPos().y, + hum->GetPos().Distance(target->GetPos()), + hold_humans_.size()})); +#endif } ++try_count; } +#ifdef DEBUG + if (num > 0) { + room->BroadcastDebugMsg(a8::Format("投放机器人 分配失败 %d", {hold_humans_.size()})); + } +#endif } void Incubator::RecycleAndroid(Human* hum) @@ -55,22 +83,43 @@ void Incubator::RecycleAndroid(Human* hum) return true; }); if (hum->dead) { + #ifdef DEBUG + room->BroadcastDebugMsg(a8::Format("回收机器人 %d:%s 角色已死亡", + {hum->GetEntityUniId(), + hum->name})); + #endif hum->RemoveBuffByEffectId(kBET_BeRecycle); return; } if (distance < 450) { + #ifdef DEBUG + room->BroadcastDebugMsg(a8::Format("回收机器人 %d:%s 距离太近", + {hum->GetEntityUniId(), + hum->name})); + #endif hum->RemoveBuffByEffectId(kBET_BeRecycle); return; } if (distance > 1450) { hum->RemoveBuffByEffectId(kBET_BeRecycle); hold_humans_.push_back(hum); + room->DisableHuman(hum); + #ifdef DEBUG + room->BroadcastDebugMsg(a8::Format("回收机器人 %d:%s:%d 添加到回收列表", + {hum->GetEntityUniId(), + hum->name, + hold_humans_.size() + })); + #endif return; } } bool Incubator::CanSet(Human* hum, Human* exclude_hum) { + #if 1 + return true; + #endif Human* target = hum; bool can_set = true; room->TouchAlivePlayers diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 1d33b15..763e3bd 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -241,6 +241,15 @@ public: METAMGR_READ(refresh_ai_destory_box_times, 5); METAMGR_READ(refresh_ai_downed_nearby_teammate_num, 1); METAMGR_READ(refresh_ai_downed_nearby_range, 580); + + METAMGR_READ(view_objects_out_distance, 580); + METAMGR_READ(view_objects_in_distance, 580); + + METAMGR_READ(incubator_base_length, 80); + METAMGR_READ(incubator_rand_length, 10); + METAMGR_READ(incubator_canset_distance, 100); + + METAMGR_READ(refresh_view_time, 4); { METAMGR_READ_STR(level0room_spec_things, ""); std::vector tmpstrings; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index b2c16a7..d4af9fb 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -151,6 +151,8 @@ class MetaMgr : public a8::Singleton int incubator_rand_length = 100; int incubator_canset_distance = 100; + int refresh_view_time = 8; + #if 0 int refresh_robot_min_num = 0; int refresh_robot_max_num = 0; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 81076d9..95fe20c 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2311,13 +2311,23 @@ void Room::EnableHuman(Human* target) target->GetEntityUniId() }); #endif + #if 0 + target->OnEnable(); + AddToMoveableHash(target); + if (!target->real_dead) { + AddToAliveHumanHash(target); + } + #else if (a8::HasBitFlag(target->status, HS_Disable)) { target->OnEnable(); AddToMoveableHash(target); if (!target->real_dead) { AddToAliveHumanHash(target); } + } else { + abort(); } + #endif #ifdef DEBUG CheckPartObjects(); #endif @@ -2325,9 +2335,11 @@ void Room::EnableHuman(Human* target) void Room::DisableHuman(Human* target) { + #if 0 if (!RuningInTimer()) { abort(); } + #endif #ifdef DEBUG CheckPartObjects(); a8::UdpLog::Instance()->Debug("disablehuman %d %d", From 1459d93e88f03ad4e9a384e4b8497eb1386ee65b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 15:29:02 +0800 Subject: [PATCH 36/42] 1 --- server/gameserver/incubator.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 64335ad..0e117bf 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -20,7 +20,6 @@ void Incubator::AllocAndroid(Human* target, int num) if (room->xtimer.GetRunningTimer() == nullptr) { abort(); } - num = 1; int try_count = 0; a8::Vec2 dir = a8::Vec2::UP; while (num > 0 && try_count < 20 && !hold_humans_.empty()) { @@ -117,9 +116,6 @@ void Incubator::RecycleAndroid(Human* hum) bool Incubator::CanSet(Human* hum, Human* exclude_hum) { - #if 1 - return true; - #endif Human* target = hum; bool can_set = true; room->TouchAlivePlayers From 5ea6bda761716ced17f4272df50082390a0632d3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 15:32:49 +0800 Subject: [PATCH 37/42] 1 --- server/gameserver/bullet.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 99050e4..813363d 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -417,6 +417,18 @@ void Bullet::ProcPosionGasBomb(int delay_time) void Bullet::ProcMolotorCocktailBomb(int delay_time) { if (sender.Get()) { + #if 1 + a8::Vec2 old_buff_vec2_param1 = sender.Get()->buff_vec2_param1; + sender.Get()->buff_vec2_param1 = GetPos(); + MetaData::Buff * buff_meta = MetaMgr::Instance()->GetBuff(gun_meta->i->buffid()); + if (buff_meta) { + sender.Get()->AddBuff(sender.Get(), + buff_meta, + 1 + ); + } + sender.Get()->buff_vec2_param1 = old_buff_vec2_param1; + #else MolotorCocktailMiTask* task = new MolotorCocktailMiTask(); task->room = room; task->sender.Attach(sender.Get()); @@ -442,5 +454,6 @@ void Bullet::ProcMolotorCocktailBomb(int delay_time) }, &room->timer_attacher.timer_list_ ); + #endif } } From 7c7d8546f2040b2c30babf6f18d24d948fc22da0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 15:34:46 +0800 Subject: [PATCH 38/42] 1 --- server/tools/protobuild/cs_msgid.proto | 1 + server/tools/protobuild/cs_proto.proto | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/server/tools/protobuild/cs_msgid.proto b/server/tools/protobuild/cs_msgid.proto index 50ecbc3..4f5cf81 100644 --- a/server/tools/protobuild/cs_msgid.proto +++ b/server/tools/protobuild/cs_msgid.proto @@ -20,6 +20,7 @@ enum CMMessageId_e _CMAdEnd = 214; _CMGetBoxInfo = 215; _CMOpenBox = 216; + _CMExecCommand = 217; } enum SMMessageId_e diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 59ad856..b502753 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -899,6 +899,12 @@ message CMMove optional int32 get_on = 36; } +//执行GM指令 +message CMExecCommand +{ + optional string cmd = 1; //指令 +} + //丢弃道具 message CMDropItem { From ac30eff025e7408bcf82f26b772adfdaa4f974db Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 16 Apr 2021 16:07:09 +0800 Subject: [PATCH 39/42] =?UTF-8?q?=E6=B7=BB=E5=8A=A0gm=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/handlermgr.cc | 1 + server/gameserver/incubator.cc | 4 ++-- server/gameserver/metamgr.cc | 8 ++++---- server/gameserver/player.cc | 13 +++++++++++++ server/gameserver/player.h | 1 + 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/server/gameserver/handlermgr.cc b/server/gameserver/handlermgr.cc index efdc4ed..2bb072c 100644 --- a/server/gameserver/handlermgr.cc +++ b/server/gameserver/handlermgr.cc @@ -87,6 +87,7 @@ void HandlerMgr::RegisterNetMsgHandlers() RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMReconnect); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMMove); + RegisterNetMsgHandler(&ggmsghandler, &Player::_CMExecCommand); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMEmote); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMVoice); RegisterNetMsgHandler(&ggmsghandler, &Player::_CMGameOver); diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 0e117bf..ef8526a 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -90,7 +90,7 @@ void Incubator::RecycleAndroid(Human* hum) hum->RemoveBuffByEffectId(kBET_BeRecycle); return; } - if (distance < 450) { + if (distance < MetaMgr::Instance()->incubator_canset_distance) { #ifdef DEBUG room->BroadcastDebugMsg(a8::Format("回收机器人 %d:%s 距离太近", {hum->GetEntityUniId(), @@ -99,7 +99,7 @@ void Incubator::RecycleAndroid(Human* hum) hum->RemoveBuffByEffectId(kBET_BeRecycle); return; } - if (distance > 1450) { + if (distance > MetaMgr::Instance()->incubator_canset_distance + 100) { hum->RemoveBuffByEffectId(kBET_BeRecycle); hold_humans_.push_back(hum); room->DisableHuman(hum); diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 763e3bd..d6b61b0 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -242,12 +242,12 @@ public: METAMGR_READ(refresh_ai_downed_nearby_teammate_num, 1); METAMGR_READ(refresh_ai_downed_nearby_range, 580); - METAMGR_READ(view_objects_out_distance, 580); - METAMGR_READ(view_objects_in_distance, 580); + METAMGR_READ(view_objects_out_distance, 530); + METAMGR_READ(view_objects_in_distance, 530); - METAMGR_READ(incubator_base_length, 80); + METAMGR_READ(incubator_base_length, 501); METAMGR_READ(incubator_rand_length, 10); - METAMGR_READ(incubator_canset_distance, 100); + METAMGR_READ(incubator_canset_distance, 520); METAMGR_READ(refresh_view_time, 4); { diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e2393bb..0a71baf 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1092,6 +1092,19 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) last_cmmove_frameno = room->GetFrameNo(); } +void Player::_CMExecCommand(f8::MsgHdr& hdr, const cs::CMExecCommand& msg) +{ + std::vector cmds; + a8::Split(msg.cmd().c_str(), cmds, ' '); + if (cmds.empty()) { + return; + } + std::string cmd = cmds[0]; + if (cmd == "gps") { + SendDebugMsg(a8::Format("%d %d", {GetPos().x, GetPos().y})); + } +} + void Player::UpdateDropWeapon() { if (drop_weapon_idx >= 0 && diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 3209c6c..138d7d0 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -102,6 +102,7 @@ class Player : public Human void _CMReconnect(f8::MsgHdr& hdr, const cs::CMReconnect& msg); void _CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg); + void _CMExecCommand(f8::MsgHdr& hdr, const cs::CMExecCommand& msg); void _CMEmote(f8::MsgHdr& hdr, const cs::CMEmote& msg); void _CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg); void _CMGameOver(f8::MsgHdr& hdr, const cs::CMGameOver& msg); From c9a6a55ba69b8db9a6e358a1f74e76dcba96158e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 19 Apr 2021 11:46:42 +0800 Subject: [PATCH 40/42] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=AD=BB=E4=BA=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/incubator.cc | 52 +++++++++++++++++++++++++++++++++- server/gameserver/incubator.h | 4 +++ server/gameserver/room.cc | 1 + server/gameserver/types.h | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index ef8526a..1261692 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -7,7 +7,18 @@ void Incubator::Init() { - + xtimer_attacher_.xtimer = &room->xtimer; + room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE * (2 + rand() % 3), + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Incubator* incubator = (Incubator*)param.sender.GetUserData(); + incubator->AutoAllocAndroid(); + }, + &xtimer_attacher_.timer_list_); } void Incubator::UnInit() @@ -134,3 +145,42 @@ bool Incubator::CanSet(Human* hum, Human* exclude_hum) }); return can_set; } + +void Incubator::AutoAllocAndroid() +{ + switch (room->GetGasData().gas_mode) { + case GasWaiting: + case GasMoving: + { + if (!hold_humans_.empty()){ + Human* hum = hold_humans_[0]; + if (room->GetGasData().gas_mode == GasWaiting && + hold_humans_.size() > 1 && + ((rand() % 100) > 30)) { + Human* killer = nullptr; + if (hold_humans_.size() == 2) { + killer = hold_humans_[1]; + } else { + killer = hold_humans_[1 + (rand() % (hold_humans_.size() - 1))]; + } + hum->BeKill(killer->GetEntityUniId(), + killer->name, + killer->GetCurrWeapon()->weapon_id); + } else if (room->GetGasData().gas_count > 1) { + hum->BeKill(VP_SafeArea, + TEXT("battle_server_killer_gas", "毒圈"), + VW_SafeArea); + } else { + return; + } + hold_humans_.erase(hold_humans_.begin()); + room->xtimer.ModifyTimer(room->xtimer.GetRunningTimer(), SERVER_FRAME_RATE * (3 + rand() % 5)); + } + } + break; + default: + { + } + break; + } +} diff --git a/server/gameserver/incubator.h b/server/gameserver/incubator.h index 165cf58..47a293b 100644 --- a/server/gameserver/incubator.h +++ b/server/gameserver/incubator.h @@ -1,5 +1,7 @@ #pragma once +#include + class Human; class Room; class Incubator @@ -14,7 +16,9 @@ class Incubator private: bool CanSet(Human* hum, Human* exclude_hum); + void AutoAllocAndroid(); private: std::vector hold_humans_; + a8::XTimerAttacher xtimer_attacher_; }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 95fe20c..0d29afd 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3722,6 +3722,7 @@ void Room::ForwardGasRing(int n) } gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); + gas_data_.gas_count++; --n; } } diff --git a/server/gameserver/types.h b/server/gameserver/types.h index e639071..fbff66c 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -29,6 +29,7 @@ struct GasData MetaData::SafeArea* old_area_meta = nullptr; MetaData::SafeArea* new_area_meta = nullptr; bool is_last_gas = false; + int gas_count = 0; }; struct Weapon From 2751f3ff4d7bfed59adfaeed113719121fd4a3d4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 19 Apr 2021 11:53:40 +0800 Subject: [PATCH 41/42] 1 --- server/gameserver/incubator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 1261692..87552ed 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -156,7 +156,7 @@ void Incubator::AutoAllocAndroid() Human* hum = hold_humans_[0]; if (room->GetGasData().gas_mode == GasWaiting && hold_humans_.size() > 1 && - ((rand() % 100) > 30)) { + ((rand() % 100) > 40)) { Human* killer = nullptr; if (hold_humans_.size() == 2) { killer = hold_humans_[1]; From 8d66e357786ca52d8eb922d05b77c66de737ac72 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 19 Apr 2021 13:54:29 +0800 Subject: [PATCH 42/42] add GMAddItem --- server/gameserver/human.cc | 78 +++++++++++++++++++++++++++++++++++++ server/gameserver/human.h | 1 + server/gameserver/player.cc | 4 ++ 3 files changed, 83 insertions(+) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 94a6e05..ffcbe2b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3507,3 +3507,81 @@ void Human::UpdateViewObjects() } } } + +void Human::GMAddItem(int item_id, int item_num) +{ + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquip(item_id); + if (!item_meta) { + return; + } + if (item_meta->i->_inventory_slot() >= 0 && + item_meta->i->_inventory_slot() < IS_END) { + if (GetInventory(item_meta->i->_inventory_slot()) >= + GetVolume(item_meta->i->_inventory_slot()) + ) { + /* + cs::SMPickup notifymsg; + notifymsg.set_error_code(1); + SendNotifyMsg(notifymsg); + */ + return; + } + int add_num = GetVolume(item_meta->i->_inventory_slot()) - + GetInventory(item_meta->i->_inventory_slot()); + add_num = std::min(item_num, add_num); + + AddInventory(item_meta->i->_inventory_slot(), add_num); + switch (item_meta->i->_inventory_slot()) { + case IS_FRAG: + case IS_SMOKE: + { + Weapon* weapon = &weapons[SPEC1_SLOT_BEGIN + + (item_meta->i->_inventory_slot() - SPEC1_IS_BEGIN) + ]; + weapon->weapon_id = item_id; + weapon->weapon_lv = 1; + weapon->ammo += item_num; + weapon->meta = item_meta; + weapon->Recalc(); + DecInventory(item_meta->i->_inventory_slot(), add_num); + } + break; + case IS_1XSCOPE: + case IS_2XSCOPE: + case IS_4XSCOPE: + case IS_8XSCOPE: + case IS_15XSCOPE: + { + if (item_meta->i->_inventory_slot() - IS_1XSCOPE > curr_scope_idx) { + curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE; + } + } + break; + case IS_POSION_GAS_BOMB: + case IS_MOLOTOR_COCKTAIL: + case IS_TRAP: + case IS_MINE: + { + Weapon* weapon = &weapons[SPEC2_SLOT_BEGIN + + (item_meta->i->_inventory_slot() - SPEC2_IS_BEGIN) + ]; + weapon->weapon_id = item_id; + weapon->weapon_lv = 1; + weapon->ammo += item_num; + weapon->meta = item_meta; + weapon->Recalc(); + DecInventory(item_meta->i->_inventory_slot(), add_num); + } + break; + default: + { +#if 0 + abort(); +#endif + } + break; + } + } + need_sync_active_player = true; + SyncAroundPlayers(__FILE__, __LINE__, __func__); +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index a503262..f548941 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -245,6 +245,7 @@ class Human : public Creature void DeadDrop(); virtual std::string GetName() override { return name;}; void UpdateViewObjects(); + void GMAddItem(int item_id, int item_num); protected: void _InternalUpdateMove(float speed); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 0a71baf..96d4948 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1102,6 +1102,10 @@ void Player::_CMExecCommand(f8::MsgHdr& hdr, const cs::CMExecCommand& msg) std::string cmd = cmds[0]; if (cmd == "gps") { SendDebugMsg(a8::Format("%d %d", {GetPos().x, GetPos().y})); + }else if (cmd == "additem" && cmds.size() >= 2) { + int item_id = a8::XValue(cmds[1]); + int item_num = a8::XValue(cmds[2]); + GMAddItem(item_id, item_num); } }