Fractal Softworks Forum

Please login or register.

Login with username, password and session length
Advanced search  

News:

Starsector 0.97a is out! (02/02/24); New blog post: Simulator Enhancements (03/13/24)

Author Topic: Custom Fleets?  (Read 3489 times)

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Custom Fleets?
« on: January 07, 2015, 05:34:36 AM »

So..I make this file and place it in scripts

Code
package com.fs.starfarer.api.impl.campaign.fleets;

import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.campaign.CampaignFleetAPI;
import com.fs.starfarer.api.campaign.FleetAssignment;
import com.fs.starfarer.api.campaign.FleetDataAPI;
import com.fs.starfarer.api.campaign.LocationAPI;
import com.fs.starfarer.api.campaign.SectorEntityToken;
import com.fs.starfarer.api.fleet.FleetMemberAPI;
import com.fs.starfarer.api.fleet.FleetMemberType;
import com.fs.starfarer.api.impl.campaign.ids.Factions;

public class CustomFleets {

/**
* To add a new fleet:
* 1) Make a copy of this method
* 2) Call it from spawn()
*/
private void spawnVNSFleet() {
CampaignFleetAPI fleet = Global.getFactory().createEmptyFleet(Factions.VNS, "1st Fleet", true);

FleetDataAPI data = fleet.getFleetData();
FleetMemberAPI member = null;

// add a fleet member with a custom name
member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "archangel_standard");
member.setShipName("VNS Archangel");
data.addFleetMember(member);

// add a ship and a fighter
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_avenger_mk2_strikeE"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_prometheus_standard"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_dedalus_standard"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_fury_std"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_cobra2_assault2"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_cobra2_assault2"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "ASF14_wing"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "ASF14_wing"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "PhnI_Spec_wing"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "PhnI_Spec_wing"));
data.addFleetMember(Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "Armageddon_wing"));



// makes fleet not need supplies or fuel or crew
FleetFactory.finishAndSync(fleet);

// add fleet to a star system and set its location
LocationAPI location = Global.getSector().getStarSystem("vanyar");
location.addEntity(fleet);

SectorEntityToken planet = location.getEntityById("avalon");
fleet.setLocation(planet.getLocation().x, planet.getLocation().y - 500);

// give the fleet an assignment (1000000f days ~= forever)
// the fleet tooltip will show it as "<relationship level>, doing something" - i.e. "Neutral, doing something"
fleet.getAI().addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, planet, 1000000f, "defending Avalon", null);
}


/**
* This is called from CoreCampaignPluginImpl.onNewGameAfterTimePass().
*/
public void spawn() {
spawnVNSFleet();
}
}

doesn't work. Java compile error.

Can anyone help?
Logged

Nicke535

  • Commander
  • ***
  • Posts: 240
  • Degenerate Core
    • View Profile
Re: Custom Fleets?
« Reply #1 on: January 07, 2015, 07:49:21 AM »

Did you rename "CustomFleets" to whatever your file was named?

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Re: Custom Fleets?
« Reply #2 on: January 08, 2015, 03:34:25 AM »

the class?

Oh.. I'll have to check. At work ATM.
Logged

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Re: Custom Fleets?
« Reply #3 on: January 08, 2015, 03:45:18 PM »

Checked. The name of the class and the file is the same, "VNSMainFleet"
Logged

Okim

  • Admiral
  • *****
  • Posts: 2161
    • View Profile
    • Okim`s Modelling stuff
Re: Custom Fleets?
« Reply #4 on: January 12, 2015, 01:20:19 AM »

If you are making a fleet for your Ironclads mod`s mod ( :) ) you can use FleetSpawner and TimeManager to create any fleets of any size/composition anywhere you wish with whatever objectives you wish.

There are already several custom fleets in it that you can use (like patrols or invaders) that are spawned at some interval.
« Last Edit: January 12, 2015, 01:25:21 AM by Okim »
Logged

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Re: Custom Fleets?
« Reply #5 on: January 12, 2015, 08:34:47 AM »

I know, but AFAIK, I can't really customize those fleets to my liking.

I can tell it to use 2 mediums, but can't tell it which exactly (especially not a ship that isn't normally buyable..like for example, the Dreadnought), or give those ships a name.
Logged

