diff --git a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h index fd2f476e..b6d849cd 100644 --- a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h +++ b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_member_visitor.h @@ -203,4 +203,5 @@ template<> inline bool MasterAgent::_Execute_Method_RegisterMethod(502968959u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorRemove()); // HeroAgent - meta = BEHAVIAC_NEW AgentMeta(2694193342u); + meta = BEHAVIAC_NEW AgentMeta(3645053199u); AgentMeta::GetAgentMetas()[2270112014u] = meta; meta->RegisterMemberProperty(2706111800u, BEHAVIAC_NEW CMemberProperty< TargetAgent* >("current_target_agent", Set_HeroAgent_current_target_agent, Get_HeroAgent_current_target_agent)); - meta->RegisterMemberProperty(3525744799u, BEHAVIAC_NEW CMemberProperty< HeroAgent* >("current_teammate_agent", Set_HeroAgent_current_teammate_agent, Get_HeroAgent_current_teammate_agent)); + meta->RegisterMemberProperty(3525744799u, BEHAVIAC_NEW CMemberProperty< TeammateAgent* >("current_teammate_agent", Set_HeroAgent_current_teammate_agent, Get_HeroAgent_current_teammate_agent)); meta->RegisterMemberProperty(1530109714u, BEHAVIAC_NEW CMemberProperty< MasterAgent* >("master_agent", Set_HeroAgent_master_agent, Get_HeroAgent_master_agent)); meta->RegisterMemberProperty(3100058733u, BEHAVIAC_NEW CMemberProperty< int >("out_errno", Set_HeroAgent_out_errno, Get_HeroAgent_out_errno)); meta->RegisterMemberProperty(1342699083u, BEHAVIAC_NEW CMemberProperty< glm::vec3 >("out_point0", Set_HeroAgent_out_point0, Get_HeroAgent_out_point0)); @@ -912,10 +912,10 @@ namespace behaviac meta->RegisterMethod(502968959u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorRemove()); // AndroidAgent - meta = BEHAVIAC_NEW AgentMeta(2904935783u); + meta = BEHAVIAC_NEW AgentMeta(949660135u); AgentMeta::GetAgentMetas()[2475098143u] = meta; meta->RegisterMemberProperty(2706111800u, BEHAVIAC_NEW CMemberProperty< TargetAgent* >("current_target_agent", Set_HeroAgent_current_target_agent, Get_HeroAgent_current_target_agent)); - meta->RegisterMemberProperty(3525744799u, BEHAVIAC_NEW CMemberProperty< HeroAgent* >("current_teammate_agent", Set_HeroAgent_current_teammate_agent, Get_HeroAgent_current_teammate_agent)); + meta->RegisterMemberProperty(3525744799u, BEHAVIAC_NEW CMemberProperty< TeammateAgent* >("current_teammate_agent", Set_HeroAgent_current_teammate_agent, Get_HeroAgent_current_teammate_agent)); meta->RegisterMemberProperty(1530109714u, BEHAVIAC_NEW CMemberProperty< MasterAgent* >("master_agent", Set_HeroAgent_master_agent, Get_HeroAgent_master_agent)); meta->RegisterMemberProperty(3100058733u, BEHAVIAC_NEW CMemberProperty< int >("out_errno", Set_HeroAgent_out_errno, Get_HeroAgent_out_errno)); meta->RegisterMemberProperty(1342699083u, BEHAVIAC_NEW CMemberProperty< glm::vec3 >("out_point0", Set_HeroAgent_out_point0, Get_HeroAgent_out_point0)); @@ -1101,6 +1101,16 @@ namespace behaviac meta->RegisterMethod(3483755530u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorContains()); meta->RegisterMethod(505785840u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorLength()); meta->RegisterMethod(502968959u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorRemove()); + + // TeammateAgent + meta = BEHAVIAC_NEW AgentMeta(1714058232u); + AgentMeta::GetAgentMetas()[559474020u] = meta; + meta->RegisterMethod(1045109914u, BEHAVIAC_NEW CAgentStaticMethodVoid_1(FunctionPointer_TeammateAgent_LogMessage)); + meta->RegisterMethod(2521019022u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorAdd()); + meta->RegisterMethod(2306090221u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorClear()); + meta->RegisterMethod(3483755530u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorContains()); + meta->RegisterMethod(505785840u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorLength()); + meta->RegisterMethod(502968959u, BEHAVIAC_NEW CMethod_behaviac_Agent_VectorRemove()); AgentMeta::Register("behaviac::Agent"); AgentMeta::Register("BaseAgent"); @@ -1110,6 +1120,7 @@ namespace behaviac AgentMeta::Register("HeroAgent"); AgentMeta::Register("AndroidAgent"); AgentMeta::Register("MasterAgent"); + AgentMeta::Register("TeammateAgent"); AgentMeta::Register("SkillIdx_e"); AgentMeta::Register("BuffEffectType_e"); AgentMeta::Register("BtEvent_e"); @@ -1131,6 +1142,7 @@ namespace behaviac AgentMeta::UnRegister("HeroAgent"); AgentMeta::UnRegister("AndroidAgent"); AgentMeta::UnRegister("MasterAgent"); + AgentMeta::UnRegister("TeammateAgent"); AgentMeta::UnRegister("SkillIdx_e"); AgentMeta::UnRegister("BuffEffectType_e"); AgentMeta::UnRegister("BtEvent_e"); diff --git a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h index 878483aa..877459db 100644 --- a/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h +++ b/server/bin/exported/behaviac_generated/types/internal/behaviac_agent_meta.h @@ -78,7 +78,7 @@ namespace behaviac inline void Set_HeroAgent_current_target_agent(Agent* self, TargetAgent* value) { ((HeroAgent*)self)->current_target_agent = value; }; inline const void* Get_HeroAgent_current_target_agent(Agent* self) { return &((HeroAgent*)self)->current_target_agent; }; - inline void Set_HeroAgent_current_teammate_agent(Agent* self, HeroAgent* value) { ((HeroAgent*)self)->current_teammate_agent = value; }; + inline void Set_HeroAgent_current_teammate_agent(Agent* self, TeammateAgent* value) { ((HeroAgent*)self)->current_teammate_agent = value; }; inline const void* Get_HeroAgent_current_teammate_agent(Agent* self) { return &((HeroAgent*)self)->current_teammate_agent; }; inline void Set_HeroAgent_master_agent(Agent* self, MasterAgent* value) { ((HeroAgent*)self)->master_agent = value; }; @@ -414,6 +414,7 @@ namespace behaviac inline int FunctionPointer_MasterAgent_RandRange(Agent* self, int min_val, int max_val) { return (int)((BaseAgent*)self)->_Execute_Method_(min_val, max_val); } inline float FunctionPointer_MasterAgent_RandRangeAsFloat(Agent* self, float min_val, float max_val) { return ((MasterAgent*)self)->RandRangeAsFloat(min_val, max_val); } inline int FunctionPointer_MasterAgent_Test(Agent* self, int p1) { return (int)((BaseAgent*)self)->_Execute_Method_(p1); } + inline void FunctionPointer_TeammateAgent_LogMessage(char* param0) { TeammateAgent::LogMessage(param0); } inline void Set_glm_vec3_x(Agent* self, float value) { ((glm::vec3*)self)->x = value; }; inline const void* Get_glm_vec3_x(Agent* self) { return &((glm::vec3*)self)->x; }; diff --git a/server/bin/exported/behaviac_generated/types/internal/behaviac_headers.h b/server/bin/exported/behaviac_generated/types/internal/behaviac_headers.h index ee5abdee..c8203bbc 100644 --- a/server/bin/exported/behaviac_generated/types/internal/behaviac_headers.h +++ b/server/bin/exported/behaviac_generated/types/internal/behaviac_headers.h @@ -13,6 +13,7 @@ #include "room_agent.h" #include "target_agent.h" #include "team_agent.h" +#include "teammate_agent.h" #include "master_agent.h" #include "behaviac_customized_types.h" diff --git a/server/bin/exported/meta/counterfire.meta.xml b/server/bin/exported/meta/counterfire.meta.xml index 458a77e7..ebe3443d 100644 --- a/server/bin/exported/meta/counterfire.meta.xml +++ b/server/bin/exported/meta/counterfire.meta.xml @@ -1,10 +1,10 @@ - - + + - + @@ -32,10 +32,10 @@ - + - + diff --git a/server/gameserver/hero_agent.cc b/server/gameserver/hero_agent.cc index 7d931611..24a1cec5 100644 --- a/server/gameserver/hero_agent.cc +++ b/server/gameserver/hero_agent.cc @@ -1551,6 +1551,37 @@ behaviac::EBTStatus HeroAgent::ThrowItem(int slot) bool HeroAgent::SearchTeammate(int range) { + if (!owner_->IsHuman()) { + return false; + } + current_teammate_agent = nullptr; + Human* nearest_teammate = nullptr; + owner_->GetTeam()->TraverseMembers + ( + [this, &nearest_teammate] (Human* hum) mutable + { + if (hum == owner_) { + return true; + } + if (hum->dead) { + return true; + } + if (!nearest_teammate) { + nearest_teammate = hum; + return true; + } + if (hum->GetPos().ManhattanDistance2D(owner_->GetPos()) < + nearest_teammate->GetPos().ManhattanDistance2D(owner_->GetPos())) { + nearest_teammate = hum; + return true; + } + return true; + }); + if (nearest_teammate) { + float distance = nearest_teammate->GetPos().Distance2D2(owner_->GetPos()); + if (distance <= range) { + } + } return false; } @@ -1568,3 +1599,35 @@ bool HeroAgent::TeammateIsValid() { return false; } + +void HeroAgent::GetDown() +{ + if (owner_->IsHuman()) { + owner_->AsHuman()->DoGetDown(); + } +} + +void HeroAgent::SwitchSeat(int seat) +{ + +} + +bool HeroAgent::CarHasOil() +{ + +} + +float HeroAgent::GetCarCurOil() +{ + +} + +float HeroAgent::GetCarMaxOil() +{ + +} + +bool HeroAgent::IsSingleCar() +{ + +} diff --git a/server/gameserver/hero_agent.h b/server/gameserver/hero_agent.h index bedf528d..3f6711ee 100644 --- a/server/gameserver/hero_agent.h +++ b/server/gameserver/hero_agent.h @@ -16,6 +16,7 @@ class RoomAgent; class TeamAgent; class TargetAgent; class MasterAgent; +class TeammateAgent; class HeroAgent : public BaseAgent { public: @@ -96,6 +97,12 @@ public: float GetTeammateDistance(); void AbandonTeammate(int min_time, int max_time); bool TeammateIsValid(); + void GetDown(); + void SwitchSeat(int seat); + bool CarHasOil(); + float GetCarCurOil(); + float GetCarMaxOil(); + bool IsSingleCar(); behaviac::EBTStatus RegisterEvents(behaviac::vector events); behaviac::EBTStatus ClearEvents(); @@ -127,7 +134,7 @@ public: TeamAgent* team_agent = nullptr; MasterAgent* master_agent = nullptr; TargetAgent* current_target_agent = nullptr; - HeroAgent* current_teammate_agent = nullptr; + TeammateAgent* current_teammate_agent = nullptr; float task_param0 = 0.0f; float task_param1 = 0.0f; float task_param2 = 0.0f; diff --git a/server/gameserver/teammate_agent.cc b/server/gameserver/teammate_agent.cc new file mode 100644 index 00000000..1272d448 --- /dev/null +++ b/server/gameserver/teammate_agent.cc @@ -0,0 +1,122 @@ +#include "precompile.h" + +#include "teammate_agent.h" +#include "room.h" + +#include "mt/Hero.h" +#include "mt/Equip.h" + +TeammateAgent::TeammateAgent():BaseAgent() +{ + +} + +TeammateAgent::~TeammateAgent() +{ +} + +int TeammateAgent::GetUniId() +{ + if (target_.Get()) { + return target_.Get()->GetUniId(); + } + return 0; +} + +bool TeammateAgent::IsValid() +{ + return target_.Get() && !target_.Get()->dead && target_.Get()->team_id != owner_->team_id; +} + +bool TeammateAgent::IsDead() +{ + if (target_.Get()) { + return target_.Get()->dead; + } + return true; +} + +glm::vec3 TeammateAgent::GetPos() +{ + return target_.Get()->GetPos().ToGlmVec3(); +} + +float TeammateAgent::GetHp() +{ + if (!target_.Get()) { + abort(); + } + return target_.Get()->GetHP(); +} + +float TeammateAgent::GetMaxHp() +{ + if (!target_.Get()) { + abort(); + } + return target_.Get()->GetMaxHP(); +} + +int TeammateAgent::GetHeroId() +{ + if (!target_.Get()) { + abort(); + } + return target_.Get()->GetHeroMeta()->id(); +} + +int TeammateAgent::GetLevel() +{ + if (!target_.Get()) { + abort(); + } + return target_.Get()->level; +} + +void TeammateAgent::Abandon(int min_time, int max_time) +{ + int time = a8::RandEx(min_time, max_time); + if (target_.Get()) { + //owner_->DelIgnoreTeammate(target_.Get()->GetUniId()); + //owner_->AddIgnoreTeammate(target_.Get()->GetUniId(), time); + } + target_.Reset(); +} + +void TeammateAgent::SetOwner(Creature* owner) +{ + owner_ = owner; +} + +Room* TeammateAgent::GetRoom() +{ + return owner_->room; +} + +float TeammateAgent::GetShotRange() +{ + if (target_.Get() && target_.Get()->GetCurrWeapon()) { + return target_.Get()->GetCurrWeapon()->meta->range(); + } + return 0.0f; +} + +void TeammateAgent::SetTeammate(Creature* target) +{ + target_ = target->GetWeakPtrRef(); +} + +void TeammateAgent::ClearAbandon() +{ + //owner_->ClearIgnoreTeammate(); +} + +float TeammateAgent::GetHPRate() +{ + return GetHp() / std::max(1.0f, GetMaxHp()); +} + +bool TeammateAgent::HasBuffEffect(int effect_id) +{ + return target_.Get() && target_.Get()->HasBuffEffect(effect_id); +} diff --git a/server/gameserver/teammate_agent.h b/server/gameserver/teammate_agent.h new file mode 100644 index 00000000..227ea379 --- /dev/null +++ b/server/gameserver/teammate_agent.h @@ -0,0 +1,37 @@ +#pragma once + +#include "base_agent.h" + +#include "creature.h" + +class TeammateAgent : public BaseAgent +{ +public: + TeammateAgent(); + + virtual ~TeammateAgent(); + + BEHAVIAC_DECLARE_AGENTTYPE(TeammateAgent, BaseAgent) + + int GetUniId(); + bool IsValid(); + bool IsDead(); + glm::vec3 GetPos(); + float GetHp(); + float GetMaxHp(); + int GetHeroId(); + int GetLevel(); + void Abandon(int min_time, int max_time); + float GetShotRange(); + void ClearAbandon(); + float GetHPRate(); + bool HasBuffEffect(int effect_id); + + void SetOwner(Creature* owner); + void SetTeammate(Creature* target); + virtual Room* GetRoom() override; + +private: + CreatureWeakPtr target_; + Creature* owner_ = nullptr; +};