HeroEngine Forums
Welcome, Guest. Please login or Register for HeroCloud Account.

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Mr_Conflicts

Pages: [1] 2 3
Art & Art Pipeline / 3DS Max Export Services
« on: May 17, 20, 07:16:40 PM »
Hey HeroEngine Community.

I wanted to bring to your attention that I have offered my services for anyone who would like to have assistance exporting their art assets from FBX and other such asset formats to HGM for use in the HeroEngine. If anyone would like to know more please read this article.

If you would like to know more about this problem please read this thread.

Please email me at me@danielburkhart.com for more info.

Developer Job Board / HGM Conversion Services
« on: Aug 13, 19, 02:06:48 PM »
Hello developers,

My name is Daniel Burkhart. I wanted to let the community know that I am willing to offer my services in regards to exporting models from Maya 2016 into HeroEngine. As a developer I understand that the Autodesk Entertainment Suit is quite expensive and therefore as a current subscriber to the commercial edition am willing to lend you my expertise in preparing your models for use in HeroEngine.

Costs: $25 once for project directory setup; $5 per model converted.

Overall, I offer this as a way to not only help offset the cost of my monthly Autodesk subscription, but I also so other teams don't have to spend the full $270/month fee in order to get their models into the HeroEngine.

If you wish to inquire about this service, please contact me at: me@danielburkhart.com, thanks.

I want to also let people know that, the Autodesk stealth updates are the reason for this offer. This post relates more details about the change Autodesk has made to their policy and how their older version's of the same software gets phased out after a certain amount of time.

General Discussion / Disclaimer for New Subscribers
« on: Jul 13, 19, 07:27:19 PM »
I want to add a disclaimer that might be of use to new purchasers of the HeroEngine. As I have been working on making tutorial videos I have tried to make people understand that you can do pretty much everything you need to implement your GDD short of changing the engine itself (unless you have a source licence). But I feel like this should be said, the HeroEngine is the real deal for MMO development. It's not easy to grasp and will take a lot of time and effort to understand what is going on and how stuff works. You should expect a challenge. That said, you can do some amazing things with it once you get past the learning curve. There are several of us here in the community who can help, including me, with different aspects of the game engine. It's up to you if you want to stick with it long enough to be able to make your own game.

I say this because I think this may help people understand what they are getting themselves into when they subscribe for access to the HeroEngine. I get the feeling people underestimate how hard it is to make an MMO. If you don't have a GDD or some kind of plan in place you are liable to fail in your game development escapade. Hope this helps.

Developer Created Tutorials / My New Video Series
« on: Jun 28, 19, 03:12:43 PM »
Hello HeroEngine community, I wanted to let you know that I have begun work on a video series. I am providing a link in this post. First I want to introduce the idea behind the video series. This video series is meant to teach people how to use the HeroEngine tool set, it is not a a solution on how to make a video game from scratch on this platform. I will also be going over how I would go about using the tools provided. That doesn't mean that is the only way to accomplish a task. This is intended to make you think and understand how one might go about solving some of the problems that might occur during the development of a MMO game.


I will add future videos to the above playlist enjoy, and let me know what you guys think!

You are correct, I called Autodesk asking about it, and they told me that they don't even have the option to sell older versions even upon special request. And their re-sellers can get in trouble if they sell one. I have to agree it's a bunch of baloney but that's how it is. As for shady practices, I am not sure if I agree there, it's completely legal for a company to make such a decision because theoretically you don't have to bu their product. In our case however, as HeroEngine only supports Autodesk products for export and import to HeroEngine, we are stuck using their products for now.

I would like to add that as a subscriber of both Autodesk 3ds Max and Mudbox and HeroEngine, it is  indeed a large hindrance to getting more work done. Also, there are a few other programs I would like to point out as being out of date besides 3ds Max and Maya.

Another program I had a hard time finding was FMOD Designer as FMOD Studios has now taken its place. I did however manage to find FMOD studios installer via an internet archive and have saved it if anyone wants to message me on where they can get it.

That aside I do appreciate the work you guys are doing and I wont be going anywhere, but please give us an update soon! I'd love to know where you guys are at.

*EDIT* So I upgraded to the Autodesk Entertainment Suit and apparently if you do that you can still access Maya 2016. Unfortunately it's not cheap so it may not be the best option for everyone...

