bool game_character_stoped_in_volume(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getObject<T>(0)); glm::vec3 vec1(args[1].real, args[2].real, args[3].real); glm::vec3 vec2(args[4].real, args[5].real, args[6].real); bool drawCylinder = !!args[7].integer; glm::vec3 min = glm::min(vec1, vec2); glm::vec3 max = glm::max(vec1, vec2); glm::vec3 pp = character->getPosition(); if( pp.x >= min.x && pp.y >= min.y && pp.z >= min.z && pp.x <= max.x && pp.y <= max.y && pp.z <= max.z ) { if( character->getCurrentVehicle() != nullptr ) { return character->getCurrentVehicle()->physVehicle->getCurrentSpeedKmHour() < 0.75f; } else { return character->controller->getCurrentActivity() == nullptr; } } if( drawCylinder ) { args.getWorld()->drawAreaIndicator(AreaIndicatorInfo::Cylinder, (max+min)/2.f, (max-min)/2.f); } return false; }
bool game_locate_player_stopped_in_vehicle_2d(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getPlayerCharacter(0)); glm::vec2 position(args[1].real, args[2].real); glm::vec2 radius(args[3].real, args[4].real); bool drawCylinder = args[5].integer; if( character->getCurrentVehicle() == nullptr ) { return false; } auto vp = character->getCurrentVehicle()->getPosition(); glm::vec2 distance = glm::abs(position - glm::vec2(vp)); if(distance.x <= radius.x && distance.y <= radius.y && character->isStopped()) { return true; } if( drawCylinder ) { auto ground = args.getWorld()->getGroundAtPosition(glm::vec3(position, 100.f)); args.getWorld()->drawAreaIndicator(AreaIndicatorInfo::Cylinder, ground, glm::vec3(radius, 5.f)); } return false; }
void game_create_object_world(const ScriptArguments& args) { int id = 0; switch(args[0].type) { case TInt8: id = (std::int8_t)args[0].integer; break; case TInt16: id = (std::int16_t)args[0].integer; break; default: RW_ERROR("Unhandled integer type"); break; } if( id < 0 ) { auto& modelname = args.getVM()->getFile()->getModels()[-id]; id = args.getWorld()->data->findModelObject(modelname); if( id == (uint16_t)-1 ) { args.getWorld()->logger->error("SCM", "Failed to find model " + modelname); } } glm::vec3 position(args[1].real, args[2].real, args[3].real); auto inst = args.getWorld()->createInstance(id, position); *args[4].globalInteger = inst->getGameObjectID(); }
void vm_sleep(const ScriptArguments& args) { args.getThread()->wakeCounter = args[0].integerValue(); if( args.getThread()->wakeCounter == 0 ) { args.getThread()->wakeCounter = -1; } }
ScriptModel script::getModel(const ScriptArguments& args, ScriptModel model) { if (model < 0) { /// @todo verify that this is how the game uses negative models const auto& m = args.getVM()->getFile()->getModels()[-model]; return args.getWorld()->data->findModelObject(m); } return model; }
void game_create_pickup(const ScriptArguments& args) { glm::vec3 pos (args[2].real, args[3].real, args[4].real); int id = args.getModel(0); int type = args[1].integer; PickupObject* pickup = args.getWorld()->createPickup(pos, id, type); *args[5].globalInteger = pickup->getGameObjectID(); }
void game_create_weapon_pickup(const ScriptArguments& args) { glm::vec3 pos (args[3].real, args[4].real, args[5].real); int id = args.getModel(0); int type = args[1].integer; int ammo = args[2].integer; RW_UNUSED(ammo); RW_UNIMPLEMENTED("game_create_weapon_pickup(): ammo count"); PickupObject* pickup = args.getWorld()->createPickup(pos, id, type); *args[6].globalInteger = pickup->getGameObjectID(); }
bool game_player_in_model(const ScriptArguments& args) { auto vdata = args.getWorld()->data->findObjectType<VehicleData>(args[1].integer); if( vdata ) { auto character = static_cast<CharacterObject*>(args.getPlayerCharacter(0)); auto vehicle = character->getCurrentVehicle(); if ( vehicle ) { return vehicle->model && vdata->modelName == vehicle->model->name; } } return false; }
void vm_if(const ScriptArguments& args) { auto n = args[0].integer; if( n <= 7 ) { args.getThread()->conditionCount = n+1; args.getThread()->conditionMask = 0xFF; args.getThread()->conditionAND = true; } else { args.getThread()->conditionCount = n-19; args.getThread()->conditionMask = 0x00; args.getThread()->conditionAND = false; } }
void vm_mission_over(const ScriptArguments& args) { for( auto oid : args.getState()->missionObjects ) { auto obj = args.getWorld()->vehiclePool.find(oid); if( obj ) { args.getWorld()->destroyObjectQueued(obj); } } args.getState()->missionObjects.clear(); *args.getState()->scriptOnMissionFlag = 0; }
bool game_player_in_any_vehicle(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getPlayerCharacter(0)); auto vehicle = character->getCurrentVehicle(); return vehicle != nullptr; }
bool game_player_in_taxi(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getPlayerCharacter(0)); auto vehicle = character->getCurrentVehicle(); return (vehicle && (vehicle->vehicle->classType & VehicleData::TAXI) == VehicleData::TAXI); }
void game_destroy_object(const ScriptArguments& args) { auto object = args.getObject<Tobject>(0); RW_CHECK(object != nullptr, "destroying a null object?"); args.getWorld()->destroyObjectQueued(object); }
void game_create_character_as_passenger(const ScriptArguments& args) { auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); auto type = args[1].integerValue(); RW_UNUSED(type); RW_UNIMPLEMENTED("game_create_character_as_passenger(): character type"); auto id = args[2].integerValue(); auto seat = args[3].integerValue(); auto character = args.getWorld()->createPedestrian(id, vehicle->getPosition() + spawnMagic); new DefaultAIController(character); if (seat <= -1) { for (seat = 0; seat < static_cast<int>(vehicle->info->seats.size()); seat++) { if (vehicle->getOccupant(seat) == nullptr && !vehicle->isOccupantDriver(seat)) { break; } } } else { /// @todo 0 - passenger seat (or back seat of bike); 1 - left rear seat; 2 - right rear seat seat++; } RW_CHECK(seat < static_cast<int>(vehicle->info->seats.size()), "Seat index too high"); RW_CHECK(vehicle->getOccupant(seat) == nullptr, "Seat is not free"); RW_CHECK(vehicle->isOccupantDriver(seat) == false, "Seat is not a passenger seat"); character->setCurrentVehicle(vehicle, seat); vehicle->setOccupant(seat, character); *args[4].globalInteger = character->getGameObjectID(); }
void game_character_run_to(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getObject<CharacterObject>(0)); glm::vec3 target(args[1].real, args[2].real, 0.f); target = args.getWorld()->getGroundAtPosition(target); character->controller->setNextActivity(new Activities::GoTo(target, true)); }
void game_create_player(const ScriptArguments& args) { auto id = args[0].integer; if (id != 0) { RW_UNIMPLEMENTED("Multiple player characters not supported"); } glm::vec3 position(args[1].real, args[2].real, args[3].real); if( position.z < -99.f ) { position = args.getWorld()->getGroundAtPosition(position); } auto pc = args.getWorld()->createPlayer(position + spawnMagic); args.getState()->playerObject = pc->getGameObjectID(); *args[4].globalInteger = args.getWorld()->players.size()-1; }
void game_set_vehicle_colours(const ScriptArguments& args) { auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); auto& colours = args.getWorld()->data->vehicleColours; vehicle->colourPrimary = colours[args[1].integer]; vehicle->colourSecondary = colours[args[2].integer]; }
bool game_character_in_zone(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getObject<T>(0)); std::string zname(args[1].string); auto zfind = args.getWorld()->data->zones.find(zname); if( zfind != args.getWorld()->data->zones.end() ) { auto player = character->getPosition(); auto& min = zfind->second.min; auto& max = zfind->second.max; if( player.x > min.x && player.y > min.y && player.z > min.z && player.x < max.x && player.y < max.y && player.z < max.z ) { return true; } } return false; }
void game_create_vehicle(const ScriptArguments& args) { auto id = args[0].integer; glm::vec3 position(args[1].real, args[2].real, args[3].real); if( position.z < -99.f ) { position = args.getWorld()->getGroundAtPosition(position); } position += spawnMagic; auto vehicle = args.getWorld()->createVehicle(id, position); if ( args.getThread()->isMission ) { args.getState()->missionObjects.push_back(vehicle->getGameObjectID()); } *args[4].globalInteger = vehicle->getGameObjectID(); }
void game_destroy_pickup(const ScriptArguments& args) { PickupObject* pickup = static_cast<PickupObject*>(args.getObject<PickupObject>(0)); if ( pickup ) { args.getWorld()->destroyObjectQueued(pickup); } }
void game_set_close_object_visible(const ScriptArguments& args) { glm::vec3 position(args[0].real, args[1].real, args[2].real); float radius = args[3].real; int modelid = 0; /// @todo fix this being a problem. switch(args[4].type) { case TInt8: modelid = (std::int8_t)args[4].integer; break; case TInt16: modelid = (std::int16_t)args[4].integer; break; default: RW_ERROR("Unhandled integer type"); break; } if( std::abs(modelid) > 178 ) { /// @todo implement this path, return; } std::string model; if(modelid < 0) modelid = -modelid; model = args.getVM()->getFile()->getModels()[modelid]; std::transform(model.begin(), model.end(), model.begin(), ::tolower); for(auto& p : args.getWorld()->instancePool.objects) { auto o = p.second; if( !o->model ) continue; if( o->model->name != model ) continue; float d = glm::distance(position, o->getPosition()); if( d < radius ) { o->visible = !!args[5].integer; } } }
/// Remove object from cleanup at end of missions. void game_dont_remove_object(const ScriptArguments& args) { auto object = args.getObject<VehicleObject>(0); if(object) { auto id = object->getGameObjectID(); auto& mO = args.getState()->missionObjects; mO.erase(std::remove(mO.begin(), mO.end(), id), mO.end()); } }
bool game_player_in_area_2d(const ScriptArguments& args) { auto character = args.getPlayerCharacter(0); glm::vec2 min(args[1].real, args[2].real); glm::vec2 max(args[3].real, args[4].real); auto player = character->getPosition(); if( player.x > min.x && player.y > min.y && player.x < max.x && player.y < max.y ) { return true; } return false; }
bool game_player_pressing_horn(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getPlayerCharacter(0)); if ( character->getCurrentVehicle() != nullptr ) { /// @todo Respect actual horn key. return true; } return false; }
bool game_player_near_point_on_foot_3D(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getPlayerCharacter(0)); glm::vec3 center(args[1].real, args[2].real, args[3].real); glm::vec3 size(args[4].real, args[5].real, args[6].real); bool drawCylinder = !!args[7].integer; auto vehicle = character->getCurrentVehicle(); if( ! vehicle ) { auto distance = center - character->getPosition(); distance /= size; if( glm::length( distance ) < 1.f ) return true; } if( drawCylinder ) { args.getWorld()->drawAreaIndicator(AreaIndicatorInfo::Cylinder, center, size); } return false; }
bool game_locate_vehicle_near_point_2D(const ScriptArguments& args) { auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); glm::vec2 position(args[1].real, args[2].real); glm::vec2 radius(args[3].real, args[4].real); bool drawCylinder = !!args[5].integerValue(); auto vp = vehicle->getPosition(); glm::vec2 distance = glm::abs(position - glm::vec2(vp)); if(distance.x <= radius.x && distance.y <= radius.y) { return true; } if(drawCylinder) { auto ground = args.getWorld()->getGroundAtPosition(glm::vec3(position, 100.f)); args.getWorld()->drawAreaIndicator(AreaIndicatorInfo::Cylinder, ground + glm::vec3(0.f, 0.f, 4.5f), glm::vec3(radius, 5.f)); } return false; }
bool game_is_vehicle_model(const ScriptArguments& args) { auto vdata = args.getWorld()->data->findObjectType<VehicleData>(args[1].integer); if( vdata ) { auto vehicle = args.getObject<VehicleObject>(0); if ( vehicle ) { return vehicle->model && vdata->modelName == vehicle->model->name; } } return false; }
void game_create_character(const ScriptArguments& args) { auto type = args[0].integer; auto id = args[1].integer; glm::vec3 position(args[2].real, args[3].real, args[4].real); if( type == 21 ) { } if( position.z < -99.f ) { position = args.getWorld()->getGroundAtPosition(position); } auto character = args.getWorld()->createPedestrian(id, position + spawnMagic); /* Controller will give ownership to character */ new DefaultAIController(character); if ( args.getThread()->isMission ) { args.getState()->missionObjects.push_back(character->getGameObjectID()); } *args[5].globalInteger = character->getGameObjectID(); }
void game_create_character_in_vehicle(const ScriptArguments& args) { auto vehicle = static_cast<VehicleObject*>(args.getObject<VehicleObject>(0)); auto type = args[1].integer; RW_UNUSED(type); RW_UNIMPLEMENTED("game_create_character_in_vehicle(): character type"); auto id = args[2].integer; auto character = args.getWorld()->createPedestrian(id, vehicle->getPosition() + spawnMagic); new DefaultAIController(character); character->setCurrentVehicle(vehicle, 0); vehicle->setOccupant(0, character); *args[3].globalInteger = character->getGameObjectID(); }
void game_navigate_on_foot(const ScriptArguments& args) { auto character = static_cast<CharacterObject*>(args.getObject<CharacterObject>(0)); glm::vec3 target(args[1].real, args[2].real, 0.f); target = args.getWorld()->getGroundAtPosition(target); character->controller->skipActivity(); if( character->getCurrentVehicle() ) { // Since we just cleared the Activities, this will become current immediatley. character->controller->setNextActivity(new Activities::ExitVehicle); } character->controller->setNextActivity(new Activities::GoTo(target)); }