Author Topic: Can't get this spawnVehicle output event to work properly.  (Read 491 times)

NOTE: This is my first event add-on. The add-ons I've made before this was a playertype and a projectile and a vehicle that makes sound. I have very little experience.

So I'm making an output event that spawns a specified vehicle with a specified color, independent of a vehicle spawn brick. It's very early in the works so I haven't added any abuse checks or anything. Here's the code:

Code: [Select]
registerOutputEvent(fxDTSBrick,spawnVehicle,"dataBlock Vehicle" TAB "paintColor paintColor",1);

package spawnVehicleEvent
{
function fxDTSBrick::spawnVehicle(%this,%DataBlock,%paintColor)
{
%pos = %this.getWorldBoxCenter();
%vehicle = new WheeledVehicle()
{
position = %pos;
datablock = %DataBlock;
};
%vehicle.setColor(%paintColor);
}
};
activatepackage(SpawnVehicleEvent);

There are some issues with this tiny block of code:
- It breaks vehicle spawns (you can't spawn vehicles on vehicle bricks with the wrench)
- It can only spawn WheeledVehicleData types [I have solved this, but I would appreciate it if you could suggest methods other than an if-statement]
- /resetVehicles doesn't seem to work with non-physics vehicles such as the horse, meaning the only way to get rid of them is to kill them.

I know why it can only spawn WheeledVehicle types, because I've specified WheeledVehicle in this line:
Code: [Select]
%vehicle = new WheeledVehicle() If I set it to FlyingVehicle it can spawn magic carpets. If I set it to Player it can spawn rowboats and horses. If I set it to Vehicle it crashes the game. What should I put in there so that it can spawn all 3 of these vehicle types?

I've tried making if statements like this:
Code: [Select]
if(%datablock.classname == WheeledVehicleData)
if(%datablock.classname == FlyingVehicleData)
if(%datablock.classname == Armor)
But it says that they "always evaluate to 0" and usually just executes all of them. Any help on this would be greatly appreciated.

As for why it's breaking the vehicle spawns: I have absolutely no idea. When I try to spawn something with the wrench on a vehiclespawn, it gives me this:
Code: [Select]
BackTrace: -> [BotHolePackage]serverCmdSetWrenchData -> serverCmdSetWrenchData -> fxDTXBrick::setVehicle -> [spawnVehicleEvent]fxtDTSBrick::spawnVehicle

I'm also not sure what to do about the /resetVehicles dilemma. Any suggestions would be appreciated.
« Last Edit: November 07, 2015, 03:20:01 AM by Rally »

Elaborating further on the if statement issue:

If I use this code:
Code: [Select]
if(%datablock.classname == WheeledVehicleData)
{
%vehicle = new WheeledVehicle()
{
position = %pos;
datablock = %DataBlock;
};
%vehicle.setColor(%paintColor);
}

if(%datablock.classname == FlyingVehicleData)
{
%vehicle = new FlyingVehicle()
{
position = %pos;
datablock = %DataBlock;
};
%vehicle.setColor(%paintColor);
}

if(%datablock.classname == Armor)
{
%vehicle = new Player()
{
position = %pos;
datablock = %DataBlock;
};
%vehicle.setColor(%paintColor);
}

Then it works. I can spawn all 3 types of vehicles. Except it spits out all this garbage into the console, which is really undesirable:

Code: [Select]
Add-Ons/Item_Sports/support.cs (668): Unknown command dropBall.
  Object (21473) WheeledVehicle -> Vehicle -> Vehicle -> ShapeBase -> ShapeBase -> ShapeBase -> ShapeBase -> GameBase -> SceneObject -> NetObject -> SimObject
Add-Ons/Event_spawnVehicle/server.cs (31): Register object failed for object (null) of class WheeledVehicle.

Add-Ons/Event_spawnVehicle/server.cs (32): Unable to find object: '0' attempting to call function 'setColor'
BackTrace: ->[spawnVehicleEvent]fxDTSBrick::spawnVehicle

Add-Ons/Item_Sports/support.cs (668): Unknown command dropBall.
  Object (21474) FlyingVehicle -> Vehicle -> Vehicle -> ShapeBase -> ShapeBase -> ShapeBase -> ShapeBase -> GameBase -> SceneObject -> NetObject -> SimObject
Add-Ons/Event_spawnVehicle/server.cs (41): Register object failed for object (null) of class FlyingVehicle.

Add-Ons/Event_spawnVehicle/server.cs (42): Unable to find object: '0' attempting to call function 'setColor'
BackTrace: ->[spawnVehicleEvent]fxDTSBrick::spawnVehicle

Add-Ons/Event_spawnVehicle/server.cs (0): Unknown command setColor.
  Object (21475) Player -> Player -> Player -> Player -> Player -> Player -> Player -> Player -> Player -> Player -> Player -> Player -> ShapeBase -> ShapeBase -> ShapeBase -> ShapeBase -> GameBase -> SceneObject -> NetObject -> SimObject
Add-Ons/Event_spawnVehicle/server.cs (41): Register object failed for object (null) of class FlyingVehicle.

Add-Ons/Event_spawnVehicle/server.cs (42): Unable to find object: '0' attempting to call function 'setColor'
BackTrace: ->[spawnVehicleEvent]fxDTSBrick::spawnVehicle

Add-Ons/Event_spawnVehicle/server.cs (51): Register object failed for object (null) of class Player.

Add-Ons/Event_spawnVehicle/server.cs (0): Unable to find object: '0' attempting to call function 'setColor'
BackTrace: ->[spawnVehicleEvent]fxDTSBrick::spawnVehicle

Add-Ons/Event_spawnVehicle/server.cs (31): Register object failed for object (null) of class WheeledVehicle.

Add-Ons/Event_spawnVehicle/server.cs (32): Unable to find object: '0' attempting to call function 'setColor'
BackTrace: ->[spawnVehicleEvent]fxDTSBrick::spawnVehicle

Add-Ons/Event_spawnVehicle/server.cs (51): Register object failed for object (null) of class Player.

Add-Ons/Event_spawnVehicle/server.cs (0): Unable to find object: '0' attempting to call function 'setColor'
BackTrace: ->[spawnVehicleEvent]fxDTSBrick::spawnVehicle

If I turn it into an "if else" statement, everything breaks and I can no longer spawn all three and I can only spawn what ever is in the first "if" statement.

EDIT: Well I fixed the if statements. Turns out I was supposed to use $= instead of == because %datablock.classname is a string. Oops.

EDIT 2: I fixed the broken vehicle spawns by adding this parent to the spawnVehicle function
Code: [Select]
Parent::spawnVehicle(%this,%DataBlock,%paintColor);
Now I've remembered something that I forgot: Rotation. Not sure how to get the vehicle to spawn rotated to the bricks rotation. I may legitimately just add a rotation vector to the event.

EDIT 3: Changed new Player() to new AIPlayer() and now spawned armor objects can be deleted with /clearbots. They also now activate bot related input events.
« Last Edit: November 07, 2015, 10:48:17 AM by Rally »