Back to Index Page generated: Apr 20, 2026, 4:52:50 AM

Expansion Oo-Haul

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Adds escort missions from Constores Adds escort missions from Constores
Identifier oolite.oxp.DrNil.Oo-Haul oolite.oxp.DrNil.Oo-Haul
Title Oo-Haul Oo-Haul
Category Missions Missions
Author Dr. Nil Dr. Nil
Version 2.1 2.1
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
  • oolite.oxp.DrNil.YAH:4.5
  • oolite.oxp.DrNil.YAH:4.5
  • Optional Expansions
    Conflict Expansions
    Information URL https://wiki.alioth.net/index.php/Oo-Haul n/a
    Download URL https://wiki.alioth.net/img_auth.php/6/6d/Oo-Haul.oxz n/a
    License CC-BY-NC-SA 3.0 CC-BY-NC-SA 3.0
    File Size n/a
    Upload date 1774827831

    Documentation

    Also read http://wiki.alioth.net/index.php/Oo-Haul

    Read_me.txt

    Zz-Oo-HAUL expansion pack for Giles Williams' Oolite
    by Dr. Nil, Updated by Eric Walch, Ark and phkb
    
    Escort missions offered at Pi-42s plus a new cargo hauler for players and NPCs.
    
        * Tired of zipping from station to station in 2-3 minutes?
        * Remember those relaxing flights trapped behind one Anaconda after the other?
        * Remember before you knew tricks like fuel injection and avoiding trade lanes?
        * Has your gaming experience become as hurried and stressful as everyday life?
    
    Now you can earn your Credits while rediscovering the joy of Oolite played as a space simulator!
    
    Due to their wage policies the Oo-Haul Corporation is constantly struck by strikes among their 
    escort pilots. You can profit from this! The Oo-Haul emergency contracts (which were originally 
    made to deal with the event when escorts got lost in witchspace) pay scabs a lot better than 
    what the corporation could have gotten away with, had they not upset the unions. And space being 
    a really hard place to stage a picket, the unions voted to go Zero-G Bowling instead of even trying.
    
    The randomly offered Oo-Haul escort missions in this OXP are best played with some nice music, 
    a good cup of your favorite drink and a lot of time. Prepare to use about an hour in flight if 
    you accept an Oo-Haul contract. Oh, and do remember that these are escort missions and as it is 
    in the security business, the endless minutes of quietly watching the monitor may suddenly be 
    interrupted by red hot action. And then again, they may not.
    
    The name and logo is from an ad by DaddyHoggy in Your Ad Here set 1.
    
    March 2026
    v2.1 by phkb
    - Darkened the Oohauler main texture a touch.
    
    v2.0 by phkb
    - Added manifest.plist, removed deprecated plist files.
    - Updated textures, adding normal, specular and emission maps
    - Converted plist script file to JavaScript.
    - Added checks for when the player attacks the Oo-Hauler.
    - Added links to GalCop Missions reputations.
    - Spelling corrections.
    
    Shipping container images by Brgfx on Freepik.com
    https://www.freepik.com/free-vector/blue-shipping-container-illustration_415727946.htm
    https://www.freepik.com/free-vector/colorful-shipping-containers-illustration_414135285.htm
    
    
    February 2009
    v1.6 by Eric Walch & Ark, February 21th 2009
    changes since v1.5
    - change the name of the oxp folder from zz-oohaul into oohaul (never worked as intended since it 
      was based on the wrong assumption that the scripts are loaded in an alphabetical order) and added 
      a delay to the script plist on entering the system to ensure that the oohaul script will run after 
      youradhere script
    - Escort missions are now offered by all constores and not only by pi-42s
    - change the pi-42 clerk into constore clerk 
    - remove the pi-42 logo from the texture of the constore clerk
    - change the messages of constore clerk inside the descriptions plist
    - fix several bugs in the AI of constore clerk
    - Better fix for "The L-Crates do no leave scoopable cargo when destroyed" bug via the use of JS 
    - add mission info in the F5 screen
    - added a debrief mission screen when the player docs at the main station
    - Changed all XML formats in the much easier readable ascii format
    - added a requires plist (the new version needs oolite ver 1.72.1 and above)
    - Several improvements and bugfixes to the oohaulmisgoAI.plist
    - Remove the oohaulAI.plist and change it in the shipdata.plist with the build-in route1traderAI.plist  
    - Numerous improvements to the script.plist
    - Some bug-fixes to the shipdat.plist
    - added a pirate-victim-roles.plist
    
    INSTALLATION:PLEASE REMOVE THE ZZ-OOHAUL.OXP BEFORE INSTALLING THIS VERSION
    
    February 2007
    
    The L-Crates now leave scoopable cargo when destroyed - as they were supposed to all along.
    
    January 2007
    
    This version has:
    
    A player and an NPC ship.
    Escort missions randomly offered at Pi-42s (needs Your Ad Here.oxp).
    
    If you've already got Oo-Haul.oxp installed, you should delete it before installing this new
    version.
    
    The name and logo is from an ad by DaddyHoggy in Your Ad Here set 1.
    
    Oo-HAUL
    
    v1.5 by Dr. Nil, January 19th 2007
    

    Equipment

    This expansion declares no equipment.

    Ships

    Name
    Con Store Clerk
    L-Crate
    Oo-Haul Crate
    Oo-Haul Crate
    Cargo container
    L-Crate Transporter
    Oo-Hauler
    oohaulermis
    oohaulermisgo

    Models

    This expansion declares no models.

    Scripts

    Path
    Config/script.js
    "use strict";
    this.name = "oohaul_missions";
    this.author = "phkb";
    this.copyright = "(c) 2026 phkb";
    this.description = "Oo-Haul mission script"; 
    this.version = "1.0";
    this.license = "CC-BY-NC-SA 3.0";
    
    //-------------------------------------------------------------------------------------------------------------
    this.startUpComplete = function() {
        // make sure we have an integer in the rep_counter variable
        if (missionVariables.oohaul_rep_counter == null) {
            missionVariables.oohaul_rep_counter = 25;
        } else {
            missionVariables.oohaul_rep_counter = parseInt(missionVariables.oohaul_rep_counter);
        }
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.shipLaunchedFromStation_hold = function() {
        if (this.oohauler) {
            this.oohauler.beaconLabel = this.oohauler.displayName;
            this.oohauler = null;
            delete this.shipLaunchedFromStation;
        }    
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.shipExitedWitchspace = function() {
        if (missionVariables.oohaul_mis_stage === "2" || missionVariables.oohaul_mis_stage === "3") {
            mission.setInstructions(null, this.name);
            missionVariables.oohaul_mis_stage = null;
            missionVariables.oohaul_rep_counter = 20;
            if (missionVariables.oohaul_mis_done === "TRAITOR") missionVariables.oohaul_rep_counter = 2000;
            missionVariables.oohaul_mis_done = null;
        }
        
        missionVariables.oohaul_rep_counter -= 1;
    
        if (missionVariables.oohaul_rep_counter < 1) {
            if (Math.random() > 0.7 && player.score > 31) {
                if (system.countShipsWithRole("constore") > 0) {
                    system.addShips("Constoreclerk", 1, Vector3D(0, 0, 1.01).fromCoordinateSystem("pwu"));
                    missionVariables.oohaul_mis_stage = "1";
                }
            }
        }
    }
    
    //-------------------------------------------------------------------------------------------------------------
    this.missionScreenOpportunity = function() {
        if (player.ship.dockedStation.hasRole("constore") && missionVariables.oohaul_mis_stage === "1") {
            var msgKey = "oohaul_esc_desc_hidanger";
            missionVariables.oohaul_credits = 4330;
            missionVariables.oohaul_mis_stage = "2";
    
            if (system.government > 3) {
                msgKey = "oohaul_esc_desc_lodanger";
                missionVariables.oohaul_redits = 2776;
            }
    
            mission.runScreen({
                titleKey: "oohaul_title",
                messageKey: msgKey,
                choicesKey: "oohaul_esc_choice",
                model: "oohauler"
            },
                function(choice) {
                    if (!choice || choice == "NO") {
                        missionVariables.oohaul_mis_stage = null;
                        missionVariables.oohaul_credits = null;
                    } else {
                        var oohaul = system.addShips("oohaulermisgo", 1, Vector3D(0, 0, 1.05).fromCoordinateSystem("pwu"));
                        if (!oohaul || oohaul.length == 0) {
                            mission.runScreen({
                                titleKey: "oohaul_title",
                                messageKey: "oohaul_spawn_fail",
                                model: "oohauler"
                            });
                            missionVariables.oohaul_mis_stage = null;
                        } else {
                            mission.setInstructionsKey("oohaul_esc_desc_short", this.name);
                            // make sure the player can keep up
                            if (oohaul[0].maxSpeed > player.ship.maxSpeed) {
                                oohaul[0].maxSpeed = player.ship.maxSpeed - 5;
                            }
                            this.shipLaunchedFromStation = this.shipLaunchedFromStation_hold;
                            this.oohauler = oohaul[0];
                            missionVariables.oohaul_mis_stage = "3";
                            missionVariables.oohaul_cargo = 3;
                            player.ship.launch();
                        }
                    }
                }
            );
        }
    
        if (player.ship.dockedStation.isMainStation && missionVariables.oohaul_mis_stage === "3") {
            if (missionVariables.oohaul_mis_done === "YES") {
                missionVariables.oohaul_mis_done = null;
                player.credits += parseInt(missionVariables.oohaul_credits);
                missionVariables.oohaul_rep_counter = 20;
                mission.runScreen({
                    titleKey: "oohaul_title",
                    message: expandMissionText("oohaul_esc_desc_docked", {station_name: player.ship.dockedStation.name}),
                });
                mission.setInstructions(null, this.name);
                missionVariables.oohaul_credits = null;
                missionVariables.oohaul_mis_stage = null;
                if (worldScripts.GalCopBB_Reputation) {
                    var rep = worldScripts.GalCopBB_Reputation;
                    rep.$adjustReputationForEntity(expandDescription("[gcm_reputation_localgov]"), system.ID, "Success", 1, 1);
                }
            }
            if (missionVariables.oohaul_mis_done === "TRAITOR") {
                missionVariables.oohaul_rep_counter = 2000;
                mission.runScreen({
                    titleKey: "oohaul_title",
                    messageKey: "oohaul_traitor",
                });
                mission.setInstructions(null, this.name);
                missionVariables.oohaul_credits = null;
                missionVariables.oohaul_mis_stage = null;
                if (worldScripts.GalCopBB_Reputation) {
                    var rep = worldScripts.GalCopBB_Reputation;
                    rep.$adjustReputationForEntity(expandDescription("[gcm_reputation_localgov]"), system.ID, "Failed", 1, 1);
                }
            }
        }
    }
    Scripts/oohaulcargo.js
    "use strict";
    this.name = "oohaulcargo";
    this.author = "Ark";
    this.copyright = "� 2009 Ark.";
    this.description = "Code for spawn oohaul cargo";
    this.version = "1.0";
    this.licence = "CC-BY-NC-SA 3.0";
    
    this.shipDied = function (whom, why) {
        this.ship.owner.spawn("oohaulcargo", 10);
        if (this.ship.owner.primaryRole == "oohaulermisgo") {
            if (whom.isPlayer) {
                missionVariables.oohaul_credits = 0;
                missionVariables.oohaul_mis_done = "TRAITOR";
            } else {
                missionVariables.oohaul_credits -= 500 // decrement credits with 500 on each death. 
                if (--missionVariables.oohaul_cargo <= 0) missionVariables.oohaul_credits = 500  // decrement by one. And when zero set credits to 500. 
            }
        }
    }
    Scripts/oohauler.js
    "use strict";
    this.name = "oohauler_script";
    this.author = "phkb";
    this.copyright = "(c) 2026 phkb";
    this.description = "Code for oohauler ship";
    this.version = "1.0";
    this.licence = "CC-BY-NC-SA 3.0";
    
    this.missionComplete = function() {
        if (missionVariables.mission_oohaul_mis_done !== "TRAITOR") {
            missionVariables.mission_oohaul_mis_done = "YES";
            this.ship.commsMessage(expandDescription("[oohaulthanks]"));
        }
    }