Developer Hero Projects / Empire Smash
« on: Jun 24, 19, 12:50:43 PM »

About Empire Smash

Empire Smash is an up and coming MMO that is utilizing the HeroEngine to create a world in which every decision has an impact on the world around you. That coupled with our unique battle system bring the game to life. The battle system is designed to trigger battles when an enemy faction get "angry" with a rival and declares war. This tied in with our faction system makes it up to the players what path in the game they want to take. Choosing glory means the player can lead other players into battle while choosing a darker path leads a player to have to stick to the shadows mostly engaging in criminal enterprise.

Images and Videos

This is a link to our example transition and logo reveal.

An example world builder map based on our own generated world map.

A sneak peak of our game interface created in Adobe Photoshop CC.

Our main menu layout based as a screenshot taken in Articy:Draft 2.

This is a small portion of our world map created using Wonderdraft 1.0.4.

Stay Tuned

This is a game in early development and stuff is liable to change come back from time to time in order to see new updates and posts regarding Empire Smash. Thanks!

Hey there, have you installed DirectX 9.0c and at least Microsoft's .NET 4.5.1? It shouldn't be a hardware problem. You can look at the wiki page for the HeroBlade technical requirements. That page should help you.

Scripting & Programming / Re: Unstable external function
« on: Feb 17, 17, 10:22:52 AM »
I would recommend looking at this wiki page to see all the vector related functions provided in Hero Engine. I would use the vector length as the wiki example shows to get distance.

Code: [Select]
point1 as Vector3 = myPos
point2 as Vector3 = tgtPos
dist as float = VectorLength(point1 - point2)

As for the error, I am not sure  as to what the error message means, but maybe its because you are  using the same input value as the output value. (I am not 100% on this but its just a guess, hopefully someone can confirm or deny this.)

Developer Created Tutorials / Click to Move
« on: Feb 07, 17, 05:01:08 PM »
Hello, I wanted to create a basic tutorial to explain how to create a quick click to move system using the Input_Mouse script. This can be expanded upon to suit your needs but for this tutorial all we are doing is setting up the system to where you can click on the ground and move to the location you clicked.

  • Open the following script: Input_Mouse (client side)
  • Go to the following function: OnMouseClick
  • Insert the following under the previously stated function and save, compile, and submit

Code: [Select]
heightmap as NodeRef = GetNodeUnderMouse()
target as Vector3
if not GetGroundUnderMouse(target, heightmap)
   return false
playerCharacter as NodeRef of Class HBNode = GetPlayerCharacterNode()
playercharacter["behave"] = "move navpoint " + target

You should now have a point click system in place!

Scripting & Programming / Re: Redbox GUI Error
« on: Feb 05, 17, 07:58:26 AM »
After CreateFromPrototype("yourGUI") you need to:

Code: [Select]
yourGUI.build = true

if you don't do it in script it will be red box.

You are correct, however the problem ended up being in the GUIXML file. You can not use the the following code:

Code: [Select]
Instead of using that you should use the following:

Code: [Select]
Hopefully this helps anyone who may be using the GUI Editor, you should not use the inherit from option.

Quote from: ToY-Krun
You can use it only if you're creating a new gui that is nothing more than a panel etc, and will never use any class other than the one its inheriting from

So anyways this is resolved now.

Scripting & Programming / [Resolved] Redbox GUI Error
« on: Feb 04, 17, 08:46:30 PM »
Hello, today I ran into an error when creating a GUI and I am trying to understand what exactly is going wrong. I think I might know the problem, but I do not fully understand why it is creating a red box in place of the GUI I am trying to build. I see only one other fourm post about this and would like to bring it back up because although that is resolved I do not fully understand what was causing it in that case either.

The Error:
From my understanding the error is cause by a GUI not being able to load properly thus it loads in a red box. However, I do not understand where it is not loading in properly.  The most useful insight I have found has come from this post, however I can not add the class="ClassName" without the GUI being completely inaccessible from everything except the Hero Script Editor.

The Questions:
So I ask, why do I get a red box instead of the properly displayed GUI when I create the node from the prototype? Could it be related to not having the class specified in the GUIXML script or is it something else entirely?

General Discussion / Hero Engine Steam Collection
« on: Oct 26, 16, 05:01:45 PM »
I just wanted to let everyone know that I have gone ahead and created a steam collections page. You can visit it at http://steamcommunity.com/sharedfiles/filedetails/?id=787728642. I hope for this page to be updated as more progects make it to steam greenlight and so if you  have any questions or concerns just leave a comment on the collections thread and I can make the changes you desire.

