Problem Implementing ummu issue

Sar

New member
Joined
Oct 31, 2009
Messages
109
Reaction score
0
Points
0
I'm trying to implement Ummu into an addon, I'm somewhat sure all the code is there now, but I get these errors when I try to build it. Ummusdk.h is included and so is orbitersdk.h the ummusdk.lib should also be somewhere the program can find it, but still it refuses to work.

Code:
1>------ Build started: Project: TestProject, Configuration: Debug Win32 ------
1>Linking...
1>   Creating library ..\..\..\modules\ESA_myvessel.lib and object ..\..\..\modules\ESA_myvessel.exp
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall myvessel::clbkSaveState(void *)" (?clbkSaveState@myvessel@@UAEXPAX@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall myvessel::clbkLoadStateEx(void *,void *)" (?clbkLoadStateEx@myvessel@@UAEXPAX0@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall myvessel::clbkFocusChanged(bool,void *,void *)" (?clbkFocusChanged@myvessel@@UAEX_NPAX1@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall myvessel::clbkPostStep(double,double,double)" (?clbkPostStep@myvessel@@UAEXNNN@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall myvessel::clbkVisualCreated(void *,int)" (?clbkVisualCreated@myvessel@@UAEXPAXH@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall myvessel::clbkConsumeBufferedKey(unsigned long,bool,char *)" (?clbkConsumeBufferedKey@myvessel@@UAEHK_NPAD@Z)
1>..\..\..\modules\ESA_myvessel.dll : fatal error LNK1120: 6 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\Setä\Työpöytä\Orbiter w SDK\Orbitersdk\samples\TestProject\Debug\BuildLog.htm"
1>TestProject - 7 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Any Ideas? It's probably something silly and simple, I just can't seem to figure it out.

Ps. Changed the ship name to myvessel since the name gives it away and it's not my addon to start with.
 
Make sure that you are linking with Orbiter SDK's libraries. To do that right click on your project in the solution explorer, Add, Add item, then navigate to the orbiter\orbitersdk\lib directory and add the library files.
 
OrbiterSDK libraries were there already. I added the ummu library in there, but it didn't help.

I've moved the ummu library to the lib directory of orbiterSDK, but I don't think that is the reason it's not compiling.

---------- Post added at 08:49 AM ---------- Previous post was at 08:33 AM ----------

Looking at the source code I found out something that might have something to do with the issue, no biggie just missing half the code I made yesterday... I'm kinda annoyed right about now.

---------- Post added at 01:26 PM ---------- Previous post was at 08:49 AM ----------

Ok, done. The code now compiles, but it's giving a misc error in orbiter and I can't locate the reason for it.

This is all the ummu related code there is. Pretty much a copy paste party from UmmuSDK thus far.

Code:
	void clbkSaveState(FILEHANDLE scn)
{

	SaveDefaultState (scn);


	Crew.SaveAllMembersInOrbiterScenarios(scn);
}
	void clbkLoadStateEx (FILEHANDLE scn, void *status)
{
	char *line;
	while (oapiReadScenario_nextline (scn, line)) 
	{

		if(Crew.LoadAllMembersFromOrbiterScenario(line)==TRUE)
			continue;

		// ORBITER, unrecognised option - pass to Orbiter's generic parser
		ParseScenarioLineEx (line, status);
	}

}
	int clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{
	// only process keydown events
	if (!down) 
		return 0; 

	if(key==OAPI_KEY_E)
	{

		int Returned=Crew.EvaCrewMember(Crew.GetCrewNameBySlotNumber(SelectedUmmuMember));

		switch(Returned)
		{
		case TRANSFER_TO_DOCKED_SHIP_OK:
			sprintf(SendFocusScreenMessage(),"Transfer to docked ship Ok - %s transfered",Crew.GetLastEvaedCrewName());SelectedUmmuMember=0;
			break;
		case EVA_OK:
			sprintf(SendFocusScreenMessage(),"EVA OK - %s left the ship",Crew.GetLastEvaedCrewName());SelectedUmmuMember=0;
			break;
		case ERROR_NO_ONE_ON_BOARD:
			strcpy(SendFocusScreenMessage(),"Error, no one on board, unable to EVA");
			break;
		case ERROR_AIRLOCK_CLOSED:
			strcpy(SendFocusScreenMessage(),"Error, airlock is closed, unable to EVA");
			break;
		case ERROR_DOCKED_SHIP_HAVE_AIRLOCK_CLOSED:
			strcpy(SendFocusScreenMessage(),"Error, docked ship's airlock is closed, unable to transfer");
			break;
		case ERROR_DOCKED_SHIP_IS_FULL:
			strcpy(SendFocusScreenMessage(),"Error, docked ship is already full transfer failed");
			break;
		case ERROR_CREW_MEMBER_NOT_FOUND:
			strcpy(SendFocusScreenMessage(),"Error, no crew by this name in ship");
			break;
		case ERROR_DOCKEDSHIP_DONOT_USE_UMMU:
			strcpy(SendFocusScreenMessage(),"Error, docked ship do not use UMmu 1.5, ask author to add it See http://orbiter.dansteph.com");
			break;
		case ERROR_MISC_ERROR_EVAFAILED:
			strcpy(SendFocusScreenMessage(),"Misc error with UMMU See http://orbiter.dansteph.com to install it again");
			break;
		}
		return TRUE;
	}

	if(key==OAPI_KEY_1)
	{

		if(Crew.GetCrewTotalNumber()==0)
		{
			strcpy(SendFocusScreenMessage(),"Sorry no one aboard unable to select");	
			return 1;
		}


		if(SelectedUmmuMember<Crew.GetCrewTotalNumber()-1)
			SelectedUmmuMember++;
		char * Name=Crew.GetCrewNameBySlotNumber(SelectedUmmuMember);
		sprintf(SendFocusScreenMessage(),"Slot %i  %s \"%s\" aged %i Selected for EVA or Transfer, please press \"E\" to EVA \"ESC\" to eject",SelectedUmmuMember,Crew.GetCrewMiscIdBySlotNumber(SelectedUmmuMember),Name,Crew.GetCrewAgeBySlotNumber(SelectedUmmuMember));
		return 1;
	}


	if(key==OAPI_KEY_2)
	{
		// we test there is someone aboard
		if(Crew.GetCrewTotalNumber()==0)
		{
			strcpy(SendFocusScreenMessage(),"Sorry no one aboard unable to select");	
			return 1;
		}
		if(SelectedUmmuMember>0)
			SelectedUmmuMember--;
		char * Name=Crew.GetCrewNameBySlotNumber(SelectedUmmuMember);
		sprintf(SendFocusScreenMessage(),"Slot %i %s \"%s\" aged %i Selected for EVA or Transfer, please press \"E\" to EVA \"ESC\" to eject",SelectedUmmuMember,Crew.GetCrewMiscIdBySlotNumber(SelectedUmmuMember),Name,Crew.GetCrewAgeBySlotNumber(SelectedUmmuMember));
		return 1;
	}


	//---------------------------------------------------------------------------
	// Ummu Key "A" Switch the airlock door on/off
	if(key==OAPI_KEY_A)
	{
		// switch state
		Crew.SetAirlockDoorState(!Crew.GetAirlockDoorState());
		// display state
		if(Crew.GetAirlockDoorState()==TRUE)
			strcpy(SendFocusScreenMessage(),"Airlock is now open");	
		else
			strcpy(SendFocusScreenMessage(),"Airlock is now closed");	
		return 1;
	}


	if(key==OAPI_KEY_ESCAPE)
	{
		if(Crew.EjectCrewMember(Crew.GetCrewNameBySlotNumber(SelectedUmmuMember))==EVA_OK)
			sprintf(SendFocusScreenMessage(),"%s EJECTED",Crew.GetLastEvaedCrewName());SelectedUmmuMember=0;
		return 1;
	}


	if(key==OAPI_KEY_C)
	{
		Crew.SetAlternateMeshToUseForEVASpacesuit("mmu");	// the stock mmu of orbiter located in "meshes/mmu.msh"
		strcpy(SendFocusScreenMessage(),"Mesh changed");
		return 1;
	}

	//---------------------------------------------------------------------------
	// Get some infos Name of ship and total soul aboard
	if(key==OAPI_KEY_S)
	{
		sprintf(SendFocusScreenMessage(),"%i souls aboard ship %s, %i seats available",Crew.GetCrewTotalNumber(),GetName(),4-Crew.GetCrewTotalNumber());
		return 1;
	}
	return 0;
}
	void clbkVisualCreated (VISHANDLE vis, int refcount)
		{

	if(UmmuSdKInitReturnCode==-999)
		strcpy(SendFocusScreenMessage(),"This addon require UMMU addon wich is not installed or outdated. See http://orbiter.dansteph.com to install it");
	else if(UmmuSdKInitReturnCode!=1)
		strcpy(SendFocusScreenMessage(),"Misc error with UMMU See http://orbiter.dansteph.com to install it again");

	else if(UmmuSdKInitReturnCode==1)
		strcpy(SendFocusScreenMessage(),"Welcome in UMmu SDK Demo.  Keyboard Key:  E=EVA 1=select next 2=select previous A=close/open airlock ESC=eject S=get ship info");
}
	void clbkPostStep (double simtt, double simdt, double mjd)
{


	int ReturnCode=Crew.ProcessUniversalMMu();
	switch(ReturnCode)
	{
		case UMMU_TRANSFERED_TO_OUR_SHIP: 
			sprintf(SendFocusScreenMessage(),"%s \"%s\" aged %i was transfered to our ship",Crew.GetCrewMiscIdByName(Crew.GetLastEnteredCrewName()),Crew.GetLastEnteredCrewName(),Crew.GetCrewAgeByName(Crew.GetLastEnteredCrewName()));
			break;
		case UMMU_RETURNED_TO_OUR_SHIP:
			sprintf(SendFocusScreenMessage(),"%s \"%s\" aged %i entered into our ship",Crew.GetCrewMiscIdByName(Crew.GetLastEnteredCrewName()),Crew.GetLastEnteredCrewName(),Crew.GetCrewAgeByName(Crew.GetLastEnteredCrewName()));
			break;
	}


	if(GroundContact()==TRUE)
	{
		// we check vertical speed
		int I;
		VECTOR3 vHorizonAirspeedVector={0};
		GetHorizonAirspeedVector (vHorizonAirspeedVector);
		double VertSpeed		=vHorizonAirspeedVector.y;
		if(VertSpeed<-3)
		{
			// we touched ground with more than -3 m/s, sorry dude, time to kill you all :(
			for(I=0;I<Crew.GetCrewTotalNumber();I++)
			{
				Crew.SetCrewMemberPulseBySlotNumber(I,0);	// set cardiac pulse to zero
			}
			strcpy(SendFocusScreenMessage(),"Oooh no ! Crash - All crew aboard killed");
		}


	}

	// this below are used by the simple user text interface used in this demo
	// see function "SendFocusScreenMessage" below for explaination.
	if(GetHandle()==oapiGetFocusObject())
	{
		strcpy(oapiDebugString(),cOurMessage);
	}
}
	void clbkFocusChanged(bool getfocus,OBJHANDLE hNewVessel,OBJHANDLE hOldVessel)
		{
	// erase message if we focus to another vessel
	if(!getfocus)
	{
		strcpy(oapiDebugString(),"");
	}
};


	UMMUCREWMANAGMENT Crew;
	void clbkSetClassCaps_UMMu(void)
{

	UmmuSdKInitReturnCode=Crew.InitUmmu(GetHandle());	

	float UMmuVersion=Crew.GetUserUMmuVersion();


	Crew.DefineAirLockShape(TRUE,-1,1,-1,3,-2,4);			// Airlock open, 2 meter large 4 meter high 6 meter long (vessel local coordinate)

	Crew.SetMembersPosRotOnEVA(_V(0,0,3),_V(0,0,0));	// 3 meters in front of ship (z) facing direction of ship (vessel local coordinate)

	Crew.SetMaxSeatAvailableInShip(5);


	// IDEA: Use the MiscID parameter to EVA with different spacesuit (captain,girl,english people etc etc)
	Crew.AddCrewMember("Peter Falcon",41,65,74,"Capt");		//(for name and id a-z A-Z 0-9 characters only)
	Crew.AddCrewMember("Fanny Gorgeous",27,67,55,"Eng");	//(for name and id a-z A-Z 0-9 characters only)
	Crew.AddCrewMember("George HealGood",15,70,45,"Doc");	//(for name and id a-z A-Z 0-9 characters only)
	Crew.AddCrewMember("Albert Jr Falcon",15,70,45);		//(for name and id a-z A-Z 0-9 characters only)

	// this variables below are used by the simple user text interface used in this demo
	// see function "SendFocusScreenMessage" below for explaination.
	strcpy(cOurMessage,"");
}
		// our special SetClassCapfunction added for more readability
	int SelectedUmmuMember;				// for the SDK demo, select the member to eva
	int UmmuSdKInitReturnCode;			// to display init message to user (in case Ummu isn't installed on Orbiter)

	char cOurMessage[1000];
	char *SendFocusScreenMessage()
		{
	return cOurMessage;
}

	// If you want to use standard ID function see bottom of UMmuExample.cpp
	int EvaCrewMemberWithStandardSpacesuit(char* CrewName)
		{
	char TempMiscID[5]={0};
	int I=0;
	char MeshToUse[26]={"ummu/ummu"}; // default mesh if not found
	// retriew the crew's MiscID
	strcpy(TempMiscID,Crew.GetCrewMiscIdByName(CrewName));
	// search if we find this ID in the list
	for(I=0;I<NUMBER_OF_MMU_TYPE;I++)
	{
		if(strcmp(UmmuMiscID[I],TempMiscID)==0)
		{
			// found ! copy the mesh filename to use for EVA
			strcpy(MeshToUse,UmmuMeshUsed[I]);
			break;
		}
	}
	// Set the mesh filename to use
	Crew.SetAlternateMeshToUseForEVASpacesuit(MeshToUse);
	// Eva the crew member with this mesh
	return Crew.EvaCrewMember(CrewName);
}

If Anyone can help me out with this I'd be very gratefull!
 
Back
Top