Back to Index Page generated: Jun 13, 2026, 7:54:52 PM

Expansion Camera Drones

Content

Manifest

from Expansion Manager's OXP list from Expansion Manifest
Description Drone cameras which provide a variety of alternative external views for your ship Drone cameras which provide a variety of alternative external views for your ship
Identifier oolite.oxp.cim.camera-drones oolite.oxp.cim.camera-drones
Title Camera Drones Camera Drones
Category Equipment Equipment
Author cim cim
Version 1.4 1.4
Tags
Required Oolite Version
Maximum Oolite Version
Required Expansions
Optional Expansions
Conflict Expansions
Dependent Expansions
  • oolite.oxp.Norby.Ambience_Collection:1.3
  • Information URL http://wiki.alioth.net/index.php/Camera_Drones n/a
    Download URL https://cim.sotl.org.uk/games/files/oolite/CameraDrones_1.4.oxz http://compsoc.dur.ac.uk/~cim/oolite/Camera_Drones_1.4.oxz
    License CC-BY-SA 3.0 CC-BY-SA 3.0
    File Size n/a
    Upload date 1403455179

    Relationships Diagram

    Documentation

    Also read http://wiki.alioth.net/index.php/Camera%20Drones

    Equipment

    Name Visible Cost [deci-credits] Tech-Level
    Camera Drones yes 10000 8+

    Ships

    This expansion declares no ships.

    Models

    This expansion declares no models.

    Scripts

    Path
    Scripts/camera_drone_equip.js
    this.author      = "cim"; 
    this.copyright   = "� 2011-2014 cim."; 
    this.licence = "CC-BY-SA 3.0";
    this.version     = "1.4"; 
    this.name = "Camera Drones equipment script";
    
    this.activated = function() {
    		worldScripts["Camera Drones"]._toggle.bind(worldScripts["Camera Drones"])();
    }
    
    this.mode = function() {
    		worldScripts["Camera Drones"]._cycle.bind(worldScripts["Camera Drones"])();
    }
    
    
    
    Scripts/camera_drones.js
    this.author      = "cim"; 
    this.copyright   = "� 2011-2014 cim."; 
    this.licence = "CC-BY-SA 3.0";
    this.version     = "1.4"; 
    this.name = "Camera Drones";
    
    this.startUp = function() {
    		this.$camActive = 0;
    		this.$camFunctions = new Array;
    		this.$track = null;
    
    		this._registerCamera({name:"Missile Camera",
    													cameraPosition:this._missileCamPosition.bind(this),
    													cameraVector:this._missileCamDirection.bind(this)});
    		this._registerCamera({name:"Flyby Camera (fast)",
    													initialisation:this._flybyCamInit.bind(this),
    													update:this._flybyCamUpdate.bind(this),
    													cameraPosition:this._flybyCamPosition.bind(this),
    													cameraVector:this._flybyCamDirection.bind(this)});
    		this._registerCamera({name:"Flyby Camera (medium)",
    													initialisation:this._flybyCamInit.bind(this),
    													update:this._flybyCamUpdate2.bind(this),
    													cameraPosition:this._flybyCamPosition.bind(this),
    													cameraVector:this._flybyCamDirection.bind(this)});
    		this._registerCamera({name:"Flyby Camera (slow)",
    													initialisation:this._flybyCamInit.bind(this),
    													update:this._flybyCamUpdate3.bind(this),
    													cameraPosition:this._flybyCamPosition.bind(this),
    													cameraVector:this._flybyCamDirection.bind(this)});
    		this._registerCamera({name:"Flyby Camera (long)",
    													initialisation:this._flybyCamInit2.bind(this),
    													update:this._flybyCamUpdate4.bind(this),
    													cameraPosition:this._flybyCamPosition.bind(this),
    													cameraVector:this._flybyCamDirection.bind(this)});
    		this._registerCamera({name:"Docking Camera",
    													initialisation:this._dockingCamInit.bind(this),
    													cameraPosition:this._dockingCamPosition.bind(this),
    													cameraVector:this._dockingCamDirection.bind(this)});
    		this._registerCamera({name:"Target Camera",
    													cameraPosition:this._targetCamPosition.bind(this),
    													cameraVector:this._targetCamDirection.bind(this)});
    		this._registerCamera({name:"Target Follow Camera",
    													cameraPosition:this._targetFollowCamPosition.bind(this),
    													cameraVector:this._targetFollowCamDirection.bind(this)});
    		this._registerCamera({name:"Target Lead Camera",
    													cameraPosition:this._targetLeadCamPosition.bind(this),
    													cameraVector:this._targetLeadCamDirection.bind(this)});
    
    
    }
    
    this.equipmentDamaged = function(equip) {
    		if (equip == "EQ_CAMERA_DRONES") {
    				this._deactivate();
    		}
    }
    
    this._toggle = function() {
    		if (this.$camActive) {
    				this._deactivate();
    		} else {
    				this._activate();
    		}
    }
    
    this._deactivate = function() {
    		if (this.$camActive) {
    				this.$camActive = 0;
    				this._resetCamera();
    				removeFrameCallback(this.$track);
    				player.consoleMessage("Drone camera deactivated");
    		}
    }
    
    this._activate = function() {
    		this.$track = addFrameCallback(this._track.bind(this));
    		this.$camActive = 1;
    		player.consoleMessage("Drone camera activated: external view to watch");
    }
    
    this._resetCamera = function() {
    		if (player.ship.viewDirection != "VIEW_CUSTOM") { return; }
    		player.ship.setCustomView([0,0,player.ship.collisionRadius*-5],[1,0,0,0]);
    }
    
    
    this._track = function(delta) {
    		if (player.ship.viewDirection != "VIEW_CUSTOM") { return; }
    
    		var tracker = this.$camFunctions[0];
    		
    		if (tracker.update) {
    				tracker.update(delta);
    		}
    
    		var pos = tracker.cameraPosition();
    		if (pos == null) {
    				this._deactivate();
    				return;
    		}
    		pos = pos.subtract(player.ship.position);
    
    		var posipcc = new Vector3D(0,0,0);
    		var px = player.ship.vectorRight;
    		var py = player.ship.vectorUp;
    		var pz = player.ship.vectorForward;
    
    // if you understand quaternions there is probably an easier way to do this!
    		posipcc.x = pos.x * px.dot([1,0,0]) + pos.y * px.dot([0,1,0]) + pos.z * px.dot([0,0,1]);
    		posipcc.y = pos.x * py.dot([1,0,0]) + pos.y * py.dot([0,1,0]) + pos.z * py.dot([0,0,1]);
    		posipcc.z = pos.x * pz.dot([1,0,0]) + pos.y * pz.dot([0,1,0]) + pos.z * pz.dot([0,0,1]);
    
    		var trackVector = tracker.cameraVector();
    		if (trackVector == null) {
    				trackVector = pos.multiply(-1);
    				var quat = trackVector.direction().rotationTo([0,0,1]).multiply(player.ship.orientation.conjugate());
    		} else {
    				var camVector = trackVector.direction();
    				var mvfipcc = new Vector3D(0,0,0);
    
    				mvfipcc.x = camVector.x * px.dot([1,0,0]) + camVector.y * px.dot([0,1,0]) + camVector.z * px.dot([0,0,1]);
    				mvfipcc.y = camVector.x * py.dot([1,0,0]) + camVector.y * py.dot([0,1,0]) + camVector.z * py.dot([0,0,1]);
    				mvfipcc.z = camVector.x * pz.dot([1,0,0]) + camVector.y * pz.dot([0,1,0]) + camVector.z * pz.dot([0,0,1]);
    
    				var quat = mvfipcc.rotationTo([0,0,1]);
    		}
    
    		player.ship.setCustomView(posipcc,quat);
    }
    
    this._registerCamera = function(obj) {
    		this.$camFunctions.push(obj);
    }
    
    this._cycle = function() {
    		this.$camFunctions.push(this.$camFunctions.shift());
    		player.consoleMessage("Selected camera: "+this.$camFunctions[0].name);
    		if (this.$camFunctions[0].initialisation) {
    				this.$camFunctions[0].initialisation();
    		}
    }
    
    /*** Built in cameras ***/
    
    /* Missile camera */
    
    this.shipFiredMissile = function(missile,target) {
    		this.$missile = missile;
    }
    
    this._missileCamPosition = function() {
    		if (!this.$missile || !this.$missile.isValid) {
    				return null;
    		}
    		return this.$missile.position.subtract(this.$missile.vectorForward.multiply(150)).add(this.$missile.vectorUp.multiply(10));
    }
    
    this._missileCamDirection = function() {
    		return this.$missile.vectorForward;
    }
    
    /* Fly-by cameras */
    
    this._flybyCamInit = function() {
    		var angle = Math.random()*2*Math.PI;
    		this.$startVector = new Vector3D(player.ship.collisionRadius*2*Math.sin(angle),player.ship.collisionRadius*2*Math.cos(angle),player.ship.collisionRadius*20);
    }
    
    this._flybyCamInit2 = function() {
    		var angle = Math.random()*2*Math.PI;
    	this.$startVector = new Vector3D(player.ship.collisionRadius*6*Math.sin(angle),
    									 Math.abs(player.ship.collisionRadius*6*Math.cos(angle)),
    									 player.ship.collisionRadius*40);
    }
    
    
    this._flybyCamUpdate = function(delta) {
    		this.$startVector.z -= delta * 500;
    		if (this.$startVector.z < -player.ship.collisionRadius*20) {
    				this._flybyCamInit();
    		}
    }
    
    this._flybyCamUpdate2 = function(delta) {
    		this.$startVector.z -= delta * 300;
    		if (this.$startVector.z < -player.ship.collisionRadius*20) {
    				this._flybyCamInit();
    		}
    }
    
    this._flybyCamUpdate3 = function(delta) {
    		this.$startVector.z -= delta * 100;
    		if (this.$startVector.z < -player.ship.collisionRadius*20) {
    				this._flybyCamInit();
    		}
    }
    
    this._flybyCamUpdate4 = function(delta) {
    		this.$startVector.z -= delta * 300;
    		if (this.$startVector.z < -player.ship.collisionRadius*20) {
    				this._flybyCamInit2();
    		}
    }
    
    
    this._flybyCamPosition = function() {
    		return player.ship.position.add(player.ship.vectorForward.multiply(this.$startVector.z)).add(player.ship.vectorUp.multiply(this.$startVector.y)).add(player.ship.vectorRight.multiply(this.$startVector.x));
    }
    
    this._flybyCamDirection = function() {
    		return player.ship.vectorForward.multiply(this.$startVector.z).add(player.ship.vectorUp.multiply(this.$startVector.y)).add(player.ship.vectorRight.multiply(this.$startVector.x)).multiply(-1);
    }
    
    /* Docking camera */
    
    this._dockingCamInit = function() {
    		var stations = system.filteredEntities(this,function(entity){return entity.isStation;},player.ship,25600);
    		if (stations.length > 0) {
    				this.$station = stations[0];
    		} else {
    				this.$station = system.mainStation;
    		}
    }
    
    this._dockingCamPosition = function() {
    		if (!this.$station || !this.$station.isValid) {
    				return null;
    		}
    
    		return this.$station.position.add(this.$station.vectorForward.multiply((this.$station.boundingBox.z/2)+250)).add(this.$station.vectorRight.multiply(350)).add(this.$station.vectorUp.multiply(175));
    }
    
    this._dockingCamDirection = function() {
    		return null; // track player ship
    }
    
    /* Target camera */
    
    this._targetCamPosition = function() {
    		if (player.ship.target && player.ship.target.isShip) {
    				return player.ship.target.position;
    		}
    		return null;
    }
    
    this._targetCamDirection = function() {
    		return player.ship.target.vectorForward;
    }
    
    
    this._targetFollowCamPosition = function() {
    		if (player.ship.target && player.ship.target.isShip) {
    			var pst = player.ship.target;
    			var r = pst.collisionRadius*3;
    			return pst.position.add(pst.vectorForward.multiply(-r)).add(pst.vectorUp.multiply(r/3)).add(pst.vectorRight.multiply(r/5));
    		}
    		return null;
    }
    
    this._targetFollowCamDirection = function() {
    	var pst = player.ship.target;
    	var dir = pst.vectorForward.add(pst.vectorUp.multiply(-1/3)).add(pst.vectorRight.multiply(-1/5));
    	return dir.direction();
    }
    
    this._targetLeadCamPosition = function() {
    		if (player.ship.target && player.ship.target.isShip) {
    			var pst = player.ship.target;
    			var r = pst.collisionRadius*3;
    			return pst.position.add(pst.vectorForward.multiply(r)).add(pst.vectorUp.multiply(r/3)).add(pst.vectorRight.multiply(r/5));
    		}
    		return null;
    }
    
    this._targetLeadCamDirection = function() {
    	var pst = player.ship.target;
    	var dir = pst.vectorForward.multiply(-1).add(pst.vectorUp.multiply(-1/3)).add(pst.vectorRight.multiply(-1/5));
    	return dir.direction();
    }