Okim

  • Admiral
  • *****
  • Posts: 2161
    • View Profile
    • Okim`s Modelling stuff
Re: Custom Fleets?
« Reply #6 on: January 12, 2015, 10:31:34 AM »

Look at the miner spawning function. It manually adds a couple of specific mining ships to the fleet by using this:

Quote
FleetMemberAPI member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "ftg5-min-harvester_variant");

You can use the basic FleetMemberAPI functions to add a name, crew level and even a specific person to that ship (and many other options). For example, to set the specific name you`ll have to write: member.setShipName("new_ship_name");

Here is a pic with most of the available options for the ship created this way:

Spoiler
[close]

After you`ve done adding stuff to this ship don`t forget to add it to a fleet like this:

Quote
miner_fleet.getFleetData().addFleetMember(member);

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Re: Custom Fleets?
« Reply #7 on: January 12, 2015, 01:00:36 PM »

Do I have to do the whole
            FleetMemberAPI member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "");
       vns_firstfleet.getFleetData().addFleetMember(member);

For every single ship I want to specify by varriant? Or can I do like in the below code?


Code
	public static void vnsmain_spawner()
    {

        int vns_mainfleet = getSector().getEntitiesWithTag("vns_mainfleet").size();
        String array [] = isa_mining_sites;

        if (vns_mainfleet < 1)
        {
 
            String dest_name = "vaynar";
            String home_name = "avalon";
            SectorEntityToken home = getSector().getEntityById(home_name);
            SectorEntityToken dest = getSector().getEntityById(dest_name);

            home = getSector().getEntityById("avalon");
            log.info("Spawning VNS main fleet in Vaynar.");


            CampaignFleetAPI vns_firstfleet = FleetFactory.createGenericFleet("VNS", "1st Fleet", 1, 250);
                vns_firstfleet.addTag("vns_mainfleet");

            getSector().getFaction("VNS").pickShipAndAddToFleet(ShipRoles.FREIGHTER_MEDIUM, 1, vns_firstfleet);
            getSector().getFaction("VNS").pickShipAndAddToFleet(ShipRoles.TANKER_MEDIUM, 1, vns_firstfleet);


            FleetMemberAPI member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_archangel_standard");
member.setShipName("VNS Archangel");
member.setFlagship(true);
vns_firstfleet.getFleetData().addFleetMember(member);

            FleetMemberAPI member2 = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_cobra2_assault2");
vns_firstfleet.getFleetData().addFleetMember(member2);    
            FleetMemberAPI member3 = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_cobrax_advanced");
vns_firstfleet.getFleetData().addFleetMember(member3);
            FleetMemberAPI member4 = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_cobrax_advanced");
vns_firstfleet.getFleetData().addFleetMember(member4);
            FleetMemberAPI member5 = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "vns_dedalus_standard");
vns_firstfleet.getFleetData().addFleetMember(member5);

            FleetMemberAPI member6 = Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "ASF14E_wing");
vns_firstfleet.getFleetData().addFleetMember(member6);
            FleetMemberAPI member7 = Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, "PhnI_Spec_wing");
vns_firstfleet.getFleetData().addFleetMember(member7);



            vns_firstfleet.getCargo().addCrew(CargoAPI.CrewXPLevel.ELITE, (int)(vns_firstfleet.getCargo().getMaxPersonnel()));
            vns_firstfleet.getCargo().addSupplies(vns_firstfleet.getCargo().getMaxCapacity()/3);
            vns_firstfleet.getCargo().addFuel(vns_firstfleet.getCargo().getMaxFuel());

            vns_firstfleet.getFleetData().sort();
            FleetFactory.finishAndSync(vns_firstfleet);


            home.getContainingLocation().addEntity(vns_firstfleet);
            vns_firstfleet.setLocation(home.getLocation().x + 0, home.getLocation().y + 0);
            vns_firstfleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, home, 3, "preparing for duty");
            vns_firstfleet.addAssignment(FleetAssignment.DEFEND_LOCATION, home, 14, "patrolling around "+home.getName());
            vns_firstfleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, home, 3, "standing down from duty");
            vns_firstfleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, home, 1000, "returning to "+home.getName());
            vns_firstfleet.setPreferredResupplyLocation(home);


            log.info("Spawned VNS main fleet in Vaynar");
        }
    }

