[RESCINDED] UE4 C++ Framework Function Programmer Needed

Edit: Changed to CONTRACT to match Template Recommendation
Edit2: Examples were being chopped in this posting. Moved to post #2 and fixed the formatting

Note: I have had a couple of conversations in Skype and Discord on this…so I decided to post help here to make it clear on what the Concept and Need is so I don’t have to keep retyping this.

Issue:
UE4 (Unity and others) does not have specific ‘Framework’ needs in the engine. UE4 does give ‘more’ but it is far from complete. It is also NOT the responsibility of Epic/UE4 to provide these ‘Game Play Functions’ since there are many game deigns.

I have converted a lot of these Bioware Functions to C# in Unity but trying to bring them to UE4 is…let us say…just different. It is not only the Syntax but also How Unity does things which also need to be converted to how Epic does things…which is why I am writing this and seeking help.

I have also heavily tried doing this via UE4 BPs (Visual Scripting) and although it is very solid…it is not up to the task of doing very open ended dynamic things. It seems to be more specific orientated…which is great…but doing the C++ portion simply needs to be done.

Concept:
Build a Code Function Library in C++ (Framework Overlay) that does not modify the engine source. The code simply ‘uses’ the engine to accomplish the tasks it (Framework) needs to accomplish game related tasks. This Framework also makes it possible (later) for Modder Access via scripting (LUA as example).

The other side of this that is very powerful is that the Framework Functions once made are good to go forever. If/When Epic refactors UE4 (happens a lot) any of the internal to the Function Wrapper can be adapted/auto-migrated/modified without affecting all the code that is using the function(s). Compile and go…done. This makes extremely bug free frameworks and when there is a bug it is really easy to track down and change.

How to Implement:
I have a lot (a lot…a lot) of code in NWScript (which is C-Like) and some it this converts nicely to both C++ and C#. The issues are directly involved in things that send commands/actions/functions to the engine and the engine simply takes care of this then returns the information needed. This NWScript Code is battle tested and works 100% and is really fast. It also works incredibly well in Unity C#. So it is a time tested framework that I need built in UE4 C++. UE4 C++ is really hard to me…I just don’t know how to do and find Engine things that I need to get done. So…pay someone who knows how. =)

It is not making Functions and passing parameters is hard…not at all…super easy…it is specifically adapting/converting UE4 Specifics within Functions that I can then ‘Use’ from other Functions (See examples below).

Some engine conversions will be a fairly straight forward ‘Implementation to UE4’ and others will be basically figuring out ‘How Epic Does This?’ in the UE4 and wrap that up into the Framework Function.

Please see examples below for Conversion/Adaptation information.

UE4.21+ C++ Coder’s Task:
Adapt/Convert very heavily used/needed functions into UE4’s C++ Language. Basically making these Functions work within the UE4.21+

Please PM me and we can discuss further if interested. I am available in Skype, Email, and now Discord. I pay by PayPal only.
Please read and understand the Examples below prior to contacting me.

Cheers
Olander

**Remember that the Contract is Not to Recreate Olander (My) functions. I can do that. It is specifically quite a number of Engine Specific Bioware functions that need to be Adapted to UE4…basically making them Epic’s Methods.

Example 1 (Bioware Function) with Explanation:**
// This actually moves the target to the given new location,
// and makes them face the correct way once they get there.
void MoveToNewLocation(location lNewLocation, object oTarget=OBJECT_SELF)

location lNewLocation => Vector3 Transform Position so could be => vLocation but basically in NWScript we always use => lLoc or lLocation to Identify in script what this variable is.
object oTarget=OBJECT_SELF => is some Object/UObject reference…could be anything with a script trying to be moved.

Now the internal (Engine Specific Stuff) broken out and explained.


void MoveToNewLocation(location lNewLocation, object oTarget=OBJECT_SELF)
{
    AssignCommand(oTarget, ActionMoveToLocation(lNewLocation));
    AssignCommand(oTarget, ActionDoCommand(SetFacing(GetFacingFromLocation(lNewLocation))));
}

AssignCommand(oTarget, ActionMoveToLocation(lNewLocation));

AssignCommand … This assigns a command to the Reference Object
ActionMoveToLocation(lNewLocation)); … This adds an Action to the Reference Object’s Action Queue (Array)

Note: Action Queues are really handy for Object behaviors. The Actions are cleared on their own when they are done or can be manually cleared by ClearAllActions(oTarget);

Example 2 (Olander Function with Bioware Function Calls) with Explanation:


object ORS_GetAnchorWaypoint(object oArea)
{
  string sAnchor = "ORS_ANCHOR"+ObjectToString(oArea);
  object oAnchor = GetObjectByTag(sAnchor);
  if(GetIsObjectValid(oAnchor))
  {
    return oAnchor;
  }

  oAnchor = CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", Location(oArea, Vector(5.0,5.0,0.0), 0.0), FALSE, sAnchor);
  return oAnchor;
}

oAnchor = CreateObject(OBJECT_TYPE_WAYPOINT, “nw_waypoint001”, Location(oArea, Vector(5.0,5.0,0.0), 0.0), FALSE, sAnchor);
return oAnchor;
}

string sAnchor = “ORS_ANCHOR”+ObjectToString(oArea); … The sTag of the Spawner Anchor we are looking for
object oAnchor = GetObjectByTag(sAnchor); … This is the Spawner Anchor Reference Object in our Scene/Level we are looking for to do things with.
if(GetIsObjectValid(oAnchor)) … Bioware’s Object Validation Check. Not Static, Not Null…etc.
oAnchor = CreateObject(OBJECT_TYPE_WAYPOINT, “nw_waypoint001”, Location(oArea, Vector(5.0,5.0,0.0), 0.0), FALSE, sAnchor); … We Create (Instantiate) a new Spawner Anchor since there is not one in the scene/level then return this new object as our Spawner Anchor.