Have a nice and keep on developing those games :)

Developer Created Tutorials / Edit Notes: Guild System Tutorial
« on: Aug 03, 16, 02:51:35 PM »
First things first, KeepUpArea method in the E_WorldClassMethods script is custom however you should be able to figure it out based on what I have given you. Also I fixed a problem in the tutorial where I stated that you do not use the area panel to create the instance when in fact you do, and that is how you get the Area Instance ID, the registry ID is obtained through the CLI. If anyone finds anything else I would really like to know so I can correct it.

Developer Created Tutorials / Guild System Tutorial
« on: Aug 03, 16, 09:43:31 AM »
So I have recently been working on Anvil of Honors guild system and thought that it would nice of me to pass along the information about how it can be done. I am hopeful the will help people see the true beauty of the back end of the Hero Engine and how Arbitrary Root Nodes work, enjoy!

NOTE: this tutorial assumes you know the basics of HSL and the DOM editor if not I do recommend looking up the basic HSL and DOM tutorials on the wiki as well as the official Hero Engine YouTube channel.


http://hewiki.heroengine.com/wiki/Arbitrary_Root_Node (aka ARNs or Arbitrary Root Nodes)


To start you will need to create three fields on the client DOM.

  • guildID - type ID and set the description to something like guild id value
  • GuildMemberList - type list of id and description list of guild ids
  • guildName - type string description guild name string value

after creating each of those fields be sure to copy each field to the server where we will create two new fields.

  • GuildList - type lookuplist indexed by id of id description A list of all guilds
  • pendingGuildInfoRequests - type lookuplist indexed by id of lookuplist indexed by id of lookuplist indexed by id of id description pending requests for guild root node

Now for the explanations, the guildID, GuildMemberList, and guildName fields should explain themselves (just one thing, note that GuildMemberList must be ID values, just keep that in mind). However the GuildList and pendingGuildInfoRequests may be a little bit confusing.

The GuildList will be used by the ARN (when you set it up) to store all of the guild IDs within your world.
The pendingGuildInfoRequests will also be used by the ARN, however it is a bit more complicated than that, let me explain. When a call is made to the guild registry server area (we will set it up later on) the request is put into the pendingGuildInfoRequests which takes the Guild ARN ID, the area ID where the request originated, and the instance ID of that area ID where that request originated. All this in turn will be set to the account ID of the user who requested the information. In all, this is just the method of extracting the guild info and displaying it to the player who requested it.

Now that that is explained lets create the GuildRegistryClassMethods script on the server side DOM. To begin create a script called GuildRegistry type data, description Registry that contains all guild info. One that is done you will need to link all the fields we created earlier (remember you should have replicated the fields from the client side). Now that you have that created you can open the empty script and begin to program. However before you do you will need to open the E_WorldClassMethods (S) script which serves as the default override for the world system.

Now this is where it gets complicated. In order to have the guild area always running you will need to create a system area which contains only data. This means that you can not travel there (with a character). This means that you will create it in the area organizer and will then use a function that will be called by the CLI ONCE, emphasis on ONCE. To do this flip back to the GuildRegistryClassMethods (which should be blank) and copy and paste this code:

Code: [Select]
#define debug

function Msg( account as NodeRef, msg as String )
  //ignoring account which isnt valid in a system area
  //left channel blank since it is irrelevant in a system area
  //this will simply "chat" to the chat panel for debugging
  #if debug
  $CHAT.ChatWorld("", msg)

shared function Guild_Msg( msg as String )
  #if debug
  $Debug.SendNotifyDebugMessage("Guild", SYSTEM.EXEC.CALLEDBYSCRIPT+":"+SYSTEM.EXEC.CALLEDBYFUNCTION+"("+GetAreaName(GetAreaNumber())+")("+GetInstanceNumber()+")-> "+msg )

shared function Guild_Error( msg as String )
  #if debug
  $Debug.SendNotifyDebugMessage("Guild", SYSTEM.EXEC.CALLEDBYSCRIPT+":"+SYSTEM.EXEC.CALLEDBYFUNCTION+"("+GetAreaName(GetAreaNumber())+")("+GetInstanceNumber()+")[ERROR]-> "+msg )
  ScriptError( msg )