EDIT:

After several trials and fixes, the game didn't crash.
Still, is there a simpler way to add ships, wihtout having to go member1, member2, member3, etc...
« Last Edit: January 12, 2015, 01:26:13 PM by TrashMan »
Logged

Okim

  • Admiral
  • *****
  • Posts: 2161
    • View Profile
    • Okim`s Modelling stuff
Re: Custom Fleets?
« Reply #8 on: January 12, 2015, 11:52:03 PM »

You can specify all the required ships in an array (see how this is done in the bottom of the FleetSpawner file for different locations) and then just use a single 'for' to put each ship from the array to your fleet. The script will look like this:

Quote
public static void vns_spawner() //your fleet spawner function
{
CampaignFleetAPI vns_fleet = FleetFactory.createGenericFleet("faction_id", "fleet_name", quality, number_of_fleet_points); //your fleet data, don`t forget to fill every value
String var_array [] = vns_ships; //array of your ship variants
String name_array [] = vns_names; //array of your ship names

FleetMemberAPI member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, "some_basic_variant"); //just to initialize the 'member', this will be replaced later

for (int i = 0 ; i < var_array .length; i++) //this thing adds every single variant from the first array and assigns the corresponding names from the second one. You can make a single large array to contain both - a variant and the name, but a have no example of these right now as I don`t recall working with them.

                {
                    if (vns_array.contains("wing")) {member = Global.getFactory().createFleetMember(FleetMemberType.FIGHTER_WING, vns_array);} //checks if the specified variant is a wing
                    else {member = Global.getFactory().createFleetMember(FleetMemberType.SHIP, vns_array);}

                    member.setShipName(name_array); //not sure if it is possible to assign names to wings
                    member.setCrewXPLevel(CargoAPI.CrewXPLevel.ELITE);                   

                    vns_fleet.getFleetData().addFleetMember(member);
                }

// after each member has been added you need to specify assignments, locations and etc. as shown in mining script (you can add scripts to certain assignments).

}




//below are the arrays you`ll need to fill:

private static String [] vns_ships =
            {
                    "variant_id1';
                    "variant_id2';
                    "wing_id1";
            };

private static String [] vns_names =
            {
                    "ship_name1';
                    "ship_name2';
                    "wing_name1";
            };

I strongly suggest you to install some java utility program like InteljIDEA or NetBeans. Saves a lot of time you usually spend on trial&error attempts by providing real-time suggestions/fillers while you type your code.

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Re: Custom Fleets?
« Reply #9 on: January 13, 2015, 01:15:13 AM »

Thanks. I'll give it a look when I get back home.


So far the game works normally (started a new game) but the fleet is nowhere to be seen. Yet the only condition it checks is weather there already is a feet with the same flag present. Odd.
Logged

Okim

  • Admiral
  • *****
  • Posts: 2161
    • View Profile
    • Okim`s Modelling stuff
Re: Custom Fleets?
« Reply #10 on: January 13, 2015, 02:15:27 AM »

Thanks. I'll give it a look when I get back home.


So far the game works normally (started a new game) but the fleet is nowhere to be seen. Yet the only condition it checks is weather there already is a feet with the same flag present. Odd.

Don`t forget that my FleetSpawners require to be called from the TimeManager script provided in the same data/scripts/world folder. There are hourly, daily, weekly, monthly and even yearly intervals options there. Or you can use custom time checks in advance() method inside it.

TrashMan

  • Admiral
  • *****
  • Posts: 1325
    • View Profile
Re: Custom Fleets?
« Reply #11 on: January 13, 2015, 10:32:05 AM »

What confuses me is that it keeps calling in the same variable "member"... Shouldn't it be member1, member2, member3, etc?

I had to change that for my current script, because it threw a fit if more than 1 "member" was specified. Or does it do that automatically in a for loop?

Doesn't matter, once I tweaked the Time Manager, the fleet appeared.. thanks Okim.
Logged

Okim

  • Admiral
  • *****
  • Posts: 2161
    • View Profile
    • Okim`s Modelling stuff
Re: Custom Fleets?
« Reply #12 on: January 14, 2015, 03:30:11 AM »

No problem.