Moin,
da es ja nun zig verschiedene Anbieter von Pickup-Filter-Systemen etc gibt und ich noch keinen gesehen habe der das ganze komplett Serverside steuert, geb ich euch mal nen Anstoß dafür.
Funktion ist nicht getestet, habe ich grade aus Lust und Langeweile mal zusammengetippert:
C: input_main.cpp
- void CInputMain::ItemPickup(LPCHARACTER ch, const char* data)
- {
- struct RangePickup
- {
- LPCHARACTER ch;
- int range;
- RangePickup(LPCHARACTER p, int r)
- {
- ch = p;
- range = r;
- }
- void operator()(LPENTITY pEnt)
- {
- if (!ch)
- return;
- if (pEnt->IsType(ENTITY_ITEM))
- {
- LPITEM item = (LPITEM)pEnt;
- if (!item->GetSectree() || !item->IsOwnership(ch))
- return;
- int iDist = DISTANCE_APPROX(item->GetX() - ch->GetX(), item->GetY() - ch->GetY());
- if (iDist > range)
- return;
- ch->PickupItem(item->GetVID());
- }
- }
- };
- if (!ch)
- return;
- LPSECTREE sectree = ch->GetSectree();
- if (!sectree)
- return;
- RangePickup f(ch, 1000);
- sectree->ForEachAround(f);
- //Old Pickup-Call
- //struct command_item_pickup* pinfo = (struct command_item_pickup*) data;
- //if (ch)
- //{
- // ch->PickupItem(pinfo->vid);
- //}
- }
Muss bestimmt noch um einiges erweiter werden bezüglich Gruppe etc, sollte aber die Grundfunktionalität abdecken und die Menge an Packets fürs Pickup drastisch reduzieren.