Example 3 (Olander Function with Bioware Function Calls) with No Explanation:
*you should be able to see which is my function call and the Bioware function calls. You will notice that there are many common Bioware functions in their library I use to get tasks done.


void ORS_ActivateAllSpawnsInArea(object oArea)
{
  object oMod = GetModule();

  //Module Not Running Recheck
  int nRUNNING = GetLocalInt(oMod,"MODULE_RUNNING");
  if(nRUNNING < 1)
  {
    ORS_SpawnDebug(oArea, "Area : Module Not Running. Do Recheck.");
    SetLocalInt(oArea,"ORS_ACTIVATE_SPAWNERS_LOOPING",1);
    float fCheck = 10.0;
    DelayCommand(fCheck,ORS_ActivateAllSpawnsInArea(oArea));
    return;
  }

  int nNth = 1;
  object oAnchor = ORS_GetAnchorWaypoint(oArea);

  //Time in Game Seconds
  int nCurSec = ORS_TimeSecond();

  //Time Stamp Less than Respawn Allow Time...Turn Off
  //Note: On 1st Activate Attempt by AreaOnEnter nAllow will be 0 at this point
  int nAllow = GetLocalInt(oArea,"ORS_SPAWN_TIME_RESPAWN");
  ORS_SpawnDebug(oArea, "Spawner : Area Spawn Time Stamp Respawn Allow Current. "+IntToString(nAllow));
  int nFirst = GetLocalInt(oArea,"ORS_FIRST_RESPAWN");
  if(nFirst < 1)
  {
    if(nCurSec < nAllow)
    {
      ORS_SpawnDebug(oArea, "Spawner : Area Spawn Current Time Stamp Less than Respawn Time Stamp.");
      return;
    }
  }

  //Anchor is already Running
  int nActive = GetLocalInt(oAnchor,"ORS_ACTIVATING_SPAWNERS");
  if(nActive == 1) return;

  //Set Anchor as Active
  SetLocalInt(oAnchor,"ORS_ACTIVATING_SPAWNERS",1);

  //Activate Spawners
  object oSpawner = GetNearestObjectByTag("ORS_SPAWNER", oAnchor, nNth);
  while(GetIsObjectValid(oSpawner))
  {
    ORS_SpawnDebug(oSpawner, "Spawner : Found. Activating.");

    ORS_ActivateSingleSpawner(oSpawner,oArea,nCurSec);
    oSpawner = GetNearestObjectByTag("ORS_SPAWNER", oAnchor, ++nNth);
  }

  //Time in Game Seconds to Allow Respawn to Happen (Area Reset)
  int nDelay = GetLocalInt(oMod,"ORSRESPAWNDELAY");
  int nRespawn = nCurSec + FloatToInt(HoursToSeconds(nDelay));
  int nDespawn = nRespawn + 10;
  int nMode = GetLocalInt(oMod,"ORS_SPAWN_DEBUG");
  if(nMode > 0) nRespawn = nCurSec + 30;
  SetLocalInt(oArea,"ORS_SPAWN_TIME_RESPAWN",nRespawn);
  SetLocalInt(oArea,"ORS_SPAWN_TIME_DESPAWN",nDespawn);
  ORS_SpawnDebug(oArea, "Spawner : Area Spawn Time Stamp Respawn Set. "+IntToString(nRespawn));

  //Anchor is Complete
  ORS_SpawnDebug(oAnchor, "Anchor : Activating Spawners Complete.");
  DeleteLocalInt(oAnchor, "ORS_ACTIVATING_SPAWNERS");
  DeleteLocalInt(oArea, "ORS_ACTIVATE_SPAWNERS_LOOPING");
  DeleteLocalInt(oArea, "ORS_FIRST_RESPAWN");
}

Interesting. 140+ views and not one reply. I guess C++ programmers here are not interested in some good coin nor a decent challenge.

Of the feelers I put out in PM it seems this is mainly a hobbyist job forum…which is fine. A little unexpected is all. Knowledge of the internal function calls of UE4 looks to be a real challenge that indeed needs a very savvy C++ programmer and full source to place a framework layer on top of this monster.

I have to make a company decision on this and since there is simply Zero Interest here…time to move on.

I did find a college student here in Tempe at ASU that wants to learn how but also prefers C#…So I guess we will simply go that route and leave UE4 to its own.

Cheers
Olander

Interesting - really no reply? Or too high expectations for low money? There are many very capable programmers here. But not for USD 30.
I admit that C++ with Unreal engine is much harder than Unity, which is not due to the programming language.

Finally! Thanks for the reply! :smiley: I do realize/know there are some really good programmers on the UE4 forums but in the higher percentage it seems much more Visual Script orientated and Hobbyist (I was one until about a year ago).

Never stated 30 USD nor any amount. In actual fact it is much higher. Likely it would be price per function delivered. Some will be simple…and some will be a nightmare.
And yep…I can do about 75% of what I need in C++ but the other 25% of UE4 specifics is simply…really difficult to even just find a few things remotely similar and wrap it/them.

Anyhow…thanks again for the reply! :slight_smile:

Cheers
O

Haha, that is exactly true. Some code is so much intertwined, that you need patience to come to the flesh.
Cheers