void Streamer::processAttachedTextLabels() { for (boost::unordered_set<Item::SharedTextLabel>::iterator t = attachedTextLabels.begin(); t != attachedTextLabels.end(); ++t) { bool adjust = false; if ((*t)->attach) { if ((*t)->attach->player != INVALID_GENERIC_ID) { adjust = GetPlayerPos((*t)->attach->player, &(*t)->attach->position[0], &(*t)->attach->position[1], &(*t)->attach->position[2]); } else if ((*t)->attach->vehicle != INVALID_GENERIC_ID) { adjust = GetVehiclePos((*t)->attach->vehicle, &(*t)->attach->position[0], &(*t)->attach->position[1], &(*t)->attach->position[2]); } if (adjust) { if ((*t)->cell) { core->getGrid()->removeTextLabel(*t, true); } } else { (*t)->attach->position.fill(std::numeric_limits<float>::infinity()); } } } }
void Streamer::processAttachedAreas() { for (boost::unordered_set<Item::SharedArea>::iterator a = attachedAreas.begin(); a != attachedAreas.end(); ++a) { if ((*a)->attach) { bool adjust = false; if ((*a)->attach->object.get<0>() != INVALID_GENERIC_ID) { switch ((*a)->attach->object.get<1>()) { case STREAMER_OBJECT_TYPE_GLOBAL: { adjust = GetObjectPos((*a)->attach->object.get<0>(), &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); break; } case STREAMER_OBJECT_TYPE_PLAYER: { adjust = GetPlayerObjectPos((*a)->attach->object.get<2>(), (*a)->attach->object.get<0>(), &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); break; } case STREAMER_OBJECT_TYPE_DYNAMIC: { boost::unordered_map<int, Item::SharedObject>::iterator o = core->getData()->objects.find((*a)->attach->object.get<0>()); if (o != core->getData()->objects.end()) { (*a)->attach->position = o->second->position; adjust = true; } break; } } } else if ((*a)->attach->player != INVALID_GENERIC_ID) { adjust = GetPlayerPos((*a)->attach->player, &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); } else if ((*a)->attach->vehicle != INVALID_GENERIC_ID) { adjust = GetVehiclePos((*a)->attach->vehicle, &(*a)->attach->position[0], &(*a)->attach->position[1], &(*a)->attach->position[2]); } if (adjust) { if ((*a)->cell) { core->getGrid()->removeArea(*a, true); } } else { (*a)->attach->position.fill(std::numeric_limits<float>::infinity()); } } } }
void Streamer::startManualUpdate(Player &player, bool getData) { if (getData) { player.interiorID = GetPlayerInterior(player.playerID); player.worldID = GetPlayerVirtualWorld(player.playerID); GetPlayerPos(player.playerID, &player.position[0], &player.position[1], &player.position[2]); } processActiveItems(); performPlayerUpdate(player, false); }
PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerCommandText(int playerid, const char *cmdtext) { if (std::strcmp(cmdtext, "/hello") == 0) { char name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, MAX_PLAYER_NAME); char message[128]; std::sprintf(message, "Hello, %s!", name); SendClientMessage(playerid, 0x00FF00FF, message); return true; } if (std::strcmp(cmdtext, "/pos") == 0) { float x, y, z; GetPlayerPos(playerid, &x, &y, &z); char message[128]; std::sprintf(message, "You are at (%f, %f, %f)", x, y, z); SendClientMessage(playerid, 0xFFFFFFFF, message); return true; } return false; }
bool PlayerHandler::OnCommand(Player *player, std::string cmd, std::vector<std::string> args, GameUtility *gameUtility) { if (cmd == "hack") { GivePlayerMoney(player->getId(), 500000); return true; } else if (cmd == "pos") { float *x = new float(), *y = new float(), *z = new float(), *angle = new float(); GetPlayerPos(player->getId(), x, y, z); std::stringstream pos; pos << "Pos: X" << *x << " Y" << *y << " Z" << *z << "\nInterior: " << player->GetInterior() << " VirtualWorld: " << player->GetVirtualWorld(); SendClientMessage(player->getId(), 0xFFFFFFFF, pos.str().c_str()); delete x, y, z; return true; } else if (cmd == "spawn") { TeleportPlayer(player->getId(), WorldPositionObject(1958.3783f, 1343.1572f, 15.3746f, gameUtility->interiorHandler->getInterior(-1))); return true; } return false; }
void Streamer::performPlayerUpdate(Player &player, bool automatic) { Eigen::Vector3f delta = Eigen::Vector3f::Zero(), position = player.position; int state = GetPlayerState(player.playerID); bool update = true; if (automatic) { player.interiorID = GetPlayerInterior(player.playerID); player.worldID = GetPlayerVirtualWorld(player.playerID); GetPlayerPos(player.playerID, &player.position[0], &player.position[1], &player.position[2]); if (state != PLAYER_STATE_NONE && state != PLAYER_STATE_WASTED) { if (player.position != position) { position = player.position; Eigen::Vector3f velocity = Eigen::Vector3f::Zero(); if (state == PLAYER_STATE_ONFOOT) { GetPlayerVelocity(player.playerID, &velocity[0], &velocity[1], &velocity[2]); } else if (state == PLAYER_STATE_DRIVER || state == PLAYER_STATE_PASSENGER) { GetVehicleVelocity(GetPlayerVehicleID(player.playerID), &velocity[0], &velocity[1], &velocity[2]); } float velocityNorm = velocity.squaredNorm(); if (velocityNorm >= velocityBoundaries.get<0>() && velocityNorm <= velocityBoundaries.get<1>()) { delta = velocity * averageUpdateTime; player.position += delta; } } else { update = player.updateWhenIdle; } } else { update = false; } } std::vector<SharedCell> cells; if (update) { core->getGrid()->findAllCells(player, cells); if (!cells.empty()) { if (!core->getData()->objects.empty() && player.enabledItems[STREAMER_TYPE_OBJECT] && !IsPlayerNPC(player.playerID)) { processObjects(player, cells); } if (!core->getData()->checkpoints.empty() && player.enabledItems[STREAMER_TYPE_CP]) { processCheckpoints(player, cells); } if (!core->getData()->raceCheckpoints.empty() && player.enabledItems[STREAMER_TYPE_RACE_CP]) { processRaceCheckpoints(player, cells); } if (!core->getData()->mapIcons.empty() && player.enabledItems[STREAMER_TYPE_MAP_ICON] && !IsPlayerNPC(player.playerID)) { processMapIcons(player, cells); } if (!core->getData()->textLabels.empty() && player.enabledItems[STREAMER_TYPE_3D_TEXT_LABEL] && !IsPlayerNPC(player.playerID)) { processTextLabels(player, cells); } if (!core->getData()->areas.empty() && player.enabledItems[STREAMER_TYPE_AREA]) { if (!delta.isZero()) { player.position = position; } processAreas(player, cells); if (!delta.isZero()) { player.position += delta; } } } } if (automatic) { if (!core->getData()->pickups.empty()) { if (!update) { core->getGrid()->findMinimalCells(player, cells); } processPickups(player, cells); } if (!delta.isZero()) { player.position = position; } executeCallbacks(); } }