//           CLI
remote method GuildRegistry_CreateGuildRegistry( account as ID )
  // - Called by the CLI to create a new post office node.
  var q = QueryAssociation( GetRootNode(), "AreaRootToWeatherRegistry", None )
  println("attempting to create new Guild Registry")
  foreach a in q
    freg as NodeRef of Class GuildRegistry = a.target
    if freg != None
      RemoveMailBoxForNode( freg )
      #if debug
      println("removed registry mailbox")
      $CHAT.ChatPlayer( account, "", "Removed Guild registry ." + freg + "$RDestroying node " + freg + " make sure to change the nodeID in the Guild ClassMethods script." )
      DestroyNode( freg )
  reg as NodeRef = CreatePersistedNodeFromClass( "GuildRegistry" )
  AddAssociation( GetRootNode(), "AreaRootToGuildRegistry", reg )
  CreateMailBoxForNode( reg )
  #if debug
  println("created registry mailbox " + reg)
  //call area 0 instance 0 $GuildRegistry.GuildRegistry_KeepUp( account )
  $CHAT.ChatPlayer( account, "", "Created a new GuildSystem root " + reg + " .$RThe GuildSystem root is now a Guild Registry.$RRegistered this systemarea" )

shared function GetGuildRegistryNode() as NodeRef of Class GuildRegistry
  reg as NodeRef of Class GuildRegistry
  var q = QueryAssociation(GetRootNode(), "AreaRootToGuildRegistry", None )
  foreach a in q
    var f = a.target
    where f is kindof GuildRegistry
      reg = f
  return reg

method _RootNodeLoadedNotification( rootID as ID )
  if GetGuildRegistryNode().pendingGuildInfoRequests has rootID
    //there is a info request for this arn, so lets get it:
    //we're going to call back to the area/instance/member this request came from:
    area as ID
    instance as ID
    member as ID
    foreach areaID in GetGuildRegistryNode().pendingGuildInfoRequests[rootID]
      area = areaID
      foreach instanceID in GetGuildRegistryNode().pendingGuildInfoRequests[rootID][areaID]
        instance = instanceID
        member = GetGuildRegistryNode().pendingGuildInfoRequests[rootID][areaID][instanceID]
        //now we have all the info needed to send the data back to the member:
        //we specify that this node is of class Guild so that we can access the fields we need
        guild as NodeRef of Class Guild = rootID
        if guild != None
          call area area instance instance $AREA.ReceiveGuildInfoForMember(guild.guildName, guild.guildID, guild.GuildMemberList, member)
          $CHAT.ChatWorld("world", " oops this guild didnt exist!")
        //now below is the receiveing method in the E_AreaClassMEthods script
    //if there are no further requests for this ARN, lets unload it for now
    UnloadRootNode( rootID, me )

method _RootNodeLoadFailedNotification( rootID as ID, areaID as ID, areaInstance as ID, failureReason as String )
  Guild_Error("Failed to load " + failureReason )

method _RootNodeUnloadedNotification( rootID as ID )

And compile, (if you can not compile then please leave a forum post below and I will address the issue keep in mind I am pretty much reversing the steps  of how I created it as well as working on a world that has been very customized to suit the projects needs) Assuming you have compiled successfully, you will need to now use the CLI to create the system and and get the id. To do this use the following command and enter it into the console:

Code: [Select]
\cpfc GuildRegistry GuildRegistry
This means that you can now access the functions/methods on the server using the $GuildRegistry keyword. Now lets create a chat command within the Hero Script editor. To do this open the editor (CTRL-H) and then server script and type CMDGuild.  Now within CMDGuild copy and paste the following.

Code: [Select]
//#define debug

shared function HE_ProcessCommandInput( account as NodeRef, input as String )
  // The Command Handler calls this shared function based on a mapping stored on the COMMANDHANDLER prototype
  //   which maps a /command to a script to call

  args as List of String
  Tokenize( input, args )
  if args.length < 2
    HE_CommandUsage( account, input )
  partialMatch toLower( args[2] )
    to "create"
      println("trying to create new guild registry")
      call area GuildRegistryClassMethods:GetGuildSystemAreaID() instance 0 $GuildRegistry.GuildRegistry_CreateGuildRegistry( account )
      HE_CommandUsage( account, input )

