EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
InvBrokerService.cpp
Go to the documentation of this file.
1 /*
2  ------------------------------------------------------------------------------------
3  LICENSE:
4  ------------------------------------------------------------------------------------
5  This file is part of EVEmu: EVE Online Server Emulator
6  Copyright 2006 - 2021 The EVEmu Team
7  For the latest information visit https://evemu.dev
8  ------------------------------------------------------------------------------------
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public License along with
19  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20  Place - Suite 330, Boston, MA 02111-1307, USA, or go to
21  http://www.gnu.org/copyleft/lesser.txt.
22  ------------------------------------------------------------------------------------
23  Author: Zhur
24  Rewrite: Allan
25 */
26 
30 #include "eve-server.h"
31 
32 #include "EntityList.h"
33 #include "PyServiceCD.h"
34 #include "StaticDataMgr.h"
37 #include "station/StationDataMgr.h"
38 #include "station/StationOffice.h"
39 #include "system/SystemManager.h"
40 
42 : public PyBoundObject
43 {
44 public:
45 
47 
49  : PyBoundObject(mgr),
50  m_dispatch(new Dispatcher(this)),
51  m_locationID(locationID),
53  {
55 
56  m_strBoundObjectName = "InvBrokerBound";
57 
58  PyCallable_REG_CALL(InvBrokerBound, GetContainerContents);
59  PyCallable_REG_CALL(InvBrokerBound, GetInventoryFromId);
60  PyCallable_REG_CALL(InvBrokerBound, GetInventory);
63  PyCallable_REG_CALL(InvBrokerBound, AssembleCargoContainer);
64  PyCallable_REG_CALL(InvBrokerBound, BreakPlasticWrap);
65  PyCallable_REG_CALL(InvBrokerBound, TakeOutTrash);
67  PyCallable_REG_CALL(InvBrokerBound, DeliverToCorpHangar);
68  PyCallable_REG_CALL(InvBrokerBound, DeliverToCorpMember);
69 
70  }
71  virtual ~InvBrokerBound()
72  {
73  delete m_dispatch;
74  }
75 
76  virtual void Release() {
77  //I hate this statement
78  delete this;
79  }
80 
81  PyCallable_DECL_CALL(GetContainerContents);
82  PyCallable_DECL_CALL(GetInventoryFromId);
83  PyCallable_DECL_CALL(GetInventory);
84  PyCallable_DECL_CALL(SetLabel);
85  PyCallable_DECL_CALL(TrashItems);
86  PyCallable_DECL_CALL(AssembleCargoContainer);
87  PyCallable_DECL_CALL(BreakPlasticWrap);
88  PyCallable_DECL_CALL(TakeOutTrash);
89  PyCallable_DECL_CALL(SplitStack);
90  PyCallable_DECL_CALL(DeliverToCorpHangar);
91  PyCallable_DECL_CALL(DeliverToCorpMember);
92 
93 
94 protected:
95  Dispatcher *const m_dispatch;
96 
99 };
100 
102 
104 : PyService(mgr, "invbroker"),
105  m_dispatch(new Dispatcher(this))
106 {
107  _SetCallDispatcher(m_dispatch);
108 
109  PyCallable_REG_CALL(InvBrokerService, GetItemDescriptor);
110 }
111 
112 PyResult InvBrokerService::Handle_GetItemDescriptor(PyCallArgs &call) {
113  return sDataMgr.CreateHeader();
114 }
115 
117  delete m_dispatch;
118 }
119 
120 
122  InvBroker_BindArgs args;
123  //crap
124  PyRep* tmp(bind_args->Clone());
125  if (!args.Decode(&tmp)) {
126  codelog(SERVICE__ERROR, "%s: Failed to decode bind args.", GetName());
127  return nullptr;
128  }
129 
130  _log(INV__BIND, "InvBrokerService bind request:");
131  args.Dump(INV__BIND, " ");
132 
133  return new InvBrokerBound(m_manager, args.locationID, args.groupID);
134 }
135 
136 //is this completely right?
137 PyResult InvBrokerBound::Handle_GetContainerContents(PyCallArgs &call)
138 {
139  Call_TwoIntegerArgs args;
140  /* args.arg1 = itemID of container to look into
141  * args.arg2 = locationID of container
142  */
143  if (!args.Decode(&call.tuple)) {
144  codelog(SERVICE__ERROR, "%s: Failed to decode arguments.", GetName());
145  return nullptr;
146  }
147 
148  InventoryItemRef item = sItemFactory.GetInventoryItemFromID( args.arg1 );
149  if (item.get() == nullptr) {
150  _log(INV__ERROR, "GetContainerContents() - Unable to load inventory for itemID %u in locationID %u", args.arg1, args.arg2);
151  return nullptr;
152  }
154  if (item->ownerID() == call.client->GetCharacterID()) {
155  _log(INV__MESSAGE, "Handle_GetContainerContents() - %s(%u) is owned by calling character %s(%u) ", \
156  item->name(), item->itemID(), call.client->GetName(), call.client->GetCharacterID());
157  } else if ((item->ownerID() != call.client->GetCharacterID()) and sDataMgr.IsSolarSystem(args.arg2)) {
158  _log(INV__WARNING, "Handle_GetContainerContents() - %s(%u) is in space and not owned by calling character %s(%u) ", \
159  item->name(), item->itemID(), call.client->GetName(), call.client->GetCharacterID());
160  } else {
161  _log(INV__WARNING, "Handle_GetContainerContents() - %s(%u) is not owned by calling character %s(%u) ", \
162  item->name(), item->itemID(), call.client->GetName(), call.client->GetCharacterID());
163  throw UserError ("CantDoThatWithSomeoneElsesStuff");
164  }
165 
166  return item->GetMyInventory()->List( flagNone );
167 }
168 
169 //this is a view into the entire inventory item. this CAN throw. find and implement client error msgs here for corp usage
170 PyResult InvBrokerBound::Handle_GetInventoryFromId(PyCallArgs &call) {
172  /*
173  if e.args[0] == 'CrpAccessDenied':
174  self.CloseContainer(itemid)
175  */
176  _log(INV__DUMP, "InvBrokerBound::Handle_GetInventoryFromId()", "size=%u", call.tuple->size());
177  call.Dump(INV__DUMP);
178 
179  Call_TwoIntegerArgs args;
180  if (!args.Decode(&call.tuple)) {
181  codelog(SERVICE__ERROR, "%s: Failed to decode arguments.", GetName());
182  return nullptr;
183  }
184 
185  bool passive = (args.arg2 != 0); //no idea what this is for.
186  sItemFactory.SetUsingClient( call.client );
187  InventoryItemRef iRef(nullptr);
188  // if item requested is office folder, we have to do shit a lil different, as it sends officeFolderID, instead of itemID
189  if ((m_groupID == EVEDB::invGroups::Station) and (IsOfficeFolder(args.arg1))) {
190  uint32 officeID = stDataMgr.GetOfficeIDForCorp(m_locationID, call.client->GetCorporationID());
191  iRef = sItemFactory.GetInventoryItemFromID( officeID );
192  } else {
193  iRef = sItemFactory.GetInventoryItemFromID( args.arg1 );
194  }
195  sItemFactory.UnsetUsingClient();
196  if (iRef.get() == nullptr) {
197  _log(INV__ERROR, "GetInventoryFromId() - Unable to get inventoryItem for itemID %u", args.arg1);
198  // send error to player?
199  return nullptr;
200  }
201 
202  // this can send locationID as named arg. not sure if we need it, possible test cases (usually stationID)
203 
204  // use container's owner as ownerID
205  uint32 ownerID = iRef->ownerID();
206 
215  EVEItemFlags flag = flagNone;
216  switch (iRef->categoryID()) {
218  switch (iRef->groupID()) {
220  flag = flagNone;
221  ownerID = call.client->GetCharacterID();
222  } break;
224  flag = flagNone;
225  ownerID = call.client->GetCorporationID();
226  } break;
228  flag = flagNone;
229  ownerID = call.client->GetAllianceID();
230  } break;
232  // not sure if this is used...
233  flag = flagNone;
234  ownerID = call.client->GetWarFactionID();
235  } break;
236  }
237  } break;
239  // should we test for ships and hangar types here? yes.
240  if (iRef->HasAttribute(AttrHasCorporateHangars)) {
241  flag = flagCargoHold; // this is also corp hangar 1
242  } else {
243  flag = flagCargoHold;
244  }
245  } break;
247  switch(iRef->groupID()) {
249  flag = flagNone;
250  } break;
251  default: {
252  flag = flagHangar;
253  } break;
254  } break;
255  } break;
257  switch(iRef->groupID()) {
259  // not sure what to do in this case...
260  flag = flagNone;
261  } break;
263  // this includes orbital command centers, which this may not be right for.
264  flag = flagHangar;
265  ownerID = call.client->GetCharacterID();
266  } break;
267  }
268  } break;
270  flag = flagHangar;
271  } break;
274  flag = flagCargoHold;
275  } break;
277  _log(INV__WARNING, "GetInventoryFromID called for Trading locationID %u using itemID %u", m_locationID, args.arg1);
278  flag = flagNone;
279  } break;
281  switch (iRef->groupID ()) {
283  flag = flagNone;
284  // only check distance if the item is in space and not in a station
285  if (sDataMgr.IsSolarSystem(iRef->locationID())) {
286  GVector direction(iRef->position(), call.client->GetShip()->position());
287  float maxDistance = 2500.0f;
288 
289  if (iRef->HasAttribute (AttrMaxOperationalDistance) == true)
290  maxDistance = iRef->GetAttribute(AttrMaxOperationalDistance).get_float ();
291 
292  if (direction.length () > maxDistance)
293  throw UserError ("NotCloseEnoughToOpen")
294  .AddAmount ("maxdist", maxDistance);
295  }
296  break;
297  }
298  }
299  }
300  }
301 
302  //we just bind up a new inventory object for container requested and give it back to them.
303  InventoryBound* ib = new InventoryBound(m_manager, iRef, flag, ownerID, passive);
304  PyRep* result = m_manager->BindObject(call.client, ib);
305  return result;
306 }
307 
308 //this is a view into an inventory item using a specific flag.
309 PyResult InvBrokerBound::Handle_GetInventory(PyCallArgs &call) {
311  _log(INV__DUMP, "InvBrokerBound::Handle_GetInventory() size=%u", call.tuple->size());
312  call.Dump(INV__DUMP);
313  Inventory_GetInventory args;
314  if (!args.Decode(&call.tuple)) {
315  codelog(SERVICE__ERROR, "%s: Failed to decode arguments.", GetName());
316  return nullptr;
317  }
318 
319  uint32 ownerID = args.ownerID;
320  sItemFactory.SetUsingClient( call.client );
323  _log(INV__WARNING, "GetInventory called for station %u", m_locationID);
324  //item = sEntityList.GetStationByID(m_locationID);
325  item = sItemFactory./*GetStation*/GetItem(m_locationID);
327  _log(INV__WARNING, "GetInventory called for solar system %u", m_locationID);
328  item = sItemFactory./*GetSolarSystem*/GetItem(m_locationID);
329  } else {
330  _log(INV__WARNING, "GetInventory called for item %u (group: %u)", m_locationID, m_groupID);
331  item = sItemFactory./*GetInventoryItemFromID*/GetItem(m_locationID);
332  }
333  sItemFactory.UnsetUsingClient();
334 
335  if (item.get() == nullptr) {
336  codelog(INV__ERROR, "%s: Unable to load item %u for flag %u", call.client->GetName(), m_locationID, args.container);
337  return nullptr;
338  }
339 
340  EVEItemFlags flag = flagNone;
341  switch(args.container) {
342  case Inv::Container::Wallet: { /*10001*/
343  if (ownerID == 0)
344  ownerID = call.client->GetCharacterID();
345  flag = flagWallet;
346  } break;
347  case Inv::Container::Character: { /*10011*/
348  if (ownerID == 0)
349  ownerID = call.client->GetCharacterID();
350  flag = flagSkill;
351  } break;
352  case Inv::Container::Hangar: { /*10004*/
353  if (ownerID == 0)
354  ownerID = call.client->GetCharacterID();
355  flag = flagHangar;
356  } break;
357  case Inv::Container::CorpMarket: { /*10012*/ //this is for corp deliveries
358  if (ownerID == 0)
359  ownerID = call.client->GetCorporationID();
360  flag = flagCorpMarket;
361  } break;
362  case Inv::Container::Offices: { /*10009*/
363  if (ownerID == 0)
364  ownerID = call.client->GetCorporationID();
365  flag = flagOffice;
366  } break;
367  case Inv::Container::SolarSystem: { /*10003*/ // is this for flagProperty items? (corp items in space)
368  // not sure on this one
369  if (ownerID == 0)
370  ownerID = call.client->GetCorporationID();
371  flag = flagProperty;
372  } break;
373 
374  case Inv::Container::Global: { /*10002*/ // used in asset listings. means "everywhere"
375  // not sure how to code it yet...
376  if (ownerID == 0)
377  ownerID = call.client->GetCharacterID();
378  flag = flagNone;
379  } break;
380 
381  case Inv::Container::Factory: { /*10006*/
382  // not sure on this one (not coded in client)
383  if (ownerID == 0)
384  ownerID = call.client->GetCharacterID();
385  flag = flagFactoryOperation;
386  } break;
387  //case Inv::Container::ScrapHeap:/*10005*/
388  //case Inv::Container::Bank:/*10007*/
389  //case Inv::Container::Recycler:/*10008*/
390  //case Inv::Container::StationCharacters:/*10010*/
391  //flag = flagNone;
392  //break;
393  // there is no 10005, 10006, or 10007 defined in client
394  default:
395  _log(INV__ERROR, "Unhandled container type %u for locationID %u", args.container, m_locationID);
396  return nullptr;
397  }
398 
399  //we just bind up a new inventory object for container requested and give it back to them.
400  InventoryBound* ib = new InventoryBound(m_manager, item, flag, ownerID, false);
401  PyRep* result = m_manager->BindObject(call.client, ib);
402 
403  // returns nodeid and timestamp
404  return result;
405 }
406 
407 // this cannot throw, returns nothing.
408 PyResult InvBrokerBound::Handle_SetLabel(PyCallArgs &call) {
409  CallSetLabel args;
410  if (!args.Decode(&call.tuple)) {
411  codelog(SERVICE__ERROR, "%s: Failed to decode arguments.", GetName());
412  return nullptr;
413  }
414 
415  sItemFactory.SetUsingClient( call.client );
416  InventoryItemRef iRef = sItemFactory.GetItem( args.itemID );
417  if (iRef.get() == nullptr) {
418  codelog(INV__ERROR, "%s: Unable to load item %u", call.client->GetName(), args.itemID);
419  sItemFactory.UnsetUsingClient();
420  return nullptr;
421  }
422 
423  /*
424  * {'FullPath': u'UI/Messages', 'messageID': 258478, 'label': u'SetNameInvalidBody'}(u"You can't rename that type of object.", None, None)
425  * {'FullPath': u'UI/Messages', 'messageID': 258479, 'label': u'SetNameShipMustBePilotBody'}(u'You can only rename ships that you are currently piloting.', None, None)
426  */
427 
428  bool error(false);
430  if (IsPlayerCorp(iRef->ownerID())) {
431  if (iRef->ownerID() != call.client->GetCorporationID()) {
432  _log(INV__ERROR, "%u(%u) tried to rename CorpItem %s(%u) owned by %u.", \
433  call.client->GetName(), call.client->GetCharacterID(), iRef->name(), \
434  iRef->itemID(), iRef->ownerID());
435  error = true;
436  }
437  } else if (IsCharacterID(iRef->ownerID())) {
438  if (iRef->ownerID() != call.client->GetCharacterID()) {
439  _log(INV__ERROR, "%u(%u) tried to rename PlayerItem %s(%u) owned by %u.", \
440  call.client->GetName(), call.client->GetCharacterID(), iRef->name(), \
441  iRef->itemID(), iRef->ownerID());
442  error = true;
443  }
444  } else {
445  // error here....
446  error = true;
447  }
448 
449  if (error) {
450  call.client->SendErrorMsg("You are not allowed to rename that.");
451  } else {
452  iRef->Rename(PyRep::StringContent(args.itemName));
453  }
454 
455  // Release the ItemFactory
456  sItemFactory.UnsetUsingClient();
457 
458  //OnItemNameChange
459  // need to also check pos rename code.
460  // this needs investigating to verify
461  // -- not sure this is sent from server
462 
463  return nullptr;
464 }
465 
466 PyResult InvBrokerBound::Handle_TrashItems(PyCallArgs &call) {
467  Call_TrashItems args;
468  if (!args.Decode(&call.tuple)) {
469  codelog(SERVICE__ERROR, "%s: Failed to decode arguments.", GetName());
470  return nullptr;
471  }
472 
473  std::vector<int32>::const_iterator cur = args.items.begin(), end = args.items.end();
474  for(; cur != end; ++cur) {
475  InventoryItemRef item = sItemFactory.GetItem( *cur );
476  if (item.get() == nullptr) {
477  _log(INV__ERROR, "%s: Unable to load item %u to delete it. Skipping.", call.client->GetName(), *cur);
478  } else if (call.client->GetCharacterID() != item->ownerID()) {
479  _log(INV__ERROR, "%s: Tried to trash item %u which is not yours. Skipping.", call.client->GetName(), *cur);
480  } else if (item->locationID() != args.locationID) {
481  _log(INV__ERROR, "%s: Item %u is not in location %u. Skipping.", call.client->GetName(), *cur, args.locationID);
482  } else {
483  item->Delete();
484  // these below dont work...
485  //item->SetFlag(flagJunkyardTrashed);
486  //item->ChangeOwner(call.client->GetStationID(), false);
487  //item->Move(call.client->GetStationID(), flagJunkyardTrashed);
488  }
489  }
490 
491  return nullptr;
492 }
493 
498 PyResult InvBrokerBound::Handle_AssembleCargoContainer(PyCallArgs &call) {
499  /* invMgr.AssembleCargoContainer(invItem.itemID, None, 0.0)
500  *
501  * 14:37:46 [BindDump] Call Arguments:
502  * 14:37:46 [BindDump] Tuple: 3 elements
503  * 14:37:46 [BindDump] [ 0] Integer field: 140000489
504  * 14:37:46 [BindDump] [ 1] (None)
505  * 14:37:46 [BindDump] [ 2] Real field: 0.000000
506  *
507  * 14:37:46 L InvBrokerBound::Handle_AssembleCargoContainer(): size= 3
508  * 14:37:46 [InvMsg] Call Arguments:
509  * 14:37:46 [InvMsg] Tuple: 3 elements
510  * 14:37:46 [InvMsg] [ 0] Integer field: 140000489
511  * 14:37:46 [InvMsg] [ 1] (None)
512  * 14:37:46 [InvMsg] [ 2] Real field: 0.000000
513  */
514 
515  sLog.Warning( "InvBrokerBound::Handle_AssembleCargoContainer()", "size= %u", call.tuple->size() );
516  call.Dump(INV__DUMP);
517 
518  return nullptr;
519 }
520 
521 PyResult InvBrokerBound::Handle_BreakPlasticWrap(PyCallArgs &call) {
522  // ConfirmBreakCourierPackage - this is for courier contracts
523  sLog.Warning( "InvBrokerBound::Handle_BreakPlasticWrap()", "size= %u", call.tuple->size() );
524  call.Dump(INV__DUMP);
525 
526  return nullptr;
527 }
528 
529 PyResult InvBrokerBound::Handle_TakeOutTrash(PyCallArgs &call) {
530  //self.invCache.GetInventory(const.containerHangar).TakeOutTrash([ invItem.itemID for invItem in invItems ])
531  sLog.Warning( "InvBrokerBound::Handle_TakeOutTrash()", "size= %u", call.tuple->size() );
532  call.Dump(INV__DUMP);
533 
534  return nullptr;
535 }
536 
537 PyResult InvBrokerBound::Handle_SplitStack(PyCallArgs &call) {
538  //
539  /*
540  18:22:26 W InvBrokerBound::Handle_SplitStack(): size= 4
541  18:22:26 [InvDump] Call Arguments:
542  18:22:26 [InvDump] Tuple: 4 elements
543  18:22:26 [InvDump] [ 0] Integer: 60014140 << locationID
544  18:22:26 [InvDump] [ 1] Integer: 140024213 << itemID to split
545  18:22:26 [InvDump] [ 2] Integer: 100 << qty to take
546  18:22:26 [InvDump] [ 3] Integer: 98000001 << ownerID (corpID)
547  */
548 
549  sLog.Warning( "InvBrokerBound::Handle_SplitStack()", "size= %u", call.tuple->size() );
550  call.Dump(INV__DUMP);
551 
552  return nullptr;
553 }
554 
555 PyResult InvBrokerBound::Handle_DeliverToCorpHangar(PyCallArgs &call) {
556  //
557  /*
558  18:11:51 W InvBrokerBound::Handle_DeliverToCorpHangar(): size= 6
559  18:11:51 [InvDump] Call Arguments:
560  18:11:51 [InvDump] Tuple: 6 elements
561  18:11:51 [InvDump] [ 0] Integer: 100000000 << officeID
562  18:11:51 [InvDump] [ 1] Integer: 60014140 << locationID
563  18:11:51 [InvDump] [ 2] List: 1 elements << items to deliver
564  18:11:51 [InvDump] [ 2] [ 0] Integer: 140024211 << itemID
565  18:11:51 [InvDump] [ 3] None << u/k
566  18:11:51 [InvDump] [ 4] Integer: 98000001 << ownerID (corpID)
567  18:11:51 [InvDump] [ 5] Integer: 119 << destination flagID
568  */
569 
570  sLog.Warning( "InvBrokerBound::Handle_DeliverToCorpHangar()", "size= %u", call.tuple->size() );
571  call.Dump(INV__DUMP);
572 
573  return nullptr;
574 }
575 
576 PyResult InvBrokerBound::Handle_DeliverToCorpMember(PyCallArgs &call) {
577  //
578  /*
579  18:49:06 W InvBrokerBound::Handle_DeliverToCorpMember(): size= 5
580  18:49:06 [InvDump] Call Arguments:
581  18:49:06 [InvDump] Tuple: 5 elements
582  18:49:06 [InvDump] [ 0] Integer: 90000000 << member charID
583  18:49:06 [InvDump] [ 1] Integer: 60014140 << locationID
584  18:49:06 [InvDump] [ 2] List: 1 elements << items to deliver
585  18:49:06 [InvDump] [ 2] [ 0] Integer: 140024205 << itemID
586  18:49:06 [InvDump] [ 3] None << u/k
587  18:49:06 [InvDump] [ 4] Integer: 98000001 << ownerID (corpID)
588  */
589  sLog.Warning( "InvBrokerBound::Handle_DeliverToCorpMember()", "size= %u", call.tuple->size() );
590  call.Dump(INV__DUMP);
591 
592  return nullptr;
593 }
Base Python wire object.
Definition: PyRep.h:66
Dispatcher *const m_dispatch
static std::string StringContent(PyRep *pRep)
Definition: PyRep.cpp:103
void SendErrorMsg(const char *fmt,...)
Definition: Client.cpp:2719
#define _log(type, fmt,...)
Definition: logsys.h:124
#define IsOfficeFolder(itemID)
Definition: EVE_Defines.h:309
#define stDataMgr
uint32 uint32 groupID
size_t size() const
Definition: PyRep.h:591
uint32 ownerID() const
Definition: InventoryItem.h:99
virtual PyRep * Clone() const =0
Clones object.
const GPoint & position() const
PyCallable_DECL_CALL(GetContainerContents)
EVEItemFlags
Definition: EVE_Flags.h:13
int32 GetCharacterID() const
Definition: Client.h:113
int32 GetWarFactionID() const
Definition: Client.h:126
int32 GetCorporationID() const
Definition: Client.h:123
std::string m_strBoundObjectName
Definition: PyBoundObject.h:54
const char * name()
const char * GetName() const
Definition: PyService.h:54
itemID[count] Create count or of the specified item(from Insider)" ) COMMAND( goto
int32 GetAllianceID() const
Definition: Client.h:125
void _SetCallDispatcher(CallDispatcher *d)
Definition: PyCallable.h:87
* args
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
virtual PyBoundObject * CreateBoundObject(Client *pClient, const PyRep *bind_args)
PyCallable_Make_Dispatcher(InvBrokerBound) InvBrokerBound(PyServiceMgr *mgr
UserError & AddAmount(const char *name, int quantity)
Shorthand method for adding a quantity value.
Dispatcher *const m_dispatch
Dispatcher *const m_dispatch
virtual ~InvBrokerBound()
#define codelog(type, fmt,...)
Definition: logsys.h:128
uint32 locationID() const
PyServiceMgr *const m_manager
Definition: PyService.h:91
X * get() const
Definition: RefPtr.h:213
ShipItemRef GetShip() const
Definition: Client.h:167
const char * GetName() const
Definition: Client.h:94
#define IsPlayerCorp(itemID)
Definition: EVE_Defines.h:241
virtual void Release()
Client *const client
Definition: PyCallable.h:49
#define IsCharacterID(itemID)
Definition: EVE_Defines.h:206
Python object "ccp_exceptions.UserError".
Definition: PyExceptions.h:121
#define PyCallable_REG_CALL(c, m)
Definition: PyServiceCD.h:78
Definition: Client.h:66
unsigned __int32 uint32
Definition: eve-compat.h:50
PyServiceMgr *const m_manager
Definition: PyBoundObject.h:53
PySubStruct * BindObject(Client *pClient, PyBoundObject *pObj, PyDict *dict=nullptr, PyDict *oid=nullptr)
void Dump(LogType type) const
Definition: PyCallable.cpp:81
virtual void Rename(std::string name)
PyCallable_Make_InnerDispatcher(InvBrokerService) InvBrokerService
virtual void Delete()
#define sItemFactory
Definition: ItemFactory.h:165
Definition: gpoint.h:70
Inventory * GetMyInventory()
Definition: InventoryItem.h:91
CRowSet * List(EVEItemFlags flag, uint32 ownerID=0) const
Definition: Inventory.cpp:290
uint32 itemID() const
Definition: InventoryItem.h:98
const char * GetName() const
Definition: PyBoundObject.h:44
PyTuple * tuple
Definition: PyCallable.h:50
#define sDataMgr