EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Asteroid.cpp
Go to the documentation of this file.
1 /*
2  * Asteroid.cpp
3  *
4  * asteroid item and entity classes for EVEmu
5  *
6  * Original file/code by Zhur
7  * Rewrite: Allan
8  */
9 
10 
11 #include "eve-server.h"
12 
13 #include "EVEServerConfig.h"
14 #include "system/DestinyManager.h"
15 #include "system/Asteroid.h"
16 #include "system/SystemManager.h"
18 #include "system/SystemBubble.h"
19 
20 
21 AsteroidItem::AsteroidItem(const ItemType& type, const ItemData& idata, const AsteroidData& adata)
22 : InventoryItem(adata.itemID, type, idata),
23 m_data(adata)
24 {
25  _log(ITEM__TRACE, "Created AsteroidItem for %s(%u).", adata.itemName.c_str(), adata.itemID);
26 }
27 
29 {
30  return InventoryItem::Load<AsteroidItem>(asteroidID );
31 }
32 
34  const ItemType *type = sItemFactory.GetType(adata.typeID);
35  if (type == nullptr)
36  return AsteroidItemRef(nullptr);
37 
38  idata.name = type->name();
39  adata.itemName = type->name();
40 
41  ManagerDB::CreateRoidItemID(idata, adata);
42  if (adata.itemID == 0)
43  return AsteroidItemRef(nullptr);
44 
45  AsteroidItemRef roidRef = AsteroidItemRef(new AsteroidItem(*type, idata, adata));
46  roidRef->SetAttribute(AttrRadius, adata.radius);
47  roidRef->SetAttribute(AttrQuantity, adata.quantity);
48  roidRef->SetAttribute(AttrVolume, type->volume());
49  roidRef->SetAttribute(AttrMass, type->mass() * adata.quantity);
50 
51  return roidRef;
52 }
53 
55  const ItemType *type = sItemFactory.GetType(adata.typeID);
56  if (type == nullptr)
57  return AsteroidItemRef(nullptr);
58 
59  idata.name = type->name();
60  adata.itemName = type->name();
61  adata.itemID = sItemFactory.GetNextTempID();
62 
63  AsteroidItemRef roidRef = AsteroidItemRef(new AsteroidItem(*type, idata, adata));
64  roidRef->SetAttribute(AttrRadius, adata.radius);
65  roidRef->SetAttribute(AttrQuantity, adata.quantity);
66  roidRef->SetAttribute(AttrVolume, type->volume());
67  roidRef->SetAttribute(AttrMass, type->mass() * adata.quantity);
68 
69  return roidRef;
70 }
71 
72 //iRef = InventoryItem::SpawnItem(sItemFactory.GetNextTempID(), iData);
73 
75 : ObjectSystemEntity(self, services, system),
76 m_growTimer(sConfig.cosmic.BeltGrowth *60 *60 *1000) // hours->ms
77 {
79 }
80 
82  /* called by EntityList::Process on every loop */
83  /* Enable base call to Process Targeting and Movement */
85 
86  if (m_growTimer.Check())
88  Grow();
89 }
90 
92 {
93  using namespace Destiny;
94 
95  BallHeader head = BallHeader();
96  head.entityID = GetID();
97  head.mode = Ball::Mode::RIGID;
98  head.radius = GetRadius();
99  head.posX = x();
100  head.posY = y();
101  head.posZ = z();
102  head.flags = 0;
103  into.Append( head );
105  main.formationID = 0xFF;
106  into.Append( main );
107 
108  _log(SE__DESTINY, "AsteroidSE::EncodeDestiny(): %s - id:%li, mode:%u, flags:0x%X", GetName(), head.entityID, head.mode, head.flags);
109 }
110 
111 void AsteroidSE::MakeDamageState(DoDestinyDamageState &into) {
112  into.shield = 1.0;
113  into.recharge = 30000;
114  into.timestamp = GetFileTimeNow();
115  into.armor = 1.0;
116  into.structure = 1.0;
117 }
118 
120  /* not real sure how to implement this
121  * maybe use internal data structure to hold sizes (current, possible) and time interval
122  * use this to check/update current sizes (radius and mass)
123  *
124  * currently sets quantity back to full and disables m_growTimer
125  * - not gonna work...radius is set to quantity AFTER being mined...
126  */
127 
128  //double quantity = ((25000 * log(GetRadius())) - 112404.8);
129  //m_self->SetAttribute(AttrQuantity, quantity); // quantity in m^3
130 
132 }
133 
135 {
136  _log(SPAWN__DEPOP, "AsteroidSE::Delete() - Removing asteroid %s(%u) from beltID %u", \
137  m_self->name(), m_self->itemID(), m_beltID);
140 }
141 
142 /*
143  * def ComputeRadiusFromQuantity(categoryID, groupID, typeID, quantity):
144  * if quantity < 0:
145  * quantity = 1
146  * if categoryID == const.categoryAsteroid:
147  * qty = quantity
148  * if qty > 130000:
149  * qty = 130000
150  * return 89.675 * math.exp(4e-05 * qty)
151  * if groupID == const.groupHarvestableCloud:
152  * return quantity * cfg.invtypes.Get(typeID).radius / 10.0
153  * return quantity * cfg.invtypes.Get(typeID).radius
154  *
155  *
156  * def ComputeQuantityFromRadius(categoryID, groupID, typeID, radius):
157  * if categoryID == const.categoryAsteroid:
158  * quantity = math.log(radius / 89.675) * (1.0 / 4e-05)
159  * return quantity
160  * if groupID == const.groupHarvestableCloud:
161  * quantity = radius * 10.0 / cfg.invtypes.Get(typeID).radius
162  * return quantity
163  * return radius / cfg.invtypes.Get(typeID).radius
164  */
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()
#define _log(type, fmt,...)
Definition: logsys.h:124
void Disable()
Definition: timer.h:39
static AsteroidItemRef Spawn(ItemData &idata, AsteroidData &adata)
Definition: Asteroid.cpp:33
double GetRadius()
Definition: SystemEntity.h:208
RefPtr< AsteroidItem > AsteroidItemRef
Definition: ItemRef.h:46
Timer m_growTimer
Definition: Asteroid.h:108
double y()
Definition: SystemEntity.h:214
SystemBubble * m_bubble
Definition: SystemEntity.h:262
BeltMgr * m_beltMgr
Definition: Asteroid.h:107
const char * name()
bool IsActive(uint16 bubbleID)
Definition: BeltMgr.cpp:105
virtual void EncodeDestiny(Buffer &into)
Definition: Asteroid.cpp:91
AsteroidItem(const ItemType &type, const ItemData &idata, const AsteroidData &adata)
Definition: Asteroid.cpp:21
virtual void Delete()
AsteroidSE(InventoryItemRef self, PyServiceMgr &services, SystemManager *system)
Definition: Asteroid.cpp:74
const ItemType & type() const
InventoryItemRef m_self
Definition: SystemEntity.h:269
Generic class for buffers.
Definition: Buffer.h:40
PyTuple * MakeDamageState()
uint16 GetID()
Definition: SystemBubble.h:91
static void CreateRoidItemID(ItemData &idata, AsteroidData &adata)
Definition: ManagerDB.cpp:468
float mass() const
Definition: ItemType.h:69
BeltMgr * GetBeltMgr()
SystemManager * m_system
Definition: SystemEntity.h:263
double z()
Definition: SystemEntity.h:215
virtual void Process()
Definition: Asteroid.cpp:81
uint32 GetID()
Definition: SystemEntity.h:207
virtual void Delete()
Definition: Asteroid.cpp:134
bool Check(bool reset=true)
Definition: timer.cpp:62
const char * GetName() const
Definition: SystemEntity.h:210
const std::string & name() const
Definition: ItemType.h:74
double x()
Definition: SystemEntity.h:213
unsigned __int32 uint32
Definition: eve-compat.h:50
static AsteroidItemRef SpawnTemp(ItemData &idata, AsteroidData &adata)
Definition: Asteroid.cpp:54
static AsteroidItemRef Load(uint32 asteroidID)
Definition: Asteroid.cpp:28
void RemoveAsteroid(uint32 beltID, AsteroidSE *pASE)
Definition: BeltMgr.cpp:424
double GetFileTimeNow()
Definition: utils_time.cpp:84
void Grow()
Definition: Asteroid.cpp:119
int main(int argc, char *argv[])
typeID Spawn an NPC with the specified type text Search for items matching the specified query() type()() itemID() copy() materialLevel()() itemID(attributeID)-Retrieves attribute value." ) COMMAND( setattr
uint32 m_beltID
Definition: Asteroid.h:109
float volume() const
Definition: ItemType.h:70
#define sItemFactory
Definition: ItemFactory.h:165
std::string itemName
std::string name
Definition: ItemType.h:193
uint32 itemID() const
Definition: InventoryItem.h:98
Reference-counting-based smart pointer.
Definition: RefPtr.h:133