shared function HE_CommandUsage( account as NodeRef of Class E_playerAccount, input as String )
  // NOTE, this style is much more efficient on the client than doing a seperate Msg() for each line.
  // This is because only a single label gets created in chat, rather than one per line.
  msg as String = "/Guild <parameter>$R" 
  msg = msg + " - For script referance only$R"
  Msg( account, msg )

function Msg( account as NodeRef, msg as String )
  $CHAT.CHATPLAYER( account, "", msg )

and then in the console

Code: [Select]
/REGISTER add /guild script="CMDGuild"
Then using the chat type /guild create after you have registered the chat command. This should output an ID which you MUST copy and save to put it back into code this ID is the area ID for the guild registry and is very important, so do not lose it. Now back to the E_WorldClassMethods script!

Within the KeepUpArea method add the following lines of code:

Code: [Select]
is "guild"
      KeepAreaUp( YOUR-GUILD-SYSTEM-AREA-ID, 0 )
      println("keeping guild up" + $WORLD._SpinUpState(YOUR-GUILD-SYSTEM-AREA-ID, 0))

this is under the when system statement. Now within the LoadSystemAreas method add the following lines:

Code: [Select]
if KeepAreaUp( YOUR-GUILD-SYSTEM-AREA-ID, 0 )                      // - Guild Area
    $CHAT.ChatWorld("World", "Guild System Loading")

This in turn should keep these areas up at all times within your world, if they are not being kept up at all times the guild will not work because the area is not loaded. Now back into the GuildRegistryClassMethods script!

now within that script add the following where I said the rest for the functions/methods would go earlier in the tutorial.

Code: [Select]
shared function GetGuildSystemAreaID() as ID

shared function GetGuildRootNodeID() as ID 
  return YOUR-GUILD-ROOT-NODE-ID // I will explain later on

shared function GetGuildRootNode() as NodeRef of Class GuildRegistry
  n as NodeRef = GetGuildRootNodeID()
  //if the id was null.. thats odd, but lets get it by association instead
  if n = None
    var glist = QueryAssociation( GetRootNode(), "AreaRootToGuildRegistry", 0 )
    foreach gAssoc in glist
      //since there can only be one of these, we'll simply take the first one it comes to
      n = gAssoc.target //and target is the node we want
  return n

remote method GetGuildInfoForMember(areaID as ID, instanceID as ID, accountID as ID, guildID as ID)
  mylist as LookupList indexed by ID of ID = GetGuildRegistryNode().GuildList
  var reg = GetGuildRegistryNode()
  if not (reg.GuildList has guildID)
  guildArnID as ID = reg.GuildList[guildID]
  reg.pendingGuildInfoRequests[guildArnID][areaID][instanceID] = accountID
  if mylist has guildID
    RequestRootNodeLoad(guildArnID, me) //me means to call back to the registries class script when loaded

// info as LookupList indexed by ID of LookupList indexed by String of LookupList indexed by String of List of String
// info contains guild: ID, NAME, RANK, MEMBERLIST
remote method GuildInfo(guildID as ID, accountID as ID, areaID as ID, instanceID as ID)
  var reg = GetGuildRegistryNode()
  if not (reg.GuildList has guildID)
  guildArnID as ID = reg.GuildList[guildID]
  reg.pendingGuildInfoRequests[guildArnID][areaID][instanceID] = accountID
  var guild = GetGuildRegistryNode().GuildList[guildID] 
  RequestRootNodeLoad( guild, me )

// For GMs ONLY!
// Clears the guild list and resets all guilds in the game
#if debug
remote method ClearGuilds()
  var reg = GetGuildRegistryNode()
  clear reg.GuildList
remote method ClearGuilds()
  $CHAT.ChatPlayer(SYSTEM.REMOTE.CLIENT, "Info", "This function is only applicable in debug mode.")

