// ==============================================================
// ORBITER MODULE: WORMHOLE
// Part of the ORBITER SDK
// Copyright (C) 2002-2004 Martin Schweiger
// All rights reserved
//
// WORMHOLE.cpp
// Control module for WORMHOLE vessel class
//
// Notes:
// This is an example for a "minimal" vessel implementation which
// only overloads the clbkSetClassCaps method to define vessel
// capabilities and otherwise uses the default VESSEL class
// behaviour.
// ==============================================================
#define ORBITER_MODULE
#include "orbitersdk.h"
#include "WORMHOLE.h"
VISHANDLE MainExternalMeshVisual = 0;
void WORMHOLE::clbkPostCreation (void)
{
}
WORMHOLE::WORMHOLE (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
jump = 0;
}
void WORMHOLE::clbkSetClassCaps (FILEHANDLE cfg)
{
// physical specs
SetSize (500);
SetEmptyMass (1000.0);
SetCW (0.3, 0.3, 0.6, 0.9);
SetWingAspect (1.7);
SetWingEffectiveness (14.1);
SetCrossSections (_V(5.4, 5.4,25.77 ));
SetRotDrag (_V(3.5,3.5,3.5));
if (GetFlightModel() >= 1) {
SetPitchMomentScale (1e-4);
SetBankMomentScale (1e-4);
}
SetPMI (_V(2.58,2.57, 12.00));
SetTrimScale (0.08);
SetCameraOffset (_V(0,2.5,0));
SetTouchdownPoints (_V(0,.01,5.7), _V(-3.448,.01,-5.0), _V(3.448,.01,-5.0));;
EnableTransponder (true);
// propellant resources
//SetMeshVisibilityMode(AddMesh(oapiLoadMeshGlobal("INTERSTELLAR\\VESSEL\\WHole")), MESHVIS_ALWAYS); //Main ship mesh
SetMeshVisibilityMode(AddMesh(oapiLoadMeshGlobal("gateway")), MESHVIS_ALWAYS); //Main ship mesh
}
void WORMHOLE::clbkPostStep(double simt, double simdt, double mjd)
{
for(UINT i = 0; i<oapiGetVesselCount(); i++)
{
OBJHANDLE hvessel = oapiGetVesselByIndex(i);
if (hvessel != GetHandle())
{
VECTOR3 rpos, rvel;
oapiGetRelativePos(hvessel, GetHandle(), &rpos);
double distance = length(rpos);
oapiGetRelativeVel(hvessel, GetHandle(), &rvel);
if (jump==1) //do the jump
{
VESSELSTATUS2 vs_vessel, vs_other_gate;
memset(&vs_vessel, 0, sizeof(vs_vessel));
memset(&vs_other_gate, 0, sizeof(vs_other_gate));
vs_vessel.version = 2;
vs_other_gate.version = 2;
VESSEL *v;
v = oapiGetVesselInterface(hvessel);
v->GetStatusEx(&vs_vessel);
OBJHANDLE h_other_gate;
char myname[16];
char GateA[16];
sprintf(myname, GetName());
sprintf(GateA, "Gate_A");
//which gate A or B
if (strcmp(myname, GateA) == 0) // if myname is Gate_A then h_other_gate is Gate_B else h_other_gate is Gate_A
{
h_other_gate = oapiGetVesselByName("Gate_B");
}
else{
h_other_gate = oapiGetVesselByName("Gate_A");
}
//get other gate info
VESSEL *v_other_gate;
v_other_gate = oapiGetVesselInterface(h_other_gate);
v_other_gate->GetStatusEx(&vs_other_gate);
//make vessel then same as other gate
vs_vessel.rbody = vs_other_gate.rbody;
vs_vessel.rpos = vs_other_gate.rpos;
vs_vessel.vrot = vs_other_gate.vrot;
vs_vessel.arot = vs_other_gate.arot;
// VECTOR3 outvel = _V(rvel.x, rvel.y, rvel.z);
// VECTOR3 rofs;
// GlobalRot(outvel, rofs);
// vs_vessel.rvel.x = vs_other_gate.rvel.x + rofs.x;
// vs_vessel.rvel.y = vs_other_gate.rvel.y + rofs.y;
// vs_vessel.rvel.z = vs_other_gate.rvel.z + rofs.z;
v->DefSetStateEx(&vs_vessel);
//jump = 0; //stop jump
}
}
}
}
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
return new WORMHOLE (hvessel, flightmodel);
}
DLLCLBK void ovcExit(VESSEL *vessel)
{
if (vessel) delete (WORMHOLE*)vessel;
}
// --------------------------------------------------------------
// Keyboard interface handler (buffered key events)
// --------------------------------------------------------------
int WORMHOLE::clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{
// only process keydown events
if (!down)
return 0;
if (key == OAPI_KEY_K) // ATTACH
{
jump=1;
return 1;
}
if (key == OAPI_KEY_J) // ATTACH
{
jump = 0;
return 1;
}
return 0;
}
// ====================================================================
// clbkVisualCreated used to display UMMU initialisation message
// because oapiDebugString() doesn't work in clbkSetClassCap
// ====================================================================
void WORMHOLE::clbkVisualCreated (VISHANDLE vis, int refcount)
{
MainExternalMeshVisual = GetMesh(vis,0);
// We warn the user, in the case UMmu isn't installed it's a good idea to send a "oapiDebugString"
// Orbiter message, otherwise your addon will not be fully operational and user may not notice.
//(nobody read doc, you may be the only one, if you read this send me a postcard ;)
}
// ==============================================================
// Visual destroyed
// ==============================================================
void WORMHOLE::clbkVisualDestroyed (VISHANDLE vis, int refcount)
{
MainExternalMeshVisual = 0;
}