示例#1
1
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;
}
示例#2
0
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();
}
示例#3
0
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;
}
示例#4
0
文件: VMModule.cpp 项目: darkf/openrw
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;
}
示例#5
0
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();
}
示例#6
0
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);
}
示例#7
0
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];
}
示例#8
0
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;
}
示例#9
0
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;
}
示例#10
0
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));
}
示例#11
0
void game_destroy_pickup(const ScriptArguments& args)
{
	PickupObject* pickup = static_cast<PickupObject*>(args.getObject<PickupObject>(0));
	
	if ( pickup )
	{
		args.getWorld()->destroyObjectQueued(pickup);
	}
}
示例#12
0
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();
}
示例#13
0
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();
}
示例#14
0
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;
}
示例#15
0
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;
}
示例#16
0
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();
}
示例#17
0
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;
}
示例#18
0
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;
}
示例#19
0
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();
}
示例#20
0
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();
}
示例#21
0
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));
}
示例#22
0
bool game_objects_in_volume(const ScriptArguments& args)
{
	glm::vec3 vec1(args[0].real, args[1].real, args[2].real);
	glm::vec3 vec2(args[3].real, args[4].real, args[5].real);
	glm::vec3 min = glm::min(vec1, vec2);
	glm::vec3 max = glm::max(vec1, vec2);
	
	bool solids = args[6].integer;
	bool cars = args[7].integer;
	bool actors = args[8].integer;
	bool objects = args[9].integer;
	bool particles = args[10].integer;
	RW_UNUSED(objects);
	RW_UNUSED(particles);
	
	for(auto& object : args.getWorld()->allObjects)
	{
		switch( object->type() )
		{
			case GameObject::Instance:
				if( !solids ) continue;
				break;
			case GameObject::Character:
				if( !actors ) continue;
				break;
			case GameObject::Vehicle:
				if( !cars ) continue;
				break;
			default:
				continue;
		}
		
		// Maybe consider object bounds?
		auto pp = object->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 )
		{
			return true;
		}
	}
	return false;
}
示例#23
0
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;
		}
	}
}
示例#24
0
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;
}
示例#25
0
void game_change_nearest_model(const ScriptArguments& args)
{
	glm::vec3 position(args[0].real, args[1].real, args[2].real);
	float radius = args[3].real;
	int newid = 0, oldid = 0;
	
	/// @todo fix this being a problem.
	switch(args[4].type) {
		case TInt8:
			oldid = (std::int8_t)args[4].integer;
			break;
		case TInt16:
			oldid = (std::int16_t)args[4].integer;
			break;
		default:
			RW_ERROR("Unhandled integer type");
			break;
	}
	
	switch(args[5].type) {
		case TInt8:
			newid = (std::int8_t)args[5].integer;
			break;
		case TInt16:
			newid = (std::int16_t)args[5].integer;
			break;
		default:
			RW_ERROR("Unhandled integer type");
			break;
	}
	
	if( std::abs(newid) > 178 || std::abs(oldid) > 178 ) {
		/// @todo implement this path,
		return;
	}
	
	std::string newmodel;
	std::string oldmodel;
	
	if(newid < 0) newid = -newid;
	if(oldid < 0) oldid = -oldid;
	
	newmodel = args.getVM()->getFile()->getModels()[newid];
	oldmodel = args.getVM()->getFile()->getModels()[oldid];
	std::transform(newmodel.begin(), newmodel.end(), newmodel.begin(), ::tolower);
	std::transform(oldmodel.begin(), oldmodel.end(), oldmodel.begin(), ::tolower);
	
	auto newobjectid = args.getWorld()->data->findModelObject(newmodel);
	auto nobj = args.getWorld()->data->findObjectType<ObjectData>(newobjectid);
	
	/// @todo Objects need to adopt the new object ID, not just the model.
	for(auto p : args.getWorld()->instancePool.objects) {
		auto o = p.second;
		if( !o->model ) continue;
		if( o->model->name != oldmodel ) continue;
		float d = glm::distance(position, o->getPosition());
		if( d < radius ) {
			args.getWorld()->data->loadDFF(newmodel + ".dff", false);
			InstanceObject* inst = static_cast<InstanceObject*>(o);
			inst->changeModel(nobj);
			inst->model = args.getWorld()->data->models[newmodel];
		}
	}
}
示例#26
0
void game_create_pickup(const ScriptArguments& args)
{
	glm::vec3 pos (args[2].real, args[3].real, args[4].real);
	int id;
	int type = args[1].integer;
	
	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");
			*args[5].globalInteger = 0;
			return;
	}
	
	if ( id < 0 )
	{
		id = -id;
		
		auto model = args.getVM()->getFile()->getModels()[id];
		std::transform(model.begin(), model.end(), model.begin(), ::tolower);
	
		id = args.getWorld()->data->findModelObject(model);
		args.getWorld()->data->loadDFF(model+".dff");
		args.getWorld()->data->loadTXD("icons.txd");
	}
	else
	{
		auto data = args.getWorld()->data->findObjectType<ObjectData>(id);
		
		if ( ! ( id >= 170 && id <= 184 ) )
		{
			args.getWorld()->data->loadDFF(data->modelName+".dff");
		}
		args.getWorld()->data->loadTXD(data->textureName+".txd");
	}
	
	PickupObject* pickup = nullptr;

	if ( id >= 170 && id <= 184 )
	{
		// Find the item for this model ID
		auto world = args.getWorld();
		InventoryItem *item = nullptr;
		for (auto i = 0; i < maxInventorySlots; ++i)
		{
			item = world->getInventoryItem(i);
			if (item->getModelID() == id) {
				auto pickuptype = (PickupObject::PickupType)type;
				pickup = new ItemPickup(args.getWorld(), pos, pickuptype, item);
				world->pickupPool.insert( pickup );
				world->allObjects.push_back(pickup);
				*args[5].globalInteger = pickup->getGameObjectID();
			}
		}
	}
	else
	{
		RW_UNIMPLEMENTED("non-item pickups");
		*args[5].globalInteger = 0;
	}
	
}