Jump to content

JaceSolarisVIII

Members
  • Posts

    79
  • Joined

  • Last visited

Posts posted by JaceSolarisVIII

  1. Like the title suggests, I'm wondering if it's possible to add items that are exclusive to Multiplayer to Single Player.

    With the Cloak, it would have to make you invisible to NPCs. Apparently, it actually does that in Multiplayer too, which is pretty interesting.

    With the Bacta, I'd like to have it go into your inventory to be used later, rather than working like an Instant Use Medpack.

     

    Thanks guys :D

     

    Everything you mentioned, cloak, etc from multiplayer has been added in this mod here.

     

    https://jkhub.org/files/file/3525-serenityjediengine2019/

     

    the most up to date and stable version can be found here.

     

    https://www.moddb.com/mods/serenityjediengine-20/downloads/serenityjediengine2019

     

    The mod also contains the source code so if you want to have a go at coding it in to a build of your own, you can find everything you want in the files.

    Droidy365 likes this
  2. The red text you’re seeing is a warning. It’s safe to ignore :)

     

    Ahh ok thx. I tried adding a new "CreateVisualStudio2015Projects.windows batch file" and edited it to be called "CreateVisualStudio2017Projects. windows batch file" then edited it to read.

    @REM Create OpenJK projects for Visual Studio 2017 using CMake
    @[member='Echo'] off
    for %%X in (cmake.exe) do (set FOUND=%%~$PATH:X)
    if not defined FOUND (
    	echo CMake was not found on your system. Please make sure you have installed CMake
    	echo from http://www.cmake.org/ and cmake.exe is installed to your system's PATH
    	echo environment variable.
    	echo.
    	pause
    	exit /b 1
    ) else (
    	echo Found CMake!
    )
    if not exist build\nul (mkdir build)
    pushd build
    cmake -G "Visual Studio 15" -D CMAKE_INSTALL_PREFIX=../install ..
    popd
    pause
    

    This seems to have worked also and builds a solution that opens in Visual studio 2017 and compiles correctly.

     

    Thankyou anyway ;-)

  3. Please help. I just received an update to Visual studio 2019 preview, I also have Visual studio 2015 and Visual studio 2017 installed and fully updated. I have cmake-3.13.4-win64-x64 installed. I am no longer able to Configure or Generate a solution with Cmake.

    https://www.moddb.com/mods/serenityjediengine-20/images/cmake#imagebox

     

     

    Would it be possible for the OpenJK team to update there build to enable solution generation with Visual studio 2017 and Visual studio 2019. 

  4. However, I was thinking about doing something like this, as it would be much more convenient than constantly having to add scripts to everything. CLASS_R2D2 explodes in a similar way to what I've described, would it be possible to make every class do that? Just FYI, I'm not a coder.

     

     

    Well as long as you know how to "Open" and "Compile" the code then your half way there.https://github.com/JACoders/OpenJK/wiki/Compilation-guide

    Once you have figured this bit out just "search" for "void DeathFX( gentity_t *ent )". It is a very,very simple bit of code.
     
    switch(ent->client->NPC_class)

     {

     case CLASS_MOUSE:

      VectorCopy( ent->currentOrigin, effectPos );

      effectPos[2] -= 20;

      G_PlayEffect( "env/small_explode", effectPos );

      G_SoundOnEnt( ent, CHAN_AUTO, "sound/chars/mouse/misc/death1" );

      break;

     case CLASS_PROBE:

      VectorCopy( ent->currentOrigin, effectPos );

      effectPos[2] += 50;

      G_PlayEffect( "explosions/probeexplosion1", effectPos );

      break;

     case CLASS_ATST:

      AngleVectors( ent->currentAngles, NULL, right, NULL );

      VectorMA( ent->currentOrigin, 20, right, effectPos );

      effectPos[2] += 180;

      G_PlayEffect( "explosions/droidexplosion1", effectPos );

      VectorMA( effectPos, -40, right, effectPos );

      G_PlayEffect( "explosions/droidexplosion1", effectPos );

      break;

     
     
     
    All you need to do is add the classes to the different type of explosion effects you want.
     
    EXAMPLE:
     
     
    switch(ent->client->NPC_class)

     {

     case CLASS_ADDED CLASS NAME HERE:

     case CLASS_MOUSE:

      VectorCopy( ent->currentOrigin, effectPos );

      effectPos[2] -= 20;

      G_PlayEffect( "env/small_explode", effectPos );

      G_SoundOnEnt( ent, CHAN_AUTO, "sound/chars/mouse/misc/death1" );

      break;

     case CLASS_PROBE:

     case CLASS_ADDED CLASS NAME HERE:

      VectorCopy( ent->currentOrigin, effectPos );

      effectPos[2] += 50;

      G_PlayEffect( "explosions/probeexplosion1", effectPos );

      break;

     case CLASS_ATST:

     case CLASS_ADDED CLASS NAME HERE:

      AngleVectors( ent->currentAngles, NULL, right, NULL );

      VectorMA( ent->currentOrigin, 20, right, effectPos );

      effectPos[2] += 180;

      G_PlayEffect( "explosions/droidexplosion1", effectPos );

      VectorMA( effectPos, -40, right, effectPos );

      G_PlayEffect( "explosions/droidexplosion1", effectPos );

      break;

     
     Then just compile the code and use the newly created dlls and exe,s in your mod.
  5. Hey guys, I'm wondering how I can make corpses instantly disappear, while having a sort of explosion as they die. I want this to happen with all NPCs and Players that die. This is going to be for my Sword Art Academy mod. Unfortunately, g_corpseRemovalTime isn't quick enough, as I need it to be instant. If at all possible, I would prefer to do this without coding, because I can't code for crap, thanks  :D

     

    You can do the explosion effect using code edits. Search for "DeathFX" in the code and edit it to include all classes of model or the ones you want the effect to happen on. And set the corpse removal time to 2 seconds (this will give time for the deathfx to happen). Hope this helps.

  6. Hi mates,

     

    I am doing a series on Single Player mods for Jedi Outcast and Academy. I would REALLY appreciate suggestions  :) I have completed Dark Origins on Jedi Outcast - All Enemies are Sith, Vader Returns to Bespin & Survival Mod 2 for JA. 

     

    Below is proof that I am a real person completing mod showcases.

    https://www.youtube.com/watch?v=0TUrGts1RlA&

     

    Appreciate your help!

     

    Cheers

     

    I would love to see a video about the SerenityJediEngine. https://www.moddb.com/mods/serenityjediengine-20/downloads/serenityjediengine2018-extreme

  7. @@Tompa9 @

     

    Do you remember when Movie Duels 2 was released back in 2009?

     

    It was this magnificent culmination of community effort to bring new life in the form of a new campaign to an aging game.

    What this small team of Modders managed to do back then just seems incredible nowadays – they have not only assembled and extended a fantastic collection of the best assets the community has made up to that point in time but also made a whole campaign worth of new single player missions, including all the layouting work and other gameplay related aspects when it comes to leveldesign.

     

    And while I may be wearing nostalgia tinted glasses here – I remember that as being fairly solid, especially for a small team of passionate modders without any professional level of education on this matter.

    These guys have really done an amazing job, even more so if you consider the fate of many other SP Total Conversion mod projects that we have seen come and go over the years. And now, allmost a decade after this mod has been released you guys decided to dig up Movie duels 2 and fuck around with it.

     

    Considering how much I liked the originalI have been watching this thread with interest for a while and have made my thoughts about this.  Now I feel that the time has come where I really need to speak out about my honest opinion on this project.

     

    So, let’s shed some light on what you have been doing over the past year:

     

    You have replaced a few level textures from what I have seen and some of them are actually quite an improvement, mainly talking the Mural in Palpatines office here, the others don’t stand out as much to me, which might be because you did not provide comparison shots to what has been there previously – which would greatly increase the quality of your progress presentations on here. The way you present your work here could actually be improved a lot but I’ll get to that later.

     

    You have made a few code edits and while I am not sure about the full extent of what you have done: I really dig that saberblade blob fix!

    You have replaced a lot of originally included character skins and models with newer, „enhanced“ versions as you may call them. Let’s recap what you have done here….

    You replaced parts of models with pieces that have been shamefully ripped from other games, mixed in a few parts from models created by other Modders and passed the textures through a bunch of image adjustments in Gimp, Photoshop or whatever else you may be using.

     

    Now tell me: Which pieces on these have you actually created and not just taken and remixed? Which part of that process qualifies those frankenstein monsters as creative, original work? I don’t see any of that. And yet you cheekily dare to call them "your" models.

     

    To me this seems straight up disrespectful to what the original creators of these models did or more precisely: I think it's major kick in the nuts to what MD2 stood for – even while you are providing credits to the original authors most of the time, you still refer to them as "your" models which is a habit that is bothering me all over this community.

    I’m fine with you calling them your kitbashes or your frankensteins but please stay away from referring to them as "your" models. And just to make this perfectly clear: allthough I think it's wasted potential I really don't give a shit about your choice to use ported models, I'm just annoyed by your attitude in presenting them.

     

    Which leads us onto the topic of presentation:

     

    Just take a look at this post for example.

     

    This post seems very sloppy and rushed – which in turn makes your work appear sloppy and rushed, something that is not helped by things like that broken skybox in the video. You could have greatly improved the appeareance iof that post and thereby the quality of your presentation by simply adding one more linebreak after the first sentence. And onto what @@SomaZ said about fixing that faulty skybox prior to releasing the Video:

    I would never release a video presentation that clearly shows such a fault. To me the only valid options would be to fix that immediatly and rerecord the scene, or cut the scene from the Teaser.

     Or as a third option you could have rerecorded that sequence and just turned the camera away but I suppose that may not be the best approach to a video that is supposed to show gameplay sequences from a mission.  

    So in short: think about the way you present yourselves and what you are doing here and work on that. You have put things like "Lead Designer“ and "Mod Developer“ for Movie Duels 2 remastered in your signatures, I’ll let the mod developer pass but I really don’t think that anyone of you is justified to call yourself "Lead Designer“ of this! Keep in mind that most of what you have here is recycled designwork from other authors.

     

    As it stands now I would greatly prefer not to see any traces of my models as a part of the beta release.

    I am not going to explicitely forbid you to use them but if you have any respect for this community and me personally, I trust that you will decide to leave them out.

    If you actually stop and think about the way you present this whole deal on here, change something about that and thereby gain my respect, I will gladly let you include my work in a later release.

     

    Well it would seem I have to apologize for letting the skybox error slip through the net. It seems to have upset you. And for that I can only say I'm very sorry. I'm also sorry that I don't have the ability to make a video to the standards of others who have come before me. I'm often short on time and don't have the resources that others have. I don't claim to have standards of the likes of you or Lucas arts or Disney, but I do try my best.

     

    Its very sad to me to read this, because I think in many cases your missing the point of what the team is doing. In an age of "movie remakes" and "game remakes" it doesn't seem too much of a stretch to simply "update" a very popular but ageing mod.

     

    As for the use of models that come from other sources, I cant comment on that because it is a subject I have no credible knowledge about and I can only say this. I have seen your work here on the downloads page and can confirm you seem to have a real talent that is unchallenged and for that I respect what you have done and take very seriously what you have said.Tompa9 is very talented and has shown his worth many times over, Irrelevant of his age and I respect him also.

     

    So how can I respond to your post? I mean "me" personally. How should I respond to your post?

     

    1.Apologise that my efforts have offended you.

    2.Redact all the work I have done from the mod, leaving no trace of my involvement in the mod.

    3.Leave the team and ensure no evidence of my involvement is traceable in the mod.

     

    Obviously I can only speak for myself and the work I have put in over the last 6 months. As for the other issues that have offended you I can only say, Its a shame you feel this way.

     

    And just in case you are wondering if I am a child/teenager with a immature attitude.

    I'm 45 years old, have 2 kids. 1 is 5yrs the other 3 months old. Work shifts of up to 12 hours a day. married and still find time to do my hobby.

     

    I do this as a release, I'm a hobby coder who likes doing crossword puzzles and likes the challenges that coding affords.

     

    Please don't be offended by any of this response, No offence is intended. But please let me know what my next course of action should be!

  8. Hey there! I know that theres a way to set multiple random loading screens (unknownmap) since I've seen this done before in ForceMod III and a few other modpacks here and there. I'd like to figure out how to achieve such a thing with my own content but not quite sure how to approach it since I'm still new to this. Also I can't find any available source code that uses this so I can't see how it was done.

     

    For example, I found this under ui_main but not sure how to set it for multiple random images:

    /*
    =================
    Menu_Cache
    =================
    */
    void Menu_Cache( void )
    {
        uis.cursor = ui.R_RegisterShaderNoMip( "menu/new/crosshairb" );
        uis.whiteShader = ui.R_RegisterShader( "white" );
        uis.menuBackShader = ui.R_RegisterShaderNoMip( "menu/art/unknownmap" );
    }

    And this under cg_info:

    {
        levelshot = cgi_R_RegisterShaderNoMip( va( "levelshots/%s", s ) );
     #ifndef FINAL_BUILD
        if (!levelshot && !strncmp(s, "work/",5) )
        {
            levelshot = cgi_R_RegisterShaderNoMip( va( "levelshots/%s", s+5 ) );
        }
     #endif
        if (!levelshot) {
            levelshot = cgi_R_RegisterShaderNoMip( "menu/art/unknownmap" );
        }
    }

    I've seen other strings of code that can randomize sound effects, NPC spawning, and other things... but for menu related things I'm not too sure. I'd appreciate any ideas or tips!  :3

     

    Try this.

    void CG_DrawInformation( void )
    {
    	int		y;
    	// draw the dialog background
    	const char	*info	= CG_ConfigString( CS_SERVERINFO );
    	const char	*s		= Info_ValueForKey( info, "mapname" );
    
    	qhandle_t	levelshot;
    	qhandle_t	levelshot2;
    
    	extern SavedGameJustLoaded_e g_eSavedGameJustLoaded;	// hack! (hey, it's the last week of coding, ok?
    	
    	levelshot = cgi_R_RegisterShaderNoMip(va("levelshots/%s", s));
    	levelshot2 = cgi_R_RegisterShaderNoMip(va("levelshots/%s2", s));
    
    	if (!levelshot)
    	{
    		levelshot = cgi_R_RegisterShaderNoMip("menu/art/unknownmap");
    	}
    	if (!levelshot2)
    	{
    		levelshot2 = cgi_R_RegisterShaderNoMip("menu/art/unknownmap_mp");
    	}
    
    	if ( g_eSavedGameJustLoaded != eFULL
    		&& !strcmp(s,"yavin1"))//special case for first map!
    	{
    		char	text[1024] = { 0 };
    
    		CG_DrawPic(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot);
    
    		cgi_SP_GetStringTextString("SP_INGAME_ALONGTIME", text, sizeof(text));
    
    		int w = cgi_R_Font_StrLenPixels(text, cgs.media.qhFontMedium, 1.0f);
    		cgi_R_Font_DrawString((320) - (w / 2), 140, text, colorTable[CT_ICON_BLUE], cgs.media.qhFontMedium, -1, 1.0f);
    	}
    	else if (cg.loadLCARSStage >= 4)
    	{
    		CG_DrawPic(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot2);
    	}
    	else
    	{
    		CG_DrawLoadingScreen(levelshot, s);
    		cgi_UI_MenuPaintAll();
    	}
    
    	CG_LoadBar();
    
    	// draw info string information
    
    	y = 20;
    	// map-specific message (long map name)
    	s = CG_ConfigString( CS_MESSAGE );
    
    	if ( s[0] )
    	{
    		if (s[0] == '@')
    		{
    			char text[1024]={0};
    			cgi_SP_GetStringTextString( s+1, text, sizeof(text) );
    			cgi_R_Font_DrawString( 15, y, va("\"%s\"",text),colorTable[CT_WHITE],cgs.media.qhFontMedium, -1, 1.0f );
    		}
    		else
    		{
    			cgi_R_Font_DrawString( 15, y, va("\"%s\"",s),colorTable[CT_WHITE],cgs.media.qhFontMedium, -1, 1.0f );
    		}
    		y += 20;
    	}
    }
    
  9. No way to tell without seeing all of your related code changes (specifically where Weapon_HookFree is being called from).

    There's an assumption that a hook belongs to another entity (player), but that doesn't seem to be true; ent->parent should have been set long before Weapon_HookFree was called (e.g. upon hook creation) but wasn't, or it was cleared at some other point in time (or you're calling Weapon_HookFree on a non-hook entity).

     

    A more general solution: learn to debug, get a backtrace, etc.

    Thank you for responding to this post, The Weapon_HookFree is being called in g_active.cpp in void ClientThink_real( gentity_t *ent, usercmd_t *ucmd ).

     (ent->client->ps.weapon == WP_MELEE)
    	{
    		if (ucmd->buttons & BUTTON_GRAPPLE &&
    			ent->client->ps.pm_type != PM_DEAD &&
    			!ent->client->hookhasbeenfired &&
    			!(PM_SaberInAttack(ent->client->ps.saberMove)))
    		{
    			if (ent->client && ent->client->hookDebounceTime > level.time)
    			{
    				if (client->hook)
    				{
    					Weapon_HookFree(client->hook);
    				}
    			}
    			else
    			{
    				Weapon_GrapplingHook_Fire(ent);
    				ent->client->hookhasbeenfired = qtrue;
    				NPC_SetAnim(ent, SETANIM_BOTH, BOTH_PULL_IMPALE_STAB, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD, 0);
    				G_SoundOnEnt(ent, CHAN_ITEM, "sound/weapons/grapple/hookfire.wav");
    				ent->client->hookDebounceTime = level.time + 0;
    			}
    		}
    		else if (client->hook && (client->fireHeld == qfalse ||
    			!(ucmd->buttons & BUTTON_GRAPPLE) ||
    			(ucmd->buttons & BUTTON_USE) ||
    			(ent->client->ps.pm_type == PM_DEAD)))
    		{
    			Weapon_HookFree(client->hook);
    		}
    	}
    	else
    	{
    		if (client->hook && (client->fireHeld == qfalse ||
    			!(ucmd->buttons & BUTTON_GRAPPLE) ||
    			(ucmd->buttons & BUTTON_USE) ||
    			(ucmd->buttons & BUTTON_BLOCK) ||
    			(ent->client->ps.pm_type == PM_DEAD)))
    		{
    			Weapon_HookFree(client->hook);
    		}
    
    		if (!(ent->client->ps.eFlags & EF_FIRING))
    		{
    			client->fireHeld = qfalse;
    		}
    	}
    

    g_client.cpp in void ClientDisconnect( int clientNum ).

    
    void ClientDisconnect( int clientNum )
    {
    	gentity_t	*ent;
    
    	ent = g_entities + clientNum;
    	if ( !ent->client )
    	{
    		return;
    	}
    
    	gi.unlinkentity (ent);
    	ent->s.modelindex = 0;
    	ent->inuse = qfalse;
    	ClearInUse(ent);
    	ent->classname = "disconnected";
    	ent->client->pers.connected = CON_DISCONNECTED;
    	ent->client->ps.persistant[PERS_TEAM] = TEAM_FREE;
    	if (ent->client->hook)
    	{ // free it!
    		Weapon_HookFree(ent->client->hook);
    	}
    
    	gi.SetConfigstring( CS_PLAYERS + clientNum, "");
    
    	IIcarusInterface::GetIcarus()->DeleteIcarusID(ent->m_iIcarusID);
    
    }
    

    g_combat.cpp in void player_die.

    
    	if (self->client->hook)
    	{ // free it!
    		Weapon_HookFree(self->client->hook);
    	}
    

    and finally g_missile.cpp.

    
    #define MISSILE_PRESTEP_TIME 50
    /*
    =================
    fire_grapple
    =================
    */
    gentity_t *fire_grapple(gentity_t *self, vec3_t start, vec3_t dir)
    {
    	gentity_t	*hook;
    
    	VectorNormalize(dir);
    
    	hook = G_Spawn();
    	hook->classname = "hook";
    	hook->nextthink = level.time + 10000;
    	hook->think = Weapon_HookFree;
    	hook->s.eType = ET_MISSILE;
    	hook->svFlags = SVF_USE_CURRENT_ORIGIN;
    	hook->s.weapon = WP_MELEE;
    	hook->ownerNum = self->s.number;
    	hook->methodOfDeath = MOD_ELECTROCUTE;
    	hook->clipmask = MASK_SHOT;
    	hook->parent = self;
    	hook->target_ent = NULL;
    	hook->s.pos.trType = TR_LINEAR;
    	hook->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME;
    	hook->s.otherEntityNum = self->s.number;
    	VectorCopy(start, hook->s.pos.trBase);
    	VectorScale(dir, 900, hook->s.pos.trDelta);
    	SnapVector(hook->s.pos.trDelta);
    	VectorCopy(start, hook->currentOrigin);
    	self->client->hook = hook;
    
    	return hook;
    }
    

    These are the only places where Weapon_HookFree is being called?

    ​​​

  10. Unhandled exception thrown: read access violation.
    ent->**parent** was nullptr.
    
     

    I could use some help. I have been trying to get my deletion function to work correctly, but no matter what I seem to do it always gives me a "was nullptr" error.  Everywhere I have looked for information about nullptr has not really given an explanation that I actually understand. My understanding is that a "was nullptr" error is given when you try to dereference a pointer/node, but I could never find a way to handle the issue that made sense to me. Any help is really appreciated. My code is:

    
    
    void Weapon_HookFree(gentity_t *ent)
    {
    	ent->parent->client->fireHeld = qfalse;
    	ent->parent->client->hookhasbeenfired = qfalse;
    	ent->parent->client->hook = NULL;
    	ent->parent->client->ps.pm_flags &= ~PMF_GRAPPLE_PULL;
    	G_FreeEntity(ent);
    }
    

    This is for singleplayer only and does not show this error in mp.

    gerbilOFdoom likes this
  11. Extra Credits


    Extracts were taken from The following sources and were used to help improve and update the source for this mod.


    Openkj main source https://github.com/JACoders/OpenJK


    Redsaurus Openjk SP improvements https://github.com/redsaurus/OpenJK


    Dustys Patch SP Improvements Openjk https://github.com/DustysPatch/OpenJK


    Warzone MP improvements https://github.com/Stoiss/Rend2


    and special thanks should go to Serenity and Stoiss who are the original authors of this code.

    Smoo likes this
  12. It's just occurred to me- most servers run games with Saber Only on, meaning melee combat is the primary form of offence in most multiplayer matches. And yet despite this melee-heavy focus for the community... no-one seems to have made a mod that actually gives us a manual blocking feature. We have one mod that makes Saber Throw a Force power and reassigns how Mouse 2 works- but while such needless tweaks like that are made, no one seems to have thought of adding a simple block button. In a cult-classic game prided on laser-sword fighting, there is no block button.

     

     

    Are there any mods out that that give us a block button? Is there something fundamental in the game's source code that prevents such a feature being made? Am I seriously the first person to even suggest the idea?

     

    If the only thing you want is blocking try this.http://www.moddb.com/mods/serenityjediengine-20/downloads/jediacademy-un-official-update-2017

     

    If you want a full combat upgrade.http://www.moddb.com/mods/serenityjediengine-20/downloads/serenityjediengine2018-advanced-rc1-beta

    Smoo likes this
  13. Im not entirely sure how your making a mod for mblocking without knowing the names of the animations, its a big code job to do manual blocking in the first place so i presume your doing an animation swap for the dodge anims.

     

     

    BOTH_P1_S1_BL        10401 2 -1 20 single bottom left
    BOTH_P1_S1_BR        10403 2 -1 20 single bottom right
    BOTH_P1_S1_TL        10405 2 -1 20 single top left
    BOTH_P1_S1_TR        10407 2 -1 20 single top right
    BOTH_P1_S1_T_        10409 2 -1 20 single top/front
     
    BOTH_P6_S6_BL        10411 2 -1 20 dual bottom left
    BOTH_P6_S6_BR        10413 2 -1 20 dual bottom right
    BOTH_P6_S6_TL        10415 2 -1 20 dual top left
    BOTH_P6_S6_TR        10417 2 -1 20 dual top right
    BOTH_P6_S6_T_        10419 2 -1 20 dual top/front
     
    BOTH_P7_S7_BL        10421 2 -1 20 staff bottom left
    BOTH_P7_S7_BR        10423 2 -1 20 staff bottom right
    BOTH_P7_S7_TL        10425 2 -1 20 staff top left
    BOTH_P7_S7_TR        10427 2 -1 20 staff top right
    BOTH_P7_S7_T_        10429 2 -1 20 staff top/front
     
    If you are just swaping the block animations for the dodge animations, be aware this only works for single saberstyle and not duels or staff. However if your doing this in code then I wish you good luck and hopefully this will help.
×
×
  • Create New...