remote method CreateNewGuild(guildID as ID, guildName as String, accountID as ID, areaID as ID, instanceID as ID)
  // guildID would be 0 if player is not in a guild
  // however if they are in a guild they shouldnt be creating a new one
  if guildID != None
    #if debug
    println("already in guild")
  //guilds as lookuplist indexed by guildID of guildARNID
  var reg = GetGuildRegistryNode()
  if reg = None
    println("there is no Guild Registry in the System area")
  guilds as LookupList indexed by ID of ID = reg.GuildList
  if guilds has guildID
    #if debug
    println( "guild already exists by this players ID" )
    //guilds must be created from a class other than the registry class
    //created a new class Guild, with script and added the guildID and guildName fields
    leader as NodeRef of Class E_playerCharacter = SYSTEM.REMOTE.CLIENT
    //must be created as a persisted node
    newGuild as NodeRef of Class Guild = CreatePersistedNodeFromClass("Guild")
    newGuild.guildID = newGuild //changed from leaders ID
    newGuild.guildName = guildName
    //be sure to store the newGuild ID as the ARN id in a list in the registry
    GetGuildRegistryNode().GuildList[newGuild] = newGuild
    //now we've stored the id of the ARN indexed by the guilds id, we can create the ARN
    error as String = "oops something went wrong"
    if CreateRootNode(newGuild, GetRootNode(), error)
      #if debug
      println( "Success" )
      call area areaID instance instanceID $AREA.GuildCreated(accountID, newGuild)
      #if debug
      println("failed to create guild")

Some of the following may not work yet as the E_AreaClassMethods script still needs to be tied into the guild registry. I will explain now how that is done.

First copy and paste the following into the the script:

Code: [Select]
// Guild System
// Gets guild information for member area
remote method ReceiveGuildInfoForMember(guildName as String, guildID as ID, memberList as List of ID, memberID as ID)
  account as NodeRef of Class E_playerAccount = memberID
  member as NodeRef of Class E_playerCharacter = account.GetMyChar()
  if member = None
    #if debug
    println( "character must have logged during the transfer..." )
  member.guildName = guildName
  member.guildID = guildID
  member.GuildMemberList = memberList
  //$CHAT.ChatPlayer(account, "Info", "Your guild member list is updated!")
  //here you would call your client (account) with the info to populate the guild panel

method GetGuildInfoForMemberArea(member as NodeRef of Class E_playerCharacter)
  //now we call the registry, which is in another area like so:
  guildID as ID = member.guildID
  call area GuildRegistryClassMethods:GetGuildSystemAreaID() instance 0 $GuildRegistry.GetGuildInfoForMember(GetAreaNumber(), GetInstanceNumber(), member.GetMyAccount().GetID(), guildID)

untrusted function RemoteGetGuildInfo()
  account as NodeRef of Class E_playerAccount = SYSTEM.REMOTE.CLIENT
  char as NodeRef of Class E_playerCharacter = account.GetMyChar()
  guildID as ID = char.guildID
  call area GuildRegistryClassMethods:GetGuildSystemAreaID() instance 0 $GuildRegistry.GuildInfo(guildID, account, GetAreaNumber(), GetInstanceNumber())

untrusted function RemoteCreateGuild(guildID as ID, guildName as String)
  call area GuildRegistryClassMethods:GetGuildSystemAreaID() instance 0 $GuildRegistry.CreateNewGuild(guildID, guildName, SYSTEM.REMOTE.CLIENT, GetAreaNumber(), GetInstanceNumber())

remote method GuildCreated(accountID as ID, guildID as ID)
  account as NodeRef of Class E_playerAccount = accountID
  if account != None
    char as NodeRef of Class E_playerCharacter = account.GetMyChar()
    if char != None
      char.guildID = guildID
      add back char to char.GuildMemberList
      $CHAT.ChatPlayer( account, "Guild", "Guild Created" )

OK now for some explanations on why this is necessary. When the client side makes a call to the server its going to call the E_AreaClassMethods script. The methods/functions it calls within that script then send the data needed to be sent into the GuildRegistyClassMethods script. The reason the area must send the data is because you player does not exist within that area thus you need to supply it with the necessary IDs which then get stored and can be used later when you have a guild panel and need to get the data from the guild registry.

Now that the server-side basics are done I will leave the client side to you. Keep in mind that you still will need to add more functionality in order to create a full guild system (like adding other players and disbanding for example) however using the information you have here you should be able to create the client side code as well as add the remaining functionality.

Feel free to message me with questions and I will reply as soon as I can. Also if anyone wants to add anything please do, I may have overlooked something or misunderstood a concept thus not explaining it correctly. However this should be informative to most people. Also don't just copy, try to fully understand what it is I am doing and read everything because in the end it will make you a better HSL programmer due to the fact that this touches almost all aspects of the Hero Engine and shows just how much you can do with it, hope you enjoyed it.

Pages: [1] 2 3