EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
MiningLaser.cpp
Go to the documentation of this file.
1 
11 #include "eve-server.h"
12 
13 #include "PyServiceMgr.h"
14 #include "StaticDataMgr.h"
15 #include "StatisticMgr.h"
16 #include "character/Character.h"
17 #include "ship/Ship.h"
19 //#include "system/SystemBubble.h"
20 //#include "system/SystemManager.h"
22 
23 
25 : ActiveModule(mRef, sRef)
26 {
27  m_IsInitialCycle = true;
28  m_rMiner = m_dcMiner = m_iMiner = m_gMiner = false;
30 
32  m_rMiner = true;
33  } else if ((m_modRef->typeID() == 12108) or (m_modRef->typeID() == 18068) or (m_modRef->typeID() == 24305) or (m_modRef->typeID() == 28748)) {
34  m_dcMiner = true;
35  } else if ((m_modRef->typeID() == 16278) or (m_modRef->typeID() == 22229) or (m_modRef->typeID() == 22589) or (m_modRef->typeID() == 22591)
36  or (m_modRef->typeID() == 22597) or (m_modRef->typeID() == 22599) or (m_modRef->typeID() == 28752)) {
37  /* this includes 'dev testing modules' */
38  m_iMiner = true;
40  m_gMiner = true;
42  m_rMiner = true;
43  m_reloadTime = 8000; // this is not set in ActiveModule c'tor. easier/cheaper to set here.
45  m_rMiner = true;
46  }
47 
49  _log(MINING__TRACE, "MiningLaser Created for %s with %ums Duration.", mRef->name(), GetAttribute(AttrDuration).get_int());
50 }
51 
53 {
55 
56  if (m_chargeRef.get() == nullptr)
57  return;
58 
63  //AttrUsageDamagePercent
64 }
65 
67 {
68  _log(MODULE__TRACE, "%s calling ML::UnloadCharge()", m_modRef->name());
69  //AttrUnfitCapCost
70  m_crystalDmg = 0;
71  m_crystalRoidGrp = 0;
74 
76 }
77 
79 {
80  if (m_targetSE == nullptr){
81  _log(MINING__WARNING, "Activate() - Invalid target: m_targetSE == nullptr");
82  if (m_shipRef->HasPilot())
83  m_shipRef->GetPilot()->SendNotifyMsg("Module Activate: Invalid target - Ref: ServerError 15628");
84  return false;
85  }
86 
87  bool canActivate(false);
88  // verify module vs target for activation. disallow if not compatible. set special ore hold if applicable
89  if (m_rMiner) {
92  canActivate = true;
95  }
96  } else if (m_dcMiner) {
98  canActivate = true;
101  }
102  } else if (m_iMiner) {
104  canActivate = true;
107  }
108  } else if (m_gMiner) {
110  canActivate = true;
113  }
114  }
115 
116  if (canActivate) {
117  // so far, checks have passed and proper hold is set.
118  // check for capacity as final test before allowing mining (ship would know)
119 
120  // should we also test for target volume here? ...it's done on every ProcessCycle() call...
122  _log(MINING__WARNING, "Activate() - Cargo full. Denying Activate() on %s", m_targetSE->GetName());
123  if (m_shipRef->HasPilot())
124  m_shipRef->GetPilot()->SendNotifyMsg("Module Activate: Your Cargo is full. - Ref: ServerError 65125");
125 
126  return false;
127  }
128  }
129 
130  if (canActivate) {
131  m_IsInitialCycle = true;
133 
134  // mining on current target approved. check for and set crystal variables here
135  if (m_chargeLoaded and (m_chargeRef.get() != nullptr) and (m_crystalRoidGrp == 0)) {
140  }
141 
142  return ActiveModule::CanActivate();
143  } else {
144  _log(MINING__WARNING, "Activate() - Invalid target: %s", m_targetSE->GetName());
145  if (m_shipRef->HasPilot())
146  m_shipRef->GetPilot()->SendNotifyMsg("Module Activate: %s is an invalid target - Ref: ServerError 15628", m_targetSE->GetName());
147  }
148 
149  return false;
150 }
151 
153  /* ore is dumped into hold at end of module's cycle.
154  * however, code processing runs at beginning of cycle, so this needs to 'fake' the ore acquisition to the end of cycle
155  * we accomplish this by doing nothing on first cycle, and call the processing component at beginning of each cycle after that.
156  */
157  if (m_IsInitialCycle) {
158  m_IsInitialCycle = false;
159  } else {
160  ProcessCycle();
161  }
162 
163  return ActiveModule::DoCycle();
164 }
165 
166 void MiningLaser::DeactivateCycle(bool abort/*false*/)
167 {
169  return;
170 
172  ShowEffect(false, abort);
173 
174  ProcessCycle(abort);
176 
178  Clear();
179 }
180 
181 // note: gas cloud contains radius/10 units of gas.
183 void MiningLaser::ProcessCycle(bool abort/*false*/)
184 {
185  float cycleVol(GetMiningVolume());
186 
187  InventoryItemRef roidRef(m_targetSE->GetSelf());
188  // verify gas clouds have volume attr.
189  float oreVolume(roidRef->GetAttribute(AttrVolume).get_float());
190 
191  if ((cycleVol < oreVolume) or (cycleVol <= 0) or (oreVolume <= 0)) {
192  _log(MINING__ERROR, "%s(%u) - Mining Laser could not extract ore from %s(%u)", m_modRef->name(), m_modRef->itemID(), roidRef->name(), m_targetSE->GetID() );
193  m_shipRef->GetPilot()->SendNotifyMsg("Your %s deactivates because there was an error in it's processing. Ref: ServerError 06428.", m_modRef->name());
195  return;
196  }
197 
198  float oreAmount((cycleVol /oreVolume));
199  if (abort) {
200  // adjust amount AND cycle for partial cycle
201  float delta = 1 - (GetRemainingCycleTimeMS() / GetAttribute(AttrDuration).get_float());
202  cycleVol *= delta;
203  oreAmount *= delta;
204  if (m_iMiner or m_gMiner)
205  oreAmount = floor(oreAmount);
206  _log(MINING__DEBUG, "ProcessCycle(abort) - cycleVol:%.2f, oreAmount:%.2f, delta:%.5f", cycleVol, oreAmount, delta);
207  }
208 
209  float roidQuantity(roidRef->GetAttribute(AttrQuantity).get_float());
210  if (oreAmount > roidQuantity)
211  oreAmount = roidQuantity;
212 
213  float remainingCargoVolume(m_shipRef->GetRemainingVolumeByFlag(m_holdFlag));
214  if (remainingCargoVolume < cycleVol) {
215  // cargohold is full. this module will fill to available volume and trash the rest
216  if (remainingCargoVolume > oreVolume) {
217  oreAmount = remainingCargoVolume /oreVolume;
218  } else {
219  oreAmount = 0;
220  }
221  // check for other lasers running, and deactivate them also.
222  // the ship will tell all miners the current hold is full, and they automagically deactivate.
223  // this is a feature.
224  m_shipRef->CargoFull();
225 
226  // explicitly calling base class method here will negate the possibility of running a loop from DeactivateCycle override and overfilling cargo (elusive error)
228  if (!abort) // dont notify client if they deactivated laser
229  m_shipRef->GetPilot()->SendNotifyMsg("Your %s deactivates because your cargohold is full.", m_modRef->name());
230  }
231 
232  _log(MINING__DEBUG, "ProcessCycle(%s) - cycleVol:%.2f, roidQuantity:%.2f, remainingCargoVolume:%.2f/%.2f, oreAmount:%.2f", \
233  (abort?"true":"false"), cycleVol, roidQuantity, remainingCargoVolume, (remainingCargoVolume -cycleVol), oreAmount);
234 
235  if (oreAmount <= 0)
236  return;
237 
238  roidQuantity -= oreAmount;
239  _log(MINING__TRACE, "new roidQuantity %.3f", roidQuantity);
240 
241  if (roidQuantity > 0.0f) {
242  roidRef->SetAttribute(AttrQuantity, roidQuantity);
243  // do not reset ice radius (our huge-ass chunks will probably never expire)
244  if (!m_iMiner) {
245  /* reversing the radius-to-quantity formula, we get radius = exp((quantity + 112404.8) /25000) */
246  double radius = exp((roidQuantity + 112404.8) /25000);
247  // need to update players in bubble of this change. not sure how yet
248  roidRef->SetAttribute(AttrRadius, radius);
249  }
250  } else {
251  //rock is depleted.
252  // this will get all active miners on depleted rock and set mined amount accordingly for each.
253  m_targetSE->TargetMgr()->Depleted(this);
254  SystemEntity* pSE(m_targetSE);
256  // m_targetSE is null after above call returns
257  pSE->Delete();
258  SafeDelete(pSE);
259  return;
260  }
261 
262  // at this point, there is still plenty of ore in rock
263  ItemData idata(roidRef->typeID(), m_shipRef->ownerID(), locTemp, flagNone, oreAmount);
264  InventoryItemRef oRef(sItemFactory.SpawnItem(idata));
265  if (oRef.get() == nullptr) {
266  _log(MINING__ERROR, "Could not create mined ore for %s(%u)", m_shipRef->name(), m_shipRef->itemID() );
267  return;
268  }
269 
270  bool oreError(true);
272  oreError = false;
273  oRef->MergeTypesInCargo(m_shipRef.get(), m_holdFlag);
274  }
275 
276  // add data to StatisticMgr
277  sStatMgr.Add(Stat::oreMined, cycleVol);
278 
279  if (oreError and !abort) {
280  m_shipRef->GetPilot()->SendNotifyMsg("Your %s deactivates as it couldn't add the %s to your %s.", \
281  m_modRef->name(), oRef->name(), sDataMgr.GetFlagName(m_holdFlag));
282  _log(MINING__ERROR, "Could not add ore to hold for %s(%u)", m_shipRef->name(), m_shipRef->itemID() );
284  return;
285  }
286 
287  if (!m_chargeLoaded or (m_chargeRef.get() == nullptr))
288  return;
289 
290  if (MakeRandomFloat(0,1) < m_crystalDmgChance) {
292  if (m_crystalDmg > 0.99f) {
293  m_shipRef->GetPilot()->SendNotifyMsg("Your %s deactivates due to the destruction of it's %s.", \
294  m_modRef->name(), m_chargeRef->name());
295  InventoryItemRef chargeRef(m_chargeRef); // make a copy of charge's item ref, as m_chargeRef = NULL after next call returns
297  chargeRef->Delete();
298  } else {
300  }
301  }
302 }
303 
304 void MiningLaser::Depleted(std::multimap<float, MiningLaser*> &mMap) {
305  /* instead of calculations and timers from previous iteration, this method will determine how many modules are activated
306  * on newly-depleted rock, get total cycle volume, and then divide rock contents between modules, weighted by modules cycle volume.
307  */
308  // NOTE: this will be called for EACH active module on rock, with first timer to hit being the 'master' module.
309 
310  // determine % of remaining ore for each module active on this rock
311  float total = GetMiningVolume(), percent = 0.0f;
312  for (auto cur : mMap)
313  total += cur.first;
314 
317  InventoryItemRef roidRef(m_targetSE->GetSelf());
318  float oreVolume(roidRef->GetAttribute(AttrVolume).get_float());
319  if (oreVolume <= 0) {
320  _log(MINING__ERROR, "%s(%u) - Depleted() - oreVolume is <0 for %s(%u)", m_modRef->name(), m_modRef->itemID(), roidRef->name(), m_targetSE->GetID() );
321 
322  // send error and deactivate all active modules here
323  for (auto cur : mMap) {
324  cur.second->GetShipRef()->GetPilot()->SendNotifyMsg("Your %s deactivates because there was a processing error. Ref: ServerError 03123.", \
325  cur.second->GetSelf()->name());
326  cur.second->CancelOnError();
327  }
328  return;
329  }
330 
331  float roidQuantity(roidRef->GetAttribute(AttrQuantity).get_float());
332  double oreAmount(0);
333 
334  for (auto cur : mMap) {
335  if ((cur.first < oreVolume) or (cur.first < 0.1)) {
336  _log(MINING__ERROR, "%s(%u) - Depleted() - Mining Laser could not extract ore from %s(%u)", \
337  cur.second->GetSelf()->name(), cur.second->GetSelf()->itemID(), roidRef->name(), m_targetSE->GetID() );
338  cur.second->GetShipRef()->GetPilot()->SendNotifyMsg("Your %s deactivates because there was an error in it's processing. Ref: ServerError 06428.",\
339  cur.second->GetSelf()->name());
340  cur.second->CancelOnError();
341  continue;
342  }
343 
344  // calculate ore for this laser
345  percent = cur.first /total;
346  oreAmount = roidQuantity * percent;
347 
348  // create and add ore to cargo for this laser
349  cur.second->AddOreAndDeactivate(roidRef->typeID(), oreAmount);
350 
351  // inform pilot of asteroid depleted ...no clue if it actually works like this
352  PyTuple* tuple = new PyTuple(2);
353  tuple->SetItem(0, new PyString("MiningItemDepleted"));
354  PyDict* dict = new PyDict();
355  dict->SetItemString("modulename", new PyString(cur.second->GetSelf()->itemName()));
356  tuple->SetItem(1, dict);
357  cur.second->GetShipRef()->GetPilot()->QueueDestinyUpdate(&tuple);
358  }
359 
360  // calculate ore for this laser
361  percent = GetMiningVolume() /total;
362  // create and add ore to cargo for this laser
363  AddOreAndDeactivate(roidRef->typeID(), roidQuantity * percent, false);
364 }
365 
366 void MiningLaser::AddOreAndDeactivate(uint16 typeID, float amt, bool slave/*true*/) {
367 
368  ItemData idata(typeID, m_shipRef->ownerID(), locTemp, flagNone, amt);
369  InventoryItemRef oRef(sItemFactory.SpawnItem( idata ));
370  if (oRef.get() == nullptr) {
371  _log(MINING__ERROR, "AddOreAndDeactivate() - Could not create mined ore for %s(%u)", m_shipRef->name(), m_shipRef->itemID() );
372  return;
373  }
374 
375  if (!m_shipRef->AddItemByFlag(m_holdFlag, oRef))
376  _log(MINING__ERROR, "AddOreAndDeactivate() - Could not add ore to hold for %s(%u)", m_shipRef->name(), m_shipRef->itemID() );
377 
378  // send pilot msg about depletion for this module
379  m_shipRef->GetPilot()->SendNotifyMsg("Your %s deactivates; Its target has been depleted.", m_modRef->name());
380 
381  if (slave)
383 
384  // add data to StatisticMgr
385  sStatMgr.Add(Stat::oreMined, amt);
386 }
387 
389 {
390  float cycleVol(GetAttribute(AttrMiningAmount).get_float());
391  if (m_chargeLoaded)
394 
395  // fleet involvement enhances mining amount using MiningForeman of highest member (3%/lvl)
396  // this should apply to modules/ship when boost activated, but this is easier at this time.
397  // downside is client will have the original, lower cycle amount as this isnt set in module (but should be)
398  ShipSE* pShip(m_shipRef->GetPilot()->GetShipSE());
399  if (pShip != nullptr)
400  if (pShip->IsBoosted())
401  cycleVol *= (1 + (0.03f * pShip->GetMiningBoostAmount())); // 3% increase/level
402 
403  return cycleVol;
404 }
405 
406 
407 /*
408  * {'messageKey': 'MiningCrystalDestroyed', 'dataID': 17883202, 'suppressable': False, 'bodyID': 259420, 'messageType': 'notify', 'urlAudio': '', 'urlIcon': '', 'titleID': None, 'messageID': 1167}
409  * {'messageKey': 'MiningDronesDeactivatedAsteroidEmpty', 'dataID': 17883322, 'suppressable': False, 'bodyID': 259462, 'messageType': 'notify', 'urlAudio': 'wise:/msg_MiningDronesDeactivatedAsteroidEmpty_play', 'urlIcon': '', 'titleID': None, 'messageID': 1168}
410  * {'messageKey': 'MiningDronesDeactivatedCargoHoldFull', 'dataID': 17883265, 'suppressable': False, 'bodyID': 259442, 'messageType': 'notify', 'urlAudio': 'wise:/msg_MiningDronesDeactivatedCargoHoldFull_play', 'urlIcon': '', 'titleID': None, 'messageID': 1169}
411  * {'messageKey': 'MiningDronesDeactivatedCargoHoldNowFull', 'dataID': 17883243, 'suppressable': False, 'bodyID': 259434, 'messageType': 'notify', 'urlAudio': '', 'urlIcon': '', 'titleID': None, 'messageID': 1170}
412  * {'messageKey': 'MiningDronesDeactivatedOutOfRange', 'dataID': 17883208, 'suppressable': False, 'bodyID': 259422, 'messageType': 'notify', 'urlAudio': '', 'urlIcon': '', 'titleID': None, 'messageID': 1171}
413  * {'messageKey': 'MiningItemDepleted', 'dataID': 17879592, 'suppressable': False, 'bodyID': 258064, 'messageType': 'notify', 'urlAudio': '', 'urlIcon': '', 'titleID': None, 'messageID': 2312}
414  *
415  * {'FullPath': u'UI/Messages', 'messageID': 258064, 'label': u'MiningItemDepletedBody'}(u'{modulename} deactivates as its target has been depleted.', None, {u'{modulename}': {'conditionalValues': [], 'variableType': 10, 'propertyName': None, 'args': 0, 'kwargs': {}, 'variableName': 'modulename'}})
416  * {'FullPath': u'UI/Messages', 'messageID': 259420, 'label': u'MiningCrystalDestroyedBody'}(u'{[item]module.name} deactivates due to the destruction of the {[item]type.name} it was fitted with. \r\n', None, {u'{[item]type.name}': {'conditionalValues': [], 'variableType': 2, 'propertyName': 'name', 'args': 0, 'kwargs': {}, 'variableName': 'type'}, u'{[item]module.name}': {'conditionalValues': [], 'variableType': 2, 'propertyName': 'name', 'args': 0, 'kwargs': {}, 'variableName': 'module'}})
417  * {'FullPath': u'UI/Messages', 'messageID': 259422, 'label': u'MiningDronesDeactivatedOutOfRangeBody'}(u'{[item]module.name} deactivates without transfering ore to your cargo hold because your ship has strayed to a distance of {[numeric]distance} m, beyond its mining range of {[numeric]range} m.', None, {u'{[numeric]distance}': {'conditionalValues': [], 'variableType': 9, 'propertyName': None, 'args': 0, 'kwargs': {}, 'variableName': 'distance'}, u'{[numeric]range}': {'conditionalValues': [], 'variableType': 9, 'propertyName': None, 'args': 0, 'kwargs': {}, 'variableName': 'range'}, u'{[item]module.name}': {'conditionalValues': [], 'variableType': 2, 'propertyName': 'name', 'args': 0, 'kwargs': {}, 'variableName': 'module'}})
418  * {'FullPath': u'UI/Messages', 'messageID': 259434, 'label': u'MiningDronesDeactivatedCargoHoldNowFullBody'}(u'{modulename} deactivates. Your cargo hold does not have sufficient space to contain more ore, so loading algorithms have deactivated the {modulename} before it becomes overloaded.', None, {u'{modulename}': {'conditionalValues': [], 'variableType': 10, 'propertyName': None, 'args': 0, 'kwargs': {}, 'variableName': 'modulename'}})
419  * {'FullPath': u'UI/Messages', 'messageID': 259442, 'label': u'MiningDronesDeactivatedCargoHoldFullBody'}(u'{modulename} disperses its load of freshly mined ore into space unrecoverably, then deactivates. Your cargo hold is full.', None, {u'{modulename}': {'conditionalValues': [], 'variableType': 10, 'propertyName': None, 'args': 0, 'kwargs': {}, 'variableName': 'modulename'}})
420  * {'FullPath': u'UI/Messages', 'messageID': 259462, 'label': u'MiningDronesDeactivatedAsteroidEmptyBody'}(u'{modulename} deactivates as it finds the resource it was harvesting a pale shadow of its former glory.', None, {u'{modulename}': {'conditionalValues': [], 'variableType': 10, 'propertyName': None, 'args': 0, 'kwargs': {}, 'variableName': 'modulename'}})
421  *
422  */
#define sStatMgr
Definition: StatisticMgr.h:68
#define _log(type, fmt,...)
Definition: logsys.h:124
Python string.
Definition: PyRep.h:430
bool m_rMiner
Definition: MiningLaser.h:54
Python's dictionary.
Definition: PyRep.h:719
bool HasAttribute(const uint16 attrID) const
uint32 ownerID() const
Definition: InventoryItem.h:99
float GetMiningVolume()
void Depleted(MiningLaser *pMod)
bool HasAvailableSpace(EVEItemFlags flag, InventoryItemRef iRef) const
Definition: Inventory.cpp:625
SystemBubble * SysBubble()
Definition: SystemEntity.h:195
void CargoFull()
Definition: Ship.cpp:1335
virtual void RemoveTarget(SystemEntity *pSE)
double MakeRandomFloat(double low, double high)
Generates random real from interval [low; high].
Definition: misc.cpp:114
virtual bool CanActivate()
Definition: MiningLaser.cpp:78
virtual bool HasPilot()
Definition: Ship.h:71
uint32 GetRemainingCycleTimeMS()
Definition: ActiveModule.h:94
virtual void UnloadCharge()
Definition: MiningLaser.cpp:66
MiningLaser(ModuleItemRef mRef, ShipItemRef sRef)
Definition: MiningLaser.cpp:24
const char * name()
void SendNotifyMsg(const char *fmt,...)
Definition: Client.cpp:2776
TargetManager * TargetMgr()
Definition: SystemEntity.h:197
Python tuple.
Definition: PyRep.h:567
Definition: Ship.h:301
virtual uint32 DoCycle()
ModuleItemRef m_modRef
void SafeDelete(T *&p)
Deletes and nullifies a pointer.
Definition: SafeMem.h:83
virtual void Delete()
uint16 groupID() const
float m_crystalDmgChance
Definition: MiningLaser.h:59
ShipItemRef m_shipRef
SystemEntity * m_targetSE
Definition: ActiveModule.h:78
EVEItemFlags m_holdFlag
Definition: MiningLaser.h:63
SystemManager * SystemMgr()
Definition: SystemEntity.h:196
uint16 m_reloadTime
Definition: ActiveModule.h:99
InventoryItemRef GetSelf()
Definition: SystemEntity.h:202
int64 get_int()
Definition: EvilNumber.cpp:166
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:610
virtual void UnloadCharge()
InventoryItemRef m_chargeRef
uint16 GetID()
Definition: SystemBubble.h:91
float m_crystalDmg
Definition: MiningLaser.h:57
BeltMgr * GetBeltMgr()
void AddOreAndDeactivate(uint16 typeID, float amt, bool slave=true)
void ShowEffect(bool active=false, bool abort=false)
void SetAttribute(uint16 attrID, int num, bool notify=true)
uint32 GetID()
Definition: SystemEntity.h:207
virtual void LoadCharge(InventoryItemRef charge)
Definition: MiningLaser.cpp:52
X * get() const
Definition: RefPtr.h:213
float m_crystalDmgAmount
Definition: MiningLaser.h:58
const char * GetName() const
Definition: SystemEntity.h:210
bool m_iMiner
Definition: MiningLaser.h:54
void Depleted(std::multimap< float, MiningLaser * > &mMap)
virtual bool CanActivate()
virtual void DeactivateCycle(bool abort=false)
unsigned __int32 uint32
Definition: eve-compat.h:50
void ApplyEffect(int8 state, bool active=false)
uint32 GetGroupID()
Definition: SystemEntity.h:204
bool m_dcMiner
Definition: MiningLaser.h:54
void SetActive(uint16 bubbleID, bool active=true)
Definition: BeltMgr.cpp:114
ShipSE * GetShipSE()
Definition: Client.h:168
virtual Client * GetPilot()
Definition: Ship.h:72
void ProcessCycle(bool abort=false)
EvilNumber GetAttribute(const uint16 attrID) const
virtual void RemoveItem(InventoryItemRef iRef)
Definition: Ship.cpp:532
virtual void LoadCharge(InventoryItemRef charge)
uint16 m_crystalRoidGrp
Definition: MiningLaser.h:61
uint32 AddItemByFlag(EVEItemFlags flag, InventoryItemRef iRef, Client *pClient=nullptr)
Definition: Ship.cpp:486
virtual void Delete()
#define sItemFactory
Definition: ItemFactory.h:165
virtual uint32 DoCycle()
float get_float()
Definition: EvilNumber.cpp:184
float GetRemainingVolumeByFlag(EVEItemFlags flag) const
Definition: Ship.cpp:338
Inventory * GetMyInventory()
Definition: InventoryItem.h:91
unsigned __int16 uint16
Definition: eve-compat.h:48
EvilNumber GetAttribute(uint32 attrID)
Definition: GenericModule.h:53
virtual void DeactivateCycle(bool abort=false)
uint16 typeID() const
void SetModuleState(int8 state)
uint8 categoryID() const
bool m_gMiner
Definition: MiningLaser.h:54
uint32 itemID() const
Definition: InventoryItem.h:98
void SetItemString(const char *key, PyRep *value)
SetItemString adds or sets a database entry.
Definition: PyRep.h:812
bool m_IsInitialCycle
Definition: MiningLaser.h:55
#define sDataMgr