#define FILTERSCRIPT #include #include #include enum e_PICKUP { e_PICKUP_ID, e_PICKUP_TYPE, e_PICKUP_MODEL, e_PICKUP_WORLD, Float:e_PICKUP_XPOS, Float:e_PICKUP_YPOS, Float:e_PICKUP_ZPOS, Float:e_PICKUP_VIEWDIST, } new gStreamedPickups[PSTREAM_MAX_PICKUPS][e_PICKUP]; Itter_Create(Pickup, PSTREAM_MAX_PICKUPS); forward PStream_Create(model, type, Float:x, Float:y, Float:z, world, Float:viewdist); forward PStream_Destroy(pickupid); forward PStream_GetID(pickupid); forward PStream_Update(); public OnFilterScriptInit() { Itter_Add(Pickup, 0); // fake pickup SetTimer("PStream_Update", PSTREAM_UPDATE_INTERVAL, true); for (new player; player < MAX_PLAYERS; player++) { if (IsPlayerConnected(player)) { Itter_Add(Player, player); } } return 1; } public OnFilterScriptExit() { foreach (Pickup, pickup) { PStream_Destroy(pickup); } return 1; } public PStream_Create(model, type, Float:x, Float:y, Float:z, world, Float:viewdist) { if (Itter_Count(Pickup) < PSTREAM_MAX_PICKUPS) { new pickupid = Itter_Free(Pickup); Itter_Add(Pickup, pickupid); gStreamedPickups[pickupid][e_PICKUP_ID] = -1; gStreamedPickups[pickupid][e_PICKUP_XPOS] = x; gStreamedPickups[pickupid][e_PICKUP_YPOS] = y; gStreamedPickups[pickupid][e_PICKUP_ZPOS] = z; gStreamedPickups[pickupid][e_PICKUP_TYPE] = type; gStreamedPickups[pickupid][e_PICKUP_MODEL] = model; gStreamedPickups[pickupid][e_PICKUP_WORLD] = world; gStreamedPickups[pickupid][e_PICKUP_VIEWDIST] = viewdist; //printf("pickup added: id=%d, type=%d, x=%f, y=%f, z=%f, world=%d, dist=%f", pickupid, type, x, y, z, world, viewdist); return pickupid; } return -1; } public PStream_Destroy(pickupid) { if (pickupid > 0 && Itter_Remove(Pickup, pickupid)) { DestroyPickup(gStreamedPickups[pickupid][e_PICKUP_ID]); gStreamedPickups[pickupid][e_PICKUP_ID] = -1; //printf("pickup deleted: %d", pickupid); return pickupid; } return -1; } public PStream_GetID(pickupid) { foreach (Pickup, pickup) { if (!pickup) continue; if (gStreamedPickups[pickup][e_PICKUP_ID] == pickupid) { return pickup; } } return -1; } public PStream_Update() { new somebody_see_it, pickup_count; foreach (Pickup, pickup) { if (!pickup) continue; // fake pickup foreach (Player, player) { if (IsPlayerInRangeOfPoint(player, gStreamedPickups[pickup][e_PICKUP_VIEWDIST], gStreamedPickups[pickup][e_PICKUP_XPOS], gStreamedPickups[pickup][e_PICKUP_YPOS], gStreamedPickups[pickup][e_PICKUP_ZPOS])) { somebody_see_it = true; break; } } if (somebody_see_it) { if (gStreamedPickups[pickup][e_PICKUP_ID] == -1) { gStreamedPickups[pickup][e_PICKUP_ID] = CreatePickup(gStreamedPickups[pickup][e_PICKUP_MODEL], gStreamedPickups[pickup][e_PICKUP_TYPE], gStreamedPickups[pickup][e_PICKUP_XPOS], gStreamedPickups[pickup][e_PICKUP_YPOS], gStreamedPickups[pickup][e_PICKUP_ZPOS], gStreamedPickups[pickup][e_PICKUP_WORLD]); } pickup_count++; } else { DestroyPickup(gStreamedPickups[pickup][e_PICKUP_ID]); gStreamedPickups[pickup][e_PICKUP_ID] = -1; } somebody_see_it = false; if (pickup_count == MAX_PICKUPS) break; } return 1; }