EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Sentry.cpp
Go to the documentation of this file.
1 
9 #include "eve-server.h"
10 
11 #include "Client.h"
12 #include "EntityList.h"
13 #include "EVEServerConfig.h"
14 #include "StaticDataMgr.h"
15 #include "npc/Sentry.h"
16 #include "npc/SentryAI.h"
17 #include "system/Container.h"
18 #include "system/Damage.h"
19 #include "system/SystemBubble.h"
20 #include "system/SystemManager.h"
22 
23 
25 : ObjectSystemEntity(self, services, system)
26 {
27  m_allyID = data.allianceID;
28  m_warID = data.factionID;
29  m_corpID = data.corporationID;
30  m_ownerID = data.ownerID;
31  m_AI = new SentryAI(this);
32 
33  // Create default dynamic attributes in the AttributeMap:
37  m_self->SetAttribute(AttrMass, m_self->type().mass(), false);
43 
44  SetResists();
45 
46  /* Gets the value from the Sentry and put on our own vars */
55 
56  // _log(Sentry__TRACE, "Created Sentry object for %s (%u)", m_self.get()->name(), m_self.get()->itemID());
57 }
58 
62 }
63 
65  if (m_killed)
66  return;
67  double profileStartTime = GetTimeUSeconds();
68 
69  /* Enable base call to Process Targeting and Movement */
71  m_AI->Process();
72 
73  if (sConfig.debug.UseProfiling)
74  sProfiler.AddTime(Profile::npc, GetTimeUSeconds() - profileStartTime);
75 }
76 
78  m_AI->TargetLost(who);
79 }
80 
82  m_AI->Targeted(who);
83 }
84 
86 {
87  using namespace Destiny;
88 
89  BallHeader head = BallHeader();
90  head.entityID = GetID();
91  head.mode = Ball::Mode::STOP;
92  head.radius = GetRadius();
93  head.posX = x();
94  head.posY = y();
95  head.posZ = z();
97  into.Append( head );
98  MassSector mass = MassSector();
99  mass.mass = m_self->type().mass();
100  mass.cloak = 0;
101  mass.harmonic = m_harmonic;
102  mass.corporationID = m_corpID;
103  mass.allianceID = (IsAlliance(m_allyID) ? m_allyID : -1);
104  into.Append( mass );
106  main.formationID = 0xFF;
107  into.Append( main );
108 
109  _log(SE__DESTINY, "Sentry::EncodeDestiny: %s - id:%li, mode:%u, flags:0x%X", GetName(), head.entityID, head.mode, head.flags);
110 }
111 
113 {
114  m_self->SaveItem();
115 }
116 
118 {
119  //this is called from SystemManager::RemoveSentry() which calls other SE* methods as needed
120  m_self->Delete();
121 }
122 
124  /* fix for missing resist attribs -allan 18April16 */
137 }
138 
139 void Sentry::Killed(Damage &fatal_blow) {
140  if ((m_bubble == nullptr) or (m_destiny == nullptr) or (m_system == nullptr))
141  return; // make error here?
142 
143  uint32 killerID = 0;
144  Client* pClient(nullptr);
145  SystemEntity* killer = fatal_blow.srcSE;
146 
147  if (killer->HasPilot()) {
148  pClient = killer->GetPilot();
149  killerID = pClient->GetCharacterID();
150  } else if (killer->IsDroneSE()) {
151  pClient = sEntityList.FindClientByCharID( killer->GetSelf()->ownerID() );
152  if (pClient == nullptr) {
153  sLog.Error("Sentry::Killed()", "killer == IsDrone and pPlayer == nullptr");
154  } else {
155  killerID = pClient->GetCharacterID();
156  }
157  } else {
158  killerID = killer->GetID();
159  }
160 
161  uint32 locationID = GetLocationID();
162  // log faction kill in dynamic data -allan
163  MapDB::AddKill(locationID);
164  MapDB::AddFactionKill(locationID);
165  if (pClient != nullptr) {
166  //award kill bounty.
167  //AwardBounty( pClient );
169  AwardSecurityStatus(m_self, pClient->GetChar().get()); // this awards secStatusChange for npcs in empire space
170  }
171 
172  GPoint wreckPosition = m_destiny->GetPosition();
173  if (wreckPosition.isNaN()) {
174  sLog.Error("Sentry::Killed()", "Wreck Position is NaN");
175  return;
176  }
177  uint32 wreckTypeID = sDataMgr.GetWreckID(m_self->typeID());
178  if (!IsWreckTypeID(wreckTypeID)) {
179  sLog.Error("Sentry::Killed()", "Could not get wreckType for %s of type %u", m_self->name(), m_self->typeID());
180  // default to generic frigate wreck till i get better checks and/or complete wreck data
181  wreckTypeID = 26557;
182  }
183 
184  std::string wreck_name = m_self->itemName();
185  wreck_name += " Wreck";
186  ItemData wreckItemData(wreckTypeID, killerID, locationID, flagNone, wreck_name.c_str(), wreckPosition, itoa(m_allyID));
187  WreckContainerRef wreckItemRef = sItemFactory.SpawnWreckContainer( wreckItemData );
188  if (wreckItemRef.get() == nullptr) {
189  sLog.Error("Sentry::Killed()", "Creating Wreck Item Failed for %s of type %u", wreck_name.c_str(), wreckTypeID);
190  return;
191  }
192 
193  if (is_log_enabled(PHYSICS__TRACE))
194  _log(PHYSICS__TRACE, "Sentry::Killed() - Sentry %s(%u) Position: %.2f,%.2f,%.2f. Wreck %s(%u) Position: %.2f,%.2f,%.2f.", \
195  GetName(), GetID(), x(), y(), z(), wreckItemRef->name(), wreckItemRef->itemID(), wreckPosition.x, wreckPosition.y, wreckPosition.z);
196 
198  wreckEntity.allianceID = killer->GetAllianceID();
200  wreckEntity.corporationID = killer->GetCorporationID();
201  wreckEntity.factionID = m_warID;
202  wreckEntity.groupID = EVEDB::invGroups::Wreck;
203  wreckEntity.itemID = wreckItemRef->itemID();
204  wreckEntity.itemName = wreck_name;
205  wreckEntity.ownerID = killerID;
206  wreckEntity.typeID = wreckTypeID;
207  wreckEntity.position = wreckPosition;
208 
209  if (!m_system->BuildDynamicEntity(wreckEntity, m_self->itemID())) {
210  sLog.Error("Sentry::Killed()", "Spawning Wreck Failed: typeID or typeName not supported: '%u'", wreckTypeID);
211  wreckItemRef->Delete();
212  return;
213  }
215 
216  if (MakeRandomFloat() < sConfig.npc.LootDropChance)
217  DropLoot(wreckItemRef, m_self->groupID(), killerID);
218 }
void Append(const T &value)
Appends a single value to buffer.
Definition: Buffer.h:437
#define sConfig
A macro for easier access to the singleton.
virtual void Process()
float m_kinDamage
Definition: Sentry.h:59
float m_shieldCapacity
Definition: Sentry.h:64
#define _log(type, fmt,...)
Definition: logsys.h:124
void TargetLost(SystemEntity *by_who)
Definition: SentryAI.cpp:258
#define IsWreckTypeID(typeID)
Definition: EVE_Defines.h:203
DestinyManager * m_destiny
Definition: SystemEntity.h:265
double GetRadius()
Definition: SystemEntity.h:208
uint32 m_ownerID
Definition: SystemEntity.h:283
bool HasAttribute(const uint16 attrID) const
uint32 ownerID() const
Definition: InventoryItem.h:99
void SaveSentry()
Definition: Sentry.cpp:112
virtual void Killed(Damage &fatal_blow)
Definition: Sentry.cpp:139
void SendJettisonPacket() const
virtual void EncodeDestiny(Buffer &into)
Definition: Sentry.cpp:85
double MakeRandomFloat(double low, double high)
Generates random real from interval [low; high].
Definition: misc.cpp:114
double y()
Definition: SystemEntity.h:214
virtual bool HasPilot()
Definition: SystemEntity.h:258
GaExpInl bool isNaN() const
Definition: GaTypes.h:194
#define sProfiler
Definition: dbcore.cpp:39
static void AddKill(uint32 sysID)
Definition: MapDB.cpp:250
virtual Client * GetPilot()
Definition: SystemEntity.h:259
SystemBubble * m_bubble
Definition: SystemEntity.h:262
int32 GetCharacterID() const
Definition: Client.h:113
virtual void Process()
Definition: Sentry.cpp:64
static void AddFactionKill(uint32 sysID)
Definition: MapDB.cpp:256
SystemEntity * srcSE
Definition: Damage.h:84
#define sEntityList
Definition: EntityList.h:208
const float GetSystemSecurityRating()
Definition: SystemManager.h:86
const char * name()
CharacterRef GetChar() const
Definition: Client.h:164
GaFloat x
Definition: GaTypes.h:207
bool BuildDynamicEntity(const DBSystemDynamicEntity &entity, uint32 launcherID=0)
int32 m_harmonic
Definition: SystemEntity.h:276
float m_hullDamage
Definition: Sentry.h:61
float capacity() const
Definition: ItemType.h:71
virtual void TargetLost(SystemEntity *who)
Definition: Sentry.cpp:77
EvilNumber EvilZero
Definition: EvilNumber.cpp:32
void SafeDelete(T *&p)
Deletes and nullifies a pointer.
Definition: SafeMem.h:83
uint16 groupID() const
const ItemType & type() const
#define is_log_enabled(type)
Definition: logsys.h:78
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
Definition: gpoint.h:33
float m_shieldCharge
Definition: Sentry.h:63
InventoryItemRef m_self
Definition: SystemEntity.h:269
double GetTimeUSeconds()
Definition: utils_time.cpp:116
Generic class for buffers.
Definition: Buffer.h:40
InventoryItemRef GetSelf()
Definition: SystemEntity.h:202
virtual ~Sentry()
Definition: Sentry.cpp:59
uint32 m_corpID
Definition: SystemEntity.h:281
uint32 GetLocationID()
Definition: SystemEntity.h:209
void RemoveSentry()
Definition: Sentry.cpp:117
Definition: Damage.h:33
float mass() const
Definition: ItemType.h:69
void SetResists()
Definition: Sentry.cpp:123
SystemManager * m_system
Definition: SystemEntity.h:263
double z()
Definition: SystemEntity.h:215
int32 GetAllianceID()
Definition: SystemEntity.h:216
void SetAttribute(uint16 attrID, int num, bool notify=true)
uint32 GetID()
Definition: SystemEntity.h:207
X * get() const
Definition: RefPtr.h:213
float m_emDamage
Definition: Sentry.h:57
const char * GetName() const
Definition: SystemEntity.h:210
double x()
Definition: SystemEntity.h:213
Definition: Client.h:66
unsigned __int32 uint32
Definition: eve-compat.h:50
Sentry(InventoryItemRef self, PyServiceMgr &services, SystemManager *system, const FactionData &data)
Definition: Sentry.cpp:24
uint32 corporationID
GaFloat y
Definition: GaTypes.h:207
uint32 GetCorporationID()
Definition: SystemEntity.h:218
const std::string & itemName() const
int main(int argc, char *argv[])
void Process()
Definition: SentryAI.cpp:83
void DropLoot(WreckContainerRef wreckRef, uint32 groupID, uint32 owner)
EvilNumber GetAttribute(const uint16 attrID) const
void AwardSecurityStatus(InventoryItemRef iRef, Character *pChar)
const GPoint & GetPosition() const
float radius() const
Definition: ItemType.h:68
float volume() const
Definition: ItemType.h:70
virtual void Delete()
#define sItemFactory
Definition: ItemFactory.h:165
EvilNumber EvilOne
Definition: EvilNumber.cpp:34
#define IsAlliance(itemID)
Definition: EVE_Defines.h:244
float get_float()
Definition: EvilNumber.cpp:184
virtual void TargetedAdd(SystemEntity *who)
Definition: Sentry.cpp:81
float m_therDamage
Definition: Sentry.h:60
virtual bool IsDroneSE()
Definition: SystemEntity.h:187
float m_armorDamage
Definition: Sentry.h:62
uint16 typeID() const
float m_expDamage
Definition: Sentry.h:58
void Targeted(SystemEntity *by_who)
Definition: SentryAI.cpp:229
GaFloat z
Definition: GaTypes.h:207
const char * itoa(int64 num)
Convers num to string.
uint32 itemID() const
Definition: InventoryItem.h:98
SentryAI * m_AI
Definition: Sentry.h:54
#define